Skip to content
Merged
Show file tree
Hide file tree
Changes from 250 commits
Commits
Show all changes
1083 commits
Select commit Hold shift + click to select a range
f81c4cd
fix(web,mobile): markdown previews no longer show YAML frontmatter as…
t3dotgg Oct 27, 2026
b333c17
fix(web): compact toggle shows the token count again (#25818)
t3dotgg Oct 27, 2026
bc8d02f
fix(server): preserve interrupted Claude context after revert (#25695)
juliusmarminge Oct 27, 2026
1702d55
fix(web,mobile): bot approvals are visible on the PR summary (#25829)
t3dotgg Oct 27, 2026
f3b058c
fix(web,mobile): stopped runs no longer look like errors (#25830)
t3dotgg Oct 27, 2026
d2ab13b
refactor(mobile): share imports run outside the new-task screen (#25793)
juliusmarminge Oct 27, 2026
c175e57
fix(build): TEMPORARY workaround so linux-arm64 builds run on 16/64 K…
t3dotgg Oct 27, 2026
d033768
fix(server): preserve completed runs when accepting child deliveries …
juliusmarminge Oct 27, 2026
e5f2e5d
fix(client-runtime): iOS resume keeps live sockets and drops dead one…
t3dotgg Oct 27, 2026
56695ae
feat: model labels show the name you'd say out loud (#24205)
flamboh Oct 27, 2026
1ebbc20
chore(review): CodeRabbit reviews tests against docs/internals/testin…
flamboh Oct 27, 2026
a24b109
refactor(mobile): showcase capture readiness is a tested pure model (…
juliusmarminge Oct 27, 2026
03be432
fix(mobile): a held thread move retires when a snooze wakes, even wit…
juliusmarminge Oct 27, 2026
4cb29a5
fix(web): switching a file between markdown and the editor no longer …
juliusmarminge Oct 27, 2026
92e6450
fix(web,mobile): queued messages get a simpler Send now row, no reord…
t3dotgg Oct 27, 2026
737eab2
fix(mobile): Add project path survives its host dropping out and retu…
juliusmarminge Oct 27, 2026
28286d5
refactor(mobile): opening Review or Files shows the inspector in the …
juliusmarminge Oct 27, 2026
52925f9
refactor(mobile): prompt links resolve when the link is parsed, not f…
juliusmarminge Oct 27, 2026
ad068d7
fix(web): Steer no longer does nothing while a compaction runs (#25837)
t3dotgg Oct 27, 2026
a86c05f
fix(desktop): Cmd/Ctrl+W closes sidebar tabs, never the window (#25860)
t3dotgg Oct 27, 2026
e109dc8
refactor(mobile): each new-task draft route keeps its own flow state …
juliusmarminge Oct 27, 2026
63bc022
fix(web): clicking the device screen no longer draws a focus ring (#2…
t3dotgg Oct 27, 2026
00c636e
fix(mobile): picking a project on two machines starts on the connecte…
t3dotgg Oct 27, 2026
a452c2d
fix(mobile): opening a new thread before it is created no longer mark…
whoisaldo Oct 27, 2026
7c3b3b3
fix(desktop): packaged server ships zod for @cursor/sdk 1.0.38 (#25841)
jason5545 Oct 27, 2026
9db3401
chore(mobile): e2e runner on agent-device 0.21.32, side-rail aware ta…
juliusmarminge Oct 27, 2026
edf5a24
refactor(mobile): subagent timers share the visible second clock (#25…
juliusmarminge Oct 27, 2026
790ba13
refactor(mobile): app update checks start with the app (#25856)
juliusmarminge Oct 27, 2026
79f6cd3
refactor(mobile): workspace tabs, home filters and connection status …
juliusmarminge Oct 27, 2026
58c31f2
refactor(mobile): settings permission and update checks without sync …
juliusmarminge Oct 27, 2026
1152e91
fix(desktop): run the packaged bundle self-check on macOS artifacts (…
Oct 27, 2026
7873f53
fix(web): the Add ChatGPT account dialog animates closed once the acc…
juliusmarminge Oct 27, 2026
c39a115
refactor(web): composer clears scroll-collapse in render, not after p…
juliusmarminge Oct 27, 2026
a4fe62e
refactor(web): composer overlay re-measures from one layout effect (#…
juliusmarminge Oct 27, 2026
3e61886
refactor(web): file browser records the right-click position on its o…
juliusmarminge Oct 27, 2026
067db24
refactor(web): preview element picker drops its unmount guard (#25920)
juliusmarminge Oct 27, 2026
2083a22
fix(web): PR Code tab no longer requests the diff of a commit the PR …
juliusmarminge Oct 27, 2026
0d88fcf
perf(mobile): worktree setup updates commit the thread screen once (#…
juliusmarminge Oct 27, 2026
3087e60
fix(desktop): a broken release opens an error window instead of hangi…
t3dotgg Oct 27, 2026
30f4d63
ci(web): releases fail when the built web app cannot boot (#25929)
t3dotgg Oct 27, 2026
f41518f
ci(release): desktop builds that cannot open no longer publish (#25928)
t3dotgg Oct 27, 2026
6dc4842
refactor(web): file tree drag mentions use React drag handlers (#25913)
juliusmarminge Oct 27, 2026
319c572
refactor(mobile): git action results buzz from where they are reporte…
juliusmarminge Oct 27, 2026
a8edf13
fix(mobile): the Add environment form shows only its own pairing erro…
juliusmarminge Oct 27, 2026
e923627
refactor(mobile): showcase capture runs as an app service, not a chai…
juliusmarminge Oct 27, 2026
36d4d71
fix(server): bound hung delegated stop effects so later runs can star…
juliusmarminge Oct 27, 2026
dc84b09
feat(mobile): add One UI navigation preference on Android (#25758)
PixPMusic Oct 27, 2026
5b15cfc
fix(mobile): center Android sheets and fit book-mode sheets in the le…
PixPMusic Oct 27, 2026
2ba1a09
fix(mobile): keep the collapsed Android rail square (#26039)
PixPMusic Oct 27, 2026
d0b81ce
fix(web): closing the last Browser tab hides the right panel again (#…
juliusmarminge Oct 27, 2026
21762b5
refactor(web): pull requests Cmd+F focuses the topbar search directly…
juliusmarminge Oct 27, 2026
6369e28
refactor(web): install draft model reconciliation at app start (#26046)
juliusmarminge Oct 27, 2026
03186e0
perf(mobile): project favicons mount their image in one commit (#26047)
juliusmarminge Oct 27, 2026
7b4c4b4
refactor(web): the upload queue alone records finished file uploads o…
juliusmarminge Oct 27, 2026
9ff0597
feat(mobile): Usage uses the width on iPad and unfolded phones (#26061)
juliusmarminge Oct 27, 2026
3a87681
fix(gitcafe): PR panel follows renumbered pull requests (#26079)
juliusmarminge Oct 27, 2026
bc1ea26
chore(infra): bump Alchemy to 2.0.0-beta.84 (#26057)
juliusmarminge Oct 27, 2026
d1c4b52
refactor(mobile): stop writing the resolved project filter back from …
juliusmarminge Oct 27, 2026
76d5ec7
fix(mobile): a pairing link fills the open Add environment form inste…
juliusmarminge Oct 27, 2026
a56ecda
fix(mobile): snooze menu times advance with the clock (#26043)
juliusmarminge Oct 27, 2026
0232932
fix(clients): prompt links find projects cloned from git.cafe (#26042)
juliusmarminge Oct 27, 2026
740de0e
fix(server): retry Codex capacity failures with empty input (#25611)
Yash-Singh1 Oct 27, 2026
07242ab
fix(server): recover handoffs when target context is exhausted (#25610)
Yash-Singh1 Oct 27, 2026
4914cdd
fix(web): chips drop their pill and stay readable on every theme (#25…
flamboh Oct 27, 2026
73acddc
fix(mobile): switching pull request tabs no longer jumps the page (#2…
flamboh Oct 27, 2026
570d4b0
feat(mobile): report crashes to Axiom with symbolicated stacks (#19093)
gabrielelpidio Oct 27, 2026
5808469
fix(web): chip palette test follows the single design (#26131)
juliusmarminge Oct 27, 2026
1b1ad04
feat(server): /mcp narrows a client's modes from T3-Mode-Limit (#16653)
juliusmarminge Oct 27, 2026
888e444
feat(server): t3_thread_launch takes clientRequestId (#16654)
juliusmarminge Oct 27, 2026
4005759
feat(server): link to another environment (#16655)
juliusmarminge Oct 27, 2026
cb98850
feat(server): agents use linked environments through any T3 tool (#16…
juliusmarminge Oct 27, 2026
6918c35
feat(server): work a linked environment starts stays within its link …
juliusmarminge Oct 27, 2026
a6676f9
feat(web,mobile): linked environments in Connections (#16698)
juliusmarminge Oct 27, 2026
594f1ce
feat(server): delegate_task to a linked environment (#16719)
juliusmarminge Oct 27, 2026
8b14660
feat(server,web,mobile): an agent sets up a link to another environme…
juliusmarminge Oct 27, 2026
5e9d564
feat(server,web,mobile): @-mention a machine, and linked environments…
juliusmarminge Oct 27, 2026
fe0e8d4
fix(mobile): dragging a microphone or environment route now saves its…
juliusmarminge Oct 27, 2026
bbd9593
feat(web): channel artwork choice on Latest, plus nightly or dev art …
maria-rcks Oct 27, 2026
5b70d81
feat(mobile): browse ZIP attachments with the shared archive reader (…
Bil0000 Oct 27, 2026
8d94203
fix(server): Claude --settings launch args merge with T3's settings i…
t3dotgg Oct 27, 2026
a27ec88
feat(server,web): see and stop the dev servers a thread started (#22542)
t3dotgg Oct 27, 2026
f08136d
fix(web): composer no longer jumps when a second line is added (#26155)
maria-rcks Oct 27, 2026
b31de68
feat(web,mobile): queued messages show who sent them (#26159)
juliusmarminge Oct 27, 2026
8f0b729
fix(preview): agent and browser panel show the same page after a late…
t3dotgg Oct 27, 2026
1cf14a4
fix(web): pairing, connect, error, and Clerk sign-in surfaces match t…
maria-rcks Oct 27, 2026
3b22620
fix(server): parallel worktree launches no longer fail on .git/config…
juliusmarminge Oct 27, 2026
4cb5f10
fix(task-cache): the hook test waits for every flusher it starts (#26…
juliusmarminge Oct 27, 2026
33d0c96
chore(lint): every React effect states its reason at the call site (#…
juliusmarminge Oct 27, 2026
0637f87
test(server): the link-card retry test names a new MCP credential (#2…
juliusmarminge Oct 27, 2026
e66ffcc
perf(web): stop measuring table cells while replies stream (#26152)
t3dotgg Oct 27, 2026
dde3fdb
feat(desktop): add a remote server by clicking its t3code://pair link…
t3dotgg Oct 27, 2026
cb7e381
chore(mobile): e2e runner retries pool failures and reports them apar…
juliusmarminge Oct 27, 2026
867112c
fix(server): agent questions stay answerable after a server restart (…
SunkenInTime Oct 27, 2026
34ca613
chore(lint): the effect lint error walks the alternatives before the …
juliusmarminge Oct 27, 2026
4fc9e5f
fix(web): settings avatar no longer hugs the modal corner (#26180)
t3dotgg Oct 27, 2026
622bc06
fix(mobile): shared file names can no longer write outside the Androi…
juliusmarminge Oct 27, 2026
80b7b0f
fix(server): repository lookups no longer send GitHub tokens to arbit…
juliusmarminge Oct 27, 2026
f0c1da3
fix(github): long period runs no longer freeze reference autolinking …
juliusmarminge Oct 27, 2026
0b7caf2
fix(mobile): Android diff ellipsis no longer measures text quadratica…
juliusmarminge Oct 27, 2026
b88da91
fix(server): Codex works again after its app-server is killed (#26188)
t3dotgg Oct 27, 2026
3ae672f
fix(desktop): ask once per site before a preview page reads the clipb…
juliusmarminge Oct 27, 2026
294981f
fix(mobile): Windows paths in messages keep their backslashes (#21454)
juliusmarminge Oct 27, 2026
7e884b2
feat: triage an issue from the command palette, no terminal needed (#…
t3dotgg Oct 27, 2026
a846084
fix(server): Forgejo required-check globs no longer hang the event lo…
juliusmarminge Oct 27, 2026
735cc3c
fix(server): fx's version policy reaches servers with a cached model …
juliusmarminge Oct 27, 2026
c570c2c
fix(mobile): keep iPad tab bar within narrow sidebars (#26198)
juliusmarminge Oct 28, 2026
c38b265
feat(web): filter the sidebar by several projects at once (#25284)
maria-rcks Oct 28, 2026
0894156
fix(mobile): provider accounts fit each provider on one row (#25861)
saphid Oct 28, 2026
531cee6
fix(server): Claude background-task wakes start when the queue is hel…
fireboltdude1357 Oct 28, 2026
68495b6
docs(testing): new tests extend existing cases and stay at one layer …
t3dotgg Oct 28, 2026
06d4b57
fix(web): composer strip drops the folder icon next to the machine ic…
maria-rcks Oct 28, 2026
7e71392
feat(web): background work line shows the newest activity, no dots (#…
maria-rcks Oct 28, 2026
7f2dcd8
fix(mobile): dictation buttons line up with the send button on every …
juliusmarminge Oct 28, 2026
df4132b
chore(mobile): e2e runs keep Metro's output, the app's console logs, …
juliusmarminge Oct 28, 2026
2e2d86c
chore(mobile): e2e Metro serves no lazy chunks
juliusmarminge Oct 28, 2026
4ab7084
feat(web,mobile): the @ picker lists threads on linked machines (#26201)
juliusmarminge Oct 28, 2026
0affd28
feat(web,mobile): Copy thread copies a chip that works on linked mach…
juliusmarminge Oct 28, 2026
5cf49d2
fix(mobile): unclosed code fences in HTML blocks no longer freeze PR …
juliusmarminge Oct 28, 2026
b5af460
fix(opencode): apply runtime mode changes to existing OpenCode sessio…
juliusmarminge Oct 28, 2026
8251578
fix(server): Antigravity file writes cannot escape the workspace thro…
juliusmarminge Oct 28, 2026
7a059b9
chore(mobile): e2e treats a failed daemon read as a pool error
juliusmarminge Oct 28, 2026
2525252
feat(web): F6 moves between workspace areas, and the sidebar is keybo…
t3dotgg Oct 28, 2026
575a03f
chore(review): Macroscope check agents move to GPT 6.1 Sol (#26187)
t3dotgg Oct 28, 2026
e2a8ef0
feat(dev): test turns in the UI for free with a replay provider (#26207)
t3dotgg Oct 28, 2026
93a9e07
feat(threads): choose your own snooze options in settings (#26208)
t3dotgg Oct 28, 2026
c3b40b9
fix(relay): stop delivery attempts from growing the database forever …
juliusmarminge Oct 28, 2026
9638e17
fix(relay): tunnel cleanup keeps up with new idle tunnels (#26135)
juliusmarminge Oct 28, 2026
4b00290
fix(server): delegate cgroups to agent scopes (#23913)
juliusmarminge Oct 28, 2026
3b2f958
fix(server): ACP Registry searches reuse a recently fetched index (#2…
juliusmarminge Oct 28, 2026
67661cf
chore: delete 18k lines of code that nothing reaches (#26238)
t3dotgg Oct 28, 2026
e0b3cfe
fix(web): image and file chips underline their name on hover again (#…
flamboh Oct 28, 2026
2de4762
fix(mobile): tab bar hides with the push, logo fits the iPad sidebar,…
juliusmarminge Oct 28, 2026
91992bd
fix(web): update dialog shows one row per machine (#26210)
t3dotgg Oct 28, 2026
7c6446b
chore(mobile): e2e review skips behaviour confirmed as intended
juliusmarminge Oct 28, 2026
36aea58
fix(mobile): trust user-installed Android CA certificates (#25730)
juliusmarminge Oct 28, 2026
8947f3e
fix(web): server rows keep their source visible, cmd-click opens your…
t3dotgg Oct 28, 2026
f120c51
fix(mobile): list bullets keep a gap before their text at every text …
juliusmarminge Oct 28, 2026
949929d
fix(mobile): Android split content keeps a gap at the screen edge (#2…
juliusmarminge Oct 28, 2026
c2fbf0a
feat(server,web,mobile): thread links name their environment and neve…
juliusmarminge Oct 28, 2026
fe55faf
fix(clients): # suggestions put linked pull requests first for text q…
juliusmarminge Oct 28, 2026
49a9e80
fix(terminal): keep shared terminal grids in sync (#24352)
juliusmarminge Oct 28, 2026
0c80751
feat: sign in to GitHub through the T3 Code for GitHub app [internal …
juliusmarminge Oct 28, 2026
ff71186
test(mobile): vp run mobile:behavior grades app behavior on pool devices
juliusmarminge Oct 28, 2026
9910c0e
perf: reduce remote reconnect and command delays (#25754)
Bil0000 Oct 28, 2026
822fc15
fix(relay): deploys plan again after the Worker lost its default expo…
juliusmarminge Oct 28, 2026
3ef1610
fix(web): compaction row says "Compacting for 12s" instead of "after …
t3dotgg Oct 28, 2026
9a8bc04
test(task-cache): remove flaky native runner integration test
juliusmarminge Oct 28, 2026
c4606e5
fix(server): Codex shadow homes share thread writer locks with the ma…
t3dotgg Oct 28, 2026
28da8c8
fix(mobile): sidebar connection status uses the header's free width (…
juliusmarminge Oct 28, 2026
9c6429d
fix(web): threads without a project start on the primary environment …
juliusmarminge Oct 28, 2026
cafdcda
fix(clients): give image attachment chips a blue accent (#26306)
Yash-Singh1 Oct 28, 2026
afc2334
fix(web): prevent image thumbnails from warping during repaints (#26308)
Yash-Singh1 Oct 28, 2026
49582b7
test(web): attachment font and large-text preview tests wait for the …
juliusmarminge Oct 28, 2026
8031991
fix(opencode): subagent sessions follow runtime mode changes (#26302)
juliusmarminge Oct 28, 2026
1f8530e
feat(web): pending approvals show on their timeline row (#26255)
maria-rcks Oct 28, 2026
9b052a2
fix(web): show the platform modifier in the send tooltip (#22436)
UtkarshUsername Oct 28, 2026
feb49e7
fix(web): let theme color pickers use popover glass (#22348)
UtkarshUsername Oct 28, 2026
9bc0419
fix(relay): concurrent link requests can no longer exceed the managed…
juliusmarminge Oct 28, 2026
003ccd3
fix(client-runtime): pairing links can no longer add routes to a save…
juliusmarminge Oct 28, 2026
feb2e32
fix(web): align sidebar button geometry with shared tokens (#22287)
UtkarshUsername Oct 28, 2026
c0f9e36
fix(mobile): pairing deep links can no longer target a saved environm…
juliusmarminge Oct 28, 2026
8e76f94
feat(relay): T3 Chat Pro and Premier accounts get more tunnels (#25931)
t3dotgg Oct 28, 2026
0deb383
test(mobile): pairing link test runs the app's real link parsing (#26…
juliusmarminge Oct 28, 2026
50d3a31
fix: guests see the screenshots the agent shows in its replies (#26323)
t3dotgg Oct 28, 2026
a9418a1
ci(release): releases no longer reinstall Vite+ in every job (#26305)
t3dotgg Oct 28, 2026
f6d3700
ci: server test shards survive a throttled task cache (#26332)
t3dotgg Oct 28, 2026
4e4d4ba
feat(web): boring sidebar groups threads into project folders (#21039)
t3dotgg Oct 28, 2026
9ebca5f
fix(relay): tunnel limit counts abandoned reprovisions and frees fail…
juliusmarminge Oct 28, 2026
cadbdaf
test(web): attachment preview tests wait long enough for cold workers…
t3dotgg Oct 28, 2026
2349c81
refactor(mobile): app link parsing reads top to bottom with pipe (#26…
juliusmarminge Oct 28, 2026
ce66aab
ci(release): Windows CLI builds retry the Node.js download (#26345)
t3dotgg Oct 28, 2026
990e9e0
fix(web): preserve handoffs before superseded attempt folds (#26333)
Yash-Singh1 Oct 28, 2026
441a4eb
feat(web): open tool call diffs in the diff panel (#26304)
Yash-Singh1 Oct 28, 2026
cfc8be9
ci: a stalled Node.js download retries after 2 minutes, not 10 (#26343)
t3dotgg Oct 28, 2026
c3f5e36
fix(server): avoid replaying stale Codex usage limits (#26331)
Yash-Singh1 Oct 28, 2026
ff42480
feat(web): mark PR files viewed with shift-click (#26349)
Yash-Singh1 Oct 28, 2026
9bc4138
refactor: flatten nested call chains (#26350)
juliusmarminge Oct 28, 2026
10e709c
fix(queued-message): avoid duplicate queued message entries (#26355)
Yash-Singh1 Oct 28, 2026
f17c9d2
fix(models): new Claude threads default to Opus 5.5 (#26358)
t3dotgg Oct 28, 2026
a4e1986
docs: T3 Chat Pro and Premier raise the T3 Connect tunnel limit (#26366)
t3dotgg Oct 28, 2026
dac58fa
fix(web): use neutral indicators for inactive source control provider…
UtkarshUsername Oct 28, 2026
cb4fe60
fix(web): show the thread details tooltip (#24864)
UtkarshUsername Oct 28, 2026
975b3dc
fix(client-runtime): keep subagent questions off parent threads (#26367)
Yash-Singh1 Oct 28, 2026
be2ea30
fix(build): keep effect out of the public-config bootstrap (#26371)
juliusmarminge Oct 28, 2026
4c9c7d0
chore(mobile): bump app version to 2.2.0
t3-code-bot[bot] Oct 28, 2026
c677d5f
fix(web): scroll-to-end button no longer jumps up and down (#26375)
t3dotgg Oct 28, 2026
07f7f97
ci(release): releases stop depending on npm and nodejs.org when nothi…
t3dotgg Oct 28, 2026
001d16e
feat(web): boring sidebar hides projects with no active threads (#26387)
t3dotgg Oct 28, 2026
9f33a1c
feat(web): show T3 Connect tunnel usage and push full accounts to T3 …
t3dotgg Oct 28, 2026
40d335a
fix(web): settling a thread no longer scrolls the sidebar to the bott…
t3dotgg Oct 28, 2026
80fcb7f
fix(web): boring sidebar folders put your latest message on top (#26391)
t3dotgg Oct 28, 2026
2a73827
fix(server): threads settle right away when a watched PR merges (#26395)
t3dotgg Oct 28, 2026
d2429f7
fix(server): load long thread history in bounded pages (#26240)
Yash-Singh1 Oct 28, 2026
c3858bf
fix(web): snooze options sort soonest first, fit 2 digits, and link f…
t3dotgg Oct 28, 2026
48a2923
fix(web): file preview wrap buttons no longer turn off word wrap ever…
t3dotgg Oct 28, 2026
bd84b17
feat(web): simpler composer with grouped controls, effort words and n…
t3dotgg Oct 28, 2026
96a330c
fix(web): remote delegates show their harness icon, a parent row, and…
t3dotgg Oct 28, 2026
1abf368
fix(build): builds no longer fail when GitHub's CDN times out on lice…
t3dotgg Oct 28, 2026
0160c44
feat(server): agents list snoozed threads across all projects in one …
t3dotgg Oct 28, 2026
c280e64
fix(server): searching delegate models by provider name no longer sho…
t3dotgg Oct 28, 2026
eb751fa
fix(web): chat tables open at the right size instead of collapsed and…
t3dotgg Oct 28, 2026
6bc87b9
ci(release): desktop builds stop hitting the npm registry for staged …
t3dotgg Oct 28, 2026
5211acf
feat(web): boring sidebar can show folder threads on two lines (#26463)
t3dotgg Oct 28, 2026
125b619
fix(server): release completed pull request sweep data (#25177)
juliusmarminge Oct 28, 2026
d5f1d0a
test(evals): device manager cases for mcp-tool-use (#25850)
gabrielelpidio Oct 28, 2026
d07c0a7
fix(server): agents drive simulators through the device tools instead…
gabrielelpidio Oct 28, 2026
30eb7e7
fix(mobile): overlay sidebar header blurs content scrolling under it …
juliusmarminge Oct 28, 2026
fec83a1
fix(web): numbered composer lists nest and lift correctly (#17138)
michal-billtech Oct 28, 2026
612a8e5
feat(mobile): add dynamic workflows to the Agents sheet (#18642)
Bil0000 Oct 28, 2026
237498c
fix(ci): Android merges stop cutting a new Play Store build every tim…
juliusmarminge Oct 28, 2026
886d8f6
fix(mobile): dictation confirm button no longer hugs the small compos…
juliusmarminge Oct 28, 2026
be6ff17
feat(devices): lease simulators and emulators from a Simlock pool (al…
juliusmarminge Oct 28, 2026
ba18706
fix(mobile): use a native split button for Android merges (#26373)
PixPMusic Oct 28, 2026
9e09926
docs: settings paths name the Environments and Sharing & access pages…
juliusmarminge Oct 28, 2026
9826dbb
docs(agents): agents verify in a browser or simulator without asking …
juliusmarminge Oct 28, 2026
5b89a53
feat(pull-requests): manage GitHub maintainer edits (#25588)
Bil0000 Oct 28, 2026
d464631
fix(web): image chips drop the pill and match other chips (#26379)
flamboh Oct 28, 2026
e34067e
fix(mobile): align settled and active thread rows (#26622)
PixPMusic Oct 28, 2026
e677e97
fix(server): publish local git status before remote lookup (#21046)
JustYannicc Oct 29, 2026
26caea2
fix(server): outside MCP clients get thread links they can open (#26642)
t3dotgg Oct 29, 2026
725573f
fix(web): double-click selects the whole inline code span (#26639)
t3dotgg Oct 29, 2026
b287102
fix(acp): ID-only command approvals keep the tracked command and gran…
juliusmarminge Oct 29, 2026
37a9ca0
fix(cursor): subagent ls, lint and MCP results no longer fail the par…
juliusmarminge Oct 29, 2026
29f33af
perf(web): long-thread timeline rebuilds 45 → 9 ms, tool updates 12 →…
juliusmarminge Oct 29, 2026
a42bdd4
fix(mobile): a thread opened while reconnecting no longer turns into …
shivamhwp Oct 29, 2026
221610f
fix(web): keep settled drop hint inside the sidebar viewport (#26736)
Yash-Singh1 Oct 29, 2026
be7d86f
feat(devices): Simlock setup uses each machine's agent-device token, …
juliusmarminge Oct 29, 2026
a5448f4
fix(web): pull request diff follows the file tree, with a hide-tests …
juliusmarminge Oct 29, 2026
8ff9ae1
fix(mobile): delivered messages no longer reappear at the bottom of l…
juliusmarminge Oct 29, 2026
d8f4980
ci(mobile): fork PRs now get the Native Change label (#26755)
juliusmarminge Oct 29, 2026
5eebf77
fix(claude): command approvals show the command, not Claude's descrip…
maria-rcks Oct 29, 2026
7b87466
docs: add nixpkgs installation instructions (#26750)
0x4bs3nt Oct 29, 2026
861a51a
feat(server,web,mobile): fall back when the default provider is out o…
maria-rcks Oct 29, 2026
783581d
fix(ci): fork PRs now resolve in workflow_run PR lookups (#26779)
juliusmarminge Oct 29, 2026
8298664
fix(server,cursor,opencode): refresh provider usage when a turn hits …
maria-rcks Oct 29, 2026
fe219c4
fix(web): keep tool groups collapsed after a usage-limit pause (#24937)
shivamhwp Oct 29, 2026
7f237e4
chore(sync): absorb upstream main through fe219c4de1
xxxxxxxxxxxxx Oct 29, 2026
f443c22
chore(lint): shorten fork config comments for no-low-value-comments
xxxxxxxxxxxxx Oct 29, 2026
51b3c52
fix(web): fork shortcuts stand down for threads behind Settings and U…
xxxxxxxxxxxxx Oct 29, 2026
0838852
fix(ci): agent context budget follows the fork's MCP tools
xxxxxxxxxxxxx Oct 29, 2026
5866383
fix(web): composer permissions chip no longer crashes outside the def…
xxxxxxxxxxxxx Oct 29, 2026
1f1b565
fix(web,desktop): re-home fork behavior the sync's split modules dropped
xxxxxxxxxxxxx Oct 29, 2026
b9241ac
fix(server): PR-review automations keep their PR routing and share on…
xxxxxxxxxxxxx Oct 29, 2026
8f55cb7
fix(sync): address the Oct 30 review on the upstream sync
xxxxxxxxxxxxx Oct 30, 2026
fa6bf57
fix(web): the composer keeps its chip carets, chip gap and flat shell…
xxxxxxxxxxxxx Oct 30, 2026
f682155
Merge branch 'custom' into claude/sync-2026-10-28
xxxxxxxxxxxxx Oct 30, 2026
16b448d
fix(server): a stored replay key no longer drops another repository's…
xxxxxxxxxxxxx Oct 30, 2026
9a449ef
chore(lint): drop the PR number from the model picker caret comment
xxxxxxxxxxxxx Oct 30, 2026
437f531
Merge branch 'custom' into claude/sync-2026-10-28
xxxxxxxxxxxxx Oct 31, 2026
c740366
chore(lint): bring #240 and #241 code under the sync's new lint rules
xxxxxxxxxxxxx Oct 31, 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.
13 changes: 13 additions & 0 deletions .agents/skills/test-t3-app/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,19 @@ Test with meaningful project and thread data. Read
[references/sqlite-fixtures.md](references/sqlite-fixtures.md) only when
inspecting or seeding SQLite. Stop the test server before direct fixture writes.

## Drive agent turns for free

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

## Use the Browser panel

Call `preview_status`, then `preview_open` if the Browser panel is
Expand Down
16 changes: 13 additions & 3 deletions .agents/skills/test-t3-mobile/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,21 @@ when inspecting or seeding SQLite. Stop the test server before fixture writes.
From the checkout being tested on the selected device host, run:

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

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

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

Start `vp run dev:client` from `apps/mobile`, or reuse a healthy Metro belonging
to this checkout. Open its printed development-client URL with AgentDevice
Expand Down
6 changes: 6 additions & 0 deletions .coderabbit.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,19 @@ export default defineConfig((ctx) => ({
path: "apps/web/src/**/*.{tsx,css}",
instructions: "Hold changed code to the rules in docs/internals/web-ui.md.",
},
{
path: "**/*.test.*",
instructions:
"Hold changed tests to the rules in docs/internals/testing.md. Request tests only as those rules allow.",
},
],
},
knowledge_base: {
code_guidelines: {
filePatterns: [
{ files: "docs/internals/effect-services.md", applyTo: "{apps,packages,infra}/**/*.ts" },
{ files: "docs/internals/web-ui.md", applyTo: "apps/web/src/**/*.{tsx,css}" },
{ files: "docs/internals/testing.md", applyTo: "{apps,packages,infra}/**/*.{ts,tsx}" },
],
},
},
Expand Down
4 changes: 2 additions & 2 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Dev container for T3 Code. Mirrors CI (ubuntu-24.04, Node 24, Rust stable)
// Dev container for T3 Code. Mirrors CI (ubuntu-24.04, Node 26, Rust stable)
// and the canonical setup in docs/operations/development.md: global `vp`, `vp i`.
// Contributor doc: docs/internals/devcontainer.md
{
Expand All @@ -8,7 +8,7 @@
// nodeGypDependencies (default true) brings python3/make/g++, which Linux
// needs for node-pty's node-gyp fallback (its prebuilds are mac/win only).
"ghcr.io/devcontainers/features/node:2": {
"version": "24"
"version": "26"
},
// native/resource-monitor (edition 2024, needs stable >= 1.85). The server
// degrades gracefully without the binary, but CI checks cargo fmt + test.
Expand Down
101 changes: 45 additions & 56 deletions .fork/customizations.yaml

Large diffs are not rendered by default.

25 changes: 21 additions & 4 deletions .fork/lint-deferred.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,34 @@ export const DEFERRED_LINT_SCOPE = [
// The fork owns this file's Sidebar() body, which still memoizes by hand.
"apps/web/src/components/Sidebar.tsx",
"apps/web/src/components/sidebar/SidebarChrome.tsx",
// Fork-owned code outside apps/web/src, deferred alongside it since the 2026-10-28 sync.
".fork/**",
"apps/web/fork/**",
"apps/desktop/src/fork/**",
"apps/desktop/src/preview/DesignSource*.ts",
"apps/desktop/src/app/Desktop*Fork*.test.ts",
"apps/server/src/**/fork*.ts",
"apps/server/src/git/resolveBootstrapThreadBranch.ts",
"apps/server/src/scheduledTasks/githubPrTrigger.ts",
"packages/contracts/src/scheduledTaskRuns.ts",
"packages/shared/src/forkDesignProps.ts",
];

/** `[oxlint plugin/rule, baseline]` — the baseline is the most warnings allowed. */
export const DEFERRED_LINT_RULES = [
["react/exhaustive-effect-dependencies", 3],
["react/exhaustive-effect-dependencies", 4],
["react/memo-dependencies", 12],
["react/refs", 18],
["react/set-state-in-effect", 4],
["react/refs", 15],
["react/set-state-in-effect", 5],
["t3code/no-manual-memo", 131],
["t3code/no-outset-state-indicators", 12],
// Section dividers in the vendored design-mode engine, kept verbatim for re-syncs.
["t3code/no-low-value-comments", 6],
["t3code/no-low-value-comments", 876],
["t3code/no-raw-resize-observer", 4],
// Upstream rules new in the 2026-10-28 sync; fork code predates them.
["react/preserve-manual-memoization", 2],
["t3code/no-em-dash-copy", 87],
["t3code/no-unreasoned-state-sync", 39],
["t3code/require-disposable-render", 16],
["t3code/no-frame-waits-in-browser-tests", 1],
];
2 changes: 1 addition & 1 deletion .fork/notes/FORK-DATA-ISOLATION-HANDOFF.md
Original file line number Diff line number Diff line change
Expand Up @@ -350,7 +350,7 @@ test as a follow-up.

> **Point-in-time snapshot (2026-07-26, pre-fix).** Cleanup owed on this
> machine once a fixed build is verified: delete `/Applications/T3 Code
Fork.app` (v0.1.1), delete the orphaned `~/.t3/userdata-fork`, and note that
> Fork.app` (v0.1.1), delete the orphaned `~/.t3/userdata-fork`, and note that
> `~/.t3/caches/*.json` were rewritten and one `auth_sessions` row was
> inserted per §2.2 (both inert). The backup can be removed once v0.1.2 is
> verified by launch.
Expand Down
2 changes: 1 addition & 1 deletion .fork/notes/FORK-LINT-GUARD-HANDOFF.md
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ Recorded so they are not silently re-litigated:

1. **CI behaviour.** Everything in §2 ran on macOS locally. The guard has never run in an
Actions runner. `vp lint` with an explicit path list under `setup-vp` with `run-install:
true` is untested there.
true` is untested there.

2. **Path list length.** 27 lintable paths today. Whether a growing list hits an argv limit,
or whether Oxlint dedupes an overlapping dir + file argument sanely, is untested. Passing
Expand Down
130 changes: 116 additions & 14 deletions .github/actions/setup-ci-deps/action.yml
Original file line number Diff line number Diff line change
@@ -1,51 +1,153 @@
name: Setup CI dependencies
description: Install Vite+ and the workspace dependencies from cache.
inputs:
task-cache-read-token:
description: Read-only credential for the private maintainer task cache
required: false
default: ""
install:
description: Set to "false" to set up Vite+ only, with no pnpm store or install
required: false
default: "true"
install-args:
description: Arguments for `vp install`, such as filters. Empty installs the whole workspace.
required: false
default: ""
runs:
using: composite
steps:
# setup-vp reuses an installed exact version, so restoring its home skips the
# installer download on every job.
# ~/.vite-plus holds vp, the Node.js runtime, and pnpm. A cache entry never
# updates, so the key names all three versions; otherwise a pnpm or Node.js
# bump makes every job download them from npm again.
- name: Resolve Vite+ version
id: vp
shell: bash
run: |
echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT"
echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT"
echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT"

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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