fix(grok): Harden ACP resume with replay-idle load readiness - #3156

Merged
juliusmarminge merged 7 commits into
pingdotgg:mainfrom
mwolson:fix/grok-prompt-complete-fallback
Jun 26, 2026
Merged

fix(grok): Harden ACP resume with replay-idle load readiness#3156
juliusmarminge merged 7 commits into
pingdotgg:mainfrom
mwolson:fix/grok-prompt-complete-fallback

Conversation

@mwolson

@mwolsonmwolson commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes#3560.

  • Race session/prompt against xAI _x.ai/session/prompt_complete so Grok turns settle when the standard ACP RPC remains stranded.
  • Make Stop interrupt the wedged prompt, settle the active turn exactly once, and return the session to ready.
  • Resume Grok sessions without replay flooding by dropping replay updates and using replay-idle load readiness when session/load never returns.
  • Keep one strict root-turn boundary: an AcpSessionRuntime only accepts session/update events for its started root session, and Grok drains those accepted events before emitting turn.completed.
  • Keep the actual running turn unfolded in the web timeline when latestTurn temporarily regresses.

Deliberate scope

This is a narrow V1 Grok/ACP bridge. Child-session chunks are ignored instead of being flattened into the parent transcript. After merge, the V2 follow-up can route those chunks through its existing subagent lineage and progress model.

The earlier projection, reducer, shared-message, markdown-throttling, sidebar, and generic orchestration workarounds have been removed. turn.completed remains the canonical terminal barrier, and ProviderRuntimeIngestion retains its strict provider-independent finalization behavior.

Validation

  • vp check passes with 7 unrelated existing mobile warnings.
  • vp run typecheck passes.
  • vp test packages/effect-acp/src/client.test.ts apps/server/src/provider/Layers/CursorAdapter.test.ts apps/server/src/provider/Layers/GrokAdapter.test.ts apps/server/src/provider/acp/AcpJsonRpcConnection.test.ts apps/server/src/provider/acp/AcpRuntimeModel.test.ts apps/web/src/components/ChatView.logic.test.ts apps/web/src/components/chat/MessagesTimeline.logic.test.ts apps/web/src/components/chat/MessagesTimeline.test.tsx: 8 files, 130 tests passed.

Note

Harden Grok ACP turn resumption with replay-idle load readiness and atomic prompt settlement

  • Session load on resume now races between the session/load RPC and a replay-idle timer (waitForSessionLoadReplayIdle), completing as soon as replayed notifications go quiet for a configurable gap; replayed and child-session updates are dropped during load.
  • Prompt settlement is now atomic and context-validated via settlePromptInFlight: late or cross-session completions are ignored, interrupted turns cannot be revived by late RPC results, and multiple in-flight prompts for the same turn merge with only the last settling the turn.
  • interruptTurn now accepts a specific turnId, pre-marks it in interruptedTurnIds, cancels outstanding prompt slots, and moves the session to ready without emitting spurious terminal events.
  • xAI prompt completion fallback (makeXAiPromptCompletionRuntime) races the native ACP prompt RPC against _x.ai/session/prompt_complete notifications, tags requests with promptId/requestId, dedupes completed IDs, and aborts pending fallbacks on cancel.
  • AcpSessionRuntime serializes concurrent prompts, adds drainEvents/EventStreamBarrier for queue synchronization, and resolves an interrupted prompt to { stopReason: 'cancelled' } instead of hanging.
  • MessagesTimeline and ChatView now propagate runningTurnId so fold behavior tracks the active turn rather than a regressed latestTurn, and interrupt actions include the active turn ID.
  • Risk: turn.completed events may now carry a null stopReason when the xAI provider omits one from its notification.

Macroscope summarized bf4b5b5.


Note

High Risk
Changes core Grok turn lifecycle, cancel/settlement ordering, and ACP event routing—areas where race bugs directly affect user-visible transcripts and session readiness.

Overview
Hardens the Grok ACP bridge so turns can finish when the standard session/prompt RPC hangs, resumes do not flood the transcript, and Stop/cancel races do not double-settle or leak late updates.

The ACP session runtime now ignores replay and foreign-session session/update traffic, can complete session/load when replay goes idle (not only when the RPC returns), serializes prompts, interrupts in-flight prompt fibers on cancel, and adds drainEvents / EventStreamBarrier so consumers flush queued events before terminal settlement. xAI _x.ai/session/prompt_complete is wired via makeXAiPromptCompletionRuntime to race the native prompt, track promptIds, and synthesize cancelled/missing-stop-reason responses.

GrokAdapter gains centralized settlePromptInFlight, interruptedTurnIds, turn-scoped interruptTurn, event draining before turn.completed, and drops streaming for cancelled turns. The mock ACP agent and effect-acp client tests cover hang, stale completion, load replay, and mixed extension notification batches.

Web: interrupt sends the session’s active running turnId; the timeline prefers runningTurnId over a regressed latestTurn so the live turn stays unfolded.

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

@coderabbitai

coderabbitaiBot commented Jun 19, 2026

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

Run ID: e88888ef-ddd4-4d21-8038-d79d0f20e24e

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
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jun 19, 2026
@mwolson
mwolson marked this pull request as ready for review June 19, 2026 03:20
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts Outdated
@macroscopeapp

macroscopeappBot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

1 blocking correctness issue found. Introduces significant runtime behavior changes to Grok session and prompt lifecycle management, including new prompt settlement logic, session resume replay-idle detection, and xAI prompt completion fallback. The complexity and cross-cutting nature of these infrastructure changes warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch 4 times, most recently from 59e347f to 7ac3370CompareJune 19, 2026 03:44
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch 3 times, most recently from 1b2c893 to 3c38b27CompareJune 21, 2026 20:26
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from 2037ac6 to 3859afbCompareJune 21, 2026 21:01
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch 2 times, most recently from b6f559c to 17d881aCompareJune 21, 2026 21:36
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jun 21, 2026
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from 17d881a to ba54adfCompareJune 21, 2026 21:37
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from ba54adf to a2aaf61CompareJune 21, 2026 21:50
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:XXL 1,000+ changed lines (additions + deletions). labels Jun 21, 2026
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from a2aaf61 to 2a9ced0CompareJune 21, 2026 21:54
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from 2a9ced0 to 1ce246dCompareJune 21, 2026 23:04
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts Outdated
Comment threadapps/web/src/session-logic.ts
Comment threadapps/server/src/orchestration/projector.ts Outdated
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/web/src/hooks/useRafThrottledValue.ts Outdated
Comment threadapps/server/src/orchestration/projector.ts Outdated
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Race session/prompt against xAI prompt_complete, harden session/load replay
idle readiness, and interrupt forked prompt RPC fibers on cancel so Grok turns
that hang with no prompt_complete still release the composer and accept follow-ups.
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
Prevent stale prompt completion from mutating a replacement Grok session and exercise replay-idle load readiness end to end.
Co-authored-by: codex <codex@users.noreply.github.com>
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Prevent late cancelled prompt results from consuming replacement-turn state, and suppress ACP output that arrives after cancellation.
Co-authored-by: codex <codex@users.noreply.github.com>
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
juliusmarmingeand others added 3 commits June 25, 2026 21:10
Co-authored-by: codex <codex@users.noreply.github.com>
Drop foreign child-session updates instead of flattening them into the root turn, drain accepted root events before terminal settlement, and remove the projection/UI bridge workarounds that overlap the V2 architecture.
Co-authored-by: codex <codex@users.noreply.github.com>
Keep the shared ACP session runtime provider-neutral and decorate it with Grok's private prompt-completion behavior at the provider boundary. Reject late settlements unless both session and turn lineage match.
Co-authored-by: codex <codex@users.noreply.github.com>
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Keep the xAI notification drain under the thread lock so trailing text is ordered before completion without allowing a new turn to steer into the settling prompt. Mark Stop targets before waiting on the lock so cancellation still wins during the drain window.
Co-authored-by: codex <codex@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Grok Composer hangs on Stop, resume replay floods thread, and long session/load stalls

2 participants

@mwolson@juliusmarminge
, '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(grok): Harden ACP resume with replay-idle load readiness - #3156

Merged
juliusmarminge merged 7 commits into
pingdotgg:mainfrom
mwolson:fix/grok-prompt-complete-fallback
Jun 26, 2026
Merged

fix(grok): Harden ACP resume with replay-idle load readiness#3156
juliusmarminge merged 7 commits into
pingdotgg:mainfrom
mwolson:fix/grok-prompt-complete-fallback

Conversation

@mwolson

@mwolsonmwolson commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes#3560.

  • Race session/prompt against xAI _x.ai/session/prompt_complete so Grok turns settle when the standard ACP RPC remains stranded.
  • Make Stop interrupt the wedged prompt, settle the active turn exactly once, and return the session to ready.
  • Resume Grok sessions without replay flooding by dropping replay updates and using replay-idle load readiness when session/load never returns.
  • Keep one strict root-turn boundary: an AcpSessionRuntime only accepts session/update events for its started root session, and Grok drains those accepted events before emitting turn.completed.
  • Keep the actual running turn unfolded in the web timeline when latestTurn temporarily regresses.

Deliberate scope

This is a narrow V1 Grok/ACP bridge. Child-session chunks are ignored instead of being flattened into the parent transcript. After merge, the V2 follow-up can route those chunks through its existing subagent lineage and progress model.

The earlier projection, reducer, shared-message, markdown-throttling, sidebar, and generic orchestration workarounds have been removed. turn.completed remains the canonical terminal barrier, and ProviderRuntimeIngestion retains its strict provider-independent finalization behavior.

Validation

  • vp check passes with 7 unrelated existing mobile warnings.
  • vp run typecheck passes.
  • vp test packages/effect-acp/src/client.test.ts apps/server/src/provider/Layers/CursorAdapter.test.ts apps/server/src/provider/Layers/GrokAdapter.test.ts apps/server/src/provider/acp/AcpJsonRpcConnection.test.ts apps/server/src/provider/acp/AcpRuntimeModel.test.ts apps/web/src/components/ChatView.logic.test.ts apps/web/src/components/chat/MessagesTimeline.logic.test.ts apps/web/src/components/chat/MessagesTimeline.test.tsx: 8 files, 130 tests passed.

Note

Harden Grok ACP turn resumption with replay-idle load readiness and atomic prompt settlement

  • Session load on resume now races between the session/load RPC and a replay-idle timer (waitForSessionLoadReplayIdle), completing as soon as replayed notifications go quiet for a configurable gap; replayed and child-session updates are dropped during load.
  • Prompt settlement is now atomic and context-validated via settlePromptInFlight: late or cross-session completions are ignored, interrupted turns cannot be revived by late RPC results, and multiple in-flight prompts for the same turn merge with only the last settling the turn.
  • interruptTurn now accepts a specific turnId, pre-marks it in interruptedTurnIds, cancels outstanding prompt slots, and moves the session to ready without emitting spurious terminal events.
  • xAI prompt completion fallback (makeXAiPromptCompletionRuntime) races the native ACP prompt RPC against _x.ai/session/prompt_complete notifications, tags requests with promptId/requestId, dedupes completed IDs, and aborts pending fallbacks on cancel.
  • AcpSessionRuntime serializes concurrent prompts, adds drainEvents/EventStreamBarrier for queue synchronization, and resolves an interrupted prompt to { stopReason: 'cancelled' } instead of hanging.
  • MessagesTimeline and ChatView now propagate runningTurnId so fold behavior tracks the active turn rather than a regressed latestTurn, and interrupt actions include the active turn ID.
  • Risk: turn.completed events may now carry a null stopReason when the xAI provider omits one from its notification.

Macroscope summarized bf4b5b5.


Note

High Risk
Changes core Grok turn lifecycle, cancel/settlement ordering, and ACP event routing—areas where race bugs directly affect user-visible transcripts and session readiness.

Overview
Hardens the Grok ACP bridge so turns can finish when the standard session/prompt RPC hangs, resumes do not flood the transcript, and Stop/cancel races do not double-settle or leak late updates.

The ACP session runtime now ignores replay and foreign-session session/update traffic, can complete session/load when replay goes idle (not only when the RPC returns), serializes prompts, interrupts in-flight prompt fibers on cancel, and adds drainEvents / EventStreamBarrier so consumers flush queued events before terminal settlement. xAI _x.ai/session/prompt_complete is wired via makeXAiPromptCompletionRuntime to race the native prompt, track promptIds, and synthesize cancelled/missing-stop-reason responses.

GrokAdapter gains centralized settlePromptInFlight, interruptedTurnIds, turn-scoped interruptTurn, event draining before turn.completed, and drops streaming for cancelled turns. The mock ACP agent and effect-acp client tests cover hang, stale completion, load replay, and mixed extension notification batches.

Web: interrupt sends the session’s active running turnId; the timeline prefers runningTurnId over a regressed latestTurn so the live turn stays unfolded.

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

@coderabbitai

coderabbitaiBot commented Jun 19, 2026

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

Run ID: e88888ef-ddd4-4d21-8038-d79d0f20e24e

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
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jun 19, 2026
@mwolson
mwolson marked this pull request as ready for review June 19, 2026 03:20
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts Outdated
@macroscopeapp

macroscopeappBot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

1 blocking correctness issue found. Introduces significant runtime behavior changes to Grok session and prompt lifecycle management, including new prompt settlement logic, session resume replay-idle detection, and xAI prompt completion fallback. The complexity and cross-cutting nature of these infrastructure changes warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch 4 times, most recently from 59e347f to 7ac3370CompareJune 19, 2026 03:44
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch 3 times, most recently from 1b2c893 to 3c38b27CompareJune 21, 2026 20:26
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from 2037ac6 to 3859afbCompareJune 21, 2026 21:01
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch 2 times, most recently from b6f559c to 17d881aCompareJune 21, 2026 21:36
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jun 21, 2026
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from 17d881a to ba54adfCompareJune 21, 2026 21:37
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from ba54adf to a2aaf61CompareJune 21, 2026 21:50
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:XXL 1,000+ changed lines (additions + deletions). labels Jun 21, 2026
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from a2aaf61 to 2a9ced0CompareJune 21, 2026 21:54
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from 2a9ced0 to 1ce246dCompareJune 21, 2026 23:04
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts Outdated
Comment threadapps/web/src/session-logic.ts
Comment threadapps/server/src/orchestration/projector.ts Outdated
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/web/src/hooks/useRafThrottledValue.ts Outdated
Comment threadapps/server/src/orchestration/projector.ts Outdated
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Race session/prompt against xAI prompt_complete, harden session/load replay
idle readiness, and interrupt forked prompt RPC fibers on cancel so Grok turns
that hang with no prompt_complete still release the composer and accept follow-ups.
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
Prevent stale prompt completion from mutating a replacement Grok session and exercise replay-idle load readiness end to end.
Co-authored-by: codex <codex@users.noreply.github.com>
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Prevent late cancelled prompt results from consuming replacement-turn state, and suppress ACP output that arrives after cancellation.
Co-authored-by: codex <codex@users.noreply.github.com>
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
juliusmarmingeand others added 3 commits June 25, 2026 21:10
Co-authored-by: codex <codex@users.noreply.github.com>
Drop foreign child-session updates instead of flattening them into the root turn, drain accepted root events before terminal settlement, and remove the projection/UI bridge workarounds that overlap the V2 architecture.
Co-authored-by: codex <codex@users.noreply.github.com>
Keep the shared ACP session runtime provider-neutral and decorate it with Grok's private prompt-completion behavior at the provider boundary. Reject late settlements unless both session and turn lineage match.
Co-authored-by: codex <codex@users.noreply.github.com>
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Keep the xAI notification drain under the thread lock so trailing text is ordered before completion without allowing a new turn to steer into the settling prompt. Mark Stop targets before waiting on the lock so cancellation still wins during the drain window.
Co-authored-by: codex <codex@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Grok Composer hangs on Stop, resume replay floods thread, and long session/load stalls

2 participants

@mwolson@juliusmarminge
, '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(grok): Harden ACP resume with replay-idle load readiness - #3156

Merged
juliusmarminge merged 7 commits into
pingdotgg:mainfrom
mwolson:fix/grok-prompt-complete-fallback
Jun 26, 2026
Merged

fix(grok): Harden ACP resume with replay-idle load readiness#3156
juliusmarminge merged 7 commits into
pingdotgg:mainfrom
mwolson:fix/grok-prompt-complete-fallback

Conversation

@mwolson

@mwolsonmwolson commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes#3560.

  • Race session/prompt against xAI _x.ai/session/prompt_complete so Grok turns settle when the standard ACP RPC remains stranded.
  • Make Stop interrupt the wedged prompt, settle the active turn exactly once, and return the session to ready.
  • Resume Grok sessions without replay flooding by dropping replay updates and using replay-idle load readiness when session/load never returns.
  • Keep one strict root-turn boundary: an AcpSessionRuntime only accepts session/update events for its started root session, and Grok drains those accepted events before emitting turn.completed.
  • Keep the actual running turn unfolded in the web timeline when latestTurn temporarily regresses.

Deliberate scope

This is a narrow V1 Grok/ACP bridge. Child-session chunks are ignored instead of being flattened into the parent transcript. After merge, the V2 follow-up can route those chunks through its existing subagent lineage and progress model.

The earlier projection, reducer, shared-message, markdown-throttling, sidebar, and generic orchestration workarounds have been removed. turn.completed remains the canonical terminal barrier, and ProviderRuntimeIngestion retains its strict provider-independent finalization behavior.

Validation

  • vp check passes with 7 unrelated existing mobile warnings.
  • vp run typecheck passes.
  • vp test packages/effect-acp/src/client.test.ts apps/server/src/provider/Layers/CursorAdapter.test.ts apps/server/src/provider/Layers/GrokAdapter.test.ts apps/server/src/provider/acp/AcpJsonRpcConnection.test.ts apps/server/src/provider/acp/AcpRuntimeModel.test.ts apps/web/src/components/ChatView.logic.test.ts apps/web/src/components/chat/MessagesTimeline.logic.test.ts apps/web/src/components/chat/MessagesTimeline.test.tsx: 8 files, 130 tests passed.

Note

Harden Grok ACP turn resumption with replay-idle load readiness and atomic prompt settlement

  • Session load on resume now races between the session/load RPC and a replay-idle timer (waitForSessionLoadReplayIdle), completing as soon as replayed notifications go quiet for a configurable gap; replayed and child-session updates are dropped during load.
  • Prompt settlement is now atomic and context-validated via settlePromptInFlight: late or cross-session completions are ignored, interrupted turns cannot be revived by late RPC results, and multiple in-flight prompts for the same turn merge with only the last settling the turn.
  • interruptTurn now accepts a specific turnId, pre-marks it in interruptedTurnIds, cancels outstanding prompt slots, and moves the session to ready without emitting spurious terminal events.
  • xAI prompt completion fallback (makeXAiPromptCompletionRuntime) races the native ACP prompt RPC against _x.ai/session/prompt_complete notifications, tags requests with promptId/requestId, dedupes completed IDs, and aborts pending fallbacks on cancel.
  • AcpSessionRuntime serializes concurrent prompts, adds drainEvents/EventStreamBarrier for queue synchronization, and resolves an interrupted prompt to { stopReason: 'cancelled' } instead of hanging.
  • MessagesTimeline and ChatView now propagate runningTurnId so fold behavior tracks the active turn rather than a regressed latestTurn, and interrupt actions include the active turn ID.
  • Risk: turn.completed events may now carry a null stopReason when the xAI provider omits one from its notification.

Macroscope summarized bf4b5b5.


Note

High Risk
Changes core Grok turn lifecycle, cancel/settlement ordering, and ACP event routing—areas where race bugs directly affect user-visible transcripts and session readiness.

Overview
Hardens the Grok ACP bridge so turns can finish when the standard session/prompt RPC hangs, resumes do not flood the transcript, and Stop/cancel races do not double-settle or leak late updates.

The ACP session runtime now ignores replay and foreign-session session/update traffic, can complete session/load when replay goes idle (not only when the RPC returns), serializes prompts, interrupts in-flight prompt fibers on cancel, and adds drainEvents / EventStreamBarrier so consumers flush queued events before terminal settlement. xAI _x.ai/session/prompt_complete is wired via makeXAiPromptCompletionRuntime to race the native prompt, track promptIds, and synthesize cancelled/missing-stop-reason responses.

GrokAdapter gains centralized settlePromptInFlight, interruptedTurnIds, turn-scoped interruptTurn, event draining before turn.completed, and drops streaming for cancelled turns. The mock ACP agent and effect-acp client tests cover hang, stale completion, load replay, and mixed extension notification batches.

Web: interrupt sends the session’s active running turnId; the timeline prefers runningTurnId over a regressed latestTurn so the live turn stays unfolded.

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

@coderabbitai

coderabbitaiBot commented Jun 19, 2026

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

Run ID: e88888ef-ddd4-4d21-8038-d79d0f20e24e

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
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jun 19, 2026
@mwolson
mwolson marked this pull request as ready for review June 19, 2026 03:20
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts Outdated
@macroscopeapp

macroscopeappBot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

1 blocking correctness issue found. Introduces significant runtime behavior changes to Grok session and prompt lifecycle management, including new prompt settlement logic, session resume replay-idle detection, and xAI prompt completion fallback. The complexity and cross-cutting nature of these infrastructure changes warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch 4 times, most recently from 59e347f to 7ac3370CompareJune 19, 2026 03:44
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch 3 times, most recently from 1b2c893 to 3c38b27CompareJune 21, 2026 20:26
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from 2037ac6 to 3859afbCompareJune 21, 2026 21:01
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch 2 times, most recently from b6f559c to 17d881aCompareJune 21, 2026 21:36
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jun 21, 2026
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from 17d881a to ba54adfCompareJune 21, 2026 21:37
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from ba54adf to a2aaf61CompareJune 21, 2026 21:50
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:XXL 1,000+ changed lines (additions + deletions). labels Jun 21, 2026
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from a2aaf61 to 2a9ced0CompareJune 21, 2026 21:54
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from 2a9ced0 to 1ce246dCompareJune 21, 2026 23:04
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts Outdated
Comment threadapps/web/src/session-logic.ts
Comment threadapps/server/src/orchestration/projector.ts Outdated
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/web/src/hooks/useRafThrottledValue.ts Outdated
Comment threadapps/server/src/orchestration/projector.ts Outdated
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Race session/prompt against xAI prompt_complete, harden session/load replay
idle readiness, and interrupt forked prompt RPC fibers on cancel so Grok turns
that hang with no prompt_complete still release the composer and accept follow-ups.
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
Prevent stale prompt completion from mutating a replacement Grok session and exercise replay-idle load readiness end to end.
Co-authored-by: codex <codex@users.noreply.github.com>
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Prevent late cancelled prompt results from consuming replacement-turn state, and suppress ACP output that arrives after cancellation.
Co-authored-by: codex <codex@users.noreply.github.com>
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
juliusmarmingeand others added 3 commits June 25, 2026 21:10
Co-authored-by: codex <codex@users.noreply.github.com>
Drop foreign child-session updates instead of flattening them into the root turn, drain accepted root events before terminal settlement, and remove the projection/UI bridge workarounds that overlap the V2 architecture.
Co-authored-by: codex <codex@users.noreply.github.com>
Keep the shared ACP session runtime provider-neutral and decorate it with Grok's private prompt-completion behavior at the provider boundary. Reject late settlements unless both session and turn lineage match.
Co-authored-by: codex <codex@users.noreply.github.com>
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Keep the xAI notification drain under the thread lock so trailing text is ordered before completion without allowing a new turn to steer into the settling prompt. Mark Stop targets before waiting on the lock so cancellation still wins during the drain window.
Co-authored-by: codex <codex@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Grok Composer hangs on Stop, resume replay floods thread, and long session/load stalls

2 participants

@mwolson@juliusmarminge
, '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(grok): Harden ACP resume with replay-idle load readiness - #3156

Merged
juliusmarminge merged 7 commits into
pingdotgg:mainfrom
mwolson:fix/grok-prompt-complete-fallback
Jun 26, 2026
Merged

fix(grok): Harden ACP resume with replay-idle load readiness#3156
juliusmarminge merged 7 commits into
pingdotgg:mainfrom
mwolson:fix/grok-prompt-complete-fallback

Conversation

@mwolson

@mwolsonmwolson commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes#3560.

  • Race session/prompt against xAI _x.ai/session/prompt_complete so Grok turns settle when the standard ACP RPC remains stranded.
  • Make Stop interrupt the wedged prompt, settle the active turn exactly once, and return the session to ready.
  • Resume Grok sessions without replay flooding by dropping replay updates and using replay-idle load readiness when session/load never returns.
  • Keep one strict root-turn boundary: an AcpSessionRuntime only accepts session/update events for its started root session, and Grok drains those accepted events before emitting turn.completed.
  • Keep the actual running turn unfolded in the web timeline when latestTurn temporarily regresses.

Deliberate scope

This is a narrow V1 Grok/ACP bridge. Child-session chunks are ignored instead of being flattened into the parent transcript. After merge, the V2 follow-up can route those chunks through its existing subagent lineage and progress model.

The earlier projection, reducer, shared-message, markdown-throttling, sidebar, and generic orchestration workarounds have been removed. turn.completed remains the canonical terminal barrier, and ProviderRuntimeIngestion retains its strict provider-independent finalization behavior.

Validation

  • vp check passes with 7 unrelated existing mobile warnings.
  • vp run typecheck passes.
  • vp test packages/effect-acp/src/client.test.ts apps/server/src/provider/Layers/CursorAdapter.test.ts apps/server/src/provider/Layers/GrokAdapter.test.ts apps/server/src/provider/acp/AcpJsonRpcConnection.test.ts apps/server/src/provider/acp/AcpRuntimeModel.test.ts apps/web/src/components/ChatView.logic.test.ts apps/web/src/components/chat/MessagesTimeline.logic.test.ts apps/web/src/components/chat/MessagesTimeline.test.tsx: 8 files, 130 tests passed.

Note

Harden Grok ACP turn resumption with replay-idle load readiness and atomic prompt settlement

  • Session load on resume now races between the session/load RPC and a replay-idle timer (waitForSessionLoadReplayIdle), completing as soon as replayed notifications go quiet for a configurable gap; replayed and child-session updates are dropped during load.
  • Prompt settlement is now atomic and context-validated via settlePromptInFlight: late or cross-session completions are ignored, interrupted turns cannot be revived by late RPC results, and multiple in-flight prompts for the same turn merge with only the last settling the turn.
  • interruptTurn now accepts a specific turnId, pre-marks it in interruptedTurnIds, cancels outstanding prompt slots, and moves the session to ready without emitting spurious terminal events.
  • xAI prompt completion fallback (makeXAiPromptCompletionRuntime) races the native ACP prompt RPC against _x.ai/session/prompt_complete notifications, tags requests with promptId/requestId, dedupes completed IDs, and aborts pending fallbacks on cancel.
  • AcpSessionRuntime serializes concurrent prompts, adds drainEvents/EventStreamBarrier for queue synchronization, and resolves an interrupted prompt to { stopReason: 'cancelled' } instead of hanging.
  • MessagesTimeline and ChatView now propagate runningTurnId so fold behavior tracks the active turn rather than a regressed latestTurn, and interrupt actions include the active turn ID.
  • Risk: turn.completed events may now carry a null stopReason when the xAI provider omits one from its notification.

Macroscope summarized bf4b5b5.


Note

High Risk
Changes core Grok turn lifecycle, cancel/settlement ordering, and ACP event routing—areas where race bugs directly affect user-visible transcripts and session readiness.

Overview
Hardens the Grok ACP bridge so turns can finish when the standard session/prompt RPC hangs, resumes do not flood the transcript, and Stop/cancel races do not double-settle or leak late updates.

The ACP session runtime now ignores replay and foreign-session session/update traffic, can complete session/load when replay goes idle (not only when the RPC returns), serializes prompts, interrupts in-flight prompt fibers on cancel, and adds drainEvents / EventStreamBarrier so consumers flush queued events before terminal settlement. xAI _x.ai/session/prompt_complete is wired via makeXAiPromptCompletionRuntime to race the native prompt, track promptIds, and synthesize cancelled/missing-stop-reason responses.

GrokAdapter gains centralized settlePromptInFlight, interruptedTurnIds, turn-scoped interruptTurn, event draining before turn.completed, and drops streaming for cancelled turns. The mock ACP agent and effect-acp client tests cover hang, stale completion, load replay, and mixed extension notification batches.

Web: interrupt sends the session’s active running turnId; the timeline prefers runningTurnId over a regressed latestTurn so the live turn stays unfolded.

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

@coderabbitai

coderabbitaiBot commented Jun 19, 2026

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

Run ID: e88888ef-ddd4-4d21-8038-d79d0f20e24e

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
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jun 19, 2026
@mwolson
mwolson marked this pull request as ready for review June 19, 2026 03:20
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts Outdated
@macroscopeapp

macroscopeappBot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

1 blocking correctness issue found. Introduces significant runtime behavior changes to Grok session and prompt lifecycle management, including new prompt settlement logic, session resume replay-idle detection, and xAI prompt completion fallback. The complexity and cross-cutting nature of these infrastructure changes warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch 4 times, most recently from 59e347f to 7ac3370CompareJune 19, 2026 03:44
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch 3 times, most recently from 1b2c893 to 3c38b27CompareJune 21, 2026 20:26
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from 2037ac6 to 3859afbCompareJune 21, 2026 21:01
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch 2 times, most recently from b6f559c to 17d881aCompareJune 21, 2026 21:36
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jun 21, 2026
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from 17d881a to ba54adfCompareJune 21, 2026 21:37
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from ba54adf to a2aaf61CompareJune 21, 2026 21:50
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:XXL 1,000+ changed lines (additions + deletions). labels Jun 21, 2026
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from a2aaf61 to 2a9ced0CompareJune 21, 2026 21:54
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from 2a9ced0 to 1ce246dCompareJune 21, 2026 23:04
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts Outdated
Comment threadapps/web/src/session-logic.ts
Comment threadapps/server/src/orchestration/projector.ts Outdated
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/web/src/hooks/useRafThrottledValue.ts Outdated
Comment threadapps/server/src/orchestration/projector.ts Outdated
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Race session/prompt against xAI prompt_complete, harden session/load replay
idle readiness, and interrupt forked prompt RPC fibers on cancel so Grok turns
that hang with no prompt_complete still release the composer and accept follow-ups.
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
Prevent stale prompt completion from mutating a replacement Grok session and exercise replay-idle load readiness end to end.
Co-authored-by: codex <codex@users.noreply.github.com>
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Prevent late cancelled prompt results from consuming replacement-turn state, and suppress ACP output that arrives after cancellation.
Co-authored-by: codex <codex@users.noreply.github.com>
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
juliusmarmingeand others added 3 commits June 25, 2026 21:10
Co-authored-by: codex <codex@users.noreply.github.com>
Drop foreign child-session updates instead of flattening them into the root turn, drain accepted root events before terminal settlement, and remove the projection/UI bridge workarounds that overlap the V2 architecture.
Co-authored-by: codex <codex@users.noreply.github.com>
Keep the shared ACP session runtime provider-neutral and decorate it with Grok's private prompt-completion behavior at the provider boundary. Reject late settlements unless both session and turn lineage match.
Co-authored-by: codex <codex@users.noreply.github.com>
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Keep the xAI notification drain under the thread lock so trailing text is ordered before completion without allowing a new turn to steer into the settling prompt. Mark Stop targets before waiting on the lock so cancellation still wins during the drain window.
Co-authored-by: codex <codex@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Grok Composer hangs on Stop, resume replay floods thread, and long session/load stalls

2 participants

@mwolson@juliusmarminge
, '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(grok): Harden ACP resume with replay-idle load readiness - #3156

Merged
juliusmarminge merged 7 commits into
pingdotgg:mainfrom
mwolson:fix/grok-prompt-complete-fallback
Jun 26, 2026
Merged

fix(grok): Harden ACP resume with replay-idle load readiness#3156
juliusmarminge merged 7 commits into
pingdotgg:mainfrom
mwolson:fix/grok-prompt-complete-fallback

Conversation

@mwolson

@mwolsonmwolson commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes#3560.

  • Race session/prompt against xAI _x.ai/session/prompt_complete so Grok turns settle when the standard ACP RPC remains stranded.
  • Make Stop interrupt the wedged prompt, settle the active turn exactly once, and return the session to ready.
  • Resume Grok sessions without replay flooding by dropping replay updates and using replay-idle load readiness when session/load never returns.
  • Keep one strict root-turn boundary: an AcpSessionRuntime only accepts session/update events for its started root session, and Grok drains those accepted events before emitting turn.completed.
  • Keep the actual running turn unfolded in the web timeline when latestTurn temporarily regresses.

Deliberate scope

This is a narrow V1 Grok/ACP bridge. Child-session chunks are ignored instead of being flattened into the parent transcript. After merge, the V2 follow-up can route those chunks through its existing subagent lineage and progress model.

The earlier projection, reducer, shared-message, markdown-throttling, sidebar, and generic orchestration workarounds have been removed. turn.completed remains the canonical terminal barrier, and ProviderRuntimeIngestion retains its strict provider-independent finalization behavior.

Validation

  • vp check passes with 7 unrelated existing mobile warnings.
  • vp run typecheck passes.
  • vp test packages/effect-acp/src/client.test.ts apps/server/src/provider/Layers/CursorAdapter.test.ts apps/server/src/provider/Layers/GrokAdapter.test.ts apps/server/src/provider/acp/AcpJsonRpcConnection.test.ts apps/server/src/provider/acp/AcpRuntimeModel.test.ts apps/web/src/components/ChatView.logic.test.ts apps/web/src/components/chat/MessagesTimeline.logic.test.ts apps/web/src/components/chat/MessagesTimeline.test.tsx: 8 files, 130 tests passed.

Note

Harden Grok ACP turn resumption with replay-idle load readiness and atomic prompt settlement

  • Session load on resume now races between the session/load RPC and a replay-idle timer (waitForSessionLoadReplayIdle), completing as soon as replayed notifications go quiet for a configurable gap; replayed and child-session updates are dropped during load.
  • Prompt settlement is now atomic and context-validated via settlePromptInFlight: late or cross-session completions are ignored, interrupted turns cannot be revived by late RPC results, and multiple in-flight prompts for the same turn merge with only the last settling the turn.
  • interruptTurn now accepts a specific turnId, pre-marks it in interruptedTurnIds, cancels outstanding prompt slots, and moves the session to ready without emitting spurious terminal events.
  • xAI prompt completion fallback (makeXAiPromptCompletionRuntime) races the native ACP prompt RPC against _x.ai/session/prompt_complete notifications, tags requests with promptId/requestId, dedupes completed IDs, and aborts pending fallbacks on cancel.
  • AcpSessionRuntime serializes concurrent prompts, adds drainEvents/EventStreamBarrier for queue synchronization, and resolves an interrupted prompt to { stopReason: 'cancelled' } instead of hanging.
  • MessagesTimeline and ChatView now propagate runningTurnId so fold behavior tracks the active turn rather than a regressed latestTurn, and interrupt actions include the active turn ID.
  • Risk: turn.completed events may now carry a null stopReason when the xAI provider omits one from its notification.

Macroscope summarized bf4b5b5.


Note

High Risk
Changes core Grok turn lifecycle, cancel/settlement ordering, and ACP event routing—areas where race bugs directly affect user-visible transcripts and session readiness.

Overview
Hardens the Grok ACP bridge so turns can finish when the standard session/prompt RPC hangs, resumes do not flood the transcript, and Stop/cancel races do not double-settle or leak late updates.

The ACP session runtime now ignores replay and foreign-session session/update traffic, can complete session/load when replay goes idle (not only when the RPC returns), serializes prompts, interrupts in-flight prompt fibers on cancel, and adds drainEvents / EventStreamBarrier so consumers flush queued events before terminal settlement. xAI _x.ai/session/prompt_complete is wired via makeXAiPromptCompletionRuntime to race the native prompt, track promptIds, and synthesize cancelled/missing-stop-reason responses.

GrokAdapter gains centralized settlePromptInFlight, interruptedTurnIds, turn-scoped interruptTurn, event draining before turn.completed, and drops streaming for cancelled turns. The mock ACP agent and effect-acp client tests cover hang, stale completion, load replay, and mixed extension notification batches.

Web: interrupt sends the session’s active running turnId; the timeline prefers runningTurnId over a regressed latestTurn so the live turn stays unfolded.

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

@coderabbitai

coderabbitaiBot commented Jun 19, 2026

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

Run ID: e88888ef-ddd4-4d21-8038-d79d0f20e24e

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
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jun 19, 2026
@mwolson
mwolson marked this pull request as ready for review June 19, 2026 03:20
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts Outdated
@macroscopeapp

macroscopeappBot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

1 blocking correctness issue found. Introduces significant runtime behavior changes to Grok session and prompt lifecycle management, including new prompt settlement logic, session resume replay-idle detection, and xAI prompt completion fallback. The complexity and cross-cutting nature of these infrastructure changes warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch 4 times, most recently from 59e347f to 7ac3370CompareJune 19, 2026 03:44
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch 3 times, most recently from 1b2c893 to 3c38b27CompareJune 21, 2026 20:26
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from 2037ac6 to 3859afbCompareJune 21, 2026 21:01
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch 2 times, most recently from b6f559c to 17d881aCompareJune 21, 2026 21:36
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jun 21, 2026
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from 17d881a to ba54adfCompareJune 21, 2026 21:37
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from ba54adf to a2aaf61CompareJune 21, 2026 21:50
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:XXL 1,000+ changed lines (additions + deletions). labels Jun 21, 2026
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from a2aaf61 to 2a9ced0CompareJune 21, 2026 21:54
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from 2a9ced0 to 1ce246dCompareJune 21, 2026 23:04
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts Outdated
Comment threadapps/web/src/session-logic.ts
Comment threadapps/server/src/orchestration/projector.ts Outdated
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/web/src/hooks/useRafThrottledValue.ts Outdated
Comment threadapps/server/src/orchestration/projector.ts Outdated
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Race session/prompt against xAI prompt_complete, harden session/load replay
idle readiness, and interrupt forked prompt RPC fibers on cancel so Grok turns
that hang with no prompt_complete still release the composer and accept follow-ups.
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
Prevent stale prompt completion from mutating a replacement Grok session and exercise replay-idle load readiness end to end.
Co-authored-by: codex <codex@users.noreply.github.com>
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Prevent late cancelled prompt results from consuming replacement-turn state, and suppress ACP output that arrives after cancellation.
Co-authored-by: codex <codex@users.noreply.github.com>
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
juliusmarmingeand others added 3 commits June 25, 2026 21:10
Co-authored-by: codex <codex@users.noreply.github.com>
Drop foreign child-session updates instead of flattening them into the root turn, drain accepted root events before terminal settlement, and remove the projection/UI bridge workarounds that overlap the V2 architecture.
Co-authored-by: codex <codex@users.noreply.github.com>
Keep the shared ACP session runtime provider-neutral and decorate it with Grok's private prompt-completion behavior at the provider boundary. Reject late settlements unless both session and turn lineage match.
Co-authored-by: codex <codex@users.noreply.github.com>
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Keep the xAI notification drain under the thread lock so trailing text is ordered before completion without allowing a new turn to steer into the settling prompt. Mark Stop targets before waiting on the lock so cancellation still wins during the drain window.
Co-authored-by: codex <codex@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Grok Composer hangs on Stop, resume replay floods thread, and long session/load stalls

2 participants

@mwolson@juliusmarminge
, '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(grok): Harden ACP resume with replay-idle load readiness - #3156

Merged
juliusmarminge merged 7 commits into
pingdotgg:mainfrom
mwolson:fix/grok-prompt-complete-fallback
Jun 26, 2026
Merged

fix(grok): Harden ACP resume with replay-idle load readiness#3156
juliusmarminge merged 7 commits into
pingdotgg:mainfrom
mwolson:fix/grok-prompt-complete-fallback

Conversation

@mwolson

@mwolsonmwolson commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes#3560.

  • Race session/prompt against xAI _x.ai/session/prompt_complete so Grok turns settle when the standard ACP RPC remains stranded.
  • Make Stop interrupt the wedged prompt, settle the active turn exactly once, and return the session to ready.
  • Resume Grok sessions without replay flooding by dropping replay updates and using replay-idle load readiness when session/load never returns.
  • Keep one strict root-turn boundary: an AcpSessionRuntime only accepts session/update events for its started root session, and Grok drains those accepted events before emitting turn.completed.
  • Keep the actual running turn unfolded in the web timeline when latestTurn temporarily regresses.

Deliberate scope

This is a narrow V1 Grok/ACP bridge. Child-session chunks are ignored instead of being flattened into the parent transcript. After merge, the V2 follow-up can route those chunks through its existing subagent lineage and progress model.

The earlier projection, reducer, shared-message, markdown-throttling, sidebar, and generic orchestration workarounds have been removed. turn.completed remains the canonical terminal barrier, and ProviderRuntimeIngestion retains its strict provider-independent finalization behavior.

Validation

  • vp check passes with 7 unrelated existing mobile warnings.
  • vp run typecheck passes.
  • vp test packages/effect-acp/src/client.test.ts apps/server/src/provider/Layers/CursorAdapter.test.ts apps/server/src/provider/Layers/GrokAdapter.test.ts apps/server/src/provider/acp/AcpJsonRpcConnection.test.ts apps/server/src/provider/acp/AcpRuntimeModel.test.ts apps/web/src/components/ChatView.logic.test.ts apps/web/src/components/chat/MessagesTimeline.logic.test.ts apps/web/src/components/chat/MessagesTimeline.test.tsx: 8 files, 130 tests passed.

Note

Harden Grok ACP turn resumption with replay-idle load readiness and atomic prompt settlement

  • Session load on resume now races between the session/load RPC and a replay-idle timer (waitForSessionLoadReplayIdle), completing as soon as replayed notifications go quiet for a configurable gap; replayed and child-session updates are dropped during load.
  • Prompt settlement is now atomic and context-validated via settlePromptInFlight: late or cross-session completions are ignored, interrupted turns cannot be revived by late RPC results, and multiple in-flight prompts for the same turn merge with only the last settling the turn.
  • interruptTurn now accepts a specific turnId, pre-marks it in interruptedTurnIds, cancels outstanding prompt slots, and moves the session to ready without emitting spurious terminal events.
  • xAI prompt completion fallback (makeXAiPromptCompletionRuntime) races the native ACP prompt RPC against _x.ai/session/prompt_complete notifications, tags requests with promptId/requestId, dedupes completed IDs, and aborts pending fallbacks on cancel.
  • AcpSessionRuntime serializes concurrent prompts, adds drainEvents/EventStreamBarrier for queue synchronization, and resolves an interrupted prompt to { stopReason: 'cancelled' } instead of hanging.
  • MessagesTimeline and ChatView now propagate runningTurnId so fold behavior tracks the active turn rather than a regressed latestTurn, and interrupt actions include the active turn ID.
  • Risk: turn.completed events may now carry a null stopReason when the xAI provider omits one from its notification.

Macroscope summarized bf4b5b5.


Note

High Risk
Changes core Grok turn lifecycle, cancel/settlement ordering, and ACP event routing—areas where race bugs directly affect user-visible transcripts and session readiness.

Overview
Hardens the Grok ACP bridge so turns can finish when the standard session/prompt RPC hangs, resumes do not flood the transcript, and Stop/cancel races do not double-settle or leak late updates.

The ACP session runtime now ignores replay and foreign-session session/update traffic, can complete session/load when replay goes idle (not only when the RPC returns), serializes prompts, interrupts in-flight prompt fibers on cancel, and adds drainEvents / EventStreamBarrier so consumers flush queued events before terminal settlement. xAI _x.ai/session/prompt_complete is wired via makeXAiPromptCompletionRuntime to race the native prompt, track promptIds, and synthesize cancelled/missing-stop-reason responses.

GrokAdapter gains centralized settlePromptInFlight, interruptedTurnIds, turn-scoped interruptTurn, event draining before turn.completed, and drops streaming for cancelled turns. The mock ACP agent and effect-acp client tests cover hang, stale completion, load replay, and mixed extension notification batches.

Web: interrupt sends the session’s active running turnId; the timeline prefers runningTurnId over a regressed latestTurn so the live turn stays unfolded.

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

@coderabbitai

coderabbitaiBot commented Jun 19, 2026

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

Run ID: e88888ef-ddd4-4d21-8038-d79d0f20e24e

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
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jun 19, 2026
@mwolson
mwolson marked this pull request as ready for review June 19, 2026 03:20
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts Outdated
@macroscopeapp

macroscopeappBot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

1 blocking correctness issue found. Introduces significant runtime behavior changes to Grok session and prompt lifecycle management, including new prompt settlement logic, session resume replay-idle detection, and xAI prompt completion fallback. The complexity and cross-cutting nature of these infrastructure changes warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch 4 times, most recently from 59e347f to 7ac3370CompareJune 19, 2026 03:44
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch 3 times, most recently from 1b2c893 to 3c38b27CompareJune 21, 2026 20:26
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from 2037ac6 to 3859afbCompareJune 21, 2026 21:01
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch 2 times, most recently from b6f559c to 17d881aCompareJune 21, 2026 21:36
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jun 21, 2026
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from 17d881a to ba54adfCompareJune 21, 2026 21:37
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from ba54adf to a2aaf61CompareJune 21, 2026 21:50
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:XXL 1,000+ changed lines (additions + deletions). labels Jun 21, 2026
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from a2aaf61 to 2a9ced0CompareJune 21, 2026 21:54
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from 2a9ced0 to 1ce246dCompareJune 21, 2026 23:04
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts Outdated
Comment threadapps/web/src/session-logic.ts
Comment threadapps/server/src/orchestration/projector.ts Outdated
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/web/src/hooks/useRafThrottledValue.ts Outdated
Comment threadapps/server/src/orchestration/projector.ts Outdated
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Race session/prompt against xAI prompt_complete, harden session/load replay
idle readiness, and interrupt forked prompt RPC fibers on cancel so Grok turns
that hang with no prompt_complete still release the composer and accept follow-ups.
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
Prevent stale prompt completion from mutating a replacement Grok session and exercise replay-idle load readiness end to end.
Co-authored-by: codex <codex@users.noreply.github.com>
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Prevent late cancelled prompt results from consuming replacement-turn state, and suppress ACP output that arrives after cancellation.
Co-authored-by: codex <codex@users.noreply.github.com>
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
juliusmarmingeand others added 3 commits June 25, 2026 21:10
Co-authored-by: codex <codex@users.noreply.github.com>
Drop foreign child-session updates instead of flattening them into the root turn, drain accepted root events before terminal settlement, and remove the projection/UI bridge workarounds that overlap the V2 architecture.
Co-authored-by: codex <codex@users.noreply.github.com>
Keep the shared ACP session runtime provider-neutral and decorate it with Grok's private prompt-completion behavior at the provider boundary. Reject late settlements unless both session and turn lineage match.
Co-authored-by: codex <codex@users.noreply.github.com>
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Keep the xAI notification drain under the thread lock so trailing text is ordered before completion without allowing a new turn to steer into the settling prompt. Mark Stop targets before waiting on the lock so cancellation still wins during the drain window.
Co-authored-by: codex <codex@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Grok Composer hangs on Stop, resume replay floods thread, and long session/load stalls

2 participants

@mwolson@juliusmarminge
, '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(grok): Harden ACP resume with replay-idle load readiness - #3156

Merged
juliusmarminge merged 7 commits into
pingdotgg:mainfrom
mwolson:fix/grok-prompt-complete-fallback
Jun 26, 2026
Merged

fix(grok): Harden ACP resume with replay-idle load readiness#3156
juliusmarminge merged 7 commits into
pingdotgg:mainfrom
mwolson:fix/grok-prompt-complete-fallback

Conversation

@mwolson

@mwolsonmwolson commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes#3560.

  • Race session/prompt against xAI _x.ai/session/prompt_complete so Grok turns settle when the standard ACP RPC remains stranded.
  • Make Stop interrupt the wedged prompt, settle the active turn exactly once, and return the session to ready.
  • Resume Grok sessions without replay flooding by dropping replay updates and using replay-idle load readiness when session/load never returns.
  • Keep one strict root-turn boundary: an AcpSessionRuntime only accepts session/update events for its started root session, and Grok drains those accepted events before emitting turn.completed.
  • Keep the actual running turn unfolded in the web timeline when latestTurn temporarily regresses.

Deliberate scope

This is a narrow V1 Grok/ACP bridge. Child-session chunks are ignored instead of being flattened into the parent transcript. After merge, the V2 follow-up can route those chunks through its existing subagent lineage and progress model.

The earlier projection, reducer, shared-message, markdown-throttling, sidebar, and generic orchestration workarounds have been removed. turn.completed remains the canonical terminal barrier, and ProviderRuntimeIngestion retains its strict provider-independent finalization behavior.

Validation

  • vp check passes with 7 unrelated existing mobile warnings.
  • vp run typecheck passes.
  • vp test packages/effect-acp/src/client.test.ts apps/server/src/provider/Layers/CursorAdapter.test.ts apps/server/src/provider/Layers/GrokAdapter.test.ts apps/server/src/provider/acp/AcpJsonRpcConnection.test.ts apps/server/src/provider/acp/AcpRuntimeModel.test.ts apps/web/src/components/ChatView.logic.test.ts apps/web/src/components/chat/MessagesTimeline.logic.test.ts apps/web/src/components/chat/MessagesTimeline.test.tsx: 8 files, 130 tests passed.

Note

Harden Grok ACP turn resumption with replay-idle load readiness and atomic prompt settlement

  • Session load on resume now races between the session/load RPC and a replay-idle timer (waitForSessionLoadReplayIdle), completing as soon as replayed notifications go quiet for a configurable gap; replayed and child-session updates are dropped during load.
  • Prompt settlement is now atomic and context-validated via settlePromptInFlight: late or cross-session completions are ignored, interrupted turns cannot be revived by late RPC results, and multiple in-flight prompts for the same turn merge with only the last settling the turn.
  • interruptTurn now accepts a specific turnId, pre-marks it in interruptedTurnIds, cancels outstanding prompt slots, and moves the session to ready without emitting spurious terminal events.
  • xAI prompt completion fallback (makeXAiPromptCompletionRuntime) races the native ACP prompt RPC against _x.ai/session/prompt_complete notifications, tags requests with promptId/requestId, dedupes completed IDs, and aborts pending fallbacks on cancel.
  • AcpSessionRuntime serializes concurrent prompts, adds drainEvents/EventStreamBarrier for queue synchronization, and resolves an interrupted prompt to { stopReason: 'cancelled' } instead of hanging.
  • MessagesTimeline and ChatView now propagate runningTurnId so fold behavior tracks the active turn rather than a regressed latestTurn, and interrupt actions include the active turn ID.
  • Risk: turn.completed events may now carry a null stopReason when the xAI provider omits one from its notification.

Macroscope summarized bf4b5b5.


Note

High Risk
Changes core Grok turn lifecycle, cancel/settlement ordering, and ACP event routing—areas where race bugs directly affect user-visible transcripts and session readiness.

Overview
Hardens the Grok ACP bridge so turns can finish when the standard session/prompt RPC hangs, resumes do not flood the transcript, and Stop/cancel races do not double-settle or leak late updates.

The ACP session runtime now ignores replay and foreign-session session/update traffic, can complete session/load when replay goes idle (not only when the RPC returns), serializes prompts, interrupts in-flight prompt fibers on cancel, and adds drainEvents / EventStreamBarrier so consumers flush queued events before terminal settlement. xAI _x.ai/session/prompt_complete is wired via makeXAiPromptCompletionRuntime to race the native prompt, track promptIds, and synthesize cancelled/missing-stop-reason responses.

GrokAdapter gains centralized settlePromptInFlight, interruptedTurnIds, turn-scoped interruptTurn, event draining before turn.completed, and drops streaming for cancelled turns. The mock ACP agent and effect-acp client tests cover hang, stale completion, load replay, and mixed extension notification batches.

Web: interrupt sends the session’s active running turnId; the timeline prefers runningTurnId over a regressed latestTurn so the live turn stays unfolded.

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

@coderabbitai

coderabbitaiBot commented Jun 19, 2026

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

Run ID: e88888ef-ddd4-4d21-8038-d79d0f20e24e

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
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jun 19, 2026
@mwolson
mwolson marked this pull request as ready for review June 19, 2026 03:20
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts Outdated
@macroscopeapp

macroscopeappBot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

1 blocking correctness issue found. Introduces significant runtime behavior changes to Grok session and prompt lifecycle management, including new prompt settlement logic, session resume replay-idle detection, and xAI prompt completion fallback. The complexity and cross-cutting nature of these infrastructure changes warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch 4 times, most recently from 59e347f to 7ac3370CompareJune 19, 2026 03:44
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch 3 times, most recently from 1b2c893 to 3c38b27CompareJune 21, 2026 20:26
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from 2037ac6 to 3859afbCompareJune 21, 2026 21:01
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch 2 times, most recently from b6f559c to 17d881aCompareJune 21, 2026 21:36
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jun 21, 2026
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from 17d881a to ba54adfCompareJune 21, 2026 21:37
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from ba54adf to a2aaf61CompareJune 21, 2026 21:50
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:XXL 1,000+ changed lines (additions + deletions). labels Jun 21, 2026
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from a2aaf61 to 2a9ced0CompareJune 21, 2026 21:54
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from 2a9ced0 to 1ce246dCompareJune 21, 2026 23:04
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts Outdated
Comment threadapps/web/src/session-logic.ts
Comment threadapps/server/src/orchestration/projector.ts Outdated
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/web/src/hooks/useRafThrottledValue.ts Outdated
Comment threadapps/server/src/orchestration/projector.ts Outdated
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Race session/prompt against xAI prompt_complete, harden session/load replay
idle readiness, and interrupt forked prompt RPC fibers on cancel so Grok turns
that hang with no prompt_complete still release the composer and accept follow-ups.
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
Prevent stale prompt completion from mutating a replacement Grok session and exercise replay-idle load readiness end to end.
Co-authored-by: codex <codex@users.noreply.github.com>
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Prevent late cancelled prompt results from consuming replacement-turn state, and suppress ACP output that arrives after cancellation.
Co-authored-by: codex <codex@users.noreply.github.com>
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
juliusmarmingeand others added 3 commits June 25, 2026 21:10
Co-authored-by: codex <codex@users.noreply.github.com>
Drop foreign child-session updates instead of flattening them into the root turn, drain accepted root events before terminal settlement, and remove the projection/UI bridge workarounds that overlap the V2 architecture.
Co-authored-by: codex <codex@users.noreply.github.com>
Keep the shared ACP session runtime provider-neutral and decorate it with Grok's private prompt-completion behavior at the provider boundary. Reject late settlements unless both session and turn lineage match.
Co-authored-by: codex <codex@users.noreply.github.com>
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Keep the xAI notification drain under the thread lock so trailing text is ordered before completion without allowing a new turn to steer into the settling prompt. Mark Stop targets before waiting on the lock so cancellation still wins during the drain window.
Co-authored-by: codex <codex@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Grok Composer hangs on Stop, resume replay floods thread, and long session/load stalls

2 participants

@mwolson@juliusmarminge
, '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(grok): Harden ACP resume with replay-idle load readiness - #3156

Merged
juliusmarminge merged 7 commits into
pingdotgg:mainfrom
mwolson:fix/grok-prompt-complete-fallback
Jun 26, 2026
Merged

fix(grok): Harden ACP resume with replay-idle load readiness#3156
juliusmarminge merged 7 commits into
pingdotgg:mainfrom
mwolson:fix/grok-prompt-complete-fallback

Conversation

@mwolson

@mwolsonmwolson commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes#3560.

  • Race session/prompt against xAI _x.ai/session/prompt_complete so Grok turns settle when the standard ACP RPC remains stranded.
  • Make Stop interrupt the wedged prompt, settle the active turn exactly once, and return the session to ready.
  • Resume Grok sessions without replay flooding by dropping replay updates and using replay-idle load readiness when session/load never returns.
  • Keep one strict root-turn boundary: an AcpSessionRuntime only accepts session/update events for its started root session, and Grok drains those accepted events before emitting turn.completed.
  • Keep the actual running turn unfolded in the web timeline when latestTurn temporarily regresses.

Deliberate scope

This is a narrow V1 Grok/ACP bridge. Child-session chunks are ignored instead of being flattened into the parent transcript. After merge, the V2 follow-up can route those chunks through its existing subagent lineage and progress model.

The earlier projection, reducer, shared-message, markdown-throttling, sidebar, and generic orchestration workarounds have been removed. turn.completed remains the canonical terminal barrier, and ProviderRuntimeIngestion retains its strict provider-independent finalization behavior.

Validation

  • vp check passes with 7 unrelated existing mobile warnings.
  • vp run typecheck passes.
  • vp test packages/effect-acp/src/client.test.ts apps/server/src/provider/Layers/CursorAdapter.test.ts apps/server/src/provider/Layers/GrokAdapter.test.ts apps/server/src/provider/acp/AcpJsonRpcConnection.test.ts apps/server/src/provider/acp/AcpRuntimeModel.test.ts apps/web/src/components/ChatView.logic.test.ts apps/web/src/components/chat/MessagesTimeline.logic.test.ts apps/web/src/components/chat/MessagesTimeline.test.tsx: 8 files, 130 tests passed.

Note

Harden Grok ACP turn resumption with replay-idle load readiness and atomic prompt settlement

  • Session load on resume now races between the session/load RPC and a replay-idle timer (waitForSessionLoadReplayIdle), completing as soon as replayed notifications go quiet for a configurable gap; replayed and child-session updates are dropped during load.
  • Prompt settlement is now atomic and context-validated via settlePromptInFlight: late or cross-session completions are ignored, interrupted turns cannot be revived by late RPC results, and multiple in-flight prompts for the same turn merge with only the last settling the turn.
  • interruptTurn now accepts a specific turnId, pre-marks it in interruptedTurnIds, cancels outstanding prompt slots, and moves the session to ready without emitting spurious terminal events.
  • xAI prompt completion fallback (makeXAiPromptCompletionRuntime) races the native ACP prompt RPC against _x.ai/session/prompt_complete notifications, tags requests with promptId/requestId, dedupes completed IDs, and aborts pending fallbacks on cancel.
  • AcpSessionRuntime serializes concurrent prompts, adds drainEvents/EventStreamBarrier for queue synchronization, and resolves an interrupted prompt to { stopReason: 'cancelled' } instead of hanging.
  • MessagesTimeline and ChatView now propagate runningTurnId so fold behavior tracks the active turn rather than a regressed latestTurn, and interrupt actions include the active turn ID.
  • Risk: turn.completed events may now carry a null stopReason when the xAI provider omits one from its notification.

Macroscope summarized bf4b5b5.


Note

High Risk
Changes core Grok turn lifecycle, cancel/settlement ordering, and ACP event routing—areas where race bugs directly affect user-visible transcripts and session readiness.

Overview
Hardens the Grok ACP bridge so turns can finish when the standard session/prompt RPC hangs, resumes do not flood the transcript, and Stop/cancel races do not double-settle or leak late updates.

The ACP session runtime now ignores replay and foreign-session session/update traffic, can complete session/load when replay goes idle (not only when the RPC returns), serializes prompts, interrupts in-flight prompt fibers on cancel, and adds drainEvents / EventStreamBarrier so consumers flush queued events before terminal settlement. xAI _x.ai/session/prompt_complete is wired via makeXAiPromptCompletionRuntime to race the native prompt, track promptIds, and synthesize cancelled/missing-stop-reason responses.

GrokAdapter gains centralized settlePromptInFlight, interruptedTurnIds, turn-scoped interruptTurn, event draining before turn.completed, and drops streaming for cancelled turns. The mock ACP agent and effect-acp client tests cover hang, stale completion, load replay, and mixed extension notification batches.

Web: interrupt sends the session’s active running turnId; the timeline prefers runningTurnId over a regressed latestTurn so the live turn stays unfolded.

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

@coderabbitai

coderabbitaiBot commented Jun 19, 2026

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

Run ID: e88888ef-ddd4-4d21-8038-d79d0f20e24e

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
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jun 19, 2026
@mwolson
mwolson marked this pull request as ready for review June 19, 2026 03:20
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts Outdated
@macroscopeapp

macroscopeappBot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

1 blocking correctness issue found. Introduces significant runtime behavior changes to Grok session and prompt lifecycle management, including new prompt settlement logic, session resume replay-idle detection, and xAI prompt completion fallback. The complexity and cross-cutting nature of these infrastructure changes warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch 4 times, most recently from 59e347f to 7ac3370CompareJune 19, 2026 03:44
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch 3 times, most recently from 1b2c893 to 3c38b27CompareJune 21, 2026 20:26
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from 2037ac6 to 3859afbCompareJune 21, 2026 21:01
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch 2 times, most recently from b6f559c to 17d881aCompareJune 21, 2026 21:36
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jun 21, 2026
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from 17d881a to ba54adfCompareJune 21, 2026 21:37
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from ba54adf to a2aaf61CompareJune 21, 2026 21:50
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:XXL 1,000+ changed lines (additions + deletions). labels Jun 21, 2026
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from a2aaf61 to 2a9ced0CompareJune 21, 2026 21:54
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
@mwolson
mwolsonforce-pushed the fix/grok-prompt-complete-fallback branch from 2a9ced0 to 1ce246dCompareJune 21, 2026 23:04
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts
Comment threadpackages/shared/src/orchestrationMessages.ts Outdated
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts Outdated
Comment threadapps/web/src/session-logic.ts
Comment threadapps/server/src/orchestration/projector.ts Outdated
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/web/src/hooks/useRafThrottledValue.ts Outdated
Comment threadapps/server/src/orchestration/projector.ts Outdated
Comment threadapps/server/src/provider/acp/AcpSessionRuntime.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Race session/prompt against xAI prompt_complete, harden session/load replay
idle readiness, and interrupt forked prompt RPC fibers on cancel so Grok turns
that hang with no prompt_complete still release the composer and accept follow-ups.
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
Prevent stale prompt completion from mutating a replacement Grok session and exercise replay-idle load readiness end to end.
Co-authored-by: codex <codex@users.noreply.github.com>
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Prevent late cancelled prompt results from consuming replacement-turn state, and suppress ACP output that arrives after cancellation.
Co-authored-by: codex <codex@users.noreply.github.com>
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
juliusmarmingeand others added 3 commits June 25, 2026 21:10
Co-authored-by: codex <codex@users.noreply.github.com>
Drop foreign child-session updates instead of flattening them into the root turn, drain accepted root events before terminal settlement, and remove the projection/UI bridge workarounds that overlap the V2 architecture.
Co-authored-by: codex <codex@users.noreply.github.com>
Keep the shared ACP session runtime provider-neutral and decorate it with Grok's private prompt-completion behavior at the provider boundary. Reject late settlements unless both session and turn lineage match.
Co-authored-by: codex <codex@users.noreply.github.com>
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Keep the xAI notification drain under the thread lock so trailing text is ordered before completion without allowing a new turn to steer into the settling prompt. Mark Stop targets before waiting on the lock so cancellation still wins during the drain window.
Co-authored-by: codex <codex@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Grok Composer hangs on Stop, resume replay floods thread, and long session/load stalls

2 participants

@mwolson@juliusmarminge