Repository navigation
chore: sync with upstream (2026-11-08) - #94
Merged
Merged
Conversation
…e from a secret provider (pingdotgg#31652) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the platform options Stack.tsx built every route from hand-merged constants with 29 Platform.OS checks, and sheets patched their own corner radius, Android fit-to-content and swipe guard from inside the screen. Detents had drifted between routes. - pageRoute, sheetRoute, modalRoute and immersiveRoute own header appearance, detents, the Android card/full-screen fallback, corner radius and fit-to-content. - The Android navigator hides the native header for every route from the first frame; screens always draw their bar in-tree. - One isPresentedRoute replaces six copies of the presentation check. - SheetHeader takes typed actions and owns the swipe guard for dismissDisabled. - The legal document and Environments sheets use SheetHeader/AppBar instead of raw header options; Environments' add button was invisible on iOS. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Five features built their own native stacks, each with its own header recipe and liquid-glass check, only to get a bar: Thread settings, Custom snooze, the iOS sidebar column, the browser, and the thread preview. Agents, Background work and Queued hand-built a ScreenStack with no close button. - useSheetStackOptions gives a stack nested in a sheet the sheet route's bar. - StandaloneStack hosts a native bar outside the route tree (popover, sidebar column); sidebar-navigation-shell is gone. - The thread preview gets a Thread route of its own (ThreadPreviewRoute, next to the inspector preview) that draws no native UI. - The browser route has its own bar, and draws one SheetHeader instead of two bars. - Agents, Background work and Queued use the route header and SheetHeader, which gives them a close button on iOS. - SheetHeader takes menus, matching AppBar. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…th platforms About 50 feature screens wrote their bar twice (iOS header options or Toolbar items, plus an Android-only embedded AppBar), branched on Platform.OS and liquid-glass support for chrome, and guessed the bar height four different ways. - AppBar loses its `options` escape hatch and gains onClose, confirm, guardBack, onBackToList and onCompose; menu items can be destructive. Search sheets, form sheets and modals use the same AppBar as pages. - useBarInset, useBarOverlap, useContentTopInset and useSearchToolbarInset replace HeaderHeightContext and insets.top + 44/48/72 math in features. - ScreenContent keeps the Android split-view edge gap by default. - The thread bar is one AppBar with one git menu; the three copies disagreed about "Merge back". - Settings filter menus, Usage, Files, ZIP and attachment viewers, PR detail, discussion and guide screens, git sheets, search sheets and thread settings each declare actions, menus and search once. - useOpenWorkspaceDetail replaces Android selectDetail vs iOS push branches. - Fixes: Files error states had no bar; GitConfirm had no bar on iOS; Android never showed "Move draft to this line"; thread settings Save/Done differed between platforms; "Switching branch" had no back button on Android. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ist header The workspace shell (tabs, dock, toolbars, root screens) sat in features/workspace, so its legitimate platform branches looked like feature code. Home's thread list and the iPad sidebar each built the same brand, search and filter header from raw native options. - features/workspace moves to features/layout/workspace, with the Android pull request app bar. - WorkspaceListHeader draws the list header from typed data on both platforms; brand-title options, sidebar header items and the split empty detail move into the shell. Home and the sidebar share one filter menu definition. - docs/internals/mobile-layout.md describes route presets, the shell's location and the AppBar/inset contract. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…r falls back to another account (pingdotgg#31646) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ce (pingdotgg#31670) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
… it (pingdotgg#31651) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…1654) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: UtkarshUsername <putkarsh184@gmail.com>
…0623) Co-authored-by: UtkarshUsername <putkarsh184@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…31059) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…g#31642) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
…er calls on Android (pingdotgg#31188)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net>
pingdotgg#28487) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
pingdotgg#31251) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ocal on every lexer call (pingdotgg#31187)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
…#30453) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
…ingdotgg#30546) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…gdotgg#27699) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…dotgg#27682) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net>
…#19659) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> Co-authored-by: Yash Singh <saiansh2525@gmail.com> Co-authored-by: Honey Paptan <hpaptan@gmail.com>
…ngdotgg#19660) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Yash Singh <saiansh2525@gmail.com>
Remove Cursor CLI credential and macOS Keychain fallbacks for account usage and limits, including their settings and web/mobile prompts. Preserve usage through the Cursor SDK sign-in, CURSOR_API_KEY exchange, and explicit auth tokens for limits. Verified focused Cursor tests and full CI on the final head. The scope and intended loss of usage for CLI-only environments were explicitly approved by the maintainer. Model: GPT 6.1 Sol. Harness: Codex through T3 Code.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…gdotgg#32401) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…d Escape to the PTY (pingdotgg#32666) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…#27941) Co-authored-by: Orin <orin@orin.ws> Co-authored-by: maria-rcks <maria@kuuro.net>
…s the thread (pingdotgg#28454) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…gg#27541) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…etails card (pingdotgg#27582) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…in folders (pingdotgg#25883) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…gdotgg#32777) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…#32266) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…g#28255) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…tgg#26737) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net>
…ges (pingdotgg#32833) Agents can pass `path` to an absolute .html file instead of retyping the page as inline `html`. The server reads the file only for full-access threads, with the existing disk-read guards, and snapshots it at publish. ACP render recovery matches path calls by path. The mcp-tool-use eval grades pages passed by path. Takes over pingdotgg#32817. Co-authored-by: Stoli Geyer <stoli@tractorbeam.ai> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…otgg#32242) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Resolve 25 conflicts, port fork code to upstream's split Effect crypto modules and refactored MCP transport, mobile AppBar header and settings filter, and refresh the agent context budget. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What's new from upstream
New features
Providers
kiro-cliorKIRO_API_KEYand needs CLI 2.27.0+. (feat(provider-kiro): add Kiro as an ACP provider pingdotgg/t3code#14693)effort: "ultracode"selections still map to xhigh with Ultracode on. (feat(claude): Ultracode works with any effort, like Claude Desktop pingdotgg/t3code#27034)ANTHROPIC_BASE_URLwith gateway model discovery), not only the bundled catalog. (feat(server): list Claude models reported by Claude Code pingdotgg/t3code#30511)run-workflow/SKILL.mdinto the project. (feat(antigravity): runtime 1.4.5 with real turn failures and subagent work pingdotgg/t3code#28629)t3-codetoagy acp1.5.1+, which offers every account model to any ACP client; older runtimes keep thezedclient name. (feat(antigravity): identify as T3 Code to agy acp 1.5.1+ pingdotgg/t3code#31158)binaryPathaccepts theagyCLI, resolvesagy.exe/agy.cmdon Windows, and launches mise/aqua/volta shims by the name they were called with. (feat(antigravity): support agy CLI as custom binaryPath pingdotgg/t3code#32503)ui://resource and the session implementsmcpApps.listTools,callToolandreadResource. (feat(server): render MCP Apps from Claude tool calls pingdotgg/t3code#29803)Threads and sessions
message.dispatchtakesfreshContext, which starts a new provider conversation inside the same T3 thread with no context handoff and acts as a boundary for later resumes and handoffs. (feat(server): sends can start a fresh provider session pingdotgg/t3code#30323)/cleararms a fresh session for the next message on web, desktop and mobile, shows a New session divider, and is available to agents throught3_thread_send. (feat: /clear starts a fresh session in the same thread pingdotgg/t3code#30325)threadMode(new_thread,continue,fresh_session) with a Destination picker in Settings on web and mobile;schedule_tasktakesfreshSession. (feat: scheduled tasks can run in one thread with a fresh session each run pingdotgg/t3code#30326)thread.tag.setcommand, andhiddenThreadTagsinsettings.jsonhides tagged threads from the UI (for recording) while they keep running. No tag UI yet. (feat: tag threads and hide tagged threads while recording pingdotgg/t3code#29053)https://app.t3.codes/threads/<environmentId>/<threadId>, which opens the thread from anywhere and renders as an in-app thread chip on every client. (feat(server,web,mobile,desktop): Copy thread copies a link that opens the thread pingdotgg/t3code#26290)/threads/*. (feat(mobile,web): copied thread links open the mobile app pingdotgg/t3code#29815)sidebarAutoSettleAfterDays) moves from 3 to 7 days; explicit values, including off, are kept. (feat: auto-settle inactive threads after 7 days by default pingdotgg/t3code#32325)stopOnSettleto close their terminal and child processes when the thread settles; the repository's Dev action enables it. (feat(server): stop opted-in project actions when threads settle pingdotgg/t3code#31857)Voice
Secrets and policy
agentToken, AntigravityapiKeyand OpenCodeserverPasswordaccept secret references too. (feat(settings): Simlock, Antigravity and OpenCode credentials can come from a secret provider pingdotgg/t3code#31652)request_secretinstead of asking in chat: on Claude the tool is loaded up front rather than hidden behind ToolSearch, and pasted secrets are not copied into child briefs. (feat(server): agents ask for secrets through request_secret instead of chat pingdotgg/t3code#30257)t3 policy templates <dir>writes Windows ADMX/ADML Group Policy templates so admins can set managed policy from Group Policy or Intune. (feat(policy): admins set managed policy from a Group Policy template pingdotgg/t3code#29862)Pull requests and source control
@usermentions using the existingpullRequests.filterOptionsauthors search. (feat(pull-requests): PR composers complete @user mentions pingdotgg/t3code#30747)#123issue and PR references, plus!123on GitLab, through a newreferenceskind onpullRequests.filterOptions. (feat(pull-requests): PR composers complete #123 and GitLab !123 references pingdotgg/t3code#30857)allow_collaboration), editable only by the author with push access. (feat(gitlab): merge requests from forks can toggle maintainer edits pingdotgg/t3code#30518)#12,!12, commit SHAs and@userreferences on web and mobile. (feat(gitlab): link issue, merge request, commit and user references pingdotgg/t3code#30524)<base>/<host>/<owner>/<repo>(ghq layout), avoiding name collisions between forks. Web: Settings → Threads; mobile: Settings → Source control. (feat: optionally clone repos into ghq-style <host>/<owner>/<repo> folders pingdotgg/t3code#24904)Web, desktop and mobile
/side <question>(or/btw) forks the thread into a side chat and opens it, under the same rules as web. (feat(mobile): start side chats with /side pingdotgg/t3code#31709)html_previewandhtml_renderaccept apathto a local.htmlfile (full-access threads only), so agents stop retyping whole pages. (feat(server): html tools take a file path, so agents stop retyping pages pingdotgg/t3code#32833)prefers-reduced-motion. (feat(web): celebrate a GitHub star with confetti pingdotgg/t3code#29987)provider.turn.completedandprovider.request.completedincludeserviceTier(standard, flex, fast, ultrafast). (feat(server): log fast and ultrafast service tiers in analytics pingdotgg/t3code#29348)Bug fixes
Providers and agents
thread/resumefailure; the active-writer error is now reported as thread in use. (fix(server): Codex threads open in another client are no longer silently replaced pingdotgg/t3code#21045)codexErrorInfocode (for examplemodelNotFound) stayedrunningforever because the notifications failed to decode; they now end the run. (fix(server): Codex turns that fail with an unlisted error code no longer stay running pingdotgg/t3code#28040)claudeprocesses inherited the launching Claude Code session's variables andELECTRON_RUN_AS_NODE=1, which broke Electron apps started by Claude; those variables are now stripped. (fix(server): Claude threads no longer join the Claude session that launched T3 pingdotgg/t3code#29169) (fix(server): Claude's commands no longer run Electron apps as Node pingdotgg/t3code#29413)claude update(compared against npm), and npm installs under~/.localwere offered native updates. (fix(server): native Claude updates use the native release feed pingdotgg/t3code#27958) (fix(provider-core): npm-installed Claude in ~/.local gets npm updates pingdotgg/t3code#27957)write after endunhandled rejection calledprocess.exit(1)and took down the whole server; it is now tolerated. (fix(cursor): a write-after-end in the Cursor SDK no longer stops the server pingdotgg/t3code#27703)/compacton Cursor sent/compressas plain chat text and never compacted; it now calls the SDK'sagent.summarize(). (fix(cursor): /compact compacts with the SDK's summarize pingdotgg/t3code#29398)recentbroke rollback and every send in forks of compacted threads. (fix(opencode): decode compaction history from OpenCode 2.1 pingdotgg/t3code#22661) (fix(opencode): forks from compacted threads no longer fail pingdotgg/t3code#29221)$skillmentions before its directory scan finished, rejected~/binary paths, and showed tools stopped mid-run as failed instead of interrupted. (fix(server): OpenCode no longer drops a $skill read before its directory scan ends pingdotgg/t3code#29535) (fix(opencode): expand home-relative executable paths pingdotgg/t3code#29326) (fix(opencode): tools stopped mid-run show as interrupted, not failed pingdotgg/t3code#29762)/compactrefused by the host wedged the thread so every later message failed; the refusal now ends its own turn with the host's reason. (fix(muse): a declined /compact reports its reason and no longer wedges the thread pingdotgg/t3code#28454)/git/commitwere sent to the model as plain text; both the 1.x and 2.x adapters now run them throughsession.command. (fix(opencode): nested custom commands like /git/commit run as commands pingdotgg/t3code#29765)t3_thread_readtold agents they succeeded. They are now stored as failed. (fix(opencode): a command that exits non-zero is stored as failed, not completed pingdotgg/t3code#29824)/api/eventsubscription that never returned headers could hold session open for about five minutes. It now times out after 10 s and retries. (fix(opencode): fail stalled event subscriptions promptly pingdotgg/t3code#30201)session/promptkept threads working indefinitely. A 15-minute inactivity deadline now fails the turn and the next message starts a fresh runtime. (fix(acp): time out silent Antigravity prompts pingdotgg/t3code#30377)<none>or full result JSON. Antigravity, OpenCode and Claude now show the actual error. (fix(server): Antigravity text generation shows sign-in and setup errors pingdotgg/t3code#29823, fix(opencode): text generation errors explain known provider failures without raw provider text pingdotgg/t3code#29877, fix(server): failed Claude text generation shows Claude's error instead of raw JSON pingdotgg/t3code#30331)gpt-6-luna. Text generation now falls back to a model the account lists. (fix(server): Codex titles no longer fail on ChatGPT accounts without gpt-6-luna pingdotgg/t3code#30078)gpt-5-codex) silently ran a different built-in model. The exact pick is now kept. (fix(web): picking a custom model named like a Codex alias keeps that model pingdotgg/t3code#29789)--offline. (fix(pi): short-lived Pi processes no longer lose rotated OAuth tokens pingdotgg/t3code#30187)t3 acp-mcp-bridge, and child sessions dropped streamed tool output. Both are fixed, and ACP agents now getT3CODE_THREAD_ID. (fix(server): ACP MCP bridge no longer splits messages on U+2028/U+2029 pingdotgg/t3code#30719, fix(acp): retain streamed child tool output pingdotgg/t3code#32411, fix(server): ACP agents get T3CODE_THREAD_ID like Claude and Codex sessions pingdotgg/t3code#30361)Threads and orchestration
commandIdon different threads both reported success while only one applied; the loser now fails with a conflict. (fix(server): a command id reused for two threads at once no longer succeeds for both pingdotgg/t3code#18385)running, stalling queued work behind it. (fix(server): changing a task's wake policy no longer reverts a checkpointed parent run pingdotgg/t3code#25662)LiveStreamBufferError; superseded updates are now coalesced on arrival. (fix(server): coalesce tool output before it fills the live buffer pingdotgg/t3code#16317).gitignorefrom the reverted turn had been hiding, such asnode_modulesand.env. They are now removed. (fix(server): reverting files removes what a new .gitignore from the turn was hiding pingdotgg/t3code#29795)/side,/btw) started as Supervised from Full access threads. They now inherit the parent composer's permission mode, model and reasoning level. (fix(threads): side chats inherit parent permissions by default pingdotgg/t3code#31114, fix: side chats start with the parent's permission mode and reasoning level pingdotgg/t3code#32315)t3/<hex>branch behind. Both are now removed. (fix(server): clean up child worktrees after their parent settles pingdotgg/t3code#30026, fix(server): cancelling worktree setup no longer leaves its new branch behind pingdotgg/t3code#29781)orchestrator_capabilitiesoffered providers the project had turned off, andt3_worktree_handoffignored the project's start-from-origin override. Both now follow project settings. (fix(server): orchestrator_capabilities no longer offers providers the project turned off pingdotgg/t3code#29842, fix(server): worktree handoff follows the project's start-from-origin setting pingdotgg/t3code#29810)Web and desktop
statev2.sqliteand provider agents. (fix(desktop): quit no longer orphans a backend that is slow to stop pingdotgg/t3code#22572).deband AppImage installed files any local user could overwrite; group and other write access is now removed. (fix(desktop): Linux .deb no longer installs files any local user can overwrite pingdotgg/t3code#28351)selection.options.map is not a function). Those drafts now load. (fix(web): drafts saved by older versions load instead of being wiped pingdotgg/t3code#29828)origin/masterno longer produces unexplained huge totals. (fix(web): show the comparison base beside Changes totals pingdotgg/t3code#30085)[ ] ( ) @ + $. Links are now checked against the filesystem and kept whole. (fix(web): validate terminal links against filesystem metadata pingdotgg/t3code#30526, fix(web): terminal links keep route and pnpm paths in one piece pingdotgg/t3code#30603)**in the rich composer could not be selected or deleted. They are now editable. (fix(web): make styled composer Markdown markers editable pingdotgg/t3code#30421)Mobile
Server, remote and auth
.git/configpinned libuv threads and hung the whole server; Windows startup hung on a PowerShell stuck in the kernel. (fix(server): agent session scans no longer hang the server on an unreadable .git/config pingdotgg/t3code#23690) (fix(server): startup no longer hangs on a shell stuck in the kernel pingdotgg/t3code#27938)t3 service installmoved a--base-dirservice onto an empty~/.t3, hiding all projects; it now refuses. (fix(server): t3 service install no longer moves a --base-dir service onto an empty ~/.t3 pingdotgg/t3code#23878)t3 service restart. (fix(connect): show why relay unlink failed pingdotgg/t3code#25198) (fix(server): T3 Connect not-linked fix no longer tells Desktop users to run t3 service restart pingdotgg/t3code#27660)tailscale servecommands now escalate to SIGKILL. (fix(server): defer Tailscale endpoint discovery during startup pingdotgg/t3code#29432) (fix(tailscale): escalate hung serve commands to SIGKILL pingdotgg/t3code#28529)preview_openturnedmailto:alice@example.cominto an https URL with credentials; non-web schemes are now rejected. (fix(shared): preview_open reports about: and mailto: as unsupported instead of misreading them pingdotgg/t3code#29614)t3 service uninstall --base-dir <test home>stopped and removed the service for the real~/.t3. It now refuses when the unit serves another home. (fix(server): t3 service uninstall leaves another T3 home's service alone pingdotgg/t3code#29872)t3 connect unlinkafter a crash could send a freshrelay:writetoken to whatever process now held the port. It now checks the recorded server is still alive. (fix(cli): t3 connect unlink no longer warns about a server that is gone pingdotgg/t3code#30324)GH_TOKENorgh, running as another account. It now fails with a clear error. (fix(server): a saved source control token that can't be read no longer falls back to another account pingdotgg/t3code#31646)t3 updateand remote self-update now use the policy's mirror. Kiro is covered, observability locks are refused rather than ignored, and a policy that blocks startup no longer suggests another release. (fix(server): t3 update installs from the policy's update mirror pingdotgg/t3code#29911, fix(server): managed policy covers Kiro pingdotgg/t3code#29915, fix(server): a policy that manages observability endpoints is refused instead of ignored pingdotgg/t3code#30973, fix(desktop): a policy that stops startup no longer points at another release pingdotgg/t3code#30319)preview_openwhose first load failed, or a tab that failed during setup, left hidden tabs behind. A console line with an emoji broke thehtml_previewJSON for Codex and Grok. (fix(server): a preview_open whose first load fails no longer leaves a hidden tab behind pingdotgg/t3code#29865, fix(server): preview tabs that fail during setup no longer leave their page open pingdotgg/t3code#29885, fix(server): html_preview no longer splits an emoji in a long console line pingdotgg/t3code#29844)Source control
git worktree addleft its new branch behind, and forcingLC_ALL=Cbroke git hooks needing UTF-8. (fix(server): a failed worktree add no longer leaves its new branch behind pingdotgg/t3code#28373) (fix(server): git hooks keep the user's locale pingdotgg/t3code#27778)log.showSignature,color.ui=alwaysanddiff.suppressBlankEmptycorrupted turn diffs, changed files and generated commit and PR text. (fix(server): turn diffs keep signed commits' files under log.showSignature pingdotgg/t3code#29124) (fix(server): generated commit and PR text no longer reads colored git output pingdotgg/t3code#29126) (fix(server): generated commit and PR text ignores git signature output pingdotgg/t3code#29580) (fix(server): diffs keep blank context lines under diff.suppressBlankEmpty pingdotgg/t3code#29579)github.com:owner/reporemotes got no provider. (fix(server): an upstream shadowed by a local origin/<branch> branch keeps its real remote pingdotgg/t3code#29180) (fix(server): status no longer fetches a remote named after a local tracked branch pingdotgg/t3code#29670) (fix(source-control): remotes like github.com:owner/repo reach their host pingdotgg/t3code#29457)core.safecrlf=truebroke turn checkpoints and new project creation, and Git messages in the system language broke lock-retry detection. Both are handled. (fix(server): turn checkpoints keep LF files when core.safecrlf is true pingdotgg/t3code#29826, fix(server): new projects are created when core.safecrlf refuses LF files pingdotgg/t3code#29843, fix(server): git failures are read in English when macOS git follows the system language pingdotgg/t3code#32252)diff.submodule=log, changes outside a subfolder underdiff.relative, and untracked files outside a sparse cone were missing or broke review. All three now work. (fix(server): diffs keep submodule changes under diff.submodule=log pingdotgg/t3code#29852, fix(server): commits and PR text see changes outside a subfolder project under diff.relative pingdotgg/t3code#29879, fix(server): review diffs keep working with untracked files outside the sparse cone pingdotgg/t3code#29880)#. (fix(azure-devops): a fork's same-named branch no longer hides the branch's own pull request pingdotgg/t3code#29817, fix(azure-devops): existing pull requests are found for branches containing # pingdotgg/t3code#31928)post-checkouthooks, such as git-lfs and husky. (fix(server): review guides no longer fail on the repository's checkout hooks pingdotgg/t3code#29907)glab mr acceptis detected. (fix(gitlab): the checks and review list filters work pingdotgg/t3code#30433, fix(gitlab): merge messages drop agent credits pingdotgg/t3code#30441, fix(gitlab): merge requests can delete their source branch pingdotgg/t3code#30453, fix(gitlab): merge requests can edit their labels pingdotgg/t3code#30483, fix(gitlab):glab mr acceptcounts as a shell merge pingdotgg/t3code#32400)216 smaller fixes are not listed individually; see the commit list for the full set.
Other notable changes
Performance: server startup and recovery
Performance: memory and storage
t3 --versionandt3 statusno longer load the server and Claude SDK. (perf(cli): short commands like t3 --version no longer load the whole server pingdotgg/t3code#29127)Performance: pull requests
Performance: streaming and clients
Performance: providers and processes
conhost.exe; diff previews skip unused repository lookups; Linux uses/procinstead oflsoffor port discovery and terminal process checks. (perf(server): Windows git reads no longer start a console host pingdotgg/t3code#19288, perf(server): loading a file's diff skips unused repository lookups pingdotgg/t3code#29115, perf(server): avoid lsof polling when Linux proc is usable pingdotgg/t3code#30011, perf(resource-monitor): Linux terminal process checks use a third of the CPU pingdotgg/t3code#30381)Refactors
AppBar, one<Inspector>column, pane bars draw their own sidebar toggle, Android's sidebar is the Home route, and inspector bars useAppBar. Documented indocs/internals/mobile-layout.md. (refactor(android): every header goes through AppBar, so the filter stays put pingdotgg/t3code#26741, refactor(mobile): one inspector column, declared with <Inspector> pingdotgg/t3code#27085, refactor(mobile): a pane's bar draws its own sidebar toggle pingdotgg/t3code#27086, refactor(mobile): Android's sidebar is the Home route in the sidebar column pingdotgg/t3code#27087, refactor(mobile): the inspector's bar is its pane's AppBar pingdotgg/t3code#27205, docs(mobile): the five layers of the mobile layout, with x-ray diagrams pingdotgg/t3code#27107)josereplaced byeffect/jose, HMAC and keys byeffect/crypto, tokens signed throughPayloadSigner, signing keys held inEnvironmentSigningKey/CloudMintSigner, and DPoP proofs shared inclient-runtime. (refactor: replace jose with effect/jose pingdotgg/t3code#30474, refactor: move HMAC, key, and random work to effect/crypto pingdotgg/t3code#30501, refactor(server): sign server tokens through PayloadSigner pingdotgg/t3code#30523, refactor: hold relay signing keys in EnvironmentSigningKey and CloudMintSigner pingdotgg/t3code#30529, refactor(client-runtime): share DPoP proof creation across web and mobile pingdotgg/t3code#30540)Schema.TaggedErroreverywhere,Effect.trycalls map to typed errors, and env reads go throughConfig/HostProcess.Environment. (refactor: errors are Schema.TaggedError, not Data.TaggedError or native Error pingdotgg/t3code#31216, refactor: Effect.try calls map failures to typed errors pingdotgg/t3code#31217, refactor: Effect code reads env through HostProcess.Environment pingdotgg/t3code#31218)ProviderRegistry.invalidateModelCachestakes over model cache invalidation from thews.tshandler. (refactor(server): provider registry owns explicit model cache invalidation pingdotgg/t3code#19599)Build and dependencies
X-Forwarded-Protohandling behind TLS proxies and the PR cache key format. (chore(deps): upgrade Effect to 4.1.2 and alchemy to beta.85 pingdotgg/t3code#26833)effect-tsgo tsrsfrom@effect/tsgo, replacing@tsc-rs/typescript; mobile now runs Effect rules and clean suggestion rules are locked as errors. (build: typecheck with tsrs and Effect's rules through @effect/tsgo pingdotgg/t3code#31028, build: run Effect rules on mobile and lock in clean suggestion rules pingdotgg/t3code#31111)vpr sync:reposuses shallow clones, so foreign upstream tags no longer break fetches;.repos/effect-smolis renamed.repos/effectand synced to 4.1.2. (chore(repos): sync reference repos from shallow clones pingdotgg/t3code#30472, chore(repos): sync Effect 4.1.2 and Alchemy beta.85, rename effect-smol pingdotgg/t3code#30481)knip:checkruns its two passes in parallel (34 s to 26 s), and the built web boot check moves from Test Web to Build and Typecheck. (perf(dev): knip:check runs its two passes side by side (34 s → 26 s median on 4 CPUs) pingdotgg/t3code#30737, perf(ci): boot the built web client in Build and Typecheck, not Test Web (about 22 s off the longest job) pingdotgg/t3code#30752)Reverts
Docs
docs/user/secrets.md); Linux desktop install steps; managed-policy guidance on pinning absolutebinaryPaths and on old background services' LAN access; recurring-task MCP tools documented. (docs(user): explain secret providers and secret requests pingdotgg/t3code#31654, docs: explain Linux desktop installation pingdotgg/t3code#30819, docs: pin an absolute binary path under a permission cap pingdotgg/t3code#29916, docs: scope managed-policy LAN note to old background services pingdotgg/t3code#30900, docs(mcp): document existing recurring-task tools pingdotgg/t3code#23199)Merge details
Commits merged: 677 upstream commits (
origin/main..upstream/main, up todff0b1159b), 667 of them from upstream PRs. Merge commit onsync/upstream-2026-11-08.Conflicts (25 files) and how each was resolved
Server
apps/server/src/bin.ts: upstream moved the CLI fast paths intobinMain.tsbehind a new service launcher. Took upstream'sbin.tsand moved the fork'sskills-clifast path intobinMain.ts.apps/server/src/mcp/McpHttpServer.ts: upstream'slayerMcpTransportnow takes the tool registrations and addslayerInProcessMcpServer. Kept the fork's Docs, AI PM, MCP servers, skill trash and skill library toolkits and the/mcp/upstream/:serverIdroute; they are now passed intolayerMcpTransport(...)with upstream's tools, and the upstream route is merged beside it.apps/server/src/ws.ts: upstream added a settings-client argument tolayerWsRpc; applied it to the fork's chain that merges the fork RPC layers. Upstream also renamed the request URL variable, so the MCP OAuth origin now readsurl.value.origin.apps/server/src/serverSettings.ts: kept the fork's MCP secret redaction inside upstream's newredactServerSettingsForClient(settings, client)signature, and the fork's patch-builder form ofupdateAndPersistSettingsinside upstream's echoed-secret-reference restore.apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts: took upstream's archived-thread retry forthread/fork, with the fork's effectfulthreadRuntimeParams(user MCP servers) in the sharedforkrequest.apps/server/src/provider/agentContextBudget.json: re-measured. New values: Claude append 7064, Codex context 8790, MCP tool list 51163 bytes.serverSettings.test.ts,ProviderSessionManager.test.ts,runtimeLayer.test.ts,mcp/toolkits/project/handlers.test.ts): kept both sides' tests and imports; fork redaction tests pass{ secretReferences: true }.Packages
packages/contracts/src/settings.ts: kept the fork's MCP server and disabled-skills settings beside upstream's speech settings, and both scope rules (fork: project MCP servers need provider scope; upstream: removing a secret provider needs settings scope).packages/provider-core/src/server/orchestrationInstructions.ts: combined the secret line. Upstream's wording ("A login, token, PIN or pairing code only the user can give... Not for access you have") plus the fork'ssecretRef,delivery: "file"and/secret NAMEbutton guidance. Kept the fork's thread-link fallback.packages/provider-opencode/src/server/v2/adapter.ts: upstream replacedCryptowithDigest; ported the fork's upstream-hub and user MCP prefix helpers toDigest.sha256.packages/shared/src/toolOutput.ts: kept the fork'sdocOpenFromToolItemand upstream'spreviewRecordingIdFromToolItem, and both imports.Web
ChatView.tsx: upstream wrapped the composer in a new container and re-indented it; took upstream's layout and re-added the fork'sskillsProjectIdprop.Sidebar.tsx: kept the fork's folder-aware project-scope rows (checkbox plus favicon) over upstream'sProjectScopeRowIcon, which the fork removed. Applied upstream'slegacySidebarEnabledcondition to the new-thread hint while keeping the fork's single-project-scope check.shortcuts/chatRouteCommands.ts: took upstream'slegacySidebarEnabled-only condition; keptsettingsfor the fork's scoped new-thread lookup.chat/ChatComposer.tsx,composer-logic.ts: kept the fork's/secretcommand and upstream's new/clearcommand.settings/settingsSearch.ts: kept the fork's "Usage limit failover" entry; dropped "Cursor account usage" because upstream removed it (fix(cursor): use the SDK account for usage data pingdotgg/t3code#32448).reopenClosedView.tsand its test: kept both imports; kept the fork's AI PM restore test and took upstream's rewritten file-tab tests.routeTree.gen.ts: regenerated with the TanStack router generator so the fork's/ai-pm,settings/tools,settings/mcp-serversroutes and upstream's new routes are all present.Mobile
ThreadHeader.tsx,ThreadGitControls.tsx: upstream rewrote the thread header as oneAppBaron both platforms (refactor(mobile): the inspector's bar is its pane's AppBar pingdotgg/t3code#27205 and the mobile AppBar refactors). Took upstream's versions and re-added the fork's Docs button as anAppBaraction shown whenonOpenDocsCloudis set.Changes needed beyond the conflict markers
effect/Crypto. Ported six fork server modules: random IDs and bytes now useSecureRandom(McpServerOAuth,McpServerRegistry,DocCommentsService,SkillTrash), hashes useDigest(DocCommentDelivery,SkillLibrary). Fork tests now provideNodeCrypto.layernext toNodeServices.layer.SettingsEnvironmentFilterHeaderandSETTINGS_PAGE_OPTIONS. The fork's MCP servers settings screen now usesuseSettingsEnvironmentMenu()andsettingsPage("MCP servers").WsRpcGroup.omit(...FORK_RPC_METHODS)(exported fromws.ts), as the fork's other ws tests do. The fork's Claude user-tools test stub gained the four new query-session methods and usesrandom:instead ofcrypto:. The fork docs-tool tests uselayerInProcessMcpServer.main: shortened four over-long comments (SkillLibrary.ts,SkillTrash.ts,DocCommentDelivery.ts), removed nine per-test timeouts inSkillLibrary.test.ts(the project timeout is already 120 s), and added twoprocessEnvInEffectexemptions inChatCommandRunner.test.ts.Judgment calls worth a look
t3_project_folders_list(added in feat: group sidebar projects into folders #92) is read-only but was missing fromCLAUDE_READ_ONLY_T3_MCP_ALLOWED_TOOLS, so the allowlist test failed. Added it.ChatMarkdown.browser.test.tsxexpectedonRunShellCommand("echo hello"), but the fork's run-code-block feature passes"terminal"as the target. This also failed on the fork'smain. Updated the assertion.[title](t3-thread://v1/<id>)fallback, which upstream dropped in favour of always usinglink.Verification
node scripts/fork-brand.ts --check: passes (branding applies cleanly to 202 files).vp run typecheck: passes inapps/server,apps/web,apps/mobile,packages/contracts,packages/shared,packages/provider-core,packages/provider-opencode,packages/client-runtime.ServerEnvironment.test.ts"publishes proven install ownership": a known upstream failure on macOS.OpenCode2OrchestratorV2.integration.test.ts: 6 tests fail with a replay mismatch (event.subscribesent beforesession.create). The same 6 fail on the fork's currentmain(8a16b90e6e), and all pass on pristine upstream, so this predates the merge and comes from the fork's OpenCode MCP changes. Not fixed here.apps/desktopupdate tests could not run: Electron is not installed in this worktree. This is an environment issue.Not done
vp run check:changedand repo-wide checks were not run. Againstmain, the diff covers the whole 677-commit merge.Model and harness: Claude Opus 5.5 (
claude-opus-5-5) in Claude Code, run from T3 Code.🤖 Generated with Claude Code