Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
2763 commits
Select commit Hold shift + click to select a range
dfbafee
fix(server): side chat and merge-back context no longer cut an emoji …
saphid Nov 3, 2026
a5e7e5b
perf(server): loading a file's diff skips unused repository lookups (…
Yuruzuu Nov 3, 2026
87e13d3
fix(cli): make relative install homes produce working commands (#29241)
voltcrash Nov 3, 2026
c3cfb5e
fix(forgejo): dismissed reviews no longer read as requested changes o…
saphid Nov 3, 2026
efcb937
fix(shared): Linux file links preserve literal backslashes (#29245)
voltcrash Nov 3, 2026
5349ecb
fix(gitcafe): PR link previews show a GitHub-merged pull request as m…
saphid Nov 3, 2026
ba962f2
fix(codex): restoring a checkpoint works after the Codex session was …
saphid Nov 3, 2026
cf48ea8
perf(acp): ACP agents skip decoding output twice for unused diagnosti…
Yuruzuu Nov 3, 2026
35af849
fix(server): diffs keep blank context lines under diff.suppressBlankE…
saphid Nov 3, 2026
f639c15
fix(scripts): check:changed passes when only lint-ignored code change…
saphid Nov 3, 2026
a6a921c
perf(client): streamed row updates no longer rescan question history …
Yuruzuu Nov 3, 2026
5eb8154
perf(desktop): keep Linux MIME helpers off the startup path (#29247)
voltcrash Nov 3, 2026
e051363
perf(server): shell updates read a burst of threads once (#29101)
Yuruzuu Nov 3, 2026
ae1ccb1
fix(opencode): forks from compacted threads no longer fail (#29221)
voltcrash Nov 3, 2026
8cebee4
fix(scripts): check:changed lints Astro components and runs knip for …
saphid Nov 3, 2026
e72a0c7
fix(desktop): Linux .deb no longer installs files any local user can …
shivamhwp Nov 3, 2026
9f63268
fix(desktop): native builds prepare server bytecode again after the E…
maria-rcks Nov 3, 2026
30b9c4a
fix(codex): a background command's wake no longer hangs when its outp…
saphid Nov 3, 2026
07846fc
test(scripts): expect the unmatched-pattern flag in the Astro check:c…
maria-rcks Nov 3, 2026
927a2c6
fix(mobile): drafts on threads with colons in their ids upload attach…
juliusmarminge Nov 3, 2026
d0f5ae6
fix(server): provider refresh no longer reverts an enriched sign-in s…
juliusmarminge Nov 3, 2026
ff73c4c
fix(server): forked Claude threads keep their compaction chain (#27577)
juliusmarminge Nov 3, 2026
709cfb3
fix(server): Claude subagents left by a stopped process no longer sta…
juliusmarminge Nov 3, 2026
95414cf
fix(server): usage-limit auto-resume no longer arms children of settl…
juliusmarminge Nov 3, 2026
727a502
fix(cursor): a write-after-end in the Cursor SDK no longer stops the …
juliusmarminge Nov 3, 2026
65aaf97
fix(server): avoid reparsing streamed replies for timestamps (#25252)
juliusmarminge Nov 3, 2026
f2513bd
fix(web): project settings can set a checkout's grouping rule again (…
juliusmarminge Nov 3, 2026
42ca7c0
fix(server): reject oversized goal objectives before dispatch (#23033)
juliusmarminge Nov 3, 2026
07a1e79
fix(server): checkpoints no longer rehash every file when one entry i…
juliusmarminge Nov 3, 2026
e0f69e9
fix(web,mobile): chat images reload when the agent rewrites the file …
juliusmarminge Nov 3, 2026
e1e520c
fix(web): show the project pin before the remote badge (#29704)
maria-rcks Nov 3, 2026
84547b9
fix(server): Codex usage keeps requests from interrupted turns (#29415)
juliusmarminge Nov 3, 2026
1436c45
fix(client-runtime): connect to the primary environment while the bro…
juliusmarminge Nov 3, 2026
48c8cf7
fix(server): a failed worktree add no longer leaves its new branch be…
juliusmarminge Nov 3, 2026
8c9945d
fix(provider-acp): Kiro's html_render pages show in the thread (#28253)
juliusmarminge Nov 3, 2026
f80be8e
fix(server): streamed Browser clicks no longer wait behind queued whe…
juliusmarminge Nov 3, 2026
997e3f3
fix(server): Codex turns that fail with an unlisted error code no lon…
juliusmarminge Nov 3, 2026
503488d
fix(opencode): sessions open through OpenCode 2 after an in-place upg…
juliusmarminge Nov 3, 2026
607e373
fix(server): T3 Connect not-linked fix no longer tells Desktop users …
juliusmarminge Nov 3, 2026
371e945
fix(server): anchor Claude wake cooldowns to result arrival (#25061)
juliusmarminge Nov 3, 2026
16fd1a4
fix(web): match new-thread hero to selected checkout (#25064)
juliusmarminge Nov 3, 2026
d3d7f03
fix(server): stop PR lookups in emptied worktree folders (#24803)
juliusmarminge Nov 3, 2026
71a7bf9
fix(server): agent session scans no longer hang the server on an unre…
juliusmarminge Nov 3, 2026
371c9a9
docs(connect): held webhooks are kept per managed link (#23612)
juliusmarminge Nov 3, 2026
0ad3dc1
fix(server): delegated children keep replies after their parent settl…
juliusmarminge Nov 3, 2026
6e58094
fix(preview): explain invalid URLs and locators (#23396)
juliusmarminge Nov 3, 2026
296b089
fix(web): terminal controls no longer cover the first line (#23373)
juliusmarminge Nov 3, 2026
93a3e8f
fix(server): stop maintaining the unused event correlation index (#23…
juliusmarminge Nov 3, 2026
46212dd
docs(mcp): document existing recurring-task tools (#23199)
juliusmarminge Nov 3, 2026
c0ec87a
fix(server): release the previous session when sending to another ins…
juliusmarminge Nov 3, 2026
692dd9c
fix(claude): a background-task wake run no longer hangs after a user …
maria-rcks Nov 3, 2026
78aee8a
fix(server): OpenCode no longer drops a $skill read before its direct…
juliusmarminge Nov 3, 2026
b492e28
fix(server): coalesced webhook runs use the prompt saved before dispa…
juliusmarminge Nov 3, 2026
d5afb1a
fix(server): slow forge CLI calls no longer delay checkpoints and tur…
juliusmarminge Nov 3, 2026
0c863d6
fix(relay): T3 Connect repairs tunnel ingress that drifted from a mat…
juliusmarminge Nov 3, 2026
6f4bc77
fix(provider-core): npm-installed Claude in ~/.local gets npm updates…
juliusmarminge Nov 3, 2026
acd2db9
fix(server): git hooks keep the user's locale (#27778)
juliusmarminge Nov 3, 2026
18ac394
fix(pi): hold messages until compaction ends (#24388)
juliusmarminge Nov 3, 2026
fd63914
fix(server): show why Claude refuses full access as root (#23804)
juliusmarminge Nov 3, 2026
10f3657
fix(server): preview click timeouts identify the target (#23489)
juliusmarminge Nov 3, 2026
30767c2
fix(cursor): supporting files no longer hide sibling skills (#23326)
juliusmarminge Nov 3, 2026
689bdb8
fix(web): usage-limit retry notice shows the timezone (#23029)
juliusmarminge Nov 3, 2026
bb221f0
fix(server): preserve nested Claude subagent completion across turns …
juliusmarminge Nov 3, 2026
c3e1e0a
fix(opencode): publish ordered pending-work snapshots (#21460)
juliusmarminge Nov 3, 2026
53e168f
fix(opencode): decode compaction history from OpenCode 2.1 (#22661)
juliusmarminge Nov 3, 2026
3e1e776
fix(server): import valid conversations within each transcript record…
juliusmarminge Nov 3, 2026
61c3794
fix(server): imported Claude sessions resume on their first turn (#23…
juliusmarminge Nov 3, 2026
5d3d78a
feat(web): ask for a GitHub star when idle, and star in one click (#2…
t3dotgg Nov 3, 2026
e2bb9e6
fix(server): subagent questions reach a busy parent agent (#29909)
t3dotgg Nov 3, 2026
cefb544
feat(web): celebrate a GitHub star with confetti (#29987)
t3dotgg Nov 3, 2026
8be19ed
fix(pi): short-lived Pi processes no longer lose rotated OAuth tokens…
astarktc Nov 3, 2026
e27e12d
feat(web): add refresh to provider status banners (#24861)
UtkarshUsername Nov 3, 2026
55ea365
fix(server): side chats no longer open with a model switch from the p…
saphid Nov 3, 2026
b7ab02e
fix(web): copied code blocks keep their blank lines in lists, quotes …
saphid Nov 3, 2026
42cf5a1
fix(web): compact model picker row indicators (#26415)
UtkarshUsername Nov 3, 2026
911212b
fix(web): open project picker from boring sidebar's header (#26495)
UtkarshUsername Nov 3, 2026
171f78b
fix(client): project removal counts only listed threads, not side cha…
saphid Nov 3, 2026
68c38b9
fix(opencode): text generation errors explain known provider failures…
saphid Nov 3, 2026
bec3f2d
fix(mobile): multi-file patches show every changed file (#29878)
saphid Nov 3, 2026
e5d0710
fix(server): handoff context names every file of a multi-file patch (…
saphid Nov 3, 2026
e86dc78
fix(server): commits and PR text see changes outside a subfolder proj…
saphid Nov 3, 2026
12ec17c
fix(web): opening a project from the command palette no longer lands …
saphid Nov 3, 2026
3ee5515
fix(web): device host checks show the error without a stack trace (#2…
saphid Nov 3, 2026
3d369d5
feat(web): open full access menu from the new thread context strip (#…
Yash-Singh1 Nov 3, 2026
e53672d
fix(web): long server lists in thread details now page 4 at a time (#…
Bil0000 Nov 3, 2026
115739c
fix(web): keep the project filter menu aligned with its trigger
Yash-Singh1 Nov 3, 2026
30724e2
fix(github): Rebase stack no longer conflicts after a lower layer is …
saphid Nov 3, 2026
abf8998
fix(server): changing a task's wake policy no longer reverts a checkp…
juliusmarminge Nov 3, 2026
a760f37
perf(server): settled PR lookups stop re-spawning git every sweep (#2…
juliusmarminge Nov 3, 2026
4a09502
fix(server): generated commit and PR text ignores git signature outpu…
saphid Nov 3, 2026
ea68f2a
fix(web): picking a branch in a subfolder project keeps the thread in…
saphid Nov 3, 2026
499727d
fix(mobile): close and reopen pull requests from the actions menu (#2…
juliusmarminge Nov 3, 2026
ac10bb4
fix(web): mouse wheel over the thread minimap glides instead of jumpi…
flamboh Nov 3, 2026
7ab237f
fix(server): managed policy covers Kiro (#29915)
juliusmarminge Nov 3, 2026
7681605
fix(server): t3 update installs from the policy's update mirror (#29911)
juliusmarminge Nov 3, 2026
a50fe10
fix(desktop): Ctrl+R on macOS reaches the preview page instead of rel…
saphid Nov 3, 2026
3f48896
fix(server): native forks after an undo no longer copy later turns (#…
saphid Nov 3, 2026
7f17f51
fix(server): idle compaction still runs after a queued message is rem…
saphid Nov 3, 2026
a9468da
fix(server): guests of a forked thread can open files on the messages…
saphid Nov 3, 2026
1a3f76e
fix(evals): resume browser verification after unavailable status (#30…
Yash-Singh1 Nov 3, 2026
bff68fb
fix(shared): saving one source control token no longer drops the othe…
yordis Nov 3, 2026
dd24b37
fix(desktop): a policy that stops startup no longer points at another…
juliusmarminge Nov 3, 2026
15707a8
docs: pin an absolute binary path under a permission cap (#29916)
juliusmarminge Nov 3, 2026
c756eba
fix(mobile): Android follow-up menu shows in full with the keyboard o…
juliusmarminge Nov 3, 2026
7239986
fix(web): deleting the open thread no longer opens a snoozed or settl…
juliusmarminge Nov 3, 2026
31eb1d0
fix(web): closing Settings or Usage no longer jumps back to a quote's…
juliusmarminge Nov 3, 2026
3040f91
fix(server): squash-merged branches no longer offer push & create PR …
juliusmarminge Nov 3, 2026
cf90825
fix(mobile): settings providers show the ACP registry icon (#28135)
juliusmarminge Nov 3, 2026
7b666f3
fix(server): Grok usage limits tell Legacy-mode xAI accounts to switc…
juliusmarminge Nov 3, 2026
58cf69c
fix(usage): label a proxied Claude account by its e-mail, and drop .j…
juliusmarminge Nov 3, 2026
9def583
fix(gitlab): a signed-out default glab host no longer hides other sig…
juliusmarminge Nov 3, 2026
550c5fa
perf(server): prune events the projections already cover (#29806)
juliusmarminge Nov 3, 2026
260297b
fix(server): GPT-6.1 Sol no longer compacts after every tool call on …
maria-rcks Nov 3, 2026
bd48d8c
feat(policy): admins set managed policy from a Group Policy template …
juliusmarminge Nov 3, 2026
2c99914
perf(server): bound streaming recovery reads by active runs (#30357)
Yash-Singh1 Nov 3, 2026
0b5600b
perf(server): read pull request metadata from a lightweight snapshot
Yash-Singh1 Nov 3, 2026
c3c15f7
fix(server): cancelling worktree setup no longer leaves its new branc…
saphid Nov 3, 2026
d1ec71e
feat(mobile): add on-device Android dictation (#26734)
PixPMusic Nov 3, 2026
a104909
feat(server): read usage limit source keys from a secret provider (#2…
yordis Nov 3, 2026
bd3cc5c
feat(device): read the EAS access token from a secret provider (#27763)
yordis Nov 3, 2026
aee76a8
fix(server): route missing read-only queries to readers
Yash-Singh1 Nov 3, 2026
96e887b
perf(server): index delegated recovery candidates (#30359)
Yash-Singh1 Nov 3, 2026
251369d
feat(server,web,mobile,desktop): Copy thread copies a link that opens…
juliusmarminge Nov 3, 2026
b183048
feat(mobile,web): copied thread links open the mobile app (#29815)
juliusmarminge Nov 3, 2026
7c22e24
fix(antigravity): rate-limited turns keep their reset time (#29594)
saphid Nov 3, 2026
66c3964
Merge upstream pingdotgg/t3code main (7c22e24e3f) into the fork
kupiainen Nov 3, 2026
cba5e77
fix(cell): build the cell provider on upstream's Effect 4.1 and its p…
kupiainen Nov 3, 2026
c71ca38
style(cell): follow upstream's Effect.fn, comment-length and test-wai…
kupiainen Nov 3, 2026
ca27bf6
fix(cell): publish a cell notice's node with it, so the model retries…
kupiainen Nov 3, 2026
da3f972
fix(server): startup no longer hangs on a shell stuck in the kernel (…
AdEx-Partners-DE Nov 3, 2026
be22324
feat(cell): report a Stop the cell does not confirm as upstream's unc…
kupiainen Nov 3, 2026
ac97602
fix(server): reverting files before the first commit no longer leaves…
Abhishek-B-R Nov 3, 2026
eee9525
fix(server): truncated Claude task output no longer starts with a rep…
Abhishek-B-R Nov 3, 2026
65efae1
fix(shared): relative file links with routing punctuation open as fil…
Abhishek-B-R Nov 3, 2026
7a03a74
fix(server): messages cut by a restart no longer stay marked as strea…
Abhishek-B-R Nov 3, 2026
b6bd84d
fix(server): Antigravity Auto asks instead of approving every request…
parmartejass Nov 3, 2026
a445272
fix(server): Codex threads open in another client are no longer silen…
derektrimm Nov 3, 2026
ef99d3f
fix(server): WSL servers avoid ports already used by Windows (#22962)
tylerjenningsw Nov 3, 2026
d61058d
perf(web): reuse repeated inline skill lookups (#29008)
luke2x Nov 3, 2026
10cd1a5
fix(opencode): expand home-relative executable paths (#29326)
voltcrash Nov 3, 2026
476a99c
fix(server): title regeneration works after a thread's worktree is cl…
saphid Nov 3, 2026
b7add5a
fix(server): dev servers a Codex agent starts show under its thread (…
saphid Nov 3, 2026
8ee7cf9
fix(server): status no longer fetches a remote named after a local tr…
saphid Nov 3, 2026
5bdc2af
fix(server): preview snapshots no longer cut an emoji in half (#29600)
saphid Nov 3, 2026
bbaa535
fix(server): restart notes no longer split an emoji in a long backgro…
saphid Nov 3, 2026
21e4f98
fix(acp): Always allow no longer cancels the turn when an agent only …
MarcoDotIO Nov 3, 2026
9c89424
fix(server): forking a Codex thread archived outside T3 Code no longe…
saphid Nov 3, 2026
acad1d5
perf(shared): stop single-token message search at the best hit (#28930)
hieu-lee Nov 3, 2026
c185d78
fix(preview): a dropped stream withdraws its stale file picker (#29655)
saphid Nov 3, 2026
b156a7d
fix(provider-acp): ACP threads keep receiving events after a rollback…
trevoedwards Nov 3, 2026
2f8de8d
perf(opencode): provider event logs skip per-token reply deltas (#29673)
saphid Nov 3, 2026
300101f
fix(web): open files from Claude and ACP tool-call diffs (#29309)
Jo2234 Nov 3, 2026
04aed8f
fix(server): files tree labels ignored folders inside git submodules …
saphid Nov 3, 2026
eee8ed4
fix(server): server updates reclaim partial database backups left by …
MarcoDotIO Nov 3, 2026
b63adbf
fix(server): PR watch wakes no longer split an emoji in a long commen…
saphid Nov 3, 2026
30f7600
fix(server): pinning a settled thread stamps its return to the active…
saphid Nov 3, 2026
6016aac
fix(server): Claude's commands no longer run Electron apps as Node (#…
u9g Nov 3, 2026
ddca6b1
docs: keybindings guide lists the rightPanelOpen when key (#29677)
saphid Nov 3, 2026
0a86e15
perf(shared): avoid redundant visibility work on status updates (#28965)
hieu-lee Nov 3, 2026
b113eb0
fix(desktop): failed settings saves no longer leave temp files behind…
saphid Nov 3, 2026
6672913
fix(cell): typecheck the cell provider with tsc, as upstream's packag…
kupiainen Nov 3, 2026
6d80df5
fix(acp): a final agent message without a trailing newline is no long…
saphid Nov 3, 2026
614643f
style(server): format the two turn-start files the merge resolution l…
kupiainen Nov 3, 2026
594532a
fix(server): terminal history keeps output after an unterminated OSC …
saphid Nov 3, 2026
df2dfde
fix(cli): t3 up's pairing hint keeps --base-dir (#29684)
saphid Nov 3, 2026
1b6336d
fix(shared): preserve omitted components in zero-major caret ranges (…
Jo2234 Nov 3, 2026
4f58294
fix(server): thread titles use linked PR context when the URL is foll…
saphid Nov 3, 2026
2b4d6a3
fix(source-control): remotes like github.com:owner/repo reach their h…
MarcoDotIO Nov 3, 2026
663cd08
fix(server): terminal history keeps text with C1 characters (#29649)
saphid Nov 3, 2026
ce89cd1
fix(server): worktree handoff follows the project's start-from-origin…
saphid Nov 3, 2026
4461b84
fix(server): review keeps tracked changes when untracked files overfl…
saphid Nov 3, 2026
e91595b
fix(server): browser setup advice names the server's T3 home (#29646)
saphid Nov 3, 2026
48e73f6
fix: honor generic MIME aliases in attachment previews (#29360)
Jo2234 Nov 3, 2026
ee265cc
fix(client-runtime): terminals fit their pane again after a reconnect…
saphid Nov 3, 2026
c64117d
fix(server): Run now on a scheduled task says why it was refused (#29…
saphid Nov 3, 2026
8ca8fdd
fix(server): a preview_open whose first load fails no longer leaves a…
saphid Nov 3, 2026
47057a3
fix(cursor): Cursor text generation names usage-limit failures (#29748)
saphid Nov 3, 2026
54223c3
fix(server): review diffs keep working with untracked files outside t…
saphid Nov 3, 2026
136fe43
fix(opencode): nested custom commands like /git/commit run as command…
saphid Nov 3, 2026
8bfe94a
fix(source-control): renamed files in GitHub, GitLab and Azure DevOps…
saphid Nov 3, 2026
0992f51
fix(opencode): a command that exits non-zero is stored as failed, not…
saphid Nov 3, 2026
ddaf999
fix(server): linked environments pick up the other machine's new name…
saphid Nov 3, 2026
b8fb45e
fix(server): document text skips tracked deletions and field codes (#…
saphid Nov 3, 2026
cedcc31
fix(server): OTLP export settings survive a saved token streaming mod…
saphid Nov 3, 2026
eb30336
fix(server): Word text boxes are no longer extracted twice for agents…
saphid Nov 3, 2026
9f7b2ee
fix(server): new projects are created when core.safecrlf refuses LF f…
saphid Nov 3, 2026
228e289
fix(web): drafts saved by older versions load instead of being wiped …
saphid Nov 3, 2026
7ff5cfd
fix(cell): list the cell provider among the drivers a managed policy …
kupiainen Nov 3, 2026
9d7f771
fix(server): Antigravity text generation shows sign-in and setup erro…
saphid Nov 3, 2026
0a0394a
fix(server): read only a deleted thread's open native subagent items,…
kupiainen Nov 3, 2026
92388d5
fix(web): picking a custom model named like a Codex alias keeps that …
saphid Nov 3, 2026
940afd6
fix(server): turn checkpoints keep LF files when core.safecrlf is tru…
saphid Nov 3, 2026
31564de
fix(shared): find in thread matches a word typed with a curly apostro…
saphid Nov 3, 2026
2f2e81f
fix(server): review rows for nested repositories load in large diffs …
saphid Nov 3, 2026
0a41bbc
fix(server): t3_worktree_list lists refs after storage cleanup remove…
saphid Nov 3, 2026
2ad6712
fix(provider-core): text generation context cuts no longer split an e…
saphid Nov 3, 2026
7767a95
fix(server): html_preview no longer splits an emoji in a long console…
saphid Nov 3, 2026
0673e7e
fix(server): diffs keep submodule changes under diff.submodule=log (#…
saphid Nov 3, 2026
5e53057
fix(opencode): OpenCode 2 titles for image messages skip images the s…
saphid Nov 3, 2026
aeaf363
fix(server): orchestrator_capabilities no longer offers providers the…
saphid Nov 3, 2026
77b948e
fix(web): big terminal selections no longer break sending (#29804)
saphid Nov 3, 2026
fcad9de
test(web): file editor dismissal test waits for the editor to render …
juliusmarminge Nov 3, 2026
fb8e6d8
test(web): worked-for heading test clicks once the list is revealed (…
juliusmarminge Nov 3, 2026
19a2bad
fix(azure-devops): legacy DefaultCollection pull request URLs can be …
saphid Nov 3, 2026
8704966
fix(shared): preview_open reports about: and mailto: as unsupported i…
saphid Nov 3, 2026
67861fd
fix(server): delegated threads no longer share one provider event log…
onlydole Nov 3, 2026
6049196
fix(server): a queued provider switch no longer ends background work …
juliusmarminge Nov 3, 2026
8198b2e
fix(kiro): slow kiro-cli starts no longer show Kiro as unavailable (#…
saphid Nov 3, 2026
480eb8d
fix(client): mark unread sticks on a thread reopened within ten minut…
saphid Nov 3, 2026
d7ee7b3
fix(pi): extension errors name folder extensions instead of "index" (…
saphid Nov 3, 2026
40aba09
fix(github): Enterprise Server pull request URLs can be pasted to che…
saphid Nov 3, 2026
b7fcb7c
fix(server): a peer refusing one call no longer marks its link as fai…
saphid Nov 3, 2026
0bd447e
perf(server): Claude skill discovery resolves each repository root on…
onlydole Nov 3, 2026
99ccd47
fix(server): t3 service uninstall leaves another T3 home's service al…
saphid Nov 3, 2026
b95ff11
fix(server): PR watches wake again when a push leaves the branch conf…
saphid Nov 3, 2026
1f87f64
fix(muse): the thread error banner no longer shows unredacted failure…
saphid Nov 3, 2026
655977a
fix(server): provider settings changed mid-refresh no longer revert t…
saphid Nov 3, 2026
e1cd7f0
fix(shared): accept whitespace after engine range operators (#29730)
romil-bijarnia Nov 3, 2026
93b0db1
perf(server): stop tracing per-event live coalescer work (#29758)
onlydole Nov 3, 2026
ece461e
test(desktop): the Windows shell kill test waits for each spawn befor…
maria-rcks Nov 3, 2026
7f92cb0
fix(shared): ignore unsupported command output control parameters (#2…
romil-bijarnia Nov 3, 2026
2b37449
fix(cli): t3 update no longer says a service awaiting restart runs th…
saphid Nov 3, 2026
76f2966
fix(mcp): accept CR and mixed line endings in response streams (#29727)
romil-bijarnia Nov 3, 2026
350dcf4
fix(server): preview tabs that fail during setup no longer leave thei…
saphid Nov 3, 2026
86b7dc6
fix(provider-core): long subagent titles no longer end in a broken ch…
saphid Nov 3, 2026
16ca47b
fix(shared): ignore unsupported command output erase modes (#29737)
romil-bijarnia Nov 3, 2026
741bcae
fix(server): a failed scheduled run shows its error without a stack t…
saphid Nov 3, 2026
ebfca09
perf(web): long threads stream with 70% less work-row derivation (#29…
Entrpi Nov 3, 2026
5c72faa
fix(pi): send SIGTERM before closing Pi's stdin on teardown (#30025)
yaacovcorcos Nov 3, 2026
b6307ee
fix(server): clean up child worktrees after their parent settles (#30…
voltcrash Nov 3, 2026
7fd859a
fix(server): Claude context meter shows the window for models outside…
hahhforest Nov 3, 2026
ece6322
fix(server): quitting no longer waits on an unreachable telemetry end…
levelorbit Nov 3, 2026
dd8c122
fix(client): keep snoozed failures hidden without completion times (#…
voltcrash Nov 3, 2026
ffa39e2
perf(server): PR sync stops reading pull requests closed over a day a…
advaitpaliwal Nov 3, 2026
ddd36a5
fix(acp): file changes show the patch of every diff in a tool call (#…
Abhishek-B-R Nov 3, 2026
d075bed
fix(server): Antigravity sign-in no longer blames the network while t…
wenshen18643 Nov 3, 2026
4a23e9e
fix(relay): read migrations in checkout paths with spaces (#30080)
domvox Nov 3, 2026
bf046e3
fix(cli): validate npm runtime before caching it (#30099)
voltcrash Nov 3, 2026
b9d7239
fix(server): SSH device host no longer reconnects on a single slow he…
gyurix Nov 3, 2026
8bc344b
fix(server): read continued core.bare values during onboarding (#30174)
imharjot Nov 3, 2026
6ea23bd
fix(server): published repos fall back to HTTPS when SSH is refused (…
saphid Nov 3, 2026
5ad00e9
fix(opencode): fail stalled event subscriptions promptly (#30201)
voltcrash Nov 3, 2026
c609500
fix(server): a link card the user moved past no longer blocks auto-se…
saphid Nov 3, 2026
2863ede
fix(server): deleting a thread also removes its agent preview recordi…
saphid Nov 3, 2026
e1cf10b
fix(server): review guides no longer fail on the repository's checkou…
saphid Nov 3, 2026
ad4bb6d
fix(desktop): bump Electron to 44.10.1 for October Chromium security …
valuin Nov 3, 2026
377d0d3
fix(cell): report a Stop whose cancel the cell never answers, hung or…
kupiainen Nov 3, 2026
1da56ec
Merge upstream pingdotgg/t3code main (ad4bb6d6fa) into the fork
kupiainen Nov 3, 2026
a17ce0d
fix(server): give upstream's another-client resume test a session tha…
kupiainen Nov 3, 2026
6cb7026
fix(cell): take only a 4xx answer to a Stop's cancel as the cell's re…
kupiainen Nov 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
30 changes: 24 additions & 6 deletions .agents/skills/test-t3-app/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ description: Test T3 Code's web and desktop UI through its built-in Browser pane

# Test T3 web and desktop

Use T3's built-in Browser panel for verification. If its tools are absent or
the panel reports unavailable, explain the blocker and stop verification.
Do not install or switch to another automation system. For native mobile
testing, use [test-t3-mobile](../test-t3-mobile/SKILL.md).
Use T3's built-in Browser panel for verification. Follow the recovery steps
below before declaring it unavailable. Do not install or switch to another
automation system. For native mobile testing, use
[test-t3-mobile](../test-t3-mobile/SKILL.md).

## Start the app

Expand All @@ -21,10 +21,28 @@ Test with meaningful project and thread data. Read
[references/sqlite-fixtures.md](references/sqlite-fixtures.md) only when
inspecting or seeding SQLite. Stop the test server before direct fixture writes.

## Drive agent turns for free

Do not spend a paid model to see a turn render. `vp run dev` registers the
`Replay (dev)` provider, which replays recorded turns with simulated streaming
through the real adapter and orchestration. Its models are scenarios:
`showcase` covers thinking, a plan, tool calls, an approval, and markdown.
Press `Ctrl+Alt+Shift+R` for a picker (GNOME takes that key for screen
recording), call `window.t3dev.replay("showcase")`
with `preview_evaluate`, or run
`node apps/server/src/bin.ts thread start --base-dir .t3 --provider devReplay --model showcase <project> "go"`.
When the test needs real provider behavior, use that provider's cheapest
model, such as Haiku for Claude or Luna for Codex.

## Use the Browser panel

Call `preview_status`, then `preview_open` if the Browser panel is
closed. Navigate to the complete startup pairing URL once with
Call `preview_status`. If no tab can be automated, call `preview_open`, including
when status reports `available: false` or `tabId: null`. Status can report
unavailable simply because no tab exists yet; opening a tab needs no user action.
Stop verification and explain the blocker only if the tools are absent or
`preview_open` reports unavailable or fails.

Navigate to the complete startup pairing URL once with
`preview_navigate`, then use `preview_snapshot` and T3's interaction tools.
If the token was consumed or expired, run `node apps/server/src/bin.ts pair`
for a fresh one. Keep using the same tab.
Expand Down
16 changes: 13 additions & 3 deletions .agents/skills/test-t3-mobile/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,21 @@ when inspecting or seeding SQLite. Stop the test server before fixture writes.
From the checkout being tested on the selected device host, run:

```bash
node scripts/mobile-native-client.ts ensure <ios|android> <device-id>
vp run mobile:install <ios|android> <device-id>
```

This reuses a matching native client or builds and installs one. Authorized
mobile verification includes that build step unless the user prohibits it.
This installs the dev client for the checkout's native fingerprint: from the
device, the local cache, or the shared cache in seconds, building once only
when no machine has that fingerprint yet (5-15 minutes, logged to the file it
names). The device id may be omitted when exactly one device is booted. It
prints one JSON line; on failure it names the next command. Mobile verification
includes that step unless the user prohibits it.

For a device you opened in an agent-device session elsewhere (a device pool,
cloud, or remote host), run `vp run mobile:install <ios|android> --session <s>`
from the directory you opened the session in. It installs the cached build into
that session (`--abi arm64-v8a` for an ARM Android device; `--metro <url>` also
opens it against Metro) and never builds.

Start `vp run dev:client` from `apps/mobile`, or reuse a healthy Metro belonging
to this checkout. Open its printed development-client URL with AgentDevice
Expand Down
6 changes: 6 additions & 0 deletions .coderabbit.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,19 @@ export default defineConfig((ctx) => ({
path: "apps/web/src/**/*.{tsx,css}",
instructions: "Hold changed code to the rules in docs/internals/web-ui.md.",
},
{
path: "**/*.test.*",
instructions:
"Hold changed tests to the rules in docs/internals/testing.md. Request tests only as those rules allow.",
},
],
},
knowledge_base: {
code_guidelines: {
filePatterns: [
{ files: "docs/internals/effect-services.md", applyTo: "{apps,packages,infra}/**/*.ts" },
{ files: "docs/internals/web-ui.md", applyTo: "apps/web/src/**/*.{tsx,css}" },
{ files: "docs/internals/testing.md", applyTo: "{apps,packages,infra}/**/*.{ts,tsx}" },
],
},
},
Expand Down
4 changes: 2 additions & 2 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Dev container for T3 Code. Mirrors CI (ubuntu-24.04, Node 24, Rust stable)
// Dev container for T3 Code. Mirrors CI (ubuntu-24.04, Node 26, Rust stable)
// and the canonical setup in docs/operations/development.md: global `vp`, `vp i`.
// Contributor doc: docs/internals/devcontainer.md
{
Expand All @@ -8,7 +8,7 @@
// nodeGypDependencies (default true) brings python3/make/g++, which Linux
// needs for node-pty's node-gyp fallback (its prebuilds are mac/win only).
"ghcr.io/devcontainers/features/node:2": {
"version": "24"
"version": "26"
},
// native/resource-monitor (edition 2024, needs stable >= 1.85). The server
// degrades gracefully without the binary, but CI checks cargo fmt + test.
Expand Down
3 changes: 2 additions & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
# Batch files need CRLF for cmd.exe to parse them reliably.
*.cmd text eol=crlf
*.bat text eol=crlf
# GitHub's GraphQL schema and the operations graphqlgen writes from it.
# GitHub's and Expo's GraphQL schemas and the operations graphqlgen writes from them.
packages/source-control-github/schema/** linguist-generated
apps/server/schema/** linguist-generated
**/*.graphql.ts linguist-generated
1 change: 1 addition & 0 deletions .github/VOUCHED.td
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ github:myacoub91
github:naMqe-h
github:nateEc
github:naveed949
github:nexxeln
github:nmggithub
github:Noojuno
github:notkainoa
Expand Down
141 changes: 132 additions & 9 deletions .github/actions/setup-ci-deps/action.yml
Original file line number Diff line number Diff line change
@@ -1,30 +1,153 @@
name: Setup CI dependencies
description: Install Vite+ and the workspace dependencies from cache.
inputs:
task-cache-read-token:
description: Read-only credential for the private maintainer task cache
required: false
default: ""
install:
description: Set to "false" to set up Vite+ only, with no pnpm store or install
required: false
default: "true"
install-args:
description: Arguments for `vp install`, such as filters. Empty installs the whole workspace.
required: false
default: ""
runs:
using: composite
steps:
# setup-vp reuses an installed exact version, so restoring its home skips the
# installer download on every job.
# ~/.vite-plus holds vp, the Node.js runtime, and pnpm. A cache entry never
# updates, so the key names all three versions; otherwise a pnpm or Node.js
# bump makes every job download them from npm again.
- name: Resolve Vite+ version
id: vp
shell: bash
run: |
echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT"
echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT"
echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT"

# Pinned because release-desktop.yml signs builds with this action in the job.
- name: Cache Vite+
id: vp_cache
if: steps.vp.outputs.version != ''
uses: actions/cache@v6
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
with:
path: ~/.vite-plus
key: vite-plus-home-v1-${{ runner.os }}-${{ runner.arch }}-${{ steps.vp.outputs.version }}
key: vite-plus-home-v2-${{ runner.os }}-${{ runner.arch }}-${{ steps.vp.outputs.version }}-node${{ steps.vp.outputs.node }}-${{ steps.vp.outputs.pnpm }}

# setup-vp always runs the installer, which fetches vp from npm even when
# this exact version is installed. A cache hit already has everything, so
# skip setup-vp and do its remaining work here. This keeps npm outages from
# failing jobs.
- name: Use cached Vite+
if: steps.vp_cache.outputs.cache-hit == 'true'
shell: bash
run: |
echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH"
"$HOME/.vite-plus/bin/vp" env use "${{ steps.vp.outputs.node }}"

# vp gives each Node.js download attempt 10 minutes by default, so one
# stalled stream holds the job that long. It retries 3 times and resumes
# partial bytes, so a shorter limit costs a slow download only a retry.
- name: Setup Vite+
if: steps.vp_cache.outputs.cache-hit != 'true'
uses: voidzero-dev/setup-vp@250f29ce396baf5e8f24498e17c0dfdebabc26eb # v1
env:
VP_DOWNLOAD_TIMEOUT: "120"
with:
node-version-file: package.json
cache: false
run-install: false

# A shared key lets whichever install saves first, often a small filtered
# one, become every job's store. Each set of install args gets its own.
- name: Resolve pnpm store
id: pnpm_store
if: inputs.install == 'true'
shell: bash
env:
INSTALL_ARGS: ${{ inputs.install-args }}
run: |
echo "path=$(vp pm cache dir)" >> "$GITHUB_OUTPUT"
metadata_dir="${pnpm_config_cache_dir:-$RUNNER_TEMP/pnpm-metadata}"
echo "pnpm_config_cache_dir=$metadata_dir" >> "$GITHUB_ENV"
echo "verified=$metadata_dir/lockfile-verified.jsonl" >> "$GITHUB_OUTPUT"
if [[ -z "$INSTALL_ARGS" ]]; then
echo "namespace=full" >> "$GITHUB_OUTPUT"
else
echo "namespace=filtered-$(printf '%s' "$INSTALL_ARGS" | cksum | cut -d' ' -f1)" >> "$GITHUB_OUTPUT"
fi

# Filtered installs prefer the current full store, which holds every package,
# over an older store of their own.
# The pnpm store stays a cache tarball on the runner's own disk. A store on a
# Blacksmith sticky disk mounts in under a second, but pnpm then copies every
# package across filesystems instead of hard-linking it: install took 28-49s
# against 9s plus an 11s restore.
- name: Setup Vite+
uses: voidzero-dev/setup-vp@v1
- name: Restore pnpm store
id: pnpm_cache
if: inputs.install == 'true'
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
with:
node-version-file: package.json
cache: true
run-install: true
path: ${{ steps.pnpm_store.outputs.path }}
key: pnpm-${{ steps.pnpm_store.outputs.namespace }}-v1-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('pnpm-lock.yaml', 'pnpm-workspace.yaml', 'package.json') }}
restore-keys: |
pnpm-full-v1-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('pnpm-lock.yaml', 'pnpm-workspace.yaml', 'package.json') }}
pnpm-${{ steps.pnpm_store.outputs.namespace }}-v1-${{ runner.os }}-${{ runner.arch }}-
pnpm-full-v1-${{ runner.os }}-${{ runner.arch }}-

# pnpm accepts an earlier pass for the same lockfile and policy at any age, so
# a cached record skips fetching registry metadata for every package.
- name: Restore lockfile verification
id: pnpm_verified
if: inputs.install == 'true'
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
with:
path: ${{ steps.pnpm_store.outputs.verified }}
key: pnpm-verified-v1-${{ hashFiles('pnpm-lock.yaml', 'pnpm-workspace.yaml', 'package.json') }}

- name: Install dependencies
if: inputs.install == 'true'
shell: bash
env:
INSTALL_ARGS: ${{ inputs.install-args }}
# Unquoted so each filter is its own argument.
run: vp install $INSTALL_ARGS

- name: Save lockfile verification
if: inputs.install == 'true' && steps.pnpm_verified.outputs.cache-hit != 'true'
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
with:
path: ${{ steps.pnpm_store.outputs.verified }}
key: ${{ steps.pnpm_verified.outputs.cache-primary-key }}

# A filtered install that started from the current full store adds nothing
# worth a second copy of it.
- name: Save pnpm store
if: >-
inputs.install == 'true' &&
steps.pnpm_cache.outputs.cache-hit != 'true' &&
(steps.pnpm_store.outputs.namespace == 'full' ||
steps.pnpm_cache.outputs.cache-matched-key != format('pnpm-full-v1-{0}-{1}-{2}', runner.os, runner.arch, hashFiles('pnpm-lock.yaml', 'pnpm-workspace.yaml', 'package.json')))
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
with:
path: ${{ steps.pnpm_store.outputs.path }}
key: ${{ steps.pnpm_cache.outputs.cache-primary-key }}

- name: Enable shared task cache
if: >-
github.repository == 'pingdotgg/t3code' &&
(github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) &&
hashFiles('.task-cache.json') != '' &&
inputs.task-cache-read-token != ''
shell: bash
env:
T3_TASK_CACHE_READ_TOKEN: ${{ inputs.task-cache-read-token }}
run: |
node infra/task-cache/scripts/install-ci.ts
if [[ ( "$GITHUB_EVENT_NAME" == pull_request && "$GITHUB_BASE_REF" == main ) || ( "$GITHUB_EVENT_NAME" == push && "$GITHUB_REF" == refs/heads/main ) ]]; then
echo 'VP_REMOTE_CACHE=read-write' >> "$GITHUB_ENV"
else
echo 'VP_REMOTE_CACHE=read' >> "$GITHUB_ENV"
fi
45 changes: 0 additions & 45 deletions .github/scripts/check-nightly-release.test.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,6 @@ for (const releaseChannel of ["stable", "nightly"]) {
);
assert.equal(calls.length, 0);
});

test(`allows a manual ${releaseChannel} release from main`, async () => {
const { options, calls } = releaseSourceFixture();
await assertReleaseSource({ ...options, releaseChannel });
assert.equal(calls[0].basehead, "candidate...main");
});
}

for (const comparisonStatus of ["behind", "diverged"]) {
Expand All @@ -79,13 +73,6 @@ for (const comparisonStatus of ["behind", "diverged"]) {
});
}

test("accepts a release commit already contained in main", async () => {
for (const comparisonStatus of ["ahead", "identical"]) {
const { options } = releaseSourceFixture({ comparisonStatus, eventName: "push" });
await assertCommitOnDefaultBranch({ ...options, sha: "release-commit" });
}
});

function fixture({ releases = [nightly(7)], comparisonStatus = "ahead" } = {}) {
const calls = [];
return {
Expand Down Expand Up @@ -119,26 +106,6 @@ test("releases the first nightly when no nightly is published", async () => {
assert.equal(await shouldReleaseNightly(options), true);
});

test("waits six hours after publication, including manual nightlies", async () => {
for (const age of [0, 3, 6 - 1 / 3600]) {
const { options, calls } = fixture({ releases: [nightly(age)] });
assert.equal(await shouldReleaseNightly(options), false);
assert.equal(calls.length, 0);
}
});

test("releases new commits at six hours and after an idle period", async () => {
for (const age of [6, 7, 24]) {
const { options } = fixture({ releases: [nightly(age)] });
assert.equal(await shouldReleaseNightly(options), true);
}
});

test("skips unchanged commits after the gap", async () => {
const { options } = fixture({ comparisonStatus: "identical" });
assert.equal(await shouldReleaseNightly(options), false);
});

test("uses publication time, not release order or the tagged commit date", async () => {
const { options } = fixture({
releases: [nightly(10), nightly(1), nightly(20, { tag_name: "nightly-v0.9.0" })],
Expand All @@ -153,13 +120,6 @@ test("ignores stable releases and drafts when checking the gap", async () => {
assert.equal(await shouldReleaseNightly(options), true);
});

test("compares against the published tag, including legacy nightly tags", async () => {
const tag = "nightly-v0.9.0";
const { options, calls } = fixture({ releases: [nightly(7, { tag_name: tag })] });
assert.equal(await shouldReleaseNightly(options), true);
assert.equal(calls[0].basehead, `${tag}...new`);
});

test("fails instead of releasing when GitHub cannot supply release state", async () => {
const { options } = fixture();
options.github.paginate = async () => {
Expand Down Expand Up @@ -211,8 +171,3 @@ test("stable releases derive the version from legacy nightly tags", async () =>
});
assert.equal((await resolveLatestNightlyCommit(options)).version, "0.9.0");
});

test("stable releases fail without a published nightly", async () => {
const { options } = nightlyCommitFixture({ releases: [nightly(0, { tag_name: "v1.0.0" })] });
await assert.rejects(resolveLatestNightlyCommit(options), /No published nightly/);
});
Loading