Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
378 commits
Select commit Hold shift + click to select a range
14978e3
fix(server): PR worktrees keep local commits on an existing branch (#…
only21mil Nov 12, 2026
c699562
fix(web): branch labels keep the space before a middle-truncated name…
guryanov-a Nov 12, 2026
13034bf
fix(server): stale provider update results clear once the provider is…
fixfon Nov 12, 2026
a0844ea
perf(server): merged-PR threads no longer re-read git state every min…
Batuhan1999 Nov 12, 2026
d9bed93
fix(server): pending request reads keep question option previews (#35…
juliusmarminge Nov 12, 2026
a135972
fix(opencode): preserve owned turns during server recovery (#25596)
maria-rcks Nov 12, 2026
072254d
fix(server): baseline existing pull request checks when watching (#23…
vkpdeveloper Nov 12, 2026
2ff2770
fix(server): saved preview snapshot failures name the screenshot dest…
juliusmarminge Nov 12, 2026
beaa647
fix(ssh): distinguish incompatible Node from a missing executable (#3…
MasonNight Nov 12, 2026
817b92f
fix(pi): stop offering extension-only models for text generation (#24…
only21mil Nov 12, 2026
18aeb0f
fix(server): new worktrees show submodule downloads instead of a stuc…
GuardedAirplane Nov 12, 2026
0508906
fix(web): restore composer focus when returning to a thread (#29179)
voltcrash Nov 12, 2026
bd731da
fix(server): linked calls fail fast when a peer stalls the MCP handsh…
only21mil Nov 12, 2026
c6b18c4
fix(web,mobile): keep line breaks in pending question text (#33353)
StiensWout Nov 12, 2026
ad2d22c
fix(mobile): opening a search result clears Home's search on iPhone (…
only21mil Nov 12, 2026
a6b8f71
fix(desktop): Escape during IME composition no longer cancels a previ…
juliusmarminge Nov 12, 2026
b1c1e07
fix(web): a click no longer lands on the sidebar row that just slid u…
mkantautas Nov 12, 2026
613d1ac
fix(mcp): background wait fails when none of its task IDs exist (#29773)
onlydole Nov 12, 2026
e1d59d1
fix(web): the collapsed mobile composer shows Stop while a turn runs …
TanJeeSchuan Nov 12, 2026
bce2bc0
test(web): split the cloud voice cancel flow from the failed-then-sav…
juliusmarminge Nov 12, 2026
4cc6beb
fix(desktop): nightly updates no longer depend on GitHub's tag order …
t3dotgg Nov 12, 2026
ff04519
fix(web): PDF preview prerenders pages two viewports below the visibl…
juliusmarminge Nov 12, 2026
e253b88
perf(server): uploading a large document with seven notebooks finishe…
Yuruzuu Nov 12, 2026
c4e74fe
Typeset equations that fail only because of an unescaped percent (#29…
meutex Nov 12, 2026
dbaef80
fix(server): wake PR watches when the merge queue drops a pull reques…
only21mil Nov 12, 2026
db470a3
fix(web): legacy collapsed project folders stay collapsed after a sav…
juliusmarminge Nov 12, 2026
c60aa1a
fix(server): explain how to close unclaimed browser tabs (#29205)
voltcrash Nov 12, 2026
9ccc0f8
fix(editors): JetBrains IDEs open file links in the thread's project …
only21mil Nov 12, 2026
e895a56
fix(mobile): select part of a source file's text on iOS (#33218)
binjamshid Nov 12, 2026
bc0befe
fix(mobile): show loading until existing threads are known (#28663)
shivamhwp Nov 12, 2026
aa37097
fix(web): streamed device toolbar starts at the panel size (#35664)
juliusmarminge Nov 12, 2026
1e6a251
fix(acp): preserve OMP single-choice questions and custom answers (#2…
nateEc Nov 12, 2026
3de49ba
fix(server): workspace search leaves out files Git ignores outside .g…
juliusmarminge Nov 12, 2026
12a62ed
fix(server): worktree setup no longer hangs when the shell is Nushell…
KenDJohnson Nov 12, 2026
6641231
fix(secrets): notify when a delegated agent asks for a secret (#33585)
zmievsa Nov 12, 2026
a98bc69
fix(web): Cursor threads keep a stored model the catalog doesn't list…
only21mil Nov 12, 2026
1e20361
fix(server): workspace search keeps backslashes in POSIX file names (…
juliusmarminge Nov 12, 2026
de77e61
fix(provider): make readiness probe timeouts configurable (#33275)
johanjohnthomas Nov 12, 2026
cc97303
fix(cursor): mcp.json servers using ${workspaceFolder} now start (#24…
only21mil Nov 12, 2026
7d51718
fix(server): workspace search ignore filter follows the host path sep…
juliusmarminge Nov 12, 2026
6dfb1a8
fix(server): t3 uninstall names another home's service it leaves inst…
juliusmarminge Nov 12, 2026
cfad310
fix(client-runtime): long MCP app download names no longer split an e…
juliusmarminge Nov 12, 2026
e179cef
fix(web): collapsed reasoning previews no longer split an emoji (#35677)
juliusmarminge Nov 12, 2026
4cfcfaf
fix(web): a question answer restored with undo is no longer sent twic…
ixmxvii-hash Nov 12, 2026
f59aa4e
fix(server): reject PR watches when hosting dependencies are unavaila…
complynx Nov 12, 2026
9fb4492
fix(chat): requeued steers no longer look delivered (#23420)
Alb11747 Nov 12, 2026
f6787e8
fix(web): reuse timeline rows while thinking and plans stream (#24121)
Batuhan1999 Nov 12, 2026
532bf2e
fix(mobile): Back from a PR opened in a chat returns to the chat on A…
bitmvk Nov 12, 2026
0ca50a6
fix(mobile): tall iOS code blocks with long lines show their code (#3…
Muzammil-Bit Nov 12, 2026
56b6c2a
fix(mobile): refreshing a review diff keeps unfolded files open (#35682)
juliusmarminge Nov 12, 2026
d76e066
fix(server): snooze no longer waits two minutes after a steered queue…
juliusmarminge Nov 12, 2026
f70e349
test(server): count leaked PR cache caller data without WeakRefs (#35…
juliusmarminge Nov 12, 2026
bb26e56
fix(cli): t3 pair's protocol mismatch hint keeps --base-dir (#35690)
juliusmarminge Nov 12, 2026
141de5e
fix(web): a dismissed provider banner stays dismissed when you switch…
torztomasz Nov 12, 2026
c19b8f0
fix(cli): t3 status no longer suggests --no-lan under a T3CODE_HOST o…
juliusmarminge Nov 12, 2026
2e741fc
fix(desktop): wait for the server's database upgrade instead of repor…
juliusmarminge Nov 13, 2026
39f465a
fix(server): a C# dictionary term no longer rewrites standalone lette…
juliusmarminge Nov 13, 2026
c1b42c1
fix(client-runtime): last user message sort ignores agent-posted mess…
juliusmarminge Nov 13, 2026
f8372d1
fix(web): long screen-reader announcements keep emoji whole at the cu…
juliusmarminge Nov 13, 2026
82839de
fix(server): Claude context meter honours CLAUDE_CODE_AUTO_COMPACT_WI…
juliusmarminge Nov 13, 2026
e0d6aad
feat(server): watched GitHub pull requests react when a check suite c…
juliusmarminge Nov 13, 2026
9b0387d
fix(web): triple-click selects the whole line around links and file c…
juliusmarminge Nov 13, 2026
56d2278
fix(projects): preserve grouped renames to repository names (#25244)
maria-rcks Nov 13, 2026
5959787
fix(acp): agents get T3's runtime notes once per session, not on ever…
Radu028 Nov 13, 2026
587deab
feat(server): keep the computer awake while agents work (#34128)
juliusmarminge Nov 13, 2026
254e985
fix(web): find scheduled tasks in Settings search (#35715)
juliusmarminge Nov 13, 2026
fec3b3a
fix(preview): bound stalled screenshot captures (#25862)
cabamarcos Nov 13, 2026
48a56fa
test(server): idle-resume replays wait for the session release before…
juliusmarminge Nov 13, 2026
ac1cb92
fix(server): archive refuses a thread with running delegated tasks (#…
SouthCarpet Nov 13, 2026
c99201c
fix(web): minimap Next turn no longer sticks on adjacent user message…
juliusmarminge Nov 13, 2026
d4b77d2
fix(server): Claude background commands show how long they have run (…
SunkenInTime Nov 13, 2026
c2931a6
fix(server): honor worktree prefixes when automatic naming fails (#35…
juliusmarminge Nov 13, 2026
7bf2a43
fix(git): refuse remote switches that would silently detach HEAD (#35…
Kirat0201 Nov 13, 2026
0465d4a
fix(mobile): retain inline image zoom on iOS (#33852)
saphid Nov 13, 2026
b54dad1
fix(server): Claude's auto-compact setting now wins over CLAUDE_CODE_…
juliusmarminge Nov 13, 2026
79daf43
fix(desktop): an SSH reconnect during a desktop update no longer lock…
ajbarryiii Nov 13, 2026
0bb6eaa
fix(web): auto-balanced drafts recheck machine load before sending (#…
juliusmarminge Nov 13, 2026
4137412
fix(web): screen readers at Everything hear context compaction start …
juliusmarminge Nov 13, 2026
59e64ee
fix(server): t3_thread_read returns the newest items and fits in agen…
darjss Nov 13, 2026
a119af0
fix(server): remote status keeps a local upstream named without a sla…
juliusmarminge Nov 13, 2026
36254ab
fix(server): a watched PR stops holding its thread once its checks fi…
juliusmarminge Nov 13, 2026
ce26864
fix(server): a slow database write no longer freezes the server (#35728)
tnfssc Nov 13, 2026
62647f4
fix(mobile): Android sheets scroll without per-feature platform check…
juliusmarminge Nov 13, 2026
6b292d9
docs: drop the GitCafe mirror runbook for a generic forge mirror (#35…
juliusmarminge Nov 13, 2026
12421da
fix(ssh): timed-out SSH commands no longer leave a proxy helper runni…
juliusmarminge Nov 13, 2026
63426c4
fix(dev): long-running dev servers no longer leak memory when other w…
t3dotgg Nov 13, 2026
f5d0be6
fix(server): Changes totals no longer take index.lock (#35770)
juliusmarminge Nov 13, 2026
ad1c46b
fix(server): keep repository identity for roots whose name ends in a …
juliusmarminge Nov 13, 2026
adf3151
fix(server): restored worktrees find pushed thread work on a non-orig…
juliusmarminge Nov 13, 2026
25feac2
fix(ssh): an alias no longer hides known_hosts entries on other ports…
juliusmarminge Nov 13, 2026
368b4fe
fix(server): IPv4-mapped loopback SSH device targets count as this ma…
juliusmarminge Nov 13, 2026
c0b08fa
fix(ssh): host discovery follows Include globs in directory component…
juliusmarminge Nov 13, 2026
8b9f8ca
fix(server): Commit finishes a merge resolved to the current branch's…
juliusmarminge Nov 13, 2026
b8c74f5
fix(server): gh default remote lookup ignores an inherited GIT_DIR (#…
juliusmarminge Nov 13, 2026
7bc3684
docs: FAQ says the Claude 5-hour limit drain is fixed (#31473)
linushohne Nov 13, 2026
336a8c1
fix(server): fork PR worktrees no longer fail when a local branch own…
juliusmarminge Nov 13, 2026
05cc444
fix(web): a failed commit keeps the commit message you typed (#35781)
juliusmarminge Nov 13, 2026
8a1811e
fix(server): branches whose names start with a parenthesis are no lon…
juliusmarminge Nov 13, 2026
49440b2
test(ssh): launcher harness no longer races its background nohup (#35…
juliusmarminge Nov 13, 2026
442b1db
fix(web): Resume replaces Stop without a lingering Stopped button (#3…
juliusmarminge Nov 13, 2026
d86ee1e
test(web): typecheck the project file refresh test (#34061)
maschwenk Nov 13, 2026
6f21b0f
docs(codex): explain native image generation setup (#31426)
dpreil-ydlp Nov 13, 2026
bb9658d
perf(shared): command output failure scan rejects clean output in one…
hieu-lee Nov 13, 2026
5ccc65b
test(web): sidebar drag test opens its folder past the shift guard (#…
juliusmarminge Nov 13, 2026
7fb54eb
feat(mobile): secret field gets an eye toggle to show what you typed …
t3dotgg Nov 13, 2026
5ceabb3
fix(mobile): a cold launch shows the cached thread rows with the firs…
t3dotgg Nov 13, 2026
45b0fe4
fix(server): ACP terminal MCP calls answer interleaved server request…
juliusmarminge Nov 13, 2026
2755a95
fix(web): "Try again" recovers from a failed page chunk load (#35806)
juliusmarminge Nov 13, 2026
36371de
fix(shared): read MCP event streams whatever the case of the content …
juliusmarminge Nov 13, 2026
95cb068
test(web): sidebar drag test ignores a fading row clone after folder …
juliusmarminge Nov 13, 2026
edd6fc3
fix(server): ACP streamed chunks compare message ids exactly (#35836)
juliusmarminge Nov 13, 2026
0fa18ad
fix(install): name the archive when its download fails (#35854)
juliusmarminge Nov 13, 2026
7fb6098
test(server): drop the flaky Kiro provider_thread_resume replay (#35867)
juliusmarminge Nov 13, 2026
ed2a319
fix(web): arrow and page keys scroll the conversation again after a c…
juliusmarminge Nov 13, 2026
8b23382
fix(kiro): compaction is refused when Kiro does not advertise _kiro/s…
juliusmarminge Nov 13, 2026
d20d535
fix(server): show self-resumed Claude subagents as running (#23831)
juliusmarminge Nov 13, 2026
f999dc1
fix(web): preserve single tildes in sent user messages (#35859)
juliusmarminge Nov 13, 2026
e079ad9
fix(desktop): clicking inside the in-app browser closes open host men…
voida6 Nov 13, 2026
d6fc871
fix(desktop): update browser tab titles without navigation (#29452)
voltcrash Nov 13, 2026
d7a0b53
fix(web,mobile): triage follows the draft when you switch machines (#…
pnupu Nov 13, 2026
a000973
fix(server): storage cleanup treats symlinked spellings of a worktree…
juliusmarminge Nov 13, 2026
1c44b29
fix(server): migrate-dev-db refuses unimported legacy threads (#23191)
juliusmarminge Nov 13, 2026
87a772a
fix(web): opening a thread on a touch tablet no longer focuses the co…
juliusmarminge Nov 13, 2026
c967d98
fix(acp): linked terminal output no longer reopens a completed tool c…
juliusmarminge Nov 13, 2026
15cf8b1
fix(acp): root tool content replacements replace streamed output (#35…
juliusmarminge Nov 13, 2026
5e18314
fix(forgejo): fast-forward-only repositories can merge pull requests …
juliusmarminge Nov 13, 2026
b1bc5ce
fix(server): linking says why each address failed discovery (#30884)
juliusmarminge Nov 13, 2026
8a227eb
fix(terminal): show recovery guidance when a project folder is missin…
juliusmarminge Nov 13, 2026
1e96606
fix(client-runtime): reopened files show host edits instead of the fi…
juliusmarminge Nov 13, 2026
b23f94e
fix(server): preview resize and status report the real size of deskto…
Entrpi Nov 13, 2026
496856d
fix(server): migration 64 skips thread payloads that are not valid JS…
juliusmarminge Nov 13, 2026
8a38c63
fix(web): thread navigation shortcuts work from the terminal and macO…
juliusmarminge Nov 13, 2026
025942d
fix(desktop): an unreadable settings file is no longer overwritten by…
juliusmarminge Nov 13, 2026
6f108e8
fix(codex): accept hook event names newer than the pinned protocol (#…
juliusmarminge Nov 13, 2026
e726a08
fix(opencode): /goal clear with no goal set finishes as a no-op (#35893)
juliusmarminge Nov 13, 2026
6bc3726
fix(ssh): a slow reconnect no longer replaces a healthy port forward …
juliusmarminge Nov 13, 2026
be03b93
fix(desktop): one preview viewer or recording stopping no longer free…
juliusmarminge Nov 13, 2026
f39d38b
fix(server): Codex question answers keep their native question id (#3…
juliusmarminge Nov 13, 2026
f539020
test(server): windowed history pages are checked against the full ind…
t3dotgg Nov 13, 2026
afff0d3
fix(clients): answer history no longer shows provider context from re…
juliusmarminge Nov 13, 2026
274474d
fix(server): refresh sync status after agent merges (#35919)
Yash-Singh1 Nov 13, 2026
7556047
fix(web): copying an image with a spaced path keeps it an image (#35914)
juliusmarminge Nov 13, 2026
2e0bd97
fix(server): Force stop no longer tears down a queued follow-up that …
juliusmarminge Nov 13, 2026
5f7bfe5
fix(azure-devops): TF400733 throttling fails diffs as rate-limited (#…
juliusmarminge Nov 13, 2026
ed5afae
fix(acp): v2 tool updates clear nulled fields and replace raw input (…
juliusmarminge Nov 13, 2026
004f7a7
fix(server): interrupted SSH device bootstrap no longer leaks its for…
juliusmarminge Nov 13, 2026
bedc865
fix(mobile): Files search no longer carries into another workspace (#…
juliusmarminge Nov 13, 2026
b62e80e
fix(web): copying an alert callout keeps its alert Markdown (#35932)
juliusmarminge Nov 13, 2026
0a333a6
fix(server): Codex shadow home shares the instance environment CODEX_…
juliusmarminge Nov 13, 2026
97cfc07
fix(preview): remote viewers recover from stalled first captures (#25…
juliusmarminge Nov 13, 2026
0c4b1d8
fix(server): new turns wait for overlapping checkpoint file restores …
juliusmarminge Nov 13, 2026
67d91a0
fix(server): preview_navigate returns the committed page when load is…
juliusmarminge Nov 13, 2026
ec91827
fix(server): unchanged-worktree cleanup waits for the thread to settl…
juliusmarminge Nov 13, 2026
ff1eead
fix(web): zoom shortcuts work while a desktop browser page has focus …
juliusmarminge Nov 13, 2026
0b12767
fix(server): ACP threads accept a model change after their session de…
juliusmarminge Nov 13, 2026
b2078c2
fix(server): service launcher keeps a T3 home that ends in a space (#…
juliusmarminge Nov 13, 2026
99224f0
fix(server): launcher repoints the unit the systemd manager loads (#3…
juliusmarminge Nov 13, 2026
0f5ecef
fix(server): refuse a Linux service for a T3 home systemd cannot load…
juliusmarminge Nov 13, 2026
b7a224c
perf(server): sending, editing and steering queued messages no longer…
juliusmarminge Nov 13, 2026
8fe745d
fix(server): Codex protocol records go to the log of the thread they …
juliusmarminge Nov 13, 2026
c54e5b3
fix(cli): service.env updates keep quoted multiline values intact (#3…
juliusmarminge Nov 13, 2026
a621be8
fix(web): open code blocks and diffs follow a changed word wrap defau…
juliusmarminge Nov 13, 2026
e018563
fix(desktop): keep WSL distros whose names start or end with a dot or…
juliusmarminge Nov 13, 2026
43ce395
test: run clock-free live tests on TestClock (#35868)
juliusmarminge Nov 13, 2026
939b288
fix(server): SSH device test rejects Node below agent-device's 22.12 …
juliusmarminge Nov 13, 2026
cc92740
fix(server): Simlock renewals no longer exceed the gateway's lease TT…
juliusmarminge Nov 13, 2026
ee64555
test: drop Effect.scoped wrappers that @effect/vitest already applies…
juliusmarminge Nov 13, 2026
d06ba27
fix(device): Simlock viewer stops retrying an ended lease and keeps i…
juliusmarminge Nov 13, 2026
15d1ef5
fix(server): Stop waits for the turn to settle instead of polling (#3…
juliusmarminge Nov 13, 2026
a32cdde
ci: label issues from vouched and denounced authors, denounce coygeek…
juliusmarminge Nov 13, 2026
f9cadcc
fix(scripts): dev runner ignores the parent T3 server's port and host…
juliusmarminge Nov 13, 2026
0b0a61a
perf(server): reduce allocation while reading usage history (#36009)
StiensWout Nov 13, 2026
2cb56cb
fix(web): terminal paste keeps a leading U+FEFF without bracketed pas…
juliusmarminge Nov 13, 2026
c29c26a
fix(server): BEL inside a DCS no longer ends it in terminal history (…
juliusmarminge Nov 13, 2026
431e53f
fix(server): terminal history drops the ESC Z identity query (#36024)
juliusmarminge Nov 13, 2026
2432ee1
test(server): blocked pointer-file scan test waits for the unblocked …
juliusmarminge Nov 13, 2026
1acee5b
fix(web): terminal OSC 8 file URIs open the file they name (#36025)
juliusmarminge Nov 13, 2026
73e49aa
fix(server): terminal history strips queries with embedded controls (…
juliusmarminge Nov 13, 2026
0af8be3
fix(mobile): pasted images over the size limit attach instead of vani…
juliusmarminge Nov 13, 2026
7179113
fix(mobile): Android terminal resizes the engine when only the cell s…
juliusmarminge Nov 13, 2026
6237824
fix(server): t3_thread_read results fit MCP clients' output limit (#3…
juliusmarminge Nov 13, 2026
3376c8d
fix(desktop): AppImage t3 shim no longer grows the CLI compile cache …
juliusmarminge Nov 13, 2026
d63c0ec
ci: agent context budget runs are no longer cancelled by label bursts…
juliusmarminge Nov 13, 2026
2dd207a
fix(server): a decoded U+009C no longer ends an OSC string in termina…
juliusmarminge Nov 13, 2026
a2be070
fix(server): speech worker no longer segfaults when the backend dies …
juliusmarminge Nov 13, 2026
5f85768
fix(codex): image items identified by fileId are no longer dropped (#…
juliusmarminge Nov 13, 2026
4596872
perf(server): linked-thread counts update when links change instead o…
juliusmarminge Nov 13, 2026
60f70d9
fix(scripts): scenarios reach the screen and say why they could not r…
juliusmarminge Nov 13, 2026
38c3b56
docs: AGENTS.md and the FAQ list Pi, Muse Code, Kiro, and fx (#33906)
only21mil Nov 13, 2026
b80531d
fix(web): PR Code tab previews images the host sends no patch for (#3…
juliusmarminge Nov 13, 2026
31b5549
fix(web): pull request comment tooltips follow the Time format settin…
juliusmarminge Nov 13, 2026
56e58a9
fix(server): repository identity honors the gh default remote (#21574)
juliusmarminge Nov 13, 2026
c28c6ac
fix(server): a rejected non-fast-forward push explains itself under a…
juliusmarminge Nov 13, 2026
8cb55fa
fix(web): provider rows select from anywhere in the row (#32537)
juliusmarminge Nov 13, 2026
fb2e5a0
fix(client-runtime): imported threads that never ran no longer sit in…
juliusmarminge Nov 13, 2026
dd7918e
fix(web,mobile): MCP app calls keep their tool row and result beside …
juliusmarminge Nov 13, 2026
0902adc
fix(forgejo): tea API failures keep Gitea's reason (#32244)
juliusmarminge Nov 13, 2026
e4025c8
fix(server): reap recorded Linux Claude survivors before recovery (#2…
juliusmarminge Nov 13, 2026
08544ba
fix(web): open documents no longer reload after every agent command (…
juliusmarminge Nov 13, 2026
84efa01
fix(desktop): AppImage quit no longer leaves zygotes running on an un…
juliusmarminge Nov 13, 2026
4225c9d
fix(server): a message sent after a stopped worktree setup waits inst…
Gourav224 Nov 13, 2026
7e1a058
test(server): terminal checkout test waits for the refresh's last eve…
juliusmarminge Nov 13, 2026
290182d
fix(provider-core): Vite+ provider updates respect npm's release-age …
juliusmarminge Nov 13, 2026
6790f85
fix(web): point pairing copy at Sharing & access (#27692)
PedroNavHur Nov 13, 2026
5f69cac
fix(web): turn diffs cut off at the size limit say changes are incomp…
juliusmarminge Nov 13, 2026
082a3e3
fix(web): narrow-window right panel dialog is named Workspace panel (…
juliusmarminge Nov 13, 2026
eb7e63a
fix(server): thread reads preview linked PRs and list_thread_pull_req…
juliusmarminge Nov 13, 2026
74573fc
fix(web): new project publish option tells screen readers whether it …
juliusmarminge Nov 13, 2026
ed05c0e
fix(server): preview drag moves the mouse during the drag (#36096)
juliusmarminge Nov 13, 2026
bd7d264
fix(server): a fresh-session scheduled run no longer takes over the t…
juliusmarminge Nov 13, 2026
10fbff5
fix(server): deferred-steer check and queued cancel no longer read a …
juliusmarminge Nov 13, 2026
21b0b7a
fix(composer): keep reviews from different Git hosts in suggestions (…
saphitv Nov 13, 2026
ed7e501
fix(web): terminal "Add to chat" now adds to a queued message being e…
juliusmarminge Nov 13, 2026
a044f0c
fix(mobile): a final answer followed by more work in the same run sta…
juliusmarminge Nov 13, 2026
fa9d85f
fix(web): a server updated with the app reconnects as soon as it is r…
Bil0000 Nov 13, 2026
7903b48
fix(acp): Copilot runs end when its reply is done, not when its async…
juliusmarminge Nov 13, 2026
08be782
fix(server): a link forgotten mid-resolve says it is not linked (#36132)
juliusmarminge Nov 13, 2026
4aec277
fix(server): t3_queue and handoff analytics no longer read a thread's…
juliusmarminge Nov 13, 2026
2d8a843
perf(server): shell reads of a worktree or family no longer parse eve…
juliusmarminge Nov 13, 2026
c7a3f02
fix(desktop): Local environment off survives an unreadable value in d…
juliusmarminge Nov 13, 2026
095611d
fix(mobile): a sub-agent opened from its parent on a narrow iPad keep…
juliusmarminge Nov 13, 2026
8610b31
fix(server): Codex usage answering after three seconds is no longer d…
juliusmarminge Nov 13, 2026
9a35ab0
fix(mobile): iOS terminal font and theme changes no longer replay out…
shivamhwp Nov 13, 2026
f313d0a
fix(server): stop device daemon alongside slow hub shutdown (#33566)
shivamhwp Nov 13, 2026
3ac8b1f
fix(acp): bound unread notification retention by size (#23217)
juliusmarminge Nov 13, 2026
00f617d
fix(client-runtime): recover subscriptions that stop on a healthy con…
juliusmarminge Nov 13, 2026
e419417
fix(server): stopping the service during the pre-update backup ends t…
juliusmarminge Nov 13, 2026
928dd04
fix(server): preview browser downloads Chrome 157.0.8103.78 with its …
juliusmarminge Nov 13, 2026
d0957bc
fix(opencode): restarted server stops an orphaned OpenCode server sta…
juliusmarminge Nov 13, 2026
c398b46
fix(server): Codex text generation runs when launch args define an MC…
juliusmarminge Nov 13, 2026
759e649
fix(server): agent recordings keep up with the page instead of the en…
juliusmarminge Nov 13, 2026
9b6dde9
fix(server): session import finds compressed Codex rollouts (#34947)
juliusmarminge Nov 13, 2026
148612e
fix(opencode): usage scans reuse unchanged rows and run off the event…
juliusmarminge Nov 13, 2026
d3ef7e8
fix(cursor): send the catalog's default model parameters on every Cur…
juliusmarminge Nov 13, 2026
0568a63
fix(server): agents point to Settings → Labs when the link tools are …
juliusmarminge Nov 13, 2026
139ec80
fix(server): Claude no longer dispatches skill mentions from handoff …
juliusmarminge Nov 13, 2026
4b316fd
fix(web): clear deleted checkout labels from the sidebar (#25063)
juliusmarminge Nov 13, 2026
4582a3b
fix(server): MacPorts-owned agent CLIs are no longer updated through …
juliusmarminge Nov 13, 2026
286eeea
test(desktop): AppImage shim test no longer writes into its temp dir …
juliusmarminge Nov 13, 2026
f62fa29
fix(web): Add to another machine can find ignored files past the firs…
juliusmarminge Nov 13, 2026
b5c0ee5
fix(mobile): Android Back from Pulls or Usage returns to Threads (#36…
juliusmarminge Nov 13, 2026
d19467a
fix(server): a thread visit stores only its read state (#36233)
juliusmarminge Nov 13, 2026
5cbdf00
fix(web): mostly vertical trackpad scrolls no longer navigate back or…
juliusmarminge Nov 13, 2026
8bf0dc4
fix(opencode): a resumed task subagent's turn no longer collides with…
juliusmarminge Nov 13, 2026
a4a8c61
fix(server): preview click, hover and drag survive a target replaced …
juliusmarminge Nov 13, 2026
0f13d63
fix(browser): Stop cancels loading pages (#29475)
voltcrash Nov 13, 2026
0faf728
chore(coil): merge upstream/main 0f13d638af (374 commits)
radroid Nov 13, 2026
378f360
ci(coil): retire upstream's issue-vouch workflow like pr-vouch
radroid Nov 13, 2026
ddb59e9
ci(coil): web tests run in two shards so headless Chromium no longer …
radroid Nov 13, 2026
af2606a
ci(coil): the daily sync and resolver run web tests in two shards too
radroid Nov 13, 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
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .github/VOUCHED.td
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ github:btsouth
github:cestercian
github:chrisdeeming
github:chuks-qua
-github:coygeek Filed over 270 automated issues, about 50 a day at peak, far past what maintainers can triage
github:cursoragent
github:D3OXY
github:dbalders
Expand Down
12 changes: 6 additions & 6 deletions .github/actions/setup-ci-deps/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ runs:
- name: Cache Vite+
id: vp_cache
if: steps.vp.outputs.version != ''
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
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 }}
Expand All @@ -56,7 +56,7 @@ runs:
# partial bytes, so a shorter limit costs a slow download only a retry.
- name: Setup Vite+
if: steps.vp_cache.outputs.cache-hit != 'true'
uses: voidzero-dev/setup-vp@250f29ce396baf5e8f24498e17c0dfdebabc26eb # v1
uses: voidzero-dev/setup-vp@250f29ce396baf5e8f24498e17c0dfdebabc26eb # v1.15.0
env:
VP_DOWNLOAD_TIMEOUT: "120"
with:
Expand Down Expand Up @@ -92,7 +92,7 @@ runs:
- name: Restore pnpm store
id: pnpm_cache
if: inputs.install == 'true'
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: ${{ steps.pnpm_store.outputs.path }}
key: pnpm-${{ steps.pnpm_store.outputs.namespace }}-v1-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('pnpm-lock.yaml', 'pnpm-workspace.yaml', 'package.json') }}
Expand All @@ -106,7 +106,7 @@ runs:
- name: Restore lockfile verification
id: pnpm_verified
if: inputs.install == 'true'
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: ${{ steps.pnpm_store.outputs.verified }}
key: pnpm-verified-v1-${{ hashFiles('pnpm-lock.yaml', 'pnpm-workspace.yaml', 'package.json') }}
Expand All @@ -121,7 +121,7 @@ runs:

- name: Save lockfile verification
if: inputs.install == 'true' && steps.pnpm_verified.outputs.cache-hit != 'true'
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: ${{ steps.pnpm_store.outputs.verified }}
key: ${{ steps.pnpm_verified.outputs.cache-primary-key }}
Expand All @@ -138,7 +138,7 @@ runs:
steps.pnpm_cache.outputs.cache-hit != 'true' &&
(steps.pnpm_store.outputs.namespace == 'full' ||
steps.pnpm_cache.outputs.cache-matched-key != format('pnpm-full-v1-{0}-{1}-{2}', runner.os, runner.arch, hashFiles('pnpm-lock.yaml', 'pnpm-workspace.yaml', 'package.json')))
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: ${{ steps.pnpm_store.outputs.path }}
key: ${{ steps.pnpm_cache.outputs.cache-primary-key }}
Expand Down
45 changes: 45 additions & 0 deletions .github/scripts/check-nightly-release.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -121,9 +121,54 @@ async function resolveLatestNightlyCommit({ github, context, core }) {
return { tag, sha: commit.sha, version };
}

// The two places a nightly install looks for an update: the `update-feed` pointer, and
// releases.atom, which holds the 10 newest git tags of any kind. Older installs take the first
// nightly in the feed. Reports what each names beside the newest published nightly.
async function readNightlyUpdateFeed({ github, context, fetch = globalThis.fetch }) {
const latest = await findLatestNightly({ github, context });
if (!latest) return {};

const base = `https://github.com/${context.repo.owner}/${context.repo.repo}`;
// Only a missing or malformed pointer is stale. Rewriting deletes the old file first, so a
// GitHub outage must not look like one.
// Node waits five minutes for a stalled response, which is this job's whole time limit.
const signal = () => AbortSignal.timeout(30_000);
const pointer = await fetch(`${base}/releases/download/update-feed/nightly.json`, {
signal: signal(),
});
if (!pointer.ok && pointer.status !== 404) {
throw new Error(`The update-feed pointer answered HTTP ${pointer.status}.`);
}
let pointerTag;
if (pointer.ok) {
// A body that fails to arrive throws here; only one that is not JSON counts as malformed.
const body = await pointer.text();
try {
pointerTag = JSON.parse(body)?.tag_name;
} catch {}
}

// An unreadable feed leaves `feedTags` unset, so the pointer is still repaired. An error page
// can answer HTTP 200, so only an Atom document counts as read.
let feedTags;
try {
const feed = await fetch(`${base}/releases.atom`, { signal: signal() });
const body = feed.ok ? await feed.text() : "";
if (/<feed[\s>]/.test(body)) {
feedTags = Array.from(body.matchAll(/href="[^"]*\/releases\/tag\/([^"]+)"/g), (match) =>
decodeURIComponent(match[1]),
);
}
} catch {}
const feedNightly = feedTags?.find((tag) => /^v?\d+\.\d+\.\d+-nightly\./.test(tag));

return { tag: latest.tagName, pointerTag, feedNightly, feedTags };
}

module.exports = {
assertCommitOnDefaultBranch,
assertReleaseSource,
shouldReleaseNightly,
resolveLatestNightlyCommit,
readNightlyUpdateFeed,
};
78 changes: 78 additions & 0 deletions .github/scripts/check-nightly-release.test.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -237,3 +237,81 @@ test("stable releases fail when no nightly is published", async () => {
const { options } = nightlyCommitFixture({ releases: [nightly(1, { tagName: "v1.0.0" })] });
await assert.rejects(resolveLatestNightlyCommit(options), /No published nightly found/);
});

const { readNightlyUpdateFeed } = require("./check-nightly-release.cjs");

// GitHub percent-encodes tag names in the feed, and any tag in the repository takes a slot.
const atomEntry = (tag) =>
`<entry><link rel="alternate" type="text/html" href="https://github.com/example/app/releases/tag/${encodeURIComponent(tag)}"/></entry>`;
const atomFeed = (tags) => new Response(`<feed>${tags.map(atomEntry).join("")}</feed>`);
const NEWEST = "v1.0.1-nightly.20260905.123";
const OLDER = "v1.0.1-nightly.20260905.100";

function updateFeedFixture({ feed, pointer }) {
const { options } = fixture({
releases: [nightly(1), nightly(0, { tagName: "v1.0.2-preview.1" })],
});
options.fetch = async (url) =>
url === "https://github.com/example/app/releases.atom"
? feed
: url === "https://github.com/example/app/releases/download/update-feed/nightly.json"
? pointer
: assert.fail(`unexpected fetch ${url}`);
return options;
}

const missing = () => new Response("Not Found", { status: 404 });
// HTTP 200, then the connection drops before the body arrives.
const brokenBody = () =>
new Response(new ReadableStream({ start: (controller) => controller.error(new Error("reset")) }));
for (const [name, { feed, pointer }, expected] of [
[
"a nightly crowded out of the feed and a missing pointer",
{ feed: atomFeed(["v1.0.2-preview.1", "mobile-android-build/2.3.0/abc"]), pointer: missing() },
{ pointerTag: undefined, feedNightly: undefined },
],
[
"the first nightly in the feed, which is the one older installs take",
{ feed: atomFeed(["update-feed", OLDER, NEWEST]), pointer: Response.json({ tag_name: OLDER }) },
{ pointerTag: OLDER, feedNightly: OLDER },
],
[
"a malformed pointer as stale and an unreadable feed as naming nothing",
{ feed: new Response("", { status: 503 }), pointer: Response.json(null) },
{ pointerTag: undefined, feedNightly: undefined, unreadable: true },
],
[
"an HTML page with release links as an unreadable feed",
{
feed: new Response(
`<html><feedback-form></feedback-form><a href="/example/app/releases/tag/${OLDER}">x</a></html>`,
),
pointer: Response.json({ tag_name: NEWEST }),
},
{ pointerTag: NEWEST, feedNightly: undefined, unreadable: true },
],
[
"the pointer when the feed's body fails to arrive",
{ feed: brokenBody(), pointer: Response.json({ tag_name: NEWEST }) },
{ pointerTag: NEWEST, feedNightly: undefined, unreadable: true },
],
]) {
test(`update feed check reports ${name}`, async () => {
const { tag, pointerTag, feedNightly, feedTags } = await readNightlyUpdateFeed(
updateFeedFixture({ feed, pointer }),
);
const { unreadable = false, ...named } = expected;
assert.deepEqual({ tag, pointerTag, feedNightly }, { tag: NEWEST, ...named });
assert.equal(feedTags === undefined, unreadable);
});
}

for (const [name, pointer, error] of [
["answers with an error", () => new Response("", { status: 503 }), /pointer answered HTTP 503/],
["drops the connection", brokenBody, /reset/],
]) {
test(`update feed check does not call a pointer stale when GitHub ${name}`, async () => {
const options = updateFeedFixture({ feed: atomFeed([NEWEST]), pointer: pointer() });
await assert.rejects(readNightlyUpdateFeed(options), error);
});
}
7 changes: 2 additions & 5 deletions .github/workflows/agent-context-budget.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,7 @@ on:
permissions:
contents: read

concurrency:
group: agent-context-budget-${{ github.event.pull_request.number }}
cancel-in-progress: true

# No concurrency group: label events arrive in bursts, and a cancelled run reports as a failed check.
jobs:
budget:
name: Agent context budget
Expand All @@ -24,7 +21,7 @@ jobs:
ALLOW_INCREASE: ${{ contains(github.event.pull_request.labels.*.name, 'agent-context-increase') }}
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
with:
sparse-checkout: apps/server/src/provider/agentContextBudget.json
sparse-checkout-cone-mode: false
Expand Down
11 changes: 9 additions & 2 deletions .github/workflows/coil-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -103,10 +103,17 @@ jobs:
- name: Test
run: vp run --filter '!t3' --filter '!@t3tools/monorepo' --filter '!@t3tools/web' test --testTimeout=120000 --hookTimeout=120000

# Split in two because one headless Chromium running all ~585 web files on these runners lost its
# page late in the run in 5 of 6 runs on 2026-11-13 (`Browser connection was closed`), with no
# test failing.
test_web:
name: Test Web
name: Test Web ${{ matrix.shard }}
runs-on: ubuntu-latest
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
shard: [1, 2]
steps:
- name: Checkout
uses: actions/checkout@v6
Expand All @@ -127,7 +134,7 @@ jobs:
# falls back to GITHUB_REPOSITORY, which on the fork's runners is radroid/t3code.
env:
T3CODE_DESKTOP_UPDATE_REPOSITORY: pingdotgg/t3code
run: vp run --filter @t3tools/web test --testTimeout=120000 --hookTimeout=120000
run: vp run --filter @t3tools/web test --shard ${{ matrix.shard }}/${{ strategy.job-total }} --testTimeout=120000 --hookTimeout=120000

# apps/server sets `fileParallelism: false`, so its 524 test files run one at a time. Upstream
# shards them six ways by recorded duration (apps/server/src/testUtils/weightedShardSequencer.ts).
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/coil-sync-resolve.yml
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,8 @@ jobs:
4. Verify: run `vp run typecheck`, `vp run lint`, then the tests in two runs, web
last and alone:
`vp run --filter '!@t3tools/monorepo' --filter '!@t3tools/web' test --testTimeout=120000 --hookTimeout=120000`
then `vp run --filter @t3tools/web test --testTimeout=120000 --hookTimeout=120000`.
then `vp run --filter @t3tools/web test --shard 1/2 --testTimeout=120000 --hookTimeout=120000`
and the same with `--shard 2/2`.
The timeout flags are required: apps/web pins 15s, which is too tight for this
runner, and 120s matches the fork's CI gate without lowering any package's own
budget. Web runs alone because a web test's in-file 30s hook budget times out
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/mobile-dev-client.yml
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ jobs:
T3_NATIVE_CLIENT_VERBOSE: "1"
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
with:
ref: ${{ inputs.ref || github.sha }}

Expand Down Expand Up @@ -144,7 +144,7 @@ jobs:
# the runs holding the cache login restore.
- name: Mount build cache
if: github.event_name != 'pull_request'
uses: useblacksmith/stickydisk@v1
uses: useblacksmith/stickydisk@3f6be1451e3cad893b778bc93495c80452a5da26 # v1.7.2
with:
key: ${{ github.repository }}-android-dev-client-${{ matrix.abi }}
path: ~/.cache/t3-android-dev-client
Expand All @@ -165,7 +165,7 @@ jobs:
install-args: --filter=@t3tools/mobile... --filter=@t3tools/scripts...

- name: Setup Java
uses: actions/setup-java@v5
uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5.7.0
with:
distribution: temurin
java-version: 17
Expand Down Expand Up @@ -232,7 +232,7 @@ jobs:
T3_NATIVE_CLIENT_VERBOSE: "1"
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
with:
ref: ${{ inputs.ref || github.sha }}

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/mobile-fingerprint-label.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ jobs:
steps:
- id: pr
name: Resolve the pull request behind the check
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
with:
script: |
const run = context.payload.workflow_run;
Expand Down Expand Up @@ -100,7 +100,7 @@ jobs:
- name: Sync native change label
if: steps.pr.outputs.pr_number != ''
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
env:
PR_NUMBER: ${{ steps.pr.outputs.pr_number }}
CHANGED_PLATFORMS: ${{ steps.result.outputs.changed_platforms }}
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/pr-limits.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,13 @@ jobs:
# branch and never run PR code. Cone mode also checks out the files beside
# .github/scripts, which is where TRIAGE_EXEMPTIONS.td and VOUCHED.td live.
- name: Checkout trusted scripts
uses: actions/checkout@v6
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
with:
ref: ${{ github.event.repository.default_branch }}
sparse-checkout: .github/scripts

- name: Close PRs over the limit
uses: actions/github-script@v8
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
env:
DRY_RUN: ${{ vars.PR_LIMITS_ENFORCE != 'true' }}
with:
Expand All @@ -57,13 +57,13 @@ jobs:
cancel-in-progress: false
steps:
- name: Checkout trusted scripts
uses: actions/checkout@v6
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
with:
ref: ${{ github.event.repository.default_branch }}
sparse-checkout: .github/scripts

- name: Request rebases and close what went unanswered
uses: actions/github-script@v8
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
env:
DRY_RUN: ${{ vars.PR_LIMITS_ENFORCE != 'true' || (github.event_name == 'workflow_dispatch' && inputs.dry_run) }}
with:
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/windows-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:
timeout-minutes: 45
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
with:
sparse-checkout: |
/*
Expand All @@ -40,7 +40,7 @@ jobs:
# setup-vp's own cache restores a Linux-shaped store on Windows, which is
# slower than no cache (see #7975). Cache pnpm's Windows store directly.
- name: Setup Vite+
uses: voidzero-dev/setup-vp@v1
uses: voidzero-dev/setup-vp@250f29ce396baf5e8f24498e17c0dfdebabc26eb # v1.15.0
with:
node-version-file: package.json
cache: false
Expand All @@ -52,7 +52,7 @@ jobs:
run: '"path=$(vp pm cache dir)" >> $env:GITHUB_OUTPUT'

- name: Cache packages
uses: actions/cache@v6
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: ${{ steps.package_cache_path.outputs.path }}
key: windows-tests-packages-v1-${{ hashFiles('pnpm-lock.yaml') }}
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,5 @@ node_modules/

# pnpm content-addressable store; never belongs in the repo.
.pnpm-store/

/packages/ssh/.ssh-launcher-test-*/
Loading
Loading