Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1862 commits
Select commit Hold shift + click to select a range
7781e52
refactor(web): composer attachment tiles live in their own component …
juliusmarminge Oct 21, 2026
9576c45
refactor(web): resting image previews and queued attachments are thei…
juliusmarminge Oct 21, 2026
94bce7f
refactor(web): composer mode controls and footer actions live in Comp…
juliusmarminge Oct 21, 2026
17e62e7
refactor(web): typing no longer re-renders the composer model picker …
juliusmarminge Oct 21, 2026
b7b905d
refactor(web): composer suggestion lists are built by useComposerMenu…
juliusmarminge Oct 21, 2026
00ceb2d
refactor(web): the sidebar's thread rows live in their own file (#22696)
juliusmarminge Oct 21, 2026
e7f62ef
refactor(web): sidebar list markers and draft rows live in their own …
juliusmarminge Oct 21, 2026
ad4f18d
feat(dev): first dev start seeds real data and warms deps (#22744)
t3dotgg Oct 21, 2026
09bd654
refactor(web): the pull requests column lives in its own component (#…
juliusmarminge Oct 21, 2026
b302290
refactor(web): the pull request header's crumbs, title editor and bas…
juliusmarminge Oct 21, 2026
8f7de11
refactor(web): the pull request header's actions live in their own co…
juliusmarminge Oct 21, 2026
5db0045
refactor(web): the pull request detail loader lives in its own hook (…
juliusmarminge Oct 21, 2026
787e0e4
refactor(web): the pull request list's rows read the speed-mode modif…
juliusmarminge Oct 21, 2026
5a31f4c
refactor(web): the pull requests page's scope and grouping hooks live…
juliusmarminge Oct 21, 2026
35b0566
refactor(web): the pull requests route only validates its search; the…
juliusmarminge Oct 21, 2026
57d7844
perf(web): Shift re-renders only each row's quick-action group (#22726)
juliusmarminge Oct 21, 2026
a003b73
refactor(web): the pull request list's grouping helper lives in a log…
juliusmarminge Oct 21, 2026
5f0a0d1
refactor(web): chat markdown code blocks live in their own module (#2…
juliusmarminge Oct 21, 2026
36bda3c
refactor(web): the Mermaid code block lives in its own component file…
juliusmarminge Oct 21, 2026
5c5d6ed
refactor(web): chat markdown tables and details live in their own com…
juliusmarminge Oct 21, 2026
827f6d4
refactor(web): chat markdown links and file chips live in their own m…
juliusmarminge Oct 21, 2026
7ffc3bb
refactor(web): chat markdown images and videos live in their own modu…
juliusmarminge Oct 21, 2026
9c3e743
refactor(web): ChatView's module-level helpers live in their own file…
juliusmarminge Oct 21, 2026
a97f7f8
refactor(web): ChatView's persistent terminal drawers live in their o…
juliusmarminge Oct 21, 2026
8da8f61
refactor(web): ChatView's right panel lives in its own component (#22…
juliusmarminge Oct 21, 2026
6b13e8f
refactor(web): ChatView's timeline follow and anchoring lives in useT…
juliusmarminge Oct 21, 2026
030be16
refactor(web): ChatView's machine and server-update banners live in u…
juliusmarminge Oct 21, 2026
bd7aab2
refactor(web): ChatView's subagent, goal, background-work and branch …
juliusmarminge Oct 21, 2026
91a0a29
refactor(web): ChatView's draft machine routing lives in useDraftEnvi…
juliusmarminge Oct 21, 2026
38b13e9
refactor(web): ChatView's send preparation is pure functions in ChatV…
juliusmarminge Oct 21, 2026
0b91504
refactor(web): the archived threads settings page lives in its own fi…
juliusmarminge Oct 21, 2026
568cbb4
refactor(web): the typography settings section lives in its own file …
juliusmarminge Oct 21, 2026
501f5c5
refactor(web): the appearance settings page lives in its own file (#2…
juliusmarminge Oct 21, 2026
381514e
refactor(web): the background activity setting and its dialog live in…
juliusmarminge Oct 21, 2026
9dc28a1
refactor(web): the connections page's pure helpers live in Connection…
juliusmarminge Oct 21, 2026
263eef2
refactor(web): authorized clients and endpoint rows live in their own…
juliusmarminge Oct 21, 2026
848e352
refactor(web): saved and T3 Connect environment rows live in their ow…
juliusmarminge Oct 21, 2026
efdda5e
perf(server): skip the macOS xcrun git shim (#22759)
t3dotgg Oct 21, 2026
6490a9e
docs(agents): read vendored .repos with git show when sparse-excluded…
t3dotgg Oct 21, 2026
21da306
fix(web): ⌘Z undoes a settle even when the composer has focus (#22607)
t3dotgg Oct 21, 2026
74541ba
feat(scripts): one command checks what the branch changed (#22767)
t3dotgg Oct 21, 2026
1f4eae7
fix(scripts): check:changed no longer skips knip after a removed impo…
t3dotgg Oct 21, 2026
1dfb572
perf(dev): faster first load for shared dev servers (#22776)
t3dotgg Oct 21, 2026
8fe4206
fix(server): stalled clones say "Stalled" instead of a frozen speed (…
t3dotgg Oct 21, 2026
a8bb769
fix(web): steers split a finished turn's work instead of stacking und…
t3dotgg Oct 21, 2026
e27a03e
fix(web): images on their own line no longer sit beside their label (…
t3dotgg Oct 21, 2026
688ee52
fix(release): include pnpm hook in Vercel uploads (#22813)
t3dotgg Oct 21, 2026
1688f96
fix(release): keep Vercel warnings out of deployment URLs (#22817)
t3dotgg Oct 21, 2026
96f09c6
fix(queue): send selected held messages when a thread is stopped (#22…
Yash-Singh1 Oct 21, 2026
066c8fc
fix(server): delegated Claude children follow your subagent cache TTL…
t3dotgg Oct 21, 2026
448b8a9
fix(server): t3 pair in a worktree no longer falls back to the live i…
t3dotgg Oct 21, 2026
370b9ae
fix(server): avoid expensive diff minimization in status refreshes (#…
voltcrash Oct 21, 2026
aacd1ee
fix(codex): keep every path of a multi-file patch (#22541)
only21mil Oct 21, 2026
588150e
fix(gitlab): merge request diffs page 30 files at a time so GitLab 15…
Mnigos Oct 21, 2026
2d40894
fix(server): keep Antigravity question options and no-custom-answer f…
fixfon Oct 21, 2026
1d9060b
fix(server): commit prompts no longer repeat CLAUDE.md when it matche…
t3dotgg Oct 21, 2026
b260a7c
fix(mcp): point a bare thread uuid at its mcp: thread in thread_not_f…
fixfon Oct 21, 2026
2f021ee
fix(opencode): out-of-funds failures show OpenCode's message instead …
fixfon Oct 21, 2026
35e5d62
fix(shared): accept a pasted ChatGPT callback URL that is missing htt…
Project516 Oct 21, 2026
a7c22f1
fix(server): the background service picks up JAVA_HOME from the login…
t3dotgg Oct 21, 2026
e822ba7
fix(server): answered questions say "already answered" instead of "no…
t3dotgg Oct 21, 2026
810e8f6
fix(desktop): an abandoned browser sign-in no longer blocks T3 Connec…
t3dotgg Oct 21, 2026
680152e
fix(server): agents get a short, current model list instead of a 55k-…
t3dotgg Oct 21, 2026
9179178
docs(agents): proof for a bug fix depends on the bug (#23008)
juliusmarminge Oct 21, 2026
fa42465
fix(server): removing a worktree on Windows no longer deletes what it…
SunkenInTime Oct 21, 2026
5a0d159
perf(web): a streaming thread re-renders only its own sidebar row (#2…
juliusmarminge Oct 21, 2026
0bdf33a
refactor(web): the add environment dialog owns its form state (#22686)
juliusmarminge Oct 21, 2026
4196708
fix(desktop): use Clerk's upstream fix for abandoned browser sign-ins…
wobsoriano Oct 21, 2026
d27c606
feat: show automation messages as compact timeline rows (#22638)
juliusmarminge Oct 21, 2026
e749245
feat(server,web,mobile): approvals in full access say why Claude aske…
juliusmarminge Oct 21, 2026
d13fc84
feat(claude): idle compaction has a global default and per-instance o…
juliusmarminge Oct 21, 2026
c19d997
perf(web): typing no longer re-renders the traits picker or attach bu…
juliusmarminge Oct 21, 2026
22fd2ac
refactor(web): the composer's layout and provider hooks live in their…
juliusmarminge Oct 21, 2026
0755f98
refactor(web): the prompt stash lives in useComposerStash (#23046)
juliusmarminge Oct 21, 2026
fa37002
refactor(web): composer context imports live in useComposerContextImp…
juliusmarminge Oct 21, 2026
98c494e
refactor(web): composer file intake lives in useComposerAttachmentInt…
juliusmarminge Oct 21, 2026
1444b3f
refactor(web): the composer's footer controls render in ComposerContr…
juliusmarminge Oct 21, 2026
e78f580
refactor(web): composer key handling lives in useComposerCommandKey (…
juliusmarminge Oct 21, 2026
f136d5a
refactor(web): ChatView's send paths live in useComposerSend (#23062)
juliusmarminge Oct 21, 2026
379a391
refactor(web): ChatView's terminal actions live in useChatTerminalAct…
juliusmarminge Oct 21, 2026
ebe828c
refactor(web): ChatView's right panel actions live in useRightPanelAc…
juliusmarminge Oct 21, 2026
92105d4
refactor(web): ChatView's snooze, settle, and checkout actions live i…
juliusmarminge Oct 21, 2026
9f087f7
refactor(web): ChatView's revert, rollback, and fork live in useTimel…
juliusmarminge Oct 21, 2026
5b8298c
refactor(web): ChatView's attachment preview handoff lives in useAtta…
juliusmarminge Oct 21, 2026
7be791c
refactor(web): ChatView's project clone banner lives in useProjectClo…
juliusmarminge Oct 21, 2026
976a601
refactor(web): ChatView's model, mode, and workspace choices live in …
juliusmarminge Oct 21, 2026
114f77f
refactor(web): ChatView's pull request checkout lives in usePullReque…
juliusmarminge Oct 21, 2026
9952a7a
refactor(web): ChatView's thread derivations are tested functions in …
juliusmarminge Oct 21, 2026
322d08d
refactor(web): ChatView's paste-to-focus, titlebar controls, and time…
juliusmarminge Oct 21, 2026
f54dfc0
fix(cursor): a closed-stream write in the Cursor SDK no longer stops …
t3dotgg Oct 21, 2026
c25ba72
fix(server): Codex no longer offers a one-click update for installs i…
koushikxd Oct 21, 2026
9892aca
fix(pi): declare properties on MCP tool schemas that omit them (#21822)
tlconde Oct 21, 2026
2936b90
fix(server): a desktop backend whose launcher died shuts down cleanly…
SunkenInTime Oct 21, 2026
71b8670
fix(mobile): chat feed no longer re-derives on every render (#22913)
t3dotgg Oct 21, 2026
9c6523d
docs(user): the outside agents guide says which addresses agents can …
Gourav224 Oct 21, 2026
60dc0a0
fix(server): HTML preview reports a browser start error instead of an…
t3dotgg Oct 21, 2026
0d876e0
fix(tailscale): a timed-out tailscale probe no longer outlives its ca…
t3dotgg Oct 21, 2026
8541f86
docs(composer): queued messages follow the Follow-up behavior setting…
t3dotgg Oct 21, 2026
f087810
fix(server): failed provider updates say why (#22506)
koushikxd Oct 21, 2026
da46db6
test(telemetry): keep fixture PIDs from colliding with the test worke…
only21mil Oct 21, 2026
2a27e15
fix(server): server tests resolve the macOS temp dir symlink (#21442)
nabettu Oct 21, 2026
aef8b6f
fix(scripts): mobile lint fails instead of passing when ktlint or det…
t3dotgg Oct 21, 2026
ee11fbd
fix(server): t3_thread_read clamps oversized page sizes instead of fa…
t3dotgg Oct 21, 2026
d0c5d7c
fix(mobile): opening a pull request no longer crashes with "Maximum u…
nabettu Oct 21, 2026
b9c1293
fix(web): PR Code tab keeps its files after a refresh with an unchang…
t3dotgg Oct 21, 2026
38d993f
fix(web): finished provider updates no longer leave a hidden spinner …
t3dotgg Oct 21, 2026
5c3721e
fix(composer): mentions of files like `posts.$postId.tsx` or `[id].ts…
t3dotgg Oct 21, 2026
5b715cc
refactor(web): resuming an interrupted run lives in its own hook (#23…
juliusmarminge Oct 21, 2026
36d1e2f
refactor(web): proposed-plan follow-ups and implement-in-new-thread l…
juliusmarminge Oct 21, 2026
ac23b74
refactor(web): multiple-model sends live in their own hook (#23094)
juliusmarminge Oct 21, 2026
beec3c8
refactor(web): the composer send reads its own settings and draft ins…
juliusmarminge Oct 21, 2026
b34f74c
refactor(web): ComposerControlsBar renders without a memo() wrapper (…
juliusmarminge Oct 21, 2026
764fff2
refactor(web): chat shortcuts live with the hooks that own their acti…
juliusmarminge Oct 21, 2026
a642ab2
refactor(web): ChatView's timeline banners render in ChatBannerLane (…
juliusmarminge Oct 21, 2026
968dd51
fix(web): the branch toolbar and thread details panel stay cached whi…
juliusmarminge Oct 21, 2026
1b22228
fix(server): scheduled tasks no longer jump to the top when toggled (…
t3dotgg Oct 21, 2026
22b89ef
fix(server): Forgejo and GitCafe pull requests link to their threads …
MarcoDotIO Oct 21, 2026
fb7f087
fix(server): pushes the remote refuses say why instead of a generic f…
t3dotgg Oct 21, 2026
1ee0241
fix(composer): typing a price no longer opens the skill menu (#21519)
MarcoDotIO Oct 21, 2026
a35066d
fix(web): thread details PR merge uses the last selected merge method…
tris203 Oct 21, 2026
bee9ce8
fix(web): a Usage toggle shortcut now goes back instead of staying on…
t3dotgg Oct 21, 2026
159f2b8
fix(web): quote comment box stays on screen for long code lines (#22149)
EtanHey Oct 21, 2026
86fa9e0
fix(web): right panel launcher letters open their surface instead of …
t3dotgg Oct 21, 2026
edce5f0
fix(web): ../ file links outside the workspace open as host files (#2…
t3dotgg Oct 21, 2026
6de7da5
fix(shared): recognize relative folder links with trailing slash (#22…
macodev00 Oct 21, 2026
1a44c40
fix(client): usage limits skip disabled connections (#22936)
M4NU5 Oct 21, 2026
7845898
fix(web): imported VS Code themes keep destructive buttons red (#21924)
lgollut Oct 21, 2026
855db96
fix(shared): Azure DevOps repositories with a space in the name list …
Tabonx Oct 21, 2026
2333f16
fix(opencode): cancelled todos no longer keep the todo list running (…
MarcoDotIO Oct 21, 2026
0f74ff8
fix(web): copy to machine clones the fork, not its upstream (#22492)
AKolenda Oct 21, 2026
1befc71
fix(server): JetBrains IDEs open file links at the right column (#22826)
levochkaa Oct 21, 2026
70e5e38
fix(server): sync pull request draft status changes (#22832)
Yash-Singh1 Oct 21, 2026
bd6940b
test(web): chat shortcut test types through the composer handle (#23126)
juliusmarminge Oct 21, 2026
a12d6ed
Merge commit from fork
juliusmarminge Oct 21, 2026
b5a226e
fix(source-control): merge messages drop Claude Code's current claude…
MarcoDotIO Oct 21, 2026
ed9b7ca
fix(build): pin Node 26.12.1 for development and standalone releases …
PixPMusic Oct 22, 2026
9cdd059
fix(mobile): keep Duo toolbar actions clear of workspace tabs (#22976)
juliusmarminge Oct 22, 2026
ec2fd4d
fix(mobile): respect Duo safe areas in overlays (#22977)
juliusmarminge Oct 22, 2026
eec07b6
fix(mobile): retain resting scroll offsets through Duo inset changes …
juliusmarminge Oct 22, 2026
61bdec0
fix(mobile): deliver the first tab selection after Duo folding (#22979)
juliusmarminge Oct 22, 2026
13eea3f
fix(mobile): use native full-width sheets on iPhone Duo (#22980)
juliusmarminge Oct 22, 2026
added62
fix(mobile): the pull requests tab's empty detail asks for a pull req…
juliusmarminge Oct 22, 2026
801701d
fix(mobile): the iPhone Duo keeps list titles through folds and unfol…
juliusmarminge Oct 22, 2026
9fa551a
fix(mobile): the iPhone Duo searches from a field at the bottom of it…
juliusmarminge Oct 22, 2026
37d6fce
fix(mobile): a closed search no longer risks freezing the app (#23146)
juliusmarminge Oct 22, 2026
5ed2ea2
fix(mobile): folding the Duo keeps the thread's end or the reader's l…
juliusmarminge Oct 22, 2026
e6c2aeb
fix(mobile): the iPhone Duo's search field and composer line up with …
juliusmarminge Oct 22, 2026
83a8501
fix(mobile): Screens 5.0.0-t3.36 stops an iPhone Duo unfold crash (#2…
juliusmarminge Oct 22, 2026
89fe509
fix(mobile): the iPhone Duo's inspector panes use the full column (#2…
juliusmarminge Oct 22, 2026
8acbefe
fix(gitcafe): show line counts on linked and listed pull requests (#2…
maria-rcks Oct 22, 2026
49e97d4
docs(import): correct conversation size and batch limits (#23226)
only21mil Oct 22, 2026
6f6f68a
fix(server): stop abandoned turns before continuing threads (#23169)
Yash-Singh1 Oct 22, 2026
f8e4834
feat(server): export how long runs take and how they end (#22094)
juliusmarminge Oct 22, 2026
6318bfc
fix(mobile): new-thread heading clears the iPad header (#23206)
juliusmarminge Oct 22, 2026
aa0158d
fix(pi): fork completed turns while the next turn is running (#23052)
juliusmarminge Oct 22, 2026
b295dd8
fix(mobile): drafts swipe to discard and every row move animates (#23…
juliusmarminge Oct 22, 2026
defb7e6
feat(server): webhook filters fan out over arrays with a [] path wild…
juliusmarminge Oct 22, 2026
3690c86
fix(web): Arabic and Hebrew text reads and navigates right to left (#…
yzn-h Oct 22, 2026
a98ebde
fix(client-runtime): refresh Git refs when the RPC session changes (#…
Yash-Singh1 Oct 22, 2026
05b697f
fix(web): cap list layout passes to prevent React error 185 (#23315)
Yash-Singh1 Oct 22, 2026
e075957
fix(mobile): align iPad composer without shifting on keyboard focus (…
juliusmarminge Oct 22, 2026
6e3c5e6
feat(gitcafe): request reviewers and apply labels on GitCafe pull req…
juliusmarminge Oct 22, 2026
a49d18c
fix(source-control): clones retry over HTTPS when the SSH key is refu…
juliusmarminge Oct 22, 2026
efa5381
fix(mobile): the iOS composer reopens where you left a long draft (#2…
shivamhwp Oct 22, 2026
002e941
fix(mobile): preserve new-thread drafts and native header layout (#23…
juliusmarminge Oct 22, 2026
6f75bcb
feat: ChatGPT Business usage limits offer a copyable admin request (#…
juliusmarminge Oct 22, 2026
3b95e78
fix(web): paused sidebar videos stop reloading after every command (#…
shivamhwp Oct 22, 2026
4040867
chore(typecheck): typescript is the tsc-rs drop-in, no effect-tsgo pa…
t3dotgg Oct 22, 2026
96bae54
fix(mobile): Dynamic Island status no longer wraps next to other Live…
t3dotgg Oct 22, 2026
83f118a
perf(web): streamed reply text no longer re-renders ChatView (#23117)
juliusmarminge Oct 22, 2026
ee33c4c
perf(web): visit marks during a reply no longer re-render ChatView (#…
juliusmarminge Oct 22, 2026
5ffe045
fix(server): a Claude agent stops when the server that started it die…
shivamhwp Oct 22, 2026
ff52547
fix(server): SSH hosts no longer keep every old 300 MB runtime after …
shivamhwp Oct 22, 2026
43879d9
fix(settings): older clients connect again after idle compaction mode…
juliusmarminge Oct 22, 2026
8d3b061
fix(mobile): unify draft and thread navigation and composer behavior …
juliusmarminge Oct 22, 2026
ed3f965
ci: setup survives npm registry outages (#23582)
t3dotgg Oct 22, 2026
f054d1b
feat(web,mobile): messages from other agents fold into one-line rows …
shivamhwp Oct 22, 2026
60b35a1
fix(web): subagent bar keeps model and status readable in narrow chat…
shivamhwp Oct 22, 2026
f055995
fix(chat): mark tool images beyond the preview limit (#23595)
only21mil Oct 22, 2026
b9aaff4
fix(web): provider updates no longer pop toasts on launch (#23233)
flamboh Oct 22, 2026
f460ddb
fix(server): probe the Windows startup environment asynchronously (#2…
UtkarshUsername Oct 22, 2026
5e8c5eb
fix(usage): count initial Codex requests with inherited totals (#23729)
PixPMusic Oct 22, 2026
4eae8ae
chore(mobile): bump app version to 2.1.0
t3-code[bot] Oct 22, 2026
e54e71d
fix(web): let toast content use the full accordion width (#23777)
Yash-Singh1 Oct 22, 2026
044f072
fix(web): sidebar follows the active thread after history navigation …
juliusmarminge Oct 22, 2026
fd1063b
fix(server): keep subagent transcript updates off shell stream (#23783)
Yash-Singh1 Oct 22, 2026
22840ab
fix(deps): pin all patched package versions (#23798)
juliusmarminge Oct 22, 2026
52c2b38
docs: document the GitCafe mirror and refresh the dev setup (#23808)
juliusmarminge Oct 22, 2026
d7f3b72
fix: no more em dashes in product copy (#23799)
t3dotgg Oct 22, 2026
ef92441
chore(release): prepare v0.1.2
t3-code[bot] Oct 22, 2026
2c8bdf6
chore(mobile): bump Clerk Expo SDKs to the new native client sync (#2…
wobsoriano Oct 22, 2026
ff31a2a
fix(mobile): capture folded and unfolded Duo store screenshots (#23849)
juliusmarminge Oct 22, 2026
cf3acd9
fix(server): preserve typed requirements as the RPC group grows (#23813)
juliusmarminge Oct 22, 2026
b3c0109
fix(server): wake PR watches when no checks report (#23863)
juliusmarminge Oct 22, 2026
11adcb0
fix(server): resume Codex parents after native children finish (#23840)
juliusmarminge Oct 22, 2026
f9c1d02
fix(gitcafe): authored lists, merge progress, and author reviews matc…
juliusmarminge Oct 22, 2026
52bb5c8
fix(forgejo): merges follow the repository's delete-branch setting (#…
juliusmarminge Oct 22, 2026
200dad3
fix(web): keep PR check counts in sync (#23548)
juliusmarminge Oct 22, 2026
c7e3993
fix(server): speed up shell snapshots on large databases (#23751)
Yash-Singh1 Oct 22, 2026
478fdfc
fix(server): keep managed Codex token renewal in the server (#21786)
juliusmarminge Oct 22, 2026
f5cf9a0
fix(server): renew active managed Codex turns through native auth (#2…
juliusmarminge Oct 22, 2026
e78297d
feat(web): telemetry export settings show where the running endpoint …
yordis Oct 22, 2026
23bd753
fix(ui): preserve tool icon detail in light mode (#23896)
juliusmarminge Oct 22, 2026
1c8e79e
fix(mcp): accept GitCafe pull request URLs in link/unlink/watch tools…
juliusmarminge Oct 23, 2026
5127302
feat(settings): add thread title instructions (#21882)
CadenEl Oct 23, 2026
18e2742
fix(mobile): undo toasts keep their action on one row (#23910)
saphid Oct 23, 2026
50e151c
docs(connect): correct the relay webhook endpoint key (#23526)
juliusmarminge Oct 23, 2026
05cd55d
fix(mobile): center Android composer text and pad wrapped drafts (#23…
PixPMusic Oct 23, 2026
09bb9f1
fix(server): wake PR watches when remaining CI checks finish (#23904)
juliusmarminge Oct 23, 2026
a8dba9c
fix(mobile): the empty composer row shows only the provider icon (#23…
flamboh Oct 23, 2026
6ed47b5
fix(server): route SQLite reads around writer contention (#23902)
Yash-Singh1 Oct 23, 2026
b7e802b
fix(claude): route approval feedback to the requesting agent (#23657)
Yash-Singh1 Oct 23, 2026
0c25c29
fix(web): align pull request file counts with diff stats (#23905)
Yash-Singh1 Oct 23, 2026
9b7e7df
fix(web): task durations over an hour no longer wrap in the tasks pan…
jamesvillarrubia Oct 23, 2026
53245cc
fix(server): preserve Codex sign-in guidance in usage notices (#17055)
jieyuexing Oct 23, 2026
7e52513
fix(server): restore Claude subscription usage through proxies (#12069)
Kanaliseren Oct 23, 2026
71a283a
fix(server): Forgejo skipped jobs no longer keep a pull request watch…
Mnigos Oct 23, 2026
a68e6e9
fix(mobile): move Android undo toasts above bottom navigation (#23928)
PixPMusic Oct 23, 2026
9a63802
perf(server): skip unused Git output line parsing (#23953)
juliusmarminge Oct 23, 2026
e64a6d4
fix(server): abort interrupted ACP MCP fetches (#23955)
juliusmarminge Oct 23, 2026
56c365c
fix(web): new threads no longer hang when a project's machine is offl…
t3dotgg Oct 23, 2026
6d9ec7b
fix(pi): stop blank input placeholders from failing the run (#23235)
only21mil Oct 23, 2026
656f3f4
fix(cursor): fail turns that end in a transport error after commentar…
only21mil Oct 23, 2026
49597c7
test(forgejo): answer the base branch read in the skipped-checks test…
juliusmarminge Oct 23, 2026
807319c
fix(opencode): retry failed model catalogs until they recover (#23939)
Yash-Singh1 Oct 23, 2026
d7a8d6f
fix(server): avoid full shell read on resume (#23987)
Yash-Singh1 Oct 23, 2026
51a7118
test: delete low-value tests and dead test-only exports (#24058)
t3dotgg Oct 23, 2026
12c91ae
test(server): restore DST scheduling tests deleted in the test snap (…
t3dotgg Oct 23, 2026
30a405b
test(web): restore project settings permission tests deleted in the t…
t3dotgg Oct 23, 2026
0cb033c
test(mobile): restore clipboard secret-redaction test deleted in the …
t3dotgg Oct 23, 2026
7d6b5be
fix(web): Cmd+B toggles the sidebar unless text is selected (#24063)
t3dotgg Oct 23, 2026
1aa7179
fix(server): agent-browser and Chrome no longer outlive the agent tha…
josephv123 Oct 23, 2026
abffeed
test(client-runtime): restore render scheduler tests deleted in the t…
t3dotgg Oct 23, 2026
4812dca
fix(web): cmd+k search hides subagents and favors recent, whole-word …
t3dotgg Oct 23, 2026
24c063a
test(lint): new polling loops in tests now fail lint (#23983)
t3dotgg Oct 23, 2026
b2377db
ci: unused dependency patches fail in check:changed, not after push (…
t3dotgg Oct 23, 2026
6ba8078
fix(desktop): PDFs in the preview can be annotated (#24022)
shivamhwp Oct 23, 2026
16aaf5b
fix(web): instructed compact runs without a bare compaction first (#2…
juliusmarminge Oct 23, 2026
cccb78c
fix(desktop): reduce app crashes when a preview tab's renderer dies d…
shivamhwp Oct 23, 2026
fbc6a08
fix(server): Stop stops a thread's subagents again (#23886)
shivamhwp Oct 23, 2026
c58d558
fix(desktop): a stuck quit no longer leaves the app unkillable (#23873)
shivamhwp Oct 23, 2026
1df9c32
fix(web): keep blockquote text readable in every theme (#24036)
Yash-Singh1 Oct 23, 2026
c96a4bb
fix(bitbucket): stop the startup sweep from flooding Bitbucket with 4…
shivamhwp Oct 23, 2026
eb1510d
fix(web): screen readers hear when the open thread starts, needs you …
shivamhwp Oct 23, 2026
f7f02d7
perf(web): reduce allocations in streaming timeline scans (#23739)
UtkarshUsername Oct 23, 2026
9828cad
perf(web): reuse a collator when sorting changed-file trees (#23776)
UtkarshUsername Oct 23, 2026
66ee628
perf(scripts): check:changed finishes in about 10 s (#23581)
t3dotgg Oct 23, 2026
97be291
fix(web): size Usage header controls to the available width (#24123)
nateEc Oct 23, 2026
9f660d3
perf(server): speed up large terminal clipboard sequences (#23819)
AksharP5 Oct 23, 2026
671af5a
feat(server): read a shared settings file beneath settings.json
colonelpanic8 Oct 22, 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
4 changes: 2 additions & 2 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Dev container for T3 Code. Mirrors CI (ubuntu-24.04, Node 24, Rust stable)
// Dev container for T3 Code. Mirrors CI (ubuntu-24.04, Node 26, Rust stable)
// and the canonical setup in docs/operations/development.md: global `vp`, `vp i`.
// Contributor doc: docs/internals/devcontainer.md
{
Expand All @@ -8,7 +8,7 @@
// nodeGypDependencies (default true) brings python3/make/g++, which Linux
// needs for node-pty's node-gyp fallback (its prebuilds are mac/win only).
"ghcr.io/devcontainers/features/node:2": {
"version": "24"
"version": "26"
},
// native/resource-monitor (edition 2024, needs stable >= 1.85). The server
// degrades gracefully without the binary, but CI checks cargo fmt + test.
Expand Down
4 changes: 4 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,7 @@
# Batch files need CRLF for cmd.exe to parse them reliably.
*.cmd text eol=crlf
*.bat text eol=crlf
# GitHub's and Expo's GraphQL schemas and the operations graphqlgen writes from them.
packages/source-control-github/schema/** linguist-generated
apps/server/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[@]}"
67 changes: 67 additions & 0 deletions .github/actions/setup-ci-deps/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
name: Setup CI dependencies
description: Install Vite+ and the workspace dependencies from cache.
runs:
using: composite
steps:
# ~/.vite-plus holds vp, the Node.js runtime, and pnpm. A cache entry never
# updates, so the key names all three versions; otherwise a pnpm or Node.js
# bump makes every job download them from npm again.
- name: Resolve Vite+ version
id: vp
shell: bash
run: |
echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT"
echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT"
echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT"

- name: Cache Vite+
id: vp_cache
if: steps.vp.outputs.version != ''
uses: actions/cache@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 }}

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

- name: Setup Vite+
if: steps.vp_cache.outputs.cache-hit != 'true'
uses: voidzero-dev/setup-vp@v1
with:
node-version-file: package.json
cache: false
run-install: false

- name: Resolve pnpm store path
id: pnpm_store
shell: bash
run: |
store_path="$(vp pm cache dir)"
echo "path=$store_path" >> "$GITHUB_OUTPUT"

# setup-vp's shared cache key ignores install filters. Keep full installs in a
# separate namespace, including fallback restores.
# 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
with:
path: ${{ steps.pnpm_store.outputs.path }}
key: pnpm-full-v1-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('pnpm-lock.yaml', 'pnpm-workspace.yaml', 'package.json') }}
restore-keys: |
pnpm-full-v1-${{ runner.os }}-${{ runner.arch }}-

- name: Install dependencies
shell: bash
run: vp install
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
45 changes: 0 additions & 45 deletions .github/scripts/check-nightly-release.test.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,6 @@ for (const releaseChannel of ["stable", "nightly"]) {
);
assert.equal(calls.length, 0);
});

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

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

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

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

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

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

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

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

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

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

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