fix(grok): Harden ACP resume with replay-idle load readiness#3156
Conversation
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
ApprovabilityVerdict: 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. |
59e347f to
7ac3370
Compare
1b2c893 to
3c38b27
Compare
2037ac6 to
3859afb
Compare
b6f559c to
17d881a
Compare
17d881a to
ba54adf
Compare
ba54adf to
a2aaf61
Compare
a2aaf61 to
2a9ced0
Compare
2a9ced0 to
1ce246d
Compare
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.
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>
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>
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>
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>
Summary
Closes #3560.
session/promptagainst xAI_x.ai/session/prompt_completeso Grok turns settle when the standard ACP RPC remains stranded.session/loadnever returns.AcpSessionRuntimeonly acceptssession/updateevents for its started root session, and Grok drains those accepted events before emittingturn.completed.latestTurntemporarily 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.completedremains the canonical terminal barrier, andProviderRuntimeIngestionretains its strict provider-independent finalization behavior.Validation
vp checkpasses with 7 unrelated existing mobile warnings.vp run typecheckpasses.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/loadRPC 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.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.interruptTurnnow accepts a specificturnId, pre-marks it ininterruptedTurnIds, cancels outstanding prompt slots, and moves the session to ready without emitting spurious terminal events.makeXAiPromptCompletionRuntime) races the native ACP prompt RPC against_x.ai/session/prompt_completenotifications, tags requests withpromptId/requestId, dedupes completed IDs, and aborts pending fallbacks on cancel.AcpSessionRuntimeserializes concurrent prompts, addsdrainEvents/EventStreamBarrierfor queue synchronization, and resolves an interrupted prompt to{ stopReason: 'cancelled' }instead of hanging.MessagesTimelineandChatViewnow propagaterunningTurnIdso fold behavior tracks the active turn rather than a regressedlatestTurn, and interrupt actions include the active turn ID.turn.completedevents may now carry anullstopReason 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/promptRPC 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/updatetraffic, can completesession/loadwhen replay goes idle (not only when the RPC returns), serializes prompts, interrupts in-flight prompt fibers on cancel, and addsdrainEvents/EventStreamBarrierso consumers flush queued events before terminal settlement. xAI_x.ai/session/prompt_completeis wired viamakeXAiPromptCompletionRuntimeto race the native prompt, track promptIds, and synthesize cancelled/missing-stop-reason responses.GrokAdaptergains centralizedsettlePromptInFlight,interruptedTurnIds, turn-scopedinterruptTurn, event draining beforeturn.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 prefersrunningTurnIdover a regressedlatestTurnso 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.