Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1882 commits
Select commit Hold shift + click to select a range
156d187
docs(claude): explain idle compaction fallback (#28532)
voltcrash Nov 1, 2026
6879da8
perf(shared): strip plan prefixes in linear time (#28537)
hieu-lee Nov 1, 2026
6ef66b6
perf(shared): count terminal resume lines without allocations (#28539)
hieu-lee Nov 1, 2026
0c0de57
perf(web): terminal updates no longer re-render every sidebar row and…
Yuruzuu Nov 1, 2026
bcc6c08
perf(web): chat view redraws no longer re-render the composer or side…
Yuruzuu Nov 1, 2026
74003bd
perf(server): worktree creation spawns fewer git processes (#28582)
hieu-lee Nov 1, 2026
46e90ba
fix(web): many automations no longer hide the thread details Automati…
Mnigos Nov 1, 2026
95d4da5
fix(clients): open a delegated child's approval on the environment it…
robrab2000 Nov 1, 2026
f3ccba8
fix(web): finished replies keep their hover timestamp while commands …
BilalIrfanContact Nov 1, 2026
93d110a
fix(server): treat a repository's only non-origin remote as its prima…
only21mil Nov 1, 2026
6a241ea
perf(server): sort the working-tree file list once per status read (#…
only21mil Nov 1, 2026
435cda9
fix(web): keep theme color alpha when a hex value is typed (#23136)
only21mil Nov 1, 2026
2a93356
fix(web): keep saved sensitive variables from losing their value (#23…
only21mil Nov 1, 2026
5c7e4f2
perf(server): t3_thread_read loads a page's items in one query (#23176)
only21mil Nov 1, 2026
cd04747
fix(mobile): use loaded branch for untouched worktree base (#23241)
only21mil Nov 1, 2026
cb79cfb
fix(server): report a created PR as created when its lookup fails (#2…
only21mil Nov 1, 2026
f14fa03
fix(opencode): steers keep the turn's agent, variant and instructions…
only21mil Nov 1, 2026
0997948
perf(ci): skip PR vouch jobs for ordinary comments (#23387)
only21mil Nov 1, 2026
5884d43
fix(web): sort pull request lists and timelines by time (#23588)
only21mil Nov 1, 2026
fc1d604
perf(ci): thread transfer report stops paging all main CI runs (#23633)
only21mil Nov 1, 2026
80a5ffa
fix(server): T3 Connect keeps a log file of its tunnel connector (#24…
only21mil Nov 1, 2026
a0d08d7
fix(server): saving a shortcut no longer deletes rules it can't read …
only21mil Nov 1, 2026
52b65aa
fix(web): installing two providers at once starts both (#24655)
only21mil Nov 1, 2026
3e0d877
fix(server): Codex switches respect each instance's CODEX_HOME variab…
only21mil Nov 1, 2026
eb129c0
fix(server): dev seeding accepts migration histories the server boots…
only21mil Nov 1, 2026
b8badda
fix(web): interval settings save when editing ends, not per keystroke…
only21mil Nov 1, 2026
3f69542
fix(web): a failed plan follow-up no longer overwrites the next draft…
only21mil Nov 1, 2026
cf5e6d3
fix(server): selected-file commits stop when the index reset fails (#…
only21mil Nov 1, 2026
ede41df
fix(opencode): OpenCode installs T3 can't identify no longer get an U…
only21mil Nov 1, 2026
f5fe88b
perf(server): MCP calls skip the caller's message history (#28282)
only21mil Nov 1, 2026
d05e4f8
fix(web): streamed replies render a list's code block as the finished…
only21mil Nov 1, 2026
3d10957
fix(ci): a providerEnv.ts change runs every package's tests (#28286)
only21mil Nov 1, 2026
5d0de82
fix(opencode): OpenCode 1.x text generation deletes its scratch sessi…
only21mil Nov 1, 2026
99be504
fix(scripts): check:changed no longer passes failing .github/scripts …
only21mil Nov 1, 2026
4c3808a
fix(web): Diagnostics memory no longer reads "1024.0 MB" (#28300)
only21mil Nov 1, 2026
b796da9
perf(server): sending a message no longer rereads the thread from the…
only21mil Nov 1, 2026
09ace62
fix(web): device tools keep the typed text when a command fails (#28323)
only21mil Nov 1, 2026
f2527c2
fix(server): turn diffs keep the agent's files when git's diff.relati…
only21mil Nov 1, 2026
dcbe9a6
fix(server): tracked clones keep an explicit SSH protocol on fallback…
only21mil Nov 1, 2026
638947e
fix(claude): Claude text generation stops saving throwaway transcript…
only21mil Nov 1, 2026
cfe2e97
fix(desktop): bound the Linux xdg-mime registration like its sibling …
only21mil Nov 1, 2026
de6830f
fix(opencode): OpenCode 1.x text generation gives up after 3 minutes …
only21mil Nov 1, 2026
8670378
fix(server): a fork no longer inherits the source thread's pin, auto-…
only21mil Nov 1, 2026
1c0cc43
fix(web): deleting a thread clears its saved right-panel, diff-panel …
only21mil Nov 1, 2026
b08d559
fix(server): command projection failures keep their cause (#28389)
only21mil Nov 1, 2026
1c748ed
fix(providers): slow Grok, Pi and fx starts no longer show as unavail…
only21mil Nov 1, 2026
3edf0f4
fix(evals): GPT eval summaries no longer call a proxied run free (#28…
EtanHey Nov 1, 2026
8513287
fix(server): truncated text stays the same when projected again (#28418)
only21mil Nov 1, 2026
6014358
fix(desktop): a settings relaunch no longer replays the link that lau…
only21mil Nov 1, 2026
fa31b66
fix(server): Codex sessions get T3CODE_THREAD_ID like Claude sessions…
SevenWhite Nov 1, 2026
e6e2ab0
feat(usage): filter Usage totals by provider and model (#28952)
t3dotgg Nov 2, 2026
e925dd6
fix(web): allow folder references on saved local desktop servers (#27…
shivamhwp Nov 2, 2026
05c0ed7
fix(web): clarify the waiting label for background work (#28969)
Yash-Singh1 Nov 2, 2026
dd6c05e
fix(preview): agent browser use no longer steals composer focus (#28613)
t3dotgg Nov 2, 2026
b92c8f4
fix(server): token telemetry counts each request once and only confir…
t3dotgg Nov 2, 2026
ddfc4a9
update the claude entrypoint identifier for accuracy (#28410)
t3dotgg Nov 2, 2026
4a5251b
fix(web): keep pending pull request actions scoped to each request (#…
Yash-Singh1 Nov 2, 2026
7a760a9
fix(desktop): load the renderer while the backend starts (#28715)
Yash-Singh1 Nov 2, 2026
91f66f8
fix(web): settings search no longer jumps or clears on an IME Enter o…
only21mil Nov 2, 2026
d890e5c
fix(mobile): explain why voice input is unavailable (#28698)
shivamhwp Nov 2, 2026
0c4454c
perf(server): Codex calls t3_thread_wait directly instead of from Cod…
t3dotgg Nov 2, 2026
23075af
refactor(server): name Codex's direct-only T3 MCP server t3-code-dire…
t3dotgg Nov 2, 2026
b12ab30
fix(mobile): files with brackets in their names attach on Android (#2…
juliusmarminge Nov 2, 2026
5f2c27e
fix(server): Stop ends a run whose provider turn already finished (#2…
juliusmarminge Nov 2, 2026
83d2b8e
fix(server): a linked retry closes the waiting link card it names (#2…
juliusmarminge Nov 2, 2026
1973e0a
fix(server): a stored boolean settledOverride no longer stops startup…
juliusmarminge Nov 2, 2026
da2d6ec
fix(server): remote updates no longer fail when the staged preflight …
juliusmarminge Nov 2, 2026
79f3ee1
fix(server): idle compaction survives a late update for an earlier ru…
juliusmarminge Nov 2, 2026
a51164c
fix(server): usage prices bare model names at the maker's rate when a…
juliusmarminge Nov 2, 2026
72f05f6
fix(web): model picker uses the full window height in short windows (…
t3dotgg Nov 2, 2026
5fc5a1d
fix(server): open clients no longer stay on "Updating" after a provid…
juliusmarminge Nov 2, 2026
333f7a6
ci(release): preview releases run from any branch (#27828)
juliusmarminge Nov 2, 2026
0338e99
fix(desktop): save and copy any image the app can show (#29079)
t3dotgg Nov 2, 2026
c65f8d5
feat(chat): threads show when you switch models or effort (#28995)
t3dotgg Nov 2, 2026
ab8e488
feat(antigravity): runtime 1.4.5 with real turn failures and subagent…
t3dotgg Nov 2, 2026
30654b3
feat: tag threads and hide tagged threads while recording (#29053)
t3dotgg Nov 2, 2026
d01b92c
perf(cli): short commands like t3 --version no longer load the whole …
Yuruzuu Nov 2, 2026
a852de0
fix(web): play completion sounds without delay (#29146)
Yash-Singh1 Nov 2, 2026
ec3ebdb
fix(web): preserve scroll position when expanding work details (#29166)
Yash-Singh1 Nov 2, 2026
47f2c8d
fix(server): Claude threads no longer join the Claude session that la…
t3dotgg Nov 2, 2026
701e13c
fix(web): hide image action tooltip in expanded viewer (#29329)
Yash-Singh1 Nov 2, 2026
22b5252
feat(server): log fast and ultrafast service tiers in analytics (#29348)
t3dotgg Nov 2, 2026
ac8dce0
fix(marketing): show 40k+ GitHub stars (#29362)
t3dotgg Nov 2, 2026
edc37c9
fix(web): center authorized client settings rows (#29382)
Yash-Singh1 Nov 2, 2026
5e966bc
fix(mobile): keep One UI navigation and Compose on one row (#29203)
none23 Nov 2, 2026
d833184
perf(server): bound runtime recovery reads by thread ownership (#29429)
Yash-Singh1 Nov 2, 2026
7cf653b
perf(server): narrow delegated recovery reads to delivery records (#2…
Yash-Singh1 Nov 2, 2026
c8a601c
fix(cursor): /compact compacts with the SDK's summarize (#29398)
SunkenInTime Nov 2, 2026
ed8833f
fix(mobile): pending auto-merge shows in the merge button (#29465)
juliusmarminge Nov 2, 2026
8657eec
fix(server): defer Tailscale endpoint discovery during startup (#29432)
Yash-Singh1 Nov 2, 2026
0847a44
fix(mobile): merge button names merged, closed, draft, and conflict s…
juliusmarminge Nov 2, 2026
1416947
test(evals): guard how agents tell threads from tasks and subagents (…
gabrielelpidio Nov 2, 2026
9bcf753
fix(server): background agent asks go to delegate_task, not a backgro…
gabrielelpidio Nov 2, 2026
84537c4
feat(server): read source control host tokens from a secret provider …
yordis Nov 2, 2026
a497f7b
fix(web): confirm before removing a provider instance's saved setting…
juliusmarminge Nov 2, 2026
3ddd398
fix(server): settled threads no longer re-send relay clears on every …
juliusmarminge Nov 2, 2026
a821f03
fix(client-runtime): connection diagnosis no longer blames the host w…
juliusmarminge Nov 2, 2026
6f41364
fix(opencode): Claude usage limits through OpenCode keep their reset …
juliusmarminge Nov 2, 2026
bdf5806
fix(desktop): prepare macOS x64 bytecode under Rosetta (#29484)
Yash-Singh1 Nov 2, 2026
cc59f99
fix(server): keep PR watches active after host failures (#29450)
Yash-Singh1 Nov 2, 2026
af00cf7
fix(cursor): show Cursor usage after signing in with Cursor (#29419)
serhiyhvala Nov 2, 2026
cbd3e14
perf(server): skip redundant claude session naming (#28910)
maria-rcks Nov 2, 2026
a9ac1e8
fix(mobile): keep the conversation steady during layout changes (#29545)
juliusmarminge Nov 2, 2026
60aec28
feat(marketing): fetch GitHub stars at build time (#29555)
juliusmarminge Nov 2, 2026
065a433
perf(server): pin the index for the unscoped agent event high-water (…
juliusmarminge Nov 2, 2026
30084f0
perf(web): the pull request code tab derives its file model once per …
juliusmarminge Nov 2, 2026
ea16fcb
perf(server): stop tracing project enrichment cache reads (#29640)
juliusmarminge Nov 2, 2026
8648aea
perf(server): seek live nodes for the subagent recovery probe (#29644)
juliusmarminge Nov 2, 2026
55e2538
feat(provider-kiro): add Kiro as an ACP provider (#14693)
juliusmarminge Nov 2, 2026
a036489
revert(web): undo hover timestamp change from #28610 (#29680)
maria-rcks Nov 2, 2026
bad610b
perf(server): idle compaction reads only the latest run, live work an…
juliusmarminge Nov 2, 2026
71646e0
perf(server): cancelling a task reads only the tasks and runs it uses…
juliusmarminge Nov 2, 2026
5b9731c
fix(web): screen readers can browse and Tab through the threads sideb…
nibarAhmed Nov 3, 2026
57cd059
chore(deps): upgrade Effect to 4.1.2 and alchemy to beta.85 (#26833)
juliusmarminge Nov 3, 2026
d8a829e
perf(web): PDF previews reload without starting a new pdf.js worker (…
saphid Nov 3, 2026
f6503f0
fix(mobile): shorten the iOS undo toast and balance its insets (#29775)
shivamhwp Nov 3, 2026
2d2299a
fix(web): file save session browser test no longer hangs on the disco…
juliusmarminge Nov 3, 2026
92dee20
fix(server): Changes totals no longer diff against a guessed base aft…
tris203 Nov 3, 2026
3c59595
perf(server): skip unused parent history in linked task status (#27913)
Adamulek123 Nov 3, 2026
6a61904
fix(server): native Claude updates use the native release feed (#27958)
NathanGlasby Nov 3, 2026
e2d3aa9
fix(tailscale): escalate hung serve commands to SIGKILL (#28529)
rishabhx29 Nov 3, 2026
948433d
refactor(server): provider registry owns explicit model cache invalid…
tris203 Nov 3, 2026
0b2c13a
perf(server): bound ordinal recovery to selected messages (#27495)
Motaghi Nov 3, 2026
1d80d0e
fix(client-runtime): branch picker shows branches changed outside T3 …
ebrahimHakimuddin Nov 3, 2026
f981b7a
perf(client): skip idle inbox placement serialization (#27460)
UtkarshUsername Nov 3, 2026
8430db6
fix(server): project content search finds matches past a line's first…
saphid Nov 3, 2026
ab06e2a
fix(clients): attachment sizes just under 1 MB no longer read "1024 K…
saphid Nov 3, 2026
a4f4741
fix(gitlab): merge request links keep an HTTP remote's port and schem…
saphid Nov 3, 2026
064cf8f
fix(server): an upstream shadowed by a local origin/<branch> branch k…
saphid Nov 3, 2026
5815442
fix(server): turn diffs keep signed commits' files under log.showSign…
saphid Nov 3, 2026
50106ef
fix(server): generated commit and PR text no longer reads colored git…
saphid Nov 3, 2026
4494faa
fix(client-runtime): checking out a pull request refreshes cached bra…
saphid Nov 3, 2026
5fa0d0b
fix(clients): cancel oversized project icon responses (#29006)
luke2x Nov 3, 2026
d1e5044
fix(shared): context chip labels no longer split an emoji at the 200-…
saphid Nov 3, 2026
448c1ac
fix(server): create_threads titles no longer end in a broken characte…
saphid Nov 3, 2026
6739dd7
perf(server): thread snapshots skip serializing a row past the row li…
Yuruzuu Nov 3, 2026
071660e
fix(server): Uncommitted review keeps a staged deletion that git pair…
saphid Nov 3, 2026
a565d89
fix(cli): t3 thread start titles no longer end in a broken character …
saphid Nov 3, 2026
89c2a5c
perf(client-runtime): expanding deferred work skips an unused timelin…
Yuruzuu Nov 3, 2026
b1913b9
fix(server): honor relocated systemd user configuration (#29244)
voltcrash Nov 3, 2026
5231459
fix(web): review comments keep a trailing blank line in their diff (#…
saphid Nov 3, 2026
dfbafee
fix(server): side chat and merge-back context no longer cut an emoji …
saphid Nov 3, 2026
a5e7e5b
perf(server): loading a file's diff skips unused repository lookups (…
Yuruzuu Nov 3, 2026
87e13d3
fix(cli): make relative install homes produce working commands (#29241)
voltcrash Nov 3, 2026
c3cfb5e
fix(forgejo): dismissed reviews no longer read as requested changes o…
saphid Nov 3, 2026
efcb937
fix(shared): Linux file links preserve literal backslashes (#29245)
voltcrash Nov 3, 2026
5349ecb
fix(gitcafe): PR link previews show a GitHub-merged pull request as m…
saphid Nov 3, 2026
ba962f2
fix(codex): restoring a checkpoint works after the Codex session was …
saphid Nov 3, 2026
cf48ea8
perf(acp): ACP agents skip decoding output twice for unused diagnosti…
Yuruzuu Nov 3, 2026
35af849
fix(server): diffs keep blank context lines under diff.suppressBlankE…
saphid Nov 3, 2026
f639c15
fix(scripts): check:changed passes when only lint-ignored code change…
saphid Nov 3, 2026
a6a921c
perf(client): streamed row updates no longer rescan question history …
Yuruzuu Nov 3, 2026
5eb8154
perf(desktop): keep Linux MIME helpers off the startup path (#29247)
voltcrash Nov 3, 2026
e051363
perf(server): shell updates read a burst of threads once (#29101)
Yuruzuu Nov 3, 2026
ae1ccb1
fix(opencode): forks from compacted threads no longer fail (#29221)
voltcrash Nov 3, 2026
8cebee4
fix(scripts): check:changed lints Astro components and runs knip for …
saphid Nov 3, 2026
e72a0c7
fix(desktop): Linux .deb no longer installs files any local user can …
shivamhwp Nov 3, 2026
9f63268
fix(desktop): native builds prepare server bytecode again after the E…
maria-rcks Nov 3, 2026
30b9c4a
fix(codex): a background command's wake no longer hangs when its outp…
saphid Nov 3, 2026
07846fc
test(scripts): expect the unmatched-pattern flag in the Astro check:c…
maria-rcks Nov 3, 2026
927a2c6
fix(mobile): drafts on threads with colons in their ids upload attach…
juliusmarminge Nov 3, 2026
d0f5ae6
fix(server): provider refresh no longer reverts an enriched sign-in s…
juliusmarminge Nov 3, 2026
ff73c4c
fix(server): forked Claude threads keep their compaction chain (#27577)
juliusmarminge Nov 3, 2026
709cfb3
fix(server): Claude subagents left by a stopped process no longer sta…
juliusmarminge Nov 3, 2026
95414cf
fix(server): usage-limit auto-resume no longer arms children of settl…
juliusmarminge Nov 3, 2026
727a502
fix(cursor): a write-after-end in the Cursor SDK no longer stops the …
juliusmarminge Nov 3, 2026
65aaf97
fix(server): avoid reparsing streamed replies for timestamps (#25252)
juliusmarminge Nov 3, 2026
f2513bd
fix(web): project settings can set a checkout's grouping rule again (…
juliusmarminge Nov 3, 2026
42ca7c0
fix(server): reject oversized goal objectives before dispatch (#23033)
juliusmarminge Nov 3, 2026
07a1e79
fix(server): checkpoints no longer rehash every file when one entry i…
juliusmarminge Nov 3, 2026
e0f69e9
fix(web,mobile): chat images reload when the agent rewrites the file …
juliusmarminge Nov 3, 2026
e1e520c
fix(web): show the project pin before the remote badge (#29704)
maria-rcks Nov 3, 2026
84547b9
fix(server): Codex usage keeps requests from interrupted turns (#29415)
juliusmarminge Nov 3, 2026
1436c45
fix(client-runtime): connect to the primary environment while the bro…
juliusmarminge Nov 3, 2026
48c8cf7
fix(server): a failed worktree add no longer leaves its new branch be…
juliusmarminge Nov 3, 2026
8c9945d
fix(provider-acp): Kiro's html_render pages show in the thread (#28253)
juliusmarminge Nov 3, 2026
f80be8e
fix(server): streamed Browser clicks no longer wait behind queued whe…
juliusmarminge Nov 3, 2026
997e3f3
fix(server): Codex turns that fail with an unlisted error code no lon…
juliusmarminge Nov 3, 2026
503488d
fix(opencode): sessions open through OpenCode 2 after an in-place upg…
juliusmarminge Nov 3, 2026
607e373
fix(server): T3 Connect not-linked fix no longer tells Desktop users …
juliusmarminge Nov 3, 2026
371e945
fix(server): anchor Claude wake cooldowns to result arrival (#25061)
juliusmarminge Nov 3, 2026
16fd1a4
fix(web): match new-thread hero to selected checkout (#25064)
juliusmarminge Nov 3, 2026
d3d7f03
fix(server): stop PR lookups in emptied worktree folders (#24803)
juliusmarminge Nov 3, 2026
71a7bf9
fix(server): agent session scans no longer hang the server on an unre…
juliusmarminge Nov 3, 2026
371c9a9
docs(connect): held webhooks are kept per managed link (#23612)
juliusmarminge Nov 3, 2026
0ad3dc1
fix(server): delegated children keep replies after their parent settl…
juliusmarminge Nov 3, 2026
6e58094
fix(preview): explain invalid URLs and locators (#23396)
juliusmarminge Nov 3, 2026
296b089
fix(web): terminal controls no longer cover the first line (#23373)
juliusmarminge Nov 3, 2026
93a3e8f
fix(server): stop maintaining the unused event correlation index (#23…
juliusmarminge Nov 3, 2026
46212dd
docs(mcp): document existing recurring-task tools (#23199)
juliusmarminge Nov 3, 2026
c0ec87a
fix(server): release the previous session when sending to another ins…
juliusmarminge Nov 3, 2026
692dd9c
fix(claude): a background-task wake run no longer hangs after a user …
maria-rcks Nov 3, 2026
78aee8a
fix(server): OpenCode no longer drops a $skill read before its direct…
juliusmarminge Nov 3, 2026
b492e28
fix(server): coalesced webhook runs use the prompt saved before dispa…
juliusmarminge Nov 3, 2026
d5afb1a
fix(server): slow forge CLI calls no longer delay checkpoints and tur…
juliusmarminge Nov 3, 2026
0c863d6
fix(relay): T3 Connect repairs tunnel ingress that drifted from a mat…
juliusmarminge Nov 3, 2026
6f4bc77
fix(provider-core): npm-installed Claude in ~/.local gets npm updates…
juliusmarminge Nov 3, 2026
acd2db9
fix(server): git hooks keep the user's locale (#27778)
juliusmarminge Nov 3, 2026
18ac394
fix(pi): hold messages until compaction ends (#24388)
juliusmarminge Nov 3, 2026
fd63914
fix(server): show why Claude refuses full access as root (#23804)
juliusmarminge Nov 3, 2026
10f3657
fix(server): preview click timeouts identify the target (#23489)
juliusmarminge Nov 3, 2026
30767c2
fix(cursor): supporting files no longer hide sibling skills (#23326)
juliusmarminge Nov 3, 2026
689bdb8
fix(web): usage-limit retry notice shows the timezone (#23029)
juliusmarminge Nov 3, 2026
bb221f0
fix(server): preserve nested Claude subagent completion across turns …
juliusmarminge Nov 3, 2026
c3e1e0a
fix(opencode): publish ordered pending-work snapshots (#21460)
juliusmarminge Nov 3, 2026
53e168f
fix(opencode): decode compaction history from OpenCode 2.1 (#22661)
juliusmarminge Nov 3, 2026
3e1e776
fix(server): import valid conversations within each transcript record…
juliusmarminge Nov 3, 2026
61c3794
fix(server): imported Claude sessions resume on their first turn (#23…
juliusmarminge Nov 3, 2026
5d3d78a
feat(web): ask for a GitHub star when idle, and star in one click (#2…
t3dotgg Nov 3, 2026
e2bb9e6
fix(server): subagent questions reach a busy parent agent (#29909)
t3dotgg Nov 3, 2026
cefb544
feat(web): celebrate a GitHub star with confetti (#29987)
t3dotgg Nov 3, 2026
8c17dc6
feat(claude-accounts): pace to reset and credits run-rate in the acco…
bk-agent-01 Nov 3, 2026
2e48a58
refactor(claude-accounts): narrow switcher fields through local helpers
bk-agent-01 Nov 3, 2026
484f297
fix(claude-accounts): parse credit dates with Effect DateTime
bk-agent-01 Nov 3, 2026
5ffc2d6
fix(claude-accounts): tolerate a bad kind, round dollars once, hide a…
bk-agent-01 Nov 3, 2026
8cb7994
test(usage): pin the clock in the saved-window test so it does not ex…
bk-agent-01 Nov 3, 2026
e4c9c36
Merge pull request #364 from iamtushar324/tushar/claude-picker-pace-c…
bk-agent-01 Nov 3, 2026
dfe2e67
Merge upstream pingdotgg/t3code main (cefb544af3) into stage
bk-agent-01 Nov 3, 2026
d4a29ba
chore(stage): mark fork edits reshaped by the upstream merge
bk-agent-01 Nov 3, 2026
a560a99
fix(stage): merge CI round 2 and review round 1
bk-agent-01 Nov 3, 2026
7db6e01
chore(stage): mark re-indented upstream handlers
bk-agent-01 Nov 3, 2026
473f7ce
fix(stage): merge CI round 3 — effect/Crypto migration, lint, style-d…
bk-agent-01 Nov 3, 2026
308face
chore(stage): mark tsconfig override separator
bk-agent-01 Nov 3, 2026
3ab9ebb
fix(stage): merge CI round 4 — test layers, removed helpers, duplicat…
bk-agent-01 Nov 3, 2026
a51ea95
ci(temp): run server shards with plain vitest to list every failure
bk-agent-01 Nov 3, 2026
ed0d23b
fix(stage): merge CI round 5 — fork test layers, linked peers get eve…
bk-agent-01 Nov 3, 2026
1ae66c7
fix(stage): merge CI round 6 — remaining server test layers and fixtures
bk-agent-01 Nov 3, 2026
077d4ba
fix(stage): merge CI round 7 — client-runtime types, test services, f…
bk-agent-01 Nov 3, 2026
87dd6c1
test(stage): keep upstream's context budget file; measure the fork ag…
bk-agent-01 Nov 3, 2026
c2b59c5
fix(stage): merge CI round 8 — two test hangs, desktop types, schedul…
bk-agent-01 Nov 3, 2026
df0e3c0
fix(stage): merge CI round 9 — one vite-plus for web tests, mobile ty…
bk-agent-01 Nov 3, 2026
dac6c4f
fix(stage): merge CI round 10 — web types, OpenInPicker test, git dri…
bk-agent-01 Nov 3, 2026
f91c3e6
fix(stage): merge CI round 11 — server types
bk-agent-01 Nov 3, 2026
7c9832f
fix(stage): last server type error; revert the temporary CI shard change
bk-agent-01 Nov 3, 2026
361b354
fix(web): fork snooze countdown advances each minute, not only at wak…
bk-agent-01 Nov 3, 2026
c08d813
Merge upstream t3code v0.1.7-nightly.20261103.4119 into stage (#365)
bk-agent-01 Nov 3, 2026
0ac7000
fix(server): the pull-request sweep reuses git state when a worktree …
bk-agent-01 Nov 3, 2026
96e6555
fix(server): mark the whole lookup options type as a fork edit
bk-agent-01 Nov 3, 2026
fca43f2
fix(server): git and gh start from a small process host, not the mult…
bk-agent-01 Nov 3, 2026
26c2e49
fix(server): blank lines in git config no longer move a branch's fing…
bk-agent-01 Nov 3, 2026
0ebf2b4
test(server): keep the fake spawner in the rejected-ref tests
bk-agent-01 Nov 3, 2026
fc4ba70
fix(server): fingerprint every git config source and stop reusing the…
bk-agent-01 Nov 3, 2026
5d95ffd
fix(server): map config sources with Effect.forEach
bk-agent-01 Nov 3, 2026
c27f20c
fix(server): kill a dead process host's leftovers by an environment m…
bk-agent-01 Nov 3, 2026
8d93d80
fix(server): no git state fingerprint when environment config adds an…
bk-agent-01 Nov 3, 2026
88f4203
fix(server): kill and release wait for a dead process host's cleanup
bk-agent-01 Nov 3, 2026
7f39f86
Merge pull request #367 from iamtushar324/fix/bkt3-process-host
bk-agent-01 Nov 3, 2026
ccc55a7
Merge remote-tracking branch 'origin/stage' into fix/bkt3-pr-sweep-gi…
bk-agent-01 Nov 3, 2026
cc85a45
Merge pull request #366 from iamtushar324/fix/bkt3-pr-sweep-git-state
bk-agent-01 Nov 3, 2026
8215fff
Merge bkmain into the 2026-11-04 stage promotion
bk-agent-01 Nov 4, 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.
13 changes: 13 additions & 0 deletions .agents/skills/test-t3-app/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,19 @@ Test with meaningful project and thread data. Read
[references/sqlite-fixtures.md](references/sqlite-fixtures.md) only when
inspecting or seeding SQLite. Stop the test server before direct fixture writes.

## Drive agent turns for free

Do not spend a paid model to see a turn render. `vp run dev` registers the
`Replay (dev)` provider, which replays recorded turns with simulated streaming
through the real adapter and orchestration. Its models are scenarios:
`showcase` covers thinking, a plan, tool calls, an approval, and markdown.
Press `Ctrl+Alt+Shift+R` for a picker (GNOME takes that key for screen
recording), call `window.t3dev.replay("showcase")`
with `preview_evaluate`, or run
`node apps/server/src/bin.ts thread start --base-dir .t3 --provider devReplay --model showcase <project> "go"`.
When the test needs real provider behavior, use that provider's cheapest
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
Expand Down
16 changes: 13 additions & 3 deletions .agents/skills/test-t3-mobile/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,21 @@ when inspecting or seeding SQLite. Stop the test server before fixture writes.
From the checkout being tested on the selected device host, run:

```bash
node scripts/mobile-native-client.ts ensure <ios|android> <device-id>
vp run mobile:install <ios|android> <device-id>
```

This reuses a matching native client or builds and installs one. Authorized
mobile verification includes that build step unless the user prohibits it.
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
prints one JSON line; on failure it names the next command. Mobile verification
includes that step unless the user prohibits it.

For a device you opened in an agent-device session elsewhere (a device pool,
cloud, or remote host), run `vp run mobile:install <ios|android> --session <s>`
from the directory you opened the session in. It installs the cached build into
that session (`--abi arm64-v8a` for an ARM Android device; `--metro <url>` also
opens it against Metro) and never builds.

Start `vp run dev:client` from `apps/mobile`, or reuse a healthy Metro belonging
to this checkout. Open its printed development-client URL with AgentDevice
Expand Down
6 changes: 6 additions & 0 deletions .coderabbit.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,19 @@ export default defineConfig((ctx) => ({
path: "apps/web/src/**/*.{tsx,css}",
instructions: "Hold changed code to the rules in docs/internals/web-ui.md.",
},
{
path: "**/*.test.*",
instructions:
"Hold changed tests to the rules in docs/internals/testing.md. Request tests only as those rules allow.",
},
],
},
knowledge_base: {
code_guidelines: {
filePatterns: [
{ files: "docs/internals/effect-services.md", applyTo: "{apps,packages,infra}/**/*.ts" },
{ files: "docs/internals/web-ui.md", applyTo: "apps/web/src/**/*.{tsx,css}" },
{ files: "docs/internals/testing.md", applyTo: "{apps,packages,infra}/**/*.{ts,tsx}" },
],
},
},
Expand Down
4 changes: 2 additions & 2 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Dev container for T3 Code. Mirrors CI (ubuntu-24.04, Node 24, Rust stable)
// Dev container for T3 Code. Mirrors CI (ubuntu-24.04, Node 26, Rust stable)
// and the canonical setup in docs/operations/development.md: global `vp`, `vp i`.
// Contributor doc: docs/internals/devcontainer.md
{
Expand All @@ -8,7 +8,7 @@
// nodeGypDependencies (default true) brings python3/make/g++, which Linux
// needs for node-pty's node-gyp fallback (its prebuilds are mac/win only).
"ghcr.io/devcontainers/features/node:2": {
"version": "24"
"version": "26"
},
// native/resource-monitor (edition 2024, needs stable >= 1.85). The server
// degrades gracefully without the binary, but CI checks cargo fmt + test.
Expand Down
1 change: 1 addition & 0 deletions .github/VOUCHED.td
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ github:myacoub91
github:naMqe-h
github:nateEc
github:naveed949
github:nexxeln
github:nmggithub
github:Noojuno
github:notkainoa
Expand Down
130 changes: 116 additions & 14 deletions .github/actions/setup-ci-deps/action.yml
Original file line number Diff line number Diff line change
@@ -1,51 +1,153 @@
name: Setup CI dependencies
description: Install Vite+ and the workspace dependencies from cache.
inputs:
task-cache-read-token:
description: Read-only credential for the private maintainer task cache
required: false
default: ""
install:
description: Set to "false" to set up Vite+ only, with no pnpm store or install
required: false
default: "true"
install-args:
description: Arguments for `vp install`, such as filters. Empty installs the whole workspace.
required: false
default: ""
runs:
using: composite
steps:
# setup-vp reuses an installed exact version, so restoring its home skips the
# installer download on every job.
# ~/.vite-plus holds vp, the Node.js runtime, and pnpm. A cache entry never
# updates, so the key names all three versions; otherwise a pnpm or Node.js
# bump makes every job download them from npm again.
- name: Resolve Vite+ version
id: vp
shell: bash
run: |
echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT"
echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT"
echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT"

# Pinned because release-desktop.yml signs builds with this action in the job.
- name: Cache Vite+
id: vp_cache
if: steps.vp.outputs.version != ''
uses: actions/cache@v6
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
with:
path: ~/.vite-plus
key: vite-plus-home-v1-${{ runner.os }}-${{ runner.arch }}-${{ steps.vp.outputs.version }}
key: vite-plus-home-v2-${{ runner.os }}-${{ runner.arch }}-${{ steps.vp.outputs.version }}-node${{ steps.vp.outputs.node }}-${{ steps.vp.outputs.pnpm }}

# setup-vp always runs the installer, which fetches vp from npm even when
# this exact version is installed. A cache hit already has everything, so
# skip setup-vp and do its remaining work here. This keeps npm outages from
# failing jobs.
- name: Use cached Vite+
if: steps.vp_cache.outputs.cache-hit == 'true'
shell: bash
run: |
echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH"
"$HOME/.vite-plus/bin/vp" env use "${{ steps.vp.outputs.node }}"

# vp gives each Node.js download attempt 10 minutes by default, so one
# stalled stream holds the job that long. It retries 3 times and resumes
# partial bytes, so a shorter limit costs a slow download only a retry.
- name: Setup Vite+
uses: voidzero-dev/setup-vp@v1
if: steps.vp_cache.outputs.cache-hit != 'true'
uses: voidzero-dev/setup-vp@250f29ce396baf5e8f24498e17c0dfdebabc26eb # v1
env:
VP_DOWNLOAD_TIMEOUT: "120"
with:
node-version-file: package.json
cache: false
run-install: false

- name: Resolve pnpm store path
# A shared key lets whichever install saves first, often a small filtered
# one, become every job's store. Each set of install args gets its own.
- name: Resolve pnpm store
id: pnpm_store
if: inputs.install == 'true'
shell: bash
env:
INSTALL_ARGS: ${{ inputs.install-args }}
run: |
store_path="$(vp pm cache dir)"
echo "path=$store_path" >> "$GITHUB_OUTPUT"
echo "path=$(vp pm cache dir)" >> "$GITHUB_OUTPUT"
metadata_dir="${pnpm_config_cache_dir:-$RUNNER_TEMP/pnpm-metadata}"
echo "pnpm_config_cache_dir=$metadata_dir" >> "$GITHUB_ENV"
echo "verified=$metadata_dir/lockfile-verified.jsonl" >> "$GITHUB_OUTPUT"
if [[ -z "$INSTALL_ARGS" ]]; then
echo "namespace=full" >> "$GITHUB_OUTPUT"
else
echo "namespace=filtered-$(printf '%s' "$INSTALL_ARGS" | cksum | cut -d' ' -f1)" >> "$GITHUB_OUTPUT"
fi

# setup-vp's shared cache key ignores install filters. Keep full installs in a
# separate namespace, including fallback restores.
# Filtered installs prefer the current full store, which holds every package,
# over an older store of their own.
# The pnpm store stays a cache tarball on the runner's own disk. A store on a
# Blacksmith sticky disk mounts in under a second, but pnpm then copies every
# package across filesystems instead of hard-linking it: install took 28-49s
# against 9s plus an 11s restore.
- name: Cache full pnpm store
uses: actions/cache@v6
- name: Restore pnpm store
id: pnpm_cache
if: inputs.install == 'true'
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
with:
path: ${{ steps.pnpm_store.outputs.path }}
key: pnpm-full-v1-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('pnpm-lock.yaml', 'pnpm-workspace.yaml', 'package.json') }}
key: pnpm-${{ steps.pnpm_store.outputs.namespace }}-v1-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('pnpm-lock.yaml', 'pnpm-workspace.yaml', 'package.json') }}
restore-keys: |
pnpm-full-v1-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('pnpm-lock.yaml', 'pnpm-workspace.yaml', 'package.json') }}
pnpm-${{ steps.pnpm_store.outputs.namespace }}-v1-${{ runner.os }}-${{ runner.arch }}-
pnpm-full-v1-${{ runner.os }}-${{ runner.arch }}-

# pnpm accepts an earlier pass for the same lockfile and policy at any age, so
# a cached record skips fetching registry metadata for every package.
- name: Restore lockfile verification
id: pnpm_verified
if: inputs.install == 'true'
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
with:
path: ${{ steps.pnpm_store.outputs.verified }}
key: pnpm-verified-v1-${{ hashFiles('pnpm-lock.yaml', 'pnpm-workspace.yaml', 'package.json') }}

- name: Install dependencies
if: inputs.install == 'true'
shell: bash
run: vp install
env:
INSTALL_ARGS: ${{ inputs.install-args }}
# Unquoted so each filter is its own argument.
run: vp install $INSTALL_ARGS

- name: Save lockfile verification
if: inputs.install == 'true' && steps.pnpm_verified.outputs.cache-hit != 'true'
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
with:
path: ${{ steps.pnpm_store.outputs.verified }}
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.
- name: Save pnpm store
if: >-
inputs.install == 'true' &&
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
with:
path: ${{ steps.pnpm_store.outputs.path }}
key: ${{ steps.pnpm_cache.outputs.cache-primary-key }}

- name: Enable shared task cache
if: >-
github.repository == 'pingdotgg/t3code' &&
(github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) &&
hashFiles('.task-cache.json') != '' &&
inputs.task-cache-read-token != ''
shell: bash
env:
T3_TASK_CACHE_READ_TOKEN: ${{ inputs.task-cache-read-token }}
run: |
node infra/task-cache/scripts/install-ci.ts
if [[ ( "$GITHUB_EVENT_NAME" == pull_request && "$GITHUB_BASE_REF" == main ) || ( "$GITHUB_EVENT_NAME" == push && "$GITHUB_REF" == refs/heads/main ) ]]; then
echo 'VP_REMOTE_CACHE=read-write' >> "$GITHUB_ENV"
else
echo 'VP_REMOTE_CACHE=read' >> "$GITHUB_ENV"
fi
46 changes: 14 additions & 32 deletions .github/scripts/ci-changes.cjs
Original file line number Diff line number Diff line change
@@ -1,37 +1,24 @@
// Decides which CI jobs a change needs. Prints `key=value` lines for
// $GITHUB_OUTPUT; a job runs unless its key is "false".
//
// node ci-changes.cjs --paths <file> gate by the listed paths
// node ci-changes.cjs --paths <file> --full run every Linux job, gate only the macOS lint
// node ci-changes.cjs changed paths unknown: run everything
//
// scripts/check-changed.ts requires the same decisions so local runs match CI.
//
// Every changed path maps to workspace packages, which then pull in their
// dependents from package.json. A path this file does not recognize runs
// everything, so a new root file or directory can only cost minutes.
// Unknown paths run every job; recognized packages pull in their dependents.
// scripts/check-changed.ts shares these decisions so local checks match CI.
const fs = require("node:fs");
const path = require("node:path");

const root = path.resolve(__dirname, "../..");

// Never read by a build, typecheck, or test. Lint still formats them.
const INERT = [
/^docs\//,
/^\.(agents|cursor|vscode|devcontainer|macroscope|repos)\//,
/^[^/]+\.md$/,
/^LICENSE$/,
];

// Run everything: the root vite.config.ts loads the first as setup for every
// package's tests, and the vendored mobile tarballs are installed dependencies.
// Shared test setup and vendored mobile dependencies affect every package.
const RUNS_EVERYTHING = [
/^packages\/shared\/src\/(HostProcess|testing\/longTempDir)\.ts$/,
/^packages\/shared\/src\/(HostProcess|testing\/(longTempDir|providerEnv))\.ts$/,
/^apps\/mobile\/deps\//,
];

// Paths outside a package, or files inside one that other packages read
// through relative imports rather than a package.json dependency.
// Includes cross-package reads absent from package.json dependencies.
const EXTRA_OWNERS = [
// Vite configs and tsconfigs of these apps import scripts/lib directly.
[/^scripts\/lib\//, ["@t3tools/desktop", "@t3tools/mobile", "@t3tools/web", "t3"]],
Expand All @@ -40,13 +27,15 @@ const EXTRA_OWNERS = [
[/^native\/browser-secret\//, ["@t3tools/desktop"]],
[/^native\/kde-snap-shot\//, ["@t3tools/desktop"]],
[/^native\/libghostty-vt\//, ["@t3tools/web"]],
// apps/server/src/cloud/ConnectReachability.test.ts checks the guide's headings.
[/^docs\/user\/t3-connect-troubleshooting\.md$/, ["t3"]],
];
const RUST = /^native\/(resource-monitor|kde-snap-shot|hyprland-snap-shot)\//;

// Tests that read another package's files without declaring it. The scripts
// tests read app manifests, assets, and sources (cursor-sdk-packaging,
// third-party-licenses, brand-assets, build-desktop-artifact).
// These tests read other packages without declaring dependencies.
const TEST_ONLY_DEPS = {
// Evals import the server's source to test its real model-facing text.
"@t3tools/evals": ["t3"],
"@t3tools/provider-pi": ["@t3tools/client-runtime"],
"@t3tools/scripts": [
"@t3tools/desktop",
Expand All @@ -56,17 +45,12 @@ const TEST_ONLY_DEPS = {
"@t3tools/provider-cursor",
],
};
// Declared dependencies that only feed a build step: the server bundles the
// built web app (apps/server/vite.config.ts) but never imports it.
// The server bundles the web build without importing it.
const BUILD_ONLY_DEPS = { t3: ["@t3tools/web"] };

// Sources scripts/mobile-native-static-check.ts lints, plus the tool and rule
// configuration that decides how it lints them, plus the root package.json
// that defines the lint:mobile command.
const MOBILE_NATIVE =
/^apps\/mobile\/.*\.(swift|kt|kts)$|^apps\/mobile\/(\.swiftlint\.yml|detekt\.yml|\.editorconfig|Brewfile)$|^scripts\/mobile-native-static-check\.ts$|^package\.json$|^\.github\/workflows\/ci\.yml$|^\.github\/scripts\/ci-changes\.cjs$|^\.github\/actions\/ci-changes\//;

// Jobs that test every package except these, which have jobs of their own.
const OWN_TEST_JOB = new Set(["t3", "@t3tools/web", "@t3tools/monorepo"]);

function readWorkspace() {
Expand Down Expand Up @@ -108,14 +92,13 @@ function readWorkspace() {
return packages;
}

// Returns the packages a path touches, [] for an inert path, or null when the
// path is not understood and everything must run.
// [] means inert; null means unknown and requires every job.
function ownersOf(file, packages) {
if (INERT.some((pattern) => pattern.test(file))) return [];
const extra = EXTRA_OWNERS.flatMap(([pattern, names]) => (pattern.test(file) ? names : []));
if (INERT.some((pattern) => pattern.test(file))) return extra;
// A manifest can change dependencies or versions other packages read.
if (path.posix.basename(file) === "package.json") return null;
if (RUNS_EVERYTHING.some((pattern) => pattern.test(file))) return null;
const extra = EXTRA_OWNERS.flatMap(([pattern, names]) => (pattern.test(file) ? names : []));
// scripts/build-desktop-artifact.test.ts reads the crates' sources.
if (RUST.test(file)) return ["@t3tools/scripts", ...extra];

Expand Down Expand Up @@ -148,7 +131,6 @@ function decide(files, packages, full) {
if (everything) {
affected = all;
} else {
// Add dependents until nothing changes.
let grew = true;
while (grew) {
grew = false;
Expand Down
13 changes: 3 additions & 10 deletions .github/scripts/mirror-play-apk.cjs
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
// Publishes closed-testing betas, or downloads the internal APK for a normal
// nightly release. Play generates and signs the APK from the
// uploaded bundle with the app signing key, so it carries the same signature
// as the Play Store install. Run by .github/workflows/mobile-android-apk.yml.
// Play signs generated APKs with the app signing key, matching Play Store installs.
const { execFileSync } = require("node:child_process");
const crypto = require("node:crypto");
const fs = require("node:fs");
Expand Down Expand Up @@ -50,10 +47,7 @@ async function play(token, method, url) {
return response;
}

// Highest version code the track serves, with its release name. Play names a
// release after the bundle's versionName unless the uploader sets one. This
// endpoint reads without opening an edit; an edit would invalidate any open
// EAS Submit edit made with the same service account.
// Opening an edit would invalidate any EAS Submit edit using the same service account.
async function newestTrackBuild(token, appUrl, trackName) {
const { releases = [] } = await (
await play(token, "GET", `${appUrl}/tracks/${trackName}/releases`)
Expand Down Expand Up @@ -82,8 +76,7 @@ function readRelease(tag) {
}
}

// Download to a temporary directory so a failed request cannot leave a partial
// APK among the release assets.
// Stage downloads so failed requests cannot leave partial release assets.
async function downloadApk({ token, appUrl, build, apkName }) {
const generated = await (
await play(token, "GET", `${appUrl}/generatedApks/${build.versionCode}`)
Expand Down
Loading
Loading