Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
2013 commits
Select commit Hold shift + click to select a range
bb646d2
fix(shared): links to bracketed filenames keep their folder labels (#…
Nov 12, 2026
ddc4f57
fix(server): a Claude resume rejected before the prompt keeps the nat…
Nov 12, 2026
5c6f2f1
fix(server): Codex MCP servers that fail to start show a notice in th…
Nov 12, 2026
a25654c
fix(server): block incompatible migration history in preflight (#34773)
Nov 12, 2026
6419422
fix(server): a reset credit's limits refresh when the first read afte…
Nov 12, 2026
4bf5d53
fix(forgejo): HTTP-only fj logins are no longer reported unauthentica…
Nov 12, 2026
8212aaa
fix(server): a new worktree thread's agent starts on its renamed bran…
Nov 12, 2026
6de770c
fix(server): ACP retries a config option whose write failed for a rea…
Nov 12, 2026
62dc589
chore: denounce wSedlacek (#34789)
Nov 12, 2026
a18a458
fix(cursor): resume moved threads from their original session store (…
Nov 12, 2026
ed54f30
docs: CONTRIBUTING.md is shorter and says we only take bug fixes (#34…
Nov 12, 2026
6ba3de7
fix(server): remote delegate_task runs on the driver it names (#34790)
Nov 12, 2026
18866e5
fix(server): schedule_task updates apply freshSession (#34801)
Nov 12, 2026
661a3e2
fix(web): Backspace right after a list shortcut keeps the typed marke…
Nov 12, 2026
31a108c
fix(contracts): Space shortcuts reach clients instead of reverting to…
Nov 12, 2026
dbfbe39
fix(web): questions without options no longer mention a selected opti…
Nov 12, 2026
71e1f2a
fix(server): threads launched in the project folder record its branch…
Nov 12, 2026
c833a60
fix(server): tell the thread when its worktree branch keeps the tempo…
Nov 12, 2026
2ed6f10
fix(server): fresh-session schedules start while an old session has b…
Nov 12, 2026
1a1f9ac
fix(web): Ctrl/Cmd+Enter sends new threads when the send shortcut nee…
Nov 12, 2026
7fc9aa6
fix(shared): typing after a skill chip no longer reparses the prompt …
Nov 12, 2026
9786b82
fix(provider-acp): wait_for_exit answers when a background child hold…
Nov 12, 2026
a86ffac
fix(server): Claude sets a /goal that also mentions a skill (#34818)
Nov 12, 2026
9e716b6
fix(server): resumed Claude sessions wait for their MCP servers (#34822)
Nov 12, 2026
7466707
fix(server): re-import no longer marks a continued transcript importe…
Nov 12, 2026
3c68642
fix(server): file links relative to a gitignored git worktree open th…
Nov 12, 2026
bfec275
fix(server): restart recovery wakes delegated children waiting on bac…
Nov 12, 2026
28b4cee
fix(opencode): a Stop OpenCode 2 never answers offers Force stop (#34…
Nov 12, 2026
6be2685
fix(server): side chat fork context recovers history from the parent …
Nov 12, 2026
4e0b528
fix(cursor): agent shell commands stream their output while they run …
Nov 12, 2026
3bd7b04
fix(web): Escape and tool keys work as soon as preview annotation sta…
Nov 12, 2026
ff599f0
fix(server): Claude subagent results drop Claude Code's tools-used no…
Nov 12, 2026
9f1e97d
fix(server): context handoff names omitted items instead of a read fr…
Nov 12, 2026
c085a0a
fix(server): a slow baseline checkpoint no longer holds every prompt …
Nov 12, 2026
3b732f4
fix(server): Codex subagent rows show the child's current command (#3…
Nov 12, 2026
101e5f9
fix(web): review comments in question answers reach the agent with th…
Nov 12, 2026
0b6f482
fix(server): T3 Connect says whether an unresolved address exists in …
Nov 12, 2026
6b2591b
fix(source-control): a query or fragment after .git keeps the reposit…
Nov 12, 2026
dcad194
fix(client-runtime): provider toggles no longer wait for another prov…
Nov 12, 2026
555bb2f
fix(desktop): Linux desktop builds run the packaged-server self-check…
Nov 12, 2026
db04d3a
fix(server): subagent threads get short ids agents can quote back (#3…
Nov 12, 2026
204b140
fix(web): context row under the composer hides chat text scrolling be…
Nov 12, 2026
0ac41ee
fix(web): sidebar rows drop a branch and worktree that were deleted (…
Nov 12, 2026
8024e50
fix(server): a fork made after Edit from here no longer shows the rew…
Nov 12, 2026
9359081
fix(server): a pull request watch started after a pending self-settle…
Nov 12, 2026
1df9c91
fix(server): thread reads list only open linked PRs and show their wa…
Nov 12, 2026
eeae0b2
fix(server): finished delegated Codex children no longer pile up in C…
Nov 12, 2026
07efa5b
fix(acp): ask forms with a free-text companion field show one step pe…
Nov 12, 2026
eeccecf
fix(server): deleting a source thread keeps the pages its live fork s…
Nov 12, 2026
415e1ca
fix(web): html render images open with the rest of their page in the …
Nov 12, 2026
9bcca04
fix(provider-core): one failed status check no longer marks a ready p…
Nov 12, 2026
1e438c8
fix(server): Codex goals wait for a delegated task instead of re-prom…
Nov 12, 2026
2e18418
fix(web): Incognito browser visits stay out of project history (#34859)
Nov 12, 2026
c9211b6
fix(server): favicon lookups for a missing project folder are cached …
Nov 12, 2026
74ffe35
fix(provider-core): Codex turns refused by a managed access policy sa…
Nov 12, 2026
e77384b
fix(server): Claude forked skills record the model they run on (#34848)
Nov 12, 2026
96905b9
fix(deps): resolve path-to-regexp 6.3.0 under @vercel/routing-utils (…
Nov 12, 2026
080b10c
fix(server): new worktrees survive git printing over 1 MB (#34889)
Nov 12, 2026
4be96e0
fix(server): status of a new repository no longer waits on huge untra…
Nov 12, 2026
1e84887
fix(web): a sidebar click no longer gets lost when the release report…
Nov 12, 2026
2b07556
fix(web): a stashed prompt ending in a skill or file chip restores as…
Nov 12, 2026
34de974
fix(web): clicking the timeline's empty padding keeps following a str…
Nov 12, 2026
b63b559
fix(server): browser setup command names the running t3 executable, n…
Nov 12, 2026
0b1b9d4
fix(desktop): app opens after an update while the old server shuts do…
Nov 12, 2026
5fb9ee5
fix(server): standalone Codex is checked against the native release c…
Nov 12, 2026
fb2580a
fix(provider-muse): an unfinished Muse install says how to finish set…
Nov 12, 2026
7aaf5ce
fix(ssh): a failed remote t3 download says what failed and how to ins…
Nov 12, 2026
d8b0a05
fix(clients): Claude question option previews are shown under their o…
Nov 12, 2026
e2f1a21
fix(server): a failed delegated task keeps its child's final report (…
Nov 12, 2026
b53cd67
fix(server): handoff budget estimates stored history in tokens, not b…
Nov 12, 2026
f423a4d
fix(desktop): a failed update-track save keeps offering the current t…
Nov 12, 2026
5922408
fix(server): custom Claude models named like a Claude Code alias reac…
Nov 12, 2026
d7454f7
fix(server): finished Claude delegates release their process (#34934)
Nov 12, 2026
59ff986
fix(mobile): iPhone Settings search keeps its query after switching t…
Nov 12, 2026
b85a21e
fix(mobile): Android review sheet scrolls to Submit review (#34887)
Nov 12, 2026
26433ac
fix(server): boot service log is emptied in place once it passes 10 M…
Nov 12, 2026
5c0eb51
fix(server): a missed fixed-time slot shows as failed on its schedule…
Nov 12, 2026
2de3370
fix(server): Stop interrupts a provider turn that starts while it lan…
Nov 12, 2026
dc032d7
feat(web,mobile): Add project lists only GitHub until you turn other …
Nov 12, 2026
b68aedf
fix(opencode): updating restarts the background service on the new ve…
Nov 12, 2026
ee90bdc
fix(web): CSV/TSV and large-text previews say "1 row", "1 column" and…
Nov 12, 2026
52273b7
fix(desktop): browser panel can approve local HTTPS certificates (#24…
Nov 12, 2026
a4d0a06
perf(server): sending to a very long thread reads about 5x less of it…
Nov 12, 2026
56c4e20
fix(cursor): user-invoked skills hidden from the model reach the Curs…
Nov 12, 2026
9f4b42e
fix(server): thread find skips empty replies hidden beside an HTML re…
Nov 12, 2026
09e1751
fix(server): Codex sign-in hint names the instance's CODEX_HOME (#35004)
Nov 12, 2026
3126806
fix(server): project identity follows gh repo set-default (#35005)
Nov 12, 2026
25123c2
fix(shared): html_render pages from OpenCode 2 Code Mode show and are…
Nov 12, 2026
c17ec82
fix(web): overlong content search queries explain the 256-character l…
Nov 12, 2026
1a5d373
fix(server): Claude replies stream paragraph by paragraph again (#35037)
Nov 12, 2026
37e0fd3
fix(server): a run whose recovery state can't be read fails instead o…
Nov 12, 2026
84e69da
fix(web): No project threads offer no Initialize Git, and their linke…
Nov 12, 2026
805251b
fix(server): thread setting changes no longer end a Claude session's …
Nov 12, 2026
becc7d3
fix(server): Tailscale Serve no longer takes a live server's route an…
Nov 12, 2026
ac781dc
fix(server): delegate_task wait returns its task handle before Node f…
Nov 12, 2026
7a39060
fix(server): a damaged state database fails startup with its path and…
Nov 12, 2026
e1fad19
fix(desktop): a login shell slower than 5s at launch still yields its…
Nov 12, 2026
3ec8347
fix(opencode): a slow OpenCode 2 server start no longer leaves the mo…
Nov 12, 2026
cbc38a1
fix(server): one unresponsive provider no longer stalls every thread'…
Nov 12, 2026
68f1bc5
fix(desktop): SnapShot shortcut rebinds after the desktop portal rest…
Nov 12, 2026
5bb4452
fix(server): desktop browser tabs on System appearance follow the sys…
Nov 12, 2026
d6ac53e
fix(server): a project whose origin URL contains a space gets a repos…
Nov 12, 2026
dd9c2f8
fix(desktop): installing an update closes SSH port forwards before re…
Nov 12, 2026
f10a502
fix(web): Files tree keeps expanded folders across remounts (#35067)
Nov 12, 2026
22910ff
fix(ssh): an ssh config alias keeps following its Port after it chang…
Nov 12, 2026
4ff329d
fix(server): fork PRs into gh's upstream base use an owner-qualified …
Nov 12, 2026
002dc9b
fix(web): file names with a backslash no longer split into folders in…
Nov 12, 2026
6da3ff2
fix(server): automatic pulls and pull request refresh let slow checko…
Nov 12, 2026
12b29eb
fix(server): Codex turns use the configured reasoning summary instead…
Nov 12, 2026
beaf284
fix(provider-core): Vite+ system_first shims update the install they …
Nov 12, 2026
f39c440
fix(web): diff tab keeps its scroll position across thread switches (…
Nov 12, 2026
5fae2b5
test(web): command palette tests clear a leaked last-used project (#3…
Nov 12, 2026
bf13d60
fix(opencode): OpenCode 2 threads see T3 Code's MCP tools on their fi…
Nov 12, 2026
40526f9
fix(server): a finished turn refreshes only its own project's PR list…
Nov 12, 2026
8f54d4b
fix(desktop): exits that skip quit are recorded in the trace and logs…
Nov 12, 2026
2b7e975
fix(clients): say "Starting Claude" until the provider actually start…
Nov 12, 2026
01200aa
fix(mobile): long thread titles in the @ picker keep their Thread mar…
Nov 12, 2026
12d4c62
fix(web): every settings nav group has a name for screen readers (#35…
Nov 12, 2026
b2e86d7
fix(web): an invalid provider setting is refused at its field instead…
Nov 12, 2026
abbd967
fix(web): PR comment hover excerpts no longer end in a replacement ch…
Nov 12, 2026
9c5b6f3
fix(mobile): Android composer keeps its cursor after a drag-scroll (#…
Nov 12, 2026
32f3d8b
fix(client-runtime): Diagnostics Resource History keeps updating whil…
Nov 12, 2026
efd683c
fix(web): a failed send leaves the timeline when a new draft was type…
Nov 12, 2026
cb931fc
fix(web): a save in one tab no longer erases what another tab saved (…
Nov 12, 2026
80cccdc
fix(server): projects read their own Git repository when the server i…
Nov 12, 2026
3d6ece2
fix(web): file links the agent cited from another project open that p…
Nov 12, 2026
ced85c6
fix(client): a message the host never answers fails after 60 seconds …
Nov 12, 2026
e6a8b48
fix(server): a new worktree no longer fails when its generated folder…
Nov 12, 2026
e89c8ce
fix(server): a file ticked Viewed before loading a push shows Changed…
Nov 12, 2026
0627489
fix(server): selected-file commits during a cherry-pick or revert are…
Nov 12, 2026
83ee96f
fix(web): chat text selection stays continuous while scrolling (#35074)
Nov 12, 2026
a33d50a
fix(server): committing a large selection of files no longer fails wi…
Nov 12, 2026
86ae174
fix(server): Claude threads resume the session /clear started (#35054)
Nov 12, 2026
8b2763f
perf(mobile): each environment sends about 85% less data at launch (#…
Nov 12, 2026
7d3635e
perf(server): oversized transcript exports fail fast and thread opens…
Nov 12, 2026
d2b8f29
fix(web): icon-only chat header controls show their name on hover (#3…
Nov 12, 2026
5574cca
fix(web): panel resize handle no longer covers the chat scrollbar (#3…
Nov 12, 2026
e6119fd
fix(web): browser settings changed in project scope no longer overwri…
Nov 12, 2026
8ef649f
fix(server): Commit refuses while a merge still has conflict markers …
Nov 12, 2026
1de3c3c
fix(server): a pass that changes several watched pull requests wakes …
Nov 12, 2026
51b1858
fix(server): a slow file read in the search watcher no longer freezes…
Nov 12, 2026
1c9d32f
fix(shared): composer # suggestions sort by update instant, not times…
Nov 12, 2026
3a815e9
fix(client-runtime): relative Markdown images in a remote thread no l…
Nov 12, 2026
26e769d
docs: the README now shows the app and gets you installed fast (#35170)
Nov 12, 2026
a30cb32
fix(web): Esc in the keybindings search clears it without closing Set…
Nov 12, 2026
a94846d
fix(web): file editor carets and selections follow code font changes …
Nov 12, 2026
e93f2a5
fix(server): schedule_task no longer tells agents bindToCurrentThread…
Nov 12, 2026
71dfe27
fix(web): an untouched sidebar thread rename keeps a title that arriv…
Nov 12, 2026
fc6c7c8
fix(server): usage model details count the real unpriced tokens (#35179)
Nov 12, 2026
3e03072
perf(server): thread list reads no longer scan a long thread's runs a…
Nov 12, 2026
9771c5f
fix(server): Kiro, fx and Antigravity find a ~/ Binary path (#35171)
Nov 12, 2026
f419698
feat(web): drop folders on the sidebar to add them as projects (#35202)
Nov 12, 2026
1032135
fix(server): Edit from here recreates a worktree folder that lost its…
Nov 12, 2026
d412871
fix(server): a task on a linked environment stays under its parent in…
Nov 12, 2026
64959eb
fix(web): terminal Ctrl+Shift+C copies on non-Latin keyboard layouts …
Nov 12, 2026
5e2438c
perf(server): sending to a thread with thousands of finished subagent…
Nov 12, 2026
65c0195
fix(mobile): the thread list no longer reshuffles once per environmen…
Nov 12, 2026
bf8e5e6
fix(web): a failed page in the floating browser preview shows the err…
Nov 12, 2026
1d218d1
feat(web): screen reader window title leads with the thread's status …
Nov 12, 2026
476fc9b
test(server): wire budget measures what clients fetch today, and the …
Nov 12, 2026
4947db0
fix(github): PR templates in a lowercase pull_request_template/ direc…
Nov 12, 2026
5911884
perf(server): sending to a long compacted thread waits about 3x less …
Nov 12, 2026
e9e934b
fix(acp): new Copilot threads run the model the composer shows (#35199)
Nov 12, 2026
156dcd8
perf(server): long threads open 2 to 6x faster from a cold cache (#35…
Nov 12, 2026
3ffd38e
ci(release): a repo variable pauses scheduled nightly releases (#35287)
Nov 12, 2026
6807c3f
fix(server): file search no longer crashes the server, and a failed E…
Nov 12, 2026
2482b03
perf(client): threads load while the socket connects, with fewer roun…
Nov 12, 2026
4fd40e1
perf(server): Load earlier turns takes about half the time on a runni…
Nov 12, 2026
fd8e386
fix(mobile): the thread list shows server changes after a tab round t…
Nov 12, 2026
2b4a9c7
test(web): inline confirm tests no longer race the 3s disarm timer (#…
Nov 12, 2026
69dd4d0
test(web): Add Environment dialog test fills fields instead of typing…
Nov 12, 2026
4e48d9e
test(web): HTML preview accordion test waits for the frame's script b…
Nov 12, 2026
7c22095
fix(client-runtime): a stalled sign-in token or dead route no longer …
Nov 12, 2026
34c5faa
fix(desktop): release-note entities named like Object.prototype keys …
Nov 12, 2026
371963c
fix(desktop): startup log prune keeps files that rotation never names…
Nov 12, 2026
f99b283
fix(provider-core): a timed-out status probe stops a CLI that ignores…
Nov 12, 2026
49b858b
fix(git): selected-file commits work through symlinked subdirectories…
Nov 12, 2026
833a15b
fix(opencode): a project opened mid-scan lists its OpenCode skills (#…
Nov 12, 2026
a5bd0ba
fix(ssh): SSH setup on a host without gzip says gzip is missing (#35389)
Nov 12, 2026
f03db4f
fix(pi): blank extension dialog titles no longer fail the turn (#35271)
Nov 12, 2026
c5f5efd
fix(server): text-generation fallback keeps the thread default's cust…
Nov 12, 2026
e96c96e
fix(server): storage cleanup stops holding usage-limited threads too …
Nov 12, 2026
167d41c
fix(web): a numeric author or labels in the URL no longer crashes Pul…
Nov 12, 2026
4d64163
fix(web): bare URLs end at Chinese and Japanese punctuation (#35267)
Nov 12, 2026
88bf393
fix(server): @ file search finds filenames containing literal braces …
Nov 12, 2026
2a1e43e
fix(server): t3_thread_search says which thread is the caller's (#35377)
Nov 12, 2026
a909ea4
perf(server): older history pages load without indexing the whole thr…
Nov 12, 2026
f4cf69f
fix(server): selecting a remote branch lands on its local branch (#35…
Nov 12, 2026
a2685e6
fix(web): SCP-style Git remotes no longer become terminal file links …
Nov 12, 2026
d0f9d4d
fix(web): sidebar draft previews show cited assistant text, not the r…
Nov 12, 2026
0cd6a73
fix(web): pasting an image the draft already has no longer flashes a …
Nov 12, 2026
0b21a82
fix(shared): pooled limits weight each account by its plan size (#35427)
Nov 12, 2026
60c3b22
fix(mobile): browser and MCP-app links with blank IDs no longer crash…
Nov 12, 2026
55081a1
fix(shared): thread search ignores the t3 prefix of flat temporary br…
Nov 12, 2026
841f98d
fix(mobile): a steer splits a settled turn's "Worked for" fold (#35408)
Nov 12, 2026
ddd0284
fix(shared): html_render pages show for Grok threads (#35434)
Nov 12, 2026
5ff3d3c
fix(server): Claude 1-hour cache writes are priced at the 1-hour rate…
Nov 12, 2026
662a1ce
fix(opencode): OpenCode Go threads no longer fail on a reasoning leve…
Nov 12, 2026
c58450f
fix(ssh): SSH environments connect over links with about a second of …
Nov 12, 2026
315b06c
feat(providers): managed Antigravity and Codex installs can update pa…
Nov 12, 2026
7ab11f1
fix(web): narrow-window sidebar sheet obeys disabled panel animations…
Nov 12, 2026
86ff9d0
fix(web): Prompt Stash shrinks above the composer when vertical space…
Nov 12, 2026
0fe71da
fix(acp-registry): each model keeps its own session options (#35458)
Nov 12, 2026
68a564e
fix(server): ACP follow-ups sent while the agent is still busy are de…
Nov 12, 2026
6505756
fix(desktop): preview comment keystrokes no longer trigger the page's…
Nov 12, 2026
7b17bdb
fix(server): file index refreshes no longer block the server on fff's…
Nov 12, 2026
76e4cb5
fix(server): removing a worktree on Windows no longer spins the serve…
Nov 12, 2026
63d5c6d
feat(opencode): read usage limits from the connected server (#34146)
Nov 12, 2026
fc2b5de
fix(web): a project filter that hides every active thread says so and…
Nov 12, 2026
b428418
fix(usage): count Codex request ledgers and replace archived cache en…
Nov 12, 2026
8fc1dad
fix(web): keep settled pagination focused while loading (#35522)
Nov 12, 2026
91a76cf
fix(web): voice dictionary keeps the draft when Enter confirms an IME…
Nov 12, 2026
4c255bc
fix(preview): Browser pane navigates when the desktop backend has no …
Nov 12, 2026
ad3d60f
fix(desktop): Nightly update checks find the newest nightly past newe…
Nov 12, 2026
4f86f94
fix(mobile): files with # or ? in their path keep audio playback and …
Nov 12, 2026
729687e
fix(web): device tab rename no longer saves on the Enter that confirm…
Nov 12, 2026
c1ea978
test(server): HEAD watch removal test expects isRepo in branch status…
Nov 12, 2026
a7779fc
fix(web): a focused folder New thread button no longer draws over the…
Nov 12, 2026
3c9a549
fix(grok): Grok MCP calls store the real tool, arguments, and result …
Nov 12, 2026
17ddf29
fix(server): Load earlier turns no longer drops the middle of threads…
Nov 12, 2026
1113e4b
fix(scripts): `vp run dev --share` removes its tailnet mapping when t…
Nov 12, 2026
dbbd1d2
fix(server): "Open in" stops offering the tailnet name after `tailsca…
Nov 12, 2026
13645b1
fix(web): align timeline activity timestamps (#35549)
Nov 12, 2026
fd344d8
fix(tailscale): Serve setup fails when the tailnet has not enabled HT…
Nov 12, 2026
0c3a998
fix(scripts): --share --built --host localhost points the tailnet URL…
Nov 12, 2026
77f40af
fix(server): t3 pair --tailscale no longer replaces another app's Ser…
Nov 12, 2026
a05a3cd
fix(shared): voice cleanup falls back after removing an instance name…
Nov 12, 2026
7c57291
fix(server): a bind address Tailscale Serve refuses says to bind 127.…
Nov 12, 2026
db63178
fix(desktop): Tailscale HTTPS counts as on only when Serve reaches th…
Nov 12, 2026
4ca5b9c
fix(server): long startup migrations log progress and resume after a …
Nov 12, 2026
8b05078
fix(scripts): mobile:e2e asks Tailscale for the address pool devices …
Nov 12, 2026
c846833
fix(server): provider instances named constructor, toString or valueO…
Nov 12, 2026
78ee8a1
fix(mobile): inline-code file paths with non-ASCII names become file …
Nov 12, 2026
1001bc7
fix(voice): dictation survives draft changes and Escape in the citati…
Nov 12, 2026
1c9ea56
fix(clients): report title regeneration outcomes (#31418)
Nov 12, 2026
abca547
test(server): bind-address Serve refusal test answers serve status (#…
Nov 12, 2026
7f6ba5b
fix(web): Grok Bot opens with the setup message filled in (#35565)
Nov 12, 2026
444ea53
test(web): split the cloud voice settings flow into independent cases…
Nov 12, 2026
63edc30
fix(desktop): SSH suggestions from known_hosts keep their port (#35556)
Nov 12, 2026
773b3c9
fix(mobile): block HTML in a Markdown table cell no longer splits the…
Nov 12, 2026
bd8ea12
fix(server): terminal history drops the tertiary Device Attributes qu…
Nov 12, 2026
f376f5c
fix(web): J and K step the PR guide without clicking into it first (#…
Nov 12, 2026
cf82fb8
fix(shared): preserve repository paths when switching clone protocols…
Nov 12, 2026
5cff012
feat(web): resize rows and columns in spreadsheet previews (#35548)
Nov 12, 2026
e0d0fb3
fix(forgejo): renamed repositories keep syncing their pull request li…
Nov 12, 2026
e9a7c07
test(web): OpenRouter voice test fills the model picker instead of ty…
Nov 12, 2026
4099e62
feat(antigravity): support native goals and managed CLI updates (#35409)
Nov 12, 2026
932cbd4
fix(web): the Fix action on a thread details PR row stays inside the …
Nov 12, 2026
e09f9aa
Merge remote-tracking branch 'origin/main' into meutex/issue-17936419…
Nov 12, 2026
67c87bc
test(web): cover percent repair with a unit test instead of a browser…
Nov 12, 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.
61 changes: 31 additions & 30 deletions .agents/skills/contribution-triage/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,13 +71,12 @@ from evidence you could not access. Do not run untrusted PR code merely to decid
Read the guide's linked sections before applying these checks. Inspect enough source to substantiate
scope and behavioral claims; leave the full correctness, security, and performance audit to code review.

- Under [prior approval](../../../CONTRIBUTING.md#prior-approval), identify the actual failure and
intended behavior. Inspect maintainer responses in the linked issue or discussion, including what
direction and scope they approved. A link, label, or acknowledgment alone is not approval. Judge a
claimed obvious-bug exception by purpose, impact, and necessary changes, without numeric cutoffs.
Separately assess focused configuration of an established capability: identify what already exists,
what the option controls, and its effects and necessary scope. This route does not require a proven
obvious bug. Adding a setting alone establishes neither a new feature nor an approval exemption.
- Under [fix a bug](../../../CONTRIBUTING.md#prior-approval), identify the actual failure and
intended behavior. A feature, or anything on the guide's not-interested list, warrants closure
unless a maintainer in the trusted exemption list asked for that PR. Inspect the request and the
direction and scope it covers. A link, label, or acknowledgment alone is not a request. Judge a
claimed bug fix by purpose, impact, and necessary changes, without numeric cutoffs. A setting that
adds a workflow or changes a default is a feature.
Check whether an alleged fix intentionally changes product behavior or overlooks an existing workflow.
Preserve any useful documentation, onboarding, or discoverability problem when declining the solution.
- Under [one problem](../../../CONTRIBUTING.md#one-problem), trace how each material change contributes
Expand All @@ -90,27 +89,18 @@ scope and behavioral claims; leave the full correctness, security, and performan
as the guide requires them. Do not demand unrelated evidence or repo-wide tests. An unavailable local
platform does not defeat adequate contributor evidence. Do not infer fabrication or AI authorship
from writing style, suspicion, or a check you cannot reproduce.
- Under [models](../../../CONTRIBUTING.md#models), use only the model and harness the PR names,
usually in its closing attribution line.

### Configuration and workflow examples

- Hosting CLI-path configuration in [#11653](https://github.com/pingdotgg/t3code/pull/11653) is eligible
for deeper review under the maintainer's ruling: it makes an existing capability configurable.
It need not qualify as an obvious-bug repair or obtain prior feature approval on that basis.
Still assess one underlying problem, necessary scope and credible verification. Deeper review can
reject the configuration mechanism or its implementation.
- Preserving Files as an independent tab in [#14436](https://github.com/pingdotgg/t3code/pull/14436)
changes tab lifetime and navigation. The maintainer classified it as a broader workflow change
requiring prior product-direction approval, which is absent. Propose closure for missing approval
in a dry run, or carry out closure in authorized enforcement. Its good evidence does not make it
eligible or justify keeping it pending after that ruling. The remedy is to obtain scope approval.

Use these examples to distinguish effects, not to exempt every configuration option. Apply current
trusted policy and reassess changed submission evidence; neither example grants permanent eligibility.
Bans in the guide are a maintainer decision. Report suspected spam to maintainers; do not ban or
threaten a ban.

## Apply the outcome

Do not automatically close a PR if a maintainer in the trusted `TRIAGE_EXEMPTIONS.td` list has
commented or submitted a review, including on earlier heads, or if `triage:keep-open` is present.
Comments that triage itself posted, such as an earlier notice or question, are not maintainer
involvement, even when they were posted from a maintainer's account on that maintainer's behalf.
Leave protected PRs open for maintainer decision. This does not grant an author exemption,
eligibility, or review approval.

Expand All @@ -126,20 +116,30 @@ comment text but do not write to GitHub. Keep the eligibility finding separate f
This is a routing exception, not a claim that the PR passed eligibility or correctness review.
- **Closure warranted.** The assessment is complete and establishes a specific policy violation.
Prepare a clear explanation under [closure and reconsideration](../../../CONTRIBUTING.md#closure-and-reconsideration),
post it, and close the PR. Verify that the explanation is present and the PR is closed. The comment
post it, then read the repository variable `PR_LIMITS_ENFORCE`
(`gh variable get PR_LIMITS_ENFORCE -R pingdotgg/t3code`). When it prints `true`, apply
`triage:closing` as the last thing you do to the PR, verify that the explanation and the label
are present, and do not close the PR yourself:
[pr-limits.yml](../../../.github/workflows/pr-limits.yml) closes it 72 hours after the label. Any
activity on the PR after the label, including a further comment or label from you, removes the
label; treat an author's reply or push as new evidence, reassess, and apply the label again only
if the finding still holds. When the command prints any other value, or fails saying the variable
was not found, the variable is off and nothing would close a labeled PR: close it yourself and
verify that the explanation is present and the PR is closed. Only another failure, such as a
permission error, means the variable cannot be read; then report the closure as incomplete. The comment
must name the violated rule, cite supporting submission evidence, link the maintained guide section,
and give a concrete remedy. Missing contributor evidence can warrant closure; explain what must be
established. Missing product approval calls for maintainer discussion, not an agent's product decision.
established. The remedy for a feature is an Ideas discussion, not an agent's product decision.
Close for multiple problems only when the independence of those changes is supported. Closing a PR
does not require a configured Macroscope label.
- **Needs explanation or maintainer decision.** Name the unresolved question and who can resolve it.
Post the specific question on the PR when commenting is within the authorized scope, and verify it
was posted. If tracing the source leaves an extra diff's necessity unclear, request the causal
explanation needed. If established facts leave a product-direction choice to maintainers, identify
that choice. Leave the PR open and pending that answer; do not mark it eligible. Do not substitute
"the agent was uncertain" for a violated rule. Once maintainers establish that a workflow change
requires approval and that approval is absent, apply the closure outcome instead of retaining a
pending classification. Good verification does not cure missing approval.
"the agent was uncertain" for a violated rule. Once a change is established as a feature with no
maintainer request, apply the closure outcome instead of retaining a pending classification. Good
verification does not make a feature eligible.
- **Incomplete; retry required.** State the failed retrieval, missing access, truncated diff, or unfinished
assessment and what is needed to resume. Do not convert operational failures into policy violations
or hand the PR off as having passed. An inaccessible artifact is different from an omitted artifact.
Expand Down Expand Up @@ -173,9 +173,10 @@ description, evidence, approvals, existing triage comments, PR open/closed state
label when relevant. Reassess changes that could invalidate the finding. Reuse an existing explanation
only if it still matches the current finding; avoid duplicate comments, closures, or label applications.

For closure, establish that the required explanation is posted before closing. If posting fails or its
result is ambiguous, read back the comments before retrying or proceeding. If the comment succeeds but
closure fails, preserve the comment and retry only the unfinished closure after checking current state.
For closure, establish that the required explanation is posted before applying `triage:closing` or
closing. If posting fails or its result is ambiguous, read back the comments before retrying or
proceeding. If the comment succeeds but the label or the closure fails, preserve the comment and retry
only that unfinished step after checking current state.
Handle a failed or ambiguous label application the same way: inspect labels before any retry. If access
or state still cannot be verified, report an incomplete action and the step needed to resume. Do not
retry blindly or claim success for an unverified action.
Expand Down
17 changes: 11 additions & 6 deletions .agents/skills/test-t3-app/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ description: Test T3 Code's web and desktop UI through its built-in Browser pane

# Test T3 web and desktop

Use T3's built-in Browser panel for verification. If its tools are absent or
the panel reports unavailable, explain the blocker and stop verification.
Do not install or switch to another automation system. For native mobile
testing, use [test-t3-mobile](../test-t3-mobile/SKILL.md).
Use T3's built-in Browser panel for verification. Follow the recovery steps
below before declaring it unavailable. Do not install or switch to another
automation system. For native mobile testing, use
[test-t3-mobile](../test-t3-mobile/SKILL.md).

## Start the app

Expand Down Expand Up @@ -36,8 +36,13 @@ model, such as Haiku for Claude or Luna for Codex.

## Use the Browser panel

Call `preview_status`, then `preview_open` if the Browser panel is
closed. Navigate to the complete startup pairing URL once with
Call `preview_status`. If no tab can be automated, call `preview_open`, including
when status reports `available: false` or `tabId: null`. Status can report
unavailable simply because no tab exists yet; opening a tab needs no user action.
Stop verification and explain the blocker only if the tools are absent or
`preview_open` reports unavailable or fails.

Navigate to the complete startup pairing URL once with
`preview_navigate`, then use `preview_snapshot` and T3's interaction tools.
If the token was consumed or expired, run `node apps/server/src/bin.ts pair`
for a fresh one. Keep using the same tab.
Expand Down
5 changes: 3 additions & 2 deletions .agents/skills/test-t3-mobile/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,9 @@ vp run mobile:install <ios|android> <device-id>

This installs the dev client for the checkout's native fingerprint: from the
device, the local cache, or the shared cache in seconds, building once only
when no machine has that fingerprint yet (5-15 minutes, logged to the file it
names). The device id may be omitted when exactly one device is booted. It
when no machine has that fingerprint yet: in the `Mobile Dev Client` workflow
on Blacksmith when HEAD is pushed and `gh` may dispatch it (the command waits),
otherwise here (5-15 minutes, logged to the file it names). The device id may be omitted when exactly one device is booted. It
prints one JSON line; on failure it names the next command. Mobile verification
includes that step unless the user prohibits it.

Expand Down
2 changes: 1 addition & 1 deletion .github/SECURITY.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Security policy

Report security vulnerabilities affecting T3 Code or T3 Tools-operated infrastructure to
[security@ping.gg](mailto:security@ping.gg). Please do not disclose them publicly until we have had
[security@t3.codes](mailto:security@t3.codes). Please do not disclose them publicly until we have had
a reasonable opportunity to investigate and remediate them.

See the [full security policy](https://t3.codes/security-policy) for reporting details, scope,
Expand Down
1 change: 1 addition & 0 deletions .github/VOUCHED.td
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ github:tris203
github:tsouth89
github:UtkarshUsername
github:vitalyiegorov
-github:wSedlacek Opened over 130 unapproved PRs in 12 days, far past the open PR limit
github:Yash-Singh1
github:yashranaway
github:Ymit24
Expand Down
2 changes: 2 additions & 0 deletions .github/actions/ci-changes/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ outputs:
value: ${{ steps.detect.outputs.typecheck }}
build:
value: ${{ steps.detect.outputs.build }}
desktop_launch:
value: ${{ steps.detect.outputs.desktop_launch }}
test:
value: ${{ steps.detect.outputs.test }}
test_packages:
Expand Down
12 changes: 10 additions & 2 deletions .github/actions/setup-ci-deps/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@ inputs:
description: Arguments for `vp install`, such as filters. Empty installs the whole workspace.
required: false
default: ""
save-pnpm-store:
description: Set to "false" when a concurrent job with the same install args saves the pnpm store
required: false
default: "true"
runs:
using: composite
steps:
Expand Down Expand Up @@ -123,10 +127,14 @@ runs:
key: ${{ steps.pnpm_verified.outputs.cache-primary-key }}

# A filtered install that started from the current full store adds nothing
# worth a second copy of it.
# worth a second copy of it. A stacked PR, based on a branch other than the
# default, saves a ~1 GB store only its own reruns can read, so it only restores.
# Concurrent jobs with the same install args reserve one key, so the losers
# compress the store for nothing; all but one pass save-pnpm-store: false.
- name: Save pnpm store
if: >-
inputs.install == 'true' &&
inputs.install == 'true' && inputs.save-pnpm-store == 'true' &&
(github.event_name != 'pull_request' || github.base_ref == github.event.repository.default_branch) &&
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')))
Expand Down
15 changes: 5 additions & 10 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,11 @@ reproduction steps or environment where relevant. -->
<!-- Explain how this fixes the problem. If it spans components or clients,
explain why those changes are needed for the same fix. Split independent fixes. -->

## Scope and approval

<!-- Link the triaged bug issue or the discussion with explicit maintainer approval
of direction and scope, including the approval comment. For a very small, focused
fix of an obvious bug, explain why it qualifies without a prior issue or discussion.
For focused configuration of an established capability, explain what already exists,
what the option controls, and why its effects stay within that capability. Adding a
setting alone is not a new feature or an approval exemption; broader workflow or
behavior changes still need approval. Scope and verification requirements still apply.
There is no line-count or file-count cutoff. -->
## Scope

<!-- We accept bug fixes, not features. Link the issue that shows the bug. For a
small fix of an obvious bug, say why it needs no issue. If a maintainer asked for
this PR, link the request. -->

## Verification

Expand Down
Binary file added .github/readme/hero.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
59 changes: 42 additions & 17 deletions .github/scripts/check-nightly-release.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -40,42 +40,67 @@ async function assertReleaseSource({ github, context, releaseChannel }) {

const isNightlyTag = (tag) => /^v.*-nightly\./.test(tag) || tag.startsWith("nightly-v");

async function findLatestNightly({ github, context }) {
const releases = await github.paginate(github.rest.repos.listReleases, {
...context.repo,
per_page: 100,
});
return releases
.filter((release) => !release.draft && release.published_at && isNightlyTag(release.tag_name))
.sort((a, b) => Date.parse(b.published_at) - Date.parse(a.published_at))[0];
// Only the three fields the gate reads. The REST list also returns every asset,
// which made a full scan tens of megabytes.
const RELEASES_QUERY = `
query ($owner: String!, $repo: String!, $cursor: String) {
repository(owner: $owner, name: $repo) {
releases(first: 100, after: $cursor, orderBy: { field: CREATED_AT, direction: DESC }) {
pageInfo { hasNextPage endCursor }
nodes { tagName isDraft publishedAt }
}
}
}
`;

// Returns the nightly with the newest publishedAt. Release order follows the
// tagged commit date, not publication, so every page is read unless `isSettled`
// says the newest nightly seen so far already decides the caller's answer.
async function findLatestNightly({ github, context, isSettled = () => false }) {
let latest;
let cursor = null;
do {
const { repository } = await github.graphql(RELEASES_QUERY, { ...context.repo, cursor });
const { nodes, pageInfo } = repository.releases;
for (const release of nodes) {
if (release.isDraft || !release.publishedAt || !isNightlyTag(release.tagName)) continue;
if (!latest || Date.parse(release.publishedAt) > Date.parse(latest.publishedAt)) {
latest = release;
}
}
if (latest && isSettled(latest)) return latest;
cursor = pageInfo.hasNextPage ? pageInfo.endCursor : null;
} while (cursor);
return latest;
}

async function shouldReleaseNightly({ github, context, core, now = Date.now() }) {
const lastNightly = await findLatestNightly({ github, context });
const isInGap = (release) => now - Date.parse(release.publishedAt) < MINIMUM_RELEASE_GAP_MS;
// Any nightly inside the gap means the newest one is too, so stop reading.
const lastNightly = await findLatestNightly({ github, context, isSettled: isInGap });

if (!lastNightly) {
core.info("No published nightly found. Proceeding with release.");
return true;
}

if (now - Date.parse(lastNightly.published_at) < MINIMUM_RELEASE_GAP_MS) {
core.info(`Nightly ${lastNightly.tag_name} was published less than six hours ago. Skipping.`);
const tag = lastNightly.tagName;
if (isInGap(lastNightly)) {
core.info(`Nightly ${tag} was published less than six hours ago. Skipping.`);
return false;
}

const { data: comparison } = await github.rest.repos.compareCommitsWithBasehead({
...context.repo,
basehead: `${lastNightly.tag_name}...${context.sha}`,
basehead: `${tag}...${context.sha}`,
per_page: 1,
});
if (comparison.status !== "ahead") {
core.info(
`Candidate commit is ${comparison.status} relative to ${lastNightly.tag_name}. Skipping.`,
);
core.info(`Candidate commit is ${comparison.status} relative to ${tag}. Skipping.`);
return false;
}

core.info(`New commits since ${lastNightly.tag_name}, and the six-hour gap has passed.`);
core.info(`New commits since ${tag}, and the six-hour gap has passed.`);
return true;
}

Expand All @@ -85,7 +110,7 @@ async function resolveLatestNightlyCommit({ github, context, core }) {
throw new Error("No published nightly found. Stable releases build the latest nightly commit.");
}

const tag = lastNightly.tag_name;
const tag = lastNightly.tagName;
const { data: commit } = await github.rest.repos.getCommit({ ...context.repo, ref: tag });
const version = /^(?:nightly-)?v(\d+\.\d+\.\d+)-nightly\./.exec(tag)?.[1];
if (!version) {
Expand Down
Loading