Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
260 commits
Select commit Hold shift + click to select a range
354f6c8
fix(mobile): pull request rows refresh their diff stats after a new p…
juliusmarminge Oct 27, 2026
daa720a
fix(workflows): keep completed workflows reachable (#24587)
Bil0000 Oct 27, 2026
10a82e8
fix(web): devices agents open in background threads now show up (#25714)
juliusmarminge Oct 27, 2026
71ba6b3
refactor(web): optimistic chat messages leave without a timer (#25710)
juliusmarminge Oct 27, 2026
323d961
feat(acp): ACP session notices show as notices, not reply text (#25704)
juliusmarminge Oct 27, 2026
5127de8
fix(mobile): scale and align thread list icons (#25668)
PixPMusic Oct 27, 2026
3b48b52
refactor(mobile): new-task branch defaults are derived, not written a…
juliusmarminge Oct 27, 2026
6df241d
feat(provider): add Vercel fx as a provider (#18277)
agadzik Oct 27, 2026
417bc79
fix(mobile): usage chart bars round at the top instead of the bottom …
adityavardhansharma Oct 27, 2026
d145077
fix(mobile): a draft route's branch checkout runs once, even across a…
juliusmarminge Oct 27, 2026
65b4a69
fix(web): thread details popover closes when the card moves inline (#…
juliusmarminge Oct 27, 2026
f6a9315
refactor(web): diff and file reveals are requests, and workspace edit…
juliusmarminge Oct 27, 2026
3425671
feat(web): Add provider leads with first-class providers (#25753)
juliusmarminge Oct 27, 2026
5811d5c
refactor(mobile): app-lifetime services install once, and the usage w…
juliusmarminge Oct 27, 2026
8e86eb2
fix(client-runtime): searches and refreshes no longer wait on an unre…
juliusmarminge Oct 27, 2026
5d91ab1
refactor(web): command palette state lives in a store, git and branch…
juliusmarminge Oct 27, 2026
e0d068c
fix(mobile): restore Android chat content corners (#23989)
PixPMusic Oct 27, 2026
d2c4403
fix(server): agents show trends and comparisons as inline charts agai…
t3dotgg Oct 27, 2026
689763a
fix(mobile): isolate file tree state by workspace (#24270)
juliusmarminge Oct 27, 2026
83838af
fix(mobile): finished subagents stay reachable from the Agents pill (…
saphid Oct 27, 2026
e689dad
fix(mobile): keep segmented controls readable on cards and screens (#…
PixPMusic Oct 27, 2026
b1619f3
fix(web): cancelling update everything no longer flashes the update b…
t3dotgg Oct 27, 2026
44dae85
fix(mobile): lists end at the search field, and HTML previews start b…
juliusmarminge Oct 27, 2026
850d1e7
fix(provider-cursor): bump @cursor/sdk to 1.0.38 so long-context tier…
gcrft123 Oct 27, 2026
c294d63
fix(server): Sonnet also answers trend and comparison data with inlin…
t3dotgg Oct 27, 2026
fe867b8
fix(server): Claude MCP timeouts preserve the native session (#25660)
juliusmarminge Oct 27, 2026
32bf48f
fix(server): preserve settled runs during delegated acknowledgements …
juliusmarminge Oct 27, 2026
5522180
fix(mobile): align the iPad composer with workspace navigation (#24942)
PixPMusic Oct 27, 2026
a9b513b
chore(evals): store eval cases as .ndjson so review tools skip them (…
juliusmarminge Oct 27, 2026
394929a
test(server): CI fails when agent context grows past main (#25785)
t3dotgg Oct 27, 2026
bea2e9d
refactor(mobile): theme preferences reach the native runtime without …
juliusmarminge Oct 27, 2026
2ad853a
refactor(mobile): the share inbox is a module store, presented from n…
juliusmarminge Oct 27, 2026
6f6c6c1
refactor(web): drop the unreachable paint-only thread timeline path (…
juliusmarminge Oct 27, 2026
401b017
chore(release): prepare v0.1.3
t3-code-bot[bot] Oct 27, 2026
0b02b21
refactor(mobile): notifications, quick actions and Connect onboarding…
juliusmarminge Oct 27, 2026
278fdce
test(server): data regression test now fails when recent fetch saving…
t3dotgg Oct 27, 2026
bc81367
fix(server): all MCP tools now send compact schemas, cutting tool con…
t3dotgg Oct 27, 2026
96fc7b9
refactor(web): the new design is the only design, with no toggle (#25…
t3dotgg Oct 27, 2026
c976a09
feat(mobile): add a "Use last project" preference for new threads (#2…
PixPMusic Oct 27, 2026
b84e121
fix(mobile): round shared Android sheets and Chat settings (#18547)
PixPMusic Oct 27, 2026
6f0f1a9
feat(mobile): split wide Android Settings into two panes (#24298)
PixPMusic Oct 27, 2026
70eccd4
fix(web): keep right panel maximize available in narrow windows (#25389)
PixPMusic Oct 27, 2026
6bbb2d8
fix(server): Macs without Android no longer show avdmanager discovery…
t3dotgg Oct 27, 2026
2202787
fix(web): onboarding import no longer hangs when the project never ar…
juliusmarminge Oct 27, 2026
1a4f3c4
fix(mobile): Windows image paths and non-ASCII file links open like d…
t3dotgg Oct 27, 2026
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 (…
stbenjam 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
3cc9c7b
Merge commit '5211acfe95a0c6d82a60e2524b5e46b47fe67a3e' into fix/time…
fireboltdude1357 Oct 28, 2026
416cd61
test(server): upstream's new SQL window edits commit a thread event
fireboltdude1357 Oct 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
13 changes: 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
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
86 changes: 75 additions & 11 deletions .github/actions/setup-ci-deps/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,14 @@ inputs:
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:
Expand All @@ -19,10 +27,11 @@ runs:
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-v2-${{ runner.os }}-${{ runner.arch }}-${{ steps.vp.outputs.version }}-node${{ steps.vp.outputs.node }}-${{ steps.vp.outputs.pnpm }}
Expand All @@ -38,38 +47,93 @@ runs:
echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH"
"$HOME/.vite-plus/bin/vp" env use "${{ steps.vp.outputs.node }}"

# vp gives each Node.js download attempt 10 minutes by default, so one
# stalled stream holds the job that long. It retries 3 times and resumes
# partial bytes, so a shorter limit costs a slow download only a retry.
- name: Setup Vite+
if: steps.vp_cache.outputs.cache-hit != 'true'
uses: voidzero-dev/setup-vp@v1
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: >-
Expand Down
4 changes: 2 additions & 2 deletions .github/triage/PLAYBOOK.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ provided alongside this playbook. Everything machine-specific lives there, not h

## 1. Ask what went wrong

Your first message to the user: ask them to describe what went wrong, in their own
words. Ask them to paste screenshots directly into this session if they have any.
Unless the user already described it, your first message asks what went wrong, in
their own words. Ask them to paste screenshots directly into this session if they have any.
Ask follow-up questions when the description is vague. Good repro steps are the most
valuable thing you can extract from this conversation.

Expand Down
55 changes: 55 additions & 0 deletions .github/workflows/agent-context-budget.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: Agent Context Budget

# Fails when a PR raises a value in agentContextBudget.json above main's. AgentContextBudget.test.ts
# keeps that file equal to the measured context, so the context cannot grow by editing the file.
# To accept growth on purpose, a maintainer adds the agent-context-increase label.
on:
pull_request:
types: [opened, synchronize, reopened, labeled, unlabeled]

permissions:
contents: read

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

jobs:
budget:
name: Agent context budget
runs-on: ubuntu-24.04
timeout-minutes: 5
env:
BUDGET: apps/server/src/provider/agentContextBudget.json
ALLOW_INCREASE: ${{ contains(github.event.pull_request.labels.*.name, 'agent-context-increase') }}
steps:
- name: Checkout
uses: actions/checkout@v6
with:
sparse-checkout: apps/server/src/provider/agentContextBudget.json
sparse-checkout-cone-mode: false

- name: Compare with main
run: |
git fetch --quiet --depth=1 origin main
if ! git cat-file -e "FETCH_HEAD:$BUDGET" 2>/dev/null; then
echo "main has no agent context budget yet."
exit 0
fi
git show "FETCH_HEAD:$BUDGET" > "$RUNNER_TEMP/main.json"
grown=$(jq -r --slurpfile main "$RUNNER_TEMP/main.json" '
to_entries[]
| select($main[0][.key] != null and .value > $main[0][.key])
| "\(.key): \($main[0][.key]) -> \(.value) (+\(.value - $main[0][.key]))"
' "$BUDGET")
if [ -z "$grown" ]; then
echo "Agent context is not larger than main."
exit 0
fi
printf 'Agent context grew compared to main:\n%s\n' "$grown"
if [ "$ALLOW_INCREASE" = "true" ]; then
echo "Accepted by the agent-context-increase label."
exit 0
fi
echo "::error file=$BUDGET::Agent context grew compared to main. Cut the added text, or ask a maintainer to add the agent-context-increase label."
exit 1
20 changes: 9 additions & 11 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -225,16 +225,6 @@ jobs:
!/apps/mobile/modules/t3-terminal/Vendor/**/*.a
sparse-checkout-cone-mode: false

# Blacksmith boots GitHub's Ubuntu runner image (gcc is usually present),
# but ACP process-tree live tests compile a small pthread fixture with `cc`
# and soft-skip when it is missing. Install build-essential so that path
# always runs in CI instead of silently no-oping.
- name: Install C toolchain for process-tree fixtures
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends build-essential
command -v cc

- uses: ./.github/actions/setup-apt-mirrors

# The desktop tests compile the browser secret helper. The install runs in
Expand Down Expand Up @@ -344,6 +334,12 @@ jobs:
- name: Test
run: vp run --filter @t3tools/web test

# Browser tests run source modules; this boots the production chunk graph.
- name: Boot the built web client
run: |
vp run --filter @t3tools/web build
node apps/web/scripts/verify-built-boot.ts

# apps/server sets `fileParallelism: false`, so its test files run strictly
# one at a time. Sharding spreads them over separate runners instead of
# separate workers, so no two server test files ever share a machine and the
Expand All @@ -358,7 +354,9 @@ jobs:
id-token: write
name: Test Server ${{ matrix.shard }}
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 10
# Shards take 2-5 minutes. When the shared task cache throttles reads, each
# failed fetch stalls vp for 15-90s, which pushed shards past 10 minutes.
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/deploy-relay.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,11 @@ on:
branches:
- main
# Redeploys main after a variable or secret change. Alchemy redeploys the
# Worker when a value it reads changes, so force is rarely needed, and it
# replaces the Postgres runtime role (alchemy-run/alchemy#1832).
# Worker when a value it reads changes, so force is rarely needed.
workflow_dispatch:
inputs:
force:
description: Redeploy every resource, including ones with no detected changes. Replaces the Postgres runtime role.
description: Redeploy every resource, including ones with no detected changes.
type: boolean
default: false

Expand Down Expand Up @@ -81,6 +80,7 @@ jobs:
CLERK_SECRET_KEY: ${{ secrets.CLERK_SECRET_KEY }}
APNS_PRIVATE_KEY: ${{ secrets.APNS_PRIVATE_KEY }}
FCM_SERVICE_ACCOUNT: ${{ secrets.FCM_SERVICE_ACCOUNT }}
T3CHAT_LINK_SECRET: ${{ secrets.T3CHAT_LINK_SECRET }}

- name: Publish relay deploy commit status
uses: actions/github-script@v8
Expand Down
19 changes: 19 additions & 0 deletions .github/workflows/mobile-eas-production.yml
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,7 @@ jobs:
--environment production \
--platform ${{ inputs.platform }} \
--message "$OTA_MESSAGE" \
--emit-metadata \
--non-interactive

# Reconcile each version separately because the major is in the fingerprint.
Expand Down Expand Up @@ -313,8 +314,11 @@ jobs:
--environment production \
--platform "$platform" \
--message "$message" \
--emit-metadata \
--non-interactive; then
echo ":white_check_mark: $platform/$profile: OTA published to production (fingerprint \`$hash\`)" >> "$GITHUB_STEP_SUMMARY"
# The next target's export replaces dist; keep this one for the map upload.
rm -rf "dist-$platform-$profile" && mv dist "dist-$platform-$profile"
else
failed=1
echo ":x: $platform/$profile: OTA publish failed (fingerprint \`$hash\`)" >> "$GITHUB_STEP_SUMMARY"
Expand Down Expand Up @@ -354,3 +358,18 @@ jobs:
fi
done
exit "$failed"

# Lets the relay symbolicate crash stacks from the updates published
# above. A step of its own so the R2 credentials reach only this script,
# not `eas update` and the dependencies it runs. Never fails the job.
- name: Upload OTA source maps
if: ${{ !cancelled() && steps.expo-token.outputs.present == 'true' }}
working-directory: apps/mobile
env:
MOBILE_SOURCEMAPS_R2: ${{ secrets.MOBILE_SOURCEMAPS_R2 }}
run: |
for dir in dist dist-*; do
if [ -f "$dir/eas-update-metadata.json" ]; then
node scripts/upload-sourcemaps.mts ota "$dir"
fi
done
2 changes: 2 additions & 0 deletions .github/workflows/relay-preview.yml
Original file line number Diff line number Diff line change
Expand Up @@ -79,3 +79,5 @@ jobs:
PLANETSCALE_API_TOKEN: ${{ secrets.PLANETSCALE_API_TOKEN }}
AXIOM_TOKEN: ${{ secrets.AXIOM_TOKEN }}
CLERK_SECRET_KEY: ${{ secrets.CLERK_SECRET_KEY }}
# Unset by default, so previews keep the T3 Chat link off.
T3CHAT_LINK_SECRET: ${{ secrets.T3CHAT_LINK_SECRET }}
Loading
Loading