What's Changed
- test(server): Claude steer test no longer hangs for 120s under CI load by @t3dotgg in #22533
- test: remove the timing races behind recurring CI and release failures by @t3dotgg in #22523
- feat(web): render Mermaid diagrams with pele by @maria-rcks in #21472
- fix(mobile): keep home brand visible during secondary retries by @maria-rcks in #21388
- fix(mobile): collapse pull request repository errors by @maria-rcks in #21389
- fix(mobile): show terminal arrow keys before secondary controls by @maria-rcks in #21398
- fix(mobile): update outdated servers and respect provider permissions by @maria-rcks in #21402
- fix(mobile): live activity tracks thread status and settlement by @maria-rcks in #21405
- fix(mobile): use current checkout for non-git projects by @maria-rcks in #21404
- fix(mobile): add project and checkout removal by @maria-rcks in #21409
- fix(mobile): show plans and fold settled progress notes by @maria-rcks in #21393
- fix(mobile): open transcript file links at the resolved path by @maria-rcks in #21403
- fix(mobile): lock the composer while queued edits save by @maria-rcks in #21390
- fix(mobile): bring model controls in line with web by @maria-rcks in #21406
- fix(mobile): restore archive and thread action undo by @maria-rcks in #21401
- fix(mobile): expose background work and thread status actions by @maria-rcks in #21395
- fix(web): keep approval menu actions compact by @Yash-Singh1 in #22566
- fix(web): main typecheck passes again after the Mermaid switch to pele by @t3dotgg in #22570
- test: delete 11k low-signal tests so CI runs faster and flakes less by @t3dotgg in #22557
- fix(mobile): thread rows show wake status and elapsed time by @maria-rcks in #21394
- fix(web,mobile): list database space for all machines in one notice by @juliusmarminge in #22575
- test(lint): ban per-test timeouts and unreasoned skips by @juliusmarminge in #22560
- test(web): ban frame and transition waits in browser tests by @juliusmarminge in #22561
- test: ban wall-clock readings in tests by @juliusmarminge in #22562
- test(server): ban real-clock waits in tests by @juliusmarminge in #22564
- test: warn on polling loops in tests and make adapter test harnesses event-driven by @juliusmarminge in #22565
- fix(mobile): iOS new-thread skill picker stops shifting the screen by @flamboh in #22121
- fix(web): dialogs keep their content while they close by @flamboh in #21960
- ci(release): build Windows x64 on Linux like arm64 by @t3dotgg in #22584
- fix(server): idle orphaned follow-ups can be cancelled without a running parent by @t3dotgg in #22581
- chore(web): remove "use client" directives by @flamboh in #22587
- test(mobile): prune low-value tests in mobile (second pass) by @juliusmarminge in #22588
- test(desktop): prune low-value tests in desktop (second pass) by @juliusmarminge in #22589
- test(web): prune low-value tests in apps/web (second pass) by @juliusmarminge in #22591
- test(server): prune low-value tests in apps/server (second pass) by @juliusmarminge in #22592
- test(packages): prune low-value tests in packages (second pass) by @juliusmarminge in #22593
- test(server): prune low-value tests in orchestration-v2 (second pass) by @juliusmarminge in #22599
- test(web): every browser test starts with the mouse off the page by @juliusmarminge in #22556
- chore(tailscale): drop parseTailscaleMagicDnsName, which nothing imports by @juliusmarminge in #22602
- fix(server): make the remaining flaky server tests deterministic by @juliusmarminge in #22559
- fix(mobile): composer chips match chat chips by @flamboh in #22518
- fix(mobile): show each turn's diffstat on its work row by @maria-rcks in #21392
- fix(web): silence notifications when stopping a watch by @Yash-Singh1 in #22615
- ci(release): build macOS desktop on Blacksmith runners again by @t3dotgg in #22613
- fix(usage): Codex compaction and resumed sessions no longer show skipped-usage warnings by @t3dotgg in #22558
- fix(web): thread search shows the same PR badge as the sidebar by @maria-rcks in #22627
- fix(desktop): bump Electron to 44.9.3 to block compromised eMudhra CA keys by @t3dotgg in #22645
- test(web): ChatView's React Compiler check no longer times out on slow CI runners by @t3dotgg in #22649
- fix(web): thread links render as chips, and thread chips show the project icon by @flamboh in #22621
- fix(server): Stop on a delegate always clears it, even when it is stuck by @t3dotgg in #22653
- feat(web): composer stays usable during approvals, and sending declines and redirects by @maria-rcks in #21503
- docs(agents): name the fast commands and stop polling by @t3dotgg in #22711
- fix(desktop): new worktrees install Electron from the local download cache by @t3dotgg in #22712
- test(server): split replay fixtures into per-provider files by @t3dotgg in #22717
- fix(server): delegates finish when their leftover work settles, and Grok commands stop holding runs open by @t3dotgg in #22709
- fix(server): storage cleanup no longer counts pnpm clones as freed space by @t3dotgg in #22713
- build: upgrade Vite+ to 1.3 and cache typecheck by @t3dotgg in #22716
- test: local test runs use package configs and a clean env by @t3dotgg in #22714
- fix(mobile): restore low-latency decoding for simulator streams by @Yash-Singh1 in #22733
- fix(marketing): typecheck cache no longer misses when the shell env changes by @t3dotgg in #22735
- build(setup): leaner installs on Mac and Linux, cross-device store warning, setup-done marker by @t3dotgg in #22718
- build: upgrade pnpm to 12 for 4x faster installs by @t3dotgg in #22738
- refactor(web): the timeline minimap lives in its own file by @juliusmarminge in #22662
- refactor(web): timeline work entry rows and tool icons live in their own files by @juliusmarminge in #22674
- refactor(web): timeline work group and live activity rows live in their own file by @juliusmarminge in #22675
- refactor(web): timeline user message rows and context chips live in their own files by @juliusmarminge in #22676
- refactor(web): timeline assistant and orchestration event rows live in their own files by @juliusmarminge in #22677
- refactor(web): timeline row derivation, position restore and find reader live in hooks by @juliusmarminge in #22682
- refactor(web): the command palette's theme items live in their own file by @juliusmarminge in #22679
- refactor(web): the command palette's thread items come from their own hook by @juliusmarminge in #22687
- refactor(web): the command palette's project items and pure helpers live in their own files by @juliusmarminge in #22699
- refactor(web): the command palette's add-project views are components by @juliusmarminge in #22707
- feat(cli): start, message, and read threads from the terminal with t3 thread by @t3dotgg in #22732
- refactor(web): composer attachment tiles live in their own component by @juliusmarminge in #22689
- refactor(web): resting image previews and queued attachments are their own components by @juliusmarminge in #22719
- refactor(web): composer mode controls and footer actions live in ComposerFooterControls by @juliusmarminge in #22720
- refactor(web): typing no longer re-renders the composer model picker by @juliusmarminge in #22721
- refactor(web): composer suggestion lists are built by useComposerMenuItems by @juliusmarminge in #22722
- refactor(web): the sidebar's thread rows live in their own file by @juliusmarminge in #22696
- refactor(web): sidebar list markers and draft rows live in their own files by @juliusmarminge in #22729
- feat(dev): first dev start seeds real data and warms deps by @t3dotgg in #22744
- refactor(web): the pull requests column lives in its own component by @juliusmarminge in #22671
- refactor(web): the pull request header's crumbs, title editor and base branch live in their own components by @juliusmarminge in #22672
- refactor(web): the pull request header's actions live in their own components by @juliusmarminge in #22702
- refactor(web): the pull request detail loader lives in its own hook by @juliusmarminge in #22703
- refactor(web): the pull request list's rows read the speed-mode modifier themselves by @juliusmarminge in #22704
- refactor(web): the pull requests page's scope and grouping hooks live in their own module by @juliusmarminge in #22705
- refactor(web): the pull requests route only validates its search; the page lives under components by @juliusmarminge in #22706
- perf(web): Shift re-renders only each row's quick-action group by @juliusmarminge in #22726
- refactor(web): the pull request list's grouping helper lives in a logic module by @juliusmarminge in #22727
- refactor(web): chat markdown code blocks live in their own module by @juliusmarminge in #22690
- refactor(web): the Mermaid code block lives in its own component file by @juliusmarminge in #22691
- refactor(web): chat markdown tables and details live in their own components by @juliusmarminge in #22692
- refactor(web): chat markdown links and file chips live in their own modules by @juliusmarminge in #22693
- refactor(web): chat markdown images and videos live in their own module by @juliusmarminge in #22694
- refactor(web): ChatView's module-level helpers live in their own files by @juliusmarminge in #22665
- refactor(web): ChatView's persistent terminal drawers live in their own component by @juliusmarminge in #22680
- refactor(web): ChatView's right panel lives in its own component by @juliusmarminge in #22700
- refactor(web): ChatView's timeline follow and anchoring lives in useTimelineFollow by @juliusmarminge in #22701
- refactor(web): ChatView's machine and server-update banners live in useSystemComposerBanners by @juliusmarminge in #22710
- refactor(web): ChatView's subagent, goal, background-work and branch banners are built in ThreadActivityBanners by @juliusmarminge in #22725
- refactor(web): ChatView's draft machine routing lives in useDraftEnvironmentRouting by @juliusmarminge in #22728
- refactor(web): ChatView's send preparation is pure functions in ChatView.logic by @juliusmarminge in #22734
- refactor(web): the archived threads settings page lives in its own file by @juliusmarminge in #22666
- refactor(web): the typography settings section lives in its own file by @juliusmarminge in #22667
- refactor(web): the appearance settings page lives in its own file by @juliusmarminge in #22668
- refactor(web): the background activity setting and its dialog live in their own file by @juliusmarminge in #22669
- refactor(web): the connections page's pure helpers live in ConnectionsSettings.logic by @juliusmarminge in #22683
- refactor(web): authorized clients and endpoint rows live in their own file by @juliusmarminge in #22684
- refactor(web): saved and T3 Connect environment rows live in their own file by @juliusmarminge in #22685
- perf(server): skip the macOS xcrun git shim by @t3dotgg in #22759
- docs(agents): read vendored .repos with git show when sparse-excluded by @t3dotgg in #22764
- fix(web): ⌘Z undoes a settle even when the composer has focus by @t3dotgg in #22607
- feat(scripts): one command checks what the branch changed by @t3dotgg in #22767
- fix(scripts): check:changed no longer skips knip after a removed import by @t3dotgg in #22784
- perf(dev): faster first load for shared dev servers by @t3dotgg in #22776
- fix(server): stalled clones say "Stalled" instead of a frozen speed by @t3dotgg in #22780
- fix(web): steers split a finished turn's work instead of stacking under it by @t3dotgg in #22783
- fix(web): images on their own line no longer sit beside their label by @t3dotgg in #22787
- fix(release): include pnpm hook in Vercel uploads by @t3dotgg in #22813
- fix(release): keep Vercel warnings out of deployment URLs by @t3dotgg in #22817
- fix(queue): send selected held messages when a thread is stopped by @Yash-Singh1 in #22790
- fix(server): delegated Claude children follow your subagent cache TTL setting by @t3dotgg in #22841
- fix(server): t3 pair in a worktree no longer falls back to the live install by @t3dotgg in #22855
- fix(server): avoid expensive diff minimization in status refreshes by @voltcrash in #21872
- fix(codex): keep every path of a multi-file patch by @only21mil in #22541
- fix(gitlab): merge request diffs page 30 files at a time so GitLab 15.7 to 17.10 answer by @Mnigos in #21909
- fix(server): keep Antigravity question options and no-custom-answer flag in V2 by @fixfon in #22019
- fix(server): commit prompts no longer repeat CLAUDE.md when it matches AGENTS.md by @t3dotgg in #22848
- fix(mcp): point a bare thread uuid at its mcp: thread in thread_not_found by @fixfon in #22452
- fix(opencode): out-of-funds failures show OpenCode's message instead of a usage limit by @fixfon in #22596
- fix(shared): accept a pasted ChatGPT callback URL that is missing http:// by @Project516 in #21750
- fix(server): the background service picks up JAVA_HOME from the login shell by @t3dotgg in #22856
- fix(server): answered questions say "already answered" instead of "not found" by @t3dotgg in #22850
- fix(desktop): an abandoned browser sign-in no longer blocks T3 Connect for 3 minutes by @t3dotgg in #22903
- fix(server): agents get a short, current model list instead of a 55k-character catalog dump by @t3dotgg in #22889
- docs(agents): proof for a bug fix depends on the bug by @juliusmarminge in #23008
- fix(server): removing a worktree on Windows no longer deletes what its junctions point to by @SunkenInTime in #21099
- perf(web): a streaming thread re-renders only its own sidebar row by @juliusmarminge in #22730
- refactor(web): the add environment dialog owns its form state by @juliusmarminge in #22686
- fix(desktop): use Clerk's upstream fix for abandoned browser sign-ins by @wobsoriano in #23038
- feat: show automation messages as compact timeline rows by @juliusmarminge in #22638
- feat(server,web,mobile): approvals in full access say why Claude asked by @juliusmarminge in #22546
- feat(claude): idle compaction has a global default and per-instance overrides by @juliusmarminge in #23037
- perf(web): typing no longer re-renders the traits picker or attach button by @juliusmarminge in #23040
- refactor(web): the composer's layout and provider hooks live in their own files by @juliusmarminge in #23042
- refactor(web): the prompt stash lives in useComposerStash by @juliusmarminge in #23046
- refactor(web): composer context imports live in useComposerContextImport by @juliusmarminge in #23048
- refactor(web): composer file intake lives in useComposerAttachmentIntake by @juliusmarminge in #23049
- refactor(web): the composer's footer controls render in ComposerControlsBar by @juliusmarminge in #23058
- refactor(web): composer key handling lives in useComposerCommandKey by @juliusmarminge in #23060
- refactor(web): ChatView's send paths live in useComposerSend by @juliusmarminge in #23062
- refactor(web): ChatView's terminal actions live in useChatTerminalActions by @juliusmarminge in #23063
- refactor(web): ChatView's right panel actions live in useRightPanelActions by @juliusmarminge in #23064
- refactor(web): ChatView's snooze, settle, and checkout actions live in useThreadLifecycle by @juliusmarminge in #23065
- refactor(web): ChatView's revert, rollback, and fork live in useTimelineRewind by @juliusmarminge in #23066
- refactor(web): ChatView's attachment preview handoff lives in useAttachmentPreviewHandoff by @juliusmarminge in #23067
- refactor(web): ChatView's project clone banner lives in useProjectCloneBanner by @juliusmarminge in #23068
- refactor(web): ChatView's model, mode, and workspace choices live in useComposerSelection by @juliusmarminge in #23069
- refactor(web): ChatView's pull request checkout lives in usePullRequestDraftThread by @juliusmarminge in #23070
- refactor(web): ChatView's thread derivations are tested functions in ChatView.logic by @juliusmarminge in #23071
- refactor(web): ChatView's paste-to-focus, titlebar controls, and timeline overlays move out by @juliusmarminge in #23072
- fix(cursor): a closed-stream write in the Cursor SDK no longer stops the server by @t3dotgg in #22897
- fix(server): Codex no longer offers a one-click update for installs it can't detect by @koushikxd in #22504
- fix(pi): declare properties on MCP tool schemas that omit them by @tlconde in #21822
- fix(server): a desktop backend whose launcher died shuts down cleanly instead of crashing by @SunkenInTime in #22471
- fix(mobile): chat feed no longer re-derives on every render by @t3dotgg in #22913
- docs(user): the outside agents guide says which addresses agents can sign in over by @Gourav224 in #22377
- fix(server): HTML preview reports a browser start error instead of an internal error by @t3dotgg in #22895
- fix(tailscale): a timed-out tailscale probe no longer outlives its call by @t3dotgg in #22900
- docs(composer): queued messages follow the Follow-up behavior setting by @t3dotgg in #22857
- fix(server): failed provider updates say why by @koushikxd in #22506
- test(telemetry): keep fixture PIDs from colliding with the test worker by @only21mil in #21446
- fix(server): server tests resolve the macOS temp dir symlink by @nabettu in #21442
- fix(scripts): mobile lint fails instead of passing when ktlint or detekt is missing by @t3dotgg in #22896
- fix(server): t3_thread_read clamps oversized page sizes instead of failing by @t3dotgg in #22901
- fix(mobile): opening a pull request no longer crashes with "Maximum update depth exceeded" by @nabettu in #22600
- fix(web): PR Code tab keeps its files after a refresh with an unchanged diff by @t3dotgg in #22917
- fix(web): finished provider updates no longer leave a hidden spinner in the sidebar by @t3dotgg in #22912
- fix(composer): mentions of files like
posts.$postId.tsxor[id].tsxstay chips by @t3dotgg in #22922 - refactor(web): resuming an interrupted run lives in its own hook by @juliusmarminge in #23087
- refactor(web): proposed-plan follow-ups and implement-in-new-thread live in their own hooks by @juliusmarminge in #23091
- refactor(web): multiple-model sends live in their own hook by @juliusmarminge in #23094
- refactor(web): the composer send reads its own settings and draft instead of taking them from ChatView by @juliusmarminge in #23095
- refactor(web): ComposerControlsBar renders without a memo() wrapper by @juliusmarminge in #23093
- refactor(web): chat shortcuts live with the hooks that own their actions by @juliusmarminge in #23097
- refactor(web): ChatView's timeline banners render in ChatBannerLane by @juliusmarminge in #23101
- fix(web): the branch toolbar and thread details panel stay cached while a reply streams by @juliusmarminge in #23103
- fix(server): scheduled tasks no longer jump to the top when toggled by @t3dotgg in #22899
- fix(server): Forgejo and GitCafe pull requests link to their threads again by @MarcoDotIO in #22937
- fix(server): pushes the remote refuses say why instead of a generic failure by @t3dotgg in #22904
- fix(composer): typing a price no longer opens the skill menu by @MarcoDotIO in #21519
- fix(web): thread details PR merge uses the last selected merge method by @tris203 in #22399
- fix(web): a Usage toggle shortcut now goes back instead of staying on Usage by @t3dotgg in #22905
- fix(web): quote comment box stays on screen for long code lines by @EtanHey in #22149
- fix(web): right panel launcher letters open their surface instead of typing into the composer by @t3dotgg in #22898
- fix(web): ../ file links outside the workspace open as host files by @t3dotgg in #22853
- fix(shared): recognize relative folder links with trailing slash by @macodev00 in #22188
- fix(client): usage limits skip disabled connections by @M4NU5 in #22936
- fix(web): imported VS Code themes keep destructive buttons red by @lgollut in #21924
- fix(shared): Azure DevOps repositories with a space in the name list their pull requests by @Tabonx in #22782
- fix(opencode): cancelled todos no longer keep the todo list running by @MarcoDotIO in #22938
- fix(web): copy to machine clones the fork, not its upstream by @AKolenda in #22492
- fix(server): JetBrains IDEs open file links at the right column by @levochkaa in #22826
- fix(server): sync pull request draft status changes by @Yash-Singh1 in #22832
- test(web): chat shortcut test types through the composer handle by @juliusmarminge in #23126
- fix(source-control): merge messages drop Claude Code's current claude.com footer by @MarcoDotIO in #23133
- fix(build): pin Node 26.12.1 for development and standalone releases by @PixPMusic in #23165
- fix(mobile): keep Duo toolbar actions clear of workspace tabs by @juliusmarminge in #22976
- fix(mobile): respect Duo safe areas in overlays by @juliusmarminge in #22977
- fix(mobile): retain resting scroll offsets through Duo inset changes by @juliusmarminge in #22978
- fix(mobile): deliver the first tab selection after Duo folding by @juliusmarminge in #22979
- fix(mobile): use native full-width sheets on iPhone Duo by @juliusmarminge in #22980
- fix(mobile): the pull requests tab's empty detail asks for a pull request by @juliusmarminge in #23143
- fix(mobile): the iPhone Duo keeps list titles through folds and unfolds with its sidebar by @juliusmarminge in #23144
- fix(mobile): the iPhone Duo searches from a field at the bottom of its list by @juliusmarminge in #23145
- fix(mobile): a closed search no longer risks freezing the app by @juliusmarminge in #23146
- fix(mobile): folding the Duo keeps the thread's end or the reader's line in place by @juliusmarminge in #23147
- fix(mobile): the iPhone Duo's search field and composer line up with its tab bar by @juliusmarminge in #23148
- fix(mobile): Screens 5.0.0-t3.36 stops an iPhone Duo unfold crash by @juliusmarminge in #23149
- fix(mobile): the iPhone Duo's inspector panes use the full column by @juliusmarminge in #23150
- fix(gitcafe): show line counts on linked and listed pull requests by @maria-rcks in #22633
- docs(import): correct conversation size and batch limits by @only21mil in #23226
- fix(server): stop abandoned turns before continuing threads by @Yash-Singh1 in #23169
- feat(server): export how long runs take and how they end by @juliusmarminge in #22094
- fix(mobile): new-thread heading clears the iPad header by @juliusmarminge in #23206
- fix(pi): fork completed turns while the next turn is running by @juliusmarminge in #23052
- fix(mobile): drafts swipe to discard and every row move animates by @juliusmarminge in #23205
- feat(server): webhook filters fan out over arrays with a [] path wildcard by @juliusmarminge in #23282
- fix(web): Arabic and Hebrew text reads and navigates right to left by @yzn-h in #22777
- fix(client-runtime): refresh Git refs when the RPC session changes by @Yash-Singh1 in #23314
- fix(web): cap list layout passes to prevent React error 185 by @Yash-Singh1 in #23315
- fix(mobile): align iPad composer without shifting on keyboard focus by @juliusmarminge in #23355
- feat(gitcafe): request reviewers and apply labels on GitCafe pull requests by @juliusmarminge in #23034
- fix(source-control): clones retry over HTTPS when the SSH key is refused by @juliusmarminge in #23170
- fix(mobile): the iOS composer reopens where you left a long draft by @shivamhwp in #23096
- fix(mobile): preserve new-thread drafts and native header layout by @juliusmarminge in #23366
- feat: ChatGPT Business usage limits offer a copyable admin request by @juliusmarminge in #23361
- fix(web): paused sidebar videos stop reloading after every command by @shivamhwp in #23106
- chore(typecheck): typescript is the tsc-rs drop-in, no effect-tsgo patch by @t3dotgg in #23023
- fix(mobile): Dynamic Island status no longer wraps next to other Live Activities by @t3dotgg in #23327
- perf(web): streamed reply text no longer re-renders ChatView by @juliusmarminge in #23117
- perf(web): visit marks during a reply no longer re-render ChatView by @juliusmarminge in #23124
- fix(server): a Claude agent stops when the server that started it dies by @shivamhwp in #23389
- fix(server): SSH hosts no longer keep every old 300 MB runtime after desktop updates by @shivamhwp in #23113
- fix(settings): older clients connect again after idle compaction modes by @juliusmarminge in #23454
- fix(mobile): unify draft and thread navigation and composer behavior by @juliusmarminge in #23467
- ci: setup survives npm registry outages by @t3dotgg in #23582
- feat(web,mobile): messages from other agents fold into one-line rows by @shivamhwp in #23135
- fix(web): subagent bar keeps model and status readable in narrow chat columns by @shivamhwp in #23502
- fix(chat): mark tool images beyond the preview limit by @only21mil in #23595
- fix(web): provider updates no longer pop toasts on launch by @flamboh in #23233
- fix(server): probe the Windows startup environment asynchronously by @UtkarshUsername in #21720
- fix(usage): count initial Codex requests with inherited totals by @PixPMusic in #23729
- fix(web): let toast content use the full accordion width by @Yash-Singh1 in #23777
- fix(web): sidebar follows the active thread after history navigation by @juliusmarminge in #23519
New Contributors
- @Gourav224 made their first contribution in #22377
- @nabettu made their first contribution in #21442
- @MarcoDotIO made their first contribution in #22937
- @M4NU5 made their first contribution in #22936
- @lgollut made their first contribution in #21924
- @Tabonx made their first contribution in #22782
- @levochkaa made their first contribution in #22826
- @yzn-h made their first contribution in #22777
Full Changelog: v0.1.1...v0.1.2