Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
382 commits
Select commit Hold shift + click to select a range
e27e12d
feat(web): add refresh to provider status banners (#24861)
UtkarshUsername Nov 3, 2026
55ea365
fix(server): side chats no longer open with a model switch from the p…
saphid Nov 3, 2026
b7ab02e
fix(web): copied code blocks keep their blank lines in lists, quotes …
saphid Nov 3, 2026
42cf5a1
fix(web): compact model picker row indicators (#26415)
UtkarshUsername Nov 3, 2026
911212b
fix(web): open project picker from boring sidebar's header (#26495)
UtkarshUsername Nov 3, 2026
171f78b
fix(client): project removal counts only listed threads, not side cha…
saphid Nov 3, 2026
68c38b9
fix(opencode): text generation errors explain known provider failures…
saphid Nov 3, 2026
bec3f2d
fix(mobile): multi-file patches show every changed file (#29878)
saphid Nov 3, 2026
e5d0710
fix(server): handoff context names every file of a multi-file patch (…
saphid Nov 3, 2026
e86dc78
fix(server): commits and PR text see changes outside a subfolder proj…
saphid Nov 3, 2026
12ec17c
fix(web): opening a project from the command palette no longer lands …
saphid Nov 3, 2026
3ee5515
fix(web): device host checks show the error without a stack trace (#2…
saphid Nov 3, 2026
3d369d5
feat(web): open full access menu from the new thread context strip (#…
Yash-Singh1 Nov 3, 2026
e53672d
fix(web): long server lists in thread details now page 4 at a time (#…
Bil0000 Nov 3, 2026
115739c
fix(web): keep the project filter menu aligned with its trigger
Yash-Singh1 Nov 3, 2026
30724e2
fix(github): Rebase stack no longer conflicts after a lower layer is …
saphid Nov 3, 2026
abf8998
fix(server): changing a task's wake policy no longer reverts a checkp…
juliusmarminge Nov 3, 2026
a760f37
perf(server): settled PR lookups stop re-spawning git every sweep (#2…
juliusmarminge Nov 3, 2026
4a09502
fix(server): generated commit and PR text ignores git signature outpu…
saphid Nov 3, 2026
ea68f2a
fix(web): picking a branch in a subfolder project keeps the thread in…
saphid Nov 3, 2026
499727d
fix(mobile): close and reopen pull requests from the actions menu (#2…
juliusmarminge Nov 3, 2026
ac10bb4
fix(web): mouse wheel over the thread minimap glides instead of jumpi…
flamboh Nov 3, 2026
7ab237f
fix(server): managed policy covers Kiro (#29915)
juliusmarminge Nov 3, 2026
7681605
fix(server): t3 update installs from the policy's update mirror (#29911)
juliusmarminge Nov 3, 2026
a50fe10
fix(desktop): Ctrl+R on macOS reaches the preview page instead of rel…
saphid Nov 3, 2026
3f48896
fix(server): native forks after an undo no longer copy later turns (#…
saphid Nov 3, 2026
7f17f51
fix(server): idle compaction still runs after a queued message is rem…
saphid Nov 3, 2026
a9468da
fix(server): guests of a forked thread can open files on the messages…
saphid Nov 3, 2026
1a3f76e
fix(evals): resume browser verification after unavailable status (#30…
Yash-Singh1 Nov 3, 2026
bff68fb
fix(shared): saving one source control token no longer drops the othe…
yordis Nov 3, 2026
dd24b37
fix(desktop): a policy that stops startup no longer points at another…
juliusmarminge Nov 3, 2026
15707a8
docs: pin an absolute binary path under a permission cap (#29916)
juliusmarminge Nov 3, 2026
c756eba
fix(mobile): Android follow-up menu shows in full with the keyboard o…
juliusmarminge Nov 3, 2026
7239986
fix(web): deleting the open thread no longer opens a snoozed or settl…
juliusmarminge Nov 3, 2026
31eb1d0
fix(web): closing Settings or Usage no longer jumps back to a quote's…
juliusmarminge Nov 3, 2026
3040f91
fix(server): squash-merged branches no longer offer push & create PR …
juliusmarminge Nov 3, 2026
cf90825
fix(mobile): settings providers show the ACP registry icon (#28135)
juliusmarminge Nov 3, 2026
7b666f3
fix(server): Grok usage limits tell Legacy-mode xAI accounts to switc…
juliusmarminge Nov 3, 2026
58cf69c
fix(usage): label a proxied Claude account by its e-mail, and drop .j…
juliusmarminge Nov 3, 2026
9def583
fix(gitlab): a signed-out default glab host no longer hides other sig…
juliusmarminge Nov 3, 2026
550c5fa
perf(server): prune events the projections already cover (#29806)
juliusmarminge Nov 3, 2026
260297b
fix(server): GPT-6.1 Sol no longer compacts after every tool call on …
maria-rcks Nov 3, 2026
bd48d8c
feat(policy): admins set managed policy from a Group Policy template …
juliusmarminge Nov 3, 2026
2c99914
perf(server): bound streaming recovery reads by active runs (#30357)
Yash-Singh1 Nov 3, 2026
0b5600b
perf(server): read pull request metadata from a lightweight snapshot
Yash-Singh1 Nov 3, 2026
c3c15f7
fix(server): cancelling worktree setup no longer leaves its new branc…
saphid Nov 3, 2026
d1ec71e
feat(mobile): add on-device Android dictation (#26734)
PixPMusic Nov 3, 2026
a104909
feat(server): read usage limit source keys from a secret provider (#2…
yordis Nov 3, 2026
bd3cc5c
feat(device): read the EAS access token from a secret provider (#27763)
yordis Nov 3, 2026
aee76a8
fix(server): route missing read-only queries to readers
Yash-Singh1 Nov 3, 2026
96e887b
perf(server): index delegated recovery candidates (#30359)
Yash-Singh1 Nov 3, 2026
251369d
feat(server,web,mobile,desktop): Copy thread copies a link that opens…
juliusmarminge Nov 3, 2026
b183048
feat(mobile,web): copied thread links open the mobile app (#29815)
juliusmarminge Nov 3, 2026
7c22e24
fix(antigravity): rate-limited turns keep their reset time (#29594)
saphid Nov 3, 2026
da3f972
fix(server): startup no longer hangs on a shell stuck in the kernel (…
AdEx-Partners-DE Nov 3, 2026
ac97602
fix(server): reverting files before the first commit no longer leaves…
Abhishek-B-R Nov 3, 2026
eee9525
fix(server): truncated Claude task output no longer starts with a rep…
Abhishek-B-R Nov 3, 2026
65efae1
fix(shared): relative file links with routing punctuation open as fil…
Abhishek-B-R Nov 3, 2026
7a03a74
fix(server): messages cut by a restart no longer stay marked as strea…
Abhishek-B-R Nov 3, 2026
b6bd84d
fix(server): Antigravity Auto asks instead of approving every request…
parmartejass Nov 3, 2026
a445272
fix(server): Codex threads open in another client are no longer silen…
derektrimm Nov 3, 2026
ef99d3f
fix(server): WSL servers avoid ports already used by Windows (#22962)
tylerjenningsw Nov 3, 2026
d61058d
perf(web): reuse repeated inline skill lookups (#29008)
luke2x Nov 3, 2026
10cd1a5
fix(opencode): expand home-relative executable paths (#29326)
voltcrash Nov 3, 2026
476a99c
fix(server): title regeneration works after a thread's worktree is cl…
saphid Nov 3, 2026
b7add5a
fix(server): dev servers a Codex agent starts show under its thread (…
saphid Nov 3, 2026
8ee7cf9
fix(server): status no longer fetches a remote named after a local tr…
saphid Nov 3, 2026
5bdc2af
fix(server): preview snapshots no longer cut an emoji in half (#29600)
saphid Nov 3, 2026
bbaa535
fix(server): restart notes no longer split an emoji in a long backgro…
saphid Nov 3, 2026
21e4f98
fix(acp): Always allow no longer cancels the turn when an agent only …
MarcoDotIO Nov 3, 2026
9c89424
fix(server): forking a Codex thread archived outside T3 Code no longe…
saphid Nov 3, 2026
acad1d5
perf(shared): stop single-token message search at the best hit (#28930)
hieu-lee Nov 3, 2026
c185d78
fix(preview): a dropped stream withdraws its stale file picker (#29655)
saphid Nov 3, 2026
b156a7d
fix(provider-acp): ACP threads keep receiving events after a rollback…
trevoedwards Nov 3, 2026
2f8de8d
perf(opencode): provider event logs skip per-token reply deltas (#29673)
saphid Nov 3, 2026
300101f
fix(web): open files from Claude and ACP tool-call diffs (#29309)
Jo2234 Nov 3, 2026
04aed8f
fix(server): files tree labels ignored folders inside git submodules …
saphid Nov 3, 2026
eee8ed4
fix(server): server updates reclaim partial database backups left by …
MarcoDotIO Nov 3, 2026
b63adbf
fix(server): PR watch wakes no longer split an emoji in a long commen…
saphid Nov 3, 2026
30f7600
fix(server): pinning a settled thread stamps its return to the active…
saphid Nov 3, 2026
6016aac
fix(server): Claude's commands no longer run Electron apps as Node (#…
u9g Nov 3, 2026
ddca6b1
docs: keybindings guide lists the rightPanelOpen when key (#29677)
saphid Nov 3, 2026
0a86e15
perf(shared): avoid redundant visibility work on status updates (#28965)
hieu-lee Nov 3, 2026
b113eb0
fix(desktop): failed settings saves no longer leave temp files behind…
saphid Nov 3, 2026
6d80df5
fix(acp): a final agent message without a trailing newline is no long…
saphid Nov 3, 2026
594532a
fix(server): terminal history keeps output after an unterminated OSC …
saphid Nov 3, 2026
df2dfde
fix(cli): t3 up's pairing hint keeps --base-dir (#29684)
saphid Nov 3, 2026
1b6336d
fix(shared): preserve omitted components in zero-major caret ranges (…
Jo2234 Nov 3, 2026
4f58294
fix(server): thread titles use linked PR context when the URL is foll…
saphid Nov 3, 2026
2b4d6a3
fix(source-control): remotes like github.com:owner/repo reach their h…
MarcoDotIO Nov 3, 2026
663cd08
fix(server): terminal history keeps text with C1 characters (#29649)
saphid Nov 3, 2026
ce89cd1
fix(server): worktree handoff follows the project's start-from-origin…
saphid Nov 3, 2026
4461b84
fix(server): review keeps tracked changes when untracked files overfl…
saphid Nov 3, 2026
e91595b
fix(server): browser setup advice names the server's T3 home (#29646)
saphid Nov 3, 2026
48e73f6
fix: honor generic MIME aliases in attachment previews (#29360)
Jo2234 Nov 3, 2026
ee265cc
fix(client-runtime): terminals fit their pane again after a reconnect…
saphid Nov 3, 2026
c64117d
fix(server): Run now on a scheduled task says why it was refused (#29…
saphid Nov 3, 2026
8ca8fdd
fix(server): a preview_open whose first load fails no longer leaves a…
saphid Nov 3, 2026
47057a3
fix(cursor): Cursor text generation names usage-limit failures (#29748)
saphid Nov 3, 2026
54223c3
fix(server): review diffs keep working with untracked files outside t…
saphid Nov 3, 2026
136fe43
fix(opencode): nested custom commands like /git/commit run as command…
saphid Nov 3, 2026
8bfe94a
fix(source-control): renamed files in GitHub, GitLab and Azure DevOps…
saphid Nov 3, 2026
0992f51
fix(opencode): a command that exits non-zero is stored as failed, not…
saphid Nov 3, 2026
ddaf999
fix(server): linked environments pick up the other machine's new name…
saphid Nov 3, 2026
b8fb45e
fix(server): document text skips tracked deletions and field codes (#…
saphid Nov 3, 2026
cedcc31
fix(server): OTLP export settings survive a saved token streaming mod…
saphid Nov 3, 2026
eb30336
fix(server): Word text boxes are no longer extracted twice for agents…
saphid Nov 3, 2026
9f7b2ee
fix(server): new projects are created when core.safecrlf refuses LF f…
saphid Nov 3, 2026
228e289
fix(web): drafts saved by older versions load instead of being wiped …
saphid Nov 3, 2026
9d7f771
fix(server): Antigravity text generation shows sign-in and setup erro…
saphid Nov 3, 2026
92388d5
fix(web): picking a custom model named like a Codex alias keeps that …
saphid Nov 3, 2026
940afd6
fix(server): turn checkpoints keep LF files when core.safecrlf is tru…
saphid Nov 3, 2026
31564de
fix(shared): find in thread matches a word typed with a curly apostro…
saphid Nov 3, 2026
2f2e81f
fix(server): review rows for nested repositories load in large diffs …
saphid Nov 3, 2026
0a41bbc
fix(server): t3_worktree_list lists refs after storage cleanup remove…
saphid Nov 3, 2026
2ad6712
fix(provider-core): text generation context cuts no longer split an e…
saphid Nov 3, 2026
7767a95
fix(server): html_preview no longer splits an emoji in a long console…
saphid Nov 3, 2026
0673e7e
fix(server): diffs keep submodule changes under diff.submodule=log (#…
saphid Nov 3, 2026
5e53057
fix(opencode): OpenCode 2 titles for image messages skip images the s…
saphid Nov 3, 2026
aeaf363
fix(server): orchestrator_capabilities no longer offers providers the…
saphid Nov 3, 2026
77b948e
fix(web): big terminal selections no longer break sending (#29804)
saphid Nov 3, 2026
fcad9de
test(web): file editor dismissal test waits for the editor to render …
juliusmarminge Nov 3, 2026
fb8e6d8
test(web): worked-for heading test clicks once the list is revealed (…
juliusmarminge Nov 3, 2026
19a2bad
fix(azure-devops): legacy DefaultCollection pull request URLs can be …
saphid Nov 3, 2026
8704966
fix(shared): preview_open reports about: and mailto: as unsupported i…
saphid Nov 3, 2026
67861fd
fix(server): delegated threads no longer share one provider event log…
onlydole Nov 3, 2026
6049196
fix(server): a queued provider switch no longer ends background work …
juliusmarminge Nov 3, 2026
8198b2e
fix(kiro): slow kiro-cli starts no longer show Kiro as unavailable (#…
saphid Nov 3, 2026
480eb8d
fix(client): mark unread sticks on a thread reopened within ten minut…
saphid Nov 3, 2026
d7ee7b3
fix(pi): extension errors name folder extensions instead of "index" (…
saphid Nov 3, 2026
40aba09
fix(github): Enterprise Server pull request URLs can be pasted to che…
saphid Nov 3, 2026
b7fcb7c
fix(server): a peer refusing one call no longer marks its link as fai…
saphid Nov 3, 2026
0bd447e
perf(server): Claude skill discovery resolves each repository root on…
onlydole Nov 3, 2026
99ccd47
fix(server): t3 service uninstall leaves another T3 home's service al…
saphid Nov 3, 2026
b95ff11
fix(server): PR watches wake again when a push leaves the branch conf…
saphid Nov 3, 2026
1f87f64
fix(muse): the thread error banner no longer shows unredacted failure…
saphid Nov 3, 2026
655977a
fix(server): provider settings changed mid-refresh no longer revert t…
saphid Nov 3, 2026
e1cd7f0
fix(shared): accept whitespace after engine range operators (#29730)
romil-bijarnia Nov 3, 2026
93b0db1
perf(server): stop tracing per-event live coalescer work (#29758)
onlydole Nov 3, 2026
ece461e
test(desktop): the Windows shell kill test waits for each spawn befor…
maria-rcks Nov 3, 2026
7f92cb0
fix(shared): ignore unsupported command output control parameters (#2…
romil-bijarnia Nov 3, 2026
2b37449
fix(cli): t3 update no longer says a service awaiting restart runs th…
saphid Nov 3, 2026
76f2966
fix(mcp): accept CR and mixed line endings in response streams (#29727)
romil-bijarnia Nov 3, 2026
350dcf4
fix(server): preview tabs that fail during setup no longer leave thei…
saphid Nov 3, 2026
86b7dc6
fix(provider-core): long subagent titles no longer end in a broken ch…
saphid Nov 3, 2026
16ca47b
fix(shared): ignore unsupported command output erase modes (#29737)
romil-bijarnia Nov 3, 2026
741bcae
fix(server): a failed scheduled run shows its error without a stack t…
saphid Nov 3, 2026
ebfca09
perf(web): long threads stream with 70% less work-row derivation (#29…
Entrpi Nov 3, 2026
5c72faa
fix(pi): send SIGTERM before closing Pi's stdin on teardown (#30025)
yaacovcorcos Nov 3, 2026
b6307ee
fix(server): clean up child worktrees after their parent settles (#30…
voltcrash Nov 3, 2026
7fd859a
fix(server): Claude context meter shows the window for models outside…
hahhforest Nov 3, 2026
ece6322
fix(server): quitting no longer waits on an unreachable telemetry end…
levelorbit Nov 3, 2026
dd8c122
fix(client): keep snoozed failures hidden without completion times (#…
voltcrash Nov 3, 2026
ffa39e2
perf(server): PR sync stops reading pull requests closed over a day a…
advaitpaliwal Nov 3, 2026
ddd36a5
fix(acp): file changes show the patch of every diff in a tool call (#…
Abhishek-B-R Nov 3, 2026
d075bed
fix(server): Antigravity sign-in no longer blames the network while t…
wenshen18643 Nov 3, 2026
4a23e9e
fix(relay): read migrations in checkout paths with spaces (#30080)
domvox Nov 3, 2026
bf046e3
fix(cli): validate npm runtime before caching it (#30099)
voltcrash Nov 3, 2026
b9d7239
fix(server): SSH device host no longer reconnects on a single slow he…
gyurix Nov 3, 2026
8bc344b
fix(server): read continued core.bare values during onboarding (#30174)
imharjot Nov 3, 2026
6ea23bd
fix(server): published repos fall back to HTTPS when SSH is refused (…
saphid Nov 3, 2026
5ad00e9
fix(opencode): fail stalled event subscriptions promptly (#30201)
voltcrash Nov 3, 2026
c609500
fix(server): a link card the user moved past no longer blocks auto-se…
saphid Nov 3, 2026
2863ede
fix(server): deleting a thread also removes its agent preview recordi…
saphid Nov 3, 2026
e1cf10b
fix(server): review guides no longer fail on the repository's checkou…
saphid Nov 3, 2026
ad4bb6d
fix(desktop): bump Electron to 44.10.1 for October Chromium security …
valuin Nov 3, 2026
57ca5cc
chore(repos): sync reference repos from shallow clones (#30472)
juliusmarminge Nov 4, 2026
43bf0ba
chore(repos): sync Effect 4.1.2 and Alchemy beta.85, rename effect-sm…
juliusmarminge Nov 4, 2026
66e6217
Revert "fix(web): terminal controls no longer cover the first line" (…
juliusmarminge Nov 4, 2026
322f654
feat(web): show a newly created pairing link without expanding the cl…
juliusmarminge Nov 4, 2026
5e6c4d9
refactor(android): every header goes through AppBar, so the filter st…
juliusmarminge Nov 4, 2026
3caec1a
refactor(mobile): one inspector column, declared with <Inspector> (#2…
juliusmarminge Nov 4, 2026
29db71b
refactor(mobile): a pane's bar draws its own sidebar toggle (#27086)
juliusmarminge Nov 4, 2026
d1b9b23
refactor(mobile): Android's sidebar is the Home route in the sidebar …
juliusmarminge Nov 4, 2026
6df3584
feat(mobile): medium windows float the sidebar over the page (#27088)
juliusmarminge Nov 4, 2026
c6114b0
feat(mobile): without an inspector column, the inspector is a sheet (…
juliusmarminge Nov 4, 2026
0444aae
docs(mobile): the five layers of the mobile layout, with x-ray diagra…
juliusmarminge Nov 4, 2026
7448ad8
refactor(mobile): the inspector's bar is its pane's AppBar (#27205)
juliusmarminge Nov 4, 2026
e3a97f5
fix(mobile): the iPad inspector hides the sidebar where the page woul…
juliusmarminge Nov 4, 2026
e04464d
fix(mobile): iPad workspace tabs live in the sidebar and leave with i…
juliusmarminge Nov 4, 2026
9aa80a0
fix(mobile): the drawer surface is only for a sidebar beside a page (…
juliusmarminge Nov 4, 2026
dd69b31
feat(server): list Claude models reported by Claude Code (#30511)
juliusmarminge Nov 4, 2026
87f3d93
fix(relay): production deploys no longer hang while computing the pla…
juliusmarminge Nov 4, 2026
a185dd9
fix(web): give dialog titles a readable line height (#30527)
Yash-Singh1 Nov 4, 2026
d51bc58
fix(tools): show images from MCP and OpenCode outputs (#30389)
Yash-Singh1 Nov 4, 2026
7ccd02c
fix(mobile): smoother Settings and composer transitions on wide Andro…
juliusmarminge Nov 4, 2026
eb1db29
fix(mobile): the Android split slides as one strip, so sidebar and de…
juliusmarminge Nov 4, 2026
737afe2
fix(server): retry unstarted runs after recovery (#30560)
Yash-Singh1 Nov 4, 2026
b3011e9
perf(server): narrow agent awareness startup reads (#30561)
Yash-Singh1 Nov 4, 2026
059804d
fix(web): validate terminal links against filesystem metadata (#30526)
Yash-Singh1 Nov 4, 2026
647bd14
fix(server): avoid message ordering scans during recovery and settlem…
Yash-Singh1 Nov 4, 2026
567a105
fix(client-runtime): expire missing file metadata per thread (#30606)
Yash-Singh1 Nov 4, 2026
3368dd7
fix(web): align usage table padding and thread status rows
Yash-Singh1 Nov 4, 2026
e68e19d
fix(mobile): every Android content pane gets its rounded card from Sc…
juliusmarminge Nov 4, 2026
bb4afa5
chore(release): prepare v0.1.7
t3-code-bot[bot] Nov 4, 2026
8b44f42
fix(web): load selected diff metadata before file patches (#30567)
Yash-Singh1 Nov 4, 2026
7f782b4
test(evals): measure how agents get secrets only the user has (#30256)
gabrielelpidio Nov 4, 2026
9e85538
feat(server): agents ask for secrets through request_secret instead o…
gabrielelpidio Nov 4, 2026
dd5f98e
fix(relay): use released drizzle rc.5 and fail installs on unmet peer…
juliusmarminge Nov 4, 2026
95e53a5
build: typecheck with tsrs and Effect's rules through @effect/tsgo (#…
juliusmarminge Nov 4, 2026
14e8f39
refactor: replace jose with effect/jose (#30474)
juliusmarminge Nov 4, 2026
fb99a5e
refactor: move HMAC, key, and random work to effect/crypto (#30501)
juliusmarminge Nov 4, 2026
16fc3cc
refactor(server): sign server tokens through PayloadSigner (#30523)
juliusmarminge Nov 4, 2026
33ba7bf
refactor: hold relay signing keys in EnvironmentSigningKey and CloudM…
juliusmarminge Nov 4, 2026
a07be97
refactor(client-runtime): share DPoP proof creation across web and mo…
juliusmarminge Nov 4, 2026
8ab024f
fix(client-runtime): a thread keeps syncing after a stream defect (#3…
juliusmarminge Nov 4, 2026
62db662
test(server): AgentSessionScanner blocked-repo test no longer races t…
juliusmarminge Nov 4, 2026
7f6f47b
test(web): PDF preview tests wait on pdf.js loads and stop timing out…
juliusmarminge Nov 4, 2026
df70f50
docs: scope managed-policy LAN note to old background services (#30900)
b2bvic Nov 4, 2026
a21d788
feat(server): render MCP Apps from Claude tool calls (#29803)
juliusmarminge Nov 4, 2026
4b87a45
build: run Effect rules on mobile and lock in clean suggestion rules …
juliusmarminge Nov 4, 2026
299f0db
fix(mobile): keep iOS composer empty after sending an autocorrected w…
shivamhwp Nov 5, 2026
2ef6435
fix(server): idle agent tabs free a slot when the server's 32-tab bro…
shivamhwp Nov 5, 2026
c1f91b5
fix(web): keep message navigation visible on touch when there is room…
shivamhwp Nov 5, 2026
c94ad22
fix(mobile): pinch wide images from anywhere in the Android viewer (#…
shivamhwp Nov 5, 2026
cda8842
fix(mobile): preserve autocorrect in custom question answers (#30744)
shivamhwp Nov 5, 2026
b3041a8
fix(web): show Setting up during worktree setup (#28832)
shivamhwp Nov 5, 2026
c9d29e0
fix(mobile): keep iOS thread menus short enough for drag selection (#…
shivamhwp Nov 5, 2026
199cb5b
fix(web): show the comparison base beside Changes totals (#30085)
shivamhwp Nov 5, 2026
b28bb8f
fix(mobile): use H.264 for iOS previews and keep Close reachable (#28…
shivamhwp Nov 5, 2026
70738cb
fix(mobile): iOS image previews open without waiting for the gallery …
shivamhwp Nov 5, 2026
707dcda
feat: optionally clone repos into ghq-style <host>/<owner>/<repo> fol…
shivamhwp Nov 5, 2026
8a65c00
fix(devices): explain Windows SSH host failures (#30941)
shivamhwp Nov 5, 2026
af54fe2
fix(web): make styled composer Markdown markers editable (#30421)
shivamhwp Nov 5, 2026
e4e3657
fix(mobile): configure another Claude account from Providers (#28928)
shivamhwp Nov 5, 2026
7384cf2
fix(web,mobile): save pull request description checkbox changes (#30704)
shivamhwp Nov 5, 2026
b9522c8
fix(client): a big server config on a slow link no longer drops the c…
shivamhwp Nov 5, 2026
c192c43
fix(server): restart T3 Connect's tunnel client when Cloudflare drops…
shivamhwp Nov 5, 2026
754e1d1
fix(mobile): compact stale Claude threads before sending (#27935)
shivamhwp Nov 5, 2026
d520d5b
fix(web): show saved service access with Local environment off (#26464)
shivamhwp Nov 5, 2026
c15e49a
fix: keep older pending questions answerable (#26435)
shivamhwp Nov 5, 2026
9bfecb8
fix(web): deleted forks no longer remain in Lineage (#29000)
shivamhwp Nov 5, 2026
4dff7de
fix(server): preserve sibling wakeups when interrupting a completion …
shivamhwp Nov 5, 2026
90f0158
fix(server): attribute usage-limit auto-resume to T3 Code (#29838)
shivamhwp Nov 5, 2026
3f905ca
fix(acp): time out silent Antigravity prompts (#30377)
shivamhwp Nov 5, 2026
935818e
fix(codex): sharing usage limits offer the existing recovery options …
shivamhwp Nov 5, 2026
3470164
revert(web): working threads stay in the Working shelf when their env…
juliusmarminge Nov 5, 2026
e313a12
refactor: Effect code reads env through HostProcess.Environment (#31218)
juliusmarminge Nov 5, 2026
5a90658
refactor: Effect.try calls map failures to typed errors (#31217)
juliusmarminge Nov 5, 2026
20e92ff
fix(web): sidebar project filter rows line up and stay still on hover…
shivamhwp Nov 5, 2026
298cb24
refactor: errors are Schema.TaggedError, not Data.TaggedError or nati…
juliusmarminge Nov 5, 2026
67eebac
fix(server): a stopped run no longer shrinks thread history to one ro…
shivamhwp Nov 5, 2026
01a8db0
fix(server): refresh divergence after a merged branch ref changes (#3…
Yash-Singh1 Nov 5, 2026
8a14762
fix(mobile): one aligned notice for ChatGPT sharing limits (#31277)
shivamhwp Nov 5, 2026
337c585
fix(mobile): composer keeps the keyboard when a queued edit ends (#31…
shivamhwp Nov 5, 2026
94085d9
Merge upstream/main bb4afa5425 into coder-only
henrychu04 Nov 5, 2026
caee27a
Merge upstream/main 337c5858c3 into coder-only
henrychu04 Nov 5, 2026
69820f4
Serve MCP Apps' Claude control requests over the CLI transport
henrychu04 Nov 5, 2026
7d03f6b
Record the 337c5858c3 sync in the seams doc and sync tooling
henrychu04 Nov 5, 2026
c478417
Drop the tsgo VS Code launcher and keep upstream's release block inde…
henrychu04 Nov 5, 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
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion apps/coder-gateway/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"scripts": {
"start": "node src/bin.ts",
"test": "node --test src/*.test.ts",
"typecheck": "tsc --noEmit"
"typecheck": "effect-tsgo tsrs --noEmit"
},
"dependencies": {
"@effect/platform-node": "catalog:",
Expand Down
4 changes: 4 additions & 0 deletions apps/coder-gateway/src/assetProxy.test.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
// @effect-diagnostics nodeBuiltinImport:off -- Coder: drives the real loopback server with Node HTTP and fetch, as a browser would.
// @effect-diagnostics globalFetch:off -- Coder: drives the real loopback server with fetch, as a browser would.
// @effect-diagnostics globalDate:off -- Coder: polls the real server against wall-clock deadlines.
// @effect-diagnostics globalTimers:off -- Coder: polls the real server against wall-clock deadlines.
import assert from "node:assert/strict";
import * as NodeHttp from "node:http";
import type { AddressInfo } from "node:net";
Expand Down
1 change: 1 addition & 0 deletions apps/coder-gateway/src/assetProxy.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// @effect-diagnostics nodeBuiltinImport:off -- Coder: streams workspace assets through the gateway's Node loopback HTTP server.
import type * as NodeHttp from "node:http";

import type { CoderHelperConnection } from "@t3tools/coder-cli/helperConnection";
Expand Down
2 changes: 2 additions & 0 deletions apps/coder-gateway/src/bin.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
// @effect-diagnostics nodeBuiltinImport:off -- Coder: the CLI entry point reads its static files with Node fs.
// @effect-diagnostics anyUnknownInErrorContext:off -- Coder: the entry point runs the gateway whose route errors stay untyped (rendered by message).
import { readFile } from "node:fs/promises";
// @effect-diagnostics nodeBuiltinImport:off
import { spawn } from "node:child_process";
Expand Down
5 changes: 4 additions & 1 deletion apps/coder-gateway/src/coderCommands.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
// @effect-diagnostics globalDate:off -- Coder: formats Coder's build deadline from `coder list` JSON synchronously.
// @effect-diagnostics globalErrorInEffectFailure:off -- Coder: a cancelled connection fails with the message the settings UI shows.
// @effect-diagnostics globalJsonInEffect:off -- Coder: parses `coder` CLI JSON output; the caller treats a parse failure as unavailable.
import type { DiscoveredCoderWorkspace } from "@t3tools/contracts";
import * as Effect from "effect/Effect";

Expand Down Expand Up @@ -55,7 +58,7 @@ export function checkCoderAuthStatus(
? "unauthenticated"
: "unavailable";
}),
Effect.catch(() => Effect.succeed("unavailable" as const)),
Effect.orElseSucceed(() => "unavailable" as const),
);
}

Expand Down
1 change: 1 addition & 0 deletions apps/coder-gateway/src/configChanges.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { CoderProfileConfig } from "@t3tools/coder-cli/configStore";

// @effect-diagnostics-next-line extendsNativeError:off -- Coder: native error the gateway matches with instanceof and renders by message at the HTTP boundary.
export class CoderConfigConflictError extends Error {}

/**
Expand Down
3 changes: 3 additions & 0 deletions apps/coder-gateway/src/connectionShutdown.test.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
// @effect-diagnostics nodeBuiltinImport:off -- Coder: spawns and drives the real gateway over Node HTTP.
// @effect-diagnostics globalFetch:off -- Coder: drives the real gateway over loopback HTTP, as a browser would.
// @effect-diagnostics anyUnknownInErrorContext:off -- Coder: test helpers run untyped gateway effects.
import { it } from "node:test";
import { channel } from "node:diagnostics_channel";
import type { IncomingMessage } from "node:http";
Expand Down
4 changes: 3 additions & 1 deletion apps/coder-gateway/src/hub.test.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
// @effect-diagnostics globalDate:off -- Coder: waits in real time for fake helper stdio traffic.
// @effect-diagnostics globalTimers:off -- Coder: waits in real time for fake helper stdio traffic.
import assert from "node:assert/strict";
import { test } from "node:test";

Expand Down Expand Up @@ -36,7 +38,7 @@ interface FakeHelper {
function fakeHelper(environmentId: string, protocolVersion = 3): FakeHelper {
const sent: Array<SentRequest> = [];
const listeners = new Set<(message: unknown) => void>();
const closed = Effect.runSync(Deferred.make<CoderHelperExit>());
const closed = Deferred.makeUnsafe<CoderHelperExit>();
const requests = (tag: string) => sent.filter((message) => message.tag === tag);
const outboxId = () => {
const outbox = requests(CODER_HUB_OUTBOX_METHOD)[0];
Expand Down
1 change: 1 addition & 0 deletions apps/coder-gateway/src/lifecycleState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import type { WorkspaceRpcBridge } from "./rpcBridge.ts";
export type RunPromise = <A, E>(effect: Effect.Effect<A, E>) => Promise<A>;
export type RunFork = <A, E>(effect: Effect.Effect<A, E>) => Fiber.Fiber<A, E>;

// @effect-diagnostics-next-line extendsNativeError:off -- Coder: native error the gateway matches with instanceof and renders by message at the HTTP boundary.
export class WorkspaceActionConflictError extends Error {}

export interface DeferredPromise<A> {
Expand Down
2 changes: 2 additions & 0 deletions apps/coder-gateway/src/portForwards.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
// @effect-diagnostics globalErrorInEffectFailure:off -- Coder: port-forward errors reach the settings UI by message.
// @effect-diagnostics anyUnknownInErrorContext:off -- Coder: coder port-forward process errors are untyped in coder-cli.
import type { DiscoveredCoderWorkspace } from "@t3tools/contracts";
import * as Effect from "effect/Effect";
import * as Exit from "effect/Exit";
Expand Down
6 changes: 2 additions & 4 deletions apps/coder-gateway/src/process.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import * as Effect from "effect/Effect";
import type { CoderInvocation } from "@t3tools/coder-cli/command";
import { terminateChildProcess } from "@t3tools/coder-cli/processTermination";

// @effect-diagnostics-next-line extendsNativeError:off -- Coder: native error the gateway matches with instanceof and renders by message at the HTTP boundary.
export class GatewayProcessError extends Error {
readonly _tag = "GatewayProcessError";

Expand Down Expand Up @@ -73,10 +74,7 @@ const terminateGatewayProcess = (
child: process.child,
exit: process.exited,
graceMs: terminationGraceMs,
}).pipe(
Effect.catchCause(() => Effect.void),
Effect.ensuring(Effect.sync(process.cleanupListeners)),
);
}).pipe(Effect.ignoreCause, Effect.ensuring(Effect.sync(process.cleanupListeners)));

export function runGatewayProcess(
invocation: CoderInvocation,
Expand Down
2 changes: 2 additions & 0 deletions apps/coder-gateway/src/rpcBridge.test.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
// @effect-diagnostics globalDate:off -- Coder: waits in real time for fake helper stdio traffic.
// @effect-diagnostics globalTimers:off -- Coder: waits in real time for fake helper stdio traffic.
import assert from "node:assert/strict";
import { test } from "node:test";

Expand Down
4 changes: 3 additions & 1 deletion apps/coder-gateway/src/rpcBridge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ export interface WorkspaceRpcBridgeOptions {
readonly cleanupTimeout?: Duration.Input;
}

// @effect-diagnostics-next-line extendsNativeError:off -- Coder: native error the gateway matches with instanceof and renders by message at the HTTP boundary.
export class RpcBridgeConflictError extends Error {
readonly _tag = "RpcBridgeConflictError";

Expand All @@ -45,6 +46,7 @@ export class RpcBridgeConflictError extends Error {
}
}

// @effect-diagnostics-next-line extendsNativeError:off -- Coder: native error the gateway matches with instanceof and renders by message at the HTTP boundary.
export class RpcBridgeSessionError extends Error {
readonly _tag = "RpcBridgeSessionError";
readonly kind: "protocol" | "helper";
Expand Down Expand Up @@ -179,7 +181,7 @@ export function makeWorkspaceRpcBridge(
const runFork = yield* FiberSet.runtime(fibers)();
const cleanupTimeout = options?.cleanupTimeout ?? DEFAULT_CLEANUP_TIMEOUT;

const closeHelper = helper.close.pipe(Effect.catchCause(() => Effect.void));
const closeHelper = helper.close.pipe(Effect.ignoreCause);

const scheduleCleanupCheck = (sessionId: number): void => {
runFork(
Expand Down
1 change: 1 addition & 0 deletions apps/coder-gateway/src/server.test.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// @effect-diagnostics anyUnknownInErrorContext:off -- Coder: test helpers run untyped gateway effects.
import {
startLocalCoderGateway,
type PromiseCoderHelperConnection as CoderHelperConnection,
Expand Down
6 changes: 5 additions & 1 deletion apps/coder-gateway/src/server.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
// @effect-diagnostics unknownInEffectCatch:off -- Coder: route failures are rendered by message at the HTTP boundary.
// @effect-diagnostics anyUnknownInErrorContext:off -- Coder: route failures are rendered by message at the HTTP boundary.
// @effect-diagnostics globalErrorInEffectCatch:off -- Coder: route failures are rendered by message at the HTTP boundary.
// @effect-diagnostics globalErrorInEffectFailure:off -- Coder: route failures are rendered by message at the HTTP boundary.
import type { DiscoveredCoderWorkspace } from "@t3tools/contracts";
export type {
DiscoveredCoderWorkspace,
Expand Down Expand Up @@ -179,7 +183,7 @@ export function makeLocalCoderGateway(
const helperBundlePath = options?.helperBundlePath;
const helperBundleHash =
helperBundlePath === undefined
? Effect.succeed(undefined)
? Effect.undefined
: yield* Effect.cached(
Effect.tryPromise({
try: () => hashCoderHelperBundle(helperBundlePath),
Expand Down
2 changes: 2 additions & 0 deletions apps/coder-gateway/src/testUtils/gateway.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
// @effect-diagnostics unknownInEffectCatch:off -- Coder: test harness wraps the gateway's untyped effects.
// @effect-diagnostics anyUnknownInErrorContext:off -- Coder: test harness wraps the gateway's untyped effects.
import { CoderHelperConnectionError } from "@t3tools/coder-cli/helperConnection";
import * as Effect from "effect/Effect";
import * as Exit from "effect/Exit";
Expand Down
4 changes: 4 additions & 0 deletions apps/coder-gateway/src/workspaceConnections.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
// @effect-diagnostics globalDate:off -- Coder: diagnostic phase durations use wall-clock milliseconds.
// @effect-diagnostics globalErrorInEffectFailure:off -- Coder: connection errors reach the settings UI by message.
// @effect-diagnostics anyUnknownInErrorContext:off -- Coder: coder ssh and helper errors are untyped in coder-cli.
// @effect-diagnostics unknownInEffectCatch:off -- Coder: start-is-current checks rethrow the conflict error unchanged.
import type { WorkspaceDiagnosticEvent, WorkspaceDiagnosticPhase } from "@t3tools/contracts";
import * as Effect from "effect/Effect";
import * as Exit from "effect/Exit";
Expand Down
3 changes: 2 additions & 1 deletion apps/coder-helper/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,13 @@
"build": "node src/build.ts",
"start": "node src/bin.ts",
"test": "node --test src/*.test.ts",
"typecheck": "tsc --noEmit"
"typecheck": "effect-tsgo tsrs --noEmit"
},
"dependencies": {
"@effect/platform-node": "catalog:",
"@t3tools/coder-cli": "workspace:*",
"@t3tools/contracts": "workspace:*",
"@t3tools/shared": "workspace:*",
"effect": "catalog:",
"t3": "workspace:*"
},
Expand Down
1 change: 1 addition & 0 deletions apps/coder-helper/src/build.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// @effect-diagnostics nodeBuiltinImport:off -- Coder: esbuild script that runs outside any Effect runtime.
import { readBuildVersion } from "../../../scripts/build-info.ts";
import { build } from "esbuild";
import * as NodeFS from "node:fs/promises";
Expand Down
1 change: 1 addition & 0 deletions apps/coder-helper/src/bundle.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// @effect-diagnostics nodeBuiltinImport:off
// @effect-diagnostics globalTimers:off -- Coder: waits in real time for the spawned helper bundle.
import { deepStrictEqual, doesNotMatch, match, strictEqual } from "node:assert";
import { spawn } from "node:child_process";
import { once } from "node:events";
Expand Down
8 changes: 5 additions & 3 deletions apps/coder-helper/src/helper.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import * as NodeServices from "@effect/platform-node/NodeServices";
import * as NodeStdio from "@effect/platform-node/NodeStdio";
import { CoderWsRpcGroup } from "@t3tools/contracts";
import * as HostProcess from "@t3tools/shared/HostProcess";
import * as Effect from "effect/Effect";
import * as Layer from "effect/Layer";
import * as Logger from "effect/Logger";
Expand Down Expand Up @@ -46,9 +47,10 @@ const coderServerConfigLayer = Layer.effect(
ServerConfig.ServerConfig,
Effect.gen(function* () {
const path = yield* Path.Path;
const baseDir =
process.env.T3_CODER_HOME?.trim() || path.join(process.env.HOME ?? ".", ".t3-coder");
const cwd = process.env.T3_CODER_CWD?.trim() || process.env.HOME?.trim() || process.cwd();
const env = yield* HostProcess.Environment;
const baseDir = env.T3_CODER_HOME?.trim() || path.join(env.HOME ?? ".", ".t3-coder");
const cwd =
env.T3_CODER_CWD?.trim() || env.HOME?.trim() || (yield* HostProcess.WorkingDirectory);
const derivedPaths = yield* ServerConfig.deriveServerPaths(baseDir);
yield* ServerConfig.ensureServerDirectories(derivedPaths);
return ServerConfig.ServerConfig.of({
Expand Down
6 changes: 3 additions & 3 deletions apps/server/package.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
{
"name": "t3",
"version": "0.1.6",
"version": "0.1.7",
"license": "MIT",
"type": "module",
"scripts": {
"typecheck": "tsc --noEmit",
"typecheck": "effect-tsgo tsrs --noEmit",
"test": "vp test run"
},
"dependencies": {
Expand All @@ -29,7 +29,7 @@
"yauzl": "^3.4.0"
},
"devDependencies": {
"@anthropic-ai/claude-agent-sdk": "0.3.276",
"@anthropic-ai/claude-agent-sdk": "0.3.316",
"@anthropic-ai/sdk": "0.93.0",
"@effect/vitest": "catalog:",
"@t3tools/contracts": "workspace:*",
Expand Down
13 changes: 10 additions & 3 deletions apps/server/scripts/acp-mock-agent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ const omitInitializeModelState = process.env.T3_ACP_OMIT_INITIALIZE_MODEL_STATE
const completeFirstPromptOnCancel = process.env.T3_ACP_COMPLETE_FIRST_PROMPT_ON_CANCEL === "1";
const floodStderr = process.env.T3_ACP_FLOOD_STDERR === "1";
const hangPromptForever = process.env.T3_ACP_HANG_PROMPT_FOREVER === "1";
const agentVersion = process.env.T3_ACP_AGENT_VERSION ?? "0.0.0";
const geminiApiKey = process.env.GEMINI_API_KEY;
const idleError = process.env.T3_ACP_IDLE_ERROR;
const emitTrackedToolCallKindThenHang = process.env.T3_ACP_EMIT_TRACKED_TOOL_CALL_KIND_THEN_HANG;
const clientFsProbePath = process.env.T3_ACP_CLIENT_FS_PROBE_PATH;
const clientFsProbeLogPath = process.env.T3_ACP_CLIENT_FS_PROBE_LOG_PATH;
Expand Down Expand Up @@ -516,7 +519,7 @@ const program = Effect.gen(function* () {
parameterizedModelPicker = request.capabilities?._meta?.parameterizedModelPicker === true;
return {
protocolVersion: 2,
info: { name: "t3-acp-mock-agent", version: process.env.T3_ACP_AGENT_VERSION ?? "0.0.0" },
info: { name: "t3-acp-mock-agent", version: agentVersion },
...(omitInitializeModelState ? {} : { _meta: { modelState: modelState() } }),
capabilities: {
session: {
Expand Down Expand Up @@ -554,7 +557,7 @@ const program = Effect.gen(function* () {
if (antigravityProfile) {
if (
request.methodId !== "oauth-personal" &&
!(request.methodId === "gemini-api-key" && process.env.GEMINI_API_KEY)
!(request.methodId === "gemini-api-key" && geminiApiKey)
) {
return yield* AcpError.AcpRequestError.invalidParams(
`Mock Antigravity rejected auth method ${request.methodId}.`,
Expand Down Expand Up @@ -840,7 +843,6 @@ const program = Effect.gen(function* () {
const requestedSessionId = String(request.sessionId ?? sessionId);
beginAcpMockPrompt(cancelledSessions, requestedSessionId);
promptCount += 1;
const idleError = process.env.T3_ACP_IDLE_ERROR;
if (idleError === "grok-background" && promptCount === 1) {
// The structured completion lands before the prompt settles, so it is buffered.
const taskId = "call-idle-error-background";
Expand Down Expand Up @@ -1877,6 +1879,11 @@ const program = Effect.gen(function* () {
if (method === "_test/finish-cancel") {
return Deferred.succeed(nativeCancelRelease, undefined).pipe(Effect.as({}));
}
if (method === "_test/emit-update") {
return agent.client
.sessionUpdate(params as AcpSchema.SessionNotification)
.pipe(Effect.as({}));
}
if (method === "_test/startup-metadata") {
return Effect.gen(function* () {
for (const [metadataSessionId, commandName, modeId] of [
Expand Down
27 changes: 25 additions & 2 deletions apps/server/scripts/acp-replay-agent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,27 @@ const transcript = JSON.parse(
? Buffer.from(encodedTranscript ?? "", "base64").toString("utf8")
: NodeFS.readFileSync(transcriptPath, "utf8"),
) as ReplayTranscript;
let cursor = 0;
/**
* A recording can span processes: a `runtime_exit` mid-transcript marks where
* one agent process ended, and a respawned replay agent continues from the
* cursor the previous one left in the status file.
*/
function resumedCursor(): number {
try {
const previous = JSON.parse(NodeFS.readFileSync(statusPath ?? "", "utf8")) as {
readonly cursor?: unknown;
readonly failure?: unknown;
};
const resumeAt = typeof previous.cursor === "number" ? previous.cursor : 0;
return previous.failure === undefined &&
transcript.entries[resumeAt - 1]?.type === "runtime_exit"
? resumeAt
: 0;
} catch {
return 0;
}
}
let cursor = resumedCursor();
let stopped = false;
let nextAgentRequestId = 1;
const pendingClientRequestIds = new Map<string, string | number>();
Expand Down Expand Up @@ -232,6 +252,8 @@ function flushInbound(): void {
break;
}
cursor += 1;
// Frames after a mid-transcript exit belong to the next process.
if (cursor < transcript.entries.length) break;
continue;
}
const frame = entry.frame as LogicalFrame;
Expand Down Expand Up @@ -294,7 +316,8 @@ input.on("line", (line) => {
});

input.on("close", () => {
if (!stopped && cursor !== transcript.entries.length) {
const processEnded = transcript.entries[cursor - 1]?.type === "runtime_exit";
if (!stopped && cursor !== transcript.entries.length && !processEnded) {
stopWithFailure("ACP replay input closed before transcript completion");
}
});
Loading