Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
331 commits
Select commit Hold shift + click to select a range
b3d382e
feat(mobile): search Settings, and keep its sidebar header clean (#24…
juliusmarminge Oct 25, 2026
8d3261e
fix(mobile): threads open with less waiting, and the Threads tab reme…
juliusmarminge Oct 25, 2026
15702a9
fix(mobile): reduce diff entry and source highlighting delays (#24770)
juliusmarminge Oct 25, 2026
17dc1af
perf(client): skip unchanged shell and config cache writes (#24266)
juliusmarminge Oct 25, 2026
3e20b65
fix(mobile): remove perpetual reconnect indicator animation (#24273)
juliusmarminge Oct 25, 2026
f694a19
feat(mobile): close the keyboard from the Duo's side bar (#24696)
t3dotgg Oct 25, 2026
cfdfc2a
fix(mobile): dispatch native toolbar actions to current handlers (#24…
juliusmarminge Oct 25, 2026
2da177c
fix(server): PR watch wakes say the PR stays linked and watched (#24781)
t3dotgg Oct 25, 2026
003b64d
feat(server): thread tools return a ready t3-thread link (#24784)
t3dotgg Oct 25, 2026
a96cf08
fix(server): running task results tell the agent to end its turn (#24…
t3dotgg Oct 25, 2026
a8603af
fix(server): mobile push no longer says "completed" between runs (#24…
t3dotgg Oct 25, 2026
e641761
fix(server): delegated children no longer see pull request watch tool…
t3dotgg Oct 25, 2026
5398be0
fix(mobile): search stays open after going back from a thread (#24748)
t3dotgg Oct 25, 2026
e0b1940
feat(server): request_secret can save a CLI token to a private file (…
t3dotgg Oct 25, 2026
639dc20
fix(server): threads settle right after a shell merge of an unlinked …
t3dotgg Oct 25, 2026
5d5b6e0
fix(server): worktree setup no longer hangs when a shell startup prom…
t3dotgg Oct 25, 2026
dca46e2
feat(server): link pull requests agents create from the shell (#24813)
t3dotgg Oct 25, 2026
c8231f9
fix(mobile): queue Steer button no longer opens the editor on a near …
t3dotgg Oct 25, 2026
056b445
fix(usage): Gemini 4 Argon usage from Antigravity now has a price (#2…
t3dotgg Oct 25, 2026
30fd973
fix(server): publish committed events before writer cancellation (#24…
Yash-Singh1 Oct 25, 2026
c916261
fix(web): shared dev servers no longer crash on lazy routes (#24839)
t3dotgg Oct 25, 2026
2d620f5
fix(web): chat tables and subagent rows line up (#24835)
t3dotgg Oct 25, 2026
e57c093
perf(shell): cold connects skip older settled threads, 93% of the she…
t3dotgg Oct 25, 2026
375da0f
test(server): restart replay tests no longer hang on a leftover check…
t3dotgg Oct 25, 2026
3faeb9e
feat(web): Settings and Usage open as large modals over your thread (…
t3dotgg Oct 25, 2026
a6aca34
fix(server): forked threads get titles from the history they inherit …
t3dotgg Oct 25, 2026
d2f6ff4
fix(release): desktop builds pass again after the vite-plus 1.4 upgra…
t3dotgg Oct 25, 2026
5f64c5e
feat(server): cut T3's agent instructions and tool copy by 60% (#24850)
t3dotgg Oct 25, 2026
3d00499
perf(desktop): stop decoding snapshots twice for accessibility (#19221)
AksharP5 Oct 25, 2026
bbdc136
feat(desktop): import cookies from Zen Browser (#22970)
UtkarshUsername Oct 25, 2026
87d22b0
perf(shared): avoid repeated date parsing when selecting PRs (#22891)
UtkarshUsername Oct 25, 2026
5b35402
fix(web): refresh the current branch when opening the picker (#22807)
UtkarshUsername Oct 25, 2026
d0b9e9d
fix(mobile): the Duo header blur reaches a vertical bar on the left t…
juliusmarminge Oct 25, 2026
c5332bf
fix(mobile): stabilize composer search debounce targets (#24272)
juliusmarminge Oct 25, 2026
daa182b
fix(server): surface why process group metrics are not exported (#23969)
yordis Oct 25, 2026
3ed4890
test(mobile): mock threads in the composer search debounce test (#24954)
juliusmarminge Oct 25, 2026
133b9b0
fix(server): serve audio and video from draft workspaces (#24275)
juliusmarminge Oct 25, 2026
8096799
fix(mobile): share toast motion and bring bottom undo to iOS (#23968)
PixPMusic Oct 25, 2026
40ec16a
fix(mobile): the Duo sidebar changes with the rotation, not after it …
juliusmarminge Oct 25, 2026
1eb4071
perf(mobile): append terminal output without replaying history (#24261)
juliusmarminge Oct 25, 2026
550f119
fix(server): attachments are no longer silently dropped from prompts …
maria-rcks Oct 25, 2026
140de68
fix(mobile): images picked with choose files reach the agent as image…
maria-rcks Oct 25, 2026
efea686
feat(web): attach svg files to messages (#21355)
maria-rcks Oct 25, 2026
728aba3
fix(infra): share cache dashboard with the organization
juliusmarminge Oct 25, 2026
532023a
feat(server): send pdf attachments to claude and antigravity as docum…
maria-rcks Oct 25, 2026
7bafc40
feat(mobile): play audio inline and open shared files in the viewer (…
maria-rcks Oct 25, 2026
34e9c56
feat(web): play audio inline and open any file the agent shares in th…
maria-rcks Oct 25, 2026
5d9a5c9
perf(pull-requests): faster pull request timeline, code tab, summary …
maria-rcks Oct 25, 2026
ba006f2
perf(mobile): bound streaming markdown cache and pending work (#24263)
juliusmarminge Oct 25, 2026
d414cb5
fix(web): question options show a radio and an aligned shortcut key (…
maria-rcks Oct 25, 2026
0504c99
fix(server): notify parents after delegated background runs (#23542)
juliusmarminge Oct 25, 2026
557db6c
fix(server): running delegates tell agents to end the turn (#24887)
t3dotgg Oct 25, 2026
aa247c5
perf(ci): cache server tests individually across shards (#24966)
juliusmarminge Oct 25, 2026
94231a0
fix(ci): shorten delegated follow-up comment
juliusmarminge Oct 25, 2026
0191d6c
feat(mobile): one cached native-client install command for agents and…
juliusmarminge Oct 25, 2026
b3b2c55
perf(source-control): pull request previews read only the pull reques…
maria-rcks Oct 25, 2026
e5ed5c5
feat(infra): native client cache panels on the task cache dashboard
juliusmarminge Oct 25, 2026
8b3b2ea
fix(mobile): report native client installs under the fleet machine label
juliusmarminge Oct 25, 2026
0f4d050
feat(infra): native client cache panels on the task cache dashboard (…
juliusmarminge Oct 25, 2026
3816296
feat(web): UI design overhaul, with the new look behind a Beta toggle…
t3dotgg Oct 25, 2026
1a4bb08
test(server): tests no longer depend on the host machine (#25001)
t3dotgg Oct 25, 2026
abd9d9f
perf: opening a thread loads 85% less data (#24899)
t3dotgg Oct 25, 2026
1646a47
fix(server): orchestrator records command count and duration again (#…
yordis Oct 25, 2026
a960f56
fix(observability): every app reports its own environment and release…
yordis Oct 25, 2026
762b047
chore(lint): React effects can't grow past each file's budget (#24964)
juliusmarminge Oct 25, 2026
01fe8d9
fix(observability): every exported resource names its service instanc…
yordis Oct 25, 2026
03d1a90
fix(install): stable installs no longer fail behind a page of nightli…
t3dotgg Oct 25, 2026
e3592ef
fix(server): Grok refresh no longer restores removed models from cach…
t3dotgg Oct 25, 2026
5f1f604
feat(mobile): on-demand chrome e2e runner across simulators
juliusmarminge Oct 25, 2026
2ed9261
fix: restore files reverted by 5f1f604
juliusmarminge Oct 25, 2026
7ee8a5b
fix(server): resume fallback keeps the latest turn when an older hand…
t3dotgg Oct 25, 2026
2fd28bf
fix(client-runtime): "Codex (hub)" badges read CH instead of C( (#22918)
t3dotgg Oct 25, 2026
2050a12
fix(mobile): retain requested PR environment while connecting (#24262)
juliusmarminge Oct 25, 2026
a27b246
fix(web): usage-limit banner reset time follows the Time format setti…
t3dotgg Oct 25, 2026
313ca27
fix(web): terminal drag selection scrolls faster the farther past the…
t3dotgg Oct 25, 2026
20ee805
fix(observability): resources add OTel semconv runtime and browser ke…
yordis Oct 25, 2026
3e69171
fix(knip): mobile-e2e runs agent-device's CLI by path
juliusmarminge Oct 25, 2026
69234b1
chore(lint): main passes lint again with effects merged after the bud…
t3dotgg Oct 25, 2026
725ada6
fix(server): ended roots no longer leave provider turns running (#22846)
t3dotgg Oct 25, 2026
92125d6
feat(mobile): open threads and devices in a resizable iOS inspector (…
juliusmarminge Oct 25, 2026
2dfd6bf
chore(web): measure renders before/after with render scenarios (#24980)
juliusmarminge Oct 25, 2026
b2baf75
fix(web): asset URLs re-mint per revision and before expiry without e…
juliusmarminge Oct 25, 2026
7561c2e
fix(web): queued-message edits survive navigation and settle once (#2…
juliusmarminge Oct 25, 2026
d997763
refactor(mobile): thread visits are tracked outside React (#24973)
juliusmarminge Oct 25, 2026
6016969
refactor(client): cloud account transitions run in one service (#24974)
juliusmarminge Oct 25, 2026
604ecb6
refactor(client): one VCS status refresh owner per checkout (#24975)
juliusmarminge Oct 25, 2026
4ee4788
refactor(web): document appearance and title are applied from app sta…
juliusmarminge Oct 25, 2026
b457b64
refactor(web): app shell shortcuts register once through one command …
juliusmarminge Oct 25, 2026
c6b9c38
refactor(web): shared intersection and document-activity stores (#25020)
juliusmarminge Oct 25, 2026
1c10563
refactor(web): the theme store and diff worker pool stop syncing the …
juliusmarminge Oct 25, 2026
d5b921c
fix(server): keep history discovery off the writer and pace compactio…
JustYannicc Oct 25, 2026
b76a110
perf(mobile): compact persisted thread snapshots (#24265)
juliusmarminge Oct 25, 2026
b6c326d
fix(server): background compactions no longer flip threads to Working…
juliusmarminge Oct 25, 2026
dd2842f
fix(web): a stale queued-edit save no longer clears a newer edit (#25…
juliusmarminge Oct 25, 2026
2649693
fix(client): a thread opened before its shell loads still counts as o…
juliusmarminge Oct 25, 2026
3ddfcfc
docs: open and track PRs through GitCafe when origin is git.cafe (#25…
juliusmarminge Oct 25, 2026
c298a40
perf(web): diff file boundaries observe visibility once instead of on…
juliusmarminge Oct 25, 2026
796fc0a
fix(mobile): center toast actions beside wrapped messages (#24986)
PixPMusic Oct 25, 2026
481b9b7
fix(server): compact superseded turn-item snapshots (#20990)
JustYannicc Oct 25, 2026
3e9d97a
feat(server): count how guest sharing gets used (#24996)
t3dotgg Oct 25, 2026
f898557
chore(lint): enforce unnecessaryPipeChain (#25077)
juliusmarminge Oct 25, 2026
1a13127
test(web): Arabic arrow-key test no longer drops its first key press …
t3dotgg Oct 25, 2026
44df336
fix(mobile): upgrade react-native-keyboard-controller to 1.22.8 for t…
juliusmarminge Oct 26, 2026
2ee1529
fix(infra): keep task cache cleanup ahead of uploads (#25143)
juliusmarminge Oct 26, 2026
0aeb620
chore(lint): enforce mapSomeToAsSome (#25078)
juliusmarminge Oct 26, 2026
05ef5ff
chore(lint): enforce flatMapIgnoredParamToAndThen (#25089)
juliusmarminge Oct 26, 2026
8bdf378
chore(lint): enforce provideLayerSucceedToProvideService (#25090)
juliusmarminge Oct 26, 2026
10d800c
chore(lint): enforce unicorn/require-module-specifiers (#25102)
juliusmarminge Oct 26, 2026
15c6e6b
chore(lint): enforce unicorn/no-useless-fallback-in-spread (#25103)
juliusmarminge Oct 26, 2026
b0f5d44
chore(lint): enforce eslint/no-unneeded-ternary (#25105)
juliusmarminge Oct 26, 2026
2eccc57
chore(lint): enforce eslint/no-unsafe-optional-chaining (#25106)
juliusmarminge Oct 26, 2026
f995643
fix(web): preview favicons resolve their project without ChatView syn…
juliusmarminge Oct 26, 2026
4db2ffc
refactor(mobile): branch picker owns its search and checkout guard (#…
juliusmarminge Oct 26, 2026
65822d8
refactor(web): composer editor stops mirroring props into refs with e…
juliusmarminge Oct 26, 2026
03df289
fix(client): usage-limit Snooze disables at reset even weeks away, vi…
juliusmarminge Oct 26, 2026
738fd08
fix(infra): task cache cleanup test provides its service directly (#2…
juliusmarminge Oct 26, 2026
c58beff
chore(lint): a new React effect states its reason instead of raising …
juliusmarminge Oct 26, 2026
0ad399c
test(web): the diff boundary observer counter lives in its fixture (#…
juliusmarminge Oct 26, 2026
07066c0
fix(client): a queued-edit save keeps its claim until it finishes (#2…
juliusmarminge Oct 26, 2026
5fee09a
refactor(web): terminal focus requests name the terminal they focus (…
juliusmarminge Oct 26, 2026
f4e1407
fix(web): pull request checks stay current after a checks refresh (#2…
juliusmarminge Oct 26, 2026
0b42aa9
chore(devices): bump agent-device to 0.21.31 (#25065)
juliusmarminge Oct 26, 2026
0bf4d16
feat(mobile): composer placeholder reads "Ask anything" (#25176)
flamboh Oct 26, 2026
c8c6deb
refactor(mobile): shared AppState, reduce-motion and back-button help…
juliusmarminge Oct 26, 2026
e14d08c
fix(web): settings panels derive state instead of syncing it with eff…
juliusmarminge Oct 26, 2026
5786e12
refactor(mobile): terminal lifecycle runs in a session store, not scr…
juliusmarminge Oct 26, 2026
9f7b8ad
refactor(web): branch toolbar and dialogs stop syncing through effect…
juliusmarminge Oct 26, 2026
f16ae12
refactor(web): thread find state lives in one store instead of event …
juliusmarminge Oct 26, 2026
9296c20
refactor(web): browser panel tabs follow preview sessions without Cha…
juliusmarminge Oct 26, 2026
11bd26e
chore(lint): enforce effectSucceedWithVoid (#25074)
juliusmarminge Oct 26, 2026
9c02109
chore(lint): enforce preferSucceedSomeOrNone (#25080)
juliusmarminge Oct 26, 2026
312a12d
chore(lint): enforce unnecessaryFailYieldableError (#25083)
juliusmarminge Oct 26, 2026
9ae08d5
chore(lint): enforce catchToOrElseSucceed (#25084)
juliusmarminge Oct 26, 2026
16573c4
chore(lint): enforce allOfMapToForEach (#25085)
juliusmarminge Oct 26, 2026
ef005d6
chore(lint): enforce unnecessaryEffectGen (#25086)
juliusmarminge Oct 26, 2026
f4ba6ae
chore(lint): enforce catchToIgnore (#25087)
juliusmarminge Oct 26, 2026
f5ad87d
chore(lint): enforce optionMatchToFromOption (#25088)
juliusmarminge Oct 26, 2026
a0f3606
chore(lint): enforce redundantMapError (#25091)
juliusmarminge Oct 26, 2026
269deb8
chore(lint): enforce raceFirstWithSleepToTimeout (#25092)
juliusmarminge Oct 26, 2026
686e394
chore(lint): enforce catchUnfailableEffect (#25093)
juliusmarminge Oct 26, 2026
a8b692b
chore(lint): enforce preferTypedSchemaDecoder (#25094)
juliusmarminge Oct 26, 2026
c4dbf19
chore(lint): enforce schemaStructWithTag (#25095)
juliusmarminge Oct 26, 2026
a0b246d
chore(lint): enforce tryCatchInEffectGen (#25097)
juliusmarminge Oct 26, 2026
a320762
chore(lint): enforce eslint/no-unused-vars (#25100)
juliusmarminge Oct 26, 2026
6f21f01
chore(lint): enforce unicorn/no-useless-spread (#25104)
juliusmarminge Oct 26, 2026
3a1b3a7
chore(lint): enforce eslint/no-new (#25107)
juliusmarminge Oct 26, 2026
4e43779
fix(web): theme editor returns to its spot after the window shrinks a…
juliusmarminge Oct 26, 2026
06e80ac
refactor(mobile): cloud account transitions run in the shared account…
juliusmarminge Oct 26, 2026
7a95549
refactor(client): drop the VCS wake and dispatcher element scope opti…
juliusmarminge Oct 26, 2026
d9abfdd
feat(mobile): mobile:install --session installs into an agent-device …
juliusmarminge Oct 26, 2026
888a3d4
fix(server): make document attachments readable to agents (#21458)
maria-rcks Oct 26, 2026
e856833
fix(mobile): native client fingerprints match across macOS and Linux
juliusmarminge Oct 26, 2026
122c5f8
fix(web): keep Windows thread notifications clickable until handled (…
AKolenda Oct 26, 2026
3ca62a5
refactor(client): terminal sessions keep one driver per mode (#25186)
juliusmarminge Oct 26, 2026
b16728a
refactor(web): preview tab sync subscribes to the preview store inste…
juliusmarminge Oct 26, 2026
fe585bc
fix(server): use asSome for initial worktree measurement (#25206)
juliusmarminge Oct 26, 2026
3de45c6
feat(sidebar): working section is on by default (#25190)
maria-rcks Oct 26, 2026
d69810a
feat(web): preview office files, fonts, and mermaid diagrams (#21362)
maria-rcks Oct 26, 2026
73afb57
feat(web): virtualize large file previews (#21466)
maria-rcks Oct 26, 2026
9d17a02
feat(web): preview archives, sqlite databases, and decoded images (#2…
maria-rcks Oct 26, 2026
34ead56
feat(web): preview opendocument, epub, rich text, and notebooks (#21469)
maria-rcks Oct 26, 2026
6700834
chore(lint): enforce eslint/no-empty-pattern (#25101)
juliusmarminge Oct 26, 2026
d19ec7d
chore(lint): enforce typescript/no-extraneous-class (#25108)
juliusmarminge Oct 26, 2026
53896ae
chore(lint): enforce react/capitalized-calls (#25109)
juliusmarminge Oct 26, 2026
fd71ddc
fix(desktop): hidden preview tabs throttle instead of running at full…
t3dotgg Oct 26, 2026
285b19d
chore(lint): enforce react/static-components (#25110)
juliusmarminge Oct 26, 2026
7e20a5b
chore(lint): enforce react/no-unstable-nested-components (#25111)
juliusmarminge Oct 26, 2026
f44fea4
chore(lint): enforce react/no-array-index-key (#25112)
juliusmarminge Oct 26, 2026
908226f
chore(lint): enforce react/immutability (#25115)
juliusmarminge Oct 26, 2026
8a84d40
chore(lint): disable react/jsx-no-constructed-context-values (#25039)
juliusmarminge Oct 26, 2026
c5eb559
chore(lint): disable react/no-object-type-as-default-prop (#25040)
juliusmarminge Oct 26, 2026
56d13e2
chore(lint): disable unicorn/no-array-reverse (#25041)
juliusmarminge Oct 26, 2026
751a37f
chore(lint): disable unicorn/no-new-array (#25042)
juliusmarminge Oct 26, 2026
e5a5515
chore(lint): disable unicorn/prefer-array-find (#25043)
juliusmarminge Oct 26, 2026
78d89dd
chore(lint): disable unicorn/prefer-set-has (#25044)
juliusmarminge Oct 26, 2026
cf21b98
chore(lint): disable unicorn/prefer-string-starts-ends-with (#25045)
juliusmarminge Oct 26, 2026
f10a04b
chore(lint): disable unicorn/prefer-add-event-listener (#25047)
juliusmarminge Oct 26, 2026
d75fb04
chore(lint): disable typescript/no-this-alias (#25048)
juliusmarminge Oct 26, 2026
1cd44f0
chore(lint): disable eslint/no-control-regex (#25049)
juliusmarminge Oct 26, 2026
d1f7018
chore(lint): disable returnEffectInGen (#25050)
juliusmarminge Oct 26, 2026
80b48cc
refactor(mobile): thread detail and feed reset by key and share one f…
juliusmarminge Oct 26, 2026
f88b33a
fix(web): thread find exports the timeline fields type its context na…
juliusmarminge Oct 26, 2026
d487078
chore(lint): enforce react/memo-dependencies (#25117)
juliusmarminge Oct 26, 2026
f279070
fix(web): Escape and copy work in chat media and markdown widgets, wh…
juliusmarminge Oct 26, 2026
f512ff6
fix(web): composer banners, menus and pickers act in their handlers (…
juliusmarminge Oct 26, 2026
0a3b561
refactor(web): device panel reads hub state from atoms (#25265)
juliusmarminge Oct 26, 2026
c3888da
feat(web): New design brings back color where it means something (#25…
t3dotgg Oct 26, 2026
02f4ba7
fix(web): SSH password prompts wait for their dialog, and the app she…
juliusmarminge Oct 26, 2026
d593081
refactor(mobile): settings and usage screens drop sync effects (#25227)
juliusmarminge Oct 26, 2026
a2589f2
fix(mobile): review opens on Changes and keeps the section you picked…
juliusmarminge Oct 26, 2026
7510e5e
fix(mobile): Android dialogs raised before or during activity replace…
juliusmarminge Oct 26, 2026
1de6494
chore(lint): enforce react/purity (#25038)
juliusmarminge Oct 26, 2026
04a21bb
fix(web): app loads again after a chunk cycle blanked it at boot (#25…
t3dotgg Oct 26, 2026
8a4ad94
refactor(web): root notification and toast coordinators start with th…
juliusmarminge Oct 26, 2026
6a3a460
refactor(web): sidebar thread lists derive state instead of syncing i…
juliusmarminge Oct 26, 2026
beeb215
chore(lint): enforce react/refs (#25116)
juliusmarminge Oct 26, 2026
9d6a2e5
fix(web): new thread shortcut focuses palette search, not the Back bu…
t3dotgg Oct 26, 2026
85f17ea
chore(lint): enforce react/exhaustive-effect-dependencies (#25118)
juliusmarminge Oct 26, 2026
72d4dc9
fix(web): composer corners and context strip no longer show double ed…
t3dotgg Oct 26, 2026
f1b8758
fix(web): VS Code icon in thread details no longer has a box around i…
t3dotgg Oct 26, 2026
7df7cb9
fix(web): sent messages stand out on the black canvas in the new desi…
t3dotgg Oct 26, 2026
f40c7c6
feat(web): new design is on by default (#25324)
t3dotgg Oct 26, 2026
7f26969
chore(lint): enforce react/set-state-in-effect (#25119)
juliusmarminge Oct 26, 2026
70b0abc
fix(web): short branch names no longer get clipped in thread details …
t3dotgg Oct 26, 2026
c66f13c
refactor(mobile): stream and MCP webviews tie their work to the view'…
juliusmarminge Oct 26, 2026
aa2c80b
fix(web): stacked notices above the composer no longer cast a dark ba…
t3dotgg Oct 26, 2026
1549046
fix(web): thread undo notice sits above the bottom shelves instead of…
maria-rcks Oct 26, 2026
6f3f0d4
feat(web): "could not load" screen tells users how to debug it (#25317)
t3dotgg Oct 26, 2026
3250780
fix(web): usage tabs no longer jump when switching to Limits (#25336)
t3dotgg Oct 26, 2026
62245d8
fix(web): composer bottom toolbar keeps its background under update n…
t3dotgg Oct 26, 2026
80f411f
chore(lint): enforce catchConditionalRefailToCatchIf (#25081)
juliusmarminge Oct 26, 2026
931bd53
chore(lint): enforce flatMapConditionalToFilterOrFail (#25082)
juliusmarminge Oct 26, 2026
6618ccb
chore(lint): enforce runEffectInsideEffect (#25096)
juliusmarminge Oct 26, 2026
d859715
chore(lint): enforce abortControllerInEffect (#25098)
juliusmarminge Oct 26, 2026
2931461
chore(lint): enforce t3code/no-inline-schema-compile (#25113)
juliusmarminge Oct 26, 2026
d53b446
chore(lint): enforce oxc/no-accumulating-spread (#25114)
juliusmarminge Oct 26, 2026
695f5c9
chore(lint): enforce t3code/no-polling-loop-in-tests (#25120)
juliusmarminge Oct 26, 2026
4e493b1
docs: read GitHub Actions logs through cafe (#25343)
juliusmarminge Oct 26, 2026
4338377
feat(web): "failed to start" screen helps users recover and report th…
t3dotgg Oct 26, 2026
69f85ef
chore(task-cache): name native client downloads so agent-device can i…
juliusmarminge Oct 26, 2026
03851b8
fix(web): keep large thread counts from shrinking labels (#25355)
Yash-Singh1 Oct 26, 2026
cbd72e5
fix(task-cache): avoid cross-request admission waiters (#25353)
juliusmarminge Oct 26, 2026
3d5364f
fix(task-cache): name Android native client downloads .apk
juliusmarminge Oct 26, 2026
10629af
fix(server): select the active iPhone Duo display for screenshots (#2…
shivamhwp Oct 26, 2026
3ed0688
fix(server): remove one-child-per-model instruction (#25359)
Yash-Singh1 Oct 26, 2026
3e70f55
fix(dev): skip auto-seeding large databases (#25365)
Yash-Singh1 Oct 26, 2026
2763bbe
fix(server): preview snapshots preserve blurred backdrops (#24618)
juliusmarminge Oct 26, 2026
5a38e6b
fix(web): model picker no longer jumps when switching providers (#25358)
t3dotgg Oct 26, 2026
9eac774
test(mobile): run React hooks with the release compiler (#24274)
juliusmarminge Oct 26, 2026
bfc7177
fix(mobile): pause videos outside visible thread and PR content (#24268)
juliusmarminge Oct 26, 2026
572cf74
fix(server): retry stalled MCP registration for resumed Claude turns …
Yash-Singh1 Oct 26, 2026
1ecb1a0
fix(mobile): avoid crashes opening wrapped source links (#25156)
juliusmarminge Oct 26, 2026
fb8fc1f
refactor(web): disconnect and reconnect delays read a shared deadline…
juliusmarminge Oct 26, 2026
d171a88
feat(mobile): run the chrome e2e across poses on the device pool
juliusmarminge Oct 26, 2026
72dde22
chore(lint): enforce effectFnOpportunity (#25099)
juliusmarminge Oct 26, 2026
e1c750e
fix(web): composer body ref stops re-attaching on every render (#25409)
juliusmarminge Oct 26, 2026
0a20d7e
fix(web): switching threads no longer delays the next thread's visit …
juliusmarminge Oct 26, 2026
91f47a1
fix(mobile): mobile:install builds on a cache miss for pooled devices…
juliusmarminge Oct 26, 2026
cc93cc5
revert(web): composer body ref goes back to the #25079 ref callback (…
juliusmarminge Oct 26, 2026
184d915
feat(mobile): thread rows drop the branch and lead with the title (#2…
juliusmarminge Oct 26, 2026
a240408
refactor(web): file breadcrumb menus refetch on a new workspace chang…
juliusmarminge Oct 26, 2026
1316d48
fix(web): citations to older responses load their history instead of …
juliusmarminge Oct 26, 2026
6ea3414
refactor(client): composers share one workspace snapshot refresh per …
juliusmarminge Oct 26, 2026
6ffde5b
refactor(mobile): composer pastes and picks are cancelled by their dr…
juliusmarminge Oct 26, 2026
e24eabf
chore: sync upstream/main at 6ffde5ba3
Fryuni Oct 26, 2026
12441fa
fix(web): shared pull request observations keep the host apart
Fryuni Oct 26, 2026
7c2470e
ci: web tests run two files at a time on GitHub-hosted runners
Fryuni Oct 26, 2026
e5fe322
ci: web tests get a longer timeout on GitHub-hosted runners
Fryuni Oct 26, 2026
f538398
ci: web tests run one file at a time on GitHub-hosted runners
Fryuni Oct 26, 2026
dbb816f
docs: AGENTS.md notes the fork's raised CI test timeout
Fryuni Oct 26, 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.
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. Authorized 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
22 changes: 22 additions & 0 deletions .github/actions/setup-ci-deps/action.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
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: ""
runs:
using: composite
steps:
Expand Down Expand Up @@ -65,3 +70,20 @@ runs:
- name: Install dependencies
shell: bash
run: vp install

- 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 != ''
Comment thread
Fryuni marked this conversation as resolved.
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"
Comment thread
Fryuni marked this conversation as resolved.
else
echo 'VP_REMOTE_CACHE=read' >> "$GITHUB_ENV"
fi
36 changes: 7 additions & 29 deletions .github/scripts/ci-changes.cjs
Original file line number Diff line number Diff line change
@@ -1,37 +1,24 @@
// Decides which CI jobs a change needs. Prints `key=value` lines for
// $GITHUB_OUTPUT; a job runs unless its key is "false".
//
// node ci-changes.cjs --paths <file> gate by the listed paths
// node ci-changes.cjs --paths <file> --full run every Linux job, gate only the macOS lint
// node ci-changes.cjs changed paths unknown: run everything
//
// scripts/check-changed.ts requires the same decisions so local runs match CI.
//
// Every changed path maps to workspace packages, which then pull in their
// dependents from package.json. A path this file does not recognize runs
// everything, so a new root file or directory can only cost minutes.
// Unknown paths run every job; recognized packages pull in their dependents.
// scripts/check-changed.ts shares these decisions so local checks match CI.
const fs = require("node:fs");
const path = require("node:path");

const root = path.resolve(__dirname, "../..");

// Never read by a build, typecheck, or test. Lint still formats them.
const INERT = [
/^docs\//,
/^\.(agents|cursor|vscode|devcontainer|macroscope|repos)\//,
/^[^/]+\.md$/,
/^LICENSE$/,
];

// Run everything: the root vite.config.ts loads the first as setup for every
// package's tests, and the vendored mobile tarballs are installed dependencies.
// Shared test setup and vendored mobile dependencies affect every package.
const RUNS_EVERYTHING = [
/^packages\/shared\/src\/(HostProcess|testing\/longTempDir)\.ts$/,
/^apps\/mobile\/deps\//,
];

// Paths outside a package, or files inside one that other packages read
// through relative imports rather than a package.json dependency.
// Includes cross-package reads absent from package.json dependencies.
const EXTRA_OWNERS = [
// Vite configs and tsconfigs of these apps import scripts/lib directly.
[/^scripts\/lib\//, ["@t3tools/desktop", "@t3tools/mobile", "@t3tools/web", "t3"]],
Expand All @@ -43,9 +30,7 @@ const EXTRA_OWNERS = [
];
const RUST = /^native\/(resource-monitor|kde-snap-shot|hyprland-snap-shot)\//;

// Tests that read another package's files without declaring it. The scripts
// tests read app manifests, assets, and sources (cursor-sdk-packaging,
// third-party-licenses, brand-assets, build-desktop-artifact).
// These tests read other packages without declaring dependencies.
const TEST_ONLY_DEPS = {
"@t3tools/provider-pi": ["@t3tools/client-runtime"],
"@t3tools/scripts": [
Expand All @@ -56,17 +41,12 @@ const TEST_ONLY_DEPS = {
"@t3tools/provider-cursor",
],
};
// Declared dependencies that only feed a build step: the server bundles the
// built web app (apps/server/vite.config.ts) but never imports it.
// The server bundles the web build without importing it.
const BUILD_ONLY_DEPS = { t3: ["@t3tools/web"] };

// Sources scripts/mobile-native-static-check.ts lints, plus the tool and rule
// configuration that decides how it lints them, plus the root package.json
// that defines the lint:mobile command.
const MOBILE_NATIVE =
/^apps\/mobile\/.*\.(swift|kt|kts)$|^apps\/mobile\/(\.swiftlint\.yml|detekt\.yml|\.editorconfig|Brewfile)$|^scripts\/mobile-native-static-check\.ts$|^package\.json$|^\.github\/workflows\/ci\.yml$|^\.github\/scripts\/ci-changes\.cjs$|^\.github\/actions\/ci-changes\//;

// Jobs that test every package except these, which have jobs of their own.
const OWN_TEST_JOB = new Set(["t3", "@t3tools/web", "@t3tools/monorepo"]);

function readWorkspace() {
Expand Down Expand Up @@ -108,8 +88,7 @@ function readWorkspace() {
return packages;
}

// Returns the packages a path touches, [] for an inert path, or null when the
// path is not understood and everything must run.
// [] means inert; null means unknown and requires every job.
function ownersOf(file, packages) {
if (INERT.some((pattern) => pattern.test(file))) return [];
// A manifest can change dependencies or versions other packages read.
Expand Down Expand Up @@ -148,7 +127,6 @@ function decide(files, packages, full) {
if (everything) {
affected = all;
} else {
// Add dependents until nothing changes.
let grew = true;
while (grew) {
grew = false;
Expand Down
7 changes: 2 additions & 5 deletions .github/scripts/stage-preview-bundle.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@
"server/dist/client/index.html",
"desktop/dist-electron/main.cjs",
}
# The current bundle is about 32 MiB compressed. Bound extraction on the
# trusted runner even when the PR replaces the uploader entirely.
# Bound trusted-runner extraction even when a PR replaces the uploader.
MAX_ARCHIVE_BYTES = 512 * 1024 * 1024
MAX_EXPANDED_BYTES = 2 * 1024 * 1024 * 1024
MAX_ENTRIES = 50_000
Expand Down Expand Up @@ -58,9 +57,7 @@ def stage_bundle(archive: Path, destination: Path):
files.add(name)
if not REQUIRED_FILES <= files:
raise ValueError("Preview bundle is missing required entry points")
# Validate all names before writing anything. This is a fresh directory
# outside the checkout; neither pre-existing links nor trusted files
# can be followed or overwritten. ZIP permissions are never restored.
# Validate before writing into a fresh directory so existing links/files cannot be followed or overwritten.
destination.mkdir(parents=True, exist_ok=False)
for entry in entries:
target = destination / entry.filename
Expand Down
3 changes: 1 addition & 2 deletions .github/scripts/thread-transfer-report.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -294,8 +294,7 @@ async function resolve({ github, context, core }) {

const sourceArtifacts = await artifactsForRun(github, owner, repo, source.id);
const sourceArtifact = findResultArtifact(sourceArtifacts);
// CI requires the artifact whenever the server tests run, so a passing run
// without one skipped them because the PR cannot affect the server.
// Successful server tests require this artifact; its absence means CI skipped them.
if (!sourceArtifact && source.conclusion === "success") {
core.info("CI skipped the server tests for this change; nothing to report.");
core.setOutput("publish", "false");
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -163,8 +163,10 @@ jobs:
node apps/web/node_modules/playwright/cli.js install-deps chromium
fi

# GitHub-hosted runners render about five times slower than upstream's, so the file
# preview browser tests need the browser to themselves and a longer timeout.
- name: Test
run: vp run --filter @t3tools/web test
run: vp run --filter @t3tools/web test --maxWorkers=1 --testTimeout=60000

# apps/server sets `fileParallelism: false`, so its test files run strictly
# one at a time. Sharding spreads them over separate runners instead of
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ apps/mobile/.generated/
apps/mobile/.android-cache/
/.generated/
artifacts/app-store/screenshots/
artifacts/mobile-e2e/
.github/pr-assets/
native/**/target/
node_modules/
Expand Down
24 changes: 24 additions & 0 deletions .macroscope/ignore.md
Original file line number Diff line number Diff line change
Expand Up @@ -255,3 +255,27 @@ ENV/**
# (see scripts/lib/reference-repos.ts). Nothing imports from them; findings
# there belong upstream.
.repos/**

# Generated code. Review its source (the script, GraphQL document, schema
# definition, or theme) instead; review agents can still read these on demand.
**/*.generated.ts
**/*.graphql.ts
apps/server/schema/expo.graphql
packages/source-control-github/schema/github.graphql
apps/mobile/generated-uniwind-*
apps/mobile/clerk-theme.json
apps/server/src/testUtils/shardWeights.json
infra/relay/migrations/**/snapshot.json

# Provider transcripts recorded from real CLI runs for the orchestration replay
# tests. Each scenario's input.ts and *_output.ts assertions stay reviewed.
**/*.ndjson

# Ghostty build output vendored from upstream.
apps/mobile/modules/t3-terminal/Vendor/**
native/libghostty-vt/include/**

# @pierre/highlights compiled to C by wasm2c, plus the wasm2c runtime and simde
# it needs. Regenerated by apps/mobile/scripts/generate-highlights.mts; review
# that script and cpp/t3_highlights.c instead.
apps/mobile/modules/t3-highlights/Vendor/**
7 changes: 2 additions & 5 deletions .pnpmfile.cjs
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
// Windows WSL dev mode runs the server under Linux from the same node_modules
// as the Windows client, so Windows installs also need Linux x64 glibc native
// modules. Other platforms install only their own binaries; setting this
// everywhere added ~2.2 GB of foreign binaries to every macOS install.
// Release scripts stage their own installs with explicit architectures.
// Windows installs need Linux x64 glibc binaries because WSL shares node_modules.
// Keep other platforms native; release scripts set their own architectures.
module.exports = {
hooks: {
// `typescript` is @tsc-rs/typescript (the catalog entry). Its npm version (0.8.x) is outside
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ export interface NodeServeHandler {
export interface NodeServeEntryOptions {
/**
* JS expression resolving the on-disk client-assets directory
* (typically `fileURLToPath(new URL("../client/", import.meta.url))`).
* (typically `fileURLToPath(new URL("../shared/", import.meta.url))`).
* Omit to skip static-file serving (Next.js handles its own assets).
*/
readonly clientDirExpression?: string | undefined;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,14 @@ describe("relativeClientDirExpression", () => {
"/project/dist/server/serve-node.mjs",
"/project/dist/client",
),
).toBe(`fileURLToPath(new URL("../client/", import.meta.url))`);
).toBe(`fileURLToPath(new URL("../shared/", import.meta.url))`);
Comment thread
Fryuni marked this conversation as resolved.
});
});

describe("makeNodeServeEntrySource", () => {
it("listens on PORT, answers /health, serves static files, then the fetch handler", () => {
const source = makeNodeServeEntrySource({
clientDirExpression: `fileURLToPath(new URL("../client/", import.meta.url))`,
clientDirExpression: `fileURLToPath(new URL("../shared/", import.meta.url))`,
handler: {
kind: "fetch",
imports: `import { handler } from "./index.mjs";`,
Expand Down Expand Up @@ -131,7 +131,7 @@ describe("makeNodeServeEntrySource", () => {

it("does not map GET / onto public/index.html (SSR home stays on the handler)", () => {
const source = makeNodeServeEntrySource({
clientDirExpression: `fileURLToPath(new URL("../client/", import.meta.url))`,
clientDirExpression: `fileURLToPath(new URL("../shared/", import.meta.url))`,
handler: {
kind: "node",
imports: `import { handler } from "./index.mjs";`,
Expand Down
3 changes: 3 additions & 0 deletions .task-cache.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"endpoint": "https://t3-task-cache.pinglabs.workers.dev/projects/t3code"
}
Loading
Loading