fix(server): settle turns when provider interrupts fail - #7376

Closed
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:t3code/fix-pr-7368
Closed

fix(server): settle turns when provider interrupts fail#7376
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:t3code/fix-pr-7368

Conversation

@StiensWout

@StiensWoutStiensWout commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

The stop button could leave a thread showing Working forever when the provider abort failed. The asynchronous reactor left the active turn set, while the provider failure never became visible to the user.

Interrupt failure is now fail-safe: T3 records a provider failure activity, attempts to stop the provider session, and clears the projected active turn even if session cleanup also fails.

Verification

  • pnpm exec vp test run apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts
  • pnpm exec vp fmt --check apps/server/src/orchestration/Layers/ProviderCommandReactor.ts apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts
  • pnpm exec vp lint --report-unused-disable-directives apps/server/src/orchestration/Layers/ProviderCommandReactor.ts apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts
  • pnpm exec vp run --filter t3 typecheck
  • git diff --check

Fixes#7368

Implemented with GPT-5.6 Sol through Codex in T3 Code.


Note

Medium Risk
Changes orchestration session state on interrupt failure paths; behavior is localized to ProviderCommandReactor with test coverage, but affects stop-button UX and projected thread state.

Overview
Fixes threads that could stay in Working forever when Stop failed because the provider abort errored and the reactor never cleared activeTurnId or surfaced the failure.

Turn interrupt handling in ProviderCommandReactor is now fail-safe: if interruptTurn fails, the reactor tries stopSession, then uses the shared setThreadSessionError helper (renamed from the turn-start-only variant) to set session error, clear activeTurnId, and set lastError, and it records a provider.turn.interrupt.failed activity. Recovery still runs when session stop also fails.

A regression test covers the case where both interrupt and stop fail against an unavailable OpenCode server.

Reviewed by Cursor Bugbot for commit 4eb952e. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Handle provider turn interrupt failures by settling thread session with error state

  • When providerService.interruptTurn fails, the handler now attempts providerService.stopSession, marks the thread session as error with the failure detail, and appends a provider.turn.interrupt.failed activity.
  • If stopSession also fails, a warning is logged with both the stop cause and the original interrupt cause; the thread is still settled.
  • Renames the internal setThreadSessionErrorOnTurnStartFailure utility to setThreadSessionError and reuses it across both turn start and interrupt failure paths in ProviderCommandReactor.ts.
  • Interrupt-only causes (e.g. fiber cancellation) still short-circuit as interrupts without triggering recovery.
  • Behavioral Change: provider turn interrupts that previously propagated errors now produce a settled error session state instead.

Macroscope summarized 4eb952e.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 3771a625-4da0-401d-88b3-d2cd2b384864

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 18, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This bug fix adds error handling when provider interrupts fail, ensuring threads settle to an error state rather than remaining inconsistent. While the change is focused and includes tests, the orchestration error-handling logic and the author's limited history with this file warrant human review.

You can add or adjust custom eligibility rules. Learn more.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing in favor of #7412. It already fixes the same provider interrupt failure and clears the stuck thread state.

@t3dotggt3dotgg closed this Aug 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stop button leaves a thread stuck "Working" forever when the provider's abort fails

2 participants

@StiensWout@t3dotgg
, '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(server): settle turns when provider interrupts fail - #7376

Closed
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:t3code/fix-pr-7368
Closed

fix(server): settle turns when provider interrupts fail#7376
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:t3code/fix-pr-7368

Conversation

@StiensWout

@StiensWoutStiensWout commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

The stop button could leave a thread showing Working forever when the provider abort failed. The asynchronous reactor left the active turn set, while the provider failure never became visible to the user.

Interrupt failure is now fail-safe: T3 records a provider failure activity, attempts to stop the provider session, and clears the projected active turn even if session cleanup also fails.

Verification

  • pnpm exec vp test run apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts
  • pnpm exec vp fmt --check apps/server/src/orchestration/Layers/ProviderCommandReactor.ts apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts
  • pnpm exec vp lint --report-unused-disable-directives apps/server/src/orchestration/Layers/ProviderCommandReactor.ts apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts
  • pnpm exec vp run --filter t3 typecheck
  • git diff --check

Fixes#7368

Implemented with GPT-5.6 Sol through Codex in T3 Code.


Note

Medium Risk
Changes orchestration session state on interrupt failure paths; behavior is localized to ProviderCommandReactor with test coverage, but affects stop-button UX and projected thread state.

Overview
Fixes threads that could stay in Working forever when Stop failed because the provider abort errored and the reactor never cleared activeTurnId or surfaced the failure.

Turn interrupt handling in ProviderCommandReactor is now fail-safe: if interruptTurn fails, the reactor tries stopSession, then uses the shared setThreadSessionError helper (renamed from the turn-start-only variant) to set session error, clear activeTurnId, and set lastError, and it records a provider.turn.interrupt.failed activity. Recovery still runs when session stop also fails.

A regression test covers the case where both interrupt and stop fail against an unavailable OpenCode server.

Reviewed by Cursor Bugbot for commit 4eb952e. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Handle provider turn interrupt failures by settling thread session with error state

  • When providerService.interruptTurn fails, the handler now attempts providerService.stopSession, marks the thread session as error with the failure detail, and appends a provider.turn.interrupt.failed activity.
  • If stopSession also fails, a warning is logged with both the stop cause and the original interrupt cause; the thread is still settled.
  • Renames the internal setThreadSessionErrorOnTurnStartFailure utility to setThreadSessionError and reuses it across both turn start and interrupt failure paths in ProviderCommandReactor.ts.
  • Interrupt-only causes (e.g. fiber cancellation) still short-circuit as interrupts without triggering recovery.
  • Behavioral Change: provider turn interrupts that previously propagated errors now produce a settled error session state instead.

Macroscope summarized 4eb952e.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 3771a625-4da0-401d-88b3-d2cd2b384864

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 18, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This bug fix adds error handling when provider interrupts fail, ensuring threads settle to an error state rather than remaining inconsistent. While the change is focused and includes tests, the orchestration error-handling logic and the author's limited history with this file warrant human review.

You can add or adjust custom eligibility rules. Learn more.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing in favor of #7412. It already fixes the same provider interrupt failure and clears the stuck thread state.

@t3dotggt3dotgg closed this Aug 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stop button leaves a thread stuck "Working" forever when the provider's abort fails

2 participants

@StiensWout@t3dotgg
, '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(server): settle turns when provider interrupts fail - #7376

Closed
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:t3code/fix-pr-7368
Closed

fix(server): settle turns when provider interrupts fail#7376
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:t3code/fix-pr-7368

Conversation

@StiensWout

@StiensWoutStiensWout commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

The stop button could leave a thread showing Working forever when the provider abort failed. The asynchronous reactor left the active turn set, while the provider failure never became visible to the user.

Interrupt failure is now fail-safe: T3 records a provider failure activity, attempts to stop the provider session, and clears the projected active turn even if session cleanup also fails.

Verification

  • pnpm exec vp test run apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts
  • pnpm exec vp fmt --check apps/server/src/orchestration/Layers/ProviderCommandReactor.ts apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts
  • pnpm exec vp lint --report-unused-disable-directives apps/server/src/orchestration/Layers/ProviderCommandReactor.ts apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts
  • pnpm exec vp run --filter t3 typecheck
  • git diff --check

Fixes#7368

Implemented with GPT-5.6 Sol through Codex in T3 Code.


Note

Medium Risk
Changes orchestration session state on interrupt failure paths; behavior is localized to ProviderCommandReactor with test coverage, but affects stop-button UX and projected thread state.

Overview
Fixes threads that could stay in Working forever when Stop failed because the provider abort errored and the reactor never cleared activeTurnId or surfaced the failure.

Turn interrupt handling in ProviderCommandReactor is now fail-safe: if interruptTurn fails, the reactor tries stopSession, then uses the shared setThreadSessionError helper (renamed from the turn-start-only variant) to set session error, clear activeTurnId, and set lastError, and it records a provider.turn.interrupt.failed activity. Recovery still runs when session stop also fails.

A regression test covers the case where both interrupt and stop fail against an unavailable OpenCode server.

Reviewed by Cursor Bugbot for commit 4eb952e. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Handle provider turn interrupt failures by settling thread session with error state

  • When providerService.interruptTurn fails, the handler now attempts providerService.stopSession, marks the thread session as error with the failure detail, and appends a provider.turn.interrupt.failed activity.
  • If stopSession also fails, a warning is logged with both the stop cause and the original interrupt cause; the thread is still settled.
  • Renames the internal setThreadSessionErrorOnTurnStartFailure utility to setThreadSessionError and reuses it across both turn start and interrupt failure paths in ProviderCommandReactor.ts.
  • Interrupt-only causes (e.g. fiber cancellation) still short-circuit as interrupts without triggering recovery.
  • Behavioral Change: provider turn interrupts that previously propagated errors now produce a settled error session state instead.

Macroscope summarized 4eb952e.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 3771a625-4da0-401d-88b3-d2cd2b384864

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 18, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This bug fix adds error handling when provider interrupts fail, ensuring threads settle to an error state rather than remaining inconsistent. While the change is focused and includes tests, the orchestration error-handling logic and the author's limited history with this file warrant human review.

You can add or adjust custom eligibility rules. Learn more.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing in favor of #7412. It already fixes the same provider interrupt failure and clears the stuck thread state.

@t3dotggt3dotgg closed this Aug 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stop button leaves a thread stuck "Working" forever when the provider's abort fails

2 participants

@StiensWout@t3dotgg
, '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(server): settle turns when provider interrupts fail - #7376

Closed
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:t3code/fix-pr-7368
Closed

fix(server): settle turns when provider interrupts fail#7376
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:t3code/fix-pr-7368

Conversation

@StiensWout

@StiensWoutStiensWout commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

The stop button could leave a thread showing Working forever when the provider abort failed. The asynchronous reactor left the active turn set, while the provider failure never became visible to the user.

Interrupt failure is now fail-safe: T3 records a provider failure activity, attempts to stop the provider session, and clears the projected active turn even if session cleanup also fails.

Verification

  • pnpm exec vp test run apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts
  • pnpm exec vp fmt --check apps/server/src/orchestration/Layers/ProviderCommandReactor.ts apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts
  • pnpm exec vp lint --report-unused-disable-directives apps/server/src/orchestration/Layers/ProviderCommandReactor.ts apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts
  • pnpm exec vp run --filter t3 typecheck
  • git diff --check

Fixes#7368

Implemented with GPT-5.6 Sol through Codex in T3 Code.


Note

Medium Risk
Changes orchestration session state on interrupt failure paths; behavior is localized to ProviderCommandReactor with test coverage, but affects stop-button UX and projected thread state.

Overview
Fixes threads that could stay in Working forever when Stop failed because the provider abort errored and the reactor never cleared activeTurnId or surfaced the failure.

Turn interrupt handling in ProviderCommandReactor is now fail-safe: if interruptTurn fails, the reactor tries stopSession, then uses the shared setThreadSessionError helper (renamed from the turn-start-only variant) to set session error, clear activeTurnId, and set lastError, and it records a provider.turn.interrupt.failed activity. Recovery still runs when session stop also fails.

A regression test covers the case where both interrupt and stop fail against an unavailable OpenCode server.

Reviewed by Cursor Bugbot for commit 4eb952e. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Handle provider turn interrupt failures by settling thread session with error state

  • When providerService.interruptTurn fails, the handler now attempts providerService.stopSession, marks the thread session as error with the failure detail, and appends a provider.turn.interrupt.failed activity.
  • If stopSession also fails, a warning is logged with both the stop cause and the original interrupt cause; the thread is still settled.
  • Renames the internal setThreadSessionErrorOnTurnStartFailure utility to setThreadSessionError and reuses it across both turn start and interrupt failure paths in ProviderCommandReactor.ts.
  • Interrupt-only causes (e.g. fiber cancellation) still short-circuit as interrupts without triggering recovery.
  • Behavioral Change: provider turn interrupts that previously propagated errors now produce a settled error session state instead.

Macroscope summarized 4eb952e.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 3771a625-4da0-401d-88b3-d2cd2b384864

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 18, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This bug fix adds error handling when provider interrupts fail, ensuring threads settle to an error state rather than remaining inconsistent. While the change is focused and includes tests, the orchestration error-handling logic and the author's limited history with this file warrant human review.

You can add or adjust custom eligibility rules. Learn more.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing in favor of #7412. It already fixes the same provider interrupt failure and clears the stuck thread state.

@t3dotggt3dotgg closed this Aug 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stop button leaves a thread stuck "Working" forever when the provider's abort fails

2 participants

@StiensWout@t3dotgg
, '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(server): settle turns when provider interrupts fail - #7376

Closed
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:t3code/fix-pr-7368
Closed

fix(server): settle turns when provider interrupts fail#7376
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:t3code/fix-pr-7368

Conversation

@StiensWout

@StiensWoutStiensWout commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

The stop button could leave a thread showing Working forever when the provider abort failed. The asynchronous reactor left the active turn set, while the provider failure never became visible to the user.

Interrupt failure is now fail-safe: T3 records a provider failure activity, attempts to stop the provider session, and clears the projected active turn even if session cleanup also fails.

Verification

  • pnpm exec vp test run apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts
  • pnpm exec vp fmt --check apps/server/src/orchestration/Layers/ProviderCommandReactor.ts apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts
  • pnpm exec vp lint --report-unused-disable-directives apps/server/src/orchestration/Layers/ProviderCommandReactor.ts apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts
  • pnpm exec vp run --filter t3 typecheck
  • git diff --check

Fixes#7368

Implemented with GPT-5.6 Sol through Codex in T3 Code.


Note

Medium Risk
Changes orchestration session state on interrupt failure paths; behavior is localized to ProviderCommandReactor with test coverage, but affects stop-button UX and projected thread state.

Overview
Fixes threads that could stay in Working forever when Stop failed because the provider abort errored and the reactor never cleared activeTurnId or surfaced the failure.

Turn interrupt handling in ProviderCommandReactor is now fail-safe: if interruptTurn fails, the reactor tries stopSession, then uses the shared setThreadSessionError helper (renamed from the turn-start-only variant) to set session error, clear activeTurnId, and set lastError, and it records a provider.turn.interrupt.failed activity. Recovery still runs when session stop also fails.

A regression test covers the case where both interrupt and stop fail against an unavailable OpenCode server.

Reviewed by Cursor Bugbot for commit 4eb952e. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Handle provider turn interrupt failures by settling thread session with error state

  • When providerService.interruptTurn fails, the handler now attempts providerService.stopSession, marks the thread session as error with the failure detail, and appends a provider.turn.interrupt.failed activity.
  • If stopSession also fails, a warning is logged with both the stop cause and the original interrupt cause; the thread is still settled.
  • Renames the internal setThreadSessionErrorOnTurnStartFailure utility to setThreadSessionError and reuses it across both turn start and interrupt failure paths in ProviderCommandReactor.ts.
  • Interrupt-only causes (e.g. fiber cancellation) still short-circuit as interrupts without triggering recovery.
  • Behavioral Change: provider turn interrupts that previously propagated errors now produce a settled error session state instead.

Macroscope summarized 4eb952e.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 3771a625-4da0-401d-88b3-d2cd2b384864

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 18, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This bug fix adds error handling when provider interrupts fail, ensuring threads settle to an error state rather than remaining inconsistent. While the change is focused and includes tests, the orchestration error-handling logic and the author's limited history with this file warrant human review.

You can add or adjust custom eligibility rules. Learn more.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing in favor of #7412. It already fixes the same provider interrupt failure and clears the stuck thread state.

@t3dotggt3dotgg closed this Aug 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stop button leaves a thread stuck "Working" forever when the provider's abort fails

2 participants

@StiensWout@t3dotgg
, '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(server): settle turns when provider interrupts fail - #7376

Closed
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:t3code/fix-pr-7368
Closed

fix(server): settle turns when provider interrupts fail#7376
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:t3code/fix-pr-7368

Conversation

@StiensWout

@StiensWoutStiensWout commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

The stop button could leave a thread showing Working forever when the provider abort failed. The asynchronous reactor left the active turn set, while the provider failure never became visible to the user.

Interrupt failure is now fail-safe: T3 records a provider failure activity, attempts to stop the provider session, and clears the projected active turn even if session cleanup also fails.

Verification

  • pnpm exec vp test run apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts
  • pnpm exec vp fmt --check apps/server/src/orchestration/Layers/ProviderCommandReactor.ts apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts
  • pnpm exec vp lint --report-unused-disable-directives apps/server/src/orchestration/Layers/ProviderCommandReactor.ts apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts
  • pnpm exec vp run --filter t3 typecheck
  • git diff --check

Fixes#7368

Implemented with GPT-5.6 Sol through Codex in T3 Code.


Note

Medium Risk
Changes orchestration session state on interrupt failure paths; behavior is localized to ProviderCommandReactor with test coverage, but affects stop-button UX and projected thread state.

Overview
Fixes threads that could stay in Working forever when Stop failed because the provider abort errored and the reactor never cleared activeTurnId or surfaced the failure.

Turn interrupt handling in ProviderCommandReactor is now fail-safe: if interruptTurn fails, the reactor tries stopSession, then uses the shared setThreadSessionError helper (renamed from the turn-start-only variant) to set session error, clear activeTurnId, and set lastError, and it records a provider.turn.interrupt.failed activity. Recovery still runs when session stop also fails.

A regression test covers the case where both interrupt and stop fail against an unavailable OpenCode server.

Reviewed by Cursor Bugbot for commit 4eb952e. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Handle provider turn interrupt failures by settling thread session with error state

  • When providerService.interruptTurn fails, the handler now attempts providerService.stopSession, marks the thread session as error with the failure detail, and appends a provider.turn.interrupt.failed activity.
  • If stopSession also fails, a warning is logged with both the stop cause and the original interrupt cause; the thread is still settled.
  • Renames the internal setThreadSessionErrorOnTurnStartFailure utility to setThreadSessionError and reuses it across both turn start and interrupt failure paths in ProviderCommandReactor.ts.
  • Interrupt-only causes (e.g. fiber cancellation) still short-circuit as interrupts without triggering recovery.
  • Behavioral Change: provider turn interrupts that previously propagated errors now produce a settled error session state instead.

Macroscope summarized 4eb952e.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 3771a625-4da0-401d-88b3-d2cd2b384864

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 18, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This bug fix adds error handling when provider interrupts fail, ensuring threads settle to an error state rather than remaining inconsistent. While the change is focused and includes tests, the orchestration error-handling logic and the author's limited history with this file warrant human review.

You can add or adjust custom eligibility rules. Learn more.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing in favor of #7412. It already fixes the same provider interrupt failure and clears the stuck thread state.

@t3dotggt3dotgg closed this Aug 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stop button leaves a thread stuck "Working" forever when the provider's abort fails

2 participants

@StiensWout@t3dotgg
, '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(server): settle turns when provider interrupts fail - #7376

Closed
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:t3code/fix-pr-7368
Closed

fix(server): settle turns when provider interrupts fail#7376
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:t3code/fix-pr-7368

Conversation

@StiensWout

@StiensWoutStiensWout commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

The stop button could leave a thread showing Working forever when the provider abort failed. The asynchronous reactor left the active turn set, while the provider failure never became visible to the user.

Interrupt failure is now fail-safe: T3 records a provider failure activity, attempts to stop the provider session, and clears the projected active turn even if session cleanup also fails.

Verification

  • pnpm exec vp test run apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts
  • pnpm exec vp fmt --check apps/server/src/orchestration/Layers/ProviderCommandReactor.ts apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts
  • pnpm exec vp lint --report-unused-disable-directives apps/server/src/orchestration/Layers/ProviderCommandReactor.ts apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts
  • pnpm exec vp run --filter t3 typecheck
  • git diff --check

Fixes#7368

Implemented with GPT-5.6 Sol through Codex in T3 Code.


Note

Medium Risk
Changes orchestration session state on interrupt failure paths; behavior is localized to ProviderCommandReactor with test coverage, but affects stop-button UX and projected thread state.

Overview
Fixes threads that could stay in Working forever when Stop failed because the provider abort errored and the reactor never cleared activeTurnId or surfaced the failure.

Turn interrupt handling in ProviderCommandReactor is now fail-safe: if interruptTurn fails, the reactor tries stopSession, then uses the shared setThreadSessionError helper (renamed from the turn-start-only variant) to set session error, clear activeTurnId, and set lastError, and it records a provider.turn.interrupt.failed activity. Recovery still runs when session stop also fails.

A regression test covers the case where both interrupt and stop fail against an unavailable OpenCode server.

Reviewed by Cursor Bugbot for commit 4eb952e. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Handle provider turn interrupt failures by settling thread session with error state

  • When providerService.interruptTurn fails, the handler now attempts providerService.stopSession, marks the thread session as error with the failure detail, and appends a provider.turn.interrupt.failed activity.
  • If stopSession also fails, a warning is logged with both the stop cause and the original interrupt cause; the thread is still settled.
  • Renames the internal setThreadSessionErrorOnTurnStartFailure utility to setThreadSessionError and reuses it across both turn start and interrupt failure paths in ProviderCommandReactor.ts.
  • Interrupt-only causes (e.g. fiber cancellation) still short-circuit as interrupts without triggering recovery.
  • Behavioral Change: provider turn interrupts that previously propagated errors now produce a settled error session state instead.

Macroscope summarized 4eb952e.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 3771a625-4da0-401d-88b3-d2cd2b384864

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 18, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This bug fix adds error handling when provider interrupts fail, ensuring threads settle to an error state rather than remaining inconsistent. While the change is focused and includes tests, the orchestration error-handling logic and the author's limited history with this file warrant human review.

You can add or adjust custom eligibility rules. Learn more.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing in favor of #7412. It already fixes the same provider interrupt failure and clears the stuck thread state.

@t3dotggt3dotgg closed this Aug 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stop button leaves a thread stuck "Working" forever when the provider's abort fails

2 participants

@StiensWout@t3dotgg
, '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(server): settle turns when provider interrupts fail - #7376

Closed
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:t3code/fix-pr-7368
Closed

fix(server): settle turns when provider interrupts fail#7376
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:t3code/fix-pr-7368

Conversation

@StiensWout

@StiensWoutStiensWout commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

The stop button could leave a thread showing Working forever when the provider abort failed. The asynchronous reactor left the active turn set, while the provider failure never became visible to the user.

Interrupt failure is now fail-safe: T3 records a provider failure activity, attempts to stop the provider session, and clears the projected active turn even if session cleanup also fails.

Verification

  • pnpm exec vp test run apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts
  • pnpm exec vp fmt --check apps/server/src/orchestration/Layers/ProviderCommandReactor.ts apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts
  • pnpm exec vp lint --report-unused-disable-directives apps/server/src/orchestration/Layers/ProviderCommandReactor.ts apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts
  • pnpm exec vp run --filter t3 typecheck
  • git diff --check

Fixes#7368

Implemented with GPT-5.6 Sol through Codex in T3 Code.


Note

Medium Risk
Changes orchestration session state on interrupt failure paths; behavior is localized to ProviderCommandReactor with test coverage, but affects stop-button UX and projected thread state.

Overview
Fixes threads that could stay in Working forever when Stop failed because the provider abort errored and the reactor never cleared activeTurnId or surfaced the failure.

Turn interrupt handling in ProviderCommandReactor is now fail-safe: if interruptTurn fails, the reactor tries stopSession, then uses the shared setThreadSessionError helper (renamed from the turn-start-only variant) to set session error, clear activeTurnId, and set lastError, and it records a provider.turn.interrupt.failed activity. Recovery still runs when session stop also fails.

A regression test covers the case where both interrupt and stop fail against an unavailable OpenCode server.

Reviewed by Cursor Bugbot for commit 4eb952e. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Handle provider turn interrupt failures by settling thread session with error state

  • When providerService.interruptTurn fails, the handler now attempts providerService.stopSession, marks the thread session as error with the failure detail, and appends a provider.turn.interrupt.failed activity.
  • If stopSession also fails, a warning is logged with both the stop cause and the original interrupt cause; the thread is still settled.
  • Renames the internal setThreadSessionErrorOnTurnStartFailure utility to setThreadSessionError and reuses it across both turn start and interrupt failure paths in ProviderCommandReactor.ts.
  • Interrupt-only causes (e.g. fiber cancellation) still short-circuit as interrupts without triggering recovery.
  • Behavioral Change: provider turn interrupts that previously propagated errors now produce a settled error session state instead.

Macroscope summarized 4eb952e.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 3771a625-4da0-401d-88b3-d2cd2b384864

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 18, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This bug fix adds error handling when provider interrupts fail, ensuring threads settle to an error state rather than remaining inconsistent. While the change is focused and includes tests, the orchestration error-handling logic and the author's limited history with this file warrant human review.

You can add or adjust custom eligibility rules. Learn more.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing in favor of #7412. It already fixes the same provider interrupt failure and clears the stuck thread state.

@t3dotggt3dotgg closed this Aug 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stop button leaves a thread stuck "Working" forever when the provider's abort fails

2 participants

@StiensWout@t3dotgg