Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1083 commits
Select commit Hold shift + click to select a range
4539e77
perf(web): the HTML render frame compiles without manual memoization …
juliusmarminge Oct 17, 2026
9e88a4f
perf(web): the sidebar update capsule compiles without manual memoiza…
juliusmarminge Oct 17, 2026
3c6df71
perf(web): the terminal session hooks compile without manual memoizat…
juliusmarminge Oct 17, 2026
6ad62b8
perf(web): the project file picker compiles without manual memoizatio…
juliusmarminge Oct 17, 2026
72b3340
perf(web): the sidebar chrome compiles without manual memoization (#2…
juliusmarminge Oct 17, 2026
41edad8
perf(web): the file context menu hooks compile without manual memoiza…
juliusmarminge Oct 17, 2026
2ff8e74
perf(web): the snapshot shortcut recorder compiles without manual mem…
juliusmarminge Oct 17, 2026
2a337fe
perf(web): the pull request linking hook compiles without manual memo…
juliusmarminge Oct 17, 2026
66eee62
perf(web): the port discovery hooks compile without manual memoizatio…
juliusmarminge Oct 17, 2026
dc060b1
perf(web): the new-thread link route compiles without manual memoizat…
juliusmarminge Oct 17, 2026
2643821
perf(web): the Electron browser host compiles with the React Compiler…
juliusmarminge Oct 17, 2026
d859445
perf(web): the CSV table preview compiles without manual memoization …
juliusmarminge Oct 17, 2026
8e49f23
perf(web): the thread lineage panel compiles without manual memoizati…
juliusmarminge Oct 17, 2026
de9756a
perf(web): the open panel pull request URL hook compiles without manu…
juliusmarminge Oct 17, 2026
cba00ae
perf(web): highlighted code tokens compile without manual memoization…
juliusmarminge Oct 17, 2026
383d8cc
perf(web): scoped settings hooks compile without manual memoization (…
juliusmarminge Oct 17, 2026
c5310c2
perf(web): the HTML document frame compiles without manual memoizatio…
juliusmarminge Oct 17, 2026
36c1fe5
perf(web): the new project hook compiles without manual memoization (…
juliusmarminge Oct 17, 2026
165fa98
perf(web): the scratch project hook compiles without manual memoizati…
juliusmarminge Oct 17, 2026
92b8967
perf(web): the expanded image dialog compiles without manual memoizat…
juliusmarminge Oct 17, 2026
d209e56
perf(web): the sidebar project groups hook compiles without manual me…
juliusmarminge Oct 17, 2026
9439b1a
perf(web): review file patches compile without manual memoization (#2…
juliusmarminge Oct 17, 2026
436ff01
perf(web): the draft hero headline compiles without manual memoizatio…
juliusmarminge Oct 17, 2026
3f5c16f
perf(web): settings project groups compile without manual memoization…
juliusmarminge Oct 17, 2026
3ba121e
perf(web): the chat route layout compiles without manual memoization …
juliusmarminge Oct 17, 2026
aca2b2a
perf(web): scoped model availability compiles without manual memoizat…
juliusmarminge Oct 17, 2026
e3a578f
perf(web): the environment hooks compile without manual memoization (…
juliusmarminge Oct 17, 2026
11f6676
perf(web): the provider settings panel compiles with the React Compil…
juliusmarminge Oct 17, 2026
15a8774
perf(web): the code block language picker compiles without manual mem…
juliusmarminge Oct 17, 2026
afb8da0
perf(web): the right panel tabs compile with the React Compiler (#20662)
juliusmarminge Oct 17, 2026
934398b
perf(web): settings search availability compiles without manual memoi…
juliusmarminge Oct 17, 2026
37db94e
perf(web): the editor preference hooks compile without manual memoiza…
juliusmarminge Oct 17, 2026
99fac26
perf(web): the code view file reveal hook compiles without manual mem…
juliusmarminge Oct 17, 2026
35548e2
perf(web): the command output panel compiles without manual memoizati…
juliusmarminge Oct 17, 2026
65d352e
perf(web): the annotatable diff view compiles without manual memoizat…
juliusmarminge Oct 17, 2026
4a9516d
perf(web): the chat header compiles with the React Compiler (#20656)
juliusmarminge Oct 17, 2026
a9fb608
perf(web): the theme library compiles with the React Compiler (#20655)
juliusmarminge Oct 17, 2026
4e8c01c
perf(web): the chat canvas compiles without manual memoization (#20654)
juliusmarminge Oct 17, 2026
d42681d
perf(web): useResizableWidth compiles without manual memoization (#20…
juliusmarminge Oct 17, 2026
c7fe6d3
perf(web): device controls compile without manual memoization (#20652)
juliusmarminge Oct 17, 2026
ec9f8e8
perf(web): file breadcrumbs compile with the React Compiler (#20651)
juliusmarminge Oct 17, 2026
c8b3ebf
perf(web): the changed files tree compiles without manual memoization…
juliusmarminge Oct 17, 2026
db2d0eb
perf(web): the provider update dismissal hook compiles without manual…
juliusmarminge Oct 17, 2026
472a62a
perf(web): the sidebar primitives compile with the React Compiler (#2…
juliusmarminge Oct 17, 2026
9b62eae
perf(web): the settings layout compiles without manual memoization (#…
juliusmarminge Oct 17, 2026
0ed3ae8
perf(web): the remote open hook compiles without manual memoization (…
juliusmarminge Oct 17, 2026
9578a59
perf(web): usePreviewBridge compiles with the React Compiler (#20644)
juliusmarminge Oct 17, 2026
b6dde72
perf(web): the citation chip compiles without manual memoization (#20…
juliusmarminge Oct 17, 2026
f63f026
perf(web): useHtmlRenderTheme compiles without manual memoization (#2…
juliusmarminge Oct 17, 2026
f22415a
perf(web): project content search compiles with the React Compiler (#…
juliusmarminge Oct 17, 2026
6a0587c
perf(web): the agent connect surface compiles without manual memoizat…
juliusmarminge Oct 17, 2026
0fdbb37
perf(web): the theme editor host compiles without manual memoization …
juliusmarminge Oct 17, 2026
478b06c
perf(web): the first-run gate compiles with the React Compiler (#20637)
juliusmarminge Oct 17, 2026
e6a1260
perf(web): the settings scope context compiles without manual memoiza…
juliusmarminge Oct 17, 2026
f99d12b
perf(web): the worktree base branch picker compiles without manual me…
juliusmarminge Oct 17, 2026
452d032
perf(web): the project file scripts hook compiles without manual memo…
juliusmarminge Oct 17, 2026
1b41060
perf(web): the diff file tree compiles with the React Compiler (#20631)
juliusmarminge Oct 17, 2026
d4c49bd
perf(web): thread status indicators compile without manual memoizatio…
juliusmarminge Oct 17, 2026
e544a4a
perf(web): useMediaQuery compiles without manual memoization (#20629)
juliusmarminge Oct 17, 2026
0b0f4db
perf(web): the source control settings compile with the React Compile…
juliusmarminge Oct 17, 2026
ef643a3
perf(web): scheduled task settings compile without manual memoization…
juliusmarminge Oct 17, 2026
530d119
perf(web): the remove-cloned-project hook compiles without manual mem…
juliusmarminge Oct 17, 2026
145b154
perf(web): resource telemetry diagnostics compile without manual memo…
juliusmarminge Oct 17, 2026
e36d0b2
perf(web): the archived threads hook compiles without manual memoizat…
juliusmarminge Oct 17, 2026
ecb973a
perf(web): the Connect onboarding dialog compiles with the React Comp…
juliusmarminge Oct 17, 2026
99544c9
perf(web): redacted sensitive text compiles without manual memoizatio…
juliusmarminge Oct 17, 2026
a9c0bb6
perf(web): the pull request stack hook compiles without manual memoiz…
juliusmarminge Oct 17, 2026
f241e79
perf(web): the resource telemetry hook compiles without manual memoiz…
juliusmarminge Oct 17, 2026
a37e0f3
perf(web): the provider settings form compiles without manual memoiza…
juliusmarminge Oct 17, 2026
a4f6caf
perf(web): the provider models section compiles with the React Compil…
juliusmarminge Oct 17, 2026
1b13922
perf(web): the CLI authorize surface compiles without manual memoizat…
juliusmarminge Oct 17, 2026
d6df197
perf(web): the pull request thread dialog compiles without manual mem…
juliusmarminge Oct 17, 2026
3f60d4d
perf(web): the assistant citation target hook compiles with the React…
juliusmarminge Oct 17, 2026
54d0900
perf(web): the device state hooks compile without manual memoization …
juliusmarminge Oct 17, 2026
a8dcb96
perf(web): the provider accent color picker compiles without manual m…
juliusmarminge Oct 17, 2026
e08b38a
perf(web): the T3 Connect account pages hook compiles without manual …
juliusmarminge Oct 17, 2026
97a9ca1
perf(web): the session scope hooks compile without manual memoization…
juliusmarminge Oct 17, 2026
196950a
perf(web): the provider update notification compiles without manual m…
juliusmarminge Oct 17, 2026
89a24e8
perf(web): the open-source notices panel compiles with the React Comp…
juliusmarminge Oct 17, 2026
23d40e0
perf(web): the project icon picker compiles without manual memoizatio…
juliusmarminge Oct 17, 2026
41f56d9
perf(web): the project scans hook compiles without manual memoization…
juliusmarminge Oct 17, 2026
54b1915
perf(web): the thread context drop hook compiles with the React Compi…
juliusmarminge Oct 17, 2026
2182353
perf(web): the local provider update groups compile without manual me…
juliusmarminge Oct 17, 2026
ed16d9f
perf(web): thread find navigation compiles without manual memoization…
juliusmarminge Oct 17, 2026
7591b64
perf(web): the font previews compile with the React Compiler (#20601)
juliusmarminge Oct 17, 2026
c36880e
perf(web): project actions settings compile without manual memoizatio…
juliusmarminge Oct 17, 2026
0b110ce
perf(web): the thread find bar compiles with the React Compiler (#20600)
juliusmarminge Oct 17, 2026
dec20ce
perf(web): the project scripts control compiles without manual memoiz…
juliusmarminge Oct 17, 2026
d915777
perf(web): keybindings settings compile without manual memoization (#…
juliusmarminge Oct 17, 2026
e648318
perf(web): the model picker sidebar compiles with the React Compiler …
juliusmarminge Oct 17, 2026
4c22df2
perf(web): the composer path search hook compiles without manual memo…
juliusmarminge Oct 17, 2026
855cd16
perf(web): the font picker compiles with the React Compiler (#20594)
juliusmarminge Oct 17, 2026
6515be7
perf(web): the project clone toasts compile without manual memoizatio…
juliusmarminge Oct 17, 2026
4e3f936
perf(web): the pending user input panel compiles with the React Compi…
juliusmarminge Oct 17, 2026
ed866ae
perf(web): useTurnDiffSummaries compiles without manual memoization (…
juliusmarminge Oct 17, 2026
789f605
perf(web): the provider update pill compiles with the React Compiler …
juliusmarminge Oct 17, 2026
d15f208
perf(web): the no-projects hero compiles without manual memoization (…
juliusmarminge Oct 17, 2026
567bc55
perf(web): useActiveThreadRef compiles without manual memoization (#2…
juliusmarminge Oct 17, 2026
54bffb9
perf(web): the custom model editor compiles without manual memoizatio…
juliusmarminge Oct 17, 2026
20851e3
perf(web): the root route compiles with the React Compiler (#20585)
juliusmarminge Oct 17, 2026
ede009e
perf(web): the diff worker pool provider compiles without manual memo…
juliusmarminge Oct 17, 2026
f0e060a
perf(web): the CLI command settings row compiles without manual memoi…
juliusmarminge Oct 17, 2026
6b563bb
perf(web): the composer banner stack compiles with the React Compiler…
juliusmarminge Oct 17, 2026
6f68d6d
perf(web): the primary session state hook compiles without manual mem…
juliusmarminge Oct 17, 2026
2814dc9
perf(web): the index route compiles with the React Compiler (#20580)
juliusmarminge Oct 17, 2026
6d22719
perf(web): the command palette results compile without manual memoiza…
juliusmarminge Oct 17, 2026
a793011
perf(web): the add provider dialog compiles without manual memoizatio…
juliusmarminge Oct 17, 2026
dd1ab3f
perf(web): useOrchestrationCommand compiles without manual memoizatio…
juliusmarminge Oct 17, 2026
2bb92ba
perf(web): the environment selector compiles without manual memoizati…
juliusmarminge Oct 17, 2026
9434bfd
perf(web): default theme adoption compiles with the React Compiler (#…
juliusmarminge Oct 17, 2026
745ca81
perf(web): useAtomQueryRunner compiles without manual memoization (#2…
juliusmarminge Oct 17, 2026
ef2d631
perf(web): the env mode selector compiles without manual memoization …
juliusmarminge Oct 17, 2026
242ec0e
perf(web): highlighted search lines compile without manual memoizatio…
juliusmarminge Oct 17, 2026
5069553
perf(web): the server update banner compiles without manual memoizati…
juliusmarminge Oct 17, 2026
8e6ace6
perf(web): the app sidebar layout compiles with the React Compiler (#…
juliusmarminge Oct 17, 2026
3ff9a73
perf(web): useAtomCommand compiles without manual memoization (#20568)
juliusmarminge Oct 17, 2026
7383cce
perf(web): the branch toolbar selector compiles without manual memoiz…
juliusmarminge Oct 17, 2026
95e6d92
perf(web): the composer state hooks compile without manual memoizatio…
juliusmarminge Oct 17, 2026
366106a
perf(web): the escape-to-go-back hook compiles without manual memoiza…
juliusmarminge Oct 17, 2026
63318a5
perf(web): the guide tour compiles without manual memoization (#20563)
juliusmarminge Oct 17, 2026
3603057
perf(web): the onboarding completion hook compiles without manual mem…
juliusmarminge Oct 17, 2026
1e42057
perf(web): the guide stop compiles without manual memoization (#20560)
juliusmarminge Oct 17, 2026
7492012
perf(web): the prompt link page compiles with the React Compiler (#20…
juliusmarminge Oct 17, 2026
095fdac
perf(web): the hosted browser webview compiles with the React Compile…
juliusmarminge Oct 17, 2026
78c0d7d
perf(web): the branch picker compiles without manual memoization (#20…
juliusmarminge Oct 17, 2026
7e850a0
perf(web): useStableCallback compiles without manual memoization (#20…
juliusmarminge Oct 17, 2026
fea5380
perf(web): the find reveal ref compiles without manual memoization (#…
juliusmarminge Oct 17, 2026
65ebf8f
perf(web): the primary cloud link hook compiles without manual memoiz…
juliusmarminge Oct 17, 2026
70d5cfb
perf(web): the project action editor resets its form without an effec…
juliusmarminge Oct 17, 2026
687f1e9
perf(web): the zoomable image compiles without manual memoization (#2…
juliusmarminge Oct 17, 2026
d94ea2c
perf(web): the PR guide diff loader compiles with the React Compiler …
juliusmarminge Oct 17, 2026
b78296a
perf(web): the traits picker compiles without manual memoization (#20…
juliusmarminge Oct 17, 2026
22585fd
perf(web): the managed relay hooks compile without manual memoization…
juliusmarminge Oct 17, 2026
b82d2e3
perf(web): the guide excerpt compiles without manual memoization (#20…
juliusmarminge Oct 17, 2026
16e6a6a
perf(web): AnimatedHeight compiles with the React Compiler (#20562)
juliusmarminge Oct 17, 2026
4576827
perf(web): the browser favicon store compiles without manual memoizat…
juliusmarminge Oct 17, 2026
7a08cdf
perf(web): the browser surface slot compiles with the React Compiler …
juliusmarminge Oct 17, 2026
8fcdcfe
perf(web): the link opener hook compiles without manual memoization (…
juliusmarminge Oct 17, 2026
02d48ae
perf(web): the guide file diff compiles without manual memoization (#…
juliusmarminge Oct 17, 2026
82f40d7
perf(web): the settings sidebar compiles with the React Compiler (#20…
juliusmarminge Oct 17, 2026
cffabdb
perf(web): Codex setup compiles with the React Compiler (#20674)
juliusmarminge Oct 17, 2026
fcda161
perf(web): chat markdown compiles with the React Compiler (#20715)
juliusmarminge Oct 17, 2026
2520821
perf(web): the device stream view compiles without manual memoization…
juliusmarminge Oct 17, 2026
33672c4
perf(web): the load-balancing hook compiles with the React Compiler (…
juliusmarminge Oct 17, 2026
a72b58e
fix(web): settings search keeps the clamped highlight when results sh…
juliusmarminge Oct 17, 2026
8254505
perf(web): the provider update launch notification compiles with the …
juliusmarminge Oct 17, 2026
0752826
perf(web): the model picker compiles without manual memoization (#20706)
juliusmarminge Oct 17, 2026
2993dfc
feat(web): step reasoning effort from the keyboard (#19928)
Bil0000 Oct 17, 2026
3ba883e
perf(web): the item inspector compiles without manual memoization (#2…
juliusmarminge Oct 17, 2026
e2e9b4d
fix(mobile): dev pairing link no longer opens Home inside a sheet (#2…
PixPMusic Oct 17, 2026
47683f6
fix(server): webhook request values reach the agent marked as request…
juliusmarminge Oct 17, 2026
c9b8f21
refactor(client-runtime): decide learned routes and session reuse in …
juliusmarminge Oct 17, 2026
bfe804d
refactor(web): thread find compiles under the strict React Compiler r…
juliusmarminge Oct 17, 2026
07fa354
test(web): chat markdown, timeline, and diff reveal tests pass the st…
juliusmarminge Oct 17, 2026
b38aa02
perf(web): Git actions control compiles without manual memoization (#…
juliusmarminge Oct 17, 2026
aa28bde
refactor(web): the theme search section compiles without manual memoi…
juliusmarminge Oct 17, 2026
8653c8f
fix(server): keep sensitive values out of settings reads, startup log…
juliusmarminge Oct 17, 2026
b3d0564
refactor(web): the thread pull requests panel keeps its caching witho…
juliusmarminge Oct 17, 2026
01e634a
refactor(web): scoped settings stay cached without "use memo" (#20767)
juliusmarminge Oct 17, 2026
68ed8d3
refactor(web): settings search items stay cached without "use memo" (…
juliusmarminge Oct 17, 2026
3af41ed
refactor(web): the file browser keeps its caching without "use memo" …
juliusmarminge Oct 17, 2026
341738b
refactor(web): the pull request stack hook keeps its caching without …
juliusmarminge Oct 17, 2026
0ad3fd6
refactor(web): the pull request thread dialog keeps its caching witho…
juliusmarminge Oct 17, 2026
37ea8a8
refactor(web): the MCP app frame keeps its caching without "use memo"…
juliusmarminge Oct 17, 2026
36cde6f
refactor(web): the changed files tree keeps its caching without "use …
juliusmarminge Oct 17, 2026
fc73c24
refactor(web): sidebar resize options stay cached without "use memo" …
juliusmarminge Oct 17, 2026
0a3806c
refactor(web): paginated branches keep their caching without "use mem…
juliusmarminge Oct 17, 2026
9554194
refactor(web): pull request markdown keeps its caching without "use m…
juliusmarminge Oct 17, 2026
4dd6a65
refactor(web): the pull request detail panel keeps its caching with f…
juliusmarminge Oct 17, 2026
64b16d8
refactor(web): the open panel pull request URL keeps its caching with…
juliusmarminge Oct 17, 2026
3b61890
refactor(web): the command output panel keeps its caching without "us…
juliusmarminge Oct 17, 2026
b7e376e
fix(client-runtime): the agents pill counts background agents from ea…
juliusmarminge Oct 17, 2026
c783897
refactor(web): the diff panel keeps its caching without "use memo" ho…
juliusmarminge Oct 17, 2026
d4314e8
refactor(web): the composer builds model options without a "use memo"…
juliusmarminge Oct 17, 2026
8dbfd92
refactor(web): the preview bridge keeps its stable thread ref without…
juliusmarminge Oct 17, 2026
ba9e9f5
refactor(web): the pull request code tab keeps its caching with one "…
juliusmarminge Oct 17, 2026
275e7de
refactor(web): provider models keep their caching without "use memo" …
juliusmarminge Oct 17, 2026
583ad66
refactor(web): the thread lineage panel keeps its caching without "us…
juliusmarminge Oct 17, 2026
3f480b8
refactor(web): the attachment preview keeps its caching without "use …
juliusmarminge Oct 17, 2026
4500480
refactor(web): the pending user input panel keeps its caching without…
juliusmarminge Oct 17, 2026
e6c0c5e
refactor(web): the queued runs control keeps its caching without "use…
juliusmarminge Oct 17, 2026
83ffe0a
refactor(web): the open-in picker keeps its caching without "use memo…
juliusmarminge Oct 17, 2026
a89a797
refactor(web): highlighted tokens keep their caching without "use mem…
juliusmarminge Oct 17, 2026
c0fda31
refactor(web): merged settings stay cached without "use memo" (#20765)
juliusmarminge Oct 17, 2026
edc703b
fix(server): a running Claude workflow member shows its answer so far…
juliusmarminge Oct 17, 2026
1e43699
refactor(web): the keybindings panel keeps its caching without "use m…
juliusmarminge Oct 17, 2026
bcd3c12
refactor(web): linked pull request status keeps its caching without "…
juliusmarminge Oct 17, 2026
af39520
refactor(web): the new-thread hook keeps its caching without "use mem…
juliusmarminge Oct 17, 2026
73af712
refactor(web): review file patches keep their caching without "use me…
juliusmarminge Oct 17, 2026
f4da080
chore(web): React compiler rules apply to every web file (#20791)
juliusmarminge Oct 17, 2026
8e0d5e5
refactor(server): resolve project and worktree folders in one place (…
juliusmarminge Oct 17, 2026
73d70a4
refactor(server): route git config through one env helper and end opt…
juliusmarminge Oct 17, 2026
144aae4
test(web): React tests run compiled in a real browser (#20797)
juliusmarminge Oct 17, 2026
23a5c77
fix(android): menu icons take taps (#20802)
juliusmarminge Oct 17, 2026
b987b57
fix(android): a composer focused through an app switch stays above th…
juliusmarminge Oct 17, 2026
b30f0df
refactor(web): the usage chart keeps its caching without "use memo" (…
juliusmarminge Oct 17, 2026
55ca0bb
refactor(web): pull request detail keeps its caching without "use mem…
juliusmarminge Oct 17, 2026
2c722ba
refactor(web): the legacy sidebar keeps its caching without "use memo…
juliusmarminge Oct 17, 2026
1c33a19
refactor(web): turn diff summaries keep their caching without "use me…
juliusmarminge Oct 17, 2026
805b98e
refactor(web): the pull requests page keeps its caching without "use …
juliusmarminge Oct 17, 2026
c60afa2
refactor(web): the terminal drawer keeps its caching without "use mem…
juliusmarminge Oct 17, 2026
44ecfd6
refactor(web): the model picker keeps its caching without "use memo" …
juliusmarminge Oct 17, 2026
78f8d38
refactor(web): pull request code tab keeps its caching without "use m…
juliusmarminge Oct 17, 2026
8eddd16
refactor(web): find reveal refs stay cached without "use memo" (#20818)
juliusmarminge Oct 17, 2026
767da3b
refactor(web): the branch selector keeps its caching without "use mem…
juliusmarminge Oct 17, 2026
efdaa4b
refactor(web): the guide excerpt keeps its caching without "use memo"…
juliusmarminge Oct 17, 2026
f9baf51
refactor(web): chat composer keeps its caching without "use memo" (#2…
juliusmarminge Oct 17, 2026
8c67f77
refactor(web): the usage page keeps its caching without "use memo" (#…
juliusmarminge Oct 17, 2026
f03378f
refactor(web): the hosted browser webview keeps its caching without "…
juliusmarminge Oct 17, 2026
e6ced71
refactor(web): the command palette provider lookup keeps its caching …
juliusmarminge Oct 17, 2026
2fbd431
chore(web): lint rejects "use memo" directives (#20843)
juliusmarminge Oct 17, 2026
2171c50
perf(web): relative "checked" labels re-render only when their text c…
juliusmarminge Oct 17, 2026
da0792e
perf(web): toggling a client setting no longer re-renders every setti…
juliusmarminge Oct 17, 2026
1994d63
perf(web): typing in the ACP registry search no longer re-renders eve…
juliusmarminge Oct 17, 2026
734e887
perf(web): searching keybindings only renders rows entering or leavin…
juliusmarminge Oct 17, 2026
74ca17b
perf(web): unchanged model picker rows skip re-rendering while search…
juliusmarminge Oct 17, 2026
489d08a
perf(web): router updates no longer re-render thread route consumers …
juliusmarminge Oct 17, 2026
130f4a2
perf(web): a minute tick no longer re-renders every sidebar thread ro…
juliusmarminge Oct 17, 2026
759f68f
test(web): jsdom-leftovers tests run in a real browser (#20862)
juliusmarminge Oct 17, 2026
e4fb9f2
test(web): hook-harness tests run in a real browser (#20866)
juliusmarminge Oct 17, 2026
a75a6d7
test(web): misc-b tests run in a real browser (#20869)
juliusmarminge Oct 17, 2026
476a010
test(web): settings tests run in a real browser (#20872)
juliusmarminge Oct 17, 2026
ecd95d5
test(web): misc-a tests run in a real browser (#20868)
juliusmarminge Oct 17, 2026
b827ca4
test(web): chat tests run in a real browser (#20870)
juliusmarminge Oct 17, 2026
89b42bf
test(web): browser tests from different checkouts no longer fight ove…
juliusmarminge Oct 17, 2026
52d593c
fix(web): chat view no longer renders twice per update (#20847)
juliusmarminge Oct 17, 2026
1d00edb
perf(web): markdown replies no longer re-render on reconnects and con…
juliusmarminge Oct 17, 2026
ecb938d
perf(web): provider status pushes no longer re-render every timeline …
juliusmarminge Oct 17, 2026
bc5f754
perf(client): a reconnect snapshot keeps unchanged skills and provide…
juliusmarminge Oct 17, 2026
5c8528f
perf(web): a client setting write only re-renders readers whose value…
juliusmarminge Oct 17, 2026
f96aebe
perf(web): right panel tabs no longer all re-render on unrelated chat…
juliusmarminge Oct 17, 2026
d56c479
perf(web): opening chat and usage dialogs no longer re-renders the wh…
juliusmarminge Oct 17, 2026
812b700
perf(web): typing in form dialogs no longer re-renders the dialog chr…
juliusmarminge Oct 17, 2026
87ce906
fix(web): a project action's error belongs to the request that opened…
juliusmarminge Oct 17, 2026
efef7cb
test(web): the open-in picker test waits for the menu to close (#20892)
juliusmarminge Oct 17, 2026
2fae0f9
perf(web): opening an image preview no longer re-renders the chat vie…
juliusmarminge Oct 17, 2026
edb2155
perf(web): another thread streaming no longer re-renders the app root…
juliusmarminge Oct 17, 2026
4d679a6
perf(client): equal query refetches no longer re-render PR rows (#20850)
juliusmarminge Oct 17, 2026
4a5dade
perf(client): provider status pushes no longer re-render environment …
juliusmarminge Oct 17, 2026
db5919d
perf(web): a provider status push no longer re-renders every provider…
juliusmarminge Oct 17, 2026
07680cf
test(web): onboarding and usage tests run in a real browser (#20902)
juliusmarminge Oct 17, 2026
c20eab4
test(web): pr-and-diff tests run in a real browser (#20901)
juliusmarminge Oct 17, 2026
da7c4f2
test(web): chat markdown and timeline tests run in a real browser (#2…
juliusmarminge Oct 17, 2026
133f57a
test(web): provider, usage and relationship tests run in a real brows…
juliusmarminge Oct 17, 2026
4b1024d
perf(web): the open thread's chat chrome no longer re-renders on ever…
juliusmarminge Oct 17, 2026
d5b7095
test(web): every React test runs in a real browser (#20944)
juliusmarminge Oct 17, 2026
25159b6
fix(release): release tests install Chromium for the web browser test…
juliusmarminge Oct 17, 2026
7e0418a
fix(server): drop V1 projections nothing reads after the V2 upgrade (…
juliusmarminge Oct 17, 2026
13aa882
feat(server): t3 doctor can delete the database from before 0.1.0 (#2…
juliusmarminge Oct 17, 2026
4a1a008
chore: sync upstream main and port the embedded runtime to provider-core
onmax 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.
10 changes: 2 additions & 8 deletions .coderabbit.config.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
import { defineConfig, type CodeRabbitContext } from "@coderabbitai/config";

// Org members and collaborators merge their own pull requests. On anyone else's, CodeRabbit
// requests changes until its comments are resolved, then approves.
const UNGATED_AUTHORS = new Set(["OWNER", "MEMBER", "COLLABORATOR"]);
const isGated = ({ pr }: CodeRabbitContext) => !UNGATED_AUTHORS.has(pr?.authorAssociation ?? "");

export default defineConfig((ctx) => ({
reviews: {
high_level_summary: false,
review_status: false,
request_changes_workflow: isGated(ctx),
request_changes_workflow: false,
allow_author_approval: !isGated(ctx),
auto_review: {
enabled: true,
Expand All @@ -18,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: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/via-triage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ body:
id: version
attributes:
label: Version
description: Installed t3 version or commit.
description: Version the bug happened on (not the `t3 triage` CLI version), or unknown.
placeholder: 0.0.33
validations:
required: true
Expand Down
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