Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
696 commits
Select commit Hold shift + click to select a range
188491e
fix(server): wake paused Cursor replay runs on mismatch (#11535)
saphid Sep 14, 2026
d8365e5
fix(server): load V2 replay fixtures through the platform path servic…
saphid Sep 14, 2026
51e0dd0
fix(server): report missing interrupt-and-restart capability for forc…
saphid Sep 14, 2026
870b05e
fix(server): preserve Cursor directory and lint search results (#11533)
saphid Sep 14, 2026
ca50113
fix(server): roll back question attachment copies when respond prepar…
saphid Sep 14, 2026
fc4ff48
fix(server): restart the live session on model changes after dead rec…
saphid Sep 14, 2026
2929fd8
fix(server): replay launches with server-allocated thread IDs (#11508)
saphid Sep 14, 2026
259f83f
fix(web): keep the active-run header with the prompt that started it …
juliusmarminge Sep 15, 2026
dbc5bc2
refactor(web): centralize provider instance icons (#11829)
juliusmarminge Sep 15, 2026
0720136
feat(web): add the thread action menu and inline rename to the chat h…
juliusmarminge Sep 15, 2026
330098c
fix(web): keep the preview mini-player clear of the inline thread det…
juliusmarminge Sep 15, 2026
3e86ce2
fix: reconcile main snooze controls with orchestration v2
juliusmarminge Sep 15, 2026
1c5d4fc
fix(web): adapt registry icons to light and dark themes
juliusmarminge Sep 15, 2026
ca6fd54
fix: reconcile main worktree setup and title changes with v2
juliusmarminge Sep 15, 2026
0faaf32
fix(server): isolate V2 migrations from the V1 database
juliusmarminge Sep 15, 2026
8c7f49a
fix(ci): verify V2 branch pushes and remove unused helper
juliusmarminge Sep 15, 2026
3fe55fb
revert: restore existing CI push triggers
juliusmarminge Sep 15, 2026
f7a764c
fix(web): retain server-side queuing on v2 after rebase
juliusmarminge Sep 15, 2026
d5383cc
fix(test): account for optional encoded provider settings
juliusmarminge Sep 15, 2026
521d4a7
fix(server): project legacy thread shells during import
juliusmarminge Sep 15, 2026
dfbe139
fix(server): replay command events across persistence pages (#11499)
saphid Sep 15, 2026
0eb1732
fix(orchestrator): report terminal runs after wait timeout (#11574)
saphid Sep 15, 2026
321a9ec
fix(server): skip corrupt scheduled-task rows instead of stopping the…
saphid Sep 15, 2026
4772961
fix(server): preserve due schedules across equivalent time formatting…
saphid Sep 15, 2026
af18f99
test(server): replay denied Claude writes through V2 (#11597)
saphid Sep 15, 2026
144ad58
fix(server): fork Codex threads at the native turn boundary (#11490)
saphid Sep 15, 2026
df495a2
fix(server): align MCP delegation support with live provider adapter …
saphid Sep 15, 2026
c63f32a
test(server): prove v1 to v2 cutover on a copied database and flag di…
saphid Sep 15, 2026
0aaad86
fix(server): bound legacy thread projection requests (#10512)
cjavad Sep 15, 2026
06b1f01
fix: reconcile main thread updates and Git improvements with v2
juliusmarminge Sep 15, 2026
5362ecf
fix(web): confine composer glass transition to input surface
juliusmarminge Sep 15, 2026
bbe98de
fix(server): restore hub limits updates in V2 (#11963)
Bil0000 Sep 15, 2026
bf339a2
fix(mobile): reject preview builds from v1 source
juliusmarminge Sep 15, 2026
e57ab42
fix(mobile): skip preview validation without release credentials
juliusmarminge Sep 15, 2026
39c08e1
fix: stop retained background work after a turn settles
juliusmarminge Sep 15, 2026
9c62d10
refactor: remove legacy token streaming
juliusmarminge Sep 15, 2026
7146bdf
fix: format subagent task names across clients
juliusmarminge Sep 15, 2026
a8efa59
fix: distinguish unsupported server connections
juliusmarminge Sep 15, 2026
b796495
fix: reconcile main updates with V2 orchestration
juliusmarminge Sep 15, 2026
aa0bd30
fix(server): preserve PR links across V2 discovery and import
juliusmarminge Sep 16, 2026
b692efe
fix: reconcile main monograms and PR refresh with V2
juliusmarminge Sep 16, 2026
5e43ef7
fix(web): reset thread scroll and ignore hydration as a new turn
juliusmarminge Sep 16, 2026
62d8cb2
fix(web): invert follow-up behavior with Mod+Enter
juliusmarminge Sep 16, 2026
d8826f8
fix(web): show linked pull requests in thread details
juliusmarminge Sep 16, 2026
0617796
fix(web): restore main thread-switch scrolling without layout resets
juliusmarminge Sep 16, 2026
6c0a8f2
fix: reconcile main setup transitions with V2 threads
juliusmarminge Sep 16, 2026
d91788f
fix(mobile): keep cached thread list across relaunch
juliusmarminge Sep 16, 2026
edcc594
perf(client): coalesce persistent cache writes during streaming (#12109)
juliusmarminge Sep 16, 2026
898041f
perf(server): suppress unchanged shell enrichment refreshes (#12110)
juliusmarminge Sep 16, 2026
f5a10c3
perf(mobile): skip unchanged thread row renders (#12116)
juliusmarminge Sep 16, 2026
af1c6d3
perf(mobile): yield to UI during shell cache encoding (#12117)
juliusmarminge Sep 16, 2026
33cb0ca
perf(client): narrow mobile and web environment subscriptions (#12126)
juliusmarminge Sep 16, 2026
909b774
perf(mobile): ignore irrelevant config updates in thread lists (#12127)
juliusmarminge Sep 16, 2026
a5a2add
perf(mobile): limit thread model options to its provider (#12128)
juliusmarminge Sep 16, 2026
4b2ce7c
perf(client): stop scanning threads for unused shell timestamps (#12129)
juliusmarminge Sep 16, 2026
01925f5
feat(mobile): make the composer pill the hub for the running turn
juliusmarminge Sep 16, 2026
b9f0156
fix: reconcile main composer and provider updates with V2
juliusmarminge Sep 16, 2026
8cfc5d5
test(server): restore Cursor usage coverage after V2 rebase
juliusmarminge Sep 16, 2026
2a3d0b9
feat(web): add compact PR checks to the workspace card (#11981)
Bil0000 Sep 16, 2026
654cd9b
feat(web): show subagent details and history in workspace card (#12079)
Bil0000 Sep 16, 2026
fe7de36
fix(server): start V2 provider turn when checkpoint baseline capture …
SunkenInTime Sep 17, 2026
2cdd75b
fix(server): retain durable checkpoint index fixes on v2
juliusmarminge Sep 17, 2026
4a8d454
fix(server): finalize v2 runs when checkpoint ref lookup fails
juliusmarminge Sep 17, 2026
c2e0643
fix(server): reject v2 file restore in shared workspaces
juliusmarminge Sep 17, 2026
02cf0c6
fix(mobile): allow changing provider in a started thread (#12184)
juliusmarminge Sep 17, 2026
ced7b1c
fix: reconcile main updates with V2 runtimes and timelines
juliusmarminge Sep 17, 2026
25c2699
fix: align V2 question and checkpoint timelines across clients
juliusmarminge Sep 17, 2026
552b563
fix(mobile): guard question controls during answer submission
juliusmarminge Sep 17, 2026
fd0f2b6
fix: adapt multi-model thread creation to V2 launches
juliusmarminge Sep 17, 2026
2d52e1b
fix: restore V2 worktree setup transitions across clients
juliusmarminge Sep 17, 2026
a74aadf
fix(mobile): match web provider handoff dividers
juliusmarminge Sep 17, 2026
f37fcbd
fix(mobile): preview queued message order during drag (#12232)
juliusmarminge Sep 17, 2026
a9be4d9
fix: preserve linked PRs and show them in badge tooltips (#12262)
Bil0000 Sep 17, 2026
660ada1
fix(orchestrator): defer queued provider handoff until delivery (#12226)
juliusmarminge Sep 17, 2026
5c0ed7c
fix(v2): preserve running turns during provider handoff (#12255)
Bil0000 Sep 17, 2026
d0df504
feat(composer): attach threads as context (#12296)
juliusmarminge Sep 17, 2026
54fc07d
fix: reconcile main updates and preserve V2 preview upgrades
juliusmarminge Sep 17, 2026
06b871b
fix(codex): retain V2 reasoning streams and completed traces
juliusmarminge Sep 17, 2026
ca27502
fix(timeline): align V2 reasoning disclosures with main
juliusmarminge Sep 17, 2026
3a47a2d
fix(providers): enable Codex and Claude reasoning summaries in V2
juliusmarminge Sep 17, 2026
2eb8a15
fix(timeline): preview live reasoning and buffer complete paragraphs
juliusmarminge Sep 17, 2026
aecf45d
fix(timeline): unify worklog layout and subagent presentation
juliusmarminge Sep 17, 2026
c56a1b0
fix(claude): retain requested subagent models
juliusmarminge Sep 17, 2026
0579269
fix(mobile): map V2 icons on Android
juliusmarminge Sep 17, 2026
a9cf449
test(server): align replay requests with reasoning settings
juliusmarminge Sep 17, 2026
486e956
fix(web): retain PR panel context after V2 rebase
juliusmarminge Sep 17, 2026
97310cf
test(timeline): cover current worklog interactions and fix CI
juliusmarminge Sep 17, 2026
ecb22fb
test(server): refresh reasoning expectations across replay fixtures
juliusmarminge Sep 17, 2026
8cfb5fc
fix(web): hide idle PR check counts and match row typography (#12321)
Bil0000 Sep 17, 2026
997d7cf
fix(web): open linked PRs from the badge hover list (#12314)
Bil0000 Sep 17, 2026
84569be
fix(web): configure alternate send and background shortcuts (#12174)
Bil0000 Sep 18, 2026
08fa54e
fix(web): preserve main actions when rebasing v2
juliusmarminge Sep 18, 2026
e5da13b
fix(server): hand off failed and interrupted turn context
juliusmarminge Sep 18, 2026
1ad7275
fix(queue): preserve and hold queued messages after restart
juliusmarminge Sep 18, 2026
028c2c9
refactor(mcp): use workspace-aware thread launches
juliusmarminge Sep 18, 2026
3727229
fix(server): keep tool payloads out of completion queues (#12345)
juliusmarminge Sep 18, 2026
7393f52
refactor(web): reuse worklog rows for setup and created threads (#12347)
juliusmarminge Sep 18, 2026
a18cb99
refactor(web): centralize thread details section layout (#12348)
juliusmarminge Sep 18, 2026
8f1b0d2
refactor(mobile): share settings choice row defaults (#12349)
juliusmarminge Sep 18, 2026
f2a1364
refactor(web): share composer context labels (#12357)
juliusmarminge Sep 18, 2026
c98fbae
refactor(web): reuse shared error alerts (#12361)
juliusmarminge Sep 18, 2026
1c3a524
refactor(mobile): share subagent status indicators (#12367)
juliusmarminge Sep 18, 2026
0208814
t3code/ui composition audit/worklog link variant (#12375)
juliusmarminge Sep 18, 2026
73d389a
feat(mobile): manage scheduled tasks across environments (#12351)
juliusmarminge Sep 18, 2026
505ff05
refactor(ui): preserve shared controls across the V2 rebase
juliusmarminge Sep 18, 2026
82d8b43
fix(v2): adapt to Effect rc.115 after rebase
juliusmarminge Sep 18, 2026
db94be8
chore(v2): reconcile dependency lockfile after rebase
juliusmarminge Sep 18, 2026
241bf77
fix(web): share chat width and remove stale styling
juliusmarminge Sep 18, 2026
c7e8076
chore(marketing): remove unused duplicate screenshot
juliusmarminge Sep 18, 2026
f8e7a5c
test(server): restore V2 transfer budgets and CI reporting
juliusmarminge Sep 18, 2026
3ea25c2
fix(server): preserve reviewed secret rollback behavior on V2
juliusmarminge Sep 18, 2026
15f8542
fix(web): reconcile sidebar search with V2 environment subscriptions
juliusmarminge Sep 18, 2026
7e6db1f
fix(server): reconcile PR preview and checks fixtures
juliusmarminge Sep 18, 2026
636a70a
fix(mobile): preserve merge-back action in shared thread header
juliusmarminge Sep 18, 2026
d7400e0
fix(server): unblock orchestrator CI checks
juliusmarminge Sep 18, 2026
5466e31
fix(web): anchor turn duration below the initiating prompt
juliusmarminge Sep 18, 2026
c41f93a
fix(mobile): submit v2 previews to Play closed testing
juliusmarminge Sep 18, 2026
e748743
fix(mobile): remove stale preferences type import
juliusmarminge Sep 18, 2026
564faf5
fix(desktop): allow V1 and V2 to run concurrently (#12480)
juliusmarminge Sep 18, 2026
96ff30b
fix(antigravity): accept supported legacy handshake versions (#12509)
juliusmarminge Sep 18, 2026
b7cb3d5
fix(cursor): preserve SDK runtime chunks and helpers in packages (#12…
juliusmarminge Sep 18, 2026
718c63d
feat(server): preserve budgeted history across provider handoffs (#12…
juliusmarminge Sep 18, 2026
368884c
fix(server): decode v1 message events persisted with a reasoning role…
chrisdeeming Sep 18, 2026
88a4784
test(server): align V2 fixtures with OTLP log configuration
juliusmarminge Sep 18, 2026
ceeb506
fix(acp): reconcile elicitation validation with V2 protocol compatibi…
juliusmarminge Sep 19, 2026
ec4e00f
fix(server): release thread history after provider turn startup
juliusmarminge Sep 19, 2026
3d458db
fix(server): avoid full transcript reads in provider run guards
juliusmarminge Sep 19, 2026
8c2aea4
fix(server): release delivered snapshots from live RPC streams
juliusmarminge Sep 19, 2026
612927b
fix(shared): release successful results from completed trace spans
juliusmarminge Sep 19, 2026
1710595
fix(v2): reconcile main cleanup and mobile device controls
juliusmarminge Sep 19, 2026
ed322cb
fix(server): decode transcript tool payloads only once
juliusmarminge Sep 19, 2026
79fb689
fix(server): refresh completed runs without loading transcripts
juliusmarminge Sep 19, 2026
0982aae
fix(server): avoid transcript reloads during run completion
juliusmarminge Sep 19, 2026
5c3921b
fix(server): load targeted state when starting provider turns
juliusmarminge Sep 20, 2026
5879be6
fix(notifications): silence subagent threads
maria-rcks Sep 19, 2026
334655f
fix(preview): restore v2 sizing and project access (#12548)
juliusmarminge Sep 19, 2026
bcef17d
fix(server): settle V2 threads after linked PR merges (#12568)
Bil0000 Sep 19, 2026
04f0fda
fix(web): show subagent models and running count in Lineage (#12491)
Bil0000 Sep 19, 2026
cc6a351
fix(web): show Auto balance in the workspace host menu (#12481)
Bil0000 Sep 19, 2026
dc8c228
fix(chat): present and summarize all T3 tools (#12671)
juliusmarminge Sep 20, 2026
c390539
feat(web): list linked PRs in workspace card (#12574)
Bil0000 Sep 20, 2026
0b1ee28
fix(web): make PR badge hover lists easy to click (#12378)
Bil0000 Sep 20, 2026
9b0d644
fix(mobile): preserve native send choices and keyboard (#12770)
juliusmarminge Sep 20, 2026
45c7e75
fix(server): surface actionable provider failure messages (#12560)
juliusmarminge Sep 20, 2026
3edc5d5
fix(web): keep workspace card action hover uniform (#12766)
Bil0000 Sep 20, 2026
05abce1
fix(web): stop citation popovers flying into position
juliusmarminge Sep 21, 2026
d612487
fix(web): hide raw image markup in queue previews (#12820)
maria-rcks Sep 21, 2026
6c56ad6
feat(v2): show provider limit stops as Limited (#12677)
juliusmarminge Sep 21, 2026
6d074cd
feat(v2): resume limited threads when usage resets (#12686)
juliusmarminge Sep 21, 2026
4728886
feat(v2): snooze limited threads until usage resets (#12687)
juliusmarminge Sep 21, 2026
b7a147d
fix(v2): keep failed turns visible in the transcript (#12783)
juliusmarminge Sep 21, 2026
e459214
refactor(server): share scheduling for tasks and limit recovery (#12795)
juliusmarminge Sep 21, 2026
894f6c4
fix(v2): reconcile main UI, attachment limits, and logging fixtures
juliusmarminge Sep 21, 2026
98b03d9
test(v2): align handoff fixtures with larger attachment limits
juliusmarminge Sep 21, 2026
7b13cd9
feat(web): color handoff model names with their provider brand color …
maria-rcks Sep 21, 2026
5d4423b
refactor(web): remove the agents right panel (#12835)
maria-rcks Sep 21, 2026
b4544f9
feat(web): clearer icons for the workspace panel controls (#12838)
maria-rcks Sep 21, 2026
e3bdfd7
feat(web): give lineage subagent hovers the thread hover card (#12842)
maria-rcks Sep 21, 2026
ccf43cc
fix(v2): reconcile main composer layout and undo actions
juliusmarminge Sep 21, 2026
3409430
fix(v2): remove obsolete composer breakpoint animation
juliusmarminge Sep 21, 2026
534b7d4
fix(server): avoid transcript reads when checking run interrupts
juliusmarminge Sep 21, 2026
28051c4
fix(server): replace unnecessary full projection reads
juliusmarminge Sep 21, 2026
7a4a03c
perf(pr): reduce quota use when refreshing workspace checks (#12442)
Bil0000 Sep 21, 2026
1b8dd36
test(v2): expose scoped reads in provider replay harness
juliusmarminge Sep 21, 2026
d37d9b4
fix(server): recover Pi resumes without reusing native history (#12933)
juliusmarminge Sep 21, 2026
9efeb18
fix(settings): restore V2 controls and shared settings layout
juliusmarminge Sep 21, 2026
35b9f0c
feat(web): edit the last queued message with Option+Up (#12599)
jakeleventhal Sep 21, 2026
8383410
fix(web): edit automations from thread details (#12408)
saphid Sep 21, 2026
943ab9a
fix(server): preserve provider history across repeated rollbacks (#12…
Derpedyea Sep 21, 2026
474124a
fix(server): start ACP MCP bridge in self-contained runtime (#12747)
pekth Sep 21, 2026
6f3cb06
fix(server): launch contained ACP providers from packaged runtimes (#…
pekth Sep 21, 2026
2f534ff
fix(web): restore sidebar order during thread context drags
juliusmarminge Sep 21, 2026
3d564a5
refactor(server): resolve self invocations through one shared helper …
juliusmarminge Sep 21, 2026
7a0c47f
perf(server): stop decoding unrelated events during startup (#12846)
extoci Sep 21, 2026
630cf22
perf(server): stop maintaining redundant projection indexes (#12847)
extoci Sep 21, 2026
47d533e
feat(cursor): support browser login for the agent SDK (#12948)
Yash-Singh1 Sep 21, 2026
bcbe95e
fix(server): fail V2 runs when provider sessions cannot open (#12790)
pekth Sep 21, 2026
1421612
fix(server): fail runs when provider startup preparation fails (#12409)
saphid Sep 21, 2026
324038f
fix(server): select an available provider for delegated tasks (#11870)
saphid Sep 21, 2026
45e2485
feat(web): show a turn's subagents as one collapsible card (#12839)
maria-rcks Sep 21, 2026
4ccfdee
feat(mobile): show subagents in a collapsible card (#12961)
juliusmarminge Sep 22, 2026
c267ec1
fix(chat): link agent attribution to its source thread (#12971)
juliusmarminge Sep 22, 2026
77acaf5
fix(orchestration): settle subagent statuses and activation timers (#…
juliusmarminge Sep 22, 2026
52db643
fix(server): retry provider session opens before failing the run (#13…
t3dotgg Sep 22, 2026
b8aadbf
feat(auth): share provider sign-in flows across clients (#12965)
juliusmarminge Sep 22, 2026
33817c1
refactor(cursor): use shared provider account setup and storage (#12966)
juliusmarminge Sep 22, 2026
acebb3f
feat(acp): connect registry providers to shared sign-in flows (#12967)
juliusmarminge Sep 22, 2026
19c1428
fix(v2): reconcile main settings, auth, and shared controls
juliusmarminge Sep 23, 2026
ebf8a82
fix(v2): preserve main scroll fixes and mobile module boundaries
juliusmarminge Sep 23, 2026
81f2d75
fix(v2): hidden automatic queued runs no longer block settling a thread
juliusmarminge Sep 23, 2026
00056fd
fix(v2): reconcile main mobile lists and provider compatibility
juliusmarminge Sep 23, 2026
486a270
fix(v2): reconcile main shared controls and render recovery
juliusmarminge Sep 23, 2026
1688f02
fix(v2): remove stale panel styling exports
juliusmarminge Sep 23, 2026
f4b0b5b
feat(web): integrate responsive chat and thread details
juliusmarminge Sep 23, 2026
b245b09
feat(v2): make worktree branch naming configurable (#13294)
juliusmarminge Sep 23, 2026
15cc654
fix(cua): show call titles and align app icons (#13307)
Yash-Singh1 Sep 23, 2026
3c82794
fix(server): reduce retained thread memory in PR lookups and turn sta…
juliusmarminge Sep 23, 2026
c851f8c
refactor(server): detach PR lookup stacks instead of a custom cache (…
juliusmarminge Sep 23, 2026
33868db
fix(mobile): lift working control above question overlay (#13297)
gabrielelpidio Sep 23, 2026
a1a7de2
perf(server): speed up cold desktop launches (#13320)
Yash-Singh1 Sep 23, 2026
6f3040d
fix(web): handle thread details context clicks (#13323)
Yash-Singh1 Sep 24, 2026
a28fc10
fix(desktop): resolve Windows userData without yielding before the Cl…
SunkenInTime Sep 24, 2026
68cd258
fix(v2): reconcile latest main after rebase
juliusmarminge Sep 24, 2026
6dbe344
fix(v2): keep relay helpers private after rebase
juliusmarminge Sep 24, 2026
3b89388
fix(v2): cover Pi compatibility after main sync
juliusmarminge Sep 24, 2026
1c339ef
fix(orchestration): report subagent models and use live model choices…
Bil0000 Sep 24, 2026
cadac54
fix(server): keep Claude subagent output in the subagent's thread (#1…
scratchyone Sep 24, 2026
833d52e
fix(web): align workspace card controls
juliusmarminge Sep 24, 2026
2b6f2af
fix(server): link agent-sent messages to their source thread
juliusmarminge Sep 24, 2026
d10bebc
test(server): remove skipped, duplicate, and constant-restating V2 te…
juliusmarminge Sep 24, 2026
2e01848
fix(server): Codex V2 runs skills typed with any currency sigil (#13461)
juliusmarminge Sep 24, 2026
4784fba
refactor(server): remove the unused V1 Codex session runtime (#13462)
juliusmarminge Sep 24, 2026
7bc65c0
fix(server): Codex V2 sessions use the configured launch arguments (#…
juliusmarminge Sep 24, 2026
f6924fd
fix(server): merged PRs update and auto-settle threads again (#13476)
Bil0000 Sep 24, 2026
430dfd1
fix(server): Codex V2 sessions expand ~ in the binary path (#13470)
juliusmarminge Sep 24, 2026
d861582
fix(server): Claude V2 sessions expand ~ in the binary path (#13471)
juliusmarminge Sep 24, 2026
e7b2407
chore(server): unexport OpenCode capabilities left unused by test rem…
juliusmarminge Sep 24, 2026
3eb213c
test(server): make the provider-switch resume-failure test reach the …
juliusmarminge Sep 24, 2026
a967baf
fix(v2): reconcile latest main protocol and theme updates
juliusmarminge Sep 24, 2026
c9ad902
chore(web): drop the right panel sheet class left unused by the V2 re…
juliusmarminge Sep 24, 2026
13aec8a
fix(server): Cursor V2 threads load project skills and rules (#13499)
juliusmarminge Sep 24, 2026
a99b46e
test(server): re-record Cursor replay fixtures and cover skills live …
juliusmarminge Sep 24, 2026
b0abc48
fix(codex): replay legacy user-input requests as blocking (#13509)
juliusmarminge Sep 24, 2026
a63d9c5
test(server): record the Codex thread rollback fixture live on 0.156.…
juliusmarminge Sep 24, 2026
d4af1c4
test(server): record Codex multi-agent V2 subagents live on 0.156.1 (…
juliusmarminge Sep 24, 2026
f720d27
fix(v2): reconcile main auto-settle controls and preview migrations
juliusmarminge Sep 24, 2026
e692dbb
fix(web): ungroup single subagents and stabilize group expansion
juliusmarminge Sep 25, 2026
3413d33
fix(codex): preserve native item start times (#13525)
Yash-Singh1 Sep 25, 2026
899a93a
test(server): replace Pi adapter unit tests with live replay fixtures…
juliusmarminge Sep 25, 2026
06e80a6
test(server): remove replay harness self-tests (#13531)
juliusmarminge Sep 25, 2026
85aaa11
test(server): record Claude background task and subagent lifecycles l…
juliusmarminge Sep 25, 2026
75c7e9e
test(server): record Codex replay fixtures on gpt-6-luna and Codex 0.…
juliusmarminge Sep 25, 2026
cb879a9
fix(server): keep a Claude wake reply off the user's queued message (…
juliusmarminge Sep 25, 2026
37da532
fix(web): align workspace controls and restore split hover states
juliusmarminge Sep 25, 2026
3cb31a1
fix(server): Cursor sandboxed threads find their helper when running …
juliusmarminge Sep 25, 2026
c361921
chore(web): keep the thread details split surface class module-privat…
juliusmarminge Sep 25, 2026
20c5739
fix(server): Codex V2 threads show todo lists again (#13546)
juliusmarminge Sep 25, 2026
3d23e15
fix(web): resize floating previews smoothly above the composer
juliusmarminge Sep 25, 2026
7381ed9
refactor(server): record Cursor replay fixtures with Effect (#13556)
juliusmarminge Sep 25, 2026
cb8dce4
test(server): record Grok replay fixtures from a live grok agent (#13…
juliusmarminge Sep 25, 2026
bf1e8c5
fix: reconcile latest main changes with V2
juliusmarminge Sep 25, 2026
175e2bd
fix(server): Grok monitor updates stay running until Grok says they f…
juliusmarminge Sep 25, 2026
81744b3
test(server): assert the read-only on-request write by its permission…
juliusmarminge Sep 25, 2026
87c67bd
test(clients): retain main relay compatibility regression coverage
juliusmarminge Sep 25, 2026
f8b8634
fix(server): ACP agents can read files under on-request approval (#13…
juliusmarminge Sep 25, 2026
1f2f91d
fix(server): show diffs for ACP edits that send oldText/newText (#13579)
juliusmarminge Sep 25, 2026
2ee10fd
feat(web): navigate queued messages without losing unsaved edits
shivamhwp Sep 21, 2026
024abdc
fix(web): cancel queued message edits with Escape
shivamhwp Sep 25, 2026
c808ded
fix(web): align queued thumbnails with message text
shivamhwp Sep 25, 2026
74ec2ce
fix(mobile): make the queued messages sheet readable
Sep 27, 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
  •  
  •  
  •  
23 changes: 22 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,16 @@ jobs:
!/.repos/
sparse-checkout-cone-mode: false

# Blacksmith boots GitHub's Ubuntu runner image (gcc is usually present),
# but ACP process-tree live tests compile a small pthread fixture with `cc`
# and soft-skip when it is missing. Install build-essential so that path
# always runs in CI instead of silently no-oping.
- name: Install C toolchain for process-tree fixtures
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends build-essential
command -v cc

- name: Setup Vite+
uses: voidzero-dev/setup-vp@v1
with:
Expand Down Expand Up @@ -149,7 +159,7 @@ jobs:
T3CODE_TRANSFER_BUDGET_RESULT_PATH: ${{ runner.temp }}/thread-transfer-result.json
run: vp run --filter t3 test --shard ${{ matrix.shard }}/${{ strategy.job-total }}

# src/server.test.ts writes the budget report, so exactly one shard
# integration/transferBudgetV2.integration.test.ts writes the report; exactly one shard
# produces these files. Gating the upload on their presence keeps a
# single `thread-transfer-results` artifact per run, which is the name
# thread-transfer-report.yml resolves.
Expand Down Expand Up @@ -181,6 +191,17 @@ jobs:
if-no-files-found: ignore
retention-days: 30

transfer-report:
name: Transfer report artifact
needs: test_server
runs-on: ubuntu-24.04
steps:
- name: Require transfer measurements
uses: actions/download-artifact@v8
with:
name: thread-transfer-results
path: ${{ runner.temp }}/thread-transfer

# Split out of Check and Test: both paid ~7-9s to install a Rust toolchain
# for checks that take under 3s, on the critical path of every PR.
rust:
Expand Down
7 changes: 4 additions & 3 deletions .github/workflows/mobile-eas-production.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,20 +25,21 @@ name: Mobile EAS Production
# workflow_dispatch remains as a manual override for both modes (e.g. to
# retry an errored build or force an OTA).
# Manual v2-preview builds keep the production app identity and disable OTA.
# They auto-submit to TestFlight and the Google Play closed testing track v2.
# Select the v2 branch when dispatching a preview build.
on:
workflow_dispatch:
inputs:
mode:
description: "build (+ auto-submit to TestFlight) or update (OTA)"
description: "build (+ auto-submit to TestFlight / Google Play) or update (OTA)"
required: true
type: choice
default: build
options:
- build
- update
profile:
description: "Store build profile (v2-preview supports build mode only)"
description: "Store build profile (v2-preview: TestFlight + Play closed track v2; build only)"
required: true
type: choice
default: production
Expand All @@ -49,7 +50,7 @@ on:
description: "Target platform"
required: true
type: choice
default: ios
default: all
options:
- ios
- android
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ squashfs-root/
.vercel
.gstack/
.plans/
/audits/
dist-electron/
.electron-runtime/
.showcase/
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ Full docs live in [docs/](./docs). There's no docs site yet.
- [Permission modes](./docs/user/permission-modes.md)
- [Keyboard shortcuts](./docs/user/keybindings.md)
- [Project settings](./docs/user/project-settings.md)
- [Appearance preferences](./docs/user/appearance.md)
- [Remote access from a phone or another machine](./docs/user/remote-access.md)
- [Keeping app and server in sync](./docs/user/updating.md)
- [Source control integrations](./docs/user/source-control.md)
Expand Down
37 changes: 29 additions & 8 deletions apps/desktop/src/app/DesktopAppIdentity.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import * as DesktopAppIdentity from "./DesktopAppIdentity.ts";
import * as DesktopAssets from "./DesktopAssets.ts";
import * as DesktopConfig from "./DesktopConfig.ts";
import * as DesktopEnvironment from "./DesktopEnvironment.ts";
import * as DesktopUserData from "./DesktopUserData.ts";

const defaultEnvironmentInput = {
dirname: "/repo/apps/desktop/dist-electron",
Expand Down Expand Up @@ -124,13 +125,14 @@ const withIdentity = <A, E, R>(
return effect.pipe(
Effect.provide(
DesktopAppIdentity.layer.pipe(
Layer.provide(NodePath.layerPosix),
Layer.provideMerge(
FileSystem.layerNoop({
exists: (path) =>
input.legacyPathProbeError
? Effect.fail(input.legacyPathProbeError)
: Effect.succeed(
input.legacyPathExists === true && path.includes("T3 Code (Alpha)"),
input.legacyPathExists === true && /T3 Code \((Alpha|Dev)\)/.test(path),
),
readFileString: () =>
Effect.succeed(input.packageJson ?? '{"t3codeCommitHash":"abcdef1234567890"}'),
Expand All @@ -145,20 +147,36 @@ const withIdentity = <A, E, R>(
};

describe("DesktopAppIdentity", () => {
it.effect("keeps using the legacy userData path when it already exists", () =>
it.effect("isolates the V2 profile even when the legacy V1 profile exists", () =>
withIdentity(
Effect.gen(function* () {
const identity = yield* DesktopAppIdentity.DesktopAppIdentity;
const userDataPath = yield* identity.resolveUserDataPath;

assert.equal(userDataPath, "/Users/alice/Library/Application Support/T3 Code (Alpha)");
assert.equal(userDataPath, "/Users/alice/Library/Application Support/t3code-v2");
}),
{ legacyPathExists: true },
),
);

it.effect("keeps using the legacy development profile", () =>
withIdentity(
Effect.gen(function* () {
const identity = yield* DesktopAppIdentity.DesktopAppIdentity;
assert.equal(
yield* identity.resolveUserDataPath,
"/Users/alice/Library/Application Support/T3 Code (Dev)",
);
}),
{
legacyPathExists: true,
environment: { env: { VITE_DEV_SERVER_URL: "http://localhost:5173" } },
},
),
);

it.effect("preserves failures while inspecting the legacy userData path", () => {
const legacyPath = "/Users/alice/Library/Application Support/T3 Code (Alpha)";
const legacyPath = "/Users/alice/Library/Application Support/T3 Code (Dev)";
const cause = PlatformError.systemError({
_tag: "PermissionDenied",
module: "FileSystem",
Expand All @@ -172,15 +190,18 @@ describe("DesktopAppIdentity", () => {
const identity = yield* DesktopAppIdentity.DesktopAppIdentity;
const error = yield* identity.resolveUserDataPath.pipe(Effect.flip);

assert.instanceOf(error, DesktopAppIdentity.DesktopUserDataPathResolutionError);
assert.equal(error.legacyPath, legacyPath);
assert.instanceOf(error, DesktopUserData.DesktopUserDataInitializationError);
assert.equal(error.resourcePath, legacyPath);
assert.strictEqual(error.cause, cause);
assert.equal(
error.message,
`Failed to inspect legacy desktop user-data path at "${legacyPath}".`,
`Could not initialize Electron user data during inspect at ${legacyPath} (PermissionDenied).`,
);
}),
{ legacyPathProbeError: cause },
{
legacyPathProbeError: cause,
environment: { env: { VITE_DEV_SERVER_URL: "http://localhost:5173" } },
},
);
});

Expand Down
47 changes: 9 additions & 38 deletions apps/desktop/src/app/DesktopAppIdentity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@ import * as Effect from "effect/Effect";
import * as FileSystem from "effect/FileSystem";
import * as Layer from "effect/Layer";
import * as Option from "effect/Option";
import * as Path from "effect/Path";
import * as Ref from "effect/Ref";
import * as Schema from "effect/Schema";

import * as ElectronApp from "../electron/ElectronApp.ts";
import * as DesktopAssets from "./DesktopAssets.ts";
import * as DesktopEnvironment from "./DesktopEnvironment.ts";
import * as DesktopUserData from "./DesktopUserData.ts";

const COMMIT_HASH_PATTERN = /^[0-9a-f]{7,40}$/i;
const COMMIT_HASH_DISPLAY_LENGTH = 12;
Expand All @@ -18,22 +20,13 @@ const AppPackageMetadata = Schema.Struct({
});
const decodeAppPackageMetadata = Schema.decodeEffect(Schema.fromJsonString(AppPackageMetadata));

export class DesktopUserDataPathResolutionError extends Schema.TaggedError<DesktopUserDataPathResolutionError>()(
"DesktopUserDataPathResolutionError",
{
legacyPath: Schema.String,
cause: Schema.Defect(),
},
) {
override get message(): string {
return `Failed to inspect legacy desktop user-data path at "${this.legacyPath}".`;
}
}

export class DesktopAppIdentity extends Context.Service<
DesktopAppIdentity,
{
readonly resolveUserDataPath: Effect.Effect<string, DesktopUserDataPathResolutionError>;
readonly resolveUserDataPath: Effect.Effect<
string,
DesktopUserData.DesktopUserDataInitializationError
>;
readonly configure: Effect.Effect<void>;
}
>()("@t3tools/desktop/app/DesktopAppIdentity") {}
Expand All @@ -45,33 +38,13 @@ const normalizeCommitHash = (value: string): Option.Option<string> => {
: Option.none();
};

export const resolveUserDataPath = Effect.gen(function* () {
const environment = yield* DesktopEnvironment.DesktopEnvironment;
const fileSystem = yield* FileSystem.FileSystem;
const legacyPath = environment.path.join(
environment.appDataDirectory,
environment.legacyUserDataDirName,
);
const legacyPathExists = yield* fileSystem.exists(legacyPath).pipe(
Effect.mapError(
(cause) =>
new DesktopUserDataPathResolutionError({
legacyPath,
cause,
}),
),
);
return legacyPathExists
? legacyPath
: environment.path.join(environment.appDataDirectory, environment.userDataDirName);
}).pipe(Effect.withSpan("desktop.appIdentity.resolveUserDataPath"));

/** @public Service construction is part of the canonical Effect module API. */
export const make = Effect.gen(function* () {
const assets = yield* DesktopAssets.DesktopAssets;
const electronApp = yield* ElectronApp.ElectronApp;
const environment = yield* DesktopEnvironment.DesktopEnvironment;
const fileSystem = yield* FileSystem.FileSystem;
const userDataContext = yield* Effect.context<FileSystem.FileSystem | Path.Path>();
const commitHashCache = yield* Ref.make<Option.Option<Option.Option<string>>>(Option.none());

const resolveEmbeddedCommitHash = Effect.gen(function* () {
Expand Down Expand Up @@ -112,10 +85,8 @@ export const make = Effect.gen(function* () {
return commitHash;
});

const userDataPath = resolveUserDataPath.pipe(
Effect.provide(
yield* Effect.context<DesktopEnvironment.DesktopEnvironment | FileSystem.FileSystem>(),
),
const userDataPath = DesktopUserData.resolveUserDataPath(environment).pipe(
Effect.provide(userDataContext),
);

const configure = Effect.gen(function* () {
Expand Down
57 changes: 51 additions & 6 deletions apps/desktop/src/app/DesktopClerk.test.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import * as NodePath from "@effect/platform-node/NodePath";
import { assert, describe, it } from "@effect/vitest";
import * as Cause from "effect/Cause";
import * as Effect from "effect/Effect";
Expand Down Expand Up @@ -28,15 +29,21 @@ import * as ElectronApp from "../electron/ElectronApp.ts";
import * as ElectronWindow from "../electron/ElectronWindow.ts";
import * as DesktopClerk from "./DesktopClerk.ts";
import * as DesktopEnvironment from "./DesktopEnvironment.ts";

const makeDesktopClerkLayer = (isDevelopment = true, events: string[] = []) => {
import * as DesktopPreReadyFileSystem from "./DesktopPreReadyFileSystem.ts";

const makeDesktopClerkLayer = (
isDevelopment = true,
events: string[] = [],
platform: NodeJS.Platform = "darwin",
fileSystemLayer: Layer.Layer<FileSystem.FileSystem> = FileSystem.layerNoop({
exists: () => Effect.succeed(false),
}),
) => {
const environment = DesktopEnvironment.DesktopEnvironment.of({
stateDir: "/tmp/t3-state",
isDevelopment,
appDataDirectory: "/tmp/app-data",
userDataDirName: isDevelopment ? "t3code-dev" : "t3code",
legacyUserDataDirName: isDevelopment ? "T3 Code (Dev)" : "T3 Code (Alpha)",
path: { join: (...parts: ReadonlyArray<string>) => parts.join("/") },
platform,
} as unknown as DesktopEnvironment.DesktopEnvironment["Service"]);

const electronApp = {
Expand All @@ -49,9 +56,10 @@ const makeDesktopClerkLayer = (isDevelopment = true, events: string[] = []) => {
return DesktopClerk.layer.pipe(
Layer.provide(
Layer.mergeAll(
NodePath.layerPosix,
Layer.succeed(DesktopEnvironment.DesktopEnvironment, environment),
Layer.succeed(ElectronApp.ElectronApp, electronApp),
FileSystem.layerNoop({ exists: () => Effect.succeed(false) }),
fileSystemLayer,
),
),
);
Expand Down Expand Up @@ -94,6 +102,43 @@ describe("DesktopClerk", () => {
});
});

it.each([
{
name: "packaged Windows",
isDevelopment: false,
platform: "win32" as const,
userData: "/tmp/app-data/t3code-v2",
},
{
name: "development",
isDevelopment: true,
platform: "win32" as const,
userData: "/tmp/app-data/t3code-dev",
},
])(
"creates the bridge before startup can yield to the event loop ($name)",
({ isDevelopment, platform, userData }) => {
const events: string[] = [];
storageMock.mockReturnValue(storageAdapter);
createClerkBridgeMock.mockImplementation(() => {
events.push("createClerkBridge");
return { cleanup: vi.fn(), isPrimaryInstance: true };
});
// runSync throws if the layer ever suspends, which would let Electron emit
// ready before the bridge exists. main.ts provides the same FileSystem.
// oxlint-disable-next-line t3code/no-manual-effect-runtime-in-tests -- The assertion IS that the layer builds synchronously; it.effect would mask a regression to async.
Effect.runSync(
Effect.scoped(
Layer.build(
makeDesktopClerkLayer(isDevelopment, events, platform, DesktopPreReadyFileSystem.layer),
),
),
);

assert.deepEqual(events, [`setPath:userData:${userData}`, "createClerkBridge"]);
},
);

it.effect("preserves bridge initialization failures", () => {
const cause = new Error("bridge initialization failed");
storageMock.mockReturnValue(storageAdapter);
Expand Down
12 changes: 4 additions & 8 deletions apps/desktop/src/app/DesktopClerk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { clerkFrontendApiHostnameFromPublishableKey } from "@t3tools/shared/rela
import * as ElectronApp from "../electron/ElectronApp.ts";
import * as ElectronProtocol from "../electron/ElectronProtocol.ts";
import * as ElectronWindow from "../electron/ElectronWindow.ts";
import * as DesktopAppIdentity from "./DesktopAppIdentity.ts";
import * as DesktopUserData from "./DesktopUserData.ts";
import * as DesktopEnvironment from "./DesktopEnvironment.ts";

declare const __T3CODE_BUILD_CLERK_PUBLISHABLE_KEY__: string | undefined;
Expand Down Expand Up @@ -88,13 +88,9 @@ export const make = Effect.gen(function* () {
const environment = yield* DesktopEnvironment.DesktopEnvironment;
const electronApp = yield* ElectronApp.ElectronApp;

// Electron scopes the single-instance lock to the userData directory and
// creates that directory when the lock is acquired. The SDK bridge takes
// the lock at creation, so userData must already point at the real
// directory here — under the default productName-derived path, acquiring
// the lock would create "T3 Code (Alpha)" and make the legacy-install
// detection in resolveUserDataPath match on fresh installs.
const userDataPath = yield* DesktopAppIdentity.resolveUserDataPath;
// The SDK bridge acquires Electron's profile-scoped single-instance lock.
// Must not yield: the bridge registers a scheme Electron rejects once ready.
const userDataPath = yield* DesktopUserData.resolveUserDataPath(environment);
yield* electronApp.setPath("userData", userDataPath);

const bridge = yield* Effect.acquireRelease(
Expand Down
Loading
Loading