feat(claude): compact old threads before they burn through usage - #8144
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 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✅ 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. |
There was a problem hiding this comment.
One consistency finding in the changed web UI: the new resume-compaction notice is a hand-rolled banner inside the composer glass shell instead of the existing composer banner/drawer surface contract. Details inline.
Posted via Macroscope — UI Consistency
ApprovabilityVerdict: Not approved Macroscope's review found this PR not approvable — This introduces a cross-layer Claude compaction workflow, including SDK configuration, resume-session dialogs, new context-meter/banner controls, and slash-command behavior. The new user-facing flow and its effect on session processing warrant human review. Notes:
You can add or adjust custom eligibility rules. Learn more. |
There was a problem hiding this comment.
UI consistency review of the web changes. The resume-compaction notice now uses the shared ComposerBannerStack contract, which resolves the earlier finding. Two smaller consistency/interaction points remain, both inline.
Posted via Macroscope — UI Consistency
There was a problem hiding this comment.
One finding on the new compaction affordances: the shared compactDisabled flag silently deadens both new controls, which departs from how every neighbouring composer/banner action communicates an unavailable state. Details inline.
Posted via Macroscope — UI Consistency
There was a problem hiding this comment.
One finding: the new composer draft-content gate re-implements a shared predicate instead of reusing it. The previously flagged hover-popover grace period (closeDelay) and the banner action's button treatment both look resolved.
Posted via Macroscope — UI Consistency
There was a problem hiding this comment.
Follow-up on the disabled-reason handling added in d803371: the reason is now delivered only through aria-label on a disabled Button. buttonVariants sets disabled:pointer-events-none and a disabled <button> is out of the tab order, so that name is unreachable by hover, focus, or AT — sighted users still see a dead control with no explanation — while it also overrides the visible label when the button is enabled. The repo already has a disabled-reason contract (DisabledReasonTooltip in RightPanelTabs.tsx, CloudLinkSwitch in ConnectionsSettings.tsx: Tooltip + TooltipTrigger render={<span className="inline-flex">…</span>}), and the sibling composer-banner actions encode state in visible text (Stopping..., Waking..., Restoring...). Two inline notes below.
Posted via Macroscope — UI Consistency
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 d803371. Configure here.
…ints The web client detects the resume dialog's "Don't ask again" answer by matching the question text, but the copy lived only in the adapter, so a reword would silently break the detection. The question template and the never-answer label now live in @t3tools/shared/claudeCompaction with a test that formats and matches the same string. Also: exempt every slash command from the ultrathink prefix instead of only /compact, settle resume dialogs whose abort landed before the listener was registered, toast instead of silently ignoring a compact while a pasted image compresses, clear a stranded /compact draft when a dispatch is blocked, track banner dismissals per thread instead of in one slot, and scope the compaction docs to the clients that have each control. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The v2 context meter could only show token counts after a compaction had already happened — v2 had no live usage plumbing at all, so main's compaction-threshold UX was invisible on v2 threads. Provider turns now carry an optional tokenUsage report: the Codex adapter maps the app-server's thread/tokenUsage/updated notification (total breakdown + model context window) onto the active provider turn, ChatView picks the newest report out of the projection, and the meter prefers it over the compaction fallback — so usage and remaining-context percentages update while the turn runs. Claude's v2 adapter does not report usage yet; its meter falls back to compaction items as before. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The v2 context meter could only show token counts after a compaction had already happened — v2 had no live usage plumbing at all, so main's compaction-threshold UX was invisible on v2 threads. Provider turns now carry an optional tokenUsage report: the Codex adapter maps the app-server's thread/tokenUsage/updated notification (total breakdown + model context window) onto the active provider turn, ChatView picks the newest report out of the projection, and the meter prefers it over the compaction fallback — so usage and remaining-context percentages update while the turn runs. Claude's v2 adapter does not report usage yet; its meter falls back to compaction items as before. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The v2 context meter could only show token counts after a compaction had already happened — v2 had no live usage plumbing at all, so main's compaction-threshold UX was invisible on v2 threads. Provider turns now carry an optional tokenUsage report: the Codex adapter maps the app-server's thread/tokenUsage/updated notification (total breakdown + model context window) onto the active provider turn, ChatView picks the newest report out of the projection, and the meter prefers it over the compaction fallback — so usage and remaining-context percentages update while the turn runs. Claude's v2 adapter does not report usage yet; its meter falls back to compaction items as before. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The v2 context meter could only show token counts after a compaction had already happened — v2 had no live usage plumbing at all, so main's compaction-threshold UX was invisible on v2 threads. Provider turns now carry an optional tokenUsage report: the Codex adapter maps the app-server's thread/tokenUsage/updated notification (total breakdown + model context window) onto the active provider turn, ChatView picks the newest report out of the projection, and the meter prefers it over the compaction fallback — so usage and remaining-context percentages update while the turn runs. Claude's v2 adapter does not report usage yet; its meter falls back to compaction items as before. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The v2 context meter could only show token counts after a compaction had already happened — v2 had no live usage plumbing at all, so main's compaction-threshold UX was invisible on v2 threads. Provider turns now carry an optional tokenUsage report: the Codex adapter maps the app-server's thread/tokenUsage/updated notification (total breakdown + model context window) onto the active provider turn, ChatView picks the newest report out of the projection, and the meter prefers it over the compaction fallback — so usage and remaining-context percentages update while the turn runs. Claude's v2 adapter does not report usage yet; its meter falls back to compaction items as before. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The v2 context meter could only show token counts after a compaction had already happened — v2 had no live usage plumbing at all, so main's compaction-threshold UX was invisible on v2 threads. Provider turns now carry an optional tokenUsage report: the Codex adapter maps the app-server's thread/tokenUsage/updated notification (total breakdown + model context window) onto the active provider turn, ChatView picks the newest report out of the projection, and the meter prefers it over the compaction fallback — so usage and remaining-context percentages update while the turn runs. Claude's v2 adapter does not report usage yet; its meter falls back to compaction items as before. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Range f035a0f..a3a8cbd. 60 files touched by both sides; 12 conflicted (24 hunks) plus 3 modify/delete. Conflicts and how they were resolved - Migrations.ts — invariant 1. Upstream's new 042_ProjectionThreadLinkedPullRequest and 043_ProjectionThreadsUnsettledAt take the next free applied ids 49 and 50, filenames unchanged. 49 entries, ids unique and monotonic, 34 still burned. Upstream's 042 test ran `toMigrationInclusive: 41` then `42` (its filename numbers), which here runs neither migration; retargeted to 48 then 49 and given a control asserting the column is absent at 48. - ChatMarkdown.tsx — reset to the fork's file and upstream's four commits re-applied one at a time, because pingdotgg#7140 (reveal in the system file manager) needed rejecting in part while pingdotgg#8081, pingdotgg#8098 and pingdotgg#8160 did not. The chip stays the fork's superset (a <span> wrapping the tooltip AND an in-DOM <Menu>, the only options surface reachable on web and mobile) with upstream's hasPrimaryAction / useBrowserPrimaryAction gating, repositioned native context menu and no-primary-action <button> fallback grafted in. pingdotgg#8098's shouldOpenMarkdownFileLinkInBrowserByDefault is subsumed by upstream's shouldUseMarkdownFileBrowserPrimaryAction, so the latter is what survives. The fork's `fileEnvironmentId` prop is replaced by upstream's `environmentId`, which is the superset: besides "Open in new tab" it drives remote-open resolution, the editor hook, server config and the workspace basename lookup — the exact narrowness the fork's own comment recorded as a known gap. TrustedFileView passes the new name. New invariant 11. - ContextWindowMeter.{tsx,test.tsx} — deleted (invariant 4; the Vitals gauge replaced the meter). ContextWindowMeter.logic.ts is NOT: pingdotgg#8144 put the Claude resume-compaction helpers there and ChatView's compaction banner uses them, so it is kept under upstream's name, trimmed to the compaction helpers, with its test trimmed to match. New invariant 10. - ChatView.tsx — one hunk was two unrelated imports spliced onto a shared `import {` opener; both survive as separate complete imports. - ChatComposer.tsx — the fork's VitalsGaugeConnected and its own activeThreadModelDisplayName win over upstream's meter render and duplicate computation. compactDisabled / compactDisabledReason / onCompactContext are adopted and live (compactThreadContext consumes them), not vestigial. - ClaudeDriver.ts — upstream's background model-manifest refresh (pingdotgg#8227) taken whole, with the fork's getCachedCapabilitiesDroppingMisses substituted for Cache.get so a failed probe is still not pinned for the full TTL. - contracts/settings.ts — field order keeps both the fork's configDirPath and upstream's autoCompactWindow. - ServerEnvironment.{ts,test.ts}, ProjectionSnapshotQuery.ts — additive, both sides kept. Two upstream deletions the merge honoured while the fork still referenced them Both broke typecheck rather than anything subtler, which is the good case: - pingdotgg#8144 renamed ChatView's `composerHasDraftContent` to `composerHasUnsentContent` (hoisting the predicate into composerDraftHasUserContent). The fork's five references now follow the rename. - pingdotgg#8144 replaced ChatComposer's `activeThreadActivities` prop with a precomputed `activeContextWindow`. The fork derives both the snapshot and the account-usage view the Vitals gauge needs, so `activeThreadActivities` is restored as the prop and ChatView passes it again. This is a fourth sweep direction scripts/sweep-merge.py cannot see — a line in the merge-base AND the fork, deleted by upstream. It is documented in docs/fork/README.md along with the probe. Two upstream tests retargeted, not deleted - ProviderSettingsForm.test.ts asserted Claude's exact field order without the fork's configDirPath. - serverSettings.test.ts's fork-owned auth guard asserted the settings file stays empty. pingdotgg#8176 deliberately persists explicit providers.*.enabled flags so an upgrade cannot silently disable a provider the user had on, so the assertion now targets its real subject — disableAuthentication never reaching disk — with a control proving the file was written. Verified by mutation: making the flag patchable and neutralizing the two earlier assertions turns that line red. Invariants All nine re-probed against the merged tree and holding. Migration ids unique and monotonic (49 entries, max 50, 34 burned); the fork-only @effect/platform-node patch still pinned at beta.103 (upstream's bump was Clerk-only and did not touch patchedDependencies); both sidebars present with legacySidebarEnabled intact; deliberate deletions still deleted; isSendBlocked at four call sites; the Claude steering test still absent; footer panels still inside SidebarUtilityMenu; reconcileProviderSessions still gone with BootTurnReconciler owning the binding; the interrupt/stop ladder intact including ClaudeQueryRuntime.interrupt and .stopTask; the live-session interrupt gate and recoverInterruptFailure both present; entrypoint.test.ts still realpaths its temp dir. Invariants 10 and 11 added. Sweeps resurrected 6, dropped 19, fork-loss 16, every entry named. Both "resurrected" lines are new upstream constructs that reuse the same text, not restorations: the fork's deletion sites still carry their comments and remain empty. The fourth direction found 167 lines, all legitimate (version bumps, Clerk pins, upstream refactoring its own code) once the two above were fixed. Gate pnpm run verify, whole script: fmt:check, typecheck, lint, test — 10,083 tests passed across 959 files, 8 skipped, 0 failed, EXIT=0. Full pnpm install first; pnpm-lock.yaml unchanged by it. Not deployed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The v2 context meter could only show token counts after a compaction had already happened — v2 had no live usage plumbing at all, so main's compaction-threshold UX was invisible on v2 threads. Provider turns now carry an optional tokenUsage report: the Codex adapter maps the app-server's thread/tokenUsage/updated notification (total breakdown + model context window) onto the active provider turn, ChatView picks the newest report out of the projection, and the meter prefers it over the compaction fallback — so usage and remaining-context percentages update while the turn runs. Claude's v2 adapter does not report usage yet; its meter falls back to compaction items as before. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The v2 context meter could only show token counts after a compaction had already happened — v2 had no live usage plumbing at all, so main's compaction-threshold UX was invisible on v2 threads. Provider turns now carry an optional tokenUsage report: the Codex adapter maps the app-server's thread/tokenUsage/updated notification (total breakdown + model context window) onto the active provider turn, ChatView picks the newest report out of the projection, and the meter prefers it over the compaction fallback — so usage and remaining-context percentages update while the turn runs. Claude's v2 adapter does not report usage yet; its meter falls back to compaction items as before. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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
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
The v2 context meter could only show token counts after a compaction had already happened — v2 had no live usage plumbing at all, so main's compaction-threshold UX was invisible on v2 threads. Provider turns now carry an optional tokenUsage report: the Codex adapter maps the app-server's thread/tokenUsage/updated notification (total breakdown + model context window) onto the active provider turn, ChatView picks the newest report out of the projection, and the meter prefers it over the compaction fallback — so usage and remaining-context percentages update while the turn runs. Claude's v2 adapter does not report usage yet; its meter falls back to compaction items as before. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The base branch now carries live context usage on provider turns (tokenUsage, pingdotgg#8144) and the web meter reads it from the projection. Pi kept a second owner for the same data: a contextUsage snapshot on the provider thread, refreshed after terminalization and invalidated by hand on rollback. Read Pi's session stats while the turn settles and attach them to the completed provider turn instead, then drop the provider-thread field and its generation bookkeeping. A turn without usable stats simply carries no report, so the meter keeps the last reported turn without adapter-side retention logic. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Pi session stats now attach to the settled provider turn as tokenUsage so the shared pingdotgg#8144 meter can read them. Drop the adapter's thread-level contextUsage refresh and generation bookkeeping. Keep the provider-thread field on trial contracts for other layers. Also cover clamping Pi's default thinking level to each model's supported ladder.
The v2 context meter could only show token counts after a compaction had already happened — v2 had no live usage plumbing at all, so main's compaction-threshold UX was invisible on v2 threads. Provider turns now carry an optional tokenUsage report: the Codex adapter maps the app-server's thread/tokenUsage/updated notification (total breakdown + model context window) onto the active provider turn, ChatView picks the newest report out of the projection, and the meter prefers it over the compaction fallback — so usage and remaining-context percentages update while the turn runs. Claude's v2 adapter does not report usage yet; its meter falls back to compaction items as before. 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>
The v2 context meter could only show token counts after a compaction had already happened — v2 had no live usage plumbing at all, so main's compaction-threshold UX was invisible on v2 threads. Provider turns now carry an optional tokenUsage report: the Codex adapter maps the app-server's thread/tokenUsage/updated notification (total breakdown + model context window) onto the active provider turn, ChatView picks the newest report out of the projection, and the meter prefers it over the compaction fallback — so usage and remaining-context percentages update while the turn runs. Claude's v2 adapter does not report usage yet; its meter falls back to compaction items as before. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The v2 context meter could only show token counts after a compaction had already happened — v2 had no live usage plumbing at all, so main's compaction-threshold UX was invisible on v2 threads. Provider turns now carry an optional tokenUsage report: the Codex adapter maps the app-server's thread/tokenUsage/updated notification (total breakdown + model context window) onto the active provider turn, ChatView picks the newest report out of the projection, and the meter prefers it over the compaction fallback — so usage and remaining-context percentages update while the turn runs. Claude's v2 adapter does not report usage yet; its meter falls back to compaction items as before. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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
The v2 context meter could only show token counts after a compaction had already happened — v2 had no live usage plumbing at all, so main's compaction-threshold UX was invisible on v2 threads. Provider turns now carry an optional tokenUsage report: the Codex adapter maps the app-server's thread/tokenUsage/updated notification (total breakdown + model context window) onto the active provider turn, ChatView picks the newest report out of the projection, and the meter prefers it over the compaction fallback — so usage and remaining-context percentages update while the turn runs. Claude's v2 adapter does not report usage yet; its meter falls back to compaction items as before. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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
The v2 context meter could only show token counts after a compaction had already happened — v2 had no live usage plumbing at all, so main's compaction-threshold UX was invisible on v2 threads. Provider turns now carry an optional tokenUsage report: the Codex adapter maps the app-server's thread/tokenUsage/updated notification (total breakdown + model context window) onto the active provider turn, ChatView picks the newest report out of the projection, and the meter prefers it over the compaction fallback — so usage and remaining-context percentages update while the turn runs. Claude's v2 adapter does not report usage yet; its meter falls back to compaction items as before. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The v2 context meter could only show token counts after a compaction had already happened — v2 had no live usage plumbing at all, so main's compaction-threshold UX was invisible on v2 threads. Provider turns now carry an optional tokenUsage report: the Codex adapter maps the app-server's thread/tokenUsage/updated notification (total breakdown + model context window) onto the active provider turn, ChatView picks the newest report out of the projection, and the meter prefers it over the compaction fallback — so usage and remaining-context percentages update while the turn runs. Claude's v2 adapter does not report usage yet; its meter falls back to compaction items as before. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The v2 context meter could only show token counts after a compaction had already happened — v2 had no live usage plumbing at all, so main's compaction-threshold UX was invisible on v2 threads. Provider turns now carry an optional tokenUsage report: the Codex adapter maps the app-server's thread/tokenUsage/updated notification (total breakdown + model context window) onto the active provider turn, ChatView picks the newest report out of the projection, and the meter prefers it over the compaction fallback — so usage and remaining-context percentages update while the turn runs. Claude's v2 adapter does not report usage yet; its meter falls back to compaction items as before. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

Claude threads can resume with hundreds of thousands of old context tokens and burn through usage before the user realizes it. T3 also did not show Claude Code's resume summary prompt or expose an easy compaction control.
This change matches Claude Code's 70-minute and 100,000-token resume conditions, supports its native resume dialog on web and mobile, adds
/compactto provider command menus, and puts a compact action in the context meter. Claude provider settings can now set an earlier auto-compaction threshold without shrinking the 1M context window.Before
After
Verified with 142 server tests, 61 contract tests, 26 web tests, and scoped type checks for server, web, mobile, desktop, contracts, and client runtime. Screenshots use synthetic Sonnet 5 conversations and contain no personal thread data.
Built by GPT-5.6 Sol in the Codex harness.
Note
Medium Risk
Touches Claude session start, resume dialogs, and user-input/approval cancellation paths; incorrect abort handling or compaction gating could affect live threads, but changes are covered by extensive adapter and UI tests.
Overview
Adds Claude context compaction end to end: a configurable Auto-compact after threshold (
100000–1000000tokens) on Claude provider settings, forwarded to the SDK asautoCompactWindowand reflected in thread usage asautoCompactThreshold.The server Claude adapter wires Claude’s
resume_returndialog throughonUserDialogand the existing user-input flow (compact / keep history / don’t ask again), registers/compactin slash commands, and fixes abort races by settlingAskUserQuestionand tool approval waits when the signal was already aborted before listeners attach. Ultrathink no longer prefixes single-token slash commands like/compact.The web composer gains Compact context on the context meter and a “Resume with less context” banner when an old Claude session exceeds ~70 minutes and 100k tokens, with gating for drafts, busy state, and compatible Claude instances. Shared copy in
@t3tools/shared/claudeCompactionkeeps server prompts and client dismissal detection aligned.Reviewed by Cursor Bugbot for commit dc39e20. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
Add Claude context compaction UI,
autoCompactWindowsetting, and resume dialog support/compactinto the composer via the newChatComposerHandle.compactContext()methodautoCompactWindow(100000–1000000 tokens) through settings.ts → ClaudeAdapter.ts → Claude query settings, and surfaces the threshold inThreadTokenUsageSnapshot.autoCompactThresholdso the UI can display itresume_returndialogs through the sharedAskUserQuestionflow, returningcompact|continue|never; the 'never' answer is shared viaCLAUDE_RESUME_COMPACTION_NEVER_ANSWERin claudeCompaction.ts/compactslash command in ClaudeProvider.ts and fixes model.ts soultrathinkeffort no longer prefixes slash commands like/compact, which would break themAskUserQuestionand tool-approval flows inmakeClaudeAdapternow immediately resolve as cancelled if the abort signal was already aborted before listener registration, preventing hangs;ChatComposerPropsreplacesactiveThreadActivitieswithactiveContextWindow— existing consumers must updateMacroscope summarized dc39e20.