Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1039 commits
Select commit Hold shift + click to select a range
773b3c9
fix(mobile): block HTML in a Markdown table cell no longer splits the…
juliusmarminge Nov 12, 2026
bd8ea12
fix(server): terminal history drops the tertiary Device Attributes qu…
juliusmarminge Nov 12, 2026
f376f5c
fix(web): J and K step the PR guide without clicking into it first (#…
flamboh Nov 12, 2026
cf82fb8
fix(shared): preserve repository paths when switching clone protocols…
saphitv Nov 12, 2026
5cff012
feat(web): resize rows and columns in spreadsheet previews (#35548)
Yash-Singh1 Nov 12, 2026
e0d0fb3
fix(forgejo): renamed repositories keep syncing their pull request li…
juliusmarminge Nov 12, 2026
e9a7c07
test(web): OpenRouter voice test fills the model picker instead of ty…
t3dotgg Nov 12, 2026
4099e62
feat(antigravity): support native goals and managed CLI updates (#35409)
Yash-Singh1 Nov 12, 2026
932cbd4
fix(web): the Fix action on a thread details PR row stays inside the …
pouyarezvani Nov 12, 2026
49b0cc3
fix(mobile): queue sheet's Resume queue continues a usage-limited thr…
juliusmarminge Nov 12, 2026
3406bd7
fix(server): background status fetch no longer breaks a concurrent gi…
juliusmarminge Nov 12, 2026
d8f3fef
test(web): Mermaid rejection test waits for the viewer chunk to load …
t3dotgg Nov 12, 2026
7fab4ef
perf(usage): the Usage page shows cost and tokens at once instead of …
Bil0000 Nov 12, 2026
359daaf
feat(codex): choose a cyber access program for Daybreak-eligible mode…
Mezzle Nov 12, 2026
977d613
fix(web): command palette footer hints wrap instead of clipping on na…
imluckii Nov 12, 2026
ee9e36c
feat(secrets): check a secret reference before saving it (#31723)
yordis Nov 12, 2026
d46b90c
fix(server): the Welcome page offers repositories you only worked on …
dominikzabcik Nov 12, 2026
1b13310
fix(web): a branch picked right after opening the picker no longer wa…
Yuruzuu Nov 12, 2026
a1e0e50
perf(server): status refresh on a fork's default branch is 2.5x faste…
Yuruzuu Nov 12, 2026
91712ee
fix(server): agents can see a thread's pending background work (#33858)
fjooord Nov 12, 2026
d90ac5c
fix(ssh): timed-out SSH commands keep the output they already printed…
juliusmarminge Nov 12, 2026
18188ba
fix(server): worktree dev servers no longer clean up real worktrees (…
Lenoridev Nov 12, 2026
47a9988
fix(server): server updates retry when a release download fails brief…
shivamhwp Nov 12, 2026
0951791
fix(server): dev database seed no longer runs settle scripts in real …
Lenoridev Nov 12, 2026
fc533a6
perf(server): avoid loading provider drivers for terminal imports (#3…
Adamulek123 Nov 12, 2026
c0df40a
fix(web): queued message preview keeps inline image labels in place (…
Ragulsundaram Nov 12, 2026
fa8949a
fix(web): project settings can reach each checkout on one environment…
EmanuelMedinaAraujo Nov 12, 2026
c9f0cac
perf(server,client): attaching to a terminal with a large history ove…
Yuruzuu Nov 12, 2026
91f55d9
fix(server): PR sync reads share GitHub requests again on busy server…
only21mil Nov 12, 2026
05eff7f
ci: pin GitHub Actions to full commit SHAs (#33696)
yordis Nov 12, 2026
5b64e52
fix(mcp): answer MCP 2026-07-28 discovery instead of a 400 (#28683)
Phicks-debug Nov 12, 2026
0d51d5b
fix(server): a server published through Tailscale Serve no longer rep…
juliusmarminge Nov 12, 2026
719707c
perf(server): save large agent recordings faster (#33930)
Yuruzuu Nov 12, 2026
7eca0ed
fix(web): hand-started t3 servers get an update command that updates …
hieu-lee Nov 12, 2026
c00a373
fix(web): Select All then Copy in a read-only file preview copies the…
whoisaldo Nov 12, 2026
a03f718
perf(web): PDF Find jumps to the first match in long PDFs 3.1x faster…
Yuruzuu Nov 12, 2026
96aa40e
fix(mobile): Keep a tall question's Submit button above Android's nav…
mwolson Nov 12, 2026
4f555c7
fix(web): choosing a project icon again re-reads it from disk (#28584)
AlexSandilands Nov 12, 2026
d9a97e7
fix(web): sidebar keeps the open thread active while Settings or Usag…
Mnigos Nov 12, 2026
9c7618b
fix(web): gitignore fences in the rich-text composer highlight as ini…
juliusmarminge Nov 12, 2026
451e375
fix(web): keep later navigation when thread deletion completes (#33953)
Edge358 Nov 12, 2026
0bc993a
fix(server): Git status finds the default branch when the only remote…
only21mil Nov 12, 2026
f255158
fix(pi): settle prompts consumed by input handlers (#28798)
Chinoman10 Nov 12, 2026
39ab6a2
fix(cursor): honor HTTP/1.1 transport for proxy networks (#25338)
only21mil Nov 12, 2026
5f43681
fix(client): hide Resume while a pending request blocks continuing th…
only21mil Nov 12, 2026
2adda57
fix(server): t3 doctor holds off server launches and names the holder…
only21mil Nov 12, 2026
cbf9e26
fix(server): preserve filename whitespace when reading and saving fil…
voltcrash Nov 12, 2026
70833b2
fix(server): tool calls a released session cuts off no longer keep th…
NotReliable Nov 12, 2026
85b1606
fix(server): keep thread tool responses small by default (#29268)
voltcrash Nov 12, 2026
6d53584
fix(web): a chunk that fails after boot no longer reloads the page in…
grodriguez-fr Nov 12, 2026
fd5cb99
fix(opencode): keep ACP question choices and fold the custom answer (…
QRpeachKZ Nov 12, 2026
b63d3c5
fix(web): sent messages honor their theme foreground (#26888)
fancyboi999 Nov 12, 2026
a3cde98
perf(ci): run server test files in parallel on each shard (#35618)
juliusmarminge Nov 12, 2026
aa58dc6
chore(deps): bump the npm_and_yarn group across 2 directories with 1 …
dependabot[bot] Nov 12, 2026
8753c74
fix(server): keep worktrees containing nested repositories (#25241)
maria-rcks Nov 12, 2026
f41e8b3
fix(shared): Windows-style paths stay out of the slash menu (#27851)
samkelly880 Nov 12, 2026
ac7c7f6
fix(acp): let agents that advertise /compact compact their own contex…
ParasN Nov 12, 2026
2f9d930
test(acp-registry): subscribe to snapshot changes before triggering t…
juliusmarminge Nov 12, 2026
fbd77b9
fix(web): diff colors follow appearance contrast (#28947)
voltcrash Nov 12, 2026
dfded9d
fix(web): keep the child thread open when its remote parent was delet…
ScottN-PV Nov 12, 2026
731291e
fix(desktop): poll for updates every 4 hours, not 4 minutes (#28481)
tao12345666333 Nov 12, 2026
9a614e3
fix(usage): bill Codex requests whose cumulative counters rewind to a…
jokaperes Nov 12, 2026
65716ba
fix(server): persist terminal output without rewriting all history (#…
nateEc Nov 12, 2026
8bfb723
perf(server): stop serializing terminal chunks just to measure them (…
bompus Nov 12, 2026
4cd7a3e
fix(web): stop opening a menu when a terminal selection ends (#24112)
fixfon Nov 12, 2026
30a26db
fix(server): agents keep named browser profiles after a server restar…
only21mil Nov 12, 2026
9b242e4
fix(web): reveal full composer command descriptions (#27414)
voltcrash Nov 12, 2026
44ee2b9
fix(server): restart the service after T3 home ownership clears (#25237)
maria-rcks Nov 12, 2026
a344276
fix(web): Enter on an empty prompt resumes an interrupted thread (#27…
toni92-beep Nov 12, 2026
9ac4535
fix(shared): token counts just below a unit boundary use the next uni…
juliusmarminge Nov 12, 2026
0685635
fix(desktop): long annotation strokes stay cheap to draw (#24573)
only21mil Nov 12, 2026
058d953
fix(ssh): load remote profiles with the account login shell (#23934)
nabettu Nov 12, 2026
da345d2
fix(server): terminals recreate a worktree removed by storage cleanup…
TonybynMp4 Nov 12, 2026
95f164d
test(web): Mod+E bold-word test no longer drops its first arrow key (…
juliusmarminge Nov 12, 2026
3595b9e
fix(server): access list keeps changes made while its stream opens (#…
juliusmarminge Nov 12, 2026
c544c27
fix(server): a failed Git version probe no longer advises installing …
juliusmarminge Nov 12, 2026
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
064c11e
Merge upstream/main into collin/main
collissimo 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
  •  
  •  
  •  
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
2 changes: 2 additions & 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 Expand Up @@ -83,6 +84,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
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
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.
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);
});
}
Loading
Loading