fix: recycle Browser Run sessions on HTTP 410 - #1981

Merged
cjol merged 1 commit into
mainfrom
fix/issue-1980-1784883305
Jul 27, 2026
Merged

fix: recycle Browser Run sessions on HTTP 410#1981
cjol merged 1 commit into
mainfrom
fix/issue-1980-1784883305

Conversation

@agent-think

@agent-thinkagent-thinkBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Closes#1980.

What changed

  • treat Browser Run HTTP 410 Gone as a missing/expired session, alongside 404
  • clear the stale shared-session record and transparently create a replacement
  • retain errors for unrelated statuses such as 500
  • add regression coverage for both the execution path and sessionInfo() cleanup
  • add a patch changeset

Browser Run status validation

I deployed a temporary Browser Run probe and called the binding directly. It confirmed:

  • GET /v1/devtools/browser/<expired-session>/json/list returns 410 with {"error":"Failed to list targets: 410"} after keep_alive expiry
  • DELETE /v1/devtools/browser/<expired-session> returns 404 with {"error":"Failed to delete browser session: 404"}
  • a never-created UUID returns 404 for both list and delete

This means connector liveness checks need to recognize both 404 (unknown/deleted) and 410 (expired), while continuing to surface all other errors.

Verification

  • regression proof: the new HTTP 410 recycling test fails against the old helper (after all 3 configured retries) with BrowserRenderingError ... status: 410
  • pnpm --filter agents exec vitest run --config src/tests/vitest.config.ts src/tests/browser-connector.test.ts34 passed
  • pnpm run checkpassed (all 117 TypeScript projects)
  • pnpm run buildpassed (25 projects)
  • packed the changed agents build and deployed a temporary full-stack Browser Run demo; its API returned passed: true with a new replacement session ID after the injected stale-session 410

Demo: https://issue-1980-browser-session-recycle.magnificent-supermarket.workers.dev


Open in Devin Review

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f778708

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 2 packages
NameType
agentsPatch
@cloudflare/agent-thinkPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@devin-ai-integrationdevin-ai-integrationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no bugs or issues to report.

Open in Devin Review

@pkg-pr-new

Copy link
Copy Markdown

Open in StackBlitz

agents

npm i https://pkg.pr.new/agents@1981

@cloudflare/ai-chat

npm i https://pkg.pr.new/@cloudflare/ai-chat@1981

@cloudflare/codemode

npm i https://pkg.pr.new/@cloudflare/codemode@1981

create-think

npm i https://pkg.pr.new/create-think@1981

hono-agents

npm i https://pkg.pr.new/hono-agents@1981

@cloudflare/shell

npm i https://pkg.pr.new/@cloudflare/shell@1981

@cloudflare/think

npm i https://pkg.pr.new/@cloudflare/think@1981

@cloudflare/voice

npm i https://pkg.pr.new/@cloudflare/voice@1981

@cloudflare/worker-bundler

npm i https://pkg.pr.new/@cloudflare/worker-bundler@1981

commit: f778708

@cjol
cjol merged commit 6c01c8d into mainJul 27, 2026
10 checks passed
@cjol
cjol deleted the fix/issue-1980-1784883305 branch July 27, 2026 11:59
@github-actionsgithub-actionsBot mentioned this pull request Jul 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

BrowserConnector session recycle misses HTTP 410 (expired Browser Rendering session not replaced)

1 participant

@cjol
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix: recycle Browser Run sessions on HTTP 410 - #1981

Merged
cjol merged 1 commit into
mainfrom
fix/issue-1980-1784883305
Jul 27, 2026
Merged

fix: recycle Browser Run sessions on HTTP 410#1981
cjol merged 1 commit into
mainfrom
fix/issue-1980-1784883305

Conversation

@agent-think

@agent-thinkagent-thinkBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Closes#1980.

What changed

  • treat Browser Run HTTP 410 Gone as a missing/expired session, alongside 404
  • clear the stale shared-session record and transparently create a replacement
  • retain errors for unrelated statuses such as 500
  • add regression coverage for both the execution path and sessionInfo() cleanup
  • add a patch changeset

Browser Run status validation

I deployed a temporary Browser Run probe and called the binding directly. It confirmed:

  • GET /v1/devtools/browser/<expired-session>/json/list returns 410 with {"error":"Failed to list targets: 410"} after keep_alive expiry
  • DELETE /v1/devtools/browser/<expired-session> returns 404 with {"error":"Failed to delete browser session: 404"}
  • a never-created UUID returns 404 for both list and delete

This means connector liveness checks need to recognize both 404 (unknown/deleted) and 410 (expired), while continuing to surface all other errors.

Verification

  • regression proof: the new HTTP 410 recycling test fails against the old helper (after all 3 configured retries) with BrowserRenderingError ... status: 410
  • pnpm --filter agents exec vitest run --config src/tests/vitest.config.ts src/tests/browser-connector.test.ts34 passed
  • pnpm run checkpassed (all 117 TypeScript projects)
  • pnpm run buildpassed (25 projects)
  • packed the changed agents build and deployed a temporary full-stack Browser Run demo; its API returned passed: true with a new replacement session ID after the injected stale-session 410

Demo: https://issue-1980-browser-session-recycle.magnificent-supermarket.workers.dev


Open in Devin Review

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f778708

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 2 packages
NameType
agentsPatch
@cloudflare/agent-thinkPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@devin-ai-integrationdevin-ai-integrationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no bugs or issues to report.

Open in Devin Review

@pkg-pr-new

Copy link
Copy Markdown

Open in StackBlitz

agents

npm i https://pkg.pr.new/agents@1981

@cloudflare/ai-chat

npm i https://pkg.pr.new/@cloudflare/ai-chat@1981

@cloudflare/codemode

npm i https://pkg.pr.new/@cloudflare/codemode@1981

create-think

npm i https://pkg.pr.new/create-think@1981

hono-agents

npm i https://pkg.pr.new/hono-agents@1981

@cloudflare/shell

npm i https://pkg.pr.new/@cloudflare/shell@1981

@cloudflare/think

npm i https://pkg.pr.new/@cloudflare/think@1981

@cloudflare/voice

npm i https://pkg.pr.new/@cloudflare/voice@1981

@cloudflare/worker-bundler

npm i https://pkg.pr.new/@cloudflare/worker-bundler@1981

commit: f778708

@cjol
cjol merged commit 6c01c8d into mainJul 27, 2026
10 checks passed
@cjol
cjol deleted the fix/issue-1980-1784883305 branch July 27, 2026 11:59
@github-actionsgithub-actionsBot mentioned this pull request Jul 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

BrowserConnector session recycle misses HTTP 410 (expired Browser Rendering session not replaced)

1 participant

@cjol
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: recycle Browser Run sessions on HTTP 410 - #1981

Merged
cjol merged 1 commit into
mainfrom
fix/issue-1980-1784883305
Jul 27, 2026
Merged

fix: recycle Browser Run sessions on HTTP 410#1981
cjol merged 1 commit into
mainfrom
fix/issue-1980-1784883305

Conversation

@agent-think

@agent-thinkagent-thinkBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Closes#1980.

What changed

  • treat Browser Run HTTP 410 Gone as a missing/expired session, alongside 404
  • clear the stale shared-session record and transparently create a replacement
  • retain errors for unrelated statuses such as 500
  • add regression coverage for both the execution path and sessionInfo() cleanup
  • add a patch changeset

Browser Run status validation

I deployed a temporary Browser Run probe and called the binding directly. It confirmed:

  • GET /v1/devtools/browser/<expired-session>/json/list returns 410 with {"error":"Failed to list targets: 410"} after keep_alive expiry
  • DELETE /v1/devtools/browser/<expired-session> returns 404 with {"error":"Failed to delete browser session: 404"}
  • a never-created UUID returns 404 for both list and delete

This means connector liveness checks need to recognize both 404 (unknown/deleted) and 410 (expired), while continuing to surface all other errors.

Verification

  • regression proof: the new HTTP 410 recycling test fails against the old helper (after all 3 configured retries) with BrowserRenderingError ... status: 410
  • pnpm --filter agents exec vitest run --config src/tests/vitest.config.ts src/tests/browser-connector.test.ts34 passed
  • pnpm run checkpassed (all 117 TypeScript projects)
  • pnpm run buildpassed (25 projects)
  • packed the changed agents build and deployed a temporary full-stack Browser Run demo; its API returned passed: true with a new replacement session ID after the injected stale-session 410

Demo: https://issue-1980-browser-session-recycle.magnificent-supermarket.workers.dev


Open in Devin Review

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f778708

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 2 packages
NameType
agentsPatch
@cloudflare/agent-thinkPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@devin-ai-integrationdevin-ai-integrationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no bugs or issues to report.

Open in Devin Review

@pkg-pr-new

Copy link
Copy Markdown

Open in StackBlitz

agents

npm i https://pkg.pr.new/agents@1981

@cloudflare/ai-chat

npm i https://pkg.pr.new/@cloudflare/ai-chat@1981

@cloudflare/codemode

npm i https://pkg.pr.new/@cloudflare/codemode@1981

create-think

npm i https://pkg.pr.new/create-think@1981

hono-agents

npm i https://pkg.pr.new/hono-agents@1981

@cloudflare/shell

npm i https://pkg.pr.new/@cloudflare/shell@1981

@cloudflare/think

npm i https://pkg.pr.new/@cloudflare/think@1981

@cloudflare/voice

npm i https://pkg.pr.new/@cloudflare/voice@1981

@cloudflare/worker-bundler

npm i https://pkg.pr.new/@cloudflare/worker-bundler@1981

commit: f778708

@cjol
cjol merged commit 6c01c8d into mainJul 27, 2026
10 checks passed
@cjol
cjol deleted the fix/issue-1980-1784883305 branch July 27, 2026 11:59
@github-actionsgithub-actionsBot mentioned this pull request Jul 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

BrowserConnector session recycle misses HTTP 410 (expired Browser Rendering session not replaced)

1 participant

@cjol
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: recycle Browser Run sessions on HTTP 410 - #1981

Merged
cjol merged 1 commit into
mainfrom
fix/issue-1980-1784883305
Jul 27, 2026
Merged

fix: recycle Browser Run sessions on HTTP 410#1981
cjol merged 1 commit into
mainfrom
fix/issue-1980-1784883305

Conversation

@agent-think

@agent-thinkagent-thinkBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Closes#1980.

What changed

  • treat Browser Run HTTP 410 Gone as a missing/expired session, alongside 404
  • clear the stale shared-session record and transparently create a replacement
  • retain errors for unrelated statuses such as 500
  • add regression coverage for both the execution path and sessionInfo() cleanup
  • add a patch changeset

Browser Run status validation

I deployed a temporary Browser Run probe and called the binding directly. It confirmed:

  • GET /v1/devtools/browser/<expired-session>/json/list returns 410 with {"error":"Failed to list targets: 410"} after keep_alive expiry
  • DELETE /v1/devtools/browser/<expired-session> returns 404 with {"error":"Failed to delete browser session: 404"}
  • a never-created UUID returns 404 for both list and delete

This means connector liveness checks need to recognize both 404 (unknown/deleted) and 410 (expired), while continuing to surface all other errors.

Verification

  • regression proof: the new HTTP 410 recycling test fails against the old helper (after all 3 configured retries) with BrowserRenderingError ... status: 410
  • pnpm --filter agents exec vitest run --config src/tests/vitest.config.ts src/tests/browser-connector.test.ts34 passed
  • pnpm run checkpassed (all 117 TypeScript projects)
  • pnpm run buildpassed (25 projects)
  • packed the changed agents build and deployed a temporary full-stack Browser Run demo; its API returned passed: true with a new replacement session ID after the injected stale-session 410

Demo: https://issue-1980-browser-session-recycle.magnificent-supermarket.workers.dev


Open in Devin Review

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f778708

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 2 packages
NameType
agentsPatch
@cloudflare/agent-thinkPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@devin-ai-integrationdevin-ai-integrationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no bugs or issues to report.

Open in Devin Review

@pkg-pr-new

Copy link
Copy Markdown

Open in StackBlitz

agents

npm i https://pkg.pr.new/agents@1981

@cloudflare/ai-chat

npm i https://pkg.pr.new/@cloudflare/ai-chat@1981

@cloudflare/codemode

npm i https://pkg.pr.new/@cloudflare/codemode@1981

create-think

npm i https://pkg.pr.new/create-think@1981

hono-agents

npm i https://pkg.pr.new/hono-agents@1981

@cloudflare/shell

npm i https://pkg.pr.new/@cloudflare/shell@1981

@cloudflare/think

npm i https://pkg.pr.new/@cloudflare/think@1981

@cloudflare/voice

npm i https://pkg.pr.new/@cloudflare/voice@1981

@cloudflare/worker-bundler

npm i https://pkg.pr.new/@cloudflare/worker-bundler@1981

commit: f778708

@cjol
cjol merged commit 6c01c8d into mainJul 27, 2026
10 checks passed
@cjol
cjol deleted the fix/issue-1980-1784883305 branch July 27, 2026 11:59
@github-actionsgithub-actionsBot mentioned this pull request Jul 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

BrowserConnector session recycle misses HTTP 410 (expired Browser Rendering session not replaced)

1 participant

@cjol
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix: recycle Browser Run sessions on HTTP 410 - #1981

Merged
cjol merged 1 commit into
mainfrom
fix/issue-1980-1784883305
Jul 27, 2026
Merged

fix: recycle Browser Run sessions on HTTP 410#1981
cjol merged 1 commit into
mainfrom
fix/issue-1980-1784883305

Conversation

@agent-think

@agent-thinkagent-thinkBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Closes#1980.

What changed

  • treat Browser Run HTTP 410 Gone as a missing/expired session, alongside 404
  • clear the stale shared-session record and transparently create a replacement
  • retain errors for unrelated statuses such as 500
  • add regression coverage for both the execution path and sessionInfo() cleanup
  • add a patch changeset

Browser Run status validation

I deployed a temporary Browser Run probe and called the binding directly. It confirmed:

  • GET /v1/devtools/browser/<expired-session>/json/list returns 410 with {"error":"Failed to list targets: 410"} after keep_alive expiry
  • DELETE /v1/devtools/browser/<expired-session> returns 404 with {"error":"Failed to delete browser session: 404"}
  • a never-created UUID returns 404 for both list and delete

This means connector liveness checks need to recognize both 404 (unknown/deleted) and 410 (expired), while continuing to surface all other errors.

Verification

  • regression proof: the new HTTP 410 recycling test fails against the old helper (after all 3 configured retries) with BrowserRenderingError ... status: 410
  • pnpm --filter agents exec vitest run --config src/tests/vitest.config.ts src/tests/browser-connector.test.ts34 passed
  • pnpm run checkpassed (all 117 TypeScript projects)
  • pnpm run buildpassed (25 projects)
  • packed the changed agents build and deployed a temporary full-stack Browser Run demo; its API returned passed: true with a new replacement session ID after the injected stale-session 410

Demo: https://issue-1980-browser-session-recycle.magnificent-supermarket.workers.dev


Open in Devin Review

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f778708

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 2 packages
NameType
agentsPatch
@cloudflare/agent-thinkPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@devin-ai-integrationdevin-ai-integrationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no bugs or issues to report.

Open in Devin Review

@pkg-pr-new

Copy link
Copy Markdown

Open in StackBlitz

agents

npm i https://pkg.pr.new/agents@1981

@cloudflare/ai-chat

npm i https://pkg.pr.new/@cloudflare/ai-chat@1981

@cloudflare/codemode

npm i https://pkg.pr.new/@cloudflare/codemode@1981

create-think

npm i https://pkg.pr.new/create-think@1981

hono-agents

npm i https://pkg.pr.new/hono-agents@1981

@cloudflare/shell

npm i https://pkg.pr.new/@cloudflare/shell@1981

@cloudflare/think

npm i https://pkg.pr.new/@cloudflare/think@1981

@cloudflare/voice

npm i https://pkg.pr.new/@cloudflare/voice@1981

@cloudflare/worker-bundler

npm i https://pkg.pr.new/@cloudflare/worker-bundler@1981

commit: f778708

@cjol
cjol merged commit 6c01c8d into mainJul 27, 2026
10 checks passed
@cjol
cjol deleted the fix/issue-1980-1784883305 branch July 27, 2026 11:59
@github-actionsgithub-actionsBot mentioned this pull request Jul 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

BrowserConnector session recycle misses HTTP 410 (expired Browser Rendering session not replaced)

1 participant

@cjol
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: recycle Browser Run sessions on HTTP 410 - #1981

Merged
cjol merged 1 commit into
mainfrom
fix/issue-1980-1784883305
Jul 27, 2026
Merged

fix: recycle Browser Run sessions on HTTP 410#1981
cjol merged 1 commit into
mainfrom
fix/issue-1980-1784883305

Conversation

@agent-think

@agent-thinkagent-thinkBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Closes#1980.

What changed

  • treat Browser Run HTTP 410 Gone as a missing/expired session, alongside 404
  • clear the stale shared-session record and transparently create a replacement
  • retain errors for unrelated statuses such as 500
  • add regression coverage for both the execution path and sessionInfo() cleanup
  • add a patch changeset

Browser Run status validation

I deployed a temporary Browser Run probe and called the binding directly. It confirmed:

  • GET /v1/devtools/browser/<expired-session>/json/list returns 410 with {"error":"Failed to list targets: 410"} after keep_alive expiry
  • DELETE /v1/devtools/browser/<expired-session> returns 404 with {"error":"Failed to delete browser session: 404"}
  • a never-created UUID returns 404 for both list and delete

This means connector liveness checks need to recognize both 404 (unknown/deleted) and 410 (expired), while continuing to surface all other errors.

Verification

  • regression proof: the new HTTP 410 recycling test fails against the old helper (after all 3 configured retries) with BrowserRenderingError ... status: 410
  • pnpm --filter agents exec vitest run --config src/tests/vitest.config.ts src/tests/browser-connector.test.ts34 passed
  • pnpm run checkpassed (all 117 TypeScript projects)
  • pnpm run buildpassed (25 projects)
  • packed the changed agents build and deployed a temporary full-stack Browser Run demo; its API returned passed: true with a new replacement session ID after the injected stale-session 410

Demo: https://issue-1980-browser-session-recycle.magnificent-supermarket.workers.dev


Open in Devin Review

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f778708

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 2 packages
NameType
agentsPatch
@cloudflare/agent-thinkPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@devin-ai-integrationdevin-ai-integrationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no bugs or issues to report.

Open in Devin Review

@pkg-pr-new

Copy link
Copy Markdown

Open in StackBlitz

agents

npm i https://pkg.pr.new/agents@1981

@cloudflare/ai-chat

npm i https://pkg.pr.new/@cloudflare/ai-chat@1981

@cloudflare/codemode

npm i https://pkg.pr.new/@cloudflare/codemode@1981

create-think

npm i https://pkg.pr.new/create-think@1981

hono-agents

npm i https://pkg.pr.new/hono-agents@1981

@cloudflare/shell

npm i https://pkg.pr.new/@cloudflare/shell@1981

@cloudflare/think

npm i https://pkg.pr.new/@cloudflare/think@1981

@cloudflare/voice

npm i https://pkg.pr.new/@cloudflare/voice@1981

@cloudflare/worker-bundler

npm i https://pkg.pr.new/@cloudflare/worker-bundler@1981

commit: f778708

@cjol
cjol merged commit 6c01c8d into mainJul 27, 2026
10 checks passed
@cjol
cjol deleted the fix/issue-1980-1784883305 branch July 27, 2026 11:59
@github-actionsgithub-actionsBot mentioned this pull request Jul 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

BrowserConnector session recycle misses HTTP 410 (expired Browser Rendering session not replaced)

1 participant

@cjol
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: recycle Browser Run sessions on HTTP 410 - #1981

Merged
cjol merged 1 commit into
mainfrom
fix/issue-1980-1784883305
Jul 27, 2026
Merged

fix: recycle Browser Run sessions on HTTP 410#1981
cjol merged 1 commit into
mainfrom
fix/issue-1980-1784883305

Conversation

@agent-think

@agent-thinkagent-thinkBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Closes#1980.

What changed

  • treat Browser Run HTTP 410 Gone as a missing/expired session, alongside 404
  • clear the stale shared-session record and transparently create a replacement
  • retain errors for unrelated statuses such as 500
  • add regression coverage for both the execution path and sessionInfo() cleanup
  • add a patch changeset

Browser Run status validation

I deployed a temporary Browser Run probe and called the binding directly. It confirmed:

  • GET /v1/devtools/browser/<expired-session>/json/list returns 410 with {"error":"Failed to list targets: 410"} after keep_alive expiry
  • DELETE /v1/devtools/browser/<expired-session> returns 404 with {"error":"Failed to delete browser session: 404"}
  • a never-created UUID returns 404 for both list and delete

This means connector liveness checks need to recognize both 404 (unknown/deleted) and 410 (expired), while continuing to surface all other errors.

Verification

  • regression proof: the new HTTP 410 recycling test fails against the old helper (after all 3 configured retries) with BrowserRenderingError ... status: 410
  • pnpm --filter agents exec vitest run --config src/tests/vitest.config.ts src/tests/browser-connector.test.ts34 passed
  • pnpm run checkpassed (all 117 TypeScript projects)
  • pnpm run buildpassed (25 projects)
  • packed the changed agents build and deployed a temporary full-stack Browser Run demo; its API returned passed: true with a new replacement session ID after the injected stale-session 410

Demo: https://issue-1980-browser-session-recycle.magnificent-supermarket.workers.dev


Open in Devin Review

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f778708

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 2 packages
NameType
agentsPatch
@cloudflare/agent-thinkPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@devin-ai-integrationdevin-ai-integrationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no bugs or issues to report.

Open in Devin Review

@pkg-pr-new

Copy link
Copy Markdown

Open in StackBlitz

agents

npm i https://pkg.pr.new/agents@1981

@cloudflare/ai-chat

npm i https://pkg.pr.new/@cloudflare/ai-chat@1981

@cloudflare/codemode

npm i https://pkg.pr.new/@cloudflare/codemode@1981

create-think

npm i https://pkg.pr.new/create-think@1981

hono-agents

npm i https://pkg.pr.new/hono-agents@1981

@cloudflare/shell

npm i https://pkg.pr.new/@cloudflare/shell@1981

@cloudflare/think

npm i https://pkg.pr.new/@cloudflare/think@1981

@cloudflare/voice

npm i https://pkg.pr.new/@cloudflare/voice@1981

@cloudflare/worker-bundler

npm i https://pkg.pr.new/@cloudflare/worker-bundler@1981

commit: f778708

@cjol
cjol merged commit 6c01c8d into mainJul 27, 2026
10 checks passed
@cjol
cjol deleted the fix/issue-1980-1784883305 branch July 27, 2026 11:59
@github-actionsgithub-actionsBot mentioned this pull request Jul 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

BrowserConnector session recycle misses HTTP 410 (expired Browser Rendering session not replaced)

1 participant

@cjol
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix: recycle Browser Run sessions on HTTP 410 - #1981

Merged
cjol merged 1 commit into
mainfrom
fix/issue-1980-1784883305
Jul 27, 2026
Merged

fix: recycle Browser Run sessions on HTTP 410#1981
cjol merged 1 commit into
mainfrom
fix/issue-1980-1784883305

Conversation

@agent-think

@agent-thinkagent-thinkBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Closes#1980.

What changed

  • treat Browser Run HTTP 410 Gone as a missing/expired session, alongside 404
  • clear the stale shared-session record and transparently create a replacement
  • retain errors for unrelated statuses such as 500
  • add regression coverage for both the execution path and sessionInfo() cleanup
  • add a patch changeset

Browser Run status validation

I deployed a temporary Browser Run probe and called the binding directly. It confirmed:

  • GET /v1/devtools/browser/<expired-session>/json/list returns 410 with {"error":"Failed to list targets: 410"} after keep_alive expiry
  • DELETE /v1/devtools/browser/<expired-session> returns 404 with {"error":"Failed to delete browser session: 404"}
  • a never-created UUID returns 404 for both list and delete

This means connector liveness checks need to recognize both 404 (unknown/deleted) and 410 (expired), while continuing to surface all other errors.

Verification

  • regression proof: the new HTTP 410 recycling test fails against the old helper (after all 3 configured retries) with BrowserRenderingError ... status: 410
  • pnpm --filter agents exec vitest run --config src/tests/vitest.config.ts src/tests/browser-connector.test.ts34 passed
  • pnpm run checkpassed (all 117 TypeScript projects)
  • pnpm run buildpassed (25 projects)
  • packed the changed agents build and deployed a temporary full-stack Browser Run demo; its API returned passed: true with a new replacement session ID after the injected stale-session 410

Demo: https://issue-1980-browser-session-recycle.magnificent-supermarket.workers.dev


Open in Devin Review

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f778708

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 2 packages
NameType
agentsPatch
@cloudflare/agent-thinkPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@devin-ai-integrationdevin-ai-integrationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no bugs or issues to report.

Open in Devin Review

@pkg-pr-new

Copy link
Copy Markdown

Open in StackBlitz

agents

npm i https://pkg.pr.new/agents@1981

@cloudflare/ai-chat

npm i https://pkg.pr.new/@cloudflare/ai-chat@1981

@cloudflare/codemode

npm i https://pkg.pr.new/@cloudflare/codemode@1981

create-think

npm i https://pkg.pr.new/create-think@1981

hono-agents

npm i https://pkg.pr.new/hono-agents@1981

@cloudflare/shell

npm i https://pkg.pr.new/@cloudflare/shell@1981

@cloudflare/think

npm i https://pkg.pr.new/@cloudflare/think@1981

@cloudflare/voice

npm i https://pkg.pr.new/@cloudflare/voice@1981

@cloudflare/worker-bundler

npm i https://pkg.pr.new/@cloudflare/worker-bundler@1981

commit: f778708

@cjol
cjol merged commit 6c01c8d into mainJul 27, 2026
10 checks passed
@cjol
cjol deleted the fix/issue-1980-1784883305 branch July 27, 2026 11:59
@github-actionsgithub-actionsBot mentioned this pull request Jul 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

BrowserConnector session recycle misses HTTP 410 (expired Browser Rendering session not replaced)

1 participant

@cjol