Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
459 commits
Select commit Hold shift + click to select a range
15c9278
fix(claude): context meter shows the configured auto-compact threshol…
akbarakma Oct 20, 2026
f7bef38
fix(server): bare repositories now group with projects of the same re…
shrikantkalar023 Oct 20, 2026
fc4319c
fix(web): Open in editor on a chat file chip opens the file the chip …
chickenputty Oct 20, 2026
e294a38
fix(provider-acp): retain Grok command completion before prompt settl…
3xcalibur-tech Oct 20, 2026
30d0138
fix(devices): retain inventory when AVD enumeration fails (#19974)
Quicksaver Oct 20, 2026
ee3a3e8
fix(web): Add to agent works on pull requests you cannot comment on (…
kshanxs Oct 20, 2026
e21dff1
fix(connect): preserve rotated credentials during shutdown (#19499)
Exotic209093 Oct 20, 2026
26a88af
fix(server): Claude no longer refuses earlier skills the user invoked…
chuks-qua Oct 20, 2026
2fcefc9
fix(shared): hydrate Nushell environments in CLI and desktop (#7894)
Serendeep Oct 20, 2026
6bcbb95
fix(desktop): stop blocking the renderer during topology polling (#19…
daniyal-sh Oct 20, 2026
30a7330
fix(gitlab): follow the repository default merge request template (#1…
fixfon Oct 20, 2026
4bf8b47
fix(provider-muse): relaunch a host that died between turns (#19195)
ddonathan Oct 20, 2026
60f2246
fix(server): stopped usage-limit threads no longer auto-resume (#21114)
fixfon Oct 20, 2026
a2a13b5
fix(server): t3-code tools keep working after a turn waits over a day…
robertnisipeanu Oct 20, 2026
321b86b
fix(web): show a supervisor waiting on its worker as running in Linea…
ScottN-PV Oct 20, 2026
f8b06c5
fix(web): wide chat tables fit the lane when cells wrap (#20878)
mkantautas Oct 20, 2026
19e06dc
fix(provider-cursor): start default Cursor threads on Windows (#20046)
fabiocolor Oct 20, 2026
348888a
fix(server): skip local Codex binaries missing codex-code-mode-host (…
indishere Oct 20, 2026
6c3c31d
fix(web): preserve usernames in remote editor links (#18092)
jakeleventhal Oct 20, 2026
45bcde1
fix(server): clear Codex commands when their native thread closes (#1…
ItayCohen-Prog Oct 20, 2026
f045466
fix(server): restore OpenCode Go limits for Console API keys (#21007)
Benglennon123 Oct 20, 2026
c80cf02
fix(mobile): match subscription widgets to app theme (#15941)
saphid Oct 20, 2026
0c9717b
fix(web): expand clicked file in sidebar diff (#20101)
NickAwrist Oct 20, 2026
ce2707b
perf(desktop): show connecting splash while the local backend starts …
ronak-guliani Oct 20, 2026
96a76b1
fix(server): T3 Connect falls back to HTTP/2 after repeated QUIC stal…
knocking4thcylinder Oct 20, 2026
68682fb
fix(web): show ready device host warnings (#19975)
Quicksaver Oct 20, 2026
3b844da
fix(codex): display inherited service tiers across models (#15623)
maria-rcks Oct 20, 2026
6aa83db
fix(server): iOS device viewer no longer times out on a still simulat…
kakismash Oct 20, 2026
f4e3f25
fix(server): resolve Codex usage tiers from initial run history (#21898)
juliusmarminge Oct 20, 2026
6f89154
fix(server): return delegated waits on pending approvals (#20037)
gustavonline Oct 20, 2026
4b1426f
fix(server): a Claude wake run settles when Claude never opens the wa…
AdEx-Partners-DE Oct 20, 2026
55b72ff
feat(web): preview images in the project icon picker (#20372)
serrnovik Oct 20, 2026
6ae65e1
fix(server): a macOS setTypeOfService EINVAL no longer kills the back…
only21mil Oct 20, 2026
760cdec
fix(mobile): preserve Home row content across recycling (#14004)
AKolenda Oct 20, 2026
b23958d
fix(mobile): dismiss ended Live Activities when the app returns to th…
only21mil Oct 20, 2026
3e48255
fix(server): import long Claude sessions that are mostly tool records…
Mikerpen22 Oct 20, 2026
29a7d80
fix(server): preserve service environment across updates (#19486)
Exotic209093 Oct 20, 2026
805ff51
fix(web): prevent overlapping usage breakdown columns (#14318)
0pilatos0 Oct 20, 2026
e094c68
fix(server): preserve buffered Claude usage-limit failures (#19543)
omar7550 Oct 20, 2026
e433eeb
fix(web): suppress terminal key releases for app-handled shortcuts (#…
saphid Oct 20, 2026
c5f536c
fix(mobile): Back from a subagent thread returns to its parent on And…
voida6 Oct 20, 2026
c6fd4ad
fix(mobile): check for server updates without GitHub's API rate limit…
jorda0mega Oct 20, 2026
9f01c58
fix(server): preserve antigravity ipv6 startup diagnostics (#15629)
maria-rcks Oct 20, 2026
c8e2407
fix(relay): preserve provisioning failure stage in client errors (#14…
ECuteri Oct 20, 2026
0d10c36
fix(server): older probes no longer overwrite live usage limits (#18723)
bitmvk Oct 20, 2026
b14120f
fix(threads): preserve snooze when an existing run completes (#17118)
yasinkavakli Oct 20, 2026
984df7f
fix(preview): preserve actionable native capture errors (#17244)
Quicksaver Oct 20, 2026
353d8c5
fix(server): refuse to share a T3 home with an older background servi…
arun279 Oct 20, 2026
8f947a3
fix(server): queued preview actions no longer start after their deadl…
hogeheer499-commits Oct 20, 2026
77ed46a
fix(web): keep composer toolbar visible after worktree failure (#14753)
t3dotgg Oct 20, 2026
310f80f
fix(desktop): align bundled versions with the artifact version (#12768)
rohan-patnaik Oct 20, 2026
acf7043
fix(web): project settings no longer dead-ends on environments withou…
5knnbdwm Oct 20, 2026
7e10144
fix(web): scrolling over an inline HTML render no longer snaps back t…
josephv123 Oct 20, 2026
d1cac66
fix(server): an idle terminal no longer scans the process table every…
tiliakoos Oct 20, 2026
2e8b5b9
fix(server): desktop-drawn preview snapshots match the page's scale a…
ScottN-PV Oct 20, 2026
cefe45b
fix(web): returning to a thread no longer jumps to its pull request t…
sairajchouhan Oct 20, 2026
2d62f7d
fix(server): Claude subagents resumed after a missed launch get their…
Gigioxx Oct 20, 2026
78d095a
fix(opencode): keep workspace commands retryable after probe timeouts…
Marve10s Oct 20, 2026
0c39430
fix(server): rolling back a Claude fork's first run keeps its inherit…
fixfon Oct 20, 2026
acf5f3b
fix(server): onboarding offers worktrees of a bare repository (#16688)
chris-allen Oct 20, 2026
a3635a1
fix(server): a slow server update download no longer fails at a 10-mi…
Marve10s Oct 20, 2026
b0ed393
fix(clients): show Waiting when a turn waits on another thread (#21500)
juliusmarminge Oct 20, 2026
3a69f7a
fix(web): keep subagent links visible in long background-work banners…
ThreshHNS Oct 20, 2026
03fe16a
fix: ~/ file links open in the file panel for projects outside the ho…
AngeloTadeucci Oct 20, 2026
ab638a6
fix(web): opening a just-created thread no longer bounces to the star…
Fr4nzz Oct 20, 2026
6b2188a
fix(server): re-inject T3 instructions into ACP sessions after compac…
antonsxh Oct 20, 2026
055a841
fix(web): terminal drawer no longer pushes the composer into the head…
rywible Oct 20, 2026
d1066d2
fix(server): GitHub only offers auto-merge when it can wait (#19947)
PiquelChips Oct 20, 2026
6e45544
fix(server): stop caching failed or signed-out Claude usage probes (#…
saphid Oct 20, 2026
ec967f3
fix(server): run_scheduled_task_now returns the thread the run launch…
sbansal1999 Oct 20, 2026
8c8e187
fix(pi): fork and revert past turns whose session entry was never cap…
henrychu04 Oct 20, 2026
c154d41
fix(web): use the draft appearance when highlighting code (#18827)
saphid Oct 20, 2026
eca0e05
fix(web): interrupted SSH pairing retries reuse unfinished setup (#19…
im-kvijay Oct 20, 2026
a9af48a
fix(web,mobile): no pending handoff for a provider the next send woul…
JaiiR320 Oct 20, 2026
4af6618
fix(web): pass sshTarget to resolveRemoteOpenState (#22144)
juliusmarminge Oct 20, 2026
d243b09
fix(server): recover missing initial Codex usage tiers (#21899)
juliusmarminge Oct 20, 2026
3819eb3
fix(desktop): saved connections survive the Beta rename on macOS and …
jeprecated Oct 20, 2026
3b7d39e
fix(mobile): new threads reuse the worktree that already holds a bran…
shivamhwp Oct 20, 2026
d445fdb
fix(desktop): restart prompt returns after relaunching with a downloa…
RakshithBhat03 Oct 20, 2026
9257b10
fix(server): threads swept by old desktop builds show their real sett…
shivamhwp Oct 20, 2026
35086ee
fix(web): edit from here works after a previous rewind (#18982)
voltcrash Oct 20, 2026
0b84aa3
fix(claude): honor effective bypass restrictions (#21806)
juliusmarminge Oct 20, 2026
ba47b16
fix(github): read pull requests when GitHub refuses a requested revie…
ScottN-PV Oct 20, 2026
3c18818
fix(desktop): capture fresh pixels from background previews (#19931)
Quicksaver Oct 20, 2026
f8bcc3c
fix(server): queued PR updates follow the takeover provider (#21314)
voltcrash Oct 20, 2026
09548f6
fix(server): retain Codex authentication when discovery times out (#2…
ScottN-PV Oct 20, 2026
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
6002e58
sync: v0.1.2-nightly.20261021.3457
rawphp Oct 21, 2026
b685ee7
test: an unconfigured update feed is an explicit null publish
rawphp Oct 21, 2026
f2636e9
test: the events contract opens its subscription before the first launch
rawphp Oct 21, 2026
bfe0a4b
test: upstream's boot service ownership tests use the fork's launchd …
rawphp Oct 21, 2026
fa48cc2
test: guard the packaged app's fork id, name, URL schemes and app use…
rawphp Oct 21, 2026
7b3c754
fix: the events contract waits for a probe run instead of trusting to…
rawphp Oct 21, 2026
7fe5a0a
test: say how the events contract's second consumer can still be late
rawphp Oct 21, 2026
129f453
test(factory): server and mobile tests stop reading the wall clock, s…
rawphp Oct 21, 2026
09e5deb
test(factory): web browser tests render through the disposable helper
rawphp Oct 21, 2026
96fd413
refactor(factory): reusable Effect functions use Effect.fn
rawphp 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
  •  
  •  
  •  
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
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/);
});
5 changes: 3 additions & 2 deletions .github/scripts/ci-changes.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,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 +113,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
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/);
});
4 changes: 4 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,9 @@ jobs:
- name: Check generated GitHub GraphQL operations
run: vp run --filter @t3tools/source-control-github generate --check

- name: Check generated Expo GraphQL operations
run: vp run --filter t3 generate --check

- name: Check
run: vp check

Expand Down Expand Up @@ -249,6 +252,7 @@ jobs:

# The web suite is the largest outside the server. In the shared Test job it
# started last and ran alone for about 40s after everything else finished.
# release.yml mirrors this test, test_web, and test_server split.
test_web:
name: Test Web
needs: changes
Expand Down
6 changes: 4 additions & 2 deletions .github/workflows/cursor-hygiene-webhook.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ name: Forward to Cursor hygiene
on:
push:
branches: [main]
pull_request:
# Use trusted workflow code and repository secrets for fork PRs.
# Keep this job payload-only: never check out or run PR code.
pull_request_target:
types: [opened, reopened, ready_for_review]
issues:
types: [opened, closed, reopened]
Expand Down Expand Up @@ -34,7 +36,7 @@ jobs:
--output /dev/null --write-out '%{http_code}' \
-H "Authorization: $AUTH" \
-H "Content-Type: application/json" \
-H "X-GitHub-Event: ${{ github.event_name }}" \
-H "X-GitHub-Event: ${{ github.event_name == 'pull_request_target' && 'pull_request' || github.event_name }}" \
-H "X-GitHub-Delivery: ${{ github.run_id }}-${{ github.run_attempt }}" \
--data-binary @"${{ github.event_path }}") || curl_status=$?
if [ "$curl_status" -eq 0 ]; then
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/deploy-relay.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ jobs:
RELAY_TUNNEL_ZONE_NAME: ${{ vars.RELAY_TUNNEL_ZONE_NAME }}
RELAY_TUNNEL_CLEANUP_MODE: ${{ vars.RELAY_TUNNEL_CLEANUP_MODE }}
RELAY_LEGACY_TUNNEL_CLEANUP_MODE: ${{ vars.RELAY_LEGACY_TUNNEL_CLEANUP_MODE }}
RELAY_ALERT_NOTIFIER_ID: ${{ vars.RELAY_ALERT_NOTIFIER_ID }}
RELAY_WARNING_NOTIFIER_ID: ${{ vars.RELAY_WARNING_NOTIFIER_ID }}
CLERK_PUBLISHABLE_KEY: ${{ vars.CLERK_PUBLISHABLE_KEY }}
CLERK_JWT_AUDIENCE: ${{ vars.CLERK_JWT_AUDIENCE }}
APNS_ENVIRONMENT: ${{ vars.APNS_ENVIRONMENT }}
Expand Down
Loading
Loading