Uh oh!
There was an error while loading. Please reload this page.
fix(grok): improve skills, plans, usage, and turn reliability - #8358
Conversation
Grok intercepts exit_plan_mode and reverse-RPCs the client for approval. Without a handler the turn hung and plan.md was invisible in T3. Capture plan.md writes and x.ai/exit_plan_mode into turn.proposed.completed, then abandon the native gate so the existing plan card can finish the flow.
Clear lastKnownProposedPlanMarkdown on new turns and settlement so an empty exit_plan_mode cannot re-surface a previous plan. Restrict plan.md detection to paths under .grok/sessions so workspace plan.md files are not promoted to proposed plans.
Scope proposed-plan dedupe to the current turn so re-proposing the same text later still emits a card. Use a fresh event stamp when promoting plan.md writes (avoid shared eventIds with tool lifecycle events). Only promote session plan.md while plan mode is active after enter_plan_mode.
Grok 4.6 often omits ACP allow_always. T3 still shows Always allow this session, then mapped a missing option to cancelled. Fall back to allow_once and remember the choice for the rest of the session. Fixes#6502
T3 only shows approval if Grok sends session/request_permission. A local [ui] permission_mode = always-approve made Supervised a no-op. Start Supervised sessions with grok --permission-mode default so the thread mode wins. Full access still passes --always-approve.
Grok's ACP CLI resends the ENTIRE accumulated terminal output on every tool_call_update notification (~10/sec, 145 KB+ each) instead of a delta, so a single redrawing terminal flooded runtime event ingestion and head-of-line-blocked every other thread. Bound tool call output to an 8 KB tail in the shared ACP parser (tool call state, rawOutput and the raw payload alike, leaving non-text content entries such as diffs untouched) and coalesce cumulative resends that did not grow meaningfully, while terminal (completed/failed) updates always emit immediately so the final tool call state stays correct.
Display-text extraction trims before joining, so oversized whitespace-only (or whitespace-padded) content entries skipped the 8 KB tail cap and were persisted/emitted unbounded on toolCall.data.content and rawPayload. Bound or normalize each text entry before those early returns, including the empty-chunks path.
Keep live command output flowing by coalescing content/rawOutput growth even when detail stays the command, and emit the first tool_call even when it has no detail. Distribute oversized text tails across the original entries so content around images/diffs keeps its order. Accept empty plan.md writes, require ~/.grok/sessions paths to live under the user home directory, and only set planModeActive after a successful enter_plan_mode (clear it on exit).
Signal the turn liveness watchdog after decrementing livenessUpdatesInFlight so a pause-consumed wake cannot leave it blocked forever. Emit pending-to-inProgress tool updates even when detail and output are unchanged, and index retained text tails by original entry instead of scanning.
isGrokPlanMarkdownPath now matches spawn HOME, GROK_HOME, the ACP mock home, and canonical /home|/Users layouts, while still rejecting repo-local .grok/sessions paths. Empty rawInput.content no longer hides a following plan.md diff: prefer non-empty markdown, and only cache empty when the write is actually a clear.
The canonical-home fallback ran against a lowercased haystack on Windows, so /Users/ never matched. Make that regex case-insensitive.
isGrokPlanMarkdownPath treated /home/other/.grok/sessions/../../project/plan.md as a session plan because the canonical fallback used unrestricted .+ . Reject .. segments before matching and require real path segments under sessions/.
Scan ~/.grok/sessions/**/updates.jsonl so Grok turns show up next to Claude and Codex. Contract v5 still merges v4 summaries.
isGrokPlanMarkdownPath and extractGrokPlanMarkdownFromToolCallData were reading process.platform and process.env directly, the only unsuppressed t3code/no-global-process-runtime hits in the tree. Take platform and environment as arguments; GrokAdapter resolves them from HostProcessPlatform and HostProcessEnvironment.
…ffort - docs(readme): remove Grok reliability fork banner from PR branch so upstream README no longer claims to be a fork of itself after merge (Cursor 585a2287) - fix(grok): do not treat omitted reasoningEffort as explicit clear in applyGrokAcpModelSelection (Cursor 8eb1e158) Session start and later turns send the selected model without a reasoning option until the user touches the control. Omitting the option now preserves the CLI-advertised default (e.g. Extra High) instead of calling session/set_model with no _meta and clearing it. GrokAdapter keeps currentReasoningEffort when the turn/start input does not provide reasoningEffort, so the composer snapshot stays consistent with the thread's actual effort.
Continue the Grok support work from #7638. Fix the shared parser typecheck and add focused approval, plan-path, and real-CLI tests. Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
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:
Comment |
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
) Completes the deferred half of #8358: Grok's plan-approval gate now works on the v2 runtime. The XAi extension regains main's exit-plan helpers (request schemas, plan-markdown extraction, the abandoned-with-feedback response, and the plan.md session-path sniffing), and the v2 ACP adapter grows a captureProposedPlan primitive that emits a completed proposed-plan artifact for the active turn — one plan id per turn, so plan.md rewrites and the exit gate update a single card. The Grok flavor wires both ends: tool calls that write plan.md under a Grok session dir surface the plan while plan mode is still active, and x.ai/exit_plan_mode (plus the underscore alias) captures the final plan — request content first, then the sniffed plan.md contents, then the empty-state placeholder — and abandons the native gate so the turn does not hang, mirroring the Claude ExitPlanMode pattern. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rtial) Ports the rate-limit half of main's #8358 into the branch's reworked XAi extension: a prompt_complete carrying stopReason rate_limit now fails the hung prompt with the -32003 usage-limit error instead of settling it as a normal end_turn, so the turn surfaces "usage limit reached" rather than silently ending. The prompt-completion deferreds carry the error channel end to end. The exit_plan_mode approval gate from #8358 is NOT ported here: it needs a v2 plan-flow design in AcpAdapterV2 (the v1 GrokAdapter it lived in is gone) and is tracked separately. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
) Completes the deferred half of #8358: Grok's plan-approval gate now works on the v2 runtime. The XAi extension regains main's exit-plan helpers (request schemas, plan-markdown extraction, the abandoned-with-feedback response, and the plan.md session-path sniffing), and the v2 ACP adapter grows a captureProposedPlan primitive that emits a completed proposed-plan artifact for the active turn — one plan id per turn, so plan.md rewrites and the exit gate update a single card. The Grok flavor wires both ends: tool calls that write plan.md under a Grok session dir surface the plan while plan mode is still active, and x.ai/exit_plan_mode (plus the underscore alias) captures the final plan — request content first, then the sniffed plan.md contents, then the empty-state placeholder — and abandons the native gate so the turn does not hang, mirroring the Claude ExitPlanMode pattern. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(grok): improve skills, plans, usage, and turn reliability (pingdotgg#8358) Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com> Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com> Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com> Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com> Co-authored-by: Guilherme Barros <gbarros1095@gmail.com> Co-authored-by: PC <pc@localhost> Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com> * fix(server): recover stale Codex approval callbacks (pingdotgg#5195) * test(server): remove duplicate missing worktree test (pingdotgg#8252) Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> * fix(server): replay all un-applied events during projection bootstrap (pingdotgg#7538) Co-authored-by: Theo Browne <me@t3.gg> * test: remove low-signal test files (pingdotgg#8397) Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com> * test: prune trivial error and layout tests (pingdotgg#8400) Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com> * Fix Android adaptive launcher icon (pingdotgg#4332) Co-authored-by: Yash Singh <saiansh2525@gmail.com> * feat(web): split provider settings into list and editor (pingdotgg#8380) * fix(codex): accept Codex 0.150 account plans (pingdotgg#8447) * fix(tooling): allow ignored-only staged changes (pingdotgg#8468) * fix(mobile): keep iOS home header stable (pingdotgg#8467) Co-authored-by: Julius Marminge <julius@mac.lan> * fix(web): stop showing red x summaries for ordinary tool failures (pingdotgg#8395) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> * fix(mobile): refine Git action toast glass styling (pingdotgg#8399) * fix(desktop): allow preview automation in agent-created threads (pingdotgg#8483) * test(web): remove redundant cache key test (pingdotgg#8484) Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> * fix(release): move nightly schedule to minute 38 Recent scheduled nightlies have been delayed or skipped. Move the nightly cron from minute 7 to minute 38. Keep the existing three-hour interval. This tests a different point in each three-hour window without claiming it will fix GitHub schedule delivery. Authored by GPT-5.6 Sol with the Codex harness. * fix(web): stabilize the provider settings editor (pingdotgg#8472) * fix(web): open GitHub pull requests in browser when loading fails (pingdotgg#8507) * fix(codex): show sub-agent models (pingdotgg#8502) * feat(analytics): report connected client platforms (pingdotgg#8481) * feat(server): accept PDF, ZIP, and other file uploads up to 50MB (pingdotgg#8235) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> * feat(web): toggle thread pin from the keyboard Add a mod+shift+p shortcut that pins or unpins the active thread. Ignore the shortcut during terminal focus and when the server does not support thread pinning. * fix(web): add back button to project settings (pingdotgg#8168) * refactor(mobile): compile semantic themes for Uniwind (pingdotgg#7327) Co-authored-by: codex <codex@users.noreply.github.com> * fix(desktop): Cache Runtime locally on WSL Filesystem, dramatically improving launch times (pingdotgg#5769) Co-authored-by: Claude Opus 5 <noreply@anthropic.com> Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com> * fix(mobile): show OpenCode model sources in picker (pingdotgg#8573) Co-authored-by: Julius Marminge <julius@mac.lan> * fix(clients): honor project default models in new threads (pingdotgg#6011) Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com> * fix(mobile): show file actions on Android (pingdotgg#8215) Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com> * fix(connect): explain DPoP connection failures (pingdotgg#8351) Co-authored-by: Julius Marminge <julius0216@outlook.com> * feat(web): make the sidebar project filter a searchable combobox (pingdotgg#5931) * fix(server): a draft can retry its first send after a failed bootstrap (pingdotgg#8226) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> * fix(desktop): stop hidden previews draining battery (pingdotgg#8567) * fix(desktop): oauth popups open from the browser preview (pingdotgg#8435) Co-authored-by: Julius Marminge <julius0216@outlook.com> * fix(web): keep long task drawers usable on small screens (pingdotgg#8313) * fix(opencode): handle child approvals, stops, and model catalogs (pingdotgg#8480) * fix: make thread auto-settling opt-in (pingdotgg#8321) * fix(web): stop session activity timing test from blocking releases (pingdotgg#8585) * fix(mobile): show composer menus when starting a task (pingdotgg#8587) Co-authored-by: Julius Marminge <julius@mac.lan> * fix(web): show the configured stash shortcut (pingdotgg#8437) Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com> * feat(web): add toggleable confirmation before unpinning a thread (pingdotgg#7313) Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com> * fix: restore automatic thread settling defaults (pingdotgg#8596) * fix(mobile): restore composer glass and rounded shadows (pingdotgg#8597) Co-authored-by: Julius Marminge <julius@mac.lan> * Remove Messages Glass Lab experiment (pingdotgg#8599) * chore(release): prepare v0.0.36 --------- Co-authored-by: Theo Browne <me@t3.gg> Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com> Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com> Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com> Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com> Co-authored-by: Guilherme Barros <gbarros1095@gmail.com> Co-authored-by: PC <pc@localhost> Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com> Co-authored-by: Josh <gitlucky@pipelab.org> Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> Co-authored-by: Tradi3 <56069280+krutftw@users.noreply.github.com> Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com> Co-authored-by: Ivan Malison <IvanMalison@gmail.com> Co-authored-by: Yash Singh <saiansh2525@gmail.com> Co-authored-by: Gianmarco <gianmarcosimone89@gmail.com> Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: Julius Marminge <julius@mac.lan> Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: Illia Panasenko <hello@ipanasenko.me> Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com> Co-authored-by: codex <codex@users.noreply.github.com> Co-authored-by: Matheson Steplock <ikifar2012@users.noreply.github.com> Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com> Co-authored-by: Anirudh Coontoor <anirudh@gosupernova.live> Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com> Co-authored-by: Nick Anisimov <n.anisimov.23@gmail.com> Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com> Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com> Co-authored-by: Bilal Bakr <62337003+Bil0000@users.noreply.github.com> Co-authored-by: Muhammad Waleed <114993336+walid-baharwal@users.noreply.github.com>
Range: a3a8cbd..f6f2be3, 9 commits, 64 files, +4793/-625. Shape: mostly one-sided. 13 files touched by both sides, 2 conflicts, both in the same subsystem (ProviderCommandReactor). Upstream's bulk is the Grok ACP work (pingdotgg#8358, ~1,700 lines across GrokAdapter/GrokProvider/GrokSkills/ AcpRuntimeModel/XAiAcpExtension), a usage contract widening for Grok (v4 -> v5), and 15 deleted low-signal test files (pingdotgg#8397, pingdotgg#8400, pingdotgg#8252). CONFLICTS AND RESOLUTIONS 1. apps/server/src/orchestration/Layers/ProviderCommandReactor.ts Upstream pingdotgg#5195 and the fork made the SAME fix independently, byte-identical: `detail.includes("unknown pending codex approval request")` plus lowercasing `Cause.pretty`. Only the fork's explanatory comment conflicted. Resolved to HEAD (comment kept); the shared code merged either way. 2. apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts A SPLICE, not a choice. Git paired upstream's retargeted test header with the fork's unrelated "continues as a new turn ... (user-input)" test header, over a shared `const harness = await createHarness(); const now = ...` preamble; the body below the markers is the fork's. Head and tail describe different subjects — the documented tell. Resolved to HEAD. Upstream did not add a test here: it RETARGETED its single "surfaces stale provider approval request failures" case from the permission phrasing to the Codex one. The fork had already turned that same test into an `it.each` over all three phrasings, INCLUDING upstream's exact new detail string. The fork's version is a strict superset, so nothing is owed. INVARIANTS (docs/fork/README.md) — all 12 re-probed against the merged tree 1 migrations 49 entries, ids unique + monotonic, max 50, 34 still burned 2 fork patch @effect/platform-node@4.0.0-beta.103 still pinned, 16 patches 3 sidebar Sidebar.tsx default, LegacySidebar behind useLegacySidebarEnabled 4 deletions ContextWindowMeter{.tsx,.test.tsx} absent; MessagesTimeline's three dropped helpers absent (3 hits are the FORK comments); ComposerPendingUserInputPanel has 0 Collapsible 4b send state 4 `isSendBlocked=` in ChatComposer.tsx 5 steer test absent (the single grep hit is the FORK comment marking it) 5b footer SidebarLocalModels + SidebarResourceQueue inside SidebarUtilityMenu 5c boot BootTurnReconciler.ts present; reconcileProviderSessions absent (FORK note at serverRuntimeStartup.ts:305) 6 projects 4 `/projects/$projectKey` call sites, dialog intact 7 stop ladder STOP_INTERRUPT_GRACE + INTERRUPT_REQUEST_GRACE both live, interruptTurn and stopSessionInternal still separate rungs 8 interrupt 4 `hasLiveSessionForThread` in ProviderCommandReactor.ts 9 entrypoint test still realpaths the temp root 10 meter logic ContextWindowMeter.logic.ts present; both rejected exports absent 11 markdown ChatMarkdown.tsx carries both environmentId and fileEnvironmentId Also verified by hand, since a clean automerge cannot: the fork's four edits to GrokAdapter.ts survived upstream's 597-line rewrite intact — the identity-guarded `sessions.delete`, the `!stopped` filter in `listSessions`, `refreshAccountUsage` and `withdrawQueuedTurn`. SWEEPS (union of both sides, 671 files, 13 two-sided) resurrected 0 fork-loss 0 both-kept 0 dropped 3 The 3 dropped are the deliberate rejection above: upstream's renamed `it(...)` header, its `detail:` line (the fork carries the same string as an `it.each` table row, so the text differs) and its `method: "item/requestApproval/decision"` fixture field, which nothing in the matcher reads. 18 files reported ABSENT from the result: 15 are upstream's own test deletions, 3 are the fork's deliberate ones (ContextWindowMeter.tsx, its test, and serverRuntimeStartup.reconcile.test.ts under invariant 5c). `--upstream-deleted` run as well: 364 lines / 52 files, every one upstream rewording or replacing its own text (0.0.34 -> 0.0.35 version bumps, usage v4 -> v5, the Grok expansions, doc rewrites). No fork reference to a removed thing. GATE pnpm install: lockfile unchanged by the merge. pnpm run verify (fmt:check -> typecheck -> lint -> test): EXIT=0 (read from the log, not the task notification). 14 test blocks, 10,201 passed, 10 skipped, 0 failed. Baseline at 5d4cd0b was 10,170, so +31. Arithmetic checked per file rather than by netting totals, because a netted total is exactly what hid four destroyed tests in a previous session. Test DECLARATIONS across all 2,526 fork test files: 18,268 -> 18,297 (+29), and every file that lost any is accounted for — upstream's 15 deletions plus GitVcsDriverCore.test.ts 76 -> 75, which is pingdotgg#8252 removing one duplicate. NO fork test file lost a declaration. The residual +2 between declarations and executed tests is `.each` expansion the declaration regex cannot see.
…rtial) Ports the rate-limit half of main's #8358 into the branch's reworked XAi extension: a prompt_complete carrying stopReason rate_limit now fails the hung prompt with the -32003 usage-limit error instead of settling it as a normal end_turn, so the turn surfaces "usage limit reached" rather than silently ending. The prompt-completion deferreds carry the error channel end to end. The exit_plan_mode approval gate from #8358 is NOT ported here: it needs a v2 plan-flow design in AcpAdapterV2 (the v1 GrokAdapter it lived in is gone) and is tracked separately. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
) Completes the deferred half of #8358: Grok's plan-approval gate now works on the v2 runtime. The XAi extension regains main's exit-plan helpers (request schemas, plan-markdown extraction, the abandoned-with-feedback response, and the plan.md session-path sniffing), and the v2 ACP adapter grows a captureProposedPlan primitive that emits a completed proposed-plan artifact for the active turn — one plan id per turn, so plan.md rewrites and the exit gate update a single card. The Grok flavor wires both ends: tool calls that write plan.md under a Grok session dir surface the plan while plan mode is still active, and x.ai/exit_plan_mode (plus the underscore alias) captures the final plan — request content first, then the sniffed plan.md contents, then the empty-state placeholder — and abandons the native gate so the turn does not hang, mirroring the Claude ExitPlanMode pattern. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rtial) Ports the rate-limit half of main's #8358 into the branch's reworked XAi extension: a prompt_complete carrying stopReason rate_limit now fails the hung prompt with the -32003 usage-limit error instead of settling it as a normal end_turn, so the turn surfaces "usage limit reached" rather than silently ending. The prompt-completion deferreds carry the error channel end to end. The exit_plan_mode approval gate from #8358 is NOT ported here: it needs a v2 plan-flow design in AcpAdapterV2 (the v1 GrokAdapter it lived in is gone) and is tracked separately. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
) Completes the deferred half of #8358: Grok's plan-approval gate now works on the v2 runtime. The XAi extension regains main's exit-plan helpers (request schemas, plan-markdown extraction, the abandoned-with-feedback response, and the plan.md session-path sniffing), and the v2 ACP adapter grows a captureProposedPlan primitive that emits a completed proposed-plan artifact for the active turn — one plan id per turn, so plan.md rewrites and the exit gate update a single card. The Grok flavor wires both ends: tool calls that write plan.md under a Grok session dir surface the plan while plan mode is still active, and x.ai/exit_plan_mode (plus the underscore alias) captures the final plan — request content first, then the sniffed plan.md contents, then the empty-state placeholder — and abandons the native gate so the turn does not hang, mirroring the Claude ExitPlanMode pattern. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Upstream `ead4ce52a` (pingdotgg#8358) taught the usage scan to read Grok Build transcripts, adding `grok` to `UsageProviderKind` and bumping the usage contract to 5. That collides with entries 16 and 19 in three fixtures, which the merge could not have seen: `usageTranscriptSources.test.ts` asserted the exact source list, and Grok now always contributes one more. Grok exposes no per-instance home, so its directory is `$GROK_HOME` or the real `~/.grok` — the tests now pin `GROK_HOME` into their temp directory through `HostProcessEnvironment` rather than letting an assertion depend on the machine running it. `UsagePage.test.tsx` mocks `PROVIDER_PRESENTATION` but not `PROVIDER_ORDER`, so the empty-report path stood a row in for a provider the mock did not describe and crashed on `.mark`. The mock now covers every `UsageProviderKind`. `usageMerge.test.ts` asserted that `USAGE_CONTRACT_VERSION - 1` still merges. That holds only while a bump is additive, and entry 19's instance-keyed buckets are not: a v5 payload has nothing to attribute, so `USAGE_MERGE_COMPATIBLE_SINCE` moved up with the version. The test now reads the floor from the constant that defines it and gains a companion asserting the version below it is excluded, so neither case depends on the two constants happening to differ. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SzCcc9XJPsJL14c2sxa7sM
Rewrites FORK.md around the four sections it is meant to carry — purpose, last rebase, the numbered changes with their intent, and what upstream has since superseded — and trims the per-entry prose to the decisions a re-derivation would otherwise get wrong. Entry numbers are unchanged; nothing was superseded in this range, so section 4 only moves its "verified at" column. Records what actually needed re-deriving: upstream pingdotgg#8380's provider settings rewrite (entry 15), pingdotgg#8358's Grok usage support (entries 16 and 19, including why the usage contract went to 6 and took `USAGE_MERGE_COMPATIBLE_SINCE` with it), pingdotgg#8144's compaction control sharing entry 22's popover, and the decision to decline `desktop-macos-preview.yml` under entry 14's opt-in rule. Refreshes the README banner's rebase marker and its summary, which had not caught up with entries 21 and 22, and fixes the ci.md line naming the wrong job as the source of the thread-transfer artifact — it is Test Server, the sharded job entry 14 warns against renaming. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SzCcc9XJPsJL14c2sxa7sM
Intent: Finish the Grok 4.6 integration where v0.0.36 still leaves composer slash skills and ACP session-mode metadata disconnected. Behavior: - Publish Grok's user-invocable inspect skills in both the `$` skill catalog and the `/` slash-command catalog; omit disabled bundled helpers from slash commands. - Send `_meta.autoMode: true` on Grok session/new and session/load in T3 Auto mode. - Send `_meta.yoloMode: true` on Grok session/new and session/load in Full access mode. - Leave Supervised, Auto-accept edits, provider probes, and text generation without session metadata; their existing argv behavior is unchanged. Design constraints: - Keep Grok-specific dialect choices at the provider boundary and reuse generic provider catalogs. - Keep session setup metadata optional in the generic ACP runtime so other ACP providers are unchanged. - Do not map T3 Auto to yolo; Full access alone carries yoloMode. Integration: - Grok inspect skill mapping and provider snapshot. - Generic ACP session/new and session/load payload construction. - Grok ACP runtime-mode mapping and focused tests. Verification: - Focused Grok skills, ACP-support, and provider tests pass (36 tests). - The attempted process-level ACP test was removed after the mock-agent case hung without output; the production payload path remains typechecked and the mode/catalog transforms have direct unit coverage. Rebase notes: - Upstream v0.0.36 pingdotgg#8358 fully superseded the former patch's plan capture/fallback, reasoning picker and effort-only model mutation, `$` skill discovery, runtime-mode argv mapping, Always allow fallback, and related docs/tests. Those implementations were dropped in favor of upstream's broader reliability work. - Retain only slash catalog publication and Auto/Full-access session setup metadata unless upstream begins forwarding both.
Upstream `ead4ce52a` (pingdotgg#8358) taught the usage scan to read Grok Build transcripts, adding `grok` to `UsageProviderKind` and bumping the usage contract to 5. That collides with entries 16 and 19 in three fixtures, which the merge could not have seen: `usageTranscriptSources.test.ts` asserted the exact source list, and Grok now always contributes one more. Grok exposes no per-instance home, so its directory is `$GROK_HOME` or the real `~/.grok` — the tests now pin `GROK_HOME` into their temp directory through `HostProcessEnvironment` rather than letting an assertion depend on the machine running it. `UsagePage.test.tsx` mocks `PROVIDER_PRESENTATION` but not `PROVIDER_ORDER`, so the empty-report path stood a row in for a provider the mock did not describe and crashed on `.mark`. The mock now covers every `UsageProviderKind`. `usageMerge.test.ts` asserted that `USAGE_CONTRACT_VERSION - 1` still merges. That holds only while a bump is additive, and entry 19's instance-keyed buckets are not: a v5 payload has nothing to attribute, so `USAGE_MERGE_COMPATIBLE_SINCE` moved up with the version. The test now reads the floor from the constant that defines it and gains a companion asserting the version below it is excluded, so neither case depends on the two constants happening to differ. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SzCcc9XJPsJL14c2sxa7sM
Rewrites FORK.md around the four sections it is meant to carry — purpose, last rebase, the numbered changes with their intent, and what upstream has since superseded — and trims the per-entry prose to the decisions a re-derivation would otherwise get wrong. Entry numbers are unchanged; nothing was superseded in this range, so section 4 only moves its "verified at" column. Records what actually needed re-deriving: upstream pingdotgg#8380's provider settings rewrite (entry 15), pingdotgg#8358's Grok usage support (entries 16 and 19, including why the usage contract went to 6 and took `USAGE_MERGE_COMPATIBLE_SINCE` with it), pingdotgg#8144's compaction control sharing entry 22's popover, and the decision to decline `desktop-macos-preview.yml` under entry 14's opt-in rule. Refreshes the README banner's rebase marker and its summary, which had not caught up with entries 21 and 22, and fixes the ci.md line naming the wrong job as the source of the thread-transfer artifact — it is Test Server, the sharded job entry 14 warns against renaming. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SzCcc9XJPsJL14c2sxa7sM
Conflict resolutions: - Grok skills: adopt upstream's independently-built GrokSkills probe and provider wiring wholesale (pingdotgg#8358); drop the fork's variant (recoverable from history). Keep the fork's dollar-to-slash skill rewrite in GrokAdapter's send path and fix GrokDriver's discoverGrokSkills call to upstream's (settings, env, cwd) argument order. - Files surface: keep the lazy explorer; upstream's expand/collapse-all control (pingdotgg#8889) now toggles the root's direct child directories in lazy mode (one bounded fetch per dir) via a new rootDirectoryPaths on useLazyFileTree. Mutation-driven refresh (pingdotgg#8803) is disabled in lazy mode where the filesystem watcher already converges the tree. - Mobile: adopt the Uniwind theme refactor (tintColorClassName replaces the iconColor prop); keep the lazy showChildCount gate. Port the fork's per-project contextual skills from ThreadComposer into upstream's new useComposerCommandMenu hook behind a mockable state/use-provider-context-skills wrapper. - http: keep fork cache-control headers alongside upstream's video byte ranges and upload routes. - ChatComposer stash key: upstream's image/file id scheme with the fork's escaped u0000 separators (upstream's line has raw NUL bytes in source). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Grok skill discovery is retired (upstream shipped the same design in their pingdotgg#8358), with the dropped niceties and recovery commits noted. The lazy explorer section documents the adapted expand/collapse-all control and the disabled mutation-driven refresh, workspace-aware skills point at the new mobile composer-menu hook, and the sync status advances to c78ae50 with a new pre-sync backup branch. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rtial) Ports the rate-limit half of main's #8358 into the branch's reworked XAi extension: a prompt_complete carrying stopReason rate_limit now fails the hung prompt with the -32003 usage-limit error instead of settling it as a normal end_turn, so the turn surfaces "usage limit reached" rather than silently ending. The prompt-completion deferreds carry the error channel end to end. The exit_plan_mode approval gate from #8358 is NOT ported here: it needs a v2 plan-flow design in AcpAdapterV2 (the v1 GrokAdapter it lived in is gone) and is tracked separately. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
) Completes the deferred half of #8358: Grok's plan-approval gate now works on the v2 runtime. The XAi extension regains main's exit-plan helpers (request schemas, plan-markdown extraction, the abandoned-with-feedback response, and the plan.md session-path sniffing), and the v2 ACP adapter grows a captureProposedPlan primitive that emits a completed proposed-plan artifact for the active turn — one plan id per turn, so plan.md rewrites and the exit gate update a single card. The Grok flavor wires both ends: tool calls that write plan.md under a Grok session dir surface the plan while plan mode is still active, and x.ai/exit_plan_mode (plus the underscore alias) captures the final plan — request content first, then the sniffed plan.md contents, then the empty-state placeholder — and abandons the native gate so the turn does not hang, mirroring the Claude ExitPlanMode pattern. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rtial) Ports the rate-limit half of main's #8358 into the branch's reworked XAi extension: a prompt_complete carrying stopReason rate_limit now fails the hung prompt with the -32003 usage-limit error instead of settling it as a normal end_turn, so the turn surfaces "usage limit reached" rather than silently ending. The prompt-completion deferreds carry the error channel end to end. The exit_plan_mode approval gate from #8358 is NOT ported here: it needs a v2 plan-flow design in AcpAdapterV2 (the v1 GrokAdapter it lived in is gone) and is tracked separately. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
) Completes the deferred half of #8358: Grok's plan-approval gate now works on the v2 runtime. The XAi extension regains main's exit-plan helpers (request schemas, plan-markdown extraction, the abandoned-with-feedback response, and the plan.md session-path sniffing), and the v2 ACP adapter grows a captureProposedPlan primitive that emits a completed proposed-plan artifact for the active turn — one plan id per turn, so plan.md rewrites and the exit gate update a single card. The Grok flavor wires both ends: tool calls that write plan.md under a Grok session dir surface the plan while plan mode is still active, and x.ai/exit_plan_mode (plus the underscore alias) captures the final plan — request content first, then the sniffed plan.md contents, then the empty-state placeholder — and abandons the native gate so the turn does not hang, mirroring the Claude ExitPlanMode pattern. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(analytics): threads and turns now know which client started them (pingdotgg#7774) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> * fix(web): stop marking mixed tool runs as failed (pingdotgg#7893) * fix(web): command-click spaced folder links (pingdotgg#6439) Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com> * fix(chat): stop pushing follow-up messages to the top (pingdotgg#7897) * test(desktop): remove redundant release note assertion (pingdotgg#7873) Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> * fix(web): handle wide ordered-list marker edge cases (pingdotgg#7856) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> * fix(ssh): restore user PATH for remote servers (pingdotgg#7213) * fix(desktop): keep tailscale spawn defects from breaking advertised endpoints (pingdotgg#7116) * fix(web): keep Codex service tier labels readable (pingdotgg#4503) * fix: render workspace images in chat markdown (pingdotgg#6433) * fix(clients): keep opening responses visible after turns settle (pingdotgg#7723) * feat(web): add appearance contrast control (pingdotgg#7906) Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com> * fix(server): stop completed Codex threads from staying stuck on working (pingdotgg#7937) * fix(mobile): preserve markdown image dimensions (pingdotgg#7940) * fix(web): remove duplicate provider update progress (pingdotgg#7761) * fix(server): fall back to the remote default branch instead of assuming main (pingdotgg#7078) * fix(web): give sidebar project menu rows the same side padding as other menus (pingdotgg#7913) * fix(clients): reconnect after credentials fail during remote server updates (pingdotgg#7953) * feat(codex): submit thread feedback to OpenAI (pingdotgg#7949) * fix(server): stop kills lingering Claude work (pingdotgg#5891) * fix(ci): let Macroscope approve pull requests again (pingdotgg#7970) * fix(clients): move settled pinned threads into the settled section (pingdotgg#7969) * perf(ci): speed up release builds and Windows packaging (pingdotgg#7975) * fix(web): stop tool calls from leaving a blank page in threads (pingdotgg#7971) * fix(web): stop recovered tool failures from marking work logs red (pingdotgg#7999) * fix(mobile): isolate markdown image requests (pingdotgg#7942) * feat(web): redesign skills in `$` menu and in `/` menu (pingdotgg#8009) * fix(web): restore right panel toggle clicks after closing on desktop (pingdotgg#8016) * fix(web): keep server update banners flush with the composer (pingdotgg#8000) * perf(web): reuse work log rows during streaming (pingdotgg#8006) * fix(web): keep provider badge legible in dark themes (pingdotgg#7968) Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com> * fix(web): treat configured urls with uppercase schemes as secure (pingdotgg#8005) Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com> * fix(desktop): keep release notes visible while downloading (pingdotgg#6412) * fix(web): show only providers with usage in usage views (pingdotgg#7563) * fix(web): prevent expanded tool calls from hiding thread content (pingdotgg#8052) * test(server): remove no-op live activity tests (pingdotgg#8056) Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> * fix(web): clarify terminal sidebar grouping (pingdotgg#7967) * fix(codex): show app access approval prompts (pingdotgg#8058) * feat(web): upload image attachments before sending (pingdotgg#8048) * fix(server): bound OpenCode skill discovery output (pingdotgg#7675) Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com> * fix(mobile): persist thread shelf collapse state (pingdotgg#5152) * fix(mobile): restore Android tablet thread controls, clean up header (pingdotgg#5385) * fix(mobile): land the first thread open above the composer on Android (pingdotgg#5585) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: codex <codex@users.noreply.github.com> Co-authored-by: Julius Marminge <julius0216@outlook.com> * fix(server): check out submodules in a new worktree (pingdotgg#7674) Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr> * fix(server): preserve merged PR badges after branch deletion (pingdotgg#6216) * fix(server): return fresh live pull request reads (pingdotgg#6472) * fix(web): compare client and server versions as semver, not strings (pingdotgg#7579) * fix(web): stop follow-ups from leaving giant blank space (pingdotgg#8068) * fix(marketing): stop automatic Vercel deployments on pull requests (pingdotgg#8070) * chore: vouch repeat contributors (pingdotgg#8071) * fix(server): keep the authoritative subagent model when snapshots race task_started (pingdotgg#7583) * fix(server): honor auto-accept edits for the OpenCode provider (pingdotgg#7100) * fix(server): run the CLI on Node versions without import.meta.main (pingdotgg#7141) * fix(server): recover from provider interrupt failures (pingdotgg#7412) * fix(server): recreate a thread's worktree before starting a turn (pingdotgg#7839) * fix(server): thread delete no longer fails on already-removed worktrees (pingdotgg#8076) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> * fix(web): stop update notices showing through the composer (pingdotgg#8083) * fix(web): detect outdated nightly servers (pingdotgg#8124) * fix(web): align usage page skeleton layout (pingdotgg#8111) * fix(web): make terminal links appear clickable only when clickable (pingdotgg#7488) * fix(web): make Windows file links clickable in chat (pingdotgg#8081) * fix(web): sort usage models by token count (pingdotgg#8108) * fix: open agent file links in the file viewer (pingdotgg#8098) * fix(server): stop routine events from rescanning thread history (pingdotgg#8150) * fix(deps): stop pnpm installs from changing the lockfile (pingdotgg#8163) * feat(web): settle and restore threads with a keyboard shortcut (pingdotgg#8089) * perf(desktop): cut macOS signing calls by 81% (pingdotgg#8093) * feat: link pull requests to threads (pingdotgg#8160) * feat(web): safely attach HEIC photos as JPEG images (pingdotgg#8161) Co-authored-by: mweinbach <maxweinbach5@gmail.com> * feat(mobile): track device models and OS versions (pingdotgg#8169) * fix(grok): bound cumulative tool output updates (pingdotgg#7279) * fix(web): delay thread shortcut hints by 200 ms (pingdotgg#8172) * fix(server): stop probing Cursor until enabled (pingdotgg#8175) * docs(release): verify remote updates with database migrations (pingdotgg#8177) * fix(server): keep provider CLIs available in the macOS service (pingdotgg#8173) * feat(claude): compact old threads before they burn through usage (pingdotgg#8144) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> * fix(client-runtime): retry queries after connection interruption (pingdotgg#8117) * fix(server): keep previously used providers working after upgrades (pingdotgg#8176) * feat(desktop): build macOS previews from a PR label (pingdotgg#8182) * fix(web): thread jump hints no longer stick after a dictation paste (pingdotgg#8189) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> * fix(web): keep grouped project renames (pingdotgg#7831) * feat(web): reveal chat file chips in the system file manager (pingdotgg#7140) Co-authored-by: Dara Adedeji <daraaded@amazon.com> Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com> * fix(server): push no longer writes a feature branch's commits to its base branch (pingdotgg#8228) * chore(deps): bump @clerk/electron to 0.0.37 (pingdotgg#8240) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> * feat(server): fetch legacy model classification from a hosted manifest (pingdotgg#8227) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> * chore(release): prepare v0.0.34 * fix(desktop): let Clerk UI receive stable auth fixes (pingdotgg#8248) * fix(app): un-settled threads return to the top of the list (pingdotgg#8231) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> * perf(ci): cut about a minute from every release (pingdotgg#8250) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> * feat(ci): download macOS preview DMGs without signing in (pingdotgg#8243) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> * fix(codex): accept Codex 0.150 multi-agent events (pingdotgg#8346) * chore(release): prepare v0.0.35 * fix(grok): improve skills, plans, usage, and turn reliability (pingdotgg#8358) Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com> Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com> Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com> Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com> Co-authored-by: Guilherme Barros <gbarros1095@gmail.com> Co-authored-by: PC <pc@localhost> Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com> * fix(server): recover stale Codex approval callbacks (pingdotgg#5195) * test(server): remove duplicate missing worktree test (pingdotgg#8252) Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> * fix(server): replay all un-applied events during projection bootstrap (pingdotgg#7538) Co-authored-by: Theo Browne <me@t3.gg> * test: remove low-signal test files (pingdotgg#8397) Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com> * test: prune trivial error and layout tests (pingdotgg#8400) Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com> * Fix Android adaptive launcher icon (pingdotgg#4332) Co-authored-by: Yash Singh <saiansh2525@gmail.com> * feat(web): split provider settings into list and editor (pingdotgg#8380) * fix(codex): accept Codex 0.150 account plans (pingdotgg#8447) * fix(tooling): allow ignored-only staged changes (pingdotgg#8468) * fix(mobile): keep iOS home header stable (pingdotgg#8467) Co-authored-by: Julius Marminge <julius@mac.lan> * fix(web): stop showing red x summaries for ordinary tool failures (pingdotgg#8395) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> * fix(mobile): refine Git action toast glass styling (pingdotgg#8399) * fix(desktop): allow preview automation in agent-created threads (pingdotgg#8483) * test(web): remove redundant cache key test (pingdotgg#8484) Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> * fix(release): move nightly schedule to minute 38 Recent scheduled nightlies have been delayed or skipped. Move the nightly cron from minute 7 to minute 38. Keep the existing three-hour interval. This tests a different point in each three-hour window without claiming it will fix GitHub schedule delivery. Authored by GPT-5.6 Sol with the Codex harness. * fix(web): stabilize the provider settings editor (pingdotgg#8472) * fix(web): open GitHub pull requests in browser when loading fails (pingdotgg#8507) * fix(codex): show sub-agent models (pingdotgg#8502) * feat(analytics): report connected client platforms (pingdotgg#8481) * feat(server): accept PDF, ZIP, and other file uploads up to 50MB (pingdotgg#8235) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> * feat(web): toggle thread pin from the keyboard Add a mod+shift+p shortcut that pins or unpins the active thread. Ignore the shortcut during terminal focus and when the server does not support thread pinning. * fix(web): add back button to project settings (pingdotgg#8168) * refactor(mobile): compile semantic themes for Uniwind (pingdotgg#7327) Co-authored-by: codex <codex@users.noreply.github.com> * fix(desktop): Cache Runtime locally on WSL Filesystem, dramatically improving launch times (pingdotgg#5769) Co-authored-by: Claude Opus 5 <noreply@anthropic.com> Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com> * fix(mobile): show OpenCode model sources in picker (pingdotgg#8573) Co-authored-by: Julius Marminge <julius@mac.lan> * fix(clients): honor project default models in new threads (pingdotgg#6011) Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com> * fix(mobile): show file actions on Android (pingdotgg#8215) Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com> * fix(connect): explain DPoP connection failures (pingdotgg#8351) Co-authored-by: Julius Marminge <julius0216@outlook.com> * feat(web): make the sidebar project filter a searchable combobox (pingdotgg#5931) * fix(server): a draft can retry its first send after a failed bootstrap (pingdotgg#8226) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> * fix(desktop): stop hidden previews draining battery (pingdotgg#8567) * fix(desktop): oauth popups open from the browser preview (pingdotgg#8435) Co-authored-by: Julius Marminge <julius0216@outlook.com> * fix(web): keep long task drawers usable on small screens (pingdotgg#8313) * fix(opencode): handle child approvals, stops, and model catalogs (pingdotgg#8480) * fix: make thread auto-settling opt-in (pingdotgg#8321) * fix(web): stop session activity timing test from blocking releases (pingdotgg#8585) * fix(mobile): show composer menus when starting a task (pingdotgg#8587) Co-authored-by: Julius Marminge <julius@mac.lan> * fix(web): show the configured stash shortcut (pingdotgg#8437) Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com> * feat(web): add toggleable confirmation before unpinning a thread (pingdotgg#7313) Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com> * fix: restore automatic thread settling defaults (pingdotgg#8596) * fix(mobile): restore composer glass and rounded shadows (pingdotgg#8597) Co-authored-by: Julius Marminge <julius@mac.lan> * Remove Messages Glass Lab experiment (pingdotgg#8599) * chore(release): prepare v0.0.36 * Require human review for pull requests changing product defaults (pingdotgg#8603) * fix(codex): avoid quadratic app-server input buffering (pingdotgg#8605) * fix(mobile): stabilize iOS header item transitions (pingdotgg#8607) Co-authored-by: Julius Marminge <julius@mac.lan> * chore(mobile): upgrade to Expo SDK 57 (pingdotgg#8609) Co-authored-by: Julius Marminge <julius@mac.lan> * fix(mobile): harden native header toolbar items (pingdotgg#8611) Co-authored-by: Julius Marminge <julius@mac.lan> * fix(server): stop querying Claude context usage after turns (pingdotgg#8610) * chore: vouch ryanrhughes (pingdotgg#8613) * feat(web): attach PDFs, ZIPs, and other files to a turn (pingdotgg#8236) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> * fix(web): pass stashShortcutLabel in the mixed-attachments stash test PRs pingdotgg#8437 and pingdotgg#8236 crossed: one made stashShortcutLabel a required ComposerStashMenu prop, the other added a test case without it, so main fails web typecheck. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(web): keybinding settings as settings rows (pingdotgg#8532) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: Julius Marminge <julius0216@outlook.com> * feat: let an environment publish themes as a file (pingdotgg#8569) Co-authored-by: Theo Browne <me@t3.gg> * fix(web): clean up provider settings list and editor (pingdotgg#8504) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: Julius Marminge <julius0216@outlook.com> * fix(web): keep project picker popup inside the sidebar (pingdotgg#8627) * fix(mobile): prevent header overflow and back-button artifacts (pingdotgg#8624) * fix(server): retry automatic thread title generation (pingdotgg#8087) * fix(client-runtime): refresh edited pull request comments (pingdotgg#8094) * fix(web): four composer spacing defects (pingdotgg#8090) * perf(desktop): skip duplicate browser updates (pingdotgg#8018) Co-authored-by: Julius Marminge <julius0216@outlook.com> * fix(web): render nested markdown images correctly (pingdotgg#8501) * fix(web): unify activity logs and composer banners (pingdotgg#8693) * fix(mobile): reduce dev-client reload and Metro startup cost (pingdotgg#8694) Co-authored-by: Julius Marminge <julius@mac.lan> * revert(web): restore previous composer banners (pingdotgg#8733) * test(web): remove tests for unreachable helpers (pingdotgg#8738) Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> * feat(mobile): update tool summaries and chat transitions (pingdotgg#8793) * feat(web): play video attachments in chat (pingdotgg#8688) * fix(web,mobile): snooze menu no longer offers the same wake time twice (pingdotgg#8741) * fix(grok): allow model changes in existing threads (pingdotgg#8392) Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com> * feat(mobile): pick, share, and receive files in threads (pingdotgg#8237) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: Julius Marminge <julius0216@outlook.com> * fix(web): reduce title bar scroll fade height (pingdotgg#8799) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * fix(windows): strip quotes from repaired PATH (pingdotgg#8746) * fix(web): open agent images in expanded preview (pingdotgg#8807) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * fix(git): follow repository instructions in generated source control text (pingdotgg#8804) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * fix(server): stop overpricing cached Claude tokens (pingdotgg#8806) * fix(web): keep image preview above sidebar control (pingdotgg#8811) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * fix(web): keep right panel synced with agent edits (pingdotgg#8803) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * fix(web,mobile): render Codex citations and artifact templates (pingdotgg#8584) * chore: add Windows setup script to t3.json (pingdotgg#8814) * fix(web): fold interim turn responses (pingdotgg#8828) * fix(web): use circle alert for failed tool calls (pingdotgg#8840) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * feat(mobile): add offline iPhone voice input (pingdotgg#8614) Co-authored-by: Julius Marminge <julius@mac.lan> * fix(web): prevent pull request metadata overlap (pingdotgg#8790) * chore(release): prepare v0.0.37 * Add mobile composer attachment menu with video support (pingdotgg#8843) * fix(mobile): map native menu icon colors explicitly * fix(web): restore unified activity logs and composer banners (pingdotgg#8734) Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: Julius Marminge <jmarminge@gmail.com> * fix(web): address composer banner review follow-ups (pingdotgg#8850) * fix(web): widen sync banners and simplify the working timer (pingdotgg#8855) * fix(preview): improve browser recording quality (pingdotgg#8839) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * fix(web): mark pull request links as external (pingdotgg#8856) * fix(mobile): replace Callstack glass with Expo glass (pingdotgg#8862) * fix(server): skip IDE detection in Claude probes (pingdotgg#8634) * chore(macroscope): review diagnostic overrides (pingdotgg#8917) Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com> * fix(contracts): accept CLI event origins (pingdotgg#8905) * fix(web): hide invalid slash skill completions (pingdotgg#8904) * fix(mobile): defer draft navigation until submission completes (pingdotgg#8914) * chore: disable CodeRabbit review status (pingdotgg#8933) * Delete app.json (pingdotgg#8934) * fix(web): show scrollbar for wide markdown tables (pingdotgg#8868) * fix(mobile): shimmer active tool rows (pingdotgg#8932) Co-authored-by: Julius Marminge <julius@mac.lan> * chore(deps): bump Electron to 43.4.1 (pingdotgg#8626) * fix(chat): smooth worktree setup status (pingdotgg#8922) * feat(mobile): add video playback with native iOS controls (pingdotgg#8919) Co-authored-by: Julius Marminge <julius@mac.lan> * fix(web): prevent chat metadata overlap (pingdotgg#8851) * fix(server): preserve usage cache outside walked roots (pingdotgg#8540) Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com> * feat(mobile): add native image and PDF previews (pingdotgg#8959) Co-authored-by: Julius Marminge <julius@mac.lan> * fix(server): allow long thread IDs in HTTP routes (pingdotgg#8898) * fix(shared): preserve Windows shell PATH priority (pingdotgg#8748) * fix(web): make WSL settings searchable (pingdotgg#8881) * feat(web): add expand/collapse all control to the files surface (pingdotgg#8889) * Add auto_review configuration to coderabbit.yaml * style: format CodeRabbit configuration * feat(mobile): upload attachments while composing (pingdotgg#8978) Co-authored-by: Julius Marminge <julius@mac.lan> * fix(chat): keep agent activity visible between actions (pingdotgg#8984) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * fix(server): isolate remote web session cookies (pingdotgg#8085) Co-authored-by: Julius Marminge <julius0216@outlook.com> * feat(pull-requests): link GitHub references in markdown (pingdotgg#8812) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * perf(server): reduce frequency of full tool call output being loaded into memory from db (pingdotgg#8988) * feat(web): add pull request list filters (pingdotgg#8809) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * feat(web): search individual settings by detail (pingdotgg#8831) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * feat(client): render viewed images in work logs (pingdotgg#8936) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * fix(client): use package import for markdown image helpers (pingdotgg#9010) * test: remove static presentation snapshots (pingdotgg#9008) Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> * perf(server): bound snapshot activity payload memory (pingdotgg#9000) * perf(server): cut idle CPU use and stop provider event leaks (pingdotgg#8187) * perf(server): scan only appended transcript bytes for usage summaries (pingdotgg#9024) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: Theo Browne <me@t3.gg> * perf(server): cut chatty tool-update frames by 90% (pingdotgg#8368) * fix(server): settle threads server-side (pingdotgg#8600) * fix(clients): dedupe skills in composer menus (pingdotgg#8043) * fix(server): stop OpenCode child sessions (pingdotgg#9005) * perf(web): defer pull request line stats until visible (pingdotgg#6471) Co-authored-by: Theo Browne <me@t3.gg> * perf(server): skip full-message reads while streaming (pingdotgg#9032) * perf(client-runtime): halve server config bootstrap traffic (pingdotgg#8367) Reuse one server config subscription for session bootstrap and live updates. Preserve environment theme opt-in, replay, deletion, slow subscriber recovery, and config stream failure handling. Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com> * fix(web): align un-settle banner action (pingdotgg#9033) * fix(web): block type-to-focus behind open dialogs (pingdotgg#8139) Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com> * feat(shortcuts): copy active thread reference (pingdotgg#8994) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * fix(mobile): keep thread scroll bounds current after animations (pingdotgg#9013) Co-authored-by: Julius Marminge <julius@mac.lan> * fix(server): cache project favicon resolution (pingdotgg#9080) Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> * feat(claude): add Claude Fable 5.1 model (pingdotgg#9078) * fix(preview): restore recording and macOS rendering after Electron 43 (pingdotgg#9001) Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com> * feat(desktop): add configurable quit shortcut confirmation (pingdotgg#9076) * feat(web): open project settings from thread menus (pingdotgg#8925) * fix(chat): reuse one row for live activity (pingdotgg#9062) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * feat(models): discover Claude models from remote manifest (pingdotgg#9084) * Revert "fix(chat): reuse one row for live activity" (pingdotgg#9096) * fix(web): sync sidebar PR state from open panel (pingdotgg#9092) Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com> * fix(web): changing projects no longer creates a draft (pingdotgg#9097) * fix(web): keep theme placeholder text dimmer than entered text (pingdotgg#9104) * fix(web): keep the selected environment when changing projects (pingdotgg#9102) * docs(plans): t3o-31 upstream sync to v0.0.38 * fix(board): clear the ten pre-existing typecheck errors before the upstream sync (t3o-31 P0) Two test fakes failed with a bare Error in the Effect failure channel, a closure-assigned let narrowed to never, and a single-override pill read overriddenRows[0] under noUncheckedIndexedAccess. None changed behaviour; they were masked because the recursive typecheck never reached apps/server. * fix(sync): the three type errors and two test failures the v0.0.38 merge caused - BoardModelRow reads planModeEnabled from client settings, as the composer does. - findBranchPullRequest resolves the default branch for upstream's widened PR cache key instead of passing null. - The orphaned-session integration test mocks the supervisor reactor that the startup seam yields (new inventory row). - The projection resume test seeds board projector watermarks into boards.projection_state, where t3o-26 reads them, and asserts over the union. - searchSettings("work") now also matches upstream's worktree/network items. * refactor(board): native title attributes become BoardHint tooltips Upstream's new no-native-title-tooltip rule flags every intrinsic-element title= in the board (61 sites). BoardHint wraps the styled Tooltip primitive and renders its child as the trigger, so layout is unchanged; a nullish label renders the child alone. * docs(seams): record the v0.0.38 sync (t3o-31) Merge-log row, the decisions taken (plans stay tracked, upstream's settlement reactor accepted after audit, projector-enumeration policy, launcher protocol note), an unmarked-edits debt table for the next sync, a marker census, the three new upstream workflows to disable, and the runbook's per-package verification notes. * review(t3o-31): announce the board's status dots, and order the merge log Round-1 nitpicks: a bare span's aria-label is not announced, so the working, running and awaiting dots now carry role="img"; the v0.0.38 merge-log row moves below the two 2026-08-09 rows so the table reads chronologically. --------- Co-authored-by: Theo Browne <me@t3.gg> Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com> Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com> Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> Co-authored-by: abcdmku <63693423+abcdmku@users.noreply.github.com> Co-authored-by: Guilherme Barros <gbarros1095@gmail.com> Co-authored-by: Rishet11 <154429365+Rishet11@users.noreply.github.com> Co-authored-by: Alex <me@pixp.cc> Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com> Co-authored-by: Naveed Iqbal <naveediqbal949@gmail.com> Co-authored-by: Ishaan Kothari <ishaanko.mail@gmail.com> Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com> Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com> Co-authored-by: Bilal Bakr <62337003+Bil0000@users.noreply.github.com> Co-authored-by: Rakshith Bhat <88523594+RakshithBhat03@users.noreply.github.com> Co-authored-by: Simone <lucenz@proton.me> Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com> Co-authored-by: Tristan Knight <admin@snappeh.com> Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com> Co-authored-by: Pavlo Trinko <paul.trinko95@gmail.com> Co-authored-by: codex <codex@users.noreply.github.com> Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: Rodrigo Brechard <rodrigobrechard@gmail.com> Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr> Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com> Co-authored-by: spiky02plateau <155588579+spiky02plateau@users.noreply.github.com> Co-authored-by: Carlos Jimenez <cjimenez@r21digital.com> Co-authored-by: Mark Griffin <mrmg@deflexion.net> Co-authored-by: MacKinley Smith <smithmackinley@gmail.com> Co-authored-by: oliver <97427849+flamboh@users.noreply.github.com> Co-authored-by: mweinbach <maxweinbach5@gmail.com> Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com> Co-authored-by: Mohtasham Murshid <154406804+MohtashamMurshid@users.noreply.github.com> Co-authored-by: Dara Adedeji <daraaded@amazon.com> Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com> Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com> Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com> Co-authored-by: PC <pc@localhost> Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com> Co-authored-by: Josh <gitlucky@pipelab.org> Co-authored-by: Tradi3 <56069280+krutftw@users.noreply.github.com> Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com> Co-authored-by: Ivan Malison <IvanMalison@gmail.com> Co-authored-by: Yash Singh <saiansh2525@gmail.com> Co-authored-by: Gianmarco <gianmarcosimone89@gmail.com> Co-authored-by: Julius Marminge <julius@mac.lan> Co-authored-by: Illia Panasenko <hello@ipanasenko.me> Co-authored-by: Matheson Steplock <ikifar2012@users.noreply.github.com> Co-authored-by: Anirudh Coontoor <anirudh@gosupernova.live> Co-authored-by: Nick Anisimov <n.anisimov.23@gmail.com> Co-authored-by: Muhammad Waleed <114993336+walid-baharwal@users.noreply.github.com> Co-authored-by: Ryan Hughes <ryan@heyoodle.com> Co-authored-by: Vitaly Iegorov <vitalyiegorov@gmail.com> Co-authored-by: Ahmed Besic <ahmed.besic2000@gmail.com> Co-authored-by: maria <maria@kuuro.net> Co-authored-by: Matthew Feroz <136640686+MatthewFeroz@users.noreply.github.com> Co-authored-by: Julius Marminge <jmarminge@gmail.com> Co-authored-by: Aditya Garud <153842990+yashranaway@users.noreply.github.com> Co-authored-by: Yukun Shan <92423096+nateEc@users.noreply.github.com> Co-authored-by: Will Sheldon <will@autimo.com> Co-authored-by: mic <85814106+q1@users.noreply.github.com> Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
…rtial) Ports the rate-limit half of main's #8358 into the branch's reworked XAi extension: a prompt_complete carrying stopReason rate_limit now fails the hung prompt with the -32003 usage-limit error instead of settling it as a normal end_turn, so the turn surfaces "usage limit reached" rather than silently ending. The prompt-completion deferreds carry the error channel end to end. The exit_plan_mode approval gate from #8358 is NOT ported here: it needs a v2 plan-flow design in AcpAdapterV2 (the v1 GrokAdapter it lived in is gone) and is tracked separately. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
) Completes the deferred half of #8358: Grok's plan-approval gate now works on the v2 runtime. The XAi extension regains main's exit-plan helpers (request schemas, plan-markdown extraction, the abandoned-with-feedback response, and the plan.md session-path sniffing), and the v2 ACP adapter grows a captureProposedPlan primitive that emits a completed proposed-plan artifact for the active turn — one plan id per turn, so plan.md rewrites and the exit gate update a single card. The Grok flavor wires both ends: tool calls that write plan.md under a Grok session dir surface the plan while plan mode is still active, and x.ai/exit_plan_mode (plus the underscore alias) captures the final plan — request content first, then the sniffed plan.md contents, then the empty-state placeholder — and abandons the native gate so the turn does not hang, mirroring the Claude ExitPlanMode pattern. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rtial) Ports the rate-limit half of main's #8358 into the branch's reworked XAi extension: a prompt_complete carrying stopReason rate_limit now fails the hung prompt with the -32003 usage-limit error instead of settling it as a normal end_turn, so the turn surfaces "usage limit reached" rather than silently ending. The prompt-completion deferreds carry the error channel end to end. The exit_plan_mode approval gate from #8358 is NOT ported here: it needs a v2 plan-flow design in AcpAdapterV2 (the v1 GrokAdapter it lived in is gone) and is tracked separately. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
) Completes the deferred half of #8358: Grok's plan-approval gate now works on the v2 runtime. The XAi extension regains main's exit-plan helpers (request schemas, plan-markdown extraction, the abandoned-with-feedback response, and the plan.md session-path sniffing), and the v2 ACP adapter grows a captureProposedPlan primitive that emits a completed proposed-plan artifact for the active turn — one plan id per turn, so plan.md rewrites and the exit gate update a single card. The Grok flavor wires both ends: tool calls that write plan.md under a Grok session dir surface the plan while plan mode is still active, and x.ai/exit_plan_mode (plus the underscore alias) captures the final plan — request content first, then the sniffed plan.md contents, then the empty-state placeholder — and abandons the native gate so the turn does not hang, mirroring the Claude ExitPlanMode pattern. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Grok threads miss skills, reasoning controls, proposed plans, and usage data. Some turns stay on Working after ACP stops responding.
Continues #7638 by @1xpixi. The original commits and authorship are preserved, including work from @SunkenInTime, @ahmed-besic, @mbrow190, @lnieuwenhuis, and @gbarros-dev. This PR retains the original Grok changes and adds fixes found during review:
Verification
d3c24a14bproduces identical output. No new mobile type errors.No live T3 state or normal Grok state was changed. Fresh browser verification and before/after captures have not been run. The screenshots below are the contributor's existing evidence from #7638, not captures of this follow-up branch.
Original UI evidence
Grok usage, from @1xpixi's Windows desktop build:
Grok reasoning control, from the same build:
Model: GPT-5.6 Sol. Harness: Codex in T3 Code.
Note
Medium Risk
Touches Grok turn lifecycle, permission mapping, and ACP parsing used beyond Grok; behavior changes (stall detection, rate-limit errors, session approval scoping) can affect live threads if mis-tuned.
Overview
Grok integration gains skill discovery (
grok inspect --json), ACP-driven reasoning effort in the model picker and per-turnsession/set_modelmetadata, and plan mode support that surfacesplan.mdwrites and_x.ai/exit_plan_modeas proposed-plan events while unblocking the native approval gate.The Grok adapter adds a turn liveness watchdog (long silence after ACP progress fails the turn; longer window while tools run; refreshes on steer, plans, approvals, and user-input), maps usage limits from xAI
rate_limitcompletions, and improves permissions: session-scoped auto-approval by operation identity, fallback when Grok omitsallow_always, and CLI argv that mirror T3 runtime modes (--permission-mode/--always-approve).Shared ACP changes emit in-progress tool updates, bound oversized tool output (including whitespace-only buffers), and coalesce streaming command output using content length—not just
detail. The mobile usage chart adds Grok as a provider band with theme-aware colors. The ACP mock agent grows scenario flags to exercise these paths in tests.Reviewed by Cursor Bugbot for commit 01cc3ac. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
Add Grok turn watchdog, plan mode, usage tracking, and reasoning effort
enter_plan_modeandexit_plan_modetool calls, emitsturn.proposed.completedevents when Grok writesplan.md, and interceptsx.ai/exit_plan_modeto capture plan content without native gating.updates.jsonltranscripts viaparseGrokLinein usageTranscripts.ts, and adds Grok series to web and mobile usage charts.setSessionModelmetadata in GrokAcpSupport.ts, validates tokens, and skips redundant calls.grok inspect --jsonin GrokSkills.ts with a 4 s timeout and soft-fail to empty.USAGE_CONTRACT_VERSIONbumps from 4 to 5 in usage.ts; older clients belowUSAGE_MERGE_COMPATIBLE_SINCE(4) will be marked stale.selectGrokPermissionOptionIdfalls back toallow_oncewhenacceptForSessionis missing, changing approval behavior for sessions where Grok omits that option.Macroscope summarized 01cc3ac.