Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
391 commits
Select commit Hold shift + click to select a range
93aaad5
fix(web): PR conversation headers wrap instead of overflowing (#36211)
BeLazy167 Nov 13, 2026
c5dfb8f
fix(mobile): new thread starts in the thread list's filtered project …
juliusmarminge Nov 13, 2026
a877d40
fix(opencode): models load once OpenCode 2 finishes activating its pl…
juliusmarminge Nov 13, 2026
497aac2
fix(server): include Cursor team usage in account history (#36237)
Yash-Singh1 Nov 13, 2026
764c047
fix(web): terminal TypeScript links preserve error locations (#36174)
saphitv Nov 13, 2026
79dd6d7
fix(web): terminal TypeScript links preserve error locations (#36174)
saphitv Nov 13, 2026
daed1dd
fix(server): a follow-up delegated task waits for the subagents its c…
juliusmarminge Nov 13, 2026
9b5d997
fix(opencode): native forks no longer multiply usage (#23120)
juliusmarminge Nov 13, 2026
d70bfe6
fix(server): a send to a thread whose worktree can't be recreated now…
juliusmarminge Nov 13, 2026
1ea5236
fix(mobile): HTML file previews play video inline on iPhone (#32343)
juliusmarminge Nov 13, 2026
2953fda
fix(server): Antigravity skill bodies no longer exhaust the skill sca…
juliusmarminge Nov 13, 2026
76d0fff
fix(server): include symlinks in workspace search (#24578)
juliusmarminge Nov 13, 2026
7ab4650
fix(mobile): Work on PR keeps its worktree when switching machines (#…
juliusmarminge Nov 13, 2026
a09e54a
fix(server): proxied usage limits take their reset time from the CLIP…
juliusmarminge Nov 13, 2026
2d5e0ae
fix(server): session import brings in the linked-worktree sessions th…
juliusmarminge Nov 13, 2026
571b319
fix(server): a remote delegated task no longer stays running when its…
juliusmarminge Nov 13, 2026
445d32c
fix(server): preview clicks fail within their timeout and say why (#3…
juliusmarminge Nov 13, 2026
daed91f
fix(shared): batch SQLite worker result transfers (#36067)
Yash-Singh1 Nov 13, 2026
78b654f
fix(server): Stop clears a finished delegated child's row held by a s…
juliusmarminge Nov 13, 2026
ff30b16
fix(desktop): clicking above the Settings or Usage modal closes it ag…
juliusmarminge Nov 13, 2026
065aca4
test(web): code block highlight test waits for the highlighter, not a…
juliusmarminge Nov 13, 2026
be5f805
fix(web): new desktop browser tabs open at the default zoom and appea…
juliusmarminge Nov 13, 2026
8cd8a3c
fix(server): file search no longer freezes the server while fff's wat…
juliusmarminge Nov 13, 2026
8171cd0
fix(desktop): mouse back and forward stay inside the browser tab (#33…
juliusmarminge Nov 13, 2026
fcd0687
fix(web): removing a checkout moves its open draft to a remaining che…
juliusmarminge Nov 13, 2026
9efd960
fix(mobile): a Settings link sent to the running app opens the Settin…
juliusmarminge Nov 13, 2026
c83e78f
fix(web): Shift+Return after closed inline code or bold starts a plai…
juliusmarminge Nov 13, 2026
e94db17
fix(mobile): adding a folder that is already a project opens it (#34942)
juliusmarminge Nov 13, 2026
41e69ff
fix(contracts): agents keep working after starting an async delegate …
juliusmarminge Nov 13, 2026
1a4a299
fix(server): reverting to a checkpoint restores skip-worktree files (…
juliusmarminge Nov 13, 2026
66ec370
fix(shared): hosted thread URLs inside other links stay as written (#…
juliusmarminge Nov 13, 2026
c165587
fix(provider-cursor): Cursor threads report token usage and context f…
juliusmarminge Nov 13, 2026
3521634
fix(server): review diffs no longer read oversized untracked files (#…
juliusmarminge Nov 13, 2026
fa6326b
fix(web): closing a composer menu on a touch tablet no longer opens t…
juliusmarminge Nov 13, 2026
ca6e09c
fix(mobile): Duo feed scroll indicator stays left of the vertical bar…
juliusmarminge Nov 13, 2026
7bd9134
fix(server): turn diffs follow branch switches (#36343)
juliusmarminge Nov 13, 2026
b009582
fix(web): picking the previous branch after an outside checkout switc…
juliusmarminge Nov 13, 2026
0c28045
fix(server): systemd service starts again after its start limit tripp…
juliusmarminge Nov 13, 2026
eb81855
fix(server): branches in a fork checkout no longer show the fork main…
juliusmarminge Nov 13, 2026
f8dc37d
fix(web): floating preview resize holds its shape and ends when inter…
juliusmarminge Nov 13, 2026
250d372
fix(web): images in expanded tool rows page through the group's viewe…
juliusmarminge Nov 13, 2026
6bb9b7b
fix(web): auto-settle days save when the edit is finished, not on eve…
juliusmarminge Nov 13, 2026
e07585e
fix(desktop): AppImage updates keep their filename (#36306)
juliusmarminge Nov 13, 2026
51e1346
fix(relay): an iPad no longer gets a Done alert for every unrelated p…
juliusmarminge Nov 13, 2026
96a4d2f
fix(web): pasted URLs and paths keep their underscores (#36363)
juliusmarminge Nov 13, 2026
af28467
fix(mobile): reference links resolve across folds and artifact cards …
juliusmarminge Nov 13, 2026
4115648
fix(server): a folder that only holds a repository's worktrees is ref…
juliusmarminge Nov 13, 2026
65e4272
fix(server): a hung network mount no longer freezes the server when i…
juliusmarminge Nov 13, 2026
cfc71e1
fix(web): preview annotations in question answers reach the agent wit…
juliusmarminge Nov 13, 2026
1721f18
fix(web): clearing a running terminal keeps its screen and input mode…
juliusmarminge Nov 13, 2026
1da05a8
fix(server): a default branch the remote deleted no longer starts wor…
juliusmarminge Nov 13, 2026
38072bd
fix(desktop): new tabs the agent opens from links no longer steal com…
juliusmarminge Nov 13, 2026
9a455f0
fix(ssh): a renamed SSH connection keeps managing its remote server (…
juliusmarminge Nov 13, 2026
af9b4e4
fix(server): a worktree handoff on Claude or Pi completes its run and…
juliusmarminge Nov 13, 2026
0a6b3eb
fix(forgejo): Gitea branch PR lookups no longer read the whole pull r…
juliusmarminge Nov 13, 2026
9402dc3
fix(checkpoint): fetched upstream commits no longer show as agent cha…
juliusmarminge Nov 13, 2026
d772115
fix(server): terminal history keeps text after a CSI cut off by non-A…
juliusmarminge Nov 13, 2026
7ea6db4
fix(web): a mounted chat view no longer keeps every thread copy it re…
juliusmarminge Nov 13, 2026
b5b4705
fix(server): a Codex Stop that never completes offers Force stop (#36…
juliusmarminge Nov 13, 2026
0517d15
fix(web): provider sign-in links only open web addresses (#36392)
juliusmarminge Nov 13, 2026
aab388d
fix(server): Claude can show the user mid-turn text in full (#36384)
juliusmarminge Nov 13, 2026
9f94a87
fix(cli): tagged source builds report the release version (#36350)
juliusmarminge Nov 13, 2026
0b5f35c
fix(server): storage cleanup prunes idle No project folders under ~/.…
juliusmarminge Nov 13, 2026
93cbca3
fix(terminal): trimmed history no longer replays half of a control se…
juliusmarminge Nov 13, 2026
9ced4f1
fix(usage): a re-emitted Codex snapshot is no longer billed as a coun…
juliusmarminge Nov 13, 2026
931cd3a
fix(server): a Claude Monitor line no longer wakes a delegated child'…
juliusmarminge Nov 13, 2026
b35819c
fix(opencode): a lost subagent report no longer leaves a resumed call…
juliusmarminge Nov 13, 2026
bc7fe11
fix(web): a new worktree thread opened during a clone bases on the re…
juliusmarminge Nov 13, 2026
4ee3b60
fix(server): unauthenticated token requests no longer write DPoP repl…
juliusmarminge Nov 13, 2026
94aa3d7
fix(server): other sites can no longer frame the web app (#36395)
juliusmarminge Nov 13, 2026
5df5b44
fix(server): a server browser tab survives a renderer crash, and a se…
juliusmarminge Nov 13, 2026
1219f62
fix(web): T3 Connect sign-in offers Retry after Clerk fails to load (…
juliusmarminge Nov 13, 2026
dd2678d
fix(ci): macOS PR previews no longer run the PR's bundle next to sign…
juliusmarminge Nov 13, 2026
134ab31
fix(mobile): a new thread's first message no longer returns to the co…
juliusmarminge Nov 13, 2026
48cdefe
fix(web): size markdown media whose width and height carry a px unit …
juliusmarminge Nov 13, 2026
36f011d
fix(web): file links the agent cited from a checkout it cd'd into ope…
juliusmarminge Nov 13, 2026
70b0529
ci(mobile): iOS jobs run on macos-27, store builds require the final …
juliusmarminge Nov 13, 2026
5f95653
fix(server): Claude context meter no longer shows an auto-compact poi…
juliusmarminge Nov 13, 2026
c8db8be
fix(web): a run waiting on foreground subagents says so instead of Th…
juliusmarminge Nov 13, 2026
aaa3dba
fix(server): a follow-up to a delegated child waits for its awaited b…
juliusmarminge Nov 13, 2026
08b8689
fix(provider-grok): Grok follow-ups queue instead of cancelling the r…
juliusmarminge Nov 13, 2026
b537916
fix(server): thread list builds metadata only for the page it returns…
juliusmarminge Nov 13, 2026
3c1be11
fix(web): middle-clicking empty chat space on Linux no longer pastes …
juliusmarminge Nov 13, 2026
ab9e6a2
fix(web): closing Settings no longer leaves it as a back/forward stop…
juliusmarminge Nov 13, 2026
eb14ddb
fix(opencode): OpenCode 1.x threads report context-window usage (#36430)
juliusmarminge Nov 13, 2026
2d68968
fix(web): bare @ in the composer lists workspace files (#36435)
juliusmarminge Nov 13, 2026
6b47939
fix(mobile): thread list project filter lists recently active project…
juliusmarminge Nov 13, 2026
2d80cb6
fix(clients): live working timers count on the host's clock (#36420)
juliusmarminge Nov 13, 2026
770028f
perf(relay): lighter Postgres load and PS-160 cluster (#36442)
juliusmarminge Nov 13, 2026
a6d9140
fix(mobile): mobile:install --session works on pooled devices (#36447)
juliusmarminge Nov 13, 2026
9d8998b
fix(native): KDE SnapShot no longer loses the first reply from KWin (…
t3dotgg Nov 14, 2026
6689a04
fix(server): t3 connect status no longer reports a publish-only link …
juliusmarminge Nov 14, 2026
7ae21bf
fix(web): don't label Windows paths outside the workspace as relative…
ValeraZSD Nov 14, 2026
6bce222
fix(server): multi-line guest messages are no longer refused or store…
juliusmarminge Nov 14, 2026
88d4d06
perf(desktop): provider checks no longer compete with server startup …
t3dotgg Nov 14, 2026
cf382b0
fix(web,mobile): explain missing file access for host videos (#24637)
juliusmarminge Nov 14, 2026
44fefbc
fix(scripts): iOS scenarios prepare the dev client before leasing a d…
juliusmarminge Nov 14, 2026
4bab2f3
perf(server): a new thread's first turn starts sooner (#35710)
t3dotgg Nov 14, 2026
f5ae808
fix(provider-pi): running shell output no longer stores a snapshot ro…
juliusmarminge Nov 14, 2026
2a1caac
fix(web): NVDA browse mode reads the current thread's branch, not the…
nibarAhmed Nov 14, 2026
99e10f0
fix(server): T3 Connect clients are named "T3 Connect", not "T3 Conne…
juliusmarminge Nov 14, 2026
cbf0f0a
fix(web): screen readers read the Update everything machine list as a…
juliusmarminge Nov 14, 2026
42057b8
feat: agents can restyle T3 Code with theme colors and CSS (#35247)
t3dotgg Nov 14, 2026
e4f066d
fix(mobile): long-pressed iOS blockquotes no longer draw over the thr…
juliusmarminge Nov 14, 2026
9a4ec17
fix(cli): npm launcher no longer leaves a runtime running after a sto…
juliusmarminge Nov 14, 2026
a2edd28
feat(connect): require approval for new T3 Connect devices (#36419)
juliusmarminge Nov 14, 2026
ca1a028
fix(server): run the Azure CLI in UTF-8 on Windows (#25801)
PHSebastiao Nov 14, 2026
a37715c
fix(server): preview navigation leaves a page whose script never yiel…
juliusmarminge Nov 14, 2026
2a468ac
fix(server): the auto-settle sweep no longer rereads every idle branc…
juliusmarminge Nov 14, 2026
dea07a1
fix(web): rewind no longer offers file restore in project-folder thre…
juliusmarminge Nov 14, 2026
913181c
fix(server): stop the relay client a crashed server left running (#36…
juliusmarminge Nov 14, 2026
a7fd432
fix(server): read Azure DevOps pull request templates (#22881)
juliusmarminge Nov 14, 2026
67699df
perf(azure-devops): PR Code tab loads a page's files in one az run in…
Kieren-Foenander Nov 14, 2026
a9fd0b2
fix(web): copying a file preview selection returns the selected lines…
juliusmarminge Nov 14, 2026
da7ebc2
fix(mobile): push-token failures no longer report notifications as en…
juliusmarminge Nov 14, 2026
e371543
fix(provider-core): mise updates a tool configured by its backend nam…
juliusmarminge Nov 14, 2026
2a21f41
fix(server): parent turns no longer duplicate delegated task thread i…
juliusmarminge Nov 14, 2026
6fe782c
fix(server): Windows drive paths open under WSL (#26030)
juliusmarminge Nov 14, 2026
757f71a
fix(client-runtime): new T3 Connect machines appear without signing i…
juliusmarminge Nov 14, 2026
83ee1f5
fix(azure-devops): local pull request checkout no longer fails on --d…
Tabonx Nov 14, 2026
525f5b2
fix(usage): count shared Windows and WSL transcripts once (#24319)
juliusmarminge Nov 14, 2026
1a12c4a
fix(azure-devops): pull requests report build validation as checks (#…
Tabonx Nov 14, 2026
e5835c9
fix(desktop): WSL backend starts in distros without automounted drive…
juliusmarminge Nov 14, 2026
db2cc20
fix(server): t3 browser setup reloads an AppArmor profile that is on …
juliusmarminge Nov 14, 2026
44a8e95
fix(web): model settings no longer re-render every row on each star, …
juliusmarminge Nov 14, 2026
3ea253f
fix(server): suppress redundant keybindings change emission on unchan…
playlikeboy Nov 14, 2026
4c76857
fix(web): clicking a label in an inline HTML render no longer jumps t…
juliusmarminge Nov 14, 2026
37714a8
perf(desktop): revealing a file on Windows no longer waits on PowerSh…
lyn1dev Nov 14, 2026
0aeb945
fix(acp): preserve Windows shim stdio pipes (#30544)
ElliotDrel Nov 14, 2026
fcf50ff
fix(connect): T3 Connect recovers when its tunnel is routed to a dead…
ishaanko Nov 14, 2026
6bc105f
fix(editors): find JetBrains IDEs whose Toolbox script is named idea1…
only21mil Nov 14, 2026
580b526
fix(server): respect the default Windows file manager (#28205)
prov3ntus Nov 14, 2026
34cf030
fix(web): pull requests error names the environment that failed (#27882)
juliusmarminge Nov 14, 2026
eea9d15
fix(desktop): Windows folders dropped on a WSL backend insert their W…
juliusmarminge Nov 14, 2026
be78ee4
fix(server): stopping an agent's server no longer wakes Codex as if i…
juliusmarminge Nov 14, 2026
d9619ad
fix(web): stop offering T3 Connect routes for the desktop's own WSL b…
juliusmarminge Nov 14, 2026
a472342
fix(web): screen readers no longer say "Message" twice entering the c…
nibarAhmed Nov 14, 2026
a35fd81
fix(server): settlement sweep reads quiet open pull requests every 5 …
juliusmarminge Nov 14, 2026
31d9b3b
fix(web): edited HTML previews outside the workspace no longer turn w…
sti0 Nov 14, 2026
ddc3652
fix(forgejo): the fj sign-in hint points subpath servers to tea (#36290)
shailist Nov 14, 2026
62ba72f
fix(web): onboarding rechecks an agent when its install command finis…
artbom Nov 14, 2026
bd9ff7e
fix(client-runtime): recover thread list updates after stream defects…
shivamhwp Nov 14, 2026
2dd6cdd
fix(shared): @ mentions complete display names in any script (#36504)
JS-coder-K Nov 14, 2026
56fd98b
perf(web): batch first-send composer updates (#36166)
StiensWout Nov 14, 2026
9803d1a
fix(web): paint the selected environment theme from the first frame o…
darjss Nov 14, 2026
2c61677
fix(web): overlays close on a click over the desktop header (#36250)
rgrvlsk Nov 14, 2026
ea957b5
fix(server): give MCP clients an absolute attachment upload URL (#35907)
LucaDOrso Nov 14, 2026
4a53d80
fix(server): database folders on btrfs are No_COW so SQLite stops fra…
juliusmarminge Nov 14, 2026
7847ec9
fix(web): preserve queued project settings changes (#35741)
saphid Nov 14, 2026
8656cdb
fix(web): reply labels no longer cut an emoji in half (#35701)
ck0i Nov 14, 2026
388424d
fix(shared): capture shell values after profiles replace PATH (#35617)
Lucenx9 Nov 14, 2026
e1f5b68
fix(server): MCP tools say why the orchestrator refused (#36083)
SouthCarpet Nov 14, 2026
5ef603d
fix(web): remove routine success notifications (#36527)
Yash-Singh1 Nov 14, 2026
9d6da45
fix(server): idle delegated tasks when recovery holds follow-ups (#36…
Yash-Singh1 Nov 14, 2026
058eea9
fix(pr): hide unsupported GitCafe review reactions (#36171)
saphitv Nov 14, 2026
0516493
fix(web): align status text and tighten pull request menu spacing (#3…
Yash-Singh1 Nov 14, 2026
d899bdd
fix(gitlab): long merge request descriptions no longer break the list…
fixfon Nov 14, 2026
4c47315
fix(server): overlapping VCS status refreshes share one follow-up ref…
only21mil Nov 14, 2026
25c5032
fix(devices): require a complete Android SDK on SSH hosts (#24566)
juliusmarminge Nov 14, 2026
6d94997
fix(opencode): support explicit background waits (#35272)
AndreiShenets Nov 14, 2026
aecad62
fix(opencode): a failed steer no longer leaves the turn running forev…
only21mil Nov 14, 2026
033bb5a
fix(ssh): failed launches report only their own output (#35717)
saphid Nov 14, 2026
83d2382
fix(opencode): OpenCode 1.x background subagents no longer show as do…
Mach1212 Nov 14, 2026
99071c4
fix(codex): delegate_task children start as Codex subagents (#36525)
juliusmarminge Nov 14, 2026
8247952
fix(marketing): route mobile downloads to app stores (#24577)
juliusmarminge Nov 14, 2026
cee16bd
fix(desktop): start WSL backends in Linux home (#35719)
satyalyadav Nov 14, 2026
96051c6
fix(server): prevent legacy terminal history collisions across thread…
juliusmarminge Nov 14, 2026
cf60628
fix(client-runtime): cache running threads when their view closes (#2…
maria-rcks Nov 14, 2026
0893180
fix(server): report the actual preview snapshot timeout (#24130)
Wosca Nov 14, 2026
a81ec88
fix(clients): allow portable provider handoffs after detach (#24641)
juliusmarminge Nov 14, 2026
bf9b8b7
fix(server): Claude on Bedrock runs the model picked in the composer …
only21mil Nov 14, 2026
70be204
fix: re-ticking a file after a push no longer shows it Viewed (#24151)
only21mil Nov 14, 2026
1ed6e32
fix(ssh): ignore alias commands and TTY requests for T3 connections (…
juliusmarminge Nov 14, 2026
fe873f8
fix(web): confirm before deleting scheduled tasks (#23578)
only21mil Nov 14, 2026
a8e60d4
fix(release): require complete updater manifests (#23700)
parmartejass Nov 14, 2026
ac18091
fix(web): seeded models yield to started thread selections (#24619)
juliusmarminge Nov 14, 2026
33372a2
fix(pi): info notifications no longer render as warnings (#23506)
0xCUB3 Nov 14, 2026
ca7a944
fix(client-runtime): Reconnect works while the network reports offlin…
only21mil Nov 14, 2026
294e061
fix(shared): IPv6 SCP remotes match SSH repository identities (#36547)
StiensWout Nov 14, 2026
5abf383
fix(server): prevent lossy edits of non-UTF-8 workspace files (#36545)
StiensWout Nov 14, 2026
a760a3a
fix(desktop): keyboard-opened message link menus select their first i…
only21mil Nov 14, 2026
e80468b
fix(server): report invalid provider events without a second schema f…
StiensWout Nov 14, 2026
a3477a5
fix(server): branch refresh no longer waits for detailed Git status (…
MINIlaolao Nov 14, 2026
1f55acf
fix(client-runtime): refresh settled counts when threads move project…
StiensWout Nov 14, 2026
00ec286
fix(mobile): adaptive SVG project icons follow the app's color scheme…
tomhmoses Nov 14, 2026
efae4e9
fix(client): retry unread thread visits after reconnect (#36559)
StiensWout Nov 14, 2026
46b508d
fix(web): keep long ACP registry searches within the query limit (#23…
only21mil Nov 14, 2026
248f5b6
fix(preview): browser tabs follow the default appearance (#24658)
juliusmarminge Nov 14, 2026
d530d96
fix(desktop): inherit login-shell Android SDK selection (#24623)
juliusmarminge Nov 14, 2026
a8777e4
fix(server): held agent messages no longer block settling (#24891)
mkantautas Nov 14, 2026
9e180e5
fix(server): file editor saves keep a UTF-8 BOM (#36552)
StiensWout Nov 14, 2026
86d49da
fix(server): open stable Zed when a prerelease Zed is first on PATH (…
only21mil Nov 14, 2026
b2259d3
fix(web): show working state while provider sessions start (#23590)
only21mil Nov 14, 2026
7bf7527
fix(devices): agents can test the mobile app on remote device hosts (…
t3dotgg Nov 14, 2026
410177c
fix(gitlab): create fork merge requests in the source project (#23439)
yashranaway Nov 14, 2026
8b30961
fix(server): allow slow worktree base fetches to finish (#24604)
juliusmarminge Nov 14, 2026
f315da3
fix(shared): PASS and FAIL badges stay readable in dark command outpu…
WesleySmits Nov 14, 2026
947c056
fix(web): a context submenu near the right edge no longer covers its …
Brechard Nov 14, 2026
3fe0fbb
fix(web): keep file uploads when returning a draft to its environment…
StiensWout Nov 14, 2026
fd0ffd0
fix(web): a stale tab no longer erases finalized stashed images (#36574)
StiensWout Nov 14, 2026
2f2730c
fix(server): task_status says starting until the child's provider sta…
only21mil Nov 14, 2026
d2bdd58
fix(server): npm provider updates only offer versions npm will instal…
davisonio Nov 14, 2026
5e06246
fix(web): recovered queued edits keep their mentions and context (#36…
StiensWout Nov 14, 2026
35d01dc
perf(acp): long ACP threads reopen without per-chunk history copies (…
only21mil Nov 14, 2026
4d5d5f8
fix(source-control): preserve .git in Azure DevOps repository names (…
StiensWout Nov 14, 2026
4652544
fix(server): interrupted checkpoints no longer leak temporary packs (…
razzeee Nov 14, 2026
306914f
fix(client-runtime): grouped projects no longer take one folder's nam…
ThomasVuNguyen Nov 14, 2026
bebaf3e
fix(pi): resumed threads run in the worktree after a handoff (#36586)
juliusmarminge Nov 14, 2026
d0a494f
fix(server): honor the configured push remote on tracked branches (#2…
only21mil Nov 14, 2026
000d82d
fix(web): Esc closes the theme editor, not Settings (#25130)
AatmanAJ Nov 14, 2026
c0b140b
fix(server): file changes with an empty list keep their file name (#3…
MinitJain Nov 14, 2026
b4c1bd1
fix(web): re-picking the current model in Settings keeps its traits (…
f4llenz Nov 14, 2026
2b6145b
fix(web): browser tests no longer pick a port Windows has reserved (#…
Zacharon Nov 14, 2026
e4688f7
fix(server): find files in newline-named nested worktrees (#36588)
StiensWout Nov 14, 2026
28f1786
fix(web): recreated folders no longer show deleted files (#36590)
StiensWout Nov 14, 2026
3b18dc2
fix(web): manual compaction counts history beyond the loaded page (#2…
jason5545 Nov 14, 2026
2fa77fb
fix(web): horizontal table scrolling preserves timeline follow (#24045)
nateEc Nov 14, 2026
83a276d
fix(server): setup scripts complete with shell line editors (#25472)
maria-rcks Nov 14, 2026
a61291e
fix(shared): one-letter link schemes no longer become file links on W…
Zacharon Nov 14, 2026
4192234
fix(usage): distinct email-less hub accounts no longer collapse (#36561)
StiensWout Nov 14, 2026
75c544a
fix(pi): async pi-subagents workflow, chain and parallel members show…
juliusmarminge Nov 14, 2026
651accb
fix(web): new browser tabs open at your default zoom and appearance (…
BilalIrfanContact Nov 14, 2026
9e19b7f
feat(server): resume stopped provider threads natively (#36526)
Yash-Singh1 Nov 14, 2026
4574c60
fix(web): preserve saved notebook traceback frame boundaries (#36602)
StiensWout Nov 14, 2026
d6244ac
fix(web): preserve literal entities in EPUB CDATA (#36595)
StiensWout Nov 14, 2026
953ce60
fix(web): changed root files with a leading space open in the diff pa…
StiensWout Nov 14, 2026
43ba62b
fix(server): thread reads wait for pending background work (#36610)
StiensWout Nov 14, 2026
91fa913
fix(server): partial import retries no longer certify missing message…
StiensWout Nov 14, 2026
4b99420
fix(server): background subagents stop running when their Claude sess…
juliusmarminge Nov 14, 2026
b37c959
fix(server): open colon-number project folders correctly in VS Code (…
StiensWout Nov 14, 2026
4121b30
fix(mobile): the open button no longer covers inline page headings (#…
saphid Nov 14, 2026
02e29ce
perf(usage): show saved totals before scanning history (#25711)
hieu-lee Nov 14, 2026
89f1acb
fix(pi): text generation uses the thinking level picked in Settings (…
MarcoDotIO Nov 14, 2026
0fee26d
fix(mobile): launch terminal commands after the measured resize (#36584)
StiensWout Nov 14, 2026
13f89ae
fix(server): repeated imports reach older worktree history (#36608)
StiensWout Nov 14, 2026
8a072ca
fix(ci): pin unenv so release smoke installs resolve its exact peer (…
juliusmarminge Nov 14, 2026
38b3fee
fix(server): cached refs include a newly checked-out external branch …
StiensWout Nov 14, 2026
820f620
fix(web): model picks no longer inherit another model’s traits (#36621)
StiensWout Nov 14, 2026
298c38d
fix(server): subagent hover cards show reasoning effort again (#35333)
Bil0000 Nov 14, 2026
f3b43ef
fix(server): a hung Codex app-server no longer blocks every later Cod…
MahirAbbas Nov 14, 2026
df8c1a1
fix(web): Narrator highlights the sidebar thread title where it is dr…
SunkenInTime Nov 14, 2026
f2764f7
fix(desktop): desktop tests no longer race to install Electron (#26654)
Moinax Nov 14, 2026
9ff435b
fix(server): pause service restart when disk is full (#25924)
gyurix Nov 14, 2026
4c2f04d
fix(web): queued runs, relationships and changed files no longer re-r…
Batuhan1999 Nov 14, 2026
487733b
fix(server): recover Claude cooldown reset times from proxy errors (#…
juliusmarminge Nov 14, 2026
5958d00
perf(web): Update everything downloads a server's update while provid…
Bil0000 Nov 14, 2026
6be1bd6
perf(cursor): long command output streams without copying its tail pe…
hieu-lee Nov 14, 2026
045d8d1
Merge remote-tracking branch 'upstream/main' into yordis/chore-sync-u…
yordis Nov 14, 2026
1ac9b67
refactor(web): use upstream's sidebar folder drop
yordis Nov 14, 2026
842d127
fix(desktop): dev launcher tests no longer trip on backend cleanup
yordis Nov 14, 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
  •  
  •  
  •  
13 changes: 9 additions & 4 deletions .agents/skills/test-t3-mobile/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,15 @@ 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.
cloud, or remote host), run `vp run mobile:install <ios|android> --session <s>
--config <file>` from the directory you opened the session in, passing the
`--config` file from `device_open`'s `targetArgs`. Without it, a device pool's
gateway refuses the install, wrongly saying agent-device is too old. It installs
the cached build into that session (`--abi arm64-v8a` for an ARM Android device;
pool Android emulators are x86_64, the default; `--metro <url>` also opens it
against Metro). Without a cached build for this checkout it builds first, which can
outlast the lease, so run `vp run mobile:install <ios|android> --prepare` (with
the same `--abi`) before you open the device.

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
1 change: 1 addition & 0 deletions .github/VOUCHED.td
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ github:btsouth
github:cestercian
github:chrisdeeming
github:chuks-qua
-github:coygeek Filed over 270 automated issues, about 50 a day at peak, far past what maintainers can triage
github:cursoragent
github:D3OXY
github:dbalders
Expand Down
5 changes: 1 addition & 4 deletions .github/workflows/agent-context-budget.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,7 @@ on:
permissions:
contents: read

concurrency:
group: agent-context-budget-${{ github.event.pull_request.number }}
cancel-in-progress: true

# No concurrency group: label events arrive in bursts, and a cancelled run reports as a failed check.
jobs:
budget:
name: Agent context budget
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/desktop-macos-preview-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,7 @@ jobs:
rust_target: aarch64-apple-darwin
resource_key: darwin-arm64
cli_archive: false
untrusted_bundle: true

# Release assets download without a GitHub account, unlike workflow
# artifacts. All preview DMGs live on one rolling prerelease tagged
Expand Down
77 changes: 77 additions & 0 deletions .github/workflows/issue-vouch.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
name: Issue Vouch

on:
issues:
types: [opened, reopened]
push:
branches:
- main
paths:
- .github/VOUCHED.td
- .github/workflows/issue-vouch.yml
workflow_dispatch:

permissions:
contents: read
issues: write

concurrency:
group: issue-vouch-${{ github.event.issue.number || 'all' }}
cancel-in-progress: true

jobs:
label:
name: Label issues by author trust
runs-on: ubuntu-24.04
steps:
- uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
with:
script: |
const { owner, repo } = context.repo;
// Only listed authors get a label; open issues number in the thousands,
// so unvouched is the default and stays unlabelled.
const labelByStatus = { vouched: "vouch:trusted", denounced: "vouch:denounced" };
const managedLabelNames = new Set(["vouch:trusted", "vouch:unvouched", "vouch:denounced"]);
const { data: file } = await github.rest.repos.getContent({
owner,
repo,
path: ".github/VOUCHED.td",
ref: context.payload.repository.default_branch,
});
const statusByUser = new Map();
for (const raw of Buffer.from(file.content, "base64").toString("utf8").split("\n")) {
const match = /^(-?)github:(\S+)/.exec(raw.trim());
if (match) statusByUser.set(match[2].toLowerCase(), match[1] ? "denounced" : "vouched");
}
const issues =
context.eventName === "issues"
? [context.payload.issue]
: (
await github.paginate(github.rest.issues.listForRepo, {
owner,
repo,
state: "open",
per_page: 100,
})
).filter((issue) => !issue.pull_request);
for (const issue of issues) {
const status = statusByUser.get(issue.user.login.toLowerCase());
const next = labelByStatus[status];
const current = issue.labels.map((label) => label.name).filter((name) => managedLabelNames.has(name));
for (const name of current) {
if (name === next) continue;
try {
await github.rest.issues.removeLabel({ owner, repo, issue_number: issue.number, name });
} catch (error) {
if (error.status !== 404) throw error;
}
}
if (next && !current.includes(next)) {
await github.rest.issues.addLabels({ owner, repo, issue_number: issue.number, labels: [next] });
core.info(`Issue #${issue.number} (${issue.user.login}): ${status} -> ${next}`);
}
}
10 changes: 3 additions & 7 deletions .github/workflows/mobile-eas-production.yml
Original file line number Diff line number Diff line change
Expand Up @@ -673,8 +673,8 @@ jobs:
echo ":rocket: android: submitted and recorded \`$BUILD_TAG\`" >> "$GITHUB_STEP_SUMMARY"

# Off unless the MOBILE_IOS_LOCAL_BUILDS repository variable is `true`; the
# production job only sets ios_build then. Store binaries need the final
# Xcode 27.1; MOBILE_IOS_ALLOW_XCODE_RC=true accepts the release candidate.
# production job only sets ios_build then. Xcode 27.1 matches the EAS build
# image in eas.json.
# No sticky disk: it mounts ext4 and only works on Linux runners.
ios:
name: iOS store build
Expand All @@ -694,7 +694,6 @@ jobs:
EXPO_TOKEN: ${{ secrets.EXPO_PRODUCTION_TOKEN }}
PROFILE: ${{ needs.production.outputs.ios_profile }}
BUILD_TAG: mobile-ios-build/${{ needs.production.outputs.ios_profile }}/${{ needs.production.outputs.ios_version }}/${{ needs.production.outputs.ios_fingerprint }}
ALLOW_XCODE_RC: ${{ vars.MOBILE_IOS_ALLOW_XCODE_RC == 'true' }}
steps:
- name: Checkout
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
Expand Down Expand Up @@ -732,12 +731,9 @@ jobs:
if: steps.record.outputs.built != 'true'
run: |
xcode=/Applications/Xcode_27.1.app
if [ ! -d "$xcode" ] && [ "$ALLOW_XCODE_RC" = "true" ]; then
xcode=/Applications/Xcode_27.1_Release_Candidate.app
fi
if [ ! -d "$xcode" ]; then
ls -d /Applications/Xcode*.app
echo "::error::Xcode 27.1 (final) is not on this runner. Set the MOBILE_IOS_ALLOW_XCODE_RC repository variable to true to build store binaries with the release candidate."
echo "::error::Xcode 27.1 is not on this runner."
exit 1
fi
sudo xcode-select -s "$xcode/Contents/Developer"
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/pr-vouch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -101,17 +101,17 @@ jobs:
{
name: "vouch:trusted",
color: "1f883d",
description: "PR author is trusted by repo permissions or the VOUCHED list.",
description: "Author is trusted by repo permissions or the VOUCHED list.",
},
{
name: "vouch:unvouched",
color: "fbca04",
description: "PR author is not yet trusted in the VOUCHED list.",
description: "Author is not yet trusted in the VOUCHED list.",
},
{
name: "vouch:denounced",
color: "d1242f",
description: "PR author is explicitly blocked by the VOUCHED list.",
description: "Author is explicitly blocked by the VOUCHED list.",
},
];

Expand Down
15 changes: 15 additions & 0 deletions .github/workflows/release-desktop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,12 @@ on:
required: false
default: false
type: boolean
# Whether the JS bundle came from a pull request. This job holds the
# signing secrets, so packaging then skips every step that runs the bundle.
untrusted_bundle:
required: false
default: false
type: boolean
# A runner of the target's own platform and architecture, for a `runner`
# that cannot execute the target. The build job skips everything that
# runs the packaged binaries, and a second job runs it there.
Expand Down Expand Up @@ -134,6 +140,14 @@ jobs:
T3CODE_CLERK_CLI_OAUTH_CLIENT_ID: ${{ inputs.clerk_cli_oauth_client_id }}
T3CODE_RELAY_URL: ${{ inputs.relay_url }}
steps:
# The launch check and the CLI archive smoke test both run the bundle.
- name: Reject running an untrusted bundle
if: inputs.untrusted_bundle && (inputs.launch_check || inputs.cli_archive)
shell: bash
run: |
echo "::error::untrusted_bundle cannot be combined with launch_check or cli_archive, which run the bundle."
exit 1
# This repository is public, so Git needs no credentials. checkout's
# credential cleanup runs submodule foreach even with submodules disabled,
# which fails on the orphaned gitlinks in our vendored .repos tree.
Expand Down Expand Up @@ -573,6 +587,7 @@ jobs:
pnpm_config_prefer_offline: "true"
T3CODE_DESKTOP_REUSE_RESOURCE_MONITOR: true
T3CODE_DESKTOP_REUSE_LINUX_CAPTURE_HELPERS: ${{ steps.capture_helper_cache.outputs.cache-hit == 'true' }}
T3CODE_DESKTOP_UNTRUSTED_BUNDLE: ${{ inputs.untrusted_bundle }}
CSC_LINK: ${{ secrets.CSC_LINK }}
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }}
Expand Down
34 changes: 6 additions & 28 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -903,34 +903,12 @@ jobs:
fi

# electron-updater reads one manifest per platform and channel and picks
# the file entry whose name carries the running arch, so the per-arch
# manifests the build jobs wrote are merged back into that one file.
- name: Merge macOS updater manifests
# the file entry whose name carries the running arch. Require every
# platform's two build jobs to have produced matching metadata before
# merging it, so a successful release can never strand one architecture.
- name: Merge desktop updater manifests
if: needs.preflight.outputs.release_channel != 'preview'
run: |
shopt -s nullglob
for x64_manifest in release-assets/*-mac-x64.yml; do
arm64_manifest="${x64_manifest%-x64.yml}.yml"
if [[ -f "$arm64_manifest" ]]; then
node scripts/merge-update-manifests.ts --platform mac "$arm64_manifest" "$x64_manifest"
rm -f "$x64_manifest"
fi
done

- name: Merge Windows updater manifests
if: needs.preflight.outputs.release_channel != 'preview'
run: |
shopt -s nullglob
for x64_manifest in release-assets/*-win-x64.yml; do
arm64_manifest="${x64_manifest%-x64.yml}-arm64.yml"
merged_manifest="${x64_manifest%-win-x64.yml}.yml"
if [[ -f "$arm64_manifest" ]]; then
node scripts/merge-update-manifests.ts --platform win "$x64_manifest" "$arm64_manifest" "$merged_manifest"
rm -f "$x64_manifest" "$arm64_manifest"
else
mv "$x64_manifest" "$merged_manifest"
fi
done
run: node scripts/merge-release-update-manifests.ts release-assets

# Updater manifests and blockmaps are what electron-updater consumes.
# They are only listed for channels an updater is meant to follow.
Expand Down Expand Up @@ -1054,7 +1032,7 @@ jobs:
name: Check the update feed
needs: [preflight, release]
if: ${{ !cancelled() && github.repository == 'pingdotgg/t3code' && ((github.event_name == 'schedule' && vars.PAUSE_NIGHTLY != 'true') || needs.preflight.outputs.release_channel == 'nightly') }}
runs-on: blacksmith-2vcpu-ubuntu-2404
runs-on: ubuntu-24.04
timeout-minutes: 5
permissions:
contents: write
Expand Down
4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# T3 Code

T3 Code is a minimal GUI for coding agents. A Node WebSocket server wraps provider CLIs and agents (Codex, Claude Code, Cursor, Grok, OpenCode, Antigravity, Kiro) and serves web, desktop, and mobile clients.
T3 Code is a minimal GUI for coding agents. A Node WebSocket server wraps provider CLIs and agents (Codex, Claude Code, Cursor, Grok, OpenCode, Antigravity, Kiro, Pi, Muse Code, fx) and serves web, desktop, and mobile clients.

You can think of T3 Code as an open source "bring-your-own-subscription" alternative to apps like Claude Desktop, Codex App, Cursor Glass and Conductor.

Expand Down Expand Up @@ -68,7 +68,7 @@ The most common defect in this repo is a change that works on the path you teste

- **Entry points.** A behavior reachable from the chat view is usually also reachable from Settings, the command palette, and a keybinding. Fixing one is not fixing the feature.
- **Clients.** Web, desktop (wraps web, adds Electron shell/IPC), and mobile (React Native, separate navigation). Shared logic lives in `packages/client-runtime`
- **Providers.** Codex, Claude, Cursor, Grok, OpenCode, Antigravity, and Kiro each have an adapter. Provider-shaped features need a decision per adapter, even if the decision is "not supported here".
- **Providers.** Codex, Claude, Cursor, Grok, OpenCode, Antigravity, Kiro, Pi, Muse Code, fx, and ACP Registry each have an adapter. Provider-shaped features need a decision per adapter, even if the decision is "not supported here".
- **Agents.** A capability a user can trigger is usually one an agent should reach through MCP tools, and scheduled tasks run the same paths. That only works when it is a service method, not handler code.
- **Contracts.** Anything crossing the wire is typed in `packages/contracts`. Change the schema and the server, web, mobile, and desktop all follow.
- **Reverse states.** If you added a way in, add the way out and the way to see it. Snooze needs unsnooze. Close needs reopen. A one-way door is a bug.
Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/scripts/dev-electron.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ function matchDevBackends(command, args) {
return (
NodeChildProcess.spawnSync(command, [...args, "-f", "--", devBackendPattern(desktopDir)], {
stdio: "ignore",
}).status === 0
})?.status === 0
);
}

Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/scripts/electron-launcher.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ async function startupCleanupPattern(desktopDir) {
await runDevElectronStartup({
desktopDir,
spawnSync: (command, args) => {
if (command === "pkill" && args.includes("-f")) pattern = args.at(-1);
if (command === "pkill" && args.includes("-f")) pattern ??= args.at(-1);
},
});
assert.isString(pattern);
Expand Down
4 changes: 4 additions & 0 deletions apps/desktop/scripts/ensure-electron-runtime.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,10 @@ export function ensureElectronRuntime() {
return electronPath;
}

export function setup() {
ensureElectronRuntime();
}

// `file://${argv[1]}` never matches on Windows (drive letters need `file:///C:/`).
if (process.argv[1] && NodeURL.pathToFileURL(process.argv[1]).href === import.meta.url) {
const electronPath = ensureElectronRuntime();
Expand Down
18 changes: 15 additions & 3 deletions apps/desktop/src/app/DesktopApp.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ it.effect.each([false, true])(
const historyStarted = yield* Deferred.make<void>();
const releaseHistory = yield* Deferred.make<void>();
const quitting = yield* Ref.make(false);
const tokenRequested = yield* Deferred.make<void>();
const events: string[] = [];
const record = (event: string) =>
Effect.sync(() => {
Expand Down Expand Up @@ -144,7 +145,7 @@ it.effect.each([false, true])(
configure: Effect.void,
} as PreviewPasskeys.PreviewPasskeys["Service"]),
Effect.provideService(DesktopApplicationMenu.DesktopApplicationMenu, {
configure: Effect.void,
configure: record("menu"),
}),
Effect.provideService(DesktopUpdates.DesktopUpdates, {
configure: Effect.void,
Expand Down Expand Up @@ -222,7 +223,12 @@ it.effect.each([false, true])(
Layer.mock(DesktopClientSettings.DesktopClientSettings, {}),
Layer.mock(DesktopConnectionCatalogStore.DesktopConnectionCatalogStore, {}),
Layer.mock(DesktopIpc.DesktopIpc, {}),
Layer.mock(DesktopLocalEnvironmentAuth.DesktopLocalEnvironmentAuth, {}),
Layer.mock(DesktopLocalEnvironmentAuth.DesktopLocalEnvironmentAuth, {
getBearerToken: record("token").pipe(
Effect.andThen(Deferred.succeed(tokenRequested, undefined)),
Effect.as("token"),
),
}),
Layer.mock(DesktopManagedPolicy.DesktopManagedPolicy, {}),
Layer.succeed(DesktopPrimaryPaste.DesktopPrimaryPaste, { enabled: true }),
Layer.mock(DesktopSshEnvironment.DesktopSshEnvironment, {}),
Expand Down Expand Up @@ -253,7 +259,13 @@ it.effect.each([false, true])(
);
yield* Deferred.await(registrationStarted);
yield* Deferred.await(windowStarted);
assert.deepEqual(events, ["identity", "ready", "identity", "backend", "window"]);
yield* Deferred.await(tokenRequested);
// The backend spawns before menus, and its token is minted without waiting for the renderer.
assert.deepEqual(
events.filter((event) => event !== "token"),
["identity", "ready", "identity", "backend", "menu", "window"],
);
assert.isAbove(events.indexOf("token"), events.indexOf("backend"));
assert.isFalse(yield* Deferred.isDone(registrationStopped));
const shutdown = yield* DesktopShutdown.DesktopShutdown;
yield* shutdown.request;
Expand Down
Loading
Loading