Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
692 commits
Select commit Hold shift + click to select a range
ee2cddf
chore(web): upgrade @pierre/diffs to 1.7.0-beta.4 and drop patched fi…
juliusmarminge Nov 14, 2026
c62c764
fix(server): keep Vietnamese words readable in scratch folder names (…
epistex-dev Nov 14, 2026
3808e2d
fix(client-runtime): a line of inline triple-backtick code no longer …
MarcoDotIO Nov 14, 2026
62405fc
fix(web): preserve thread identity across composer pastes (#30583)
ElliotDrel Nov 14, 2026
fb915ca
fix(opencode): pages a Code Mode script publishes now show inline (#3…
DavidPerezA12 Nov 14, 2026
77c9e70
fix(cursor): preserve recognized transport failure diagnostics (#30631)
trevoedwards Nov 14, 2026
26bf047
fix(client-runtime): a disconnected machine's scratch folder no longe…
tiliakoos Nov 14, 2026
635ea82
fix(mobile): iOS tab bar no longer covers a thread opened from the Us…
juliusmarminge Nov 14, 2026
1c01db0
fix(cursor): stream Task subagent work into child threads live (#30539)
humbertogontijo Nov 14, 2026
9ca6622
fix(web): app loads in browsers without URL.canParse or URL.parse (#3…
juliusmarminge Nov 14, 2026
a68c367
fix(server): preserve the crash recovery budget across restarts (#25603)
maria-rcks Nov 14, 2026
fa864bf
fix(server): Claude goals no longer re-prompt while a delegated task …
georgenijo Nov 14, 2026
6b9d90f
fix(codex): preserve terminal connection failure categories (#30639)
trevoedwards Nov 14, 2026
5bd2d0c
fix(client-runtime): derive MCP download names before URI suffixes (#…
Jo2234 Nov 14, 2026
abc0fde
fix(desktop): providers are found after a failed shell probe without …
nabettu Nov 14, 2026
e82050b
feat(themes): theme CSS can hold 50,000 characters (#36656)
pouyarezvani Nov 15, 2026
2b6c14b
fix(web): diff file Open and Reveal reach a file whose name has a bac…
only21mil Nov 15, 2026
b64eebb
fix(release): enforce packaged Linux glibc requirements (#30827)
voltcrash Nov 15, 2026
3a87ca8
fix(client-runtime): tool output no longer rounds integers beyond 2^5…
geezoria Nov 15, 2026
1d4765b
fix(gitlab): remove reactions beyond the first award page (#30700)
Jo2234 Nov 15, 2026
0bdf566
fix(server): let Expo decide EAS Simulator access (#29490)
hirbod Nov 15, 2026
3883ed5
perf(azure-devops): opening a pull request no longer reads it twice (…
amv146 Nov 15, 2026
c0561c5
fix(shared): the SQLite reader pool comes back after a failed start (…
navidnadali Nov 15, 2026
33f8c5d
fix(web): keep history-placed guest messages out of the footer (#30718)
Jo2234 Nov 15, 2026
1ba9347
fix(shared): keep Windows path separators beside ampersands (#36977)
tanav29 Nov 15, 2026
ca29ff1
fix(cli): keep log warnings out of JSON output (#30898)
voltcrash Nov 15, 2026
6c7a87c
fix(web,mobile): a late MCP app teardown no longer closes the app tha…
seth-dixon Nov 15, 2026
47e24f6
fix(server): Grok usage counts turns from resumed sessions (#30694)
saphid Nov 15, 2026
2b7ea1b
test(desktop): wait for the published PATH after a fallback-shell ret…
juliusmarminge Nov 15, 2026
6e0cbb3
fix(server): checkpoint restore reverts edits inside submodules (#30829)
muhammad-auon-marham Nov 15, 2026
3e17618
perf(server): delegated tasks start and finish without reading the wh…
t3dotgg Nov 15, 2026
b732f64
fix(pi): resume attached sessions without reloading extensions (#21512)
juliusmarminge Nov 15, 2026
5f29d87
fix(provider-acp): a cancel no longer overtakes the prompt it cancels…
navidnadali Nov 15, 2026
f5ca0f9
fix(server): wake GitLab MR watches when a rebase is required (#30312)
tcrapts Nov 15, 2026
910d459
fix(server): drain queued native child continuations (#21461)
juliusmarminge Nov 15, 2026
2b7fc89
fix(web): a send that finishes after you leave its thread no longer b…
Isaac-b-ux Nov 15, 2026
dae8d6f
fix(mobile): Android menus opened over the keyboard close when it hid…
Onkarj012 Nov 15, 2026
ec844a3
fix(client-runtime): omit machine labels from relay spans (#30940)
Mr-Neutr0n Nov 15, 2026
f7b0b3c
fix(server): MCP list tools clamp an oversized limit instead of faili…
MarcoDotIO Nov 15, 2026
a6d7695
perf(web): collapse all no longer remounts the diff viewer (#36995)
juliusmarminge Nov 15, 2026
92605bf
fix(server): skip Codex page context in imported titles (#31090)
flexi767 Nov 15, 2026
fe59fa4
fix(web): renaming a sidebar thread no longer shifts the row or cover…
shlokkhemani Nov 15, 2026
5b818b3
perf(server): resolve model aliases in one memoized traversal (#31197)
hieu-lee Nov 15, 2026
4cb8da6
perf(relay): reconcile multiline env values without rescanning prefix…
hieu-lee Nov 15, 2026
f6fd89b
fix(server): terminals start a $SHELL whose path contains a space (#3…
MarcoDotIO Nov 15, 2026
2cc4b48
fix(desktop): a waiting update is no longer re-announced on every pol…
onlydole Nov 15, 2026
bbda0c1
fix(acp): replace and remove identified plans across turns (#36978)
tanav29 Nov 15, 2026
96ffe45
fix(server): streamed replies keep updating after a line that starts …
MarcoDotIO Nov 15, 2026
d3217c7
fix(provider-cursor): advertise manual compaction (#31203)
defyrlt Nov 15, 2026
01c8e59
fix(web): preserve published theme IDs during alias lookup (#31318)
Jo2234 Nov 15, 2026
d022d3b
fix(mobile): iOS image viewer pages and dismisses after slow opens (#…
juliusmarminge Nov 15, 2026
bb33fc3
test(server): stop Git auto-maintenance racing the shared repo templa…
juliusmarminge Nov 15, 2026
703810f
fix(server): Open in and Reveal open ~/ file links from projects outs…
MarcoDotIO Nov 15, 2026
6a8f022
perf(server): Windows terminals report exit 0.9 s sooner (PowerShell …
Pyseph Nov 15, 2026
3c8f3f2
fix(web): up-arrow recall keeps thread and machine mentions (#31314)
carlosricojr Nov 15, 2026
0983ab3
fix(web): choosing a provider in the model picker no longer raises th…
vytorrennan Nov 15, 2026
0b30831
fix(cursor): resume stopped turns with Cursor's native resume action …
Yash-Singh1 Nov 15, 2026
9cd5733
fix(web): an unreachable environment no longer hides pull requests fr…
johns1x Nov 15, 2026
4dec8cf
fix(web): honor right panel state in custom shortcuts (#34081)
cesarbahena Nov 15, 2026
cef95b6
fix(shared): decode URI paths in ghq clone folders (#37004)
Lucenx9 Nov 15, 2026
6f8144b
fix(web): overlapping image pastes keep their prompt order (#37010)
StiensWout Nov 15, 2026
48a383c
fix(web): show failed desktop downloads in retry tooltips (#31324)
Jo2234 Nov 15, 2026
a96bb81
perf(right panel): normalize pr tab target once (#37002)
rgodha24 Nov 15, 2026
989c1b5
fix(marketing): prevent harness-grid content overflow on mobile devic…
SimonDdungu Nov 15, 2026
f5dd9c1
fix(mobile): diagonal thread-row swipes open on Android instead of sc…
juliusmarminge Nov 15, 2026
a31fab9
fix(web): focus side-chat composer when selecting its tab (#31360)
joeyvandijk Nov 15, 2026
4adb946
fix(claude): show monitor commands in background work details (#37019)
Yash-Singh1 Nov 15, 2026
617c6c7
fix(web): thread chips in the composer can no longer be dragged out a…
NawfalAhmed Nov 15, 2026
d6c1d17
fix(web): show drag preview inside sidebar search results (#37022)
Yash-Singh1 Nov 15, 2026
1c8143c
perf(desktop): the remote editor list appears in 62 ms instead of 2.5…
Pyseph Nov 15, 2026
252b2c7
fix(codex): crashed handlers and transport workers no longer hang sil…
iXab3r Nov 15, 2026
fbdfe2e
fix(mobile): an answered question no longer shows its raw item JSON (…
Jacksondr5 Nov 15, 2026
a62bc81
perf(server): message ordinals are read through an index, not a scan …
navidnadali Nov 15, 2026
47f2e91
perf(web): batch middle truncate fits (#37001)
rgodha24 Nov 15, 2026
dd3d4a4
fix(web): prevent stray highlights when selecting shell commands (#37…
Yash-Singh1 Nov 15, 2026
c1a7ce3
fix(desktop): Check for Updates says when an update is available (#31…
juliusmarminge Nov 15, 2026
d23f479
fix(web): right panel shortcuts work while a side chat has focus (#32…
juliusmarminge Nov 15, 2026
88621ac
feat(github): issues and PRs from denounced authors close when opened…
maria-rcks Nov 15, 2026
2c5013d
fix(server): threads show the new branch's pull request after a branc…
juliusmarminge Nov 15, 2026
8be0e6c
fix(server): preserve run start time when steering restarts a turn (#…
flamboh Nov 15, 2026
fece893
fix(cli): t3 project add brings back an archived project instead of r…
MarcoDotIO Nov 15, 2026
e1458f2
fix(web): track switch no longer blocked when Local environment is of…
juliusmarminge Nov 15, 2026
ed6cb97
fix(web): reopened composer drafts keep quote spacing and show the ca…
juliusmarminge Nov 15, 2026
dd86dd6
fix(server): SSH device host probe failures say what ssh refused (#31…
ahalekelly Nov 15, 2026
7f6e403
fix(provider-acp): Grok runs complete when a background dev server ke…
juliusmarminge Nov 15, 2026
df15bd4
fix(server): parallel worktree launches no longer leave all but one b…
MarcoDotIO Nov 15, 2026
eb8b1f5
fix(client): avoid worktree setup flash after editing first message (…
aminevg Nov 15, 2026
240fc69
fix(codex): an app-server that exits before initialize reports its ex…
juliusmarminge Nov 15, 2026
bc91203
fix(server): count only newly imported agent threads (#37025)
juliusmarminge Nov 15, 2026
fd985e0
fix(usage): a Claude hub account with an unmeasured window keeps its …
MarcoDotIO Nov 15, 2026
e49d058
fix(server): thread_not_found points agents at linked environments (#…
juliusmarminge Nov 15, 2026
1c86881
perf(web): Expand all folders in the diff file tree no longer rescans…
Pyseph Nov 15, 2026
7a72fe3
fix(server): a send to an idle thread with a queue now waits behind i…
juliusmarminge Nov 15, 2026
bee9eb5
fix(shared): recognize SSH remotes with a single path component (#31781)
darshmahadevia Nov 15, 2026
d93b225
fix(mobile): grouped projects show their own monogram in the picker a…
johns1x Nov 15, 2026
1cec104
fix(shared): file mentions of __init__.py keep their name as the labe…
matyasrathonyi Nov 15, 2026
35b8863
fix(server): delegate_task model refusals name slugs to retry with (#…
juliusmarminge Nov 15, 2026
828200f
fix(server): clearing a terminal that keeps printing no longer hangs …
MarcoDotIO Nov 15, 2026
6615615
fix(shared): preserve Git remote headers after comments (#31788)
darshmahadevia Nov 15, 2026
031ee2d
fix(server): dictionary spellings apply next to Chinese and Japanese …
zedong-peng Nov 15, 2026
9504f65
fix(server): MCP tools no longer advertise non-string enums that Gemi…
juliusmarminge Nov 15, 2026
fb74969
fix(server): re-base worktree launches whose recorded base ref does n…
sgoley Nov 15, 2026
3ee4262
fix(web): expand viewed checkbox click area (#37033)
Yash-Singh1 Nov 15, 2026
def3722
fix(web): Shift+F6 moves from a side chat back to the main chat (#31931)
muunkk Nov 15, 2026
5c9e5c1
fix(server): check out cloned submodules when one submodule clone fai…
juliusmarminge Nov 15, 2026
fa6ecb1
fix(server): MCP send errors say how to continue a finished thread (#…
juliusmarminge Nov 15, 2026
bdf6c6e
fix(server): open WSL-mounted Windows drives directly in File Explore…
spoonkuh Nov 15, 2026
5b5f1bc
fix(server): PR watch wakes quote a bot comment's text, not its HTML …
juliusmarminge Nov 15, 2026
81df733
fix(web): opening a project from the command palette skips settled an…
spoukyii Nov 15, 2026
8ab40cc
fix(web): the PDF preview says "1 / 1 page" for a one-page PDF (#31885)
spoukyii Nov 15, 2026
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
c8bc758
Merge remote-tracking branch 'origin/upstream-sync' into upstream-syn…
D3SOX 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
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.`);
}
}
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
18 changes: 15 additions & 3 deletions apps/desktop/src/app/DesktopApp.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ it.effect.each([false, true])(
const historyStarted = yield* Deferred.make<void>();
const releaseHistory = yield* Deferred.make<void>();
const quitting = yield* Ref.make(false);
const tokenRequested = yield* Deferred.make<void>();
const events: string[] = [];
const record = (event: string) =>
Effect.sync(() => {
Expand Down Expand Up @@ -144,7 +145,7 @@ it.effect.each([false, true])(
configure: Effect.void,
} as PreviewPasskeys.PreviewPasskeys["Service"]),
Effect.provideService(DesktopApplicationMenu.DesktopApplicationMenu, {
configure: Effect.void,
configure: record("menu"),
}),
Effect.provideService(DesktopUpdates.DesktopUpdates, {
configure: Effect.void,
Expand Down Expand Up @@ -222,7 +223,12 @@ it.effect.each([false, true])(
Layer.mock(DesktopClientSettings.DesktopClientSettings, {}),
Layer.mock(DesktopConnectionCatalogStore.DesktopConnectionCatalogStore, {}),
Layer.mock(DesktopIpc.DesktopIpc, {}),
Layer.mock(DesktopLocalEnvironmentAuth.DesktopLocalEnvironmentAuth, {}),
Layer.mock(DesktopLocalEnvironmentAuth.DesktopLocalEnvironmentAuth, {
getBearerToken: record("token").pipe(
Effect.andThen(Deferred.succeed(tokenRequested, undefined)),
Effect.as("token"),
),
}),
Layer.mock(DesktopManagedPolicy.DesktopManagedPolicy, {}),
Layer.succeed(DesktopPrimaryPaste.DesktopPrimaryPaste, { enabled: true }),
Layer.mock(DesktopSshEnvironment.DesktopSshEnvironment, {}),
Expand Down Expand Up @@ -253,7 +259,13 @@ it.effect.each([false, true])(
);
yield* Deferred.await(registrationStarted);
yield* Deferred.await(windowStarted);
assert.deepEqual(events, ["identity", "ready", "identity", "backend", "window"]);
yield* Deferred.await(tokenRequested);
// The backend spawns before menus, and its token is minted without waiting for the renderer.
assert.deepEqual(
events.filter((event) => event !== "token"),
["identity", "ready", "identity", "backend", "menu", "window"],
);
assert.isAbove(events.indexOf("token"), events.indexOf("backend"));
assert.isFalse(yield* Deferred.isDone(registrationStopped));
const shutdown = yield* DesktopShutdown.DesktopShutdown;
yield* shutdown.request;
Expand Down
Loading
Loading