Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
324 commits
Select commit Hold shift + click to select a range
16233e7
fix(web): typed answer moved to the draft by an option click is annou…
voida6 Nov 1, 2026
c6bde56
fix(relay): long CJK titles no longer stop Live Activity updates (#24…
only21mil Nov 1, 2026
ef6e05e
fix(themes): accept VS Code JSONC imports (#25375)
mayesidev Nov 1, 2026
503bf77
fix(web): prevent sidebar shelf animations from overlapping headers (…
brandon-julio-t Nov 1, 2026
1ad7861
fix(web): keep the default instance's draft model off custom instance…
matthias-scale Nov 1, 2026
5ff1482
fix(acp): cancelled plan steps no longer keep the plan running (#25564)
MarcoDotIO Nov 1, 2026
9ee7da6
fix(mobile): handle image drops in the Android composer (#25573)
12ya Nov 1, 2026
7370b92
fix(server): run_scheduled_task_now says why a run was refused (#25647)
SouthCarpet Nov 1, 2026
213b391
fix(web): composer emphasis shortcuts ignore delimiters inside inline…
egefeyzioglu Nov 1, 2026
b5ced43
fix(web): local visit migration preserves mark unread (#25746)
Michaelihc Nov 1, 2026
c3f0a6c
fix(provider-acp-registry): reopening a Kimi thread no longer collaps…
AKolenda Nov 1, 2026
dcd9adc
docs(readme): list fx as a supported provider (#25974)
DarlingtonDeveloper Nov 1, 2026
cbd43b6
fix(web): PR links at launch open the PR view with the local environm…
NotAnNvidiaFan Nov 1, 2026
1dacdb9
fix(web): sidebar jump hints are readable and sit in the status slot …
G-R3 Nov 1, 2026
6525e4c
fix(web): maximize button no longer jumps when the right panel closes…
Claudesaul Nov 1, 2026
28bfae0
fix(acp): a lost or locked Copilot session restarts on the next messa…
ianrowe12 Nov 1, 2026
d1049c4
perf(web): terminal snapshots reuse WASM memory views (#26717)
hieu-lee Nov 1, 2026
17c837c
fix(acp): Plan mode switches Copilot into its native plan mode (#26951)
Radu028 Nov 1, 2026
22ee8a4
fix(cursor): ignore a stale Keychain login when Cursor is not install…
riccardopll Nov 1, 2026
d64888f
fix(web): Escape while recording a shortcut no longer closes Settings…
treiber Nov 1, 2026
e8c70f5
fix(mobile): a closed empty search stays closed after returning (#27184)
camchis Nov 1, 2026
623344a
fix(antigravity): accept empty startup skill directories (#27191)
Gieveppix Nov 1, 2026
c404763
fix(mobile): TalkBack reads the message field before Send (#27249)
nibarAhmed Nov 1, 2026
6866a2d
fix(cli): trace summary no longer prints near-second durations as "10…
MarcoDotIO Nov 1, 2026
0743ba5
fix(shared): branch names keep accented letters as plain letters (#27…
MarcoDotIO Nov 1, 2026
1a2983f
fix(provider-core): provider updates find npm on the provider's custo…
ashx-j Nov 1, 2026
e0fa102
fix(web): changing the sidebar project filter starts the list at the …
Mnigos Nov 1, 2026
cae3ced
fix(web): find the fallback model in Settings search (#27376)
voltcrash Nov 1, 2026
868524f
fix(web): Backspace no longer re-nests a checkbox under a bullet (#27…
Geuni620 Nov 1, 2026
6d584fa
perf(server): reuse compiled modules for CLI commands (#27433)
voltcrash Nov 1, 2026
fbe137d
fix(server): preview tab list shows desktop tabs that loaded before t…
camchis Nov 1, 2026
e71f414
fix(web): Esc in the theme color picker restores the previous color (…
drdator Nov 1, 2026
6977721
fix(shared): preserve escaped trailing whitespace in CLI arguments (#…
macodev00 Nov 1, 2026
c018660
fix(shared): preserve surrogate pairs in truncated CSV cells (#27497)
macodev00 Nov 1, 2026
84ad7ae
fix(gitlab): report an expired glab OAuth login as an auth error (#27…
WalshyDev Nov 1, 2026
854247e
fix(web): expanded SVG diagrams fill the image viewer (#27519)
melbaldove Nov 1, 2026
cb1de7b
fix(web): configure reasoning for the fallback model (#27593)
BelKed Nov 1, 2026
dc9b1a5
fix(web): keep diff base selector available after errors (#27635)
NathanGlasby Nov 1, 2026
cbb0417
fix(mobile): resume continues a usage-limited thread before its queue…
AbdelrahmanTamer21 Nov 1, 2026
f702f89
fix(client): a new thread's content no longer stays blank after an ea…
willadamskeane Nov 1, 2026
aa8dbbe
fix(web): skill labels show the skill's own name (#27741)
juuulianx Nov 1, 2026
5cc1985
fix(server): disclose truncated history in imported threads (#27743)
voltcrash Nov 1, 2026
6843eff
fix(opencode): recover Go limits after a startup timeout (#27757)
voltcrash Nov 1, 2026
1917c8a
fix(server): worktree threads get their generated branch name when a …
MarcoDotIO Nov 1, 2026
5bb50dc
fix(server): restart continuation checks before repeating side effect…
xlurie Nov 1, 2026
6dddccb
fix(shared): /Model with a query still opens the model picker (#27837)
samkelly880 Nov 1, 2026
aa33734
fix(server): empty primary cookie no longer blocks bearer auth (#27848)
samkelly880 Nov 1, 2026
a62452a
perf(mobile): text files open in half the time on a remote host (#27850)
camchis Nov 1, 2026
bc448b8
fix(web): composer fallback keeps the effort of a model saved under a…
mkantautas Nov 1, 2026
dabab45
perf(server): skip no-op settlement decisions (#27897)
omar7550 Nov 1, 2026
34cfd24
fix(codex): a failed write to the app-server no longer leaves request…
trevoedwards Nov 1, 2026
626d602
perf(server): projects without a repository stop spawning git on ever…
Pyseph Nov 1, 2026
4773ab7
fix(server): scheduled tasks start from the default branch, not alway…
tuanvumaihuynh Nov 1, 2026
ef4c658
fix(server): subagent threads no longer inherit a pending title job (…
Dreighto Nov 1, 2026
77a728e
fix(web): show mixed automatic defaults across environments (#28005)
jtatum Nov 1, 2026
1794830
fix(client): the folder browser shows folders added or removed while …
Umais-Adeed Nov 1, 2026
fad507c
fix(mobile): chat folds stay closed until tapped, as on web and deskt…
Umais-Adeed Nov 1, 2026
71d52eb
fix(web): align composer context icons and space their labels (#28083)
voltcrash Nov 1, 2026
5651d76
fix(web): horizontal scrolling inside diff and file panes no longer s…
EtanHey Nov 1, 2026
1f9d4de
fix(server): remember T3 Connect HTTP/2 fallback across restarts (#28…
voltcrash Nov 1, 2026
7f443ab
fix(server): provider updates no longer time out mid-download (#28132)
Ajraba04 Nov 1, 2026
4c91892
fix(server): delegate_task accepts the inherited options orchestrator…
EtanHey Nov 1, 2026
be58795
fix(mobile): finished threads leave Working once the grace ends (#28169)
playcations Nov 1, 2026
c77f755
fix(web): sidebar drops a deleted project's filter with the local env…
NotAnNvidiaFan Nov 1, 2026
f513369
fix(web): terminal URLs like redis:// no longer become broken file li…
tiliakoos Nov 1, 2026
dc102e5
fix(web): skill menus show loading while project skills arrive (#28209)
NotAnNvidiaFan Nov 1, 2026
77c885e
fix(desktop): SnapShots keep working on Hyprland after an app update …
Rhinomcd Nov 1, 2026
6717d92
fix(web): Tab completes folder names in the add-project browser (#28243)
morahan Nov 1, 2026
9ff0fac
fix(web): make Changes and PR Code file lists resizable (#28244)
wrymn Nov 1, 2026
2f777bd
perf(web): main thread updates no longer re-render an open side chat …
Yuruzuu Nov 1, 2026
6d25fa1
perf(server): skip unused parent data when forking threads (#28265)
Yuruzuu Nov 1, 2026
13c3c2e
perf(server): stop summarizing side chat context at its cap (#28266)
Yuruzuu Nov 1, 2026
39bca53
perf(web): typing in a thread no longer re-renders sidebar drafts (#2…
Yuruzuu Nov 1, 2026
ee29f11
fix(scripts): Alchemy reference sync reads the catalog version (#28268)
only21mil Nov 1, 2026
96b0377
docs(mobile): mobile README links the store apps instead of calling t…
only21mil Nov 1, 2026
35df72f
perf(web): render minimap highlights without extra nodes (#28270)
Yuruzuu Nov 1, 2026
906156b
fix(ci): a change to the T3 Connect troubleshooting guide runs the se…
only21mil Nov 1, 2026
cc5760a
fix(scripts): report:renders works on machines without ~/.cache (#28274)
only21mil Nov 1, 2026
c9f47c1
docs: composer banner guidance names a consumer that still exists (#2…
only21mil Nov 1, 2026
5732bbe
docs(mobile): name the Android 16 Agent Live Updates switch in the no…
only21mil Nov 1, 2026
ce48e45
fix(web): prevent composer image thumbnail flicker (#28499)
Yash-Singh1 Nov 1, 2026
955e2bf
fix(clients): questions always move a thread out of Working (#28515)
t3dotgg Nov 1, 2026
4ac97be
feat(scheduler): run a scheduled task once at a specific date and tim…
t3dotgg Nov 1, 2026
7195b69
fix(server): stopping a Claude turn no longer hangs without an acknow…
yaacovcorcos Nov 1, 2026
6328c84
feat(mcp): preview_open goes straight to a dev-server port (#28027)
maria-rcks Nov 1, 2026
ce9e016
fix(server): interrupted scheduled task runs no longer stay busy (#28…
t3dotgg Nov 1, 2026
37d7615
fix(desktop): preserve host focus on preview pointer presses (#28549)
Yash-Singh1 Nov 1, 2026
b50d8a1
fix(web): add spacing above PR detail metadata (#28573)
Yash-Singh1 Nov 1, 2026
0bc95fc
feat(dev): add startup profiling for cold-start diagnosis (#28566)
Yash-Singh1 Nov 1, 2026
70f475f
feat(clients): surface child approvals in parent threads (#28516)
Yash-Singh1 Nov 1, 2026
460b88b
feat(release): update notes lead with up to 7 highlights (#28593)
t3dotgg Nov 1, 2026
1280ccd
test(server): pin clock in saved-usage window test (#28603)
t3dotgg Nov 1, 2026
da21606
fix(web): sidebar project filter no longer refocuses after a pick (#2…
t3dotgg Nov 1, 2026
58a407c
feat(desktop): prepare server bytecode cache in native builds (#28572)
Yash-Singh1 Nov 1, 2026
8b4de61
fix(desktop): discover shell environment without blocking startup (#2…
Yash-Singh1 Nov 1, 2026
8760d06
fix(server): refresh Changes totals after remote polls (#28600)
Yash-Singh1 Nov 1, 2026
2b1021c
perf(codex): trace app server request latency (#28666)
Yash-Singh1 Nov 1, 2026
82b10d5
fix(web): align pull request file viewed checkboxes (#28665)
Yash-Singh1 Nov 1, 2026
80120b1
fix(desktop): skip prepared server bytecode on Linux (#28700)
Yash-Singh1 Nov 1, 2026
1d626d0
fix(cli): close legacy database before deleting it on Windows (#27629)
UtkarshUsername Nov 1, 2026
3fd2b85
perf(cursor): load the agent SDK only when needed (#28718)
Yash-Singh1 Nov 1, 2026
965291e
fix(mobile): restore the reserved compose space on Android (#28819)
PixPMusic Nov 1, 2026
976a231
fix(mobile): thread links show their thread's title (#26485)
juliusmarminge Nov 1, 2026
57d764e
fix(web): ChatView browser test no longer times out on CI (#28834)
juliusmarminge Nov 1, 2026
1db31d0
fix(mobile): sent messages rise into place instead of dropping in (#2…
mozzius Nov 1, 2026
d897d3f
feat: managed policy for organization-wide T3 Code configuration (#27…
juliusmarminge Nov 1, 2026
123e5ba
fix(server): force-stop timed out login shell probes (#7295)
hbw00111 Nov 1, 2026
88483a5
fix(server): finish short reads before returning workspace text (#14989)
saphid Nov 1, 2026
1915569
perf(client-runtime): merge shell deltas once per received batch (#18…
saphid Nov 1, 2026
2148331
perf(web): coalesce overlapping file tree refreshes (#18421)
saphid Nov 1, 2026
3f105e0
perf(clients): bound subagent preview processing to the visible prefi…
luke2x Nov 1, 2026
ad38be3
fix(server): avoid transient GitHub mergeability sync churn (#22022)
saphid Nov 1, 2026
ba49642
test(server): stopped-queue steering test no longer races queue promo…
tris203 Nov 1, 2026
5e19105
fix(mobile): single-comment PR discussions say "1 comment", not "1 co…
MarcoDotIO Nov 1, 2026
4ed4950
fix(client): reject incomplete GitHub owner paths before lookup (#23024)
naveed949 Nov 1, 2026
a8a32bb
fix(server): accept case-insensitive MCP bearer schemes (#23782)
Rish-it Nov 1, 2026
7a633ce
fix(shared): keep Azure clone URLs valid when switching protocols (#2…
Zacharon Nov 1, 2026
fcb1d0b
fix(web): honor editableFocus in shortcut conditions (#24134)
unmanbearpig Nov 1, 2026
bc57ebf
fix(scripts): launch check:changed on Windows without a vp shim (#24164)
Zacharon Nov 1, 2026
35c7696
fix(web,mobile): time out client activity reports that never settle (…
skyhong2002 Nov 1, 2026
aa056f7
fix(web): the welcome wizard keeps the project selection when you go …
Jacksondr5 Nov 1, 2026
cf4514d
fix(forgejo): merged and closed pull request lists only return their …
rishabhx29 Nov 1, 2026
41b3b0b
fix(clients): background work Stop stays pending until the stopped ta…
Srijan-D Nov 1, 2026
4306e77
fix(server): device list warnings keep the hub's error detail (#25248)
Jacksondr5 Nov 1, 2026
ea95364
perf(client-runtime): index checkpoint answers in one bounded scan (#…
saphid Nov 1, 2026
a48a076
fix(desktop): allow pointer lock in the built-in browser (#25275)
msfeldstein Nov 1, 2026
e7c375d
fix(desktop): keep preview download settings out of app exports (#25428)
mayesidev Nov 1, 2026
f482dc5
fix(web): PDF previews keep their page across thread switches (#25496)
ashx-j Nov 1, 2026
6856500
fix(server): unlink_pull_request reports a dismissed stack PR as not …
MarcoDotIO Nov 1, 2026
aa46f7a
fix(client-runtime): re-pairing at a new address uses the new token (…
abdulsalamgs Nov 1, 2026
d14074f
docs(orchestration-v2): Codex rollback uses thread/revert on paginate…
SouthCarpet Nov 1, 2026
b5d9f85
fix(web): keep inward mini browser resizes from growing (#26027)
diddletime Nov 1, 2026
5b5bd16
fix(web): PR merge buttons stay in place while the stack loads (#26077)
GisTypical Nov 1, 2026
510aa5a
fix(web): Arabic paragraphs with many English terms now read right to…
ahmedverona34-bot Nov 1, 2026
b46a4ed
fix(web): dark-mode <picture> images load instead of showing "Image u…
Vikas-Maur Nov 1, 2026
4f8b6ee
fix(server): foreground Claude forks no longer show as finished the m…
henrychu04 Nov 1, 2026
b65a64b
perf(server): hydrate only the requested project page (#26655)
Adamulek123 Nov 1, 2026
4d7cb9b
perf(effect-acp): frame large ACP stdout lines in linear time (#26686)
hieu-lee Nov 1, 2026
c2985a7
perf(shared): fold command output without copying scrollback per chun…
hieu-lee Nov 1, 2026
0da2bb6
perf(web): composer serializes each draft doc once per keystroke (#26…
hieu-lee Nov 1, 2026
7039d90
fix(gitlab): merge requests show their approval state (#26877)
oss96 Nov 1, 2026
f2dd1a4
test: remove unreachable sidebar helper suites (#26920)
t3-code-bot[bot] Nov 1, 2026
9504a09
perf(clients): thread search reuses per-thread fields across keystrok…
hieu-lee Nov 1, 2026
0366a19
perf(mobile): reuse chat lists across navigation renders (#27026)
PixPMusic Nov 1, 2026
01a93e7
test(web): pass stale to the stack menu refusal test (#28887)
maria-rcks Nov 1, 2026
88f6113
fix(server): keep a gateway's Claude reset time on a direct 429 (#25438)
tyler-b4innova Nov 1, 2026
e8b0856
perf(shared): skip parsing cached terminal styles (#27041)
UtkarshUsername Nov 1, 2026
e4d1eda
perf(web): compact changed-file directories once (#27073)
UtkarshUsername Nov 1, 2026
6b3b3b7
fix(web): chat text can be cited while file search is open (#27131)
abhijeetsingh-22 Nov 1, 2026
a8ea3c2
fix(mobile): Home list no longer opens scrolled down (#27155)
camchis Nov 1, 2026
ff46c6b
fix(server): clean unchanged worktrees without a remote (#27175)
melvinmng Nov 1, 2026
e2ad07a
fix(web): settled shelf no longer crashes with several projects filte…
jagrat7 Nov 1, 2026
febd377
fix(server): t3_thread_read pages no longer split an emoji in half (#…
MarcoDotIO Nov 1, 2026
0bccd29
fix(desktop): disable blocked t3 CLI installation (#27286)
NathanGlasby Nov 1, 2026
41588d4
fix(claude): approval cards close when Claude withdraws the request (…
ashx-j Nov 1, 2026
0c6c721
fix(server): Claude threads revert to the message after a /compact (#…
SparshKaushik Nov 1, 2026
9b72088
fix(server): show why Codex hooks stopped a turn (#27399)
voltcrash Nov 1, 2026
bd90732
fix(client): a resume no longer re-renders every home row five times …
ahalekelly Nov 1, 2026
a2a1f2b
perf(server): stop measuring replay bytes once over budget (#27405)
Narayan201120 Nov 1, 2026
7816a0f
fix(web): Enter selects the first branch search result (#27434)
atatter Nov 1, 2026
a4b6afe
fix(client-runtime): threads with many images no longer flood a remot…
voida6 Nov 1, 2026
4ff9a32
fix(web): format inline code typed with a dead-key backtick (#27457)
WalshyDev Nov 1, 2026
db7db4d
fix(server): Claude no longer tries to update itself through a mise c…
Gourav224 Nov 1, 2026
a98b624
perf(client): avoid temporary arrays in inbox snapshots (#27467)
UtkarshUsername Nov 1, 2026
9650541
fix(mobile): give drafts the current thread card layout (#28789)
PixPMusic Nov 1, 2026
aac4c15
fix(server): delegated tasks finish even when the child leaves a watc…
Byntham Nov 1, 2026
5e2a331
fix(server): preserve surrogate pairs in generated thread titles (#27…
macodev00 Nov 1, 2026
7c511b3
fix(shared): preserve files outside log rotation naming (#27503)
macodev00 Nov 1, 2026
cb7fb7a
fix(server): a preview navigation that fails mid-load keeps its failu…
camchis Nov 1, 2026
220bc7c
fix(web): Settings search finds rows by their titles (#27540)
davisonio Nov 1, 2026
7e8b40f
docs(opencode): say where compaction is configured (#27614)
wagner-deoliveira Nov 1, 2026
87cfd08
fix(server): Antigravity no longer delays server startup by deleting …
LukeCommits Nov 1, 2026
abcff3e
fix(web): the undo notice no longer pushes the update button out of t…
Derpedyea Nov 1, 2026
c894d79
fix(providers): Antigravity API-key setup says Connect (#27759)
voltcrash Nov 1, 2026
7e01b54
fix(effect-acp): honor advertised session delete capability (#27771)
Kamkmgamer Nov 1, 2026
58f8ab4
fix(web): bare URL links keep trailing underscores and tildes (#27794)
DimaMishchenko Nov 1, 2026
8a18bbf
perf(client): repeated server settings keep the same settings object …
MarcoDotIO Nov 1, 2026
dcc31b8
fix(server): preview browser picks up Chrome 156.0.8078.79 security f…
snnbotchway Nov 1, 2026
16f35ce
fix(shared): truncate keeps emoji whole (#27841)
samkelly880 Nov 1, 2026
d7171d3
fix(shared): inverted terminal ranges emit no fake lines (#27843)
samkelly880 Nov 1, 2026
742a3bc
fix(mobile): markdown images no longer shake on Android (#27943)
voida6 Nov 1, 2026
67ff912
fix(shared): opening a database waits for another process's lock (#28…
yaacovcorcos Nov 1, 2026
b5c83cd
Show the full title in lineage/side-chat row tooltips (#28326)
fatihozdil Nov 1, 2026
3735eb1
fix(server): look up a run's turn-start items by run, not by walking …
Motaghi Nov 1, 2026
5806aff
fix(web): skip star prompt when the server check is unavailable (#28364)
t3-code-bot[bot] Nov 1, 2026
b0d2a86
perf(server): reuse untracked paths in Git status (#28374)
gchen0002 Nov 1, 2026
f460136
perf(server): avoid building unused peer HTTP clients (#28405)
Adamulek123 Nov 1, 2026
8918a65
fix(provider): show exit details when ACP session startup crashes (#2…
shivamhwp Nov 1, 2026
52715df
fix(web): folder rows no longer jump at larger interface font sizes (…
sergiiopm Nov 1, 2026
716e1c0
fix(web): Changes row no longer shows +0 while Diff has edits (#28439)
wSedlacek Nov 1, 2026
52d755f
fix(clients): pasting a path copied from Finder or Explorer adds that…
kimkhoi2202 Nov 1, 2026
2101c6f
fix: paste-as-text shortcut on non-Latin layouts (#28470)
ValeraZSD Nov 1, 2026
8195530
fix(server): let slow worktree submodule checkouts finish (#28482)
iXab3r Nov 1, 2026
625b9ac
fix(server): an old link card no longer keeps a thread asking for inp…
georgenijo Nov 1, 2026
433bff1
fix(web): clicking a file in the Files tree keeps focus on that row (…
shkumbinhasani Nov 1, 2026
156d187
docs(claude): explain idle compaction fallback (#28532)
voltcrash Nov 1, 2026
6879da8
perf(shared): strip plan prefixes in linear time (#28537)
hieu-lee Nov 1, 2026
6ef66b6
perf(shared): count terminal resume lines without allocations (#28539)
hieu-lee Nov 1, 2026
0c0de57
perf(web): terminal updates no longer re-render every sidebar row and…
Yuruzuu Nov 1, 2026
bcc6c08
perf(web): chat view redraws no longer re-render the composer or side…
Yuruzuu Nov 1, 2026
74003bd
perf(server): worktree creation spawns fewer git processes (#28582)
hieu-lee Nov 1, 2026
46e90ba
fix(web): many automations no longer hide the thread details Automati…
Mnigos Nov 1, 2026
95d4da5
fix(clients): open a delegated child's approval on the environment it…
robrab2000 Nov 1, 2026
f3ccba8
fix(web): finished replies keep their hover timestamp while commands …
BilalIrfanContact Nov 1, 2026
93d110a
fix(server): treat a repository's only non-origin remote as its prima…
only21mil Nov 1, 2026
6a241ea
perf(server): sort the working-tree file list once per status read (#…
only21mil Nov 1, 2026
435cda9
fix(web): keep theme color alpha when a hex value is typed (#23136)
only21mil Nov 1, 2026
2a93356
fix(web): keep saved sensitive variables from losing their value (#23…
only21mil Nov 1, 2026
5c7e4f2
perf(server): t3_thread_read loads a page's items in one query (#23176)
only21mil Nov 1, 2026
cd04747
fix(mobile): use loaded branch for untouched worktree base (#23241)
only21mil Nov 1, 2026
cb79cfb
fix(server): report a created PR as created when its lookup fails (#2…
only21mil Nov 1, 2026
f14fa03
fix(opencode): steers keep the turn's agent, variant and instructions…
only21mil Nov 1, 2026
0997948
perf(ci): skip PR vouch jobs for ordinary comments (#23387)
only21mil Nov 1, 2026
5884d43
fix(web): sort pull request lists and timelines by time (#23588)
only21mil Nov 1, 2026
fc1d604
perf(ci): thread transfer report stops paging all main CI runs (#23633)
only21mil Nov 1, 2026
80a5ffa
fix(server): T3 Connect keeps a log file of its tunnel connector (#24…
only21mil Nov 1, 2026
a0d08d7
fix(server): saving a shortcut no longer deletes rules it can't read …
only21mil Nov 1, 2026
52b65aa
fix(web): installing two providers at once starts both (#24655)
only21mil Nov 1, 2026
3e0d877
fix(server): Codex switches respect each instance's CODEX_HOME variab…
only21mil Nov 1, 2026
eb129c0
fix(server): dev seeding accepts migration histories the server boots…
only21mil Nov 1, 2026
b8badda
fix(web): interval settings save when editing ends, not per keystroke…
only21mil Nov 1, 2026
3f69542
fix(web): a failed plan follow-up no longer overwrites the next draft…
only21mil Nov 1, 2026
cf5e6d3
fix(server): selected-file commits stop when the index reset fails (#…
only21mil Nov 1, 2026
ede41df
fix(opencode): OpenCode installs T3 can't identify no longer get an U…
only21mil Nov 1, 2026
f5fe88b
perf(server): MCP calls skip the caller's message history (#28282)
only21mil Nov 1, 2026
d05e4f8
fix(web): streamed replies render a list's code block as the finished…
only21mil Nov 1, 2026
3d10957
fix(ci): a providerEnv.ts change runs every package's tests (#28286)
only21mil Nov 1, 2026
5d0de82
fix(opencode): OpenCode 1.x text generation deletes its scratch sessi…
only21mil Nov 1, 2026
99be504
fix(scripts): check:changed no longer passes failing .github/scripts …
only21mil Nov 1, 2026
4c3808a
fix(web): Diagnostics memory no longer reads "1024.0 MB" (#28300)
only21mil Nov 1, 2026
b796da9
perf(server): sending a message no longer rereads the thread from the…
only21mil Nov 1, 2026
09ace62
fix(web): device tools keep the typed text when a command fails (#28323)
only21mil Nov 1, 2026
f2527c2
fix(server): turn diffs keep the agent's files when git's diff.relati…
only21mil Nov 1, 2026
dcbe9a6
fix(server): tracked clones keep an explicit SSH protocol on fallback…
only21mil Nov 1, 2026
638947e
fix(claude): Claude text generation stops saving throwaway transcript…
only21mil Nov 1, 2026
cfe2e97
fix(desktop): bound the Linux xdg-mime registration like its sibling …
only21mil Nov 1, 2026
de6830f
fix(opencode): OpenCode 1.x text generation gives up after 3 minutes …
only21mil Nov 1, 2026
8670378
fix(server): a fork no longer inherits the source thread's pin, auto-…
only21mil Nov 1, 2026
1c0cc43
fix(web): deleting a thread clears its saved right-panel, diff-panel …
only21mil Nov 1, 2026
b08d559
fix(server): command projection failures keep their cause (#28389)
only21mil Nov 1, 2026
1c748ed
fix(providers): slow Grok, Pi and fx starts no longer show as unavail…
only21mil Nov 1, 2026
3edf0f4
fix(evals): GPT eval summaries no longer call a proxied run free (#28…
EtanHey Nov 1, 2026
8513287
fix(server): truncated text stays the same when projected again (#28418)
only21mil Nov 1, 2026
6014358
fix(desktop): a settings relaunch no longer replays the link that lau…
only21mil Nov 1, 2026
fa31b66
fix(server): Codex sessions get T3CODE_THREAD_ID like Claude sessions…
SevenWhite Nov 1, 2026
b45ba3c
chore: sync upstream main and preserve fork integrations
ScriptedAlchemy Nov 1, 2026
3fd148d
chore: integrate current fork main into upstream sync
ScriptedAlchemy Nov 1, 2026
4cb8aef
test(web): adapt model mention fixture to upstream workspace refresh
ScriptedAlchemy Nov 1, 2026
f51d4ed
fix(providers): preserve Codex account paths during upstream sync
ScriptedAlchemy Nov 2, 2026
38ef969
test(web): separate PDF reload and document-reset scenarios
ScriptedAlchemy Nov 2, 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
  •  
  •  
  •  
8 changes: 5 additions & 3 deletions .github/scripts/ci-changes.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ const INERT = [

// Shared test setup and vendored mobile dependencies affect every package.
const RUNS_EVERYTHING = [
/^packages\/shared\/src\/(HostProcess|testing\/longTempDir)\.ts$/,
/^packages\/shared\/src\/(HostProcess|testing\/(longTempDir|providerEnv))\.ts$/,
/^apps\/mobile\/deps\//,
];

Expand All @@ -28,6 +28,8 @@ const EXTRA_OWNERS = [
[/^native\/browser-secret\//, ["@t3tools/desktop"]],
[/^native\/kde-snap-shot\//, ["@t3tools/desktop"]],
[/^native\/libghostty-vt\//, ["@t3tools/web"]],
// apps/server/src/cloud/ConnectReachability.test.ts checks the guide's headings.
[/^docs\/user\/t3-connect-troubleshooting\.md$/, ["t3"]],
];
const RUST = /^native\/(resource-monitor|kde-snap-shot|hyprland-snap-shot|project-memory)\//;

Expand Down Expand Up @@ -93,11 +95,11 @@ function readWorkspace() {

// [] means inert; null means unknown and requires every job.
function ownersOf(file, packages) {
if (INERT.some((pattern) => pattern.test(file))) return [];
const extra = EXTRA_OWNERS.flatMap(([pattern, names]) => (pattern.test(file) ? names : []));
if (INERT.some((pattern) => pattern.test(file))) return extra;
// A manifest can change dependencies or versions other packages read.
if (path.posix.basename(file) === "package.json") return null;
if (RUNS_EVERYTHING.some((pattern) => pattern.test(file))) return null;
const extra = EXTRA_OWNERS.flatMap(([pattern, names]) => (pattern.test(file) ? names : []));
// scripts/build-desktop-artifact.test.ts reads the crates' sources.
if (RUST.test(file)) return ["@t3tools/scripts", ...extra];

Expand Down
32 changes: 21 additions & 11 deletions .github/scripts/thread-transfer-report.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -300,18 +300,28 @@ async function resolve({ github, context, core }) {
core.setOutput("publish", "false");
return;
}
const workflowRuns = await github.paginate(github.rest.actions.listWorkflowRuns, {
owner,
repo,
workflow_id: source.workflow_id,
branch: pull.base.ref,
event: "push",
status: "success",
per_page: 100,
});
// One page each for the exact base and the newest runs; paging through
// every successful main run costs up to ten requests to keep 20.
const listRuns = async (filters) => {
const { data } = await github.rest.actions.listWorkflowRuns({
owner,
repo,
workflow_id: source.workflow_id,
branch: pull.base.ref,
event: "push",
status: "success",
per_page: 20,
...filters,
});
return data.workflow_runs;
};
const [baseRuns, recentRuns] = await Promise.all([
listRuns({ head_sha: pull.base.sha }),
listRuns({}),
]);
const orderedRuns = [
...workflowRuns.filter((run) => run.head_sha === pull.base.sha),
...workflowRuns.filter((run) => run.head_sha !== pull.base.sha),
...baseRuns,
...recentRuns.filter((run) => run.head_sha !== pull.base.sha),
].slice(0, 20);

let baselineRun;
Expand Down
18 changes: 13 additions & 5 deletions .github/scripts/thread-transfer-report.test.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,18 @@ test("validates the fixed artifact schema", () => {
test("resolves a fallback PR with a redacted head repo and exact main baseline", async () => {
const outputs = {};
const listWorkflowRunArtifacts = () => {};
const listWorkflowRuns = () => {};
// The exact base run sits far past the newest page of main CI runs.
const mainRuns = Array.from({ length: 1_000 }, (_, index) => ({
id: 1_000 - index,
head_sha: index === 900 ? "base-sha" : `main-sha-${index}`,
}));
const listWorkflowRuns = async ({ head_sha, per_page }) => ({
data: {
workflow_runs: mainRuns
.filter((run) => head_sha === undefined || run.head_sha === head_sha)
.slice(0, per_page),
},
});
const listPullRequestsAssociatedWithCommit = () => {};
const github = {
paginate: async (method, input) => {
Expand All @@ -77,9 +88,6 @@ test("resolves a fallback PR with a redacted head repo and exact main baseline",
},
];
}
if (method === listWorkflowRuns) {
return [{ id: 1, head_sha: "base-sha" }];
}
throw new Error("unexpected pagination call");
},
rest: {
Expand Down Expand Up @@ -123,7 +131,7 @@ test("resolves a fallback PR with a redacted head repo and exact main baseline",
assert.equal(outputs.publish, "true");
assert.equal(outputs.pull_number, "5350");
assert.equal(outputs.pr_artifact, "true");
assert.equal(outputs.baseline_run_id, "1");
assert.equal(outputs.baseline_run_id, "100");
assert.equal(outputs.baseline_matches_base, "true");
});

Expand Down
4 changes: 4 additions & 0 deletions .github/workflows/pr-vouch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ permissions:
jobs:
collect-targets:
name: Collect PR targets
# Most comments are not recheck commands; skip them before a runner starts.
if: >-
github.event_name != 'issue_comment' ||
(github.event.issue.pull_request && contains(github.event.comment.body, '/recheck-vouch'))
runs-on: ubuntu-24.04
outputs:
targets: ${{ steps.collect.outputs.targets }}
Expand Down
2 changes: 1 addition & 1 deletion .macroscope/check-run-agents/ui-consistency.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ The reference for how this codebase wants UI built is the composer banner system

- `ComposerBanner.tsx` exports one object of small slot components (`Root`, `Row`, `Icon`, `Content`, `Actions`, `Dismiss`, `Children`, and so on). Each slot owns its own Tailwind classes, exposes a `data-slot` attribute, takes `className` and spreads the rest of its props, and uses `cn` so callers can adjust without overriding. Variants and density are props on `Root`, not ad hoc class strings at call sites. Where a slot needs a real control it renders `Button` from `ui/` rather than a styled `<button>`.
- `ComposerBannerStack.tsx` composes those slots into the ordered stack and owns only stack behavior (priority, expand and collapse, dismiss transitions).
- Consumers such as `ComposerActivityStatus.tsx`, `ComposerStashBadge.tsx`, and `ComposerPlanFollowUpBanner.tsx` are a few lines of `<ComposerBanner.Row><ComposerBanner.Icon/><ComposerBanner.Content>…` with no styling of their own.
- Consumers such as `ComposerPlanFollowUpBanner.tsx` are a few lines of `<ComposerBanner.Row><ComposerBanner.Icon/><ComposerBanner.Content>…` and style only their own content.

Hold new and changed UI to that shape:

Expand Down
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ T3 Code is an "agent harness control surface" for the agents on your machine. Th

The fork's [Nightly releases](https://github.com/ScriptedAlchemy/t3code/releases) include the desktop app and the standalone `t3` CLI with its bundled web app. Install these builds to use this fork's features. The upstream hosted web app, mobile store apps, npm package, and community packages are separate distributions; see [Upstream distributions](#upstream-distributions).

Works with your subscriptions on Claude Code, Codex, Cursor, Grok Build, OpenCode, and Google Antigravity. If they're set up on your computer, T3 Code can control them.
Works with your subscriptions on Claude Code, Codex, Cursor, Grok Build, OpenCode, Google Antigravity, and fx. If they're set up on your computer, T3 Code can control them.

## "Wait, what are you selling me?"

Expand All @@ -15,14 +15,15 @@ We wanted something performant, remote-ready, and truly open. If we ever go the
## Installation

> [!WARNING]
> T3 Code currently supports Codex, Claude, Cursor, Grok Build, OpenCode, and Antigravity. Install and authenticate at least one provider before use:
> T3 Code currently supports Codex, Claude, Cursor, Grok Build, OpenCode, Antigravity, and fx. Install and authenticate at least one provider before use:
>
> - Codex: install [Codex CLI](https://developers.openai.com/codex/cli) and run `codex login`
> - Claude: install [Claude Code](https://claude.com/product/claude-code) and run `claude auth login`
> - Cursor: install [Cursor CLI](https://cursor.com/cli) and run `agent login`
> - Grok Build: install [Grok Build CLI](https://x.ai/cli) and run `grok login`
> - OpenCode: install [OpenCode](https://opencode.ai) and run `opencode auth login`
> - Antigravity: enable it in Settings, then use **Install Antigravity** and **Sign in with Google**. No CLI is required.
> - fx: install [fx](https://fx.sh) and run `fx login` on the machine running the T3 Code server ([setup guide](./docs/user/providers-fx.md))

### Command line

Expand Down
11 changes: 5 additions & 6 deletions apps/desktop/scripts/main-process-bundle.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import * as NodeFSP from "node:fs/promises";
import * as NodeOS from "node:os";
import * as NodePath from "node:path";
import * as NodeVM from "node:vm";
import * as NodeURL from "node:url";
import { build } from "vite-plus/pack";
import { assert, it } from "vite-plus/test";

Expand Down Expand Up @@ -114,18 +115,16 @@ it("loads the emitted packaged boot entry and backend cache preload", async () =
const directory = await NodeFSP.mkdtemp(NodePath.join(NodeOS.tmpdir(), "t3-desktop-boot-"));
try {
const entries = ["src/boot.ts", "src/compileCache.ts"];
await NodeFSP.mkdir(NodePath.join(directory, "src"));
await Promise.all(
entries.map((entry) =>
NodeFSP.copyFile(new URL(`../${entry}`, import.meta.url), NodePath.join(directory, entry)),
),
);
assert.ok(Array.isArray(desktopConfig.pack));
for (const packConfig of desktopConfig.pack) {
if (!Array.isArray(packConfig.entry)) continue;
if (!packConfig.entry.some((entry) => entries.includes(entry))) continue;
await build({
...packConfig,
entry: packConfig.entry.map((entry) =>
NodeURL.fileURLToPath(new URL(`../${entry}`, import.meta.url)),
),
outDir: NodePath.join(directory, "dist-electron"),
config: false,
cwd: directory,
tsconfig: false,
Expand Down
2 changes: 0 additions & 2 deletions apps/desktop/src/app/DesktopEarlyElectronStartup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ type EarlyLinuxElectronOptionsInput = EarlyDesktopSettingsInput;

export interface EarlyLinuxElectronOptions {
readonly isDevelopment: boolean;
readonly linuxWmClass: string;
readonly linuxDesktopEntryName: string;
readonly passwordStore: LinuxPasswordStoreSwitch | null;
}
Expand Down Expand Up @@ -146,7 +145,6 @@ export function resolveEarlyLinuxElectronOptions(
const isDevelopment = isDevelopmentEnvironment(input.env);
return {
isDevelopment,
linuxWmClass: isDevelopment ? "t3code-dev" : "t3code",
linuxDesktopEntryName: resolveLinuxDesktopEntryName(isDevelopment),
passwordStore: resolveLinuxPasswordStoreSwitch({
preference,
Expand Down
2 changes: 0 additions & 2 deletions apps/desktop/src/app/DesktopEnvironment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,6 @@ export class DesktopEnvironment extends Context.Service<
readonly displayName: string;
readonly appUserModelId: string;
readonly linuxDesktopEntryName: string;
readonly linuxWmClass: string;
readonly linuxApplicationsDir: string;
readonly desktopLauncherPath: Option.Option<string>;
readonly appImagePath: Option.Option<string>;
Expand Down Expand Up @@ -232,7 +231,6 @@ const make = Effect.fn("desktop.environment.make")(function* (
isDevelopment ? "com.t3tools.t3code.dev" : "com.t3tools.t3code",
),
linuxDesktopEntryName: resolveLinuxDesktopEntryName(isDevelopment),
linuxWmClass: isDevelopment ? "t3code-dev" : "t3code",
linuxApplicationsDir,
desktopLauncherPath: config.desktopLauncherPath,
appImagePath: config.appImagePath,
Expand Down
49 changes: 48 additions & 1 deletion apps/desktop/src/app/DesktopLifecycle.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import * as Layer from "effect/Layer";
import * as Ref from "effect/Ref";
import * as TestClock from "effect/testing/TestClock";

import * as HostProcess from "@t3tools/shared/HostProcess";

import type * as Electron from "electron";

import * as ElectronApp from "../electron/ElectronApp.ts";
Expand All @@ -20,6 +22,7 @@ function layerElectronApp(
appListeners: Map<string, (...args: readonly unknown[]) => void>,
quit: Effect.Effect<void> = Effect.void,
exit: (code: number) => Effect.Effect<void> = () => Effect.void,
relaunch: (options: Electron.RelaunchOptions) => Effect.Effect<void> = () => Effect.void,
) {
const registerListener = (eventName: string, listener: (...args: readonly unknown[]) => void) =>
Effect.acquireRelease(
Expand All @@ -40,7 +43,7 @@ function layerElectronApp(
requestSingleInstanceLock: Effect.succeed(true),
quit,
exit,
relaunch: () => Effect.void,
relaunch,
setPath: () => Effect.void,
setName: () => Effect.void,
setAboutPanelOptions: () => Effect.void,
Expand Down Expand Up @@ -223,6 +226,50 @@ describe("DesktopLifecycle", () => {
}),
);

it.effect("relaunches without the app link that launched it", () =>
Effect.gen(function* () {
const relaunched = yield* Deferred.make<Electron.RelaunchOptions>();
const layerEnvironment = Layer.succeed(DesktopEnvironment.DesktopEnvironment, {
platform: "linux",
isDevelopment: false,
} as DesktopEnvironment.DesktopEnvironment["Service"]);
const layer = DesktopLifecycle.layer.pipe(
Layer.provideMerge(
layerElectronApp(
new Map(),
Effect.void,
() => Effect.void,
(options) => Deferred.succeed(relaunched, options).pipe(Effect.asVoid),
),
),
Layer.provideMerge(layerElectronTheme),
Layer.provideMerge(layerElectronWindow()),
Layer.provideMerge(layerDesktopWindow()),
Layer.provideMerge(layerEnvironment),
Layer.provideMerge(DesktopShutdown.layer),
Layer.provideMerge(DesktopState.layer),
);

const options = yield* Effect.gen(function* () {
const lifecycle = yield* DesktopLifecycle.DesktopLifecycle;
yield* (yield* DesktopShutdown.DesktopShutdown).markComplete;
yield* lifecycle.relaunch("network access changed");
return yield* Deferred.await(relaunched);
}).pipe(
Effect.provide(layer),
Effect.provideService(HostProcess.ExecutablePath, "/opt/T3 Code/t3code"),
Effect.provideService(HostProcess.Arguments, [
"/opt/T3 Code/t3code",
"--no-sandbox",
"T3CODE://pair?token=spent",
"t3code://new?prompt=hello",
]),
);

assert.deepEqual(options, { execPath: "/opt/T3 Code/t3code", args: ["--no-sandbox"] });
}),
);

it.effect("exits on a repeated quit only once shutdown has stalled", () =>
Effect.gen(function* () {
const appListeners = new Map<string, (...args: readonly unknown[]) => void>();
Expand Down
10 changes: 8 additions & 2 deletions apps/desktop/src/app/DesktopLifecycle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,13 @@ import * as Scope from "effect/Scope";

import type * as Electron from "electron";

import * as HostProcess from "@t3tools/shared/HostProcess";

import * as DesktopEnvironment from "./DesktopEnvironment.ts";
import { makeComponentLogger } from "./DesktopObservability.ts";
import * as DesktopShutdown from "./DesktopShutdown.ts";
import * as ElectronApp from "../electron/ElectronApp.ts";
import * as ElectronProtocol from "../electron/ElectronProtocol.ts";
import * as ElectronTheme from "../electron/ElectronTheme.ts";
import * as ElectronWindow from "../electron/ElectronWindow.ts";
import * as DesktopState from "./DesktopState.ts";
Expand Down Expand Up @@ -223,9 +226,12 @@ export const make = DesktopLifecycle.of({
yield* electronApp.exit(75);
return;
}
// Startup already acted on the app link that launched it; passing it on replays it.
const appLinkPrefix = `${ElectronProtocol.getDesktopScheme(environment.isDevelopment)}:`;
const args = yield* HostProcess.Arguments;
yield* electronApp.relaunch({
execPath: process.execPath,
args: process.argv.slice(1),
execPath: yield* HostProcess.ExecutablePath,
args: args.slice(1).filter((arg) => !arg.toLowerCase().startsWith(appLinkPrefix)),
});
yield* electronApp.exit(0);
}).pipe(
Expand Down
Loading
Loading