Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
657 commits
Select commit Hold shift + click to select a range
9eec915
test(web): cancel queued animation frames during worker cleanup (#10880)
saphid Sep 9, 2026
0841f46
fix: reconcile main devices and pull requests with orchestration v2
juliusmarminge Sep 10, 2026
aa1df96
feat(providers): add Pi coding agent (#7211)
StiensWout Sep 10, 2026
b2f3df0
feat(providers): standardize ACP providers (#6461)
StiensWout Sep 10, 2026
5de8877
feat: render background completions as typed notifications
juliusmarminge Sep 10, 2026
f3d447b
fix(mcp): omit recursive screenshot metadata from tool inputs
juliusmarminge Sep 10, 2026
64969f4
fix(pi): use native forks and preserve rollback session identity
juliusmarminge Sep 10, 2026
a0203c2
fix(pi): cap OpenRouter output budgets pending upstream fix
juliusmarminge Sep 10, 2026
020e107
fix(web): show ACP sidebar icons and hold onboarding height while loa…
juliusmarminge Sep 10, 2026
ece2ba1
feat(server): deliver delegated completions through a durable mailbox
juliusmarminge Sep 10, 2026
4cda2a5
fix(acp): support Devin terminals, questions, and native subagents
juliusmarminge Sep 10, 2026
1adcf20
fix(server): find active turns when answering async questions
juliusmarminge Sep 10, 2026
7373426
fix(web): populate sidebar ACP branding from environment settings
juliusmarminge Sep 10, 2026
e7b75b2
fix(acp): preserve native child messages and final summaries
juliusmarminge Sep 10, 2026
4b8309c
fix(server): distinguish delegated task results from completed turns
juliusmarminge Sep 10, 2026
2d5f374
test(server): align Codex delegation instruction assertion
juliusmarminge Sep 10, 2026
a33c14e
test(server): align delegation fixtures with task result semantics
juliusmarminge Sep 10, 2026
56a96aa
fix(server): classify Claude V2 structured terminal failures (#9897)
saphid Sep 10, 2026
b2c4d90
fix(orchestration): exclude rolled-back work from bounded recovery (#…
saphid Sep 10, 2026
b888f83
test(orchestration): cover bounded V2 socket fallback paging (#9907)
saphid Sep 10, 2026
9cdfb5b
fix(server): wait for native Codex start before Stop (#10024)
saphid Sep 10, 2026
2d5e3b7
fix(server): keep the native Grok default model (#10025)
saphid Sep 10, 2026
3edfbf3
fix(server): fail V2 turns when the OpenCode event stream ends (#9905)
saphid Sep 10, 2026
c4abd63
fix(web): preserve file attachments when editing queued runs (#9928)
saphid Sep 10, 2026
9705cbd
fix(server): preserve project mutation fields across transports (#9920)
saphid Sep 11, 2026
01e7868
fix(mobile): throttle streaming thread visit updates (#9931)
saphid Sep 11, 2026
aa97783
fix(orchestrator): preserve task-step elapsed time across restart (#1…
saphid Sep 11, 2026
ce7ea7f
fix(server): preserve Claude interruption status during steering
juliusmarminge Sep 11, 2026
1d6773f
fix(server): wait for nested completion delivery before publishing re…
juliusmarminge Sep 11, 2026
4acefbb
test(server): verify background delivery with real providers
juliusmarminge Sep 11, 2026
3664018
fix: keep working timers anchored to the active run
juliusmarminge Sep 11, 2026
72de4c6
perf: page complete turns and bound timeline reconciliation
juliusmarminge Sep 11, 2026
5fec8d9
perf(client): narrow thread subscriptions and navigation updates
juliusmarminge Sep 11, 2026
85f920f
feat(mobile): manage queued messages in a dedicated sheet
juliusmarminge Sep 11, 2026
3b3363a
fix(web): fold completed trailing background activity
juliusmarminge Sep 11, 2026
e41ec8e
fix: reconcile main settings and previews with orchestration v2
juliusmarminge Sep 11, 2026
fdaf631
perf(client): reconcile replay batching with orchestration v2
juliusmarminge Sep 11, 2026
f05ee1e
fix: reconcile main Codex model selection and UI updates
juliusmarminge Sep 11, 2026
f1722f1
fix: reconcile main context previews and rewind updates
juliusmarminge Sep 12, 2026
d145e4c
fix(build): include protobuf and Connect license notices
juliusmarminge Sep 12, 2026
6fb8c27
fix(mobile): pin expo-audio so the release smoke patch stays in use (…
saphid Sep 13, 2026
94fccc9
fix: reconcile main release and thread updates with V2
juliusmarminge Sep 14, 2026
fbf81d1
fix: repair v2 CI after environment disable and dead exports
juliusmarminge Sep 14, 2026
e62ce20
fix(web): update notification tests for v2 thread shells and drop dea…
juliusmarminge Sep 14, 2026
43b686a
fix(client-runtime): avoid Array#toSorted in thread lineage ordering
juliusmarminge Sep 14, 2026
8d7cec9
fix(server): reject partial output from failed Cursor runs (#11534)
saphid Sep 14, 2026
0e9cd08
fix(server): wake paused Cursor replay runs on mismatch (#11535)
saphid Sep 14, 2026
915b57f
fix(server): load V2 replay fixtures through the platform path servic…
saphid Sep 14, 2026
ff21240
fix(server): report missing interrupt-and-restart capability for forc…
saphid Sep 14, 2026
45d103d
fix(server): preserve Cursor directory and lint search results (#11533)
saphid Sep 14, 2026
8568f5e
fix(server): roll back question attachment copies when respond prepar…
saphid Sep 14, 2026
1bb16fe
fix(server): restart the live session on model changes after dead rec…
saphid Sep 14, 2026
d3af4e5
fix(server): replay launches with server-allocated thread IDs (#11508)
saphid Sep 14, 2026
3ef6fb9
fix(web): keep the active-run header with the prompt that started it …
juliusmarminge Sep 15, 2026
75ce2c2
refactor(web): centralize provider instance icons (#11829)
juliusmarminge Sep 15, 2026
c1214b2
feat(web): add the thread action menu and inline rename to the chat h…
juliusmarminge Sep 15, 2026
3bcd296
fix(web): keep the preview mini-player clear of the inline thread det…
juliusmarminge Sep 15, 2026
e1cfb4b
fix: reconcile main snooze controls with orchestration v2
juliusmarminge Sep 15, 2026
698ce39
fix(web): adapt registry icons to light and dark themes
juliusmarminge Sep 15, 2026
f609bf1
fix: reconcile main worktree setup and title changes with v2
juliusmarminge Sep 15, 2026
f0a9e4c
fix(server): isolate V2 migrations from the V1 database
juliusmarminge Sep 15, 2026
f22db8e
fix(ci): verify V2 branch pushes and remove unused helper
juliusmarminge Sep 15, 2026
2a9ff1c
revert: restore existing CI push triggers
juliusmarminge Sep 15, 2026
2b92945
fix(web): retain server-side queuing on v2 after rebase
juliusmarminge Sep 15, 2026
8b7b595
fix(test): account for optional encoded provider settings
juliusmarminge Sep 15, 2026
901d6ac
fix(server): project legacy thread shells during import
juliusmarminge Sep 15, 2026
5a73c93
fix(server): replay command events across persistence pages (#11499)
saphid Sep 15, 2026
0d8b45a
fix(orchestrator): report terminal runs after wait timeout (#11574)
saphid Sep 15, 2026
b988099
fix(server): skip corrupt scheduled-task rows instead of stopping the…
saphid Sep 15, 2026
03cf666
fix(server): preserve due schedules across equivalent time formatting…
saphid Sep 15, 2026
7515e93
test(server): replay denied Claude writes through V2 (#11597)
saphid Sep 15, 2026
446b2ce
fix(server): fork Codex threads at the native turn boundary (#11490)
saphid Sep 15, 2026
922a2bd
fix(server): align MCP delegation support with live provider adapter …
saphid Sep 15, 2026
9b83236
test(server): prove v1 to v2 cutover on a copied database and flag di…
saphid Sep 15, 2026
03f4546
fix(server): bound legacy thread projection requests (#10512)
cjavad Sep 15, 2026
51e8ae0
fix: reconcile main thread updates and Git improvements with v2
juliusmarminge Sep 15, 2026
5466013
fix(web): confine composer glass transition to input surface
juliusmarminge Sep 15, 2026
9a40704
fix(server): restore hub limits updates in V2 (#11963)
Bil0000 Sep 15, 2026
bcfd473
fix(mobile): reject preview builds from v1 source
juliusmarminge Sep 15, 2026
3790225
fix(mobile): skip preview validation without release credentials
juliusmarminge Sep 15, 2026
bc81713
fix: stop retained background work after a turn settles
juliusmarminge Sep 15, 2026
c0ef384
refactor: remove legacy token streaming
juliusmarminge Sep 15, 2026
899f507
fix: format subagent task names across clients
juliusmarminge Sep 15, 2026
43851fe
fix: distinguish unsupported server connections
juliusmarminge Sep 15, 2026
74f37a1
fix: reconcile main updates with V2 orchestration
juliusmarminge Sep 15, 2026
841da7a
fix(server): preserve PR links across V2 discovery and import
juliusmarminge Sep 16, 2026
db9ab08
fix: reconcile main monograms and PR refresh with V2
juliusmarminge Sep 16, 2026
f4cd15d
fix(web): reset thread scroll and ignore hydration as a new turn
juliusmarminge Sep 16, 2026
b29c4ee
fix(web): invert follow-up behavior with Mod+Enter
juliusmarminge Sep 16, 2026
ce2db2b
fix(web): show linked pull requests in thread details
juliusmarminge Sep 16, 2026
b386a5b
fix(web): restore main thread-switch scrolling without layout resets
juliusmarminge Sep 16, 2026
a77add5
fix: reconcile main setup transitions with V2 threads
juliusmarminge Sep 16, 2026
ff8897b
fix(mobile): keep cached thread list across relaunch
juliusmarminge Sep 16, 2026
28d046a
perf(client): coalesce persistent cache writes during streaming (#12109)
juliusmarminge Sep 16, 2026
bfd9ca7
perf(server): suppress unchanged shell enrichment refreshes (#12110)
juliusmarminge Sep 16, 2026
94c14c2
perf(mobile): skip unchanged thread row renders (#12116)
juliusmarminge Sep 16, 2026
9b372e3
perf(mobile): yield to UI during shell cache encoding (#12117)
juliusmarminge Sep 16, 2026
f1fee50
perf(client): narrow mobile and web environment subscriptions (#12126)
juliusmarminge Sep 16, 2026
a048ae9
perf(mobile): ignore irrelevant config updates in thread lists (#12127)
juliusmarminge Sep 16, 2026
d8c7df1
perf(mobile): limit thread model options to its provider (#12128)
juliusmarminge Sep 16, 2026
cab96ca
perf(client): stop scanning threads for unused shell timestamps (#12129)
juliusmarminge Sep 16, 2026
a083bcc
feat(mobile): make the composer pill the hub for the running turn
juliusmarminge Sep 16, 2026
386feae
fix: reconcile main composer and provider updates with V2
juliusmarminge Sep 16, 2026
b0d5cd2
test(server): restore Cursor usage coverage after V2 rebase
juliusmarminge Sep 16, 2026
d208423
feat(web): add compact PR checks to the workspace card (#11981)
Bil0000 Sep 16, 2026
fcc9a73
feat(web): show subagent details and history in workspace card (#12079)
Bil0000 Sep 16, 2026
8554842
fix(server): start V2 provider turn when checkpoint baseline capture …
SunkenInTime Sep 17, 2026
ba169cd
fix(server): retain durable checkpoint index fixes on v2
juliusmarminge Sep 17, 2026
4462a56
fix(server): finalize v2 runs when checkpoint ref lookup fails
juliusmarminge Sep 17, 2026
7262e01
fix(server): reject v2 file restore in shared workspaces
juliusmarminge Sep 17, 2026
d023324
fix(mobile): allow changing provider in a started thread (#12184)
juliusmarminge Sep 17, 2026
9ee0264
fix: reconcile main updates with V2 runtimes and timelines
juliusmarminge Sep 17, 2026
e6bbab6
fix: align V2 question and checkpoint timelines across clients
juliusmarminge Sep 17, 2026
c0bc4d2
fix(mobile): guard question controls during answer submission
juliusmarminge Sep 17, 2026
f0198e1
fix: adapt multi-model thread creation to V2 launches
juliusmarminge Sep 17, 2026
9390735
fix: restore V2 worktree setup transitions across clients
juliusmarminge Sep 17, 2026
aa14f7b
fix(mobile): match web provider handoff dividers
juliusmarminge Sep 17, 2026
f689e10
fix(mobile): preview queued message order during drag (#12232)
juliusmarminge Sep 17, 2026
31276a7
fix: preserve linked PRs and show them in badge tooltips (#12262)
Bil0000 Sep 17, 2026
36dcd8f
fix(orchestrator): defer queued provider handoff until delivery (#12226)
juliusmarminge Sep 17, 2026
2523c59
fix(v2): preserve running turns during provider handoff (#12255)
Bil0000 Sep 17, 2026
d2e25b7
feat(composer): attach threads as context (#12296)
juliusmarminge Sep 17, 2026
58b5692
fix: reconcile main updates and preserve V2 preview upgrades
juliusmarminge Sep 17, 2026
a98cead
fix(codex): retain V2 reasoning streams and completed traces
juliusmarminge Sep 17, 2026
0433ca2
fix(timeline): align V2 reasoning disclosures with main
juliusmarminge Sep 17, 2026
5b64837
fix(providers): enable Codex and Claude reasoning summaries in V2
juliusmarminge Sep 17, 2026
35a0423
fix(timeline): preview live reasoning and buffer complete paragraphs
juliusmarminge Sep 17, 2026
00fbb82
fix(timeline): unify worklog layout and subagent presentation
juliusmarminge Sep 17, 2026
a3b100b
fix(claude): retain requested subagent models
juliusmarminge Sep 17, 2026
e8d477a
fix(mobile): map V2 icons on Android
juliusmarminge Sep 17, 2026
c49e8fd
test(server): align replay requests with reasoning settings
juliusmarminge Sep 17, 2026
f30e235
fix(web): retain PR panel context after V2 rebase
juliusmarminge Sep 17, 2026
7edf892
test(timeline): cover current worklog interactions and fix CI
juliusmarminge Sep 17, 2026
e9c8f43
test(server): refresh reasoning expectations across replay fixtures
juliusmarminge Sep 17, 2026
aa717e1
fix(web): hide idle PR check counts and match row typography (#12321)
Bil0000 Sep 17, 2026
a65c530
fix(web): open linked PRs from the badge hover list (#12314)
Bil0000 Sep 17, 2026
c526b8d
fix(web): configure alternate send and background shortcuts (#12174)
Bil0000 Sep 18, 2026
aa21b13
fix(web): preserve main actions when rebasing v2
juliusmarminge Sep 18, 2026
c7b4862
fix(server): hand off failed and interrupted turn context
juliusmarminge Sep 18, 2026
9f1a5d0
fix(queue): preserve and hold queued messages after restart
juliusmarminge Sep 18, 2026
1f413ba
refactor(mcp): use workspace-aware thread launches
juliusmarminge Sep 18, 2026
5cefc45
fix(server): keep tool payloads out of completion queues (#12345)
juliusmarminge Sep 18, 2026
d9d6823
refactor(web): reuse worklog rows for setup and created threads (#12347)
juliusmarminge Sep 18, 2026
cd74d0e
refactor(web): centralize thread details section layout (#12348)
juliusmarminge Sep 18, 2026
653e9b9
refactor(mobile): share settings choice row defaults (#12349)
juliusmarminge Sep 18, 2026
843febf
refactor(web): share composer context labels (#12357)
juliusmarminge Sep 18, 2026
fd99488
refactor(web): reuse shared error alerts (#12361)
juliusmarminge Sep 18, 2026
6987b15
refactor(mobile): share subagent status indicators (#12367)
juliusmarminge Sep 18, 2026
01471f5
t3code/ui composition audit/worklog link variant (#12375)
juliusmarminge Sep 18, 2026
61f0d73
feat(mobile): manage scheduled tasks across environments (#12351)
juliusmarminge Sep 18, 2026
47d5be7
refactor(ui): preserve shared controls across the V2 rebase
juliusmarminge Sep 18, 2026
51f50a3
fix(v2): adapt to Effect rc.115 after rebase
juliusmarminge Sep 18, 2026
2b235dd
chore(v2): reconcile dependency lockfile after rebase
juliusmarminge Sep 18, 2026
9f681a1
fix(web): share chat width and remove stale styling
juliusmarminge Sep 18, 2026
43cd0b8
chore(marketing): remove unused duplicate screenshot
juliusmarminge Sep 18, 2026
6473e52
test(server): restore V2 transfer budgets and CI reporting
juliusmarminge Sep 18, 2026
fc4afe4
fix(server): preserve reviewed secret rollback behavior on V2
juliusmarminge Sep 18, 2026
8f2e96f
fix(web): reconcile sidebar search with V2 environment subscriptions
juliusmarminge Sep 18, 2026
37e61ce
fix(server): reconcile PR preview and checks fixtures
juliusmarminge Sep 18, 2026
3f020d8
fix(mobile): preserve merge-back action in shared thread header
juliusmarminge Sep 18, 2026
12f7c07
fix(server): unblock orchestrator CI checks
juliusmarminge Sep 18, 2026
4b27dee
fix(web): anchor turn duration below the initiating prompt
juliusmarminge Sep 18, 2026
fc77324
fix(mobile): submit v2 previews to Play closed testing
juliusmarminge Sep 18, 2026
9ae8d5c
fix(mobile): remove stale preferences type import
juliusmarminge Sep 18, 2026
871481b
fix(desktop): allow V1 and V2 to run concurrently (#12480)
juliusmarminge Sep 18, 2026
0abeb23
fix(antigravity): accept supported legacy handshake versions (#12509)
juliusmarminge Sep 18, 2026
8a4fbb8
fix(cursor): preserve SDK runtime chunks and helpers in packages (#12…
juliusmarminge Sep 18, 2026
a74d2d5
feat(server): preserve budgeted history across provider handoffs (#12…
juliusmarminge Sep 18, 2026
3609fa1
fix(server): decode v1 message events persisted with a reasoning role…
chrisdeeming Sep 18, 2026
c6d3a45
test(server): align V2 fixtures with OTLP log configuration
juliusmarminge Sep 18, 2026
29778eb
fix(acp): reconcile elicitation validation with V2 protocol compatibi…
juliusmarminge Sep 19, 2026
acefc1c
fix(server): release thread history after provider turn startup
juliusmarminge Sep 19, 2026
469872b
fix(server): avoid full transcript reads in provider run guards
juliusmarminge Sep 19, 2026
363eaef
fix(server): release delivered snapshots from live RPC streams
juliusmarminge Sep 19, 2026
94f876a
fix(shared): release successful results from completed trace spans
juliusmarminge Sep 19, 2026
8475e49
fix(v2): reconcile main cleanup and mobile device controls
juliusmarminge Sep 19, 2026
ceef777
fix(server): decode transcript tool payloads only once
juliusmarminge Sep 19, 2026
8ebaf96
fix(server): refresh completed runs without loading transcripts
juliusmarminge Sep 19, 2026
86fe1ee
fix(server): avoid transcript reloads during run completion
juliusmarminge Sep 19, 2026
dbad61b
fix(server): load targeted state when starting provider turns
juliusmarminge Sep 20, 2026
abb53e8
fix(notifications): silence subagent threads
maria-rcks Sep 19, 2026
e08a2c6
fix(preview): restore v2 sizing and project access (#12548)
juliusmarminge Sep 19, 2026
04e19ee
fix(server): settle V2 threads after linked PR merges (#12568)
Bil0000 Sep 19, 2026
cd1a25b
fix(web): show subagent models and running count in Lineage (#12491)
Bil0000 Sep 19, 2026
65f23d1
fix(web): show Auto balance in the workspace host menu (#12481)
Bil0000 Sep 19, 2026
318ab45
fix(chat): present and summarize all T3 tools (#12671)
juliusmarminge Sep 20, 2026
b4ae5d0
feat(web): list linked PRs in workspace card (#12574)
Bil0000 Sep 20, 2026
789bdf0
fix(web): make PR badge hover lists easy to click (#12378)
Bil0000 Sep 20, 2026
0f9b8e4
fix(mobile): preserve native send choices and keyboard (#12770)
juliusmarminge Sep 20, 2026
202da02
fix(server): surface actionable provider failure messages (#12560)
juliusmarminge Sep 20, 2026
df08e14
fix(web): keep workspace card action hover uniform (#12766)
Bil0000 Sep 20, 2026
2bcc91d
fix(web): stop citation popovers flying into position
juliusmarminge Sep 21, 2026
fdd897a
fix(web): hide raw image markup in queue previews (#12820)
maria-rcks Sep 21, 2026
af00d50
feat(v2): show provider limit stops as Limited (#12677)
juliusmarminge Sep 21, 2026
5e403ef
feat(v2): resume limited threads when usage resets (#12686)
juliusmarminge Sep 21, 2026
78159e5
feat(v2): snooze limited threads until usage resets (#12687)
juliusmarminge Sep 21, 2026
8ea5e50
fix(v2): keep failed turns visible in the transcript (#12783)
juliusmarminge Sep 21, 2026
d48dd8b
refactor(server): share scheduling for tasks and limit recovery (#12795)
juliusmarminge Sep 21, 2026
d8825b4
fix(v2): reconcile main UI, attachment limits, and logging fixtures
juliusmarminge Sep 21, 2026
afd4771
test(v2): align handoff fixtures with larger attachment limits
juliusmarminge Sep 21, 2026
884b543
feat(web): color handoff model names with their provider brand color …
maria-rcks Sep 21, 2026
dfe5076
refactor(web): remove the agents right panel (#12835)
maria-rcks Sep 21, 2026
bf04e02
feat(web): clearer icons for the workspace panel controls (#12838)
maria-rcks Sep 21, 2026
35a26db
feat(web): give lineage subagent hovers the thread hover card (#12842)
maria-rcks Sep 21, 2026
7e13e15
fix(v2): reconcile main composer layout and undo actions
juliusmarminge Sep 21, 2026
0bd4000
fix(v2): remove obsolete composer breakpoint animation
juliusmarminge Sep 21, 2026
67b0879
fix(server): avoid transcript reads when checking run interrupts
juliusmarminge Sep 21, 2026
884bca3
fix(server): replace unnecessary full projection reads
juliusmarminge Sep 21, 2026
dda3b6c
perf(pr): reduce quota use when refreshing workspace checks (#12442)
Bil0000 Sep 21, 2026
89bc709
test(v2): expose scoped reads in provider replay harness
juliusmarminge Sep 21, 2026
71ebfd9
fix(server): recover Pi resumes without reusing native history (#12933)
juliusmarminge Sep 21, 2026
374e671
fix(settings): restore V2 controls and shared settings layout
juliusmarminge Sep 21, 2026
ce4704b
feat(web): edit the last queued message with Option+Up (#12599)
jakeleventhal Sep 21, 2026
43608fb
fix(web): edit automations from thread details (#12408)
saphid Sep 21, 2026
592da4a
fix(server): preserve provider history across repeated rollbacks (#12…
Derpedyea Sep 21, 2026
cf3ce8a
fix(server): start ACP MCP bridge in self-contained runtime (#12747)
pekth Sep 21, 2026
7ab5239
fix(server): launch contained ACP providers from packaged runtimes (#…
pekth Sep 21, 2026
4f7e998
fix(web): restore sidebar order during thread context drags
juliusmarminge Sep 21, 2026
115c2c3
refactor(server): resolve self invocations through one shared helper …
juliusmarminge Sep 21, 2026
f7d371b
perf(server): stop decoding unrelated events during startup (#12846)
extoci Sep 21, 2026
5c3435a
perf(server): stop maintaining redundant projection indexes (#12847)
extoci Sep 21, 2026
b24e920
feat(cursor): support browser login for the agent SDK (#12948)
Yash-Singh1 Sep 21, 2026
07c320f
fix(server): fail V2 runs when provider sessions cannot open (#12790)
pekth Sep 21, 2026
e6c4d79
fix(server): fail runs when provider startup preparation fails (#12409)
saphid Sep 21, 2026
7c51516
fix(server): select an available provider for delegated tasks (#11870)
saphid Sep 21, 2026
08ae67b
feat(web): show a turn's subagents as one collapsible card (#12839)
maria-rcks Sep 21, 2026
397ffd7
feat(mobile): show subagents in a collapsible card (#12961)
juliusmarminge Sep 22, 2026
6f61a75
fix(chat): link agent attribution to its source thread (#12971)
juliusmarminge Sep 22, 2026
18b6803
fix(orchestration): settle subagent statuses and activation timers (#…
juliusmarminge Sep 22, 2026
6f1441e
fix(server): retry provider session opens before failing the run (#13…
t3dotgg Sep 22, 2026
03ade16
feat(auth): share provider sign-in flows across clients (#12965)
juliusmarminge Sep 22, 2026
9861acf
refactor(cursor): use shared provider account setup and storage (#12966)
juliusmarminge Sep 22, 2026
7a48903
feat(acp): connect registry providers to shared sign-in flows (#12967)
juliusmarminge Sep 22, 2026
0b195f0
fix(v2): reconcile main settings, auth, and shared controls
juliusmarminge Sep 23, 2026
9fa99e1
fix(v2): preserve main scroll fixes and mobile module boundaries
juliusmarminge Sep 23, 2026
1644ad9
fix(v2): hidden automatic queued runs no longer block settling a thread
juliusmarminge Sep 23, 2026
7ab1ad1
fix(v2): reconcile main mobile lists and provider compatibility
juliusmarminge Sep 23, 2026
3795ad6
fix(v2): reconcile main shared controls and render recovery
juliusmarminge Sep 23, 2026
91b695c
fix(v2): remove stale panel styling exports
juliusmarminge Sep 23, 2026
b5f6c37
feat(web): integrate responsive chat and thread details
juliusmarminge Sep 23, 2026
589cd8a
feat(v2): make worktree branch naming configurable (#13294)
juliusmarminge Sep 23, 2026
99e5bfe
fix(orchestrator): Steer compatible active model selections
mwolson Sep 23, 2026
189b969
fix(orchestrator): Safely admit execution after uncertain selection
mwolson Sep 24, 2026
c465006
fix(server): Bind SQLite recovery flags as numbers
mwolson Sep 23, 2026
d57667b
fix(mobile): Ignore child-only history in Home empty state
mwolson Sep 24, 2026
db114d2
fix(mobile): Label background work as Waiting
mwolson Sep 24, 2026
53440ee
fix(mobile): Surface response fork failures
mwolson Sep 24, 2026
32457c5
fix(mobile): Import legacy model options without replacing choices
mwolson Sep 24, 2026
c701479
fix(clients): Present legacy wakes as notifications
mwolson Sep 24, 2026
e7f2a57
feat(server): Add OpenCode 2 transport runtime
mwolson Sep 25, 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
5 changes: 2 additions & 3 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 @@ -34,9 +35,6 @@ const makeDesktopClerkLayer = (isDevelopment = true, events: string[] = []) => {
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("/") },
} as unknown as DesktopEnvironment.DesktopEnvironment["Service"]);

const electronApp = {
Expand All @@ -49,6 +47,7 @@ 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) }),
Expand Down
11 changes: 3 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,8 @@ 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.
const userDataPath = yield* DesktopUserData.resolveUserDataPath(environment);
yield* electronApp.setPath("userData", userDataPath);

const bridge = yield* Effect.acquireRelease(
Expand Down
6 changes: 0 additions & 6 deletions apps/desktop/src/app/DesktopEnvironment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,6 @@ export class DesktopEnvironment extends Context.Service<
readonly linuxWmClass: string;
readonly linuxApplicationsDir: string;
readonly appImagePath: Option.Option<string>;
readonly userDataDirName: string;
readonly legacyUserDataDirName: string;
readonly defaultDesktopSettings: DesktopAppSettings.DesktopSettings;
readonly runtimeInfo: DesktopRuntimeInfo;
readonly resolvePickFolderDefaultPath: (rawOptions: unknown) => Option.Option<string>;
Expand Down Expand Up @@ -186,8 +184,6 @@ const make = Effect.fn("desktop.environment.make")(function* (
joinPath: path.join,
t3Home: config.t3Home,
});
const userDataDirName = isDevelopment ? "t3code-dev" : "t3code";
const legacyUserDataDirName = isDevelopment ? "T3 Code (Dev)" : "T3 Code (Alpha)";
const linuxApplicationsDir = path.join(
Option.getOrElse(config.xdgDataHome, () => path.join(homeDirectory, ".local", "share")),
"applications",
Expand Down Expand Up @@ -243,8 +239,6 @@ const make = Effect.fn("desktop.environment.make")(function* (
linuxWmClass: isDevelopment ? "t3code-dev" : "t3code",
linuxApplicationsDir,
appImagePath: config.appImagePath,
userDataDirName,
legacyUserDataDirName,
defaultDesktopSettings: DesktopAppSettings.resolveDefaultDesktopSettings(input.appVersion),
runtimeInfo: resolveDesktopRuntimeInfo({
platform: input.platform,
Expand Down
32 changes: 32 additions & 0 deletions apps/desktop/src/app/DesktopLinuxUrlHandler.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -124,9 +124,41 @@ describe("DesktopLinuxUrlHandler", () => {
);
assert.include(entry, "NoDisplay=true");
assert.notInclude(entry, "StartupWMClass=");
assert.include(entry, "Icon=t3code");
assert.include(entry, "MimeType=x-scheme-handler/t3code;");
});

it("installs packaged t3code icons under the Icon name and Wayland app id", () => {
const operations = DesktopLinuxUrlHandler.linuxDesktopIconInstallOperations({
packagedHicolorRoot: "/tmp/.mount_app/usr/share/icons/hicolor",
dataHome: "/home/alice/.local/share",
desktopEntryName: "com.t3tools.T3Code.desktop",
});

assert.deepEqual(operations, [
{
sourcePath: "/tmp/.mount_app/usr/share/icons/hicolor/256x256/apps/t3code.png",
targetPath: "/home/alice/.local/share/icons/hicolor/256x256/apps/t3code.png",
},
{
sourcePath: "/tmp/.mount_app/usr/share/icons/hicolor/256x256/apps/t3code.png",
targetPath: "/home/alice/.local/share/icons/hicolor/256x256/apps/com.t3tools.t3code.png",
},
]);
});

it("uses lowercase icon names only, even when the desktop id is mixed-case", () => {
assert.deepEqual(DesktopLinuxUrlHandler.linuxDesktopIconNames("t3code.desktop"), ["t3code"]);
assert.deepEqual(DesktopLinuxUrlHandler.linuxDesktopIconNames("com.t3tools.T3Code.desktop"), [
"t3code",
"com.t3tools.t3code",
]);
assert.deepEqual(
DesktopLinuxUrlHandler.linuxDesktopIconNames("com.t3tools.T3Code.Development.desktop"),
["t3code", "com.t3tools.t3code.development"],
);
});

it("carries structured context on registration errors", () => {
const writeError = new DesktopLinuxUrlHandler.DesktopLinuxUrlHandlerRegistrationError({
step: "write-desktop-entry",
Expand Down
Loading