Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
856 commits
Select commit Hold shift + click to select a range
62ee103
fix(server): setup script output no longer shows stray bytes of escap…
spoukyii Nov 15, 2026
2370e33
fix(web): the SQLite, archive and notebook previews say "1 row", "1 e…
spoukyii Nov 15, 2026
dde53b1
fix(web): notebook error previews no longer show terminal color codes…
geezoria Nov 15, 2026
e8d5c12
perf(server): skip non-image results in project icon searches (#32089)
voltcrash Nov 15, 2026
4a3be94
fix(server): retain scheduled dispatch refusal reasons (#32115)
macodev00 Nov 15, 2026
6f06f26
fix(codex): settle unfinished web searches when turns end (#32177)
Sidreyas Nov 15, 2026
b39fc24
fix(pi): Pi agents get T3CODE_THREAD_ID like Claude, Codex and ACP se…
spoukyii Nov 15, 2026
c910b1b
fix(cli): t3 connect and t3 service hints keep --base-dir (#31906)
spoukyii Nov 15, 2026
2e0353d
fix(shared): compare prerelease versions without locale or precision …
luke2x Nov 15, 2026
b9bbfda
fix(server): NixOS container and systemd-nspawn veths are no longer a…
repparw Nov 15, 2026
0fa8e5a
fix(relay): slow APNs requests no longer delay other devices (#32183)
Sidreyas Nov 15, 2026
4afa6f0
fix(server): proxied Codex usage limits keep their reset time (#32188)
EhsanulHaqueSiam Nov 15, 2026
39fcae5
fix(server): session cookies are Secure when the request arrived over…
juliusmarminge Nov 15, 2026
14a60e8
fix(server): session import no longer counts unused sessions as failu…
mthsmb Nov 15, 2026
bbd8bc0
perf(server): reuse Find documents across query changes (#29310)
voltcrash Nov 15, 2026
6152fe3
fix(server): branch PRs stay matched when a remote has a second push …
saphid Nov 15, 2026
8516874
fix(server): Stop on a stalled run closes its approval and question c…
saphid Nov 15, 2026
1e38ebb
fix(pi): recognize OmO's builtin tool search (#32321)
wuhaoyujerry Nov 15, 2026
bf3549b
fix(server): boot-started linux servers offer and open the file manag…
Tiaxi Nov 15, 2026
f00afc6
fix(server): typing after a click by coordinates no longer hangs a pr…
Entrpi Nov 15, 2026
4aead9e
fix(server): Claude MCP elicitations T3 cannot show are cancelled, no…
buttjer Nov 15, 2026
c8c2102
fix(server): log canceled relay requests at debug level (#32215)
Sidreyas Nov 15, 2026
3f1b132
fix(acp): give Command Code T3's MCP endpoint over HTTP (#34004)
ajinkyajacob Nov 15, 2026
1e60d60
Fix #29433: Restore Codex MCP apps after thread unload (#29498)
amr807 Nov 15, 2026
0bd581b
fix(server): regenerate an empty persisted secret instead of failing …
juliusmarminge Nov 15, 2026
f283973
fix(server): Gemini Spark can register its six MCP OAuth redirect URI…
juliusmarminge Nov 15, 2026
5f6b5a8
fix(cli): the already-running error names the t3 pair command that co…
juliusmarminge Nov 15, 2026
2a66bf2
fix(server): read_pull_request_guide reads no-checkout hosts through …
juliusmarminge Nov 15, 2026
467ec62
fix(server): Codex calls delegate_task directly instead of from Code …
juliusmarminge Nov 15, 2026
c6a120a
fix(forgejo): review guides work for checkouts whose SSH remote is no…
juliusmarminge Nov 15, 2026
9791bce
fix(effect-acp): reject elicitation modes the client did not advertis…
juliusmarminge Nov 15, 2026
6c0032d
fix(server): MCP refuses disallowed browser origins with 403 before a…
juliusmarminge Nov 15, 2026
2e9418a
fix(mcp): explain cross-thread permission rejections (#36934)
07rjain Nov 15, 2026
1672b51
fix(web): Add Environment drops the old tab's error when switching mo…
kvapca Nov 15, 2026
3e29748
fix(server): malformed MCP client registration returns an RFC 7591 er…
juliusmarminge Nov 15, 2026
e57041a
fix(server): pairing codes typed in hyphen- or space-separated groups…
juliusmarminge Nov 15, 2026
137a869
fix(shared): use HTTP for schemeless loopback previews (#29710)
JoaoMarcos44 Nov 15, 2026
166cb00
fix(opencode): Full access subagents start without approval prompts (…
juliusmarminge Nov 15, 2026
9dbb802
fix(desktop): saving keeps a connection catalog this build cannot rea…
juliusmarminge Nov 15, 2026
dcd39b4
fix(pi): model list loads when the server's folder has a project MCP …
chaitanyaprem Nov 15, 2026
5a31f17
fix(server): Git LFS images in pull request descriptions load the obj…
juliusmarminge Nov 15, 2026
98f885a
fix(server): desktop preview uploads accept files over 50 MB (#30299)
juliusmarminge Nov 15, 2026
d430dff
fix(usage): keep default-home history after the default account moves…
juliusmarminge Nov 15, 2026
1dfc746
fix(provider-acp): approving a Devin plan never picks its bypass-perm…
juliusmarminge Nov 15, 2026
1b9121b
fix(server): guests of a forked thread can expand the commands it inh…
saphid Nov 15, 2026
355adf2
docs(user): Tailscale HTTPS lists what the tailnet needs (#23759)
WesleySmits Nov 15, 2026
e6344be
fix(client-runtime): MCP app results with images reach the app instea…
juliusmarminge Nov 15, 2026
a9386ac
fix(gitlab): a pasted repository URL is looked up by its project path…
Dkm0315 Nov 15, 2026
e9d8ac5
fix(server): skip user hooks in Codex text generation (#35203)
thelogicmatrix Nov 15, 2026
808dae1
fix(server): worktrees of git-annex repositories can be removed (#34065)
cardoso-neto Nov 15, 2026
46fff79
fix(server): Codex model changes no longer restart a shared session f…
juliusmarminge Nov 15, 2026
4c9a873
fix(cursor): an aborted Cursor SDK stall no longer stops the server (…
Gourav224 Nov 15, 2026
9b38039
fix(forgejo): prefer the deepest-mounted login when a root login also…
juliusmarminge Nov 15, 2026
2123168
fix(opencode): Go-key-only instances keep OpenCode Go usage on OpenCo…
juliusmarminge Nov 15, 2026
25a1afe
fix(client-runtime): opening an old search result keeps messages in o…
juliusmarminge Nov 15, 2026
6a510c4
fix(server): MCP OAuth rejects a resource with an empty fragment (#35…
juliusmarminge Nov 15, 2026
5de10b9
fix(provider-core): branch-name generation no longer starts the user'…
juliusmarminge Nov 15, 2026
32a6a7f
fix(web): desktop window recovers when its backend restarts during a …
juliusmarminge Nov 15, 2026
8bc7a08
fix(server): an explicit Tailscale IPv6 bind is advertised as a tailn…
juliusmarminge Nov 15, 2026
9bea6f7
fix(server): agent slice memory limits follow live memory changes (#3…
OmarAlex24 Nov 15, 2026
d6795ea
fix(grok): background text generation no longer inherits Grok always-…
saphid Nov 15, 2026
17db708
fix(server): preview port discovery stops polling while no client is …
juliusmarminge Nov 15, 2026
da95a04
fix(web): right-panel shortcuts work on a new, unsent thread (#35189)
juliusmarminge Nov 15, 2026
e3c7c08
fix(desktop): a backend busy right after startup no longer ends in a …
juliusmarminge Nov 15, 2026
3cd8b05
fix(onepassword): a failed batch read no longer outlasts the 45-secon…
juliusmarminge Nov 15, 2026
d5726cb
fix(server): agents get no device tools or instructions while the Dev…
juliusmarminge Nov 15, 2026
fa5fde4
fix(server): clients paired over Tailscale Serve keep their own addre…
juliusmarminge Nov 15, 2026
3947e22
fix(server): HTML previews load relative video and audio files (#36199)
juliusmarminge Nov 15, 2026
dc7ea2c
fix(server): a linked launch above the link's access names the link, …
juliusmarminge Nov 15, 2026
bf8fd41
fix(server): Claude append launch text may start with two hyphens (#3…
juliusmarminge Nov 15, 2026
64a481c
fix(cursor): text generation retries without the sandbox when send re…
juliusmarminge Nov 15, 2026
5ee4fd4
fix(server): resolve Claude WinGet launchers on Windows (#32138)
Sidreyas Nov 15, 2026
365a62a
fix(server): Claude knows decline feedback is the user's message (#27…
juliusmarminge Nov 15, 2026
ea4e7c1
fix(acp): permission answers send the agent's option id unchanged (#3…
juliusmarminge Nov 15, 2026
3466f9e
fix(server): forwarded calls to a linked environment no longer wait o…
juliusmarminge Nov 15, 2026
2c2a286
fix(server): Claude sessions no longer log a canUseTool shadowing war…
mahirozdin Nov 15, 2026
85a81b7
fix(server): Claude text generation honors --settings launch args (#3…
juliusmarminge Nov 15, 2026
12042ff
docs: align delegation guide with current MCP contract (#31045)
jacobcorbett Nov 15, 2026
23ba9b3
fix(server): fx threads load the user's profile MCP servers (#29538)
juliusmarminge Nov 15, 2026
93cd25a
fix(acp-registry): executables named like ..agent count as inside the…
juliusmarminge Nov 15, 2026
0f0c1ca
fix(server): usage mapped onto a Pi, Cursor or Antigravity model pric…
MarcoDotIO Nov 15, 2026
3209fa9
fix(server): resuming a queue no longer bypasses failed worktree setu…
StiensWout Nov 15, 2026
ffd11ff
fix(server): agents can no longer delete the built-in No project thro…
juliusmarminge Nov 15, 2026
f12e820
fix(web): load a too-large PR file's diff on demand (#37007)
Yash-Singh1 Nov 15, 2026
eefba1a
fix(cli): t3 up and t3 status hints keep --base-dir (#31878)
spoukyii Nov 15, 2026
d2a894a
fix(server): forks of forks keep their deleted source's files (#32255)
shivamhwp Nov 15, 2026
cc4160c
fix(web): stashed prompt previews no longer end in a broken character…
felixlaga Nov 15, 2026
e0ca4fc
fix(web, mobile): a failed terminal resize is sent again (#32047)
juliusmarminge Nov 15, 2026
3b5bfce
fix(gitcafe): recognize ssh:// remotes that name no user (#32363)
jancuk Nov 15, 2026
7b9af5f
fix(server): EPUB text extraction skips the chapter head (#32370)
jancuk Nov 15, 2026
a9e900f
fix(mobile): queued messages show mentions and files by name, not as …
MarcoDotIO Nov 15, 2026
189290c
fix(web): [NIT] SF Pro label no longer renders in a serif in the font…
plusk-dev Nov 15, 2026
559cd7d
fix(web): quieter Ready and Merge buttons on PR rows (#25346)
flamboh Nov 15, 2026
348009d
fix(prs): include Storybook files in the test filter and counts (#29083)
aminevg Nov 15, 2026
0fbe8a2
fix(web): settings section headers no longer overlap their actions on…
M0xoo Nov 15, 2026
58f609f
fix(web): theme import no longer says a file just under 1 MB is "1024…
spoukyii Nov 15, 2026
25c44fc
fix(web): use available space for project breadcrumbs (#30503)
bentbrain Nov 15, 2026
e6666dc
docs: include required Bitbucket workspace read scope (#30593)
chungweileong94 Nov 15, 2026
f7a1bac
fix(web): subagent status dots no longer jump between corners (#30753)
markjoshwel Nov 15, 2026
b8bffc8
fix(web): resource monitor no longer claims to sample every 0 ms (#29…
M0xoo Nov 15, 2026
843893e
fix(web): the minimap keeps the current turn lit while reading a long…
Yuruzuu Nov 15, 2026
16a7005
fix(desktop): voice input recovers after Linux audio restarts (#32376)
voltcrash Nov 15, 2026
d5a50a1
perf(pr): actions, title edits and labels show the moment you click, …
Bil0000 Nov 15, 2026
f0495f7
fix(provider-core): background work notices no longer say every task …
felixlaga Nov 15, 2026
34204a3
fix(server): restarts no longer drop prompts the provider never accep…
Jolymmiles Nov 15, 2026
e2afd25
perf(web): typing no longer re-renders the composer's footer controls…
OmarAlex24 Nov 15, 2026
11c425b
fix(server): task_status no longer reports a restart-continued task a…
Jolymmiles Nov 15, 2026
86cdf80
fix(web): sidebar edge uses the same resize cursor as side panels (#3…
tenyoru Nov 15, 2026
ab319a5
fix(web): attach command palette threads outside the sidebar (#37054)
Yash-Singh1 Nov 15, 2026
d8b80a1
fix(server): status reports no branch while a clone has not checked o…
juliusmarminge Nov 15, 2026
97edb7a
perf(scripts): check:changed on Windows no longer spends minutes walk…
Pyseph Nov 15, 2026
4117bd4
perf(web): answering a question no longer re-renders the whole chat v…
OmarAlex24 Nov 15, 2026
a5d21a3
perf(server): command palette status rows skip the Changes totals the…
Yuruzuu Nov 15, 2026
aace48b
fix(web): PR file order follows alias imports of dotted modules (#32364)
jancuk Nov 15, 2026
015eba4
fix(acp): a failed MCP-over-ACP disconnect can be retried (#33069)
notzenco Nov 15, 2026
1b04bab
fix(web): settle check lines up with row timestamps (#33053)
sergiiopm Nov 15, 2026
9ec7143
fix(provider-core): handoff work reserve fits small context windows (…
MiaAI-Lab Nov 15, 2026
fbfebc8
fix(mobile): video previews survive re-signed URLs and a late-attache…
bartlomiejbloniarz Nov 15, 2026
7ced2ca
fix(mobile): honor Android clock format in message timestamps (#33078)
razzeee Nov 15, 2026
528c77f
fix(shared): .localdomain hosts no longer leak to the favicon service…
mrlufepines Nov 15, 2026
7f575e6
fix(web): collapsing Electron main no longer hides the backend server…
thepradipvc Nov 15, 2026
b1050d3
test: remove duplicate client call-site coverage (#36776)
t3-code-bot[bot] Nov 15, 2026
2d80ca0
fix(github): pull request activity reports a rate-limited review-thre…
only21mil Nov 15, 2026
f52fba4
fix(web): stacked composer banners no longer show dark seam bands (#3…
Pulsar-Programmer Nov 15, 2026
8e06750
fix(web): draft images keep their order after a reload (#32709)
only21mil Nov 15, 2026
71adeef
fix(web): open PDF links in the file viewer (#37064)
Yash-Singh1 Nov 15, 2026
ab2420f
fix(server): a selected-file commit keeps other files' merge conflict…
only21mil Nov 15, 2026
9a79883
fix(web): a file opened from a diff in a project folder inside a repo…
Entrpi Nov 15, 2026
294a841
test(web): ACP project picker test waits for the popup to take focus …
seancarnahan Nov 15, 2026
147de34
fix(web): stop held dictation when shortcut modifiers are released (#…
mrlufepines Nov 15, 2026
2386789
perf(web): resting on a PR row also reads its activity, so the timeli…
Bil0000 Nov 15, 2026
62d33c1
fix(server): agents can see whether a thread is pinned (#32727)
shadizx Nov 15, 2026
52c6208
fix(server): a pushed commit no longer reports failure when the final…
only21mil Nov 15, 2026
da9c848
test(web): the streaming render scenario gives the timeline stable pr…
Entrpi Nov 15, 2026
3a1dfb7
fix(web): HTML file previews use the current canvas color (#37072)
Yash-Singh1 Nov 15, 2026
ca31ab6
fix(web): an image-only send that fails behind a new draft now says s…
only21mil Nov 15, 2026
40f63b4
fix(assets): align app icons and retain a folder placeholder while lo…
Yash-Singh1 Nov 15, 2026
ab45ce7
fix(github): pull request activity says when its comments were cut (#…
only21mil Nov 15, 2026
742a912
test(github): activity mock sets the new truncated flag (#37078)
juliusmarminge Nov 15, 2026
9f815c9
fix(server): a branch's own pull request shows past a hundred same-na…
only21mil Nov 15, 2026
033ae7c
fix(server): an effect this build can't read no longer blocks its thr…
only21mil Nov 15, 2026
781ab05
fix(acp-registry): a failed agent install no longer floods provider s…
only21mil Nov 15, 2026
3fe1dd9
fix(web): terminal reports focus changes to programs that request the…
StiensWout Nov 15, 2026
37b71a4
fix(web): remove redundant subagent action from background row (#37079)
Yash-Singh1 Nov 15, 2026
4fa5f0e
fix(web): a side chat's subagent opens its parent as a side chat tab,…
Yuruzuu Nov 15, 2026
79e47e9
fix(shared): inline code paths like `docker/Dockerfile` become file c…
felixlaga Nov 15, 2026
63b5645
fix(web): Esc in Clerk's account modal no longer closes Settings (#32…
thepradipvc Nov 15, 2026
d738edf
fix(mobile): show thread sync status in the header, not above the com…
juliusmarminge Nov 15, 2026
154c0fd
fix(mobile): undo toast lines up with the folded Duo's tab bar (#37081)
juliusmarminge Nov 15, 2026
ca0ca71
fix(desktop): Stable switch no longer tells policy-blocked nightly ap…
only21mil Nov 15, 2026
2f30d98
fix(web): live dictation transcript keeps the newest words in view (#…
SharoonRafeek Nov 15, 2026
0720280
fix(server): preserve shell paths containing spaces and dashes (#37069)
StiensWout Nov 15, 2026
efddcfe
perf(server): batch terminal output that arrives within 2 ms (#37060)
juliusmarminge Nov 15, 2026
5d58954
perf(desktop): WSL preflight starts the staged runtime once instead o…
juliusmarminge Nov 15, 2026
93f8563
fix(mobile): worktree setup shows in the chat from the first moment (…
juliusmarminge Nov 15, 2026
f36c835
fix(server): an MCP pin lands at the top of the Pinned section (#33978)
xwchen Nov 15, 2026
9de4a2f
fix(mobile): keep Diagnostics and Client Storage content above floati…
j-gaertig Nov 15, 2026
5e0127c
fix(acp-registry): observe delayed model discovery and avoid stale ca…
hxbib Nov 15, 2026
986975e
test(web): Settings Esc test waits for the modal's initial focus (#37…
juliusmarminge Nov 15, 2026
52451a7
fix(claude): keep monitor threads waiting between updates (#37085)
Yash-Singh1 Nov 15, 2026
278e47d
fix(mobile): the iPhone Duo's sidebar list ends above its tab bar in …
juliusmarminge Nov 15, 2026
2dc5ebd
fix(web): switching providers no longer drops the thread's stored eff…
only21mil Nov 15, 2026
aaf5b9c
fix(mobile): PR activity filter remembers bot and resolved visibility…
juliusmarminge Nov 15, 2026
2cb2fa1
fix(web): terminal links open bare compiler filenames (#37071)
StiensWout Nov 15, 2026
b35c970
fix(acp): optional text questions can be left blank (#36997)
shivamhwp Nov 15, 2026
4ab3b98
fix(shared): MCP apps that fall back to a blob: frame no longer rende…
u9g Nov 15, 2026
2045004
fix(shared): keep coalescing workers alive when processors throw (#32…
luke2x Nov 15, 2026
9618837
fix(server): an empty Antigravity MCP config still allows text genera…
saphid Nov 15, 2026
570640b
perf(server): active thread reads filter on the archived_at column (#…
mahirozdin Nov 15, 2026
6444087
perf(resource-monitor): look up external process identities by PID (#…
hieu-lee Nov 15, 2026
3ee4aa6
fix(server): accept ASCII whitespace in base64 image payloads (#31798)
darshmahadevia Nov 15, 2026
8c80003
perf(server): Codex skills for four workspaces load in a median 138 m…
Yuruzuu Nov 15, 2026
f2c9449
fix(web): recover expired composer uploads before sending (#32910)
Adamulek123 Nov 15, 2026
32c069e
fix(server): content search recovers after a slow first index (#33138)
ItsThierry Nov 15, 2026
e101cae
fix(terminal): show shell startup failures across attachments (#37088)
StiensWout Nov 15, 2026
4f82964
perf(server): long threads open about 2.5x faster (#34014)
valuin Nov 15, 2026
50a2f5b
perf(server): long threads open about 2.5x faster (#34014)
valuin Nov 15, 2026
4564962
fix(mobile): inline markdown images page through their message's imag…
juliusmarminge Nov 15, 2026
bcdd6a5
fix(mobile): /model suggestion opens the model picker (#37109)
StiensWout Nov 15, 2026
178570d
fix(desktop): release cancelled Codex callback listeners during brows…
romil-bijarnia Nov 15, 2026
94edd64
perf(server): skip compression for the desktop's local connection (#3…
voltcrash Nov 15, 2026
f28c74a
fix(server): outside MCP clients stop being offered thread-bound tool…
RVZO6 Nov 15, 2026
c8a1b5f
fix(ssh): preserve literal home paths in Include expansion (#33288)
Lucenx9 Nov 15, 2026
2b83dd0
fix(server): finish closed terminal kills before shutdown (#37113)
StiensWout Nov 15, 2026
7d9c365
fix(web): keep distinct images with matching attachment metadata (#37…
StiensWout Nov 15, 2026
8dba23e
fix(web): large terminal pastes reach the program intact (#37103)
StiensWout Nov 15, 2026
f0a3321
fix(server): settling a thread keeps exec and foreground Bash termina…
juliusmarminge Nov 15, 2026
96290af
fix(codex): keep browser access prompts available in full access (#37…
Yash-Singh1 Nov 15, 2026
46f3ab3
fix(web): open terminal file links naming the server hostname (#37133)
StiensWout Nov 15, 2026
1b14aad
fix(mobile): recheck the current branch before selecting it (#37121)
StiensWout Nov 15, 2026
834eb51
fix(acp): wait for session/load to reply before prompting (#37139)
shivamhwp Nov 15, 2026
d8c7855
fix(web): terminal mouse reports hit the drawn cell (#37148)
StiensWout Nov 15, 2026
def4cd4
fix(server): run_scheduled_task_now returns why a started run failed …
SouthCarpet Nov 15, 2026
70abb6c
fix(azure-devops): pull request titles like `@notes.txt` are saved as…
juliusmarminge Nov 15, 2026
789d10f
fix(web): Sharing & access can select a desktop-local WSL backend (#3…
juliusmarminge Nov 15, 2026
0afd8c0
fix(mobile): pasted GIFs on iOS keep their animation (#37143)
StiensWout Nov 15, 2026
4b9cf57
fix(acp): Copilot's reply after a background agent wakes it opens a c…
juliusmarminge Nov 15, 2026
a16796b
fix(shared): ß no longer splits words in generated folder and branch …
lowlyleon Nov 15, 2026
86a9d9f
fix(server): name the missing project when a change request's reposit…
Sidreyas Nov 15, 2026
ff9dca8
fix(server): an oversized provider request reads as too large, not ra…
Sidreyas Nov 15, 2026
649d9fc
fix(provider-acp): Grok early task completion no longer replaces the …
juliusmarminge Nov 15, 2026
7379f19
fix(web): keypad navigation works with NumLock off (#37175)
StiensWout Nov 15, 2026
8897a6e
fix(web): keep thread mentions when editing sent messages (#37183)
StiensWout Nov 15, 2026
dcaedc9
fix(server): skills linked by a SessionStart hook appear in the $ pic…
caitlon Nov 15, 2026
2becf31
fix(server): Windows spawn workers no longer leak a short child's out…
juliusmarminge Nov 15, 2026
be8c4c6
fix(web): repaint terminal when programs change default colors (#37193)
StiensWout Nov 15, 2026
cb251b9
fix(web): composer suggestions stay reachable in short windows (#37179)
StiensWout Nov 15, 2026
6071022
fix(server): Claude session name follows thread renames without waiti…
juliusmarminge Nov 15, 2026
6d3f642
fix(web): Enter sends when a panel-conditioned shortcut is inactive (…
StiensWout Nov 15, 2026
7e69e88
fix(server): project search starts working once a slow content index …
juliusmarminge Nov 15, 2026
304cf14
fix(web): terminal file links preserve numeric filename suffixes (#37…
StiensWout Nov 15, 2026
5070931
fix(mobile): cutting text in the iOS composer can be undone (#37158)
StiensWout Nov 15, 2026
449deb6
fix(web): modified F3 reaches ncurses terminal bindings (#37211)
juliusmarminge Nov 15, 2026
d21d8d8
fix(mobile): iOS video previews keep their contain fit instead of som…
juliusmarminge Nov 15, 2026
9c1dfbb
fix(server): delegate_task names the CLI version that hides a model (…
juliusmarminge Nov 15, 2026
0b489da
fix(web): switching a draft’s machine keeps its selected models (#37208)
StiensWout Nov 15, 2026
a3708b5
fix(web): concealed terminal text stays hidden under the cursor (#37141)
StiensWout Nov 15, 2026
45dbb44
fix(web): legacy mouse reports reach the PTY byte for byte (#37223)
StiensWout Nov 15, 2026
0de6ddb
fix(web): editing a queued message into /btw no longer saves it to th…
juliusmarminge Nov 15, 2026
16854a7
fix(web): usage chart and share-bar figures reach screen readers (#37…
juliusmarminge Nov 15, 2026
b5d9c71
fix(web): screen readers announce each Usage figure with its label (#…
juliusmarminge Nov 15, 2026
3e7f5ec
fix(desktop): a renderer that keeps crashing is reloaded with a backo…
juliusmarminge Nov 15, 2026
256dce7
fix(web,mobile): @ picker finds older settled threads on linked machi…
StiensWout Nov 15, 2026
14f295e
fix(terminal): one web viewer answers shared PTY queries (#37233)
StiensWout Nov 15, 2026
c2e54e3
fix(acp): recognize sessions already owned by a thread (#37244)
drstrangerujn Nov 15, 2026
aee2311
fix(acp): show local agent reported version (#37229)
drstrangerujn Nov 15, 2026
09fc222
fix(server): imported Claude sessions are titled after the prompt ins…
juliusmarminge Nov 15, 2026
2182097
fix(server): theme set help names which clients apply the theme (#37259)
juliusmarminge Nov 15, 2026
ed7f069
test(desktop): two-account callback test uses two distinct ports (#37…
t3dotgg Nov 15, 2026
073989f
fix(mobile): Duo scroll indicator sits past the vertical bar, at the …
juliusmarminge Nov 15, 2026
12c495a
fix(mobile): sending a message no longer shifts the feed before it se…
juliusmarminge Nov 15, 2026
598296e
fix(web): copied code blocks drop the fence's trailing newline (#37284)
juliusmarminge Nov 15, 2026
2579c3c
fix(web): close Usage without reloading (#37272)
dustinwloring1988 Nov 15, 2026
f1919eb
fix(server): Codex prompt suggestions no longer imitate delegated tas…
juliusmarminge Nov 15, 2026
249b92c
fix(mobile): tasks in unconnected linked environments no longer show …
juliusmarminge Nov 15, 2026
16ff4b4
fix(mobile): fully typed /model keeps its suggestion (#37280)
StiensWout Nov 15, 2026
21fe33c
fix(server): schedule_task uses the project's effective default model…
juliusmarminge Nov 15, 2026
64e7e23
fix(mobile): swipe actions no longer clip in short thread rows (#37285)
abdfattahz Nov 15, 2026
03e05f6
fix(server): a background OpenCode subagent's question survives its p…
juliusmarminge Nov 15, 2026
dd7255d
fix(server): PowerShell process scans keep non-ASCII names on Windows…
SouthCarpet Nov 15, 2026
c5e6b24
fix(mobile): iOS multi-item text paste folds into an attachment (#37301)
juliusmarminge Nov 15, 2026
295a0a7
feat(mobile): open iOS images in a native viewer modelled on Messages…
juliusmarminge Nov 15, 2026
1d74a17
fix(mobile): iPhone New chat stays beside the tabs after a Settings p…
cwilkus1-bit Nov 15, 2026
af8faa9
fix(server): dismissing a background OpenCode subagent's question let…
juliusmarminge Nov 15, 2026
26b63a4
fix(mobile): environment filter leaves out switched-off environments …
tomhmoses Nov 15, 2026
51cdf23
fix(server): work a dead provider process was running no longer stays…
juliusmarminge Nov 15, 2026
1bc96a9
chore: merge upstream/main into the sandbox fork
OmarAlex24 Nov 15, 2026
118d917
fix(web): sandbox UI follows upstream's composer, sidebar and groupin…
OmarAlex24 Nov 15, 2026
048ad2d
fix(contracts): classify upstream's new server settings for sandboxes
OmarAlex24 Nov 15, 2026
02c93c1
test(server): sub-sandbox delegation tests follow upstream's task_status
OmarAlex24 Nov 15, 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
  •  
  •  
  •  
13 changes: 9 additions & 4 deletions .agents/skills/test-t3-mobile/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,15 @@ 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.
cloud, or remote host), run `vp run mobile:install <ios|android> --session <s>
--config <file>` from the directory you opened the session in, passing the
`--config` file from `device_open`'s `targetArgs`. Without it, a device pool's
gateway refuses the install, wrongly saying agent-device is too old. It installs
the cached build into that session (`--abi arm64-v8a` for an ARM Android device;
pool Android emulators are x86_64, the default; `--metro <url>` also opens it
against Metro). Without a cached build for this checkout it builds first, which can
outlast the lease, so run `vp run mobile:install <ios|android> --prepare` (with
the same `--abi`) before you open the device.

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
38 changes: 31 additions & 7 deletions .github/scripts/pr-limits.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -100,14 +100,22 @@ function parseExemptions(text) {
}

// VOUCHED.td: one `github:login` per line, `#` comments, and `-github:login reason` to denounce.
function vouchedLogins(text) {
const logins = new Set();
// A login listed both ways is an error: pr-vouch.yml's action reads its first line and
// issue-vouch.yml its last, so no answer here would agree with both labels.
function parseVouchList(text) {
const vouched = new Set();
const denounced = new Set();
for (const raw of text.split("\n")) {
const entry = raw.trim().split(/\s+/)[0];
if (entry.startsWith("github:")) logins.add(entry.slice("github:".length).toLowerCase());
const match = /^(-?)github:(\S+)/.exec(raw.trim());
if (!match) continue;
const login = match[2].toLowerCase();
const [listed, other] = match[1] ? [denounced, vouched] : [vouched, denounced];
if (other.has(login))
throw new Error(`${VOUCHED_PATH}: ${login} is both vouched and denounced`);
listed.add(login);
}
if (logins.size === 0) throw new Error(`${VOUCHED_PATH}: no entries`);
return logins;
if (vouched.size === 0) throw new Error(`${VOUCHED_PATH}: no entries`);
return { vouched, denounced };
}

function labeledAt(pr, name) {
Expand Down Expand Up @@ -278,7 +286,8 @@ async function enforceOpenLimit({ github, context, core, dryRun }) {
// lookups as "not vouched". Every read below throws on failure, and a throw closes nothing.
if (pr.user.type === "Bot") return;
if (parseExemptions(fs.readFileSync(EXEMPTIONS_PATH, "utf8")).has(author.toLowerCase())) return;
if (vouchedLogins(fs.readFileSync(VOUCHED_PATH, "utf8")).has(author.toLowerCase())) return;
const { vouched, denounced } = parseVouchList(fs.readFileSync(VOUCHED_PATH, "utf8"));
if (vouched.has(author.toLowerCase())) return;
const { data: access } = await github.rest.repos.getCollaboratorPermissionLevel({
...context.repo,
username: author,
Expand All @@ -289,6 +298,21 @@ async function enforceOpenLimit({ github, context, core, dryRun }) {
const reopened = context.payload.action === "reopened";
if (reopened && context.payload.sender.login.toLowerCase() !== author.toLowerCase()) return;

if (denounced.has(author.toLowerCase())) {
if (dryRun) {
core.notice(`Dry run. PR #${pr.number} would close: ${author} is denounced.`);
return;
}
await closeWithComment(
github,
context,
pr.number,
`Closing: ${author} is banned from contributing here, so this PR will not be reviewed. See [bans](${guideLink(context, "bans")}).`,
);
core.info(`PR #${pr.number}: closed, ${author} is denounced.`);
return;
}

const q = `repo:${context.repo.owner}/${context.repo.repo} is:pr is:open author:${author} sort:created-asc`;
const { search } = await read(github, AUTHOR_OPEN_PRS_QUERY, { q });
// A new PR counts only the older ones, so two opened together cannot close each other.
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -591,7 +591,7 @@ jobs:
name: Mobile Native Static Analysis
needs: changes
if: ${{ !cancelled() && needs.changes.outputs.mobile_native != 'false' }}
runs-on: blacksmith-6vcpu-macos-26
runs-on: blacksmith-6vcpu-macos-27
timeout-minutes: 10
steps:
- name: Checkout
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/desktop-macos-preview-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,7 @@ jobs:
rust_target: aarch64-apple-darwin
resource_key: darwin-arm64
cli_archive: false
untrusted_bundle: true

# Release assets download without a GitHub account, unlike workflow
# artifacts. All preview DMGs live on one rolling prerelease tagged
Expand Down
35 changes: 34 additions & 1 deletion .github/workflows/issue-vouch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,14 @@ jobs:
ref: context.payload.repository.default_branch,
});
const statusByUser = new Map();
const listedBothWays = new Set();
for (const raw of Buffer.from(file.content, "base64").toString("utf8").split("\n")) {
const match = /^(-?)github:(\S+)/.exec(raw.trim());
if (match) statusByUser.set(match[2].toLowerCase(), match[1] ? "denounced" : "vouched");
if (!match) continue;
const login = match[2].toLowerCase();
const status = match[1] ? "denounced" : "vouched";
if (statusByUser.has(login) && statusByUser.get(login) !== status) listedBothWays.add(login);
statusByUser.set(login, status);
}

const issues =
Expand Down Expand Up @@ -74,4 +79,32 @@ jobs:
await github.rest.issues.addLabels({ owner, repo, issue_number: issue.number, labels: [next] });
core.info(`Issue #${issue.number} (${issue.user.login}): ${status} -> ${next}`);
}

// Only a newly opened issue is closed. One filed before its author was denounced
// may already have a fix on the way, so the sweep leaves those to maintainers.
// Someone else reopening it is a maintainer keeping it open.
const reopenedByOther =
context.payload.action === "reopened" &&
context.payload.sender.login.toLowerCase() !== issue.user.login.toLowerCase();
// The PR rules refuse a list that names a login both ways, so nothing closes for one here.
const trusted =
issue.user.type === "Bot" ||
["OWNER", "MEMBER", "COLLABORATOR"].includes(issue.author_association) ||
listedBothWays.has(issue.user.login.toLowerCase());
if (status === "denounced" && context.eventName === "issues" && !reopenedByOther && !trusted) {
await github.rest.issues.createComment({
owner,
repo,
issue_number: issue.number,
body: `Closing: ${issue.user.login} is banned from contributing here, so this issue will not be triaged. See [bans](https://github.com/${owner}/${repo}/blob/main/CONTRIBUTING.md#bans).`,
});
await github.rest.issues.update({
owner,
repo,
issue_number: issue.number,
state: "closed",
state_reason: "not_planned",
});
core.info(`Issue #${issue.number}: closed, ${issue.user.login} is denounced.`);
}
}
2 changes: 1 addition & 1 deletion .github/workflows/mobile-dev-client.yml
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ jobs:
ios:
name: iOS simulator
if: github.repository == 'pingdotgg/t3code' && (github.event_name != 'workflow_dispatch' || inputs.platform == 'ios')
runs-on: blacksmith-12vcpu-macos-26
runs-on: blacksmith-12vcpu-macos-27
timeout-minutes: 60
concurrency:
group: mobile-dev-client-ios-${{ github.event_name == 'pull_request' && github.event.pull_request.number || inputs.fingerprint || github.sha }}
Expand Down
10 changes: 3 additions & 7 deletions .github/workflows/mobile-eas-production.yml
Original file line number Diff line number Diff line change
Expand Up @@ -680,8 +680,8 @@ jobs:
echo ":rocket: android: submitted and recorded \`$BUILD_TAG\`" >> "$GITHUB_STEP_SUMMARY"

# Off unless the MOBILE_IOS_LOCAL_BUILDS repository variable is `true`; the
# production job only sets ios_build then. Store binaries need the final
# Xcode 27.1; MOBILE_IOS_ALLOW_XCODE_RC=true accepts the release candidate.
# production job only sets ios_build then. Xcode 27.1 matches the EAS build
# image in eas.json.
# No sticky disk: it mounts ext4 and only works on Linux runners.
ios:
name: iOS store build
Expand All @@ -701,7 +701,6 @@ jobs:
EXPO_TOKEN: ${{ secrets.EXPO_PRODUCTION_TOKEN }}
PROFILE: ${{ needs.production.outputs.ios_profile }}
BUILD_TAG: mobile-ios-build/${{ needs.production.outputs.ios_profile }}/${{ needs.production.outputs.ios_version }}/${{ needs.production.outputs.ios_fingerprint }}
ALLOW_XCODE_RC: ${{ vars.MOBILE_IOS_ALLOW_XCODE_RC == 'true' }}
steps:
- name: Checkout
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
Expand Down Expand Up @@ -739,12 +738,9 @@ jobs:
if: steps.record.outputs.built != 'true'
run: |
xcode=/Applications/Xcode_27.1.app
if [ ! -d "$xcode" ] && [ "$ALLOW_XCODE_RC" = "true" ]; then
xcode=/Applications/Xcode_27.1_Release_Candidate.app
fi
if [ ! -d "$xcode" ]; then
ls -d /Applications/Xcode*.app
echo "::error::Xcode 27.1 (final) is not on this runner. Set the MOBILE_IOS_ALLOW_XCODE_RC repository variable to true to build store binaries with the release candidate."
echo "::error::Xcode 27.1 is not on this runner."
exit 1
fi
sudo xcode-select -s "$xcode/Contents/Developer"
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/mobile-showcase-screenshots.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ jobs:
ios:
name: iPhone, iPhone Duo, and iPad 13
if: inputs.platform == 'all' || inputs.platform == 'ios'
runs-on: blacksmith-12vcpu-macos-26
runs-on: blacksmith-12vcpu-macos-27
# Capturing every palette multiplies the device matrix by six, and only the
# one native build is shared between them.
timeout-minutes: ${{ inputs.theme == 'all' && 300 || 60 }}
Expand Down
15 changes: 15 additions & 0 deletions .github/workflows/release-desktop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,12 @@ on:
required: false
default: false
type: boolean
# Whether the JS bundle came from a pull request. This job holds the
# signing secrets, so packaging then skips every step that runs the bundle.
untrusted_bundle:
required: false
default: false
type: boolean
# A runner of the target's own platform and architecture, for a `runner`
# that cannot execute the target. The build job skips everything that
# runs the packaged binaries, and a second job runs it there.
Expand Down Expand Up @@ -134,6 +140,14 @@ jobs:
T3CODE_CLERK_CLI_OAUTH_CLIENT_ID: ${{ inputs.clerk_cli_oauth_client_id }}
T3CODE_RELAY_URL: ${{ inputs.relay_url }}
steps:
# The launch check and the CLI archive smoke test both run the bundle.
- name: Reject running an untrusted bundle
if: inputs.untrusted_bundle && (inputs.launch_check || inputs.cli_archive)
shell: bash
run: |
echo "::error::untrusted_bundle cannot be combined with launch_check or cli_archive, which run the bundle."
exit 1

# This repository is public, so Git needs no credentials. checkout's
# credential cleanup runs submodule foreach even with submodules disabled,
# which fails on the orphaned gitlinks in our vendored .repos tree.
Expand Down Expand Up @@ -573,6 +587,7 @@ jobs:
pnpm_config_prefer_offline: "true"
T3CODE_DESKTOP_REUSE_RESOURCE_MONITOR: true
T3CODE_DESKTOP_REUSE_LINUX_CAPTURE_HELPERS: ${{ steps.capture_helper_cache.outputs.cache-hit == 'true' }}
T3CODE_DESKTOP_UNTRUSTED_BUNDLE: ${{ inputs.untrusted_bundle }}
CSC_LINK: ${{ secrets.CSC_LINK }}
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }}
Expand Down
32 changes: 5 additions & 27 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -903,34 +903,12 @@ jobs:
fi

# electron-updater reads one manifest per platform and channel and picks
# the file entry whose name carries the running arch, so the per-arch
# manifests the build jobs wrote are merged back into that one file.
- name: Merge macOS updater manifests
# the file entry whose name carries the running arch. Require every
# platform's two build jobs to have produced matching metadata before
# merging it, so a successful release can never strand one architecture.
- name: Merge desktop updater manifests
if: needs.preflight.outputs.release_channel != 'preview'
run: |
shopt -s nullglob
for x64_manifest in release-assets/*-mac-x64.yml; do
arm64_manifest="${x64_manifest%-x64.yml}.yml"
if [[ -f "$arm64_manifest" ]]; then
node scripts/merge-update-manifests.ts --platform mac "$arm64_manifest" "$x64_manifest"
rm -f "$x64_manifest"
fi
done

- name: Merge Windows updater manifests
if: needs.preflight.outputs.release_channel != 'preview'
run: |
shopt -s nullglob
for x64_manifest in release-assets/*-win-x64.yml; do
arm64_manifest="${x64_manifest%-x64.yml}-arm64.yml"
merged_manifest="${x64_manifest%-win-x64.yml}.yml"
if [[ -f "$arm64_manifest" ]]; then
node scripts/merge-update-manifests.ts --platform win "$x64_manifest" "$arm64_manifest" "$merged_manifest"
rm -f "$x64_manifest" "$arm64_manifest"
else
mv "$x64_manifest" "$merged_manifest"
fi
done
run: node scripts/merge-release-update-manifests.ts release-assets

# Updater manifests and blockmaps are what electron-updater consumes.
# They are only listed for channels an updater is meant to follow.
Expand Down
3 changes: 3 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,9 @@ the open PR limit.
- If you make our lives harder as reviewers and maintainers, you will be banned. Examples are repeated
pings, a fight over a closure, and a second account to get around a limit.

A banned account is denounced in [.github/VOUCHED.td](.github/VOUCHED.td). Any issue or PR it opens
is closed when it is opened.

<a id="closure-and-reconsideration"></a>

## When your PR is closed
Expand Down
4 changes: 4 additions & 0 deletions apps/desktop/scripts/ensure-electron-runtime.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,10 @@ export function ensureElectronRuntime() {
return electronPath;
}

export function setup() {
ensureElectronRuntime();
}

// `file://${argv[1]}` never matches on Windows (drive letters need `file:///C:/`).
if (process.argv[1] && NodeURL.pathToFileURL(process.argv[1]).href === import.meta.url) {
const electronPath = ensureElectronRuntime();
Expand Down
Loading