Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1664 commits
Select commit Hold shift + click to select a range
888a6a0
fix(server): include thread context in generated pull requests (#18291)
luhagel Oct 20, 2026
4de822c
fix(desktop): let lifecycle shutdown finish before exiting (#20303)
spencermorris04 Oct 20, 2026
bda042a
fix(server): subagent task updates reach Claude task lists (#20985)
TonybynMp4 Oct 20, 2026
71b2ac4
fix(server): pull requests load for credentials that cannot read /use…
LannyBose Oct 20, 2026
cfa6944
fix(gitlab): show authentication and rate-limit errors from activity …
saphid Oct 20, 2026
a752363
fix(provider-muse): workflow child approvals no longer flash in full …
ScottN-PV Oct 20, 2026
5d3875d
feat(server): compact idle Claude threads before the prompt cache exp…
t3dotgg Oct 20, 2026
31be0c4
fix(web): diff panel keeps collapsed files when switching right-panel…
JaiiR320 Oct 20, 2026
adda1db
fix(web): remember the pull request tab when switching threads (#18823)
SamuelBarnholdt Oct 20, 2026
115e405
fix(desktop): avoid temporary icon copies on Linux launches (#19589)
only21mil Oct 20, 2026
5b15a64
test(server): skip the flaky viewport capture test added by #19913 (#…
juliusmarminge Oct 20, 2026
44f977f
feat(server): let MCP agents inspect thread diffs and respond to appr…
maria-rcks Oct 20, 2026
2777514
fix(mobile): don't send or paste attached threads a machine can't rea…
NikitaMGrimm Oct 20, 2026
4296624
fix(acp): Droid answers no longer cancel AskUser (#20417)
travelvector Oct 20, 2026
8c51e4e
fix(server): Claude append-system-prompt launch arguments reach the m…
only21mil Oct 20, 2026
c2b127f
fix(claude): discover enabled installed plugin skills (#15662)
maria-rcks Oct 20, 2026
2bc2d80
revert: #15464 (MCP agents respond to approvals) (#22152)
juliusmarminge Oct 20, 2026
70a869d
fix(web): keep review thread replies with their finding in pull reque…
MarconLP Oct 20, 2026
23b550d
fix(vcs): stop Check out here from discarding local pull request work…
saphid Oct 20, 2026
a5b3de0
fix(acp): Antigravity html_render pages show in the thread (#19796)
neo-clon Oct 20, 2026
2767012
fix(composer): drafts follow model changes made on other clients (#20…
none23 Oct 20, 2026
1ba3c78
fix(web): Claude task lists stay in the composer between turns (#18392)
TonybynMp4 Oct 20, 2026
9482773
fix(server): coalesce queued shell updates for slow clients (#14859)
maria-rcks Oct 20, 2026
571d3bc
fix(server): viewport capture test waits for the requested size, not …
juliusmarminge Oct 20, 2026
aac2865
fix(server): OpenCode 2 turns show provider retries instead of silent…
nexxeln Oct 20, 2026
801dbf6
fix(server): persist run failures after storage recovers (#19646)
Alb11747 Oct 20, 2026
8866e8f
fix(web): align composer chip cleanup with undo history (#18466)
Gigioxx Oct 20, 2026
f57cfe1
fix(clients): copy filesystem paths with native separators (#19201)
tonyjosephsebastians Oct 20, 2026
bce474e
fix(web): constrain minimap highlights to visible rows (#16191)
UtkarshUsername Oct 20, 2026
b874ff6
fix(web): SnapShots taken during a question attach to that question (…
tiliakoos Oct 20, 2026
04ab2fc
fix(acp): explain rejected model selections (#19699)
StiensWout Oct 20, 2026
5d2406b
fix(web): release orphaned diff comment drafts (#18430)
saphid Oct 20, 2026
ce2815d
fix(server): re-read stack layers for every member when the stack gro…
only21mil Oct 20, 2026
b39f456
fix(server): Homebrew installs no longer run brew info with update ch…
tris203 Oct 20, 2026
ec736e3
test(server): skip the viewport capture test again, still flaky after…
juliusmarminge Oct 20, 2026
4836fa7
test(web): make the favicon picker offscreen-preview test determinist…
juliusmarminge Oct 20, 2026
069e63b
fix(web): VCS status refresh no longer trips the slow-request toast (…
t3dotgg Oct 20, 2026
b232fa9
fix(desktop): grant camera and microphone entitlements to the signed …
t3dotgg Oct 20, 2026
4f5ff17
fix(server): deliver subagent results without history handoffs (#22117)
juliusmarminge Oct 20, 2026
1efe762
chore(mobile): upgrade Uniwind to 1.13.0 (#22173)
Brentlok Oct 20, 2026
02b899b
fix(web): keep draft project names readable (#22177)
Yash-Singh1 Oct 20, 2026
b69703c
fix(server): verify the native display viewport capture without a win…
juliusmarminge Oct 20, 2026
e009276
fix(connect): show which part of a T3 Connect connection failed and h…
t3dotgg Oct 20, 2026
e287582
feat(server): analytics records a stable install id and who owns each…
t3dotgg Oct 20, 2026
5a86fe4
fix(mobile): Android no longer freezes when you go back from a runnin…
shivamhwp Oct 20, 2026
effb433
feat(web,server): add a project to another machine from Run on, .env …
t3dotgg Oct 20, 2026
e5c6083
fix(mobile): thread links long-press to Open thread or Copy link (#22…
flamboh Oct 20, 2026
83e0f7a
refactor(server): device hosts own their device operations (#21835)
juliusmarminge Oct 20, 2026
6dc63bd
feat(device): stream iOS devices that serve WebRTC only (#21841)
juliusmarminge Oct 20, 2026
c273a8f
feat(contracts): device hosts as a tagged union with EAS hosts (#21842)
juliusmarminge Oct 20, 2026
99209c7
feat(server): Expo credentials, EAS Simulator API, and EAS project lo…
juliusmarminge Oct 20, 2026
aee25ac
feat(server): EAS Simulator device hosts (#21844)
juliusmarminge Oct 20, 2026
d18352e
feat(web): set up EAS Simulator hosts in Settings (#21846)
juliusmarminge Oct 20, 2026
92a6f6d
feat(web): show how much of a PR is code vs tests, mocks, and generat…
t3dotgg Oct 20, 2026
500a52e
fix(web): HTML visualizations show their full height instead of cropp…
t3dotgg Oct 20, 2026
d3415f3
fix(mobile): skill chips in messages open their instructions (#22120)
flamboh Oct 20, 2026
b7b53d4
fix(server): preview downloads no longer echo data: URL contents (#22…
juliusmarminge Oct 20, 2026
72bdf1e
perf(web): pre-bundle startup chunks when a shared dev server starts …
t3dotgg Oct 20, 2026
91d7bf3
feat(connect): t3 connect checks that other devices can reach this ma…
t3dotgg Oct 20, 2026
d2fb83a
fix(threads): snoozed threads stay hidden through background wakes (#…
t3dotgg Oct 20, 2026
41b513d
revert: "fix(desktop): saved connections survive the Beta rename on m…
juliusmarminge Oct 20, 2026
2d11196
revert: "fix(web): pinned thread marker stays put when hovering the r…
t3dotgg Oct 20, 2026
8fc72da
revert: fourteen unverified desktop fixes from the takeover campaign …
juliusmarminge Oct 20, 2026
90c3f83
revert: "fix(web): worktree threads warn when the checkout branch cha…
t3dotgg Oct 20, 2026
b14ae64
fix(ci): recover from transient download and stale report failures (#…
t3dotgg Oct 20, 2026
8eafe05
revert: "fix(clients): show question option previews" (#21933) (#22229)
t3dotgg Oct 20, 2026
818f096
revert: "fix(web): stop composer banner glass overlap" (#8034) (#22227)
t3dotgg Oct 20, 2026
bd65988
revert: "fix(web): keep subagent links visible in long background-wor…
t3dotgg Oct 20, 2026
86729b4
revert: "fix(scheduler): label fixed-time tasks with the server timez…
t3dotgg Oct 20, 2026
23dd7e7
revert: "fix(web): preserve snapshot thumbnail context and detail" (#…
t3dotgg Oct 20, 2026
5547d7c
revert: "fix(web): show idle server updates on environment controls" …
t3dotgg Oct 20, 2026
45ad8d9
fix(client): a frozen host no longer shows a heartbeat as slow or bla…
t3dotgg Oct 20, 2026
d7bc3a2
feat(server,web,mobile): a host that drops because it froze now says …
t3dotgg Oct 20, 2026
774c6c1
revert(web): restore grouped projects in the new thread selector (#22…
t3dotgg Oct 20, 2026
729c56c
test(ssh): wait for server exit during handover (#22252)
t3dotgg Oct 20, 2026
54346a6
fix(web,server): adding a project to another machine takes you there,…
t3dotgg Oct 20, 2026
962428d
feat(clients): every PR +/- shows its code, tests, and docs split, wi…
t3dotgg Oct 20, 2026
30afc56
test(web): isolate diff worker idle clock (#22259)
t3dotgg Oct 20, 2026
e9a5974
ci(release): build macOS desktop on GitHub macos-26-xlarge runners (#…
t3dotgg Oct 20, 2026
d36b7da
fix(desktop): macOS release signing works on macOS 26.6 runners (#22277)
t3dotgg Oct 20, 2026
67c0fc0
fix(web): pinned threads' pin icon stays put on hover (#22303)
t3dotgg Oct 20, 2026
72ebd98
fix(web): show pointer cursors on changed-file controls (#22266)
UtkarshUsername Oct 20, 2026
b5a0696
fix(web): use the shared markdown scrollbar width (#22200)
UtkarshUsername Oct 20, 2026
573d376
revert: limit bars with many accounts no longer clip names to one let…
juliusmarminge Oct 20, 2026
8ecb607
fix(mobile): pin expo-modules-core so the release smoke patch stays i…
Project516 Oct 20, 2026
2b28b46
fix(server): updates no longer keep every old runtime on disk (#22253)
juliusmarminge Oct 20, 2026
cdaaa74
fix(mobile): chat chips match desktop and the composer again (#22169)
flamboh Oct 20, 2026
2229efc
fix(web): normalize disabled terminal button opacity (#22389)
UtkarshUsername Oct 20, 2026
d652490
fix(contracts): settings save again when the writing style has defaul…
MatiasGadeberg Oct 20, 2026
758d773
fix(relay): run the relay Worker next to its database (#22065)
juliusmarminge Oct 20, 2026
81dea78
test(web): disposable render helper and lint rule for browser tests (…
juliusmarminge Oct 20, 2026
be5a5cd
fix(mobile): use native sheet headers and toolbar filters (#22390)
juliusmarminge Oct 20, 2026
2893437
test(ssh): unreaped-server test no longer loses its zombie fixture (#…
juliusmarminge Oct 20, 2026
6ab39ff
test(web): require-disposable-render is now an error (#22410)
juliusmarminge Oct 20, 2026
f7f9e21
test(web): migrate the last .ts browser tests and stop wrapping userE…
juliusmarminge Oct 20, 2026
5d4c202
fix(web,mobile): Limits bars show the even-pace mark as a tick in a g…
juliusmarminge Oct 20, 2026
7e289ae
test(web): pooled Limits segments narrower than 6px draw no pace mark…
juliusmarminge Oct 20, 2026
dac3437
fix(mobile): the composer stays one row until the draft wraps (#20812)
juliusmarminge Oct 20, 2026
860e6d2
fix(web): restore left-aligned markdown table cells (#22482)
t3-code[bot] Oct 20, 2026
0c85b0d
feat(scheduled-tasks): event filters for webhook deliveries (#22194)
juliusmarminge Oct 20, 2026
ec58572
fix(mobile): prevent update checker from crashing iOS at launch (#22488)
juliusmarminge Oct 20, 2026
2ebe280
feat(scheduled-tasks): replay dedupe and coalescing for webhook deliv…
juliusmarminge Oct 20, 2026
14b47ee
ci(release): Make Windows arm64 CI job 50% faster (#22428)
jahands Oct 20, 2026
4c48118
ci(release): Windows arm64 verify no longer runs the crashing ARM Pow…
t3dotgg Oct 20, 2026
ca140c4
refactor(source-control): GitCafe creates repositories and pull reque…
juliusmarminge Oct 20, 2026
5bcc90e
test(web): fix release browser test failures (#22508)
t3dotgg Oct 20, 2026
c8667fd
fix(mobile): connecting an environment no longer crashes the header (…
juliusmarminge Oct 20, 2026
4af3231
fix(mobile): folded Back clears the detail route before the next sele…
juliusmarminge Oct 20, 2026
fe27e8e
ci(release): release tests stop timing out and finish in about 5 minu…
t3dotgg Oct 20, 2026
5d27ecd
test(server): Claude steer test no longer hangs for 120s under CI loa…
t3dotgg Oct 20, 2026
f9dd259
test: remove the timing races behind recurring CI and release failure…
t3dotgg Oct 20, 2026
fcb20e4
feat(web): render Mermaid diagrams with pele (#21472)
maria-rcks Oct 20, 2026
327f3fc
fix(mobile): keep home brand visible during secondary retries (#21388)
maria-rcks Oct 21, 2026
043c9c3
fix(mobile): collapse pull request repository errors (#21389)
maria-rcks Oct 21, 2026
e27fffa
fix(mobile): show terminal arrow keys before secondary controls (#21398)
maria-rcks Oct 21, 2026
145d73b
fix(mobile): update outdated servers and respect provider permissions…
maria-rcks Oct 21, 2026
2f6755b
fix(mobile): live activity tracks thread status and settlement (#21405)
maria-rcks Oct 21, 2026
4db2533
fix(mobile): use current checkout for non-git projects (#21404)
maria-rcks Oct 21, 2026
0dc38c7
fix(mobile): add project and checkout removal (#21409)
maria-rcks Oct 21, 2026
77e4f56
fix(mobile): show plans and fold settled progress notes (#21393)
maria-rcks Oct 21, 2026
afc33ff
fix(mobile): open transcript file links at the resolved path (#21403)
maria-rcks Oct 21, 2026
834ae4f
fix(mobile): lock the composer while queued edits save (#21390)
maria-rcks Oct 21, 2026
f16251f
fix(mobile): bring model controls in line with web (#21406)
maria-rcks Oct 21, 2026
6efe9a0
fix(mobile): restore archive and thread action undo (#21401)
maria-rcks Oct 21, 2026
fe414eb
fix(mobile): expose background work and thread status actions (#21395)
maria-rcks Oct 21, 2026
d356059
fix(web): keep approval menu actions compact (#22566)
Yash-Singh1 Oct 21, 2026
c3540a7
fix(web): main typecheck passes again after the Mermaid switch to pel…
t3dotgg Oct 21, 2026
05696c6
test: delete 11k low-signal tests so CI runs faster and flakes less (…
t3dotgg Oct 21, 2026
2085ea3
fix(mobile): thread rows show wake status and elapsed time (#21394)
maria-rcks Oct 21, 2026
8cd561e
fix(web,mobile): list database space for all machines in one notice (…
juliusmarminge Oct 21, 2026
b280e7d
test(lint): ban per-test timeouts and unreasoned skips (#22560)
juliusmarminge Oct 21, 2026
7895a2b
test(web): ban frame and transition waits in browser tests (#22561)
juliusmarminge Oct 21, 2026
dd4506a
test: ban wall-clock readings in tests (#22562)
juliusmarminge Oct 21, 2026
bde6206
test(server): ban real-clock waits in tests (#22564)
juliusmarminge Oct 21, 2026
08dbf83
test: warn on polling loops in tests and make adapter test harnesses …
juliusmarminge Oct 21, 2026
3719fd2
fix(mobile): iOS new-thread skill picker stops shifting the screen (#…
flamboh Oct 21, 2026
5bc19ac
fix(web): dialogs keep their content while they close (#21960)
flamboh Oct 21, 2026
569bd02
ci(release): build Windows x64 on Linux like arm64 (#22584)
t3dotgg Oct 21, 2026
849b3f8
fix(server): idle orphaned follow-ups can be cancelled without a runn…
t3dotgg Oct 21, 2026
a01f410
chore(web): remove "use client" directives (#22587)
flamboh Oct 21, 2026
7c16a40
test(mobile): prune low-value tests in mobile (second pass) (#22588)
juliusmarminge Oct 21, 2026
2edddbc
test(desktop): prune low-value tests in desktop (second pass) (#22589)
juliusmarminge Oct 21, 2026
eb10859
test(web): prune low-value tests in apps/web (second pass) (#22591)
juliusmarminge Oct 21, 2026
a2f4df0
test(server): prune low-value tests in apps/server (second pass) (#22…
juliusmarminge Oct 21, 2026
8feddd6
test(packages): prune low-value tests in packages (second pass) (#22593)
juliusmarminge Oct 21, 2026
32d8f8f
test(server): prune low-value tests in orchestration-v2 (second pass)…
juliusmarminge Oct 21, 2026
c728c8c
test(web): every browser test starts with the mouse off the page (#22…
juliusmarminge Oct 21, 2026
5b2ee39
chore(tailscale): drop parseTailscaleMagicDnsName, which nothing impo…
juliusmarminge Oct 21, 2026
31dcc7c
fix(server): make the remaining flaky server tests deterministic (#22…
juliusmarminge Oct 21, 2026
ecfe4f7
fix(mobile): composer chips match chat chips (#22518)
flamboh Oct 21, 2026
8bbb85c
fix(mobile): show each turn's diffstat on its work row (#21392)
maria-rcks Oct 21, 2026
c22ace2
chore(release): prepare v0.1.1
t3-code[bot] Oct 21, 2026
4741dc5
fix(web): silence notifications when stopping a watch (#22615)
Yash-Singh1 Oct 21, 2026
e64766c
ci(release): build macOS desktop on Blacksmith runners again (#22613)
t3dotgg Oct 21, 2026
733a303
fix(usage): Codex compaction and resumed sessions no longer show skip…
t3dotgg Oct 21, 2026
8a9d0e0
fix(web): thread search shows the same PR badge as the sidebar (#22627)
maria-rcks Oct 21, 2026
3e250a8
Delete .github/workflows/cursor-hygiene-webhook.yml
juliusmarminge Oct 21, 2026
61e2747
fix(desktop): bump Electron to 44.9.3 to block compromised eMudhra CA…
t3dotgg Oct 21, 2026
4f651cb
test(web): ChatView's React Compiler check no longer times out on slo…
t3dotgg Oct 21, 2026
15dc7b0
fix(web): thread links render as chips, and thread chips show the pro…
flamboh Oct 21, 2026
6a6c84f
fix(server): Stop on a delegate always clears it, even when it is stu…
t3dotgg Oct 21, 2026
a93b03c
feat(web): composer stays usable during approvals, and sending declin…
maria-rcks Oct 21, 2026
73daccf
docs(agents): name the fast commands and stop polling (#22711)
t3dotgg Oct 21, 2026
a5d66e2
fix(desktop): new worktrees install Electron from the local download …
t3dotgg Oct 21, 2026
dd8452a
test(server): split replay fixtures into per-provider files (#22717)
t3dotgg Oct 21, 2026
163bdea
fix(server): delegates finish when their leftover work settles, and G…
t3dotgg Oct 21, 2026
d0e427d
fix(server): storage cleanup no longer counts pnpm clones as freed sp…
t3dotgg Oct 21, 2026
a1dc856
build: upgrade Vite+ to 1.3 and cache typecheck (#22716)
t3dotgg Oct 21, 2026
8f66e67
test: local test runs use package configs and a clean env (#22714)
t3dotgg Oct 21, 2026
ca049dc
fix(mobile): restore low-latency decoding for simulator streams (#22733)
Yash-Singh1 Oct 21, 2026
ea1c494
fix(marketing): typecheck cache no longer misses when the shell env c…
t3dotgg Oct 21, 2026
618761a
build(setup): leaner installs on Mac and Linux, cross-device store wa…
t3dotgg Oct 21, 2026
f4a3843
build: upgrade pnpm to 12 for 4x faster installs (#22738)
t3dotgg Oct 21, 2026
76e4aac
refactor(web): the timeline minimap lives in its own file (#22662)
juliusmarminge Oct 21, 2026
bea8790
refactor(web): timeline work entry rows and tool icons live in their …
juliusmarminge Oct 21, 2026
9e672d0
refactor(web): timeline work group and live activity rows live in the…
juliusmarminge Oct 21, 2026
3e36c5e
refactor(web): timeline user message rows and context chips live in t…
juliusmarminge Oct 21, 2026
476e2c3
refactor(web): timeline assistant and orchestration event rows live i…
juliusmarminge Oct 21, 2026
bef9142
refactor(web): timeline row derivation, position restore and find rea…
juliusmarminge Oct 21, 2026
9ff8cdc
refactor(web): the command palette's theme items live in their own fi…
juliusmarminge Oct 21, 2026
767134a
refactor(web): the command palette's thread items come from their own…
juliusmarminge Oct 21, 2026
0b7c902
refactor(web): the command palette's project items and pure helpers l…
juliusmarminge Oct 21, 2026
28a8d2b
refactor(web): the command palette's add-project views are components…
juliusmarminge Oct 21, 2026
955b4cc
feat(cli): start, message, and read threads from the terminal with t3…
t3dotgg Oct 21, 2026
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
7523bf9
chore(merge): restore ancestry of the integrated Oct 19 sync
joaoheusi Oct 21, 2026
7d287e4
chore: merge upstream updates from October 21
joaoheusi Oct 21, 2026
b7b2427
fix: preserve fork release jobs and upgrade coverage
joaoheusi Oct 21, 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.
3 changes: 2 additions & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
# 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.
# 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
31 changes: 26 additions & 5 deletions .github/actions/setup-ci-deps/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,34 @@ runs:
path: ~/.vite-plus
key: vite-plus-home-v1-${{ runner.os }}-${{ runner.arch }}-${{ steps.vp.outputs.version }}

- name: Setup Vite+
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: Setup Vite+
uses: voidzero-dev/setup-vp@v1
- name: Cache full pnpm store
uses: actions/cache@v6
with:
node-version-file: package.json
cache: true
run-install: true
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
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/);
});
11 changes: 8 additions & 3 deletions .github/scripts/ci-changes.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
// 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
//
// scripts/check-changed.ts requires the same decisions so local runs match CI.
//
// 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.
Expand Down Expand Up @@ -36,6 +38,7 @@ const EXTRA_OWNERS = [
// scripts/build-desktop-artifact.ts reads the GNOME extension manifest.
[/^apps\/desktop\/gnome-extension\//, ["@t3tools/scripts"]],
[/^native\/browser-secret\//, ["@t3tools/desktop"]],
[/^native\/kde-snap-shot\//, ["@t3tools/desktop"]],
[/^native\/libghostty-vt\//, ["@t3tools/web"]],
];
const RUST = /^native\/(resource-monitor|kde-snap-shot|hyprland-snap-shot)\//;
Expand Down Expand Up @@ -112,10 +115,10 @@ function ownersOf(file, packages) {
// 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;
const extra = EXTRA_OWNERS.flatMap(([pattern, names]) => (pattern.test(file) ? names : []));
// scripts/build-desktop-artifact.test.ts reads the crates' sources.
if (RUST.test(file)) return ["@t3tools/scripts"];
if (RUST.test(file)) return ["@t3tools/scripts", ...extra];

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];
Expand Down Expand Up @@ -200,4 +203,6 @@ function main() {
for (const [key, value] of Object.entries(outputs)) console.log(`${key}=${value}`);
}

main();
module.exports = { readWorkspace, decide };

if (require.main === module) main();
27 changes: 27 additions & 0 deletions .github/scripts/ci-changes.d.cts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
interface WorkspacePackage {
readonly name: string;
readonly dir: string;
readonly hasTest: boolean;
readonly deps: ReadonlyArray<string>;
}

export function readWorkspace(): Array<WorkspacePackage>;

export function decide(
files: ReadonlyArray<string> | null,
packages: ReadonlyArray<WorkspacePackage>,
full: boolean,
): {
affected: Array<string>;
outputs: {
typecheck: boolean;
build: boolean;
test: boolean;
test_packages: string;
test_web: boolean;
test_server: boolean;
rust: boolean;
release_smoke: boolean;
mobile_native: boolean;
};
};
24 changes: 20 additions & 4 deletions .github/scripts/thread-transfer-report.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -244,10 +244,26 @@ async function resolve({ github, context, core }) {

let pullNumber = source.pull_requests?.[0]?.number;
if (!pullNumber) {
const associated = await github.paginate(
github.rest.repos.listPullRequestsAssociatedWithCommit,
{ owner, repo, commit_sha: source.head_sha, per_page: 100 },
);
let associated;
try {
associated = await github.paginate(github.rest.repos.listPullRequestsAssociatedWithCommit, {
owner,
repo,
commit_sha: source.head_sha,
per_page: 100,
});
} catch (error) {
// A force-pushed or deleted PR head can disappear before this workflow runs.
if (
error.status === 422 &&
error.response?.data?.message === `No commit found for SHA: ${source.head_sha}`
) {
core.info(`Skipping CI result for unavailable commit ${source.head_sha}.`);
core.setOutput("publish", "false");
return;
}
throw error;
}
const matchingPulls = associated.filter(
(pull) =>
pull.state === "open" &&
Expand Down
93 changes: 41 additions & 52 deletions .github/scripts/thread-transfer-report.test.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ const assert = require("node:assert/strict");
const test = require("node:test");

const {
renderComment,
resolve,
upsertCommentForCurrentHead,
validateResult,
Expand Down Expand Up @@ -53,39 +52,6 @@ test("validates the fixed artifact schema", () => {
);
});

test("renders baseline, impact, ceiling, and ceiling changes", () => {
const baseline = result();
const current = result({ measuredTurnWebSocketWireBytes: 260_000 });
current.providers.codex.ceiling = {
...current.providers.codex.ceiling,
measuredTurnWebSocketWireBytes: 330_000,
};
const comment = renderComment({
current,
baseline,
currentRun: {
sha: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
conclusion: "success",
url: "https://github.com/pingdotgg/t3code/actions/runs/2",
},
baselineRun: {
sha: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
matchesBase: true,
url: "https://github.com/pingdotgg/t3code/actions/runs/1",
},
});

assert.match(comment, /Main baseline \| This PR \| Impact \| PR ceiling/);
assert.match(comment, /\+9\.8 KiB \(\+4\.0%\)/);
assert.match(comment, /This PR changes transfer ceilings/);
assert.match(comment, /312\.5 KiB → 322\.3 KiB/);
assert.match(comment, /<!-- t3-thread-transfer-report -->/);
assert.match(
comment,
/<!-- t3-thread-transfer-result-sha:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -->/,
);
});

test("resolves a fallback PR with a redacted head repo and exact main baseline", async () => {
const outputs = {};
const listWorkflowRunArtifacts = () => {};
Expand Down Expand Up @@ -216,6 +182,47 @@ test("does not guess when a fallback commit belongs to multiple PRs", async () =
assert.equal(fetchedPull, false);
});

test("skips a missing PR commit but preserves other lookup failures", async () => {
for (const [status, message, shouldSkip] of [
[422, "No commit found for SHA: old-head", true],
[422, "Validation Failed", false],
[403, "API rate limit exceeded", false],
]) {
const outputs = {};
const error = Object.assign(new Error(message), {
status,
response: { data: { message } },
});
const run = resolve({
github: {
paginate: async () => {
throw error;
},
rest: { repos: { listPullRequestsAssociatedWithCommit: () => {} } },
},
context: {
repo: { owner: "pingdotgg", repo: "t3code" },
payload: {
workflow_run: { event: "pull_request", head_sha: "old-head", pull_requests: [] },
},
},
core: {
info: () => {},
setOutput: (key, value) => {
outputs[key] = value;
},
},
});
if (shouldSkip) {
await run;
assert.equal(outputs.publish, "false");
} else {
await assert.rejects(run, (caught) => caught === error);
assert.deepEqual(outputs, {});
}
}
});

test("does not report a passing run that skipped the server tests", async () => {
const outputs = {};
const listWorkflowRunArtifacts = () => {};
Expand Down Expand Up @@ -332,21 +339,3 @@ test("preserves a successful result when a same-SHA rerun has no artifact", asyn
assert.equal(published, true);
assert.equal(updatedComment, false);
});

test("accepts V2 without comparing it to the V1 scenario", () => {
const current = result();
current.scenario.id = "thread-transfer-v2";
current.providers.codex.ceiling = { ...current.providers.codex.ceiling, totalWireBytes: 3000000 };
assert.equal(validateResult(current), current);
const comment = renderComment({
current,
baseline: result(),
currentRun: { sha: "bbbbbbbb", conclusion: "success", url: "https://example.com/current" },
baselineRun: { sha: "aaaaaaaa", matchesBase: true, url: "https://example.com/baseline" },
});
assert.match(comment, /fixture changed/);
assert.doesNotMatch(comment, /This PR changes transfer ceilings/);
assert.doesNotMatch(comment, /[+-]\d+\.\d+%/);
current.scenario.id = "unrecognized";
assert.throws(() => validateResult(current), /not supported/);
});
Loading
Loading