Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
258 commits
Select commit Hold shift + click to select a range
348f217
fix(web,mobile): muse code uses meta's official blue logo (#19562)
maria-rcks Oct 14, 2026
aa81d12
fix(desktop): import CA trust variables from the login shell (#19604)
maria-rcks Oct 14, 2026
78f4b69
fix(server): preview copy only forwards text from the viewer's copy k…
maria-rcks Oct 14, 2026
f87dd14
fix(muse): Supervised threads ask before commands again (#19558)
maria-rcks Oct 14, 2026
22af947
fix(server): restarts no longer stall on old subagent result deliveri…
t3dotgg Oct 14, 2026
f4df794
fix(clients): a thread comes back when its subagent needs approval (#…
t3dotgg Oct 14, 2026
52ffe0c
fix(usage): cold usage scans no longer stall the server (#19446)
t3dotgg Oct 14, 2026
39aeaf4
fix(server): "Always allow this session" stops Codex asking for every…
t3dotgg Oct 14, 2026
7bdfed9
fix(web): keep vertical cursor stops outside styled markers (#19651)
Yash-Singh1 Oct 14, 2026
5a4e998
fix(web): mermaid code toggle stays in place when switching views (#1…
maria-rcks Oct 14, 2026
40a7908
fix(server): Reveal in File Explorer and browser launches work on Win…
t3dotgg Oct 14, 2026
742c229
fix(server): GitHub App tokens can merge and use other write actions …
shivamhwp Oct 14, 2026
ab3a3cd
perf(server): commands on busy threads stop decoding thousands of fin…
t3dotgg Oct 15, 2026
ec1313c
fix(server): use workspace-scoped Bitbucket permissions API (#10984)
RealDoc06 Oct 15, 2026
55dfc5f
fix(composer): read dropped threads across environments (#15210)
Bil0000 Oct 15, 2026
755accf
test(web): remove duplicate change request parser tests (#13591)
t3-code[bot] Oct 15, 2026
924fb0c
fix(server): a delegated task's question ends the parent's blocking w…
flamboh Oct 15, 2026
fdacb3a
fix(server): a delegated task's question now wakes its parent agent (…
flamboh Oct 15, 2026
c814e51
fix(server): a cancelled delegated task no longer shows its child's q…
flamboh Oct 15, 2026
21bedfb
feat(storage): clean up settled thread worktrees (#15208)
Bil0000 Oct 15, 2026
e536bfd
feat(web,mobile): waiting status shows a dot-dashed icon and a timer …
maria-rcks Oct 15, 2026
339179f
feat(pr): delete branches after merge or close (#19257)
Bil0000 Oct 15, 2026
2d31acb
fix(web): the sidebar no longer keeps old renders alive (#19852)
t3dotgg Oct 15, 2026
313f23e
fix(web): update everything no longer waits on slow servers, and show…
t3dotgg Oct 15, 2026
45b5993
fix(web): text generation no longer falls back to the expensive flags…
t3dotgg Oct 15, 2026
cd34df5
feat(web): setting to open pull request links on GitHub (#19719)
t3dotgg Oct 15, 2026
00cdceb
fix(web): middle-click opens pull requests in the browser, like cmd+c…
t3dotgg Oct 15, 2026
0e1431f
fix(web): the chat view and composer no longer keep old renders alive…
t3dotgg Oct 15, 2026
0b68a4a
fix(server): steering no longer ends running subagents (#19210)
shivamhwp Oct 15, 2026
e6bbfdb
fix(web,mobile): sent queued messages say "from queue", not "queued" …
shivamhwp Oct 15, 2026
42da166
fix(server): OTLP exports say which machine and build they came from …
t3dotgg Oct 15, 2026
98bc998
fix(prs): bound refreshes by each tracker read (#19403)
Bil0000 Oct 15, 2026
d09a9ea
fix(mobile): new threads no longer get stuck on Starting (#15870)
nekohasekai Oct 15, 2026
38d9760
fix(mobile): agent-spawned threads can be mentioned from the @ picker…
lnieuwenhuis Oct 15, 2026
d2f2b7c
fix(mobile): pull request lists fill the available scroll viewport (#…
camchis Oct 15, 2026
2d94372
fix(server): Cursor threads in Auto use Cursor's Auto-review (#19712)
owenferg Oct 15, 2026
52a769d
fix(web): text selection keeps going under the turn minimap (#16748)
robertnisipeanu Oct 15, 2026
895354e
fix(server): Antigravity installs on Windows ARM (#18472)
mweinbach Oct 15, 2026
6e5322b
perf(server): cut fff-node FFI marshaling overhead on large workspace…
mweinbach Oct 15, 2026
cde9cae
perf(server): replace Windows PowerShell port polling with netstat (#…
mweinbach Oct 15, 2026
364f508
fix(server): Windows Codex install uses system tar and retries rename…
mweinbach Oct 15, 2026
76cb251
fix(providers): fall back to windows-x86_64 ACP binaries on Windows o…
mweinbach Oct 15, 2026
e77a48e
fix(server): fail runs whose provider stream ends without a terminal …
Alb11747 Oct 15, 2026
3ff452b
fix(server): a dropped HTTP/2 connection no longer crashes the server…
Mnigos Oct 15, 2026
97f717a
fix(server): Stop re-probing hosting CLIs for unrecognized hosts (#19…
mwolson Oct 15, 2026
26fffe5
fix(mobile): Android nested list markers no longer overlap their text…
juliusmarminge Oct 15, 2026
c079503
fix(mobile): release iOS audio session after video playback (#18539)
juliusmarminge Oct 15, 2026
4036e18
fix(web): keep wrapped split diffs from jumping while scrolling (#20022)
juliusmarminge Oct 15, 2026
ede3f2d
fix(web): model picker search lists newest models first (#18494)
c-ehrlich Oct 15, 2026
559c4b1
fix(acp): one malformed session update no longer ends the session (#2…
juliusmarminge Oct 15, 2026
f798cb2
perf(web): HTML renders show a layout skeleton and reuse cached pages…
maria-rcks Oct 15, 2026
81493ef
chore: change product branding from Alpha to Beta (#20032)
juliusmarminge Oct 15, 2026
17e1087
feat(web): open html render images in the image viewer (#20036)
maria-rcks Oct 15, 2026
c3a36af
refactor(github): all GitHub GraphQL on effect/graphql, one request p…
juliusmarminge Oct 15, 2026
b089f95
refactor(mobile): share settings action rows (#18529)
juliusmarminge Oct 15, 2026
2bcc5cc
fix(mobile): standardize shared button states and adoption (#18530)
juliusmarminge Oct 15, 2026
e64cee0
refactor(mobile): adopt shared controls and add component catalog (#1…
juliusmarminge Oct 15, 2026
df83cfa
feat(mobile): map native hosts to the app theme (#18567)
juliusmarminge Oct 15, 2026
e028a08
refactor(mobile): share theme mapping across Android controls (#19217)
juliusmarminge Oct 15, 2026
a2d4a87
refactor(mobile): expose shared icon button and search field APIs (#1…
juliusmarminge Oct 15, 2026
d5ae09a
refactor(mobile): expose native menus through a shared Menu API (#19265)
juliusmarminge Oct 15, 2026
8d2e919
refactor(mobile): centralize dialog and sheet APIs (#19266)
juliusmarminge Oct 15, 2026
791feeb
refactor(mobile): keep segmented controls native (#18532)
juliusmarminge Oct 15, 2026
e846ad5
refactor(mobile): expose app bar toolbar and FAB APIs (#19951)
juliusmarminge Oct 15, 2026
487423a
feat(mobile): share actionable toasts and native progress (#19952)
juliusmarminge Oct 15, 2026
68eb28d
refactor(mobile): adopt shared text shape and motion tokens (#19953)
juliusmarminge Oct 15, 2026
3ff9149
feat(mobile): expose themed native Android app bars (#19994)
juliusmarminge Oct 15, 2026
ac57e62
refactor(mobile): adopt native Android screen headers (#19995)
juliusmarminge Oct 15, 2026
4b8fb2e
refactor(mobile): finish shared control token adoption (#19996)
juliusmarminge Oct 15, 2026
505ccfd
fix(mobile): route alerts through the themed dialog presenter (#19997)
juliusmarminge Oct 15, 2026
d88f515
refactor(mobile): adopt shared alerts in settings and connections (#1…
juliusmarminge Oct 15, 2026
e3438b8
refactor(mobile): adopt shared alerts in thread and PR screens (#19999)
juliusmarminge Oct 15, 2026
3b43e3f
refactor(mobile): finish shared alert adoption (#20000)
juliusmarminge Oct 15, 2026
f328079
refactor(mobile): adopt shared loading indicators across screens (#20…
juliusmarminge Oct 15, 2026
fbbd459
refactor(mobile): unify navigation and floating toolbar APIs (#20002)
juliusmarminge Oct 15, 2026
79b3043
refactor(mobile): use native iOS sliders (#20016)
juliusmarminge Oct 15, 2026
9fbc753
refactor(mobile): use shared Menu for markdown long presses (#20019)
juliusmarminge Oct 15, 2026
86f4a74
refactor(mobile): organize design system and shared components (#20043)
juliusmarminge Oct 15, 2026
d8798dd
fix(shell): normalize Windows PATH keys in copied environments (#19965)
juliusmarminge Oct 15, 2026
a175e06
perf(server): check Android SDK locations before PATH (#19960)
juliusmarminge Oct 15, 2026
9a067b2
perf(server): skip unchanged device host refreshes (#19961)
juliusmarminge Oct 15, 2026
eef0e4e
perf(server): skip Windows probes for desktop-prepared environments (…
juliusmarminge Oct 15, 2026
9d26a79
chore(release): prepare v0.1.0
t3-code[bot] Oct 15, 2026
4d01315
test(server): decouple compatibility fixtures from release version (#…
juliusmarminge Oct 15, 2026
6c84239
fix(client-runtime): hide pending context handoff on threads with no …
maria-rcks Oct 15, 2026
2d743c2
ci: skip jobs a pull request cannot affect (#19587)
maria-rcks Oct 15, 2026
9317661
ci: cache Chromium for server test shards (#19632)
maria-rcks Oct 15, 2026
3697644
ci: run typecheck inside the Build job (#19633)
maria-rcks Oct 15, 2026
f6ad94d
ci: cache pnpm packages on Blacksmith sticky disks (#19634)
maria-rcks Oct 15, 2026
727b4e7
ci: cut per-job setup time (#20044)
maria-rcks Oct 15, 2026
6d73370
fix(web): settings stay compact with many connected machines (#19744)
maria-rcks Oct 15, 2026
b8e829d
fix(dev): freeze the worktree setup lockfile (#19747)
maria-rcks Oct 15, 2026
e733a40
fix(server): clean up worktrees shared by subagents (#19748)
maria-rcks Oct 15, 2026
2f0a4eb
fix(mobile): separate TestFlight and store release versions (#20060)
juliusmarminge Oct 15, 2026
fa1184d
fix(server): report orphaned managed worktrees (#19749)
maria-rcks Oct 15, 2026
5752253
fix(server): compact superseded history in the background (#19435)
juliusmarminge Oct 16, 2026
2b6611c
feat(server): t3 doctor reclaims database space (#19436)
juliusmarminge Oct 16, 2026
65d390f
feat: suggest t3 doctor when the database has space to reclaim (#19437)
juliusmarminge Oct 16, 2026
d109695
fix(web): device setup lets you through with only a remote device hos…
juliusmarminge Oct 16, 2026
11b00af
chore(mobile): remove the legacy v2 preview channel (#20084)
juliusmarminge Oct 16, 2026
aa35fb3
fix(web): folder breadcrumbs navigate to parent folders (#15045)
scratchyone Oct 16, 2026
a5d9792
fix: command output streams live while it runs (#15094)
scratchyone Oct 16, 2026
d2d59fa
fix(mobile): code blocks get a wrap button, long ordered lists keep t…
juliusmarminge Oct 16, 2026
f459165
chore(deps): update Expo and Clerk SDKs (#20067)
juliusmarminge Oct 16, 2026
4e85a93
fix(server): subagents pick up their parent's renamed worktree branch…
maria-rcks Oct 16, 2026
83d6583
fix(mobile): make test builds optional and preserve APK releases (#20…
juliusmarminge Oct 16, 2026
1550058
fix(server): resumed Claude subagents keep updating their own thread …
juliusmarminge Oct 16, 2026
bb4e4e7
fix(desktop): agent typing in a preview tab no longer lands in the ap…
juliusmarminge Oct 16, 2026
d513997
perf(web): virtualize a thread's linked pull requests (#20107)
juliusmarminge Oct 16, 2026
b67ac65
feat(web): drag a linked pull request into the composer as a context …
juliusmarminge Oct 16, 2026
2dd87a4
perf(web): run the React Compiler natively instead of through Babel (…
juliusmarminge Oct 16, 2026
e2b929f
perf(web): saving the thread list cache no longer re-encodes every th…
bompus Oct 16, 2026
2a7bd16
fix(provider-grok): Grok health checks no longer start Grok's updater…
bompus Oct 16, 2026
f1e0a4d
test(server): promoting a queued message into a running Claude turn s…
juliusmarminge Oct 16, 2026
ccca13d
perf(server): expanding a wide ignored folder no longer classifies ev…
juliusmarminge Oct 16, 2026
e74f477
fix(mobile): worktree setup clock pauses on hidden thread screens (#2…
juliusmarminge Oct 16, 2026
3962ae8
perf(desktop): picture-in-picture stops re-encoding an unchanged page…
juliusmarminge Oct 16, 2026
dcdb034
fix(mobile): a table right under a line of text renders as a table (#…
shivamhwp Oct 16, 2026
9b150f7
Add new GitHub user 'bompus' to VOUCHED.td
juliusmarminge Oct 16, 2026
b47746b
perf(web): load project icons as one chunk instead of ~1,700 (#20147)
juliusmarminge Oct 16, 2026
802b5d7
feat(mobile): use shared custom segmented controls (#20116)
juliusmarminge Oct 16, 2026
ba35822
fix(mobile): extend iPad sidebar background behind header (#20149)
juliusmarminge Oct 16, 2026
86534db
refactor: prune narration and history comments (#19559)
maria-rcks Oct 16, 2026
09c5e7a
style(mobile): flatten segmented control surfaces (#20163)
juliusmarminge Oct 16, 2026
c0de6bd
fix(cli): t3 triage and prompts work from the desktop app's t3 on Win…
juliusmarminge Oct 16, 2026
d35882e
fix(ios): show a sidebar toggle on the unfolded iPhone Duo in portrai…
PixPMusic Oct 16, 2026
6b450c7
bye npm (#20148)
juliusmarminge Oct 16, 2026
2577baf
fix(mobile): publish each Android beta only once
juliusmarminge Oct 16, 2026
a9c9c7c
fix(shared): PRs built on the same PR stay in one stack under their p…
shivamhwp Oct 16, 2026
e3b35d1
fix(web): keep running status banners on one line (#20194)
Yash-Singh1 Oct 16, 2026
cfafb4b
fix(codex): a slow but healthy Codex no longer shows as Unavailable (…
shivamhwp Oct 16, 2026
e58a485
feat(mobile): use themed native iOS segmented controls (#20327)
juliusmarminge Oct 16, 2026
a54a44c
fix(orchestration): queue follow-ups sent while a thread compacts (#2…
maria-rcks Oct 16, 2026
a3e8cf6
chore(deps): update Clerk SDKs and reconcile native patch (#20359)
juliusmarminge Oct 16, 2026
3b99fb2
fix(mobile): the app builds and launches again after the Expo update …
voida6 Oct 16, 2026
ac251a2
chore(deps): update Expo SDK 58 packages and trim patches (#20389)
juliusmarminge Oct 16, 2026
67bca6c
fix(mobile): Android fingerprint covers Expo native modules again (#2…
juliusmarminge Oct 16, 2026
543af77
fix(android): keep the split view and menus off the fold crease (#19988)
PixPMusic Oct 16, 2026
86ac545
fix(android): fold tracking starts late and hinge retargets keep the …
PixPMusic Oct 16, 2026
55a8234
Add mweinbach to the VOUCHED team
juliusmarminge Oct 16, 2026
89ce030
refactor(mobile): add a device type flag for iPad and iPhone Duo UI (…
mweinbach Oct 16, 2026
47d98ac
fix(server): Windows terminal kill no longer waits on timeouts (#18519)
mweinbach Oct 16, 2026
f8ec357
fix(mobile): sidebar toggle works on iPad and iPhone Duo (#20406)
mweinbach Oct 16, 2026
6cecd22
chore(mobile): use upstream Enriched Markdown's wrap toggle and list …
juliusmarminge Oct 16, 2026
51f7382
fix(web): restore mobile app store links in settings (#20422)
juliusmarminge Oct 17, 2026
043bc03
refactor(web): move pending approvals and questions out of ChatView (…
juliusmarminge Oct 17, 2026
e00cda2
refactor(web): move the persistent terminal drawer and panel out of C…
juliusmarminge Oct 17, 2026
d109aa7
refactor(web): open and close thread terminals through one hook (#20289)
juliusmarminge Oct 17, 2026
48a1604
chore(lint): fail lint when the React Compiler skips a listed file (#…
juliusmarminge Oct 17, 2026
f7916ad
refactor(web): let the React Compiler compile usePendingThreadRequest…
juliusmarminge Oct 17, 2026
65de56e
refactor(web): move the /usage-limits panel state out of ChatView (#2…
juliusmarminge Oct 17, 2026
4a7083f
refactor(web): move queued-message editing out of ChatView (#20304)
juliusmarminge Oct 17, 2026
9302235
refactor(web): move the thread's linked pull request out of ChatView …
juliusmarminge Oct 17, 2026
4283e23
refactor(web): move proactive right-panel opening out of ChatView (#2…
juliusmarminge Oct 17, 2026
a5539a6
refactor(web): move agent-opened browser and device surfacing out of …
juliusmarminge Oct 17, 2026
c07eddf
refactor(web): move right panel surface closing out of ChatView (#20315)
juliusmarminge Oct 17, 2026
d3de2c1
refactor(web): move worktree setup progress out of ChatView (#20316)
juliusmarminge Oct 17, 2026
cbee9c9
refactor(web): split two self-contained phases out of onSend (#20321)
juliusmarminge Oct 17, 2026
9ef9274
fix(web): stop crashing the native React Compiler on ChatView (#20340)
juliusmarminge Oct 17, 2026
0e95bab
perf(web): let the React Compiler compile ChatView (#20379)
juliusmarminge Oct 17, 2026
0912b24
perf(web): stop re-rendering the conversation on streamed tokens, typ…
juliusmarminge Oct 17, 2026
0c48f62
perf(client): provider status pushes keep unchanged providers identic…
juliusmarminge Oct 17, 2026
0543377
refactor(web): move ChatView's keyboard shortcuts into a command map …
juliusmarminge Oct 17, 2026
2de98f0
perf(web): the sidebar compiles with no manual memoization (#20396)
juliusmarminge Oct 17, 2026
e925fe7
perf(web): ChatComposer compiles with no manual memoization (#20397)
juliusmarminge Oct 17, 2026
bf990c6
refactor(web): move project script editing out of ChatView (#20401)
juliusmarminge Oct 17, 2026
d913b61
perf(web): the React Compiler compiles MessagesTimeline (#20402)
juliusmarminge Oct 17, 2026
a09394e
perf(web): ChatView joins the strict React Compiler list (#20418)
juliusmarminge Oct 17, 2026
f5cb328
refactor(web): move the right panel's surface switch out of ChatView …
juliusmarminge Oct 17, 2026
52cd9c5
fix(web): a draft closed mid machine switch no longer rewrites that d…
juliusmarminge Oct 17, 2026
33aa461
fix(web): every reconnect gets its own grace period before the unavai…
juliusmarminge Oct 17, 2026
8039452
rc/01 tooltips (#20448)
juliusmarminge Oct 17, 2026
777cd68
perf(web): the composer editor compiles with the React Compiler (#20450)
juliusmarminge Oct 17, 2026
fd3420f
perf(web): the server browser surface compiles with the React Compile…
juliusmarminge Oct 17, 2026
696e0e4
perf(web): asset URL hooks compile with the React Compiler (#20452)
juliusmarminge Oct 17, 2026
e9712d2
perf(web): toggle groups compile with the React Compiler (#20453)
juliusmarminge Oct 17, 2026
68b47e7
perf(web): thread notifications compile with the React Compiler (#20454)
juliusmarminge Oct 17, 2026
c62480a
perf(web): query hooks compile with the React Compiler (#20455)
juliusmarminge Oct 17, 2026
35dcdfb
perf(web): source control action hooks compile with the React Compile…
juliusmarminge Oct 17, 2026
998bcc2
perf(web): the project icon picker compiles with the React Compiler (…
juliusmarminge Oct 17, 2026
275e55c
perf(web): the theme editor compiles with the React Compiler (#20458)
juliusmarminge Oct 17, 2026
a17781f
perf(web): panel presence keeps its retained value in state (#20459)
juliusmarminge Oct 17, 2026
6293119
perf(web): useCopyToClipboard reads its options through useStableCall…
juliusmarminge Oct 17, 2026
222ebe0
perf(web): pairing surfaces read their URL token from lazy state (#20…
juliusmarminge Oct 17, 2026
546c67f
perf(web): sidebar retained git status lives in state (#20462)
juliusmarminge Oct 17, 2026
2329094
perf(web): viewed-file tracking passes its flush target instead of re…
juliusmarminge Oct 17, 2026
de89a7a
perf(web): useLiveRefresh reads its callback through useEffectEvent (…
juliusmarminge Oct 17, 2026
635396c
perf(web): browser viewport resize checks its source through a stable…
juliusmarminge Oct 17, 2026
1544a94
perf(web): snapshot coordinator keeps the last route target in state …
juliusmarminge Oct 17, 2026
10d4fab
perf(web): branch toolbar label measuring reads its state through use…
juliusmarminge Oct 17, 2026
26bea7e
perf(web): diff panel reads its loader and collapse defaults without …
juliusmarminge Oct 17, 2026
8f309bc
perf(web): welcome wizard keeps its auto-selected computers in lazy s…
juliusmarminge Oct 17, 2026
7f4142e
perf(web): thread actions compile without manual memoization (#20470)
juliusmarminge Oct 17, 2026
bb30390
perf(web): pull request code tab compiles, with viewed toggles read t…
juliusmarminge Oct 17, 2026
70c73d9
perf(web): useLocalStorage compiles with the React Compiler (#20472)
juliusmarminge Oct 17, 2026
9730e04
perf(web): useTheme compiles with the React Compiler (#20473)
juliusmarminge Oct 17, 2026
8316dfb
perf(web): settings hooks compile with the React Compiler (#20474)
juliusmarminge Oct 17, 2026
9fa3967
perf(web): the queued runs control compiles with the React Compiler (…
juliusmarminge Oct 17, 2026
e96db6f
perf(web): the browser preview view compiles with the React Compiler …
juliusmarminge Oct 17, 2026
7a89733
perf(web): the command palette compiles with the React Compiler (#20477)
juliusmarminge Oct 17, 2026
b27c686
perf(web): the server update action compiles with the React Compiler …
juliusmarminge Oct 17, 2026
426706c
perf(web): the attachment file preview compiles with the React Compil…
juliusmarminge Oct 17, 2026
6ced12a
perf(web): the usage page compiles with the React Compiler (#20480)
juliusmarminge Oct 17, 2026
f31850c
perf(web): provider update rows compile with the React Compiler (#20481)
juliusmarminge Oct 17, 2026
1144a7e
perf(web): useDirectoryEntries compiles with the React Compiler (#20482)
juliusmarminge Oct 17, 2026
a77cbf0
perf(web): the file browser panel compiles with the React Compiler (#…
juliusmarminge Oct 17, 2026
6286170
perf(web): the sidebar update pill compiles with the React Compiler (…
juliusmarminge Oct 17, 2026
5cc75e8
perf(web): the provider updates action compiles with the React Compil…
juliusmarminge Oct 17, 2026
46ae590
perf(web): the media video player compiles with the React Compiler (#…
juliusmarminge Oct 17, 2026
e10f5d1
perf(web): media actions compile with the React Compiler (#20487)
juliusmarminge Oct 17, 2026
9f70fcc
fix(prs): typed qualifiers filter mobile PR search and sync the draft…
Bil0000 Oct 17, 2026
7157b76
perf(web): device setup compiles with the React Compiler (#20488)
juliusmarminge Oct 17, 2026
488af8d
perf(web): the device panel compiles with the React Compiler (#20489)
juliusmarminge Oct 17, 2026
079a349
perf(web): the SSH password prompt compiles with the React Compiler (…
juliusmarminge Oct 17, 2026
c1caac8
perf(web): the cloud environment connect list compiles with the React…
juliusmarminge Oct 17, 2026
4091409
perf(web): pull request actions compile with the React Compiler (#20492)
juliusmarminge Oct 17, 2026
5abf7bf
perf(web): pull request review annotations compile with the React Com…
juliusmarminge Oct 17, 2026
ba3e228
perf(web): pull request thread links compile with the React Compiler …
juliusmarminge Oct 17, 2026
d793ddd
perf(web): the link pull request dialog compiles with the React Compi…
juliusmarminge Oct 17, 2026
1c9e83e
perf(web): GitHub token settings compile with the React Compiler (#20…
juliusmarminge Oct 17, 2026
ef78932
perf(web): GitHub account settings compile with the React Compiler (#…
juliusmarminge Oct 17, 2026
5c43d16
perf(web): source control host settings compile with the React Compil…
juliusmarminge Oct 17, 2026
ebe9979
perf(web): usage provider settings compile with the React Compiler (#…
juliusmarminge Oct 17, 2026
72dac23
perf(web): telemetry export settings compile with the React Compiler …
juliusmarminge Oct 17, 2026
a72d1fc
perf(web): device host connection checks compile with the React Compi…
juliusmarminge Oct 17, 2026
b618d53
perf(web): project script settings compile with the React Compiler (#…
juliusmarminge Oct 17, 2026
d1c2346
perf(web): SnapShot setup dialog compile with the React Compiler (#20…
juliusmarminge Oct 17, 2026
0a453f0
perf(web): notification settings compile with the React Compiler (#20…
juliusmarminge Oct 17, 2026
43acbcd
perf(web): provider setup section compile with the React Compiler (#2…
juliusmarminge Oct 17, 2026
d89076c
perf(web): storage settings compile with the React Compiler (#20506)
juliusmarminge Oct 17, 2026
123dc24
perf(web): diagnostics settings compile with the React Compiler (#20507)
juliusmarminge Oct 17, 2026
7091bc2
perf(web): device hosts settings compile with the React Compiler (#20…
juliusmarminge Oct 17, 2026
40ff4b4
perf(web): project settings panel compile with the React Compiler (#2…
juliusmarminge Oct 17, 2026
d23ac51
perf(web): ACP session management compile with the React Compiler (#2…
juliusmarminge Oct 17, 2026
3501270
perf(web): capture shortcut config compile with the React Compiler (#…
juliusmarminge Oct 17, 2026
993aed3
perf(web): integrations settings compile with the React Compiler (#20…
juliusmarminge Oct 17, 2026
6a71716
perf(web): theme import dialog compile with the React Compiler (#20513)
juliusmarminge Oct 17, 2026
5422872
fix(web): an abandoned machine switch still clears its busy state (#2…
juliusmarminge Oct 17, 2026
3448e01
perf(web): SnapShot settings compile with the React Compiler (#20514)
juliusmarminge Oct 17, 2026
6a326af
perf(web): connections settings compile with the React Compiler (#20515)
juliusmarminge Oct 17, 2026
19108aa
feat(auth): pairing grants access and T3 Connect management by defaul…
juliusmarminge Oct 17, 2026
f0474d3
perf(web): resize handles compile with the React Compiler (#20524)
juliusmarminge Oct 17, 2026
404c261
perf(web): the theme color picker compiles with the React Compiler (#…
juliusmarminge Oct 17, 2026
9220fd7
perf(web): the pull request panel compiles with the React Compiler (#…
juliusmarminge Oct 17, 2026
f4cf855
perf(web): the terminal drawer compiles with the React Compiler (#20527)
juliusmarminge Oct 17, 2026
1da2d60
perf(web): the settings panels compile with the React Compiler (#20528)
juliusmarminge Oct 17, 2026
11ce406
fix(server): background subagents keep T3 tools after the parent turn…
maria-rcks Oct 17, 2026
7111501
fix(server): wake threads whose subagents' background work a restart …
maria-rcks Oct 17, 2026
70d60e0
fix(web): the sidebar no longer crashes when a thread leaves it (#20522)
gilitos92 Oct 17, 2026
613d18b
Merge upstream/main into the fork
r4iju Oct 17, 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.
7 changes: 1 addition & 6 deletions .coderabbit.config.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { defineConfig, type CodeRabbitContext } from "@coderabbitai/config";

// Org members and collaborators can approve their own pull requests.
const UNGATED_AUTHORS = new Set(["OWNER", "MEMBER", "COLLABORATOR"]);
const isGated = ({ pr }: CodeRabbitContext) => !UNGATED_AUTHORS.has(pr?.authorAssociation ?? "");

Expand All @@ -17,11 +16,7 @@ export default defineConfig((ctx) => ({
docstrings: { mode: "off" },
override_requested_reviewers_only: isGated(ctx),
},
path_filters: [
// Vendored read-only reference checkouts of upstream Effect and Alchemy
// (see scripts/lib/reference-repos.ts). Nothing imports from them.
"!.repos/**",
],
path_filters: ["!.repos/**"],
path_instructions: [
{
path: "{apps,packages,infra}/**/*.ts",
Expand Down
3 changes: 3 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,6 @@
# Batch files need CRLF for cmd.exe to parse them reliably.
*.cmd text eol=crlf
*.bat text eol=crlf
# GitHub's GraphQL schema and the operations graphqlgen writes from it.
packages/source-control-github/schema/** linguist-generated
**/*.graphql.ts linguist-generated
2 changes: 2 additions & 0 deletions .github/VOUCHED.td
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ github:aoright
github:arhxam
github:bil0000
github:binbandit
github:bompus
github:Brechard
github:btsouth
github:cestercian
Expand Down Expand Up @@ -52,6 +53,7 @@ github:mackinleysmith
github:maria-rcks
github:MatthewFeroz
github:maxwellyoung
github:mweinbach
github:mwolson
github:myacoub91
github:naMqe-h
Expand Down
63 changes: 63 additions & 0 deletions .github/actions/ci-changes/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
name: CI changes
description: Decide which CI jobs a change needs. See .github/scripts/ci-changes.cjs.
outputs:
typecheck:
value: ${{ steps.detect.outputs.typecheck }}
build:
value: ${{ steps.detect.outputs.build }}
test:
value: ${{ steps.detect.outputs.test }}
test_packages:
value: ${{ steps.detect.outputs.test_packages }}
test_web:
value: ${{ steps.detect.outputs.test_web }}
test_server:
value: ${{ steps.detect.outputs.test_server }}
rust:
value: ${{ steps.detect.outputs.rust }}
release_smoke:
value: ${{ steps.detect.outputs.release_smoke }}
mobile_native:
value: ${{ steps.detect.outputs.mobile_native }}
runs:
using: composite
steps:
- id: detect
shell: bash
env:
EVENT_NAME: ${{ github.event_name }}
BEFORE_SHA: ${{ github.event.before }}
run: |
set -uo pipefail

decide() {
node .github/scripts/ci-changes.cjs "$@" | tee -a "$GITHUB_OUTPUT"
exit "${PIPESTATUS[0]}"
}

fail_open() {
echo "$* Running every job."
decide
}

# Reads the change from git rather than the REST API: every job that
# runs this shares the repository's 1,000 requests/hour GITHUB_TOKEN quota.
if [[ "$EVENT_NAME" == pull_request ]]; then
# A pull request checks out GitHub's merge commit with fetch-depth: 2,
# so its first parent is the base branch and the diff is the PR's change.
base=HEAD^1
mode=()
else
base=$BEFORE_SHA
git fetch --quiet --no-tags --depth=1 --filter=blob:none origin "$base" \
|| fail_open "Could not fetch ${base}."
# main keeps a full run as the backstop for anything the gate misses.
mode=(--full)
fi

# --no-renames lists a rename as its old and new path: renaming a file out
# of a package changes that package just like editing it. It also keeps
# git from fetching file contents to score renames.
git diff --name-only --no-renames "$base" HEAD > "$RUNNER_TEMP/changed-paths" \
|| fail_open "Could not diff against ${base}."
decide --paths "$RUNNER_TEMP/changed-paths" "${mode[@]}"
30 changes: 30 additions & 0 deletions .github/actions/setup-ci-deps/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
name: Setup CI dependencies
description: Install Vite+ and the workspace dependencies from cache.
runs:
using: composite
steps:
# setup-vp reuses an installed exact version, so restoring its home skips the
# installer download on every job.
- 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"

- name: Cache Vite+
if: steps.vp.outputs.version != ''
uses: actions/cache@v6
with:
path: ~/.vite-plus
key: vite-plus-home-v1-${{ runner.os }}-${{ runner.arch }}-${{ steps.vp.outputs.version }}

# 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: Setup Vite+
uses: voidzero-dev/setup-vp@v1
with:
node-version-file: package.json
cache: true
run-install: true
6 changes: 0 additions & 6 deletions .github/scripts/check-nightly-release.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ async function assertReleaseSource({ github, context, releaseChannel }) {

const isNightlyTag = (tag) => /^v.*-nightly\./.test(tag) || tag.startsWith("nightly-v");

// Newest published nightly by publication time, or undefined when none exists.
async function findLatestNightly({ github, context }) {
const releases = await github.paginate(github.rest.repos.listReleases, {
...context.repo,
Expand All @@ -51,7 +50,6 @@ async function findLatestNightly({ github, context }) {
.sort((a, b) => Date.parse(b.published_at) - Date.parse(a.published_at))[0];
}

// Runs after the workflow acquires the nightly concurrency lock.
async function shouldReleaseNightly({ github, context, core, now = Date.now() }) {
const lastNightly = await findLatestNightly({ github, context });

Expand Down Expand Up @@ -81,17 +79,13 @@ async function shouldReleaseNightly({ github, context, core, now = Date.now() })
return true;
}

// Stable releases build the commit the latest nightly shipped, so the stable
// build is one nightly users already ran. Returns the nightly tag, its commit,
// and the stable version that nightly was a preview of.
async function resolveLatestNightlyCommit({ github, context, core }) {
const lastNightly = await findLatestNightly({ github, context });
if (!lastNightly) {
throw new Error("No published nightly found. Stable releases build the latest nightly commit.");
}

const tag = lastNightly.tag_name;
// repos.getCommit dereferences annotated tags, so this is the commit either way.
const { data: commit } = await github.rest.repos.getCommit({ ...context.repo, ref: tag });
const version = /^(?:nightly-)?v(\d+\.\d+\.\d+)-nightly\./.exec(tag)?.[1];
if (!version) {
Expand Down
203 changes: 203 additions & 0 deletions .github/scripts/ci-changes.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,203 @@
// 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
//
// 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.
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.
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.
const EXTRA_OWNERS = [
// Vite configs and tsconfigs of these apps import scripts/lib directly.
[/^scripts\/lib\//, ["@t3tools/desktop", "@t3tools/mobile", "@t3tools/web", "t3"]],
// scripts/build-desktop-artifact.ts reads the GNOME extension manifest.
[/^apps\/desktop\/gnome-extension\//, ["@t3tools/scripts"]],
[/^native\/browser-secret\//, ["@t3tools/desktop"]],
[/^native\/libghostty-vt\//, ["@t3tools/web"]],
];
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).
const TEST_ONLY_DEPS = {
"@t3tools/provider-pi": ["@t3tools/client-runtime"],
"@t3tools/scripts": [
"@t3tools/desktop",
"@t3tools/mobile",
"@t3tools/web",
"t3",
"@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.
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() {
const patterns = [];
let inPackages = false;
for (const line of fs.readFileSync(path.join(root, "pnpm-workspace.yaml"), "utf8").split("\n")) {
if (/^\S/.test(line)) inPackages = line.startsWith("packages:");
const entry = inPackages && line.match(/^\s+-\s+["']?([^"'\s]+)/);
if (entry) patterns.push(entry[1]);
}

const dirs = patterns.flatMap((pattern) => {
if (!pattern.endsWith("/*")) return [pattern];
const parent = pattern.slice(0, -2);
return fs.readdirSync(path.join(root, parent)).map((name) => `${parent}/${name}`);
});

const packages = [];
for (const dir of dirs) {
const manifestPath = path.join(root, dir, "package.json");
if (!fs.existsSync(manifestPath)) continue;
const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf8"));
const deps = {
...manifest.dependencies,
...manifest.devDependencies,
...manifest.peerDependencies,
};
packages.push({
name: manifest.name,
dir,
hasTest: Boolean(manifest.scripts?.test),
deps: Object.keys(deps).filter(
(dep) =>
String(deps[dep]).startsWith("workspace:") &&
!BUILD_ONLY_DEPS[manifest.name]?.includes(dep),
),
});
}
return packages;
}

// Returns the packages a path touches, [] for an inert path, or null when the
// path is not understood and everything must run.
function ownersOf(file, packages) {
if (INERT.some((pattern) => pattern.test(file))) return [];
// A manifest can change dependencies or versions other packages read.
if (path.posix.basename(file) === "package.json") return null;
if (RUNS_EVERYTHING.some((pattern) => pattern.test(file))) return null;
// scripts/build-desktop-artifact.test.ts reads the crates' sources.
if (RUST.test(file)) return ["@t3tools/scripts"];

const extra = EXTRA_OWNERS.flatMap(([pattern, names]) => (pattern.test(file) ? names : []));
const owner = packages
.filter((pkg) => file.startsWith(`${pkg.dir}/`))
.sort((a, b) => b.dir.length - a.dir.length)[0];
if (owner) return [owner.name, ...extra];
return extra.length > 0 ? extra : null;
}

function decide(files, packages, full) {
const all = new Set(packages.map((pkg) => pkg.name));
let affected = new Set();
let everything = full || files === null;
let rust = false;

for (const file of files ?? []) {
if (RUST.test(file)) rust = true;
const owners = ownersOf(file, packages);
if (owners === null) {
everything = true;
console.error(`Runs everything: ${file}`);
} else {
for (const owner of owners) affected.add(owner);
}
}

// Release smoke reads scripts/ itself, not what the scripts tests read.
let scriptsChanged = everything;
if (everything) {
affected = all;
} else {
// Add dependents until nothing changes.
let grew = true;
while (grew) {
grew = false;
for (const pkg of packages) {
if (!affected.has(pkg.name) && pkg.deps.some((dep) => affected.has(dep))) {
affected.add(pkg.name);
grew = true;
}
}
}
scriptsChanged = affected.has("@t3tools/scripts");
for (const [name, deps] of Object.entries(TEST_ONLY_DEPS)) {
if (deps.some((dep) => affected.has(dep))) affected.add(name);
}
}

const tested = packages.filter(
(pkg) => pkg.hasTest && !OWN_TEST_JOB.has(pkg.name) && affected.has(pkg.name),
);
const has = (name) => affected.has(name);

return {
affected: [...affected].sort(),
outputs: {
typecheck: affected.size > 0,
build: has("@t3tools/desktop") || has("t3") || has("@t3tools/web"),
test: tested.length > 0,
// Empty means every package the Test job covers.
test_packages: everything ? "" : tested.map((pkg) => pkg.name).join(" "),
test_web: has("@t3tools/web"),
test_server: has("t3"),
rust: everything || rust,
release_smoke: scriptsChanged,
mobile_native: files === null || files.some((file) => MOBILE_NATIVE.test(file)),
},
};
}

function main() {
const args = process.argv.slice(2);
const pathsIndex = args.indexOf("--paths");
const files =
pathsIndex === -1
? null
: fs
.readFileSync(args[pathsIndex + 1], "utf8")
.split("\n")
.filter(Boolean);
const { affected, outputs } = decide(files, readWorkspace(), args.includes("--full"));

console.error(`Affected packages: ${affected.join(", ") || "none"}`);
for (const [key, value] of Object.entries(outputs)) console.log(`${key}=${value}`);
}

main();
Loading
Loading