feat(server): Grok Build effort, auth, rewind, and usage [WIP - for content] - #6383
feat(server): Grok Build effort, auth, rewind, and usage [WIP - for content]#6383t3dotgg wants to merge 3 commits into
Conversation
Grok already advertised reasoning effort and rewind over ACP. T3 dropped the metadata and forced a new thread for model changes. Map the live effort menu into composer options, send session/set_model _meta.reasoningEffort, probe login, roll back turns through _x.ai/rewind, and emit thread token usage. Made with Grok 4.6.
|
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 Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
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 |
Thread transfer impact
This comment will update automatically after the next completed run. |
exactOptionalPropertyTypes rejected passing string | undefined into the optional effort fields, which also leaked unknown into the adapter Effect error channel. Made with Grok 4.6.
Do not carry an old effort onto a new model. Count steered prompts when rewinding. Lock rollback against a replaced session. Keep one default effort in the composer menu. Made with Grok 4.6.
| if (advertised.includes(requested)) { | ||
| return requested; | ||
| } |
There was a problem hiding this comment.
🟡 Medium acp/GrokAcpSupport.ts:266
requestedGrokReasoningEffort discards every requested effort when advertised is empty, so the UI's selected value is not passed to either the initial --reasoning-effort spawn or session/set_model. The adapter intentionally calls this with [] before discovery, and fallback capabilities can also be shown without a session menu; accept the requested value when the advertisement is empty, while still validating it when choices are available.
| if (advertised.includes(requested)) { | |
| return requested; | |
| } | |
| if (advertised.length === 0 || advertised.includes(requested)) { | |
| return requested; | |
| } |
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file @apps/server/src/provider/acp/GrokAcpSupport.ts around lines 266-268:
`requestedGrokReasoningEffort` discards every requested effort when `advertised` is empty, so the UI's selected value is not passed to either the initial `--reasoning-effort` spawn or `session/set_model`. The adapter intentionally calls this with `[]` before discovery, and fallback capabilities can also be shown without a session menu; accept the requested value when the advertisement is empty, while still validating it when choices are available.
| const choices = [...unique.values()]; | ||
| const current = trimmedString(meta.reasoningEffort); | ||
| const defaultId = current ?? choices.find((choice) => choice.isDefault)?.id; | ||
| const supportsReasoningEffort = meta.supportsReasoningEffort === true || choices.length > 0; |
There was a problem hiding this comment.
🟡 Medium acp/GrokAcpSupport.ts:205
parseGrokAcpModelMeta reports supportsReasoningEffort: true when _meta.supportsReasoningEffort is true but reasoningEfforts is empty, so GrokProvider calls grokReasoningEffortCapabilities([]) and exposes no Reasoning selector instead of using FALLBACK_CAPABILITIES. Set this flag only when at least one effort choice was discovered so thin-discovery responses take the fallback path.
| const supportsReasoningEffort = meta.supportsReasoningEffort === true || choices.length > 0; | |
| const supportsReasoningEffort = choices.length > 0; |
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file @apps/server/src/provider/acp/GrokAcpSupport.ts around line 205:
`parseGrokAcpModelMeta` reports `supportsReasoningEffort: true` when `_meta.supportsReasoningEffort` is true but `reasoningEfforts` is empty, so `GrokProvider` calls `grokReasoningEffortCapabilities([])` and exposes no Reasoning selector instead of using `FALLBACK_CAPABILITIES`. Set this flag only when at least one effort choice was discovered so thin-discovery responses take the fallback path.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 39ed592. Configure here.
| if (!requested) { | ||
| return undefined; | ||
| } | ||
| if (advertised.includes(requested)) { |
There was a problem hiding this comment.
Spawn effort always dropped
Medium Severity
requestedGrokReasoningEffort now requires the value to appear in advertised, but startSession still calls it with an empty list before spawn. That makes requestedStartEffort always undefined, so --reasoning-effort is never passed to the Grok CLI. The same rule also drops composer effort whenever session menus are empty, even though the provider UI can still show fallback effort options.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit 39ed592. Configure here.
ApprovabilityVerdict: Needs human review 2 blocking correctness issues found. This PR introduces multiple new Grok provider capabilities (reasoning effort, rewind, usage tracking, auth detection) with significant new logic across several files. Additionally, there are unresolved Medium-severity findings identifying bugs in the effort propagation logic that prevent the selected reasoning effort from reaching the Grok CLI. You can customize Macroscope's approvability policy. Learn more. |


Grok Build already exposes reasoning effort, login state, rewind, and token usage. T3 ignored all of that. You could not pick effort, a logged-out CLI still looked ready, and model changes forced a new thread.
T3 now reads the live Grok effort menu from ACP model
_meta, sendssession/set_modelwith_meta.reasoningEffort, and lets you change model or effort on the current thread. ACP login failures show as unauthenticated. Conversation rollback uses_x.ai/rewind. Prompt usage is emitted asthread.token-usage.updated. There is a Grok user guide.Made with Grok 4.6.
Note
Medium Risk
Changes Grok session lifecycle (model/effort switching, rewind mutating provider and in-memory turns) and auth probing; scope is Grok-only but rollback and turn trimming affect conversation integrity if mis-targeted.
Overview
Wires Grok Build into capabilities the CLI already exposes but T3 previously ignored: reasoning effort, login state, conversation rewind, and per-prompt token usage.
Reasoning & models: Effort menus come from ACP model
_meta; the composer gets a Reasoning option (with fallbacks when discovery is thin). Selection is applied viasession/set_modelwith_meta.reasoningEffort, optional--reasoning-effortat spawn, and in-thread model/effort changes (requiresNewThreadForModelChangeis now false). Effort is not carried across a model switch unless explicitly requested.Runtime behavior: After each prompt, usage from Grok metadata is published as
thread.token-usage.updated.rollbackThreadcalls_x.ai/rewind/points/_x.ai/rewind/executeand trims local turn history. Provider status distinguishes unauthenticated Grok from other ACP failures and surfaces API-key vs session auth when discovery succeeds.Supporting changes:
setSessionModelaccepts optional_meta; the ACP mock agent simulates rewind, usage, and effort metadata for tests. User docs add providers-grok.md; default text model for Grok isgrok-build.Reviewed by Cursor Bugbot for commit 39ed592. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
Add Grok Build reasoning effort, auth detection, rewind, and token usage support
--reasoning-effortflag, model capabilities expose a Reasoning selector, andapplyGrokAcpModelSelectioncan switch effort without changing model.rollbackThreadfor Grok using the_x.ai/rewindACP extension: fetches rewind points, selects a target by turn count, executes the rewind, and trims in-memory turns._metaand publishesthread.token-usage.updatedevents after each turn.checkGrokProviderStatusnow distinguishes API key vs. session auth and surfacesunauthenticatedon ACP auth failures viaisGrokAcpAuthFailure.requiresNewThreadForModelChangetofalseand defaults the Grok provider model togrok-build.Macroscope summarized 39ed592.