Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
573 commits
Select commit Hold shift + click to select a range
694dd74
fix: reconcile main's round-17 features after the rebase
juliusmarminge Sep 1, 2026
8f40322
feat(web): port working and thinking timeline rows to orchestration v2
juliusmarminge Sep 1, 2026
4aa0890
fix: reconcile main's round-18 features after the rebase
juliusmarminge Sep 2, 2026
60a4795
feat(server): evaluate automatic thread settlement in the v2 orchestr…
juliusmarminge Sep 2, 2026
2f029f5
fix: reconcile main's round-19 features after the rebase
juliusmarminge Sep 2, 2026
4c19d95
fix(web): right-align the stash shoulder tab again
juliusmarminge Sep 2, 2026
bfd1461
fix(web): realign the composer and timeline with main
juliusmarminge Sep 2, 2026
c74e610
fix: reconcile main's round-20 features after the rebase
juliusmarminge Sep 2, 2026
d13ba55
fix(server): reduce v2 recovery and runtime resource usage
juliusmarminge Sep 4, 2026
98e0428
fix: reconcile main updates with orchestration v2
juliusmarminge Sep 4, 2026
9f6df3c
fix(orchestration): stabilize Codex turn mapping and settlement
juliusmarminge Sep 4, 2026
f0d83fd
fix(chat): match main timer and task placement
juliusmarminge Sep 4, 2026
2c84b8c
fix(mobile): restore composer and timeline behavior from main
juliusmarminge Sep 4, 2026
ecc279e
fix(orchestrator): Stop treating a wait timeout as a dead child (#7427)
mwolson Sep 4, 2026
1788cfc
fix(orchestrator): Show when a completed delegated child still has wo…
mwolson Sep 4, 2026
5678698
fix(orchestrator): Stop finished Codex turns from sitting on Waiting …
mwolson Sep 4, 2026
2dd759a
chore: format v2 files flagged by CI
juliusmarminge Sep 4, 2026
42b7286
test(server): include the shell indexes migration
juliusmarminge Sep 4, 2026
c7ed38e
fix(client-runtime): resolve work log source imports
juliusmarminge Sep 4, 2026
3fce7bf
test(server): refresh replay runtime instruction expectations
juliusmarminge Sep 4, 2026
014898e
test(server): correlate OpenCode replay message identities
juliusmarminge Sep 4, 2026
1c3b2dd
ci: run checks on v2 branch pushes
juliusmarminge Sep 4, 2026
f0e829c
test(server): use Effect Vitest for Cursor provider checks
juliusmarminge Sep 4, 2026
d3fbffd
fix: reconcile main updates with orchestration v2
juliusmarminge Sep 5, 2026
18941d2
fix(server): explain fetch failures during worktree preparation
juliusmarminge Sep 5, 2026
f1d05b1
fix: reconcile upstream fixes with orchestration v2
juliusmarminge Sep 5, 2026
95546b1
fix(server): make project removal honor v2 threads
juliusmarminge Sep 5, 2026
94d6036
fix(mobile): render generic message attachments (#9929)
saphid Sep 5, 2026
7bef663
fix(mobile): use the archive eligibility guard when dispatching (#9930)
saphid Sep 5, 2026
a3733a3
fix(orchestration): persist linked pull requests (#8689)
juliusmarminge Sep 6, 2026
d7780db
feat(mcp): update thread metadata (#8690)
juliusmarminge Sep 6, 2026
2e79053
fix(server): keep old failures from waking snoozed V2 threads (#9903)
saphid Sep 6, 2026
557e287
refactor(shared): share model-selection command choice (#10577)
juliusmarminge Sep 7, 2026
138d8c9
refactor(project): share create and update inputs (#10578)
juliusmarminge Sep 7, 2026
eb59dd0
refactor(server): share attachment message intake (#10580)
juliusmarminge Sep 7, 2026
55b3edf
feat(mcp): expose thread organization commands (#10554)
juliusmarminge Sep 7, 2026
1672b51
feat(mcp): expose existing queued message commands (#10555)
juliusmarminge Sep 7, 2026
2824c6a
feat(mcp): expose pending user questions (#10556)
juliusmarminge Sep 7, 2026
43cd17c
feat(mcp): expose thread model selection (#10557)
juliusmarminge Sep 7, 2026
e313907
feat(mcp): expose fork and merge-back commands (#10558)
juliusmarminge Sep 7, 2026
255f340
feat(mcp): expose preview list and close (#10559)
juliusmarminge Sep 7, 2026
7d3120c
feat(mcp): expose selected environment preferences (#10560)
juliusmarminge Sep 7, 2026
02867c3
feat(mcp): expose the existing thread search query (#10561)
juliusmarminge Sep 7, 2026
8791aef
feat(mcp): expose scheduled task run-now (#10562)
juliusmarminge Sep 7, 2026
639b23c
feat(mcp): expose project service operations (#10563)
juliusmarminge Sep 7, 2026
d5eba76
feat(mcp): expose attachment upload and send (#10564)
juliusmarminge Sep 7, 2026
08a23de
feat(mcp): expose project thread launch service (#10565)
juliusmarminge Sep 7, 2026
42df574
feat(mcp): expose branch-backed workspace discovery (#10566)
juliusmarminge Sep 7, 2026
1a62360
fix(orchestration): map late steering to follow-up turns
juliusmarminge Sep 6, 2026
2677913
fix: reconcile main's round-24 features after the rebase
juliusmarminge Sep 8, 2026
056862f
chore: remove accidentally committed audit artifacts
juliusmarminge Sep 8, 2026
b8fc682
fix(ci): repair rebased checks and stop duplicate runs
juliusmarminge Sep 8, 2026
812ea99
fix(web): port auto-balance updates to v2 chat
juliusmarminge Sep 8, 2026
11d9956
chore: format files exposed by CI
juliusmarminge Sep 8, 2026
a11f239
fix: reconcile main's round-26 updates after rebase
juliusmarminge Sep 8, 2026
361c98e
fix(web): restore compact load-earlier control
juliusmarminge Sep 8, 2026
27af8af
perf(orchestration): bound v2 transport payloads
juliusmarminge Sep 9, 2026
73efe6b
fix(web): preserve tool failures after output redaction
juliusmarminge Sep 9, 2026
d33be21
fix: restore sidebar behavior after v2 rebases
juliusmarminge Sep 9, 2026
1827a13
fix(server): consolidate V2 migrations and refine runtime recovery
juliusmarminge Sep 9, 2026
9043faf
fix(web): simplify timeline rows and preserve collapsed composer cont…
juliusmarminge Sep 9, 2026
a60c568
fix(web): smooth composer transitions and group approval worklogs
juliusmarminge Sep 9, 2026
c3c0648
fix: reconcile main updates with orchestration v2
juliusmarminge Sep 9, 2026
8168fdb
fix(server): report OpenCode descendant stop failures
juliusmarminge Sep 9, 2026
30065fe
fix(server): abort external OpenCode sessions on release
juliusmarminge Sep 9, 2026
1f25e45
fix(server): retain thread baseline diffs across root runs
juliusmarminge Sep 9, 2026
293cc45
fix(server): fail OpenCode turns on unexpected stream EOF
juliusmarminge Sep 9, 2026
4e0d82d
fix(server): bound OpenCode runtime request replies
juliusmarminge Sep 9, 2026
88e122f
fix(client): bound socket resets after cold HTTP failures
juliusmarminge Sep 9, 2026
f26add4
fix(server): query only due scheduled tasks during polling
juliusmarminge Sep 9, 2026
589dd8f
fix(server): retain normalized OpenCode turn usage
juliusmarminge Sep 9, 2026
c410619
perf(server): scope ordinary control reads to their targets
juliusmarminge Sep 9, 2026
02fdc89
fix(server): retry initial title generation after transient failures
juliusmarminge Sep 9, 2026
fb72b91
fix(server): isolate Cursor metadata generation from workspaces
juliusmarminge Sep 9, 2026
a5d4d78
fix(server): preserve Claude Read image previews across clients
juliusmarminge Sep 9, 2026
0b469ec
fix(web): preserve generic files when editing queued messages
juliusmarminge Sep 9, 2026
86f4af1
test(server): assert tool output redaction before storage fidelity
juliusmarminge Sep 9, 2026
f41ca12
test(web): cancel queued animation frames during worker cleanup (#10880)
saphid Sep 9, 2026
178bd00
fix: reconcile main devices and pull requests with orchestration v2
juliusmarminge Sep 10, 2026
03e5811
feat(providers): add Pi coding agent (#7211)
StiensWout Sep 10, 2026
ffc2c36
feat(providers): standardize ACP providers (#6461)
StiensWout Sep 10, 2026
9490369
feat: render background completions as typed notifications
juliusmarminge Sep 10, 2026
f8ffb60
fix(mcp): omit recursive screenshot metadata from tool inputs
juliusmarminge Sep 10, 2026
d13f225
fix(pi): use native forks and preserve rollback session identity
juliusmarminge Sep 10, 2026
bcb2c7d
fix(pi): cap OpenRouter output budgets pending upstream fix
juliusmarminge Sep 10, 2026
5691280
fix(web): show ACP sidebar icons and hold onboarding height while loa…
juliusmarminge Sep 10, 2026
4b140d1
feat(server): deliver delegated completions through a durable mailbox
juliusmarminge Sep 10, 2026
c0ca52d
fix(acp): support Devin terminals, questions, and native subagents
juliusmarminge Sep 10, 2026
3ff5108
fix(server): find active turns when answering async questions
juliusmarminge Sep 10, 2026
3488bb4
fix(web): populate sidebar ACP branding from environment settings
juliusmarminge Sep 10, 2026
aac0a93
fix(acp): preserve native child messages and final summaries
juliusmarminge Sep 10, 2026
25bc61a
fix(server): distinguish delegated task results from completed turns
juliusmarminge Sep 10, 2026
9653dda
test(server): align Codex delegation instruction assertion
juliusmarminge Sep 10, 2026
5b99737
test(server): align delegation fixtures with task result semantics
juliusmarminge Sep 10, 2026
2eecdb6
fix(server): classify Claude V2 structured terminal failures (#9897)
saphid Sep 10, 2026
1f8f4c4
fix(orchestration): exclude rolled-back work from bounded recovery (#…
saphid Sep 10, 2026
b370b95
test(orchestration): cover bounded V2 socket fallback paging (#9907)
saphid Sep 10, 2026
a54e97c
fix(server): wait for native Codex start before Stop (#10024)
saphid Sep 10, 2026
94fb505
fix(server): keep the native Grok default model (#10025)
saphid Sep 10, 2026
7e11ea7
fix(server): fail V2 turns when the OpenCode event stream ends (#9905)
saphid Sep 10, 2026
555bbb4
fix(web): preserve file attachments when editing queued runs (#9928)
saphid Sep 10, 2026
c0378c5
fix(server): preserve project mutation fields across transports (#9920)
saphid Sep 11, 2026
a3ea73e
fix(mobile): throttle streaming thread visit updates (#9931)
saphid Sep 11, 2026
ef3a17e
fix(orchestrator): preserve task-step elapsed time across restart (#1…
saphid Sep 11, 2026
1507704
fix(server): preserve Claude interruption status during steering
juliusmarminge Sep 11, 2026
7979aa2
fix(server): wait for nested completion delivery before publishing re…
juliusmarminge Sep 11, 2026
d0832dc
test(server): verify background delivery with real providers
juliusmarminge Sep 11, 2026
32d61f3
fix: keep working timers anchored to the active run
juliusmarminge Sep 11, 2026
f7adb9c
perf: page complete turns and bound timeline reconciliation
juliusmarminge Sep 11, 2026
0e70e89
perf(client): narrow thread subscriptions and navigation updates
juliusmarminge Sep 11, 2026
10cf846
feat(mobile): manage queued messages in a dedicated sheet
juliusmarminge Sep 11, 2026
98cc661
fix(web): fold completed trailing background activity
juliusmarminge Sep 11, 2026
f2fbd46
fix: reconcile main settings and previews with orchestration v2
juliusmarminge Sep 11, 2026
03f045b
perf(client): reconcile replay batching with orchestration v2
juliusmarminge Sep 11, 2026
ee0b8b8
fix: reconcile main Codex model selection and UI updates
juliusmarminge Sep 11, 2026
fb77618
fix: reconcile main context previews and rewind updates
juliusmarminge Sep 12, 2026
81c0b54
fix(build): include protobuf and Connect license notices
juliusmarminge Sep 12, 2026
62b92a5
fix(mobile): pin expo-audio so the release smoke patch stays in use (…
saphid Sep 13, 2026
0df3a5c
fix: reconcile main release and thread updates with V2
juliusmarminge Sep 14, 2026
cc6942f
fix: repair v2 CI after environment disable and dead exports
juliusmarminge Sep 14, 2026
e8d371c
fix(web): update notification tests for v2 thread shells and drop dea…
juliusmarminge Sep 14, 2026
c0bb2cd
fix(client-runtime): avoid Array#toSorted in thread lineage ordering
juliusmarminge Sep 14, 2026
0fa39ab
fix(server): reject partial output from failed Cursor runs (#11534)
saphid Sep 14, 2026
207832c
fix(server): wake paused Cursor replay runs on mismatch (#11535)
saphid Sep 14, 2026
33985d2
fix(server): load V2 replay fixtures through the platform path servic…
saphid Sep 14, 2026
486aede
fix(server): report missing interrupt-and-restart capability for forc…
saphid Sep 14, 2026
36ece27
fix(server): preserve Cursor directory and lint search results (#11533)
saphid Sep 14, 2026
28ab34e
fix(server): roll back question attachment copies when respond prepar…
saphid Sep 14, 2026
794e0da
fix(server): restart the live session on model changes after dead rec…
saphid Sep 14, 2026
01e736a
fix(server): replay launches with server-allocated thread IDs (#11508)
saphid Sep 14, 2026
5a71add
fix(web): keep the active-run header with the prompt that started it …
juliusmarminge Sep 15, 2026
ed02842
refactor(web): centralize provider instance icons (#11829)
juliusmarminge Sep 15, 2026
a99358f
feat(web): add the thread action menu and inline rename to the chat h…
juliusmarminge Sep 15, 2026
7ffb74b
fix(web): keep the preview mini-player clear of the inline thread det…
juliusmarminge Sep 15, 2026
66242bf
fix: reconcile main snooze controls with orchestration v2
juliusmarminge Sep 15, 2026
efa9668
fix(web): adapt registry icons to light and dark themes
juliusmarminge Sep 15, 2026
8171864
fix: reconcile main worktree setup and title changes with v2
juliusmarminge Sep 15, 2026
93288db
fix(server): isolate V2 migrations from the V1 database
juliusmarminge Sep 15, 2026
fa7c680
fix(ci): verify V2 branch pushes and remove unused helper
juliusmarminge Sep 15, 2026
66ed9dd
revert: restore existing CI push triggers
juliusmarminge Sep 15, 2026
079b24f
fix(web): retain server-side queuing on v2 after rebase
juliusmarminge Sep 15, 2026
ed8b949
fix(test): account for optional encoded provider settings
juliusmarminge Sep 15, 2026
4281c83
fix(server): project legacy thread shells during import
juliusmarminge Sep 15, 2026
c94cdd7
fix(server): replay command events across persistence pages (#11499)
saphid Sep 15, 2026
eba9ff5
fix(orchestrator): report terminal runs after wait timeout (#11574)
saphid Sep 15, 2026
3ff021f
fix(server): skip corrupt scheduled-task rows instead of stopping the…
saphid Sep 15, 2026
6a23876
fix(server): preserve due schedules across equivalent time formatting…
saphid Sep 15, 2026
bf920c5
test(server): replay denied Claude writes through V2 (#11597)
saphid Sep 15, 2026
1be77bf
fix(server): fork Codex threads at the native turn boundary (#11490)
saphid Sep 15, 2026
a2a0478
fix(server): align MCP delegation support with live provider adapter …
saphid Sep 15, 2026
9470674
test(server): prove v1 to v2 cutover on a copied database and flag di…
saphid Sep 15, 2026
8b9529d
fix(server): bound legacy thread projection requests (#10512)
cjavad Sep 15, 2026
9cea2da
fix: reconcile main thread updates and Git improvements with v2
juliusmarminge Sep 15, 2026
1151213
fix(web): confine composer glass transition to input surface
juliusmarminge Sep 15, 2026
853cdc9
fix(server): restore hub limits updates in V2 (#11963)
Bil0000 Sep 15, 2026
6e72f27
fix(mobile): reject preview builds from v1 source
juliusmarminge Sep 15, 2026
77cde72
fix(mobile): skip preview validation without release credentials
juliusmarminge Sep 15, 2026
eb84283
fix: stop retained background work after a turn settles
juliusmarminge Sep 15, 2026
19cc447
refactor: remove legacy token streaming
juliusmarminge Sep 15, 2026
d9474d1
fix: format subagent task names across clients
juliusmarminge Sep 15, 2026
4e1c869
fix: distinguish unsupported server connections
juliusmarminge Sep 15, 2026
92ba707
fix: reconcile main updates with V2 orchestration
juliusmarminge Sep 15, 2026
d7c1891
fix(server): preserve PR links across V2 discovery and import
juliusmarminge Sep 16, 2026
74cba7f
fix: reconcile main monograms and PR refresh with V2
juliusmarminge Sep 16, 2026
029997b
fix(web): reset thread scroll and ignore hydration as a new turn
juliusmarminge Sep 16, 2026
a85b2eb
fix(web): invert follow-up behavior with Mod+Enter
juliusmarminge Sep 16, 2026
13d8166
fix(web): show linked pull requests in thread details
juliusmarminge Sep 16, 2026
2031bb0
fix(web): restore main thread-switch scrolling without layout resets
juliusmarminge Sep 16, 2026
e728f5d
fix: reconcile main setup transitions with V2 threads
juliusmarminge Sep 16, 2026
22ee8a3
fix(mobile): keep cached thread list across relaunch
juliusmarminge Sep 16, 2026
39d8fd6
perf(client): coalesce persistent cache writes during streaming (#12109)
juliusmarminge Sep 16, 2026
1e3ad3d
perf(server): suppress unchanged shell enrichment refreshes (#12110)
juliusmarminge Sep 16, 2026
84f5fa4
perf(mobile): skip unchanged thread row renders (#12116)
juliusmarminge Sep 16, 2026
67488f5
perf(mobile): yield to UI during shell cache encoding (#12117)
juliusmarminge Sep 16, 2026
2c27bee
perf(client): narrow mobile and web environment subscriptions (#12126)
juliusmarminge Sep 16, 2026
7f08731
perf(mobile): ignore irrelevant config updates in thread lists (#12127)
juliusmarminge Sep 16, 2026
49849aa
perf(mobile): limit thread model options to its provider (#12128)
juliusmarminge Sep 16, 2026
8bc2316
perf(client): stop scanning threads for unused shell timestamps (#12129)
juliusmarminge Sep 16, 2026
9f1a676
feat(mobile): make the composer pill the hub for the running turn
juliusmarminge Sep 16, 2026
93aec3a
fix: reconcile main composer and provider updates with V2
juliusmarminge Sep 16, 2026
769616d
test(server): restore Cursor usage coverage after V2 rebase
juliusmarminge Sep 16, 2026
d48f147
feat(web): add compact PR checks to the workspace card (#11981)
Bil0000 Sep 16, 2026
b9a9d87
feat(web): show subagent details and history in workspace card (#12079)
Bil0000 Sep 16, 2026
2f3c9ff
fix(server): start V2 provider turn when checkpoint baseline capture …
SunkenInTime Sep 17, 2026
cf46e63
fix(server): retain durable checkpoint index fixes on v2
juliusmarminge Sep 17, 2026
30a99a1
fix(server): finalize v2 runs when checkpoint ref lookup fails
juliusmarminge Sep 17, 2026
49c1030
fix(server): reject v2 file restore in shared workspaces
juliusmarminge Sep 17, 2026
116486c
fix(mobile): allow changing provider in a started thread (#12184)
juliusmarminge Sep 17, 2026
dc5b170
fix: reconcile main updates with V2 runtimes and timelines
juliusmarminge Sep 17, 2026
6dd9760
fix: align V2 question and checkpoint timelines across clients
juliusmarminge Sep 17, 2026
f5fac70
fix(mobile): guard question controls during answer submission
juliusmarminge Sep 17, 2026
6f7f418
fix: adapt multi-model thread creation to V2 launches
juliusmarminge Sep 17, 2026
a545546
fix: restore V2 worktree setup transitions across clients
juliusmarminge Sep 17, 2026
c8179ea
fix(mobile): match web provider handoff dividers
juliusmarminge Sep 17, 2026
ddec323
fix(mobile): preview queued message order during drag (#12232)
juliusmarminge Sep 17, 2026
501c304
fix: preserve linked PRs and show them in badge tooltips (#12262)
Bil0000 Sep 17, 2026
1a40e26
fix(orchestrator): defer queued provider handoff until delivery (#12226)
juliusmarminge Sep 17, 2026
75ff941
fix(v2): preserve running turns during provider handoff (#12255)
Bil0000 Sep 17, 2026
25d3879
feat(composer): attach threads as context (#12296)
juliusmarminge Sep 17, 2026
34b88c3
fix: reconcile main updates and preserve V2 preview upgrades
juliusmarminge Sep 17, 2026
0b6ce3c
fix(codex): retain V2 reasoning streams and completed traces
juliusmarminge Sep 17, 2026
8fb64a1
fix(timeline): align V2 reasoning disclosures with main
juliusmarminge Sep 17, 2026
2322752
fix(providers): enable Codex and Claude reasoning summaries in V2
juliusmarminge Sep 17, 2026
0ebcfb2
fix(timeline): preview live reasoning and buffer complete paragraphs
juliusmarminge Sep 17, 2026
ec7f7e0
fix(timeline): unify worklog layout and subagent presentation
juliusmarminge Sep 17, 2026
5f45f1c
fix(claude): retain requested subagent models
juliusmarminge Sep 17, 2026
8914d1a
fix(mobile): map V2 icons on Android
juliusmarminge Sep 17, 2026
586b136
test(server): align replay requests with reasoning settings
juliusmarminge Sep 17, 2026
8ee0ce1
fix(web): retain PR panel context after V2 rebase
juliusmarminge Sep 17, 2026
781b0f6
test(timeline): cover current worklog interactions and fix CI
juliusmarminge Sep 17, 2026
f1c4223
test(server): refresh reasoning expectations across replay fixtures
juliusmarminge Sep 17, 2026
947044d
fix(web): hide idle PR check counts and match row typography (#12321)
Bil0000 Sep 17, 2026
ac7b945
fix(web): open linked PRs from the badge hover list (#12314)
Bil0000 Sep 17, 2026
8cb689b
fix(web): configure alternate send and background shortcuts (#12174)
Bil0000 Sep 18, 2026
f74a62f
fix(web): preserve main actions when rebasing v2
juliusmarminge Sep 18, 2026
76af3e3
fix(server): hand off failed and interrupted turn context
juliusmarminge Sep 18, 2026
6c9d827
fix(queue): preserve and hold queued messages after restart
juliusmarminge Sep 18, 2026
49cf1b1
refactor(mcp): use workspace-aware thread launches
juliusmarminge Sep 18, 2026
8ffd8f5
fix(server): keep tool payloads out of completion queues (#12345)
juliusmarminge Sep 18, 2026
74f5f18
refactor(web): reuse worklog rows for setup and created threads (#12347)
juliusmarminge Sep 18, 2026
9db3a3f
refactor(web): centralize thread details section layout (#12348)
juliusmarminge Sep 18, 2026
42c7be3
refactor(mobile): share settings choice row defaults (#12349)
juliusmarminge Sep 18, 2026
e0781bb
refactor(web): share composer context labels (#12357)
juliusmarminge Sep 18, 2026
b288461
refactor(web): reuse shared error alerts (#12361)
juliusmarminge Sep 18, 2026
769fcf0
refactor(mobile): share subagent status indicators (#12367)
juliusmarminge Sep 18, 2026
7a2b55d
t3code/ui composition audit/worklog link variant (#12375)
juliusmarminge Sep 18, 2026
c2466da
feat(mobile): manage scheduled tasks across environments (#12351)
juliusmarminge Sep 18, 2026
4f96d42
refactor(ui): preserve shared controls across the V2 rebase
juliusmarminge Sep 18, 2026
8b35035
fix(v2): adapt to Effect rc.115 after rebase
juliusmarminge Sep 18, 2026
e25a249
chore(v2): reconcile dependency lockfile after rebase
juliusmarminge Sep 18, 2026
a6d9acc
fix(web): share chat width and remove stale styling
juliusmarminge Sep 18, 2026
efed7e6
chore(marketing): remove unused duplicate screenshot
juliusmarminge Sep 18, 2026
d43efb8
test(server): restore V2 transfer budgets and CI reporting
juliusmarminge Sep 18, 2026
4e55f25
fix(server): preserve reviewed secret rollback behavior on V2
juliusmarminge Sep 18, 2026
921dc87
fix(web): reconcile sidebar search with V2 environment subscriptions
juliusmarminge Sep 18, 2026
56a9c87
fix(server): reconcile PR preview and checks fixtures
juliusmarminge Sep 18, 2026
ac7468a
fix(mobile): preserve merge-back action in shared thread header
juliusmarminge Sep 18, 2026
76fdadd
fix(server): unblock orchestrator CI checks
juliusmarminge Sep 18, 2026
162b2ca
fix(web): anchor turn duration below the initiating prompt
juliusmarminge Sep 18, 2026
68224fa
fix(mobile): submit v2 previews to Play closed testing
juliusmarminge Sep 18, 2026
371757e
fix(mobile): remove stale preferences type import
juliusmarminge Sep 18, 2026
8bacaf3
fix(desktop): allow V1 and V2 to run concurrently (#12480)
juliusmarminge Sep 18, 2026
3d212e4
fix(antigravity): accept supported legacy handshake versions (#12509)
juliusmarminge Sep 18, 2026
d6df3fe
fix(cursor): preserve SDK runtime chunks and helpers in packages (#12…
juliusmarminge Sep 18, 2026
e56b79e
feat(server): preserve budgeted history across provider handoffs (#12…
juliusmarminge Sep 18, 2026
49357d0
fix(server): decode v1 message events persisted with a reasoning role…
chrisdeeming Sep 18, 2026
9cdec02
test(server): align V2 fixtures with OTLP log configuration
juliusmarminge Sep 18, 2026
9b4fd10
fix(acp): reconcile elicitation validation with V2 protocol compatibi…
juliusmarminge Sep 19, 2026
0bbfb00
fix(server): make scheduled-task edits atomic
github-actions[bot] Sep 19, 2026
a2a6ef7
fix(server): scheduler writes no longer overwrite concurrent task edits
github-actions[bot] Sep 19, 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 @@ -125,13 +126,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 @@ -146,20 +148,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 @@ -173,15 +191,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
Loading
Loading