Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
928 commits
Select commit Hold shift + click to select a range
7ec2cf9
fix: port main fixes stranded by the v2 rewrite
juliusmarminge Aug 5, 2026
20fd2f1
test(server): align migration expectations with renumbered ids
juliusmarminge Aug 5, 2026
77ef406
feat(orchestrator): Surface waiting background work (#4378)
mwolson Aug 5, 2026
608ed03
fix(web): align git action progress button layout
juliusmarminge Aug 6, 2026
818f7ca
fix: repair conflict-marker artifacts from rebase auto-resolutions
juliusmarminge Aug 7, 2026
c839f7f
fix(server): renumber v2 migrations after main's 037_ProjectionTurnsK…
juliusmarminge Aug 7, 2026
cf53c4d
fix: port main fixes stranded by the v2 rewrite (round 2)
juliusmarminge Aug 7, 2026
8d83b71
chore(web): prune plan-sidebar leftovers after the inline-plans rework
juliusmarminge Aug 7, 2026
ad0177d
fix(web): port the refined live-follow gesture gating to the v2 timeline
juliusmarminge Aug 7, 2026
0ccb0fa
fix(web): let LegendList own end-follow and disclosure anchoring (#5449)
juliusmarminge Aug 7, 2026
5b1d528
fix(web): show Git action success inline in panel
juliusmarminge Aug 10, 2026
679a874
fix: repair rerere-damaged files and reconcile main's round-3 feature…
juliusmarminge Aug 10, 2026
0cc45da
chore(server): renumber v2 migrations 038-046 to 041-049 after main's…
juliusmarminge Aug 10, 2026
373e96b
fix(server): port round-3 main fixes into the v2 orchestrator
juliusmarminge Aug 10, 2026
7a26f33
test(web): restore main's right-panel migration expectations after th…
juliusmarminge Aug 10, 2026
2a92afb
test(server): expect attachment saved-at lines in ClaudeAdapterV2 tur…
juliusmarminge Aug 10, 2026
797d8c3
fix(web): restore the branch's slim chat header
juliusmarminge Aug 10, 2026
bfacd6b
feat(web): add pull request actions to thread details
juliusmarminge Aug 11, 2026
b058fd1
fix(mobile): port main's composer stabilization into the v2 thread sc…
juliusmarminge Aug 11, 2026
ba5d13d
fix(web): reconcile main's round-5 features after the rebase
juliusmarminge Aug 12, 2026
35d3878
feat(web): prioritize pull request row actions
juliusmarminge Aug 13, 2026
8c7f742
fix(web): restore main's collapse chrome and tab-status keying on the…
juliusmarminge Aug 13, 2026
355d875
feat(orchestration): bound thread history and resume payloads
juliusmarminge Aug 13, 2026
34c1d0b
feat(contracts): track thread title regeneration
juliusmarminge Aug 13, 2026
df905ac
fix: reconcile main's round-6 features after the rebase
juliusmarminge Aug 14, 2026
a03cddd
fix(web): keep the titlebar layout controls fixed across right-panel …
juliusmarminge Aug 14, 2026
caea40e
fix(web): align titlebar clusters to one shared pixel inset
juliusmarminge Aug 14, 2026
2c0af9e
fix(web): size the titlebar layout-control icons like the sidebar tri…
juliusmarminge Aug 14, 2026
b43dcca
perf(server): keep shell snapshots bounded and active-only
juliusmarminge Aug 15, 2026
b58d05d
fix: reconcile main's round-8 features after the rebase
juliusmarminge Aug 15, 2026
9efb09b
fix(server): reject replaying a command receipt across threads in v2
juliusmarminge Aug 15, 2026
b494e1f
feat(mobile): surface prominent activity status and metadata
juliusmarminge Aug 17, 2026
a750145
fix: reconcile main's round-9 features after the rebase
juliusmarminge Aug 17, 2026
e9338a5
feat(server): honor withheld agent browser access in the v2 runtime
juliusmarminge Aug 17, 2026
eadd346
fix(web): restore the titlebar sizing and timeline fade lost to main'…
juliusmarminge Aug 17, 2026
ac2eeac
refactor(web): finish aligning the branch with main's style simplific…
juliusmarminge Aug 17, 2026
5ce8f11
fix(orchestration): show provider retries in the work log
juliusmarminge Aug 17, 2026
742f562
fix: reconcile main's round-10 features after the rebase
juliusmarminge Aug 28, 2026
a38eedc
fix(web): stop mis-marking recovered and text-reported tool failures …
juliusmarminge Aug 28, 2026
a08ebf9
feat(orchestration-v2): project linked pull requests on threads (#8160)
juliusmarminge Aug 28, 2026
2f1ebca
feat(orchestration-v2): carry approval options and app names to the c…
juliusmarminge Aug 28, 2026
8d3e05f
feat(orchestration-v2): route Codex thread feedback uploads through v…
juliusmarminge Aug 28, 2026
a048d1c
feat(analytics): credit v2 threads and turns to the starting client (…
juliusmarminge Aug 28, 2026
d9851b6
fix(grok): fail hung prompts on xAI rate-limit completions (#8358, pa…
juliusmarminge Aug 28, 2026
59d80fa
feat(orchestration-v2): show live context usage in the meter (#8144)
juliusmarminge Aug 28, 2026
5c6ff3d
fix(web): keep following the stream after returning to the live edge …
juliusmarminge Aug 28, 2026
3d56627
feat(grok): capture exit_plan_mode into the v2 proposed-plan card (#8…
juliusmarminge Aug 28, 2026
9cb727e
fix(web): repaint the composer glass and strip the thread-panel popov…
juliusmarminge Aug 28, 2026
ce8d360
fix(web): adopt main's attached-composer surface contract so the glas…
juliusmarminge Aug 28, 2026
f860bad
fix(web): converge ChatComposer on main's drawer-era body
juliusmarminge Aug 28, 2026
da808fe
fix(web): collapse settled tool runs behind main's summary toggles
juliusmarminge Aug 28, 2026
007750f
fix(web): surface v2 todo-list plans as task progress
juliusmarminge Aug 28, 2026
f04ab18
fix(web): show the command on collapsed tool rows, not its stdout
juliusmarminge Aug 28, 2026
d6e3231
fix(web): collapsed tool rows preview inputs for every tool type
juliusmarminge Aug 28, 2026
9690ef2
fix: reconcile main's round-11 features after the rebase
juliusmarminge Aug 28, 2026
6a7085e
fix(opencode): route child-session approvals through the v2 adapter
juliusmarminge Aug 28, 2026
85b9ef7
fix: reconcile main's round-12 features after the rebase
juliusmarminge Aug 28, 2026
6c4c510
fix: restore main's automatic thread settling after the revert
juliusmarminge Aug 29, 2026
4eb9e56
fix(web): restore the full-screen file-drop target over the chat column
juliusmarminge Aug 29, 2026
2d5c5ba
feat(server): claim uploaded attachments at v2 dispatch
juliusmarminge Aug 29, 2026
d3e88e4
feat(web): show attachments on queued messages and edit them in the c…
juliusmarminge Aug 29, 2026
e662788
fix(web): drag-to-reorder queued messages and retire stale pending rows
juliusmarminge Aug 29, 2026
46b9b4d
fix: reconcile main's round-14 features after the rebase
juliusmarminge Aug 29, 2026
8f15362
fix(web): dedupe the composer glass styles and align the chat column …
juliusmarminge Aug 29, 2026
ddd22ab
fix(mobile): replace remaining dark: utilities with adaptive semantic…
juliusmarminge Aug 29, 2026
0cd52ec
fix(lint): allowlist the queue and relationships interop boundaries
juliusmarminge Aug 29, 2026
6ccda3a
fix(server): inject HostProcessPlatform into the Grok plan extractor
juliusmarminge Aug 29, 2026
d7885d2
chore: retrigger ci
juliusmarminge Aug 29, 2026
a6e77f0
chore: refresh macroscope ui-consistency check
juliusmarminge Aug 29, 2026
cef9c1d
fix: reconcile main's round-16 features after the rebase
juliusmarminge Aug 29, 2026
d632ba6
fix(web): keep failed tool items in the collapsed group summaries
juliusmarminge Aug 29, 2026
f6f35e4
fix(server): keep Claude session approvals ephemeral
juliusmarminge Aug 29, 2026
f873b31
fix(orchestration): reanchor unsettled threads
juliusmarminge Aug 29, 2026
3cd5ee9
fix(server): observe pre-aborted Claude approvals
juliusmarminge Aug 29, 2026
1a15200
fix(server): include service launcher in bundle build
juliusmarminge Aug 29, 2026
44dffbc
fix(orchestration): preserve legacy thread metadata
juliusmarminge Aug 29, 2026
25a033c
fix(web): honor disabled legacy plan mode
juliusmarminge Aug 29, 2026
4b2f5c4
fix(server): preserve Claude subagent models
juliusmarminge Aug 29, 2026
95f268b
fix(orchestration): honor migrated thread visibility in search
juliusmarminge Aug 29, 2026
3558af8
fix(orchestration): recreate missing worktrees before turns
juliusmarminge Aug 29, 2026
617aa45
fix(clients): restore Codex feedback submission
juliusmarminge Aug 29, 2026
d706cfe
fix(server): preserve generic provider attachments
juliusmarminge Aug 29, 2026
7027c10
fix(web): load workspace markdown images through assets
juliusmarminge Aug 29, 2026
ab5f061
fix(web): preserve Windows markdown paths
juliusmarminge Aug 29, 2026
8666f4b
fix(server): keep current provider context usage
juliusmarminge Aug 29, 2026
b98e060
fix(web): restore markdown file chip actions
juliusmarminge Aug 29, 2026
c2473f6
fix(web): scope markdown actions to their environment
juliusmarminge Aug 29, 2026
1b5610f
fix(protocol): reject incompatible orchestration peers
juliusmarminge Aug 29, 2026
ca17a76
docs: explain legacy thread migration
juliusmarminge Aug 29, 2026
5c33be3
docs: state portable handoff limits
juliusmarminge Aug 29, 2026
29d1a53
chore(repo): remove tracked audit scratch files
juliusmarminge Aug 29, 2026
89eb099
fix(server): guard OpenCode prompt admission races
juliusmarminge Aug 29, 2026
cca587f
fix(server): restore Claude structured questions
juliusmarminge Aug 29, 2026
d800d83
fix(server): project Claude plans and todos
juliusmarminge Aug 29, 2026
e3657e2
perf(orchestration): bound history reads in SQL
juliusmarminge Aug 29, 2026
704d063
perf(orchestration): bound complete thread snapshots
juliusmarminge Aug 29, 2026
42b7a14
fix(server): restore Claude resume compaction
juliusmarminge Aug 29, 2026
32cd2c9
fix(server): allow protocol negotiation in CORS
juliusmarminge Aug 29, 2026
63ce0d7
fix(server): preserve provider usage in persisted turns
juliusmarminge Aug 29, 2026
cf2e7f7
fix(server): preserve Claude planning lifecycle
juliusmarminge Aug 29, 2026
aa484a4
fix(server): normalize Claude question answers
juliusmarminge Aug 29, 2026
daae2df
fix(server): correlate OpenCode prompt admission
juliusmarminge Aug 29, 2026
8cb091f
fix(clients): anchor feedback in conversation order
juliusmarminge Aug 29, 2026
6d86931
fix(web): retain markdown workspace ownership
juliusmarminge Aug 29, 2026
2005134
fix(orchestration): page history through its true end
juliusmarminge Aug 29, 2026
32e1de2
fix(server): cancel pending OpenCode prompts safely
juliusmarminge Aug 29, 2026
26618ef
fix(orchestration): retain nested fork history when paging
juliusmarminge Aug 29, 2026
e4228bf
fix(server): recover OpenCode status reconciliation
juliusmarminge Aug 29, 2026
44b1e31
fix(orchestration): select visible history before limiting SQL
juliusmarminge Aug 29, 2026
072882c
fix(web): port composer activity and grouping to orchestration v2
juliusmarminge Aug 30, 2026
a0a97b5
fix(web): align queue headers and prevent stash overlap
juliusmarminge Aug 30, 2026
1c3de7e
fix(web): share the outline for joined composer tabs
juliusmarminge Aug 30, 2026
077b533
fix(web): keep stash separate from the composer activity column
juliusmarminge Aug 30, 2026
2733c21
refactor(web): use shared banner rows for queued messages
juliusmarminge Aug 30, 2026
70b1f2c
fix(web): keep queued message editing inside the queue panel
juliusmarminge Aug 30, 2026
6685c08
fix(web): keep queued messages in place while editing
juliusmarminge Aug 30, 2026
d06962a
fix(web): match composer actions to draft and modifier state
juliusmarminge Aug 30, 2026
23a75d9
fix(web): keep composer shortcut tooltip stable on Mod
juliusmarminge Aug 30, 2026
2e195ed
feat(web): summarize T3 orchestration actions
juliusmarminge Aug 30, 2026
427323e
feat(mobile): port chat summaries and transitions to orchestration v2
juliusmarminge Aug 30, 2026
2943a55
fix(chat): remove added tool summary status counts
juliusmarminge Aug 30, 2026
650d2df
fix(mobile): keep scroll bounds current after animations
juliusmarminge Aug 30, 2026
c66fc8d
fix: reconcile main's round-17 features after the rebase
juliusmarminge Sep 1, 2026
ee319a2
feat(web): port working and thinking timeline rows to orchestration v2
juliusmarminge Sep 1, 2026
8ea7642
fix: reconcile main's round-18 features after the rebase
juliusmarminge Sep 2, 2026
b02177e
feat(server): evaluate automatic thread settlement in the v2 orchestr…
juliusmarminge Sep 2, 2026
2251157
fix: reconcile main's round-19 features after the rebase
juliusmarminge Sep 2, 2026
3acacc4
fix(web): right-align the stash shoulder tab again
juliusmarminge Sep 2, 2026
c890b52
fix(web): realign the composer and timeline with main
juliusmarminge Sep 2, 2026
818fd7d
fix: reconcile main's round-20 features after the rebase
juliusmarminge Sep 2, 2026
1e0b578
fix(server): reduce v2 recovery and runtime resource usage
juliusmarminge Sep 4, 2026
2f47a2b
fix: reconcile main updates with orchestration v2
juliusmarminge Sep 4, 2026
69771fe
fix(orchestration): stabilize Codex turn mapping and settlement
juliusmarminge Sep 4, 2026
e2da0e6
fix(chat): match main timer and task placement
juliusmarminge Sep 4, 2026
53facf4
fix(mobile): restore composer and timeline behavior from main
juliusmarminge Sep 4, 2026
9d055a2
fix(orchestrator): Stop treating a wait timeout as a dead child (#7427)
mwolson Sep 4, 2026
cbae5a8
fix(orchestrator): Show when a completed delegated child still has wo…
mwolson Sep 4, 2026
ed73374
fix(orchestrator): Stop finished Codex turns from sitting on Waiting …
mwolson Sep 4, 2026
41f16af
chore: format v2 files flagged by CI
juliusmarminge Sep 4, 2026
6d484d6
test(server): include the shell indexes migration
juliusmarminge Sep 4, 2026
d06364e
fix(mobile): pin the patched notifications dependency
juliusmarminge Sep 4, 2026
de6db27
fix(client-runtime): resolve work log source imports
juliusmarminge Sep 4, 2026
d243ba9
test(server): refresh replay runtime instruction expectations
juliusmarminge Sep 4, 2026
e1df9f6
test(server): correlate OpenCode replay message identities
juliusmarminge Sep 4, 2026
d24960d
ci: run checks on v2 branch pushes
juliusmarminge Sep 4, 2026
249800e
test(server): use Effect Vitest for Cursor provider checks
juliusmarminge Sep 4, 2026
71dc5f6
fix: reconcile main updates with orchestration v2
juliusmarminge Sep 5, 2026
f48d71b
fix(server): explain fetch failures during worktree preparation
juliusmarminge Sep 5, 2026
8f1b082
fix: reconcile upstream fixes with orchestration v2
juliusmarminge Sep 5, 2026
c917a20
fix(server): make project removal honor v2 threads
juliusmarminge Sep 5, 2026
73ce977
fix(mobile): render generic message attachments (#9929)
saphid Sep 5, 2026
876b424
fix(mobile): use the archive eligibility guard when dispatching (#9930)
saphid Sep 5, 2026
fc4e1b6
fix(orchestration): persist linked pull requests (#8689)
juliusmarminge Sep 6, 2026
54b0611
feat(mcp): update thread metadata (#8690)
juliusmarminge Sep 6, 2026
64616fa
fix(server): keep old failures from waking snoozed V2 threads (#9903)
saphid Sep 6, 2026
6b5efa7
refactor(shared): share model-selection command choice (#10577)
juliusmarminge Sep 7, 2026
5ab3cd8
refactor(project): share create and update inputs (#10578)
juliusmarminge Sep 7, 2026
e3daa92
refactor(server): share attachment message intake (#10580)
juliusmarminge Sep 7, 2026
96b4fe6
feat(mcp): expose thread organization commands (#10554)
juliusmarminge Sep 7, 2026
6001331
feat(mcp): expose existing queued message commands (#10555)
juliusmarminge Sep 7, 2026
1ced1d6
feat(mcp): expose pending user questions (#10556)
juliusmarminge Sep 7, 2026
b88073c
feat(mcp): expose thread model selection (#10557)
juliusmarminge Sep 7, 2026
b07107a
feat(mcp): expose fork and merge-back commands (#10558)
juliusmarminge Sep 7, 2026
ec80514
feat(mcp): expose preview list and close (#10559)
juliusmarminge Sep 7, 2026
7689099
feat(mcp): expose selected environment preferences (#10560)
juliusmarminge Sep 7, 2026
21e57ab
feat(mcp): expose the existing thread search query (#10561)
juliusmarminge Sep 7, 2026
a2f1de4
feat(mcp): expose scheduled task run-now (#10562)
juliusmarminge Sep 7, 2026
a7021eb
feat(mcp): expose project service operations (#10563)
juliusmarminge Sep 7, 2026
2c46748
feat(mcp): expose attachment upload and send (#10564)
juliusmarminge Sep 7, 2026
c08475d
feat(mcp): expose project thread launch service (#10565)
juliusmarminge Sep 7, 2026
c068d0d
feat(mcp): expose branch-backed workspace discovery (#10566)
juliusmarminge Sep 7, 2026
de0d9ea
fix(orchestration): map late steering to follow-up turns
juliusmarminge Sep 6, 2026
c1dafba
fix: reconcile main's round-24 features after the rebase
juliusmarminge Sep 8, 2026
577bcf9
chore: remove accidentally committed audit artifacts
juliusmarminge Sep 8, 2026
5990f37
fix(ci): repair rebased checks and stop duplicate runs
juliusmarminge Sep 8, 2026
8f9da0e
fix(web): port auto-balance updates to v2 chat
juliusmarminge Sep 8, 2026
f9f67f6
chore: format files exposed by CI
juliusmarminge Sep 8, 2026
80e873d
fix: reconcile main's round-26 updates after rebase
juliusmarminge Sep 8, 2026
e0c492f
fix(web): restore compact load-earlier control
juliusmarminge Sep 8, 2026
3b93f99
perf(orchestration): bound v2 transport payloads
juliusmarminge Sep 9, 2026
0d811b7
fix(web): preserve tool failures after output redaction
juliusmarminge Sep 9, 2026
c08a92e
fix: restore sidebar behavior after v2 rebases
juliusmarminge Sep 9, 2026
288359d
fix(server): consolidate V2 migrations and refine runtime recovery
juliusmarminge Sep 9, 2026
13ce74b
fix(web): simplify timeline rows and preserve collapsed composer cont…
juliusmarminge Sep 9, 2026
1983bdd
fix(web): smooth composer transitions and group approval worklogs
juliusmarminge Sep 9, 2026
465ce49
fix: reconcile main updates with orchestration v2
juliusmarminge Sep 9, 2026
fdd6539
fix(server): report OpenCode descendant stop failures
juliusmarminge Sep 9, 2026
f0fe7d3
fix(server): abort external OpenCode sessions on release
juliusmarminge Sep 9, 2026
5e2f941
fix(server): retain thread baseline diffs across root runs
juliusmarminge Sep 9, 2026
d88986c
fix(server): fail OpenCode turns on unexpected stream EOF
juliusmarminge Sep 9, 2026
edecc22
fix(server): bound OpenCode runtime request replies
juliusmarminge Sep 9, 2026
0c730a5
fix(client): bound socket resets after cold HTTP failures
juliusmarminge Sep 9, 2026
2b46eca
fix(server): query only due scheduled tasks during polling
juliusmarminge Sep 9, 2026
a5ef160
fix(server): retain normalized OpenCode turn usage
juliusmarminge Sep 9, 2026
5963698
perf(server): scope ordinary control reads to their targets
juliusmarminge Sep 9, 2026
48aab10
fix(server): retry initial title generation after transient failures
juliusmarminge Sep 9, 2026
68fc715
fix(server): isolate Cursor metadata generation from workspaces
juliusmarminge Sep 9, 2026
a36f78f
fix(server): preserve Claude Read image previews across clients
juliusmarminge Sep 9, 2026
9ed5dbe
fix(web): preserve generic files when editing queued messages
juliusmarminge Sep 9, 2026
b1762fd
test(server): assert tool output redaction before storage fidelity
juliusmarminge Sep 9, 2026
0da406b
test(web): cancel queued animation frames during worker cleanup (#10880)
saphid Sep 9, 2026
cef528c
fix: reconcile main devices and pull requests with orchestration v2
juliusmarminge Sep 10, 2026
c93c50d
feat(providers): add Pi coding agent (#7211)
StiensWout Sep 10, 2026
bebffe5
feat(providers): standardize ACP providers (#6461)
StiensWout Sep 10, 2026
1d61d4b
feat: render background completions as typed notifications
juliusmarminge Sep 10, 2026
4718d24
fix(mcp): omit recursive screenshot metadata from tool inputs
juliusmarminge Sep 10, 2026
cb01246
fix(pi): use native forks and preserve rollback session identity
juliusmarminge Sep 10, 2026
c06a5f5
fix(pi): cap OpenRouter output budgets pending upstream fix
juliusmarminge Sep 10, 2026
3c40111
fix(web): show ACP sidebar icons and hold onboarding height while loa…
juliusmarminge Sep 10, 2026
d41f452
feat(server): deliver delegated completions through a durable mailbox
juliusmarminge Sep 10, 2026
5ce8a13
fix(acp): support Devin terminals, questions, and native subagents
juliusmarminge Sep 10, 2026
04bc3c2
fix(server): find active turns when answering async questions
juliusmarminge Sep 10, 2026
4f62e10
fix(web): populate sidebar ACP branding from environment settings
juliusmarminge Sep 10, 2026
d158853
fix(acp): preserve native child messages and final summaries
juliusmarminge Sep 10, 2026
8ba67f5
fix(server): distinguish delegated task results from completed turns
juliusmarminge Sep 10, 2026
627aa98
test(server): align Codex delegation instruction assertion
juliusmarminge Sep 10, 2026
5efe546
test(server): align delegation fixtures with task result semantics
juliusmarminge Sep 10, 2026
6241fda
fix(server): classify Claude V2 structured terminal failures (#9897)
saphid Sep 10, 2026
93f4a5c
fix(orchestration): exclude rolled-back work from bounded recovery (#…
saphid Sep 10, 2026
f94cb8b
test(orchestration): cover bounded V2 socket fallback paging (#9907)
saphid Sep 10, 2026
e26d571
fix(server): wait for native Codex start before Stop (#10024)
saphid Sep 10, 2026
16dfcfb
fix(server): keep the native Grok default model (#10025)
saphid Sep 10, 2026
4c9d15b
fix(server): fail V2 turns when the OpenCode event stream ends (#9905)
saphid Sep 10, 2026
9184e46
fix(web): preserve file attachments when editing queued runs (#9928)
saphid Sep 10, 2026
5df6ef5
fix(server): preserve project mutation fields across transports (#9920)
saphid Sep 11, 2026
e91419b
fix(mobile): throttle streaming thread visit updates (#9931)
saphid Sep 11, 2026
38554db
fix(orchestrator): preserve task-step elapsed time across restart (#1…
saphid Sep 11, 2026
75d2ed1
fix(server): preserve Claude interruption status during steering
juliusmarminge Sep 11, 2026
ac09a3b
fix(server): wait for nested completion delivery before publishing re…
juliusmarminge Sep 11, 2026
b4aa7ef
test(server): verify background delivery with real providers
juliusmarminge Sep 11, 2026
83c6c4b
fix: keep working timers anchored to the active run
juliusmarminge Sep 11, 2026
18cf926
perf: page complete turns and bound timeline reconciliation
juliusmarminge Sep 11, 2026
ea1ca23
perf(client): narrow thread subscriptions and navigation updates
juliusmarminge Sep 11, 2026
a1c16d2
feat(mobile): manage queued messages in a dedicated sheet
juliusmarminge Sep 11, 2026
091ca9d
fix(web): fold completed trailing background activity
juliusmarminge Sep 11, 2026
62aef85
fix: reconcile main settings and previews with orchestration v2
juliusmarminge Sep 11, 2026
1443a39
chore: integrate upstream orchestration v2 at 62aef8587
Jacksondr5 Sep 17, 2026
42a4b91
feat(web): assign imported conversations during Squadron setup
Jacksondr5 Sep 17, 2026
ddb150d
docs(web): explain Squadrons during setup
Jacksondr5 Sep 17, 2026
dee34df
test(codex): preserve elicitation fixture literal types
Jacksondr5 Sep 17, 2026
c754744
feat(web): create multiple Squadrons per imported folder
Jacksondr5 Sep 17, 2026
e8bfdba
fix(web): keep setup to one Squadron per folder
Jacksondr5 Sep 17, 2026
2ddfb88
chore: merge current J5 main into upstream integration
Jacksondr5 Sep 20, 2026
686f844
fix(ci): align desktop identity tests and vendored cleanup
Jacksondr5 Sep 20, 2026
f229e78
fix(test): use complete mobile thread ordering fixtures
Jacksondr5 Sep 20, 2026
c92011b
Merge remote-tracking branch 'origin/j5/main' into j5/upstream-sync-2…
Jacksondr5 Sep 20, 2026
3a1ac8c
fix(test): align provider readiness with Codex mock version
Jacksondr5 Sep 20, 2026
e8d6e33
merge: preserve crews and personas across upstream integration
Jacksondr5 Sep 23, 2026
45cc2a8
merge: carry split CI jobs from j5/main
Jacksondr5 Sep 23, 2026
98e6152
fix(mcp): resolve crew archive guard only for archive actions
Jacksondr5 Sep 23, 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
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
2 changes: 1 addition & 1 deletion .coderabbit.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
reviews:
review_status: false
auto_review:
enabled: false
enabled: true
82 changes: 63 additions & 19 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -1,29 +1,73 @@
// Dev container for T3 Code. Mirrors CI (ubuntu-24.04, Node 24, Rust stable)
// and the canonical setup in docs/operations/development.md: global `vp`, `vp i`.
// Contributor doc: docs/internals/devcontainer.md
{
"name": "T3 Code Dev",
"image": "debian:bookworm",
"name": "T3 Code",
"image": "mcr.microsoft.com/devcontainers/base:ubuntu-24.04",
"features": {
"ghcr.io/devcontainers/features/git:1": {},
"ghcr.io/devcontainers-extra/features/bun:1": {
"version": "1.3.11"
// nodeGypDependencies (default true) brings python3/make/g++, which Linux
// needs for node-pty's node-gyp fallback (its prebuilds are mac/win only).
"ghcr.io/devcontainers/features/node:2": {
"version": "24"
},
"ghcr.io/devcontainers/features/node:1": {
"version": "24.13.1"
},
"ghcr.io/devcontainers/features/python:1": {
"version": "3.10",
"installTools": false
}
// native/resource-monitor (edition 2024, needs stable >= 1.85). The server
// degrades gracefully without the binary, but CI checks cargo fmt + test.
"ghcr.io/devcontainers/features/rust:1": {},
"ghcr.io/devcontainers/features/github-cli:1": {}
},
"hostRequirements": {
"cpus": 4,
"memory": "8gb",
"storage": "32gb"
},
"containerEnv": {
// Keep all runtime state inside the (gitignored) workspace .t3, matching
// the worktree default. An explicit --home-dir still wins.
"T3CODE_HOME": "${containerWorkspaceFolder}/.t3"
},
"overrideFeatureInstallOrder": [
"ghcr.io/devcontainers/features/git",
"ghcr.io/devcontainers-extra/features/bun"
"mounts": [
// vp keeps the pnpm content-addressable store and metadata cache under
// ~/.cache/pnpm (verified: the v11 store dir lives there); mounting a
// volume there lets installs survive container rebuilds.
"source=t3code-pnpm-store,target=/home/vscode/.cache/pnpm,type=volume",
// Root node_modules holds the whole pnpm virtual store (.pnpm), so one
// volume keeps the heavy tree off the slow macOS/Windows bind mount.
// Scoped by devcontainerId so parallel checkouts do not share it.
// Codespaces note: prebuild snapshots exclude volumes; drop these mounts
// if prebuilt codespaces become the primary workflow.
"source=t3code-node-modules-${devcontainerId},target=${containerWorkspaceFolder}/node_modules,type=volume"
],
"postCreateCommand": {
"bun-install": "bun install --backend=copyfile --frozen-lockfile"
"onCreateCommand": "bash .devcontainer/on-create.sh",
"updateContentCommand": "bash .devcontainer/update-content.sh",
"forwardPorts": [5733, 13773],
"portsAttributes": {
"5733": {
"label": "t3 web (open via the pairing URL, not the bare origin)",
"onAutoForward": "notify"
},
"13773": {
"label": "t3 server",
"onAutoForward": "silent"
}
},
"customizations": {
"codespaces": {
"openFiles": ["docs/internals/devcontainer.md"]
},
"vscode": {
"extensions": ["oxc.oxc-vscode"]
"extensions": ["oxc.oxc-vscode", "rust-lang.rust-analyzer"],
"settings": {
// .repos is a large vendored read-only reference tree; watching it
// burns CPU and file handles.
"files.watcherExclude": {
"**/.repos/**": true,
"**/.t3/**": true
},
"search.exclude": {
"**/.repos": true
}
}
}
}
},
"remoteUser": "vscode"
}
38 changes: 38 additions & 0 deletions .devcontainer/on-create.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#!/usr/bin/env bash
# One-time container setup, baked into prebuilds. Content-dependent work
# (dependency install, Chromium) lives in update-content.sh.
set -euo pipefail

# The Vite+ CLI is the repo task runner (vp i, vp run dev, vp test run).
# Download to a file first: a curl failure inside $( ) would yield an empty
# script and a false success. VP_NODE_MANAGER=no skips the installer's node
# shims; Node comes from the devcontainer feature. The VP_*_DIR group (set
# together, absolute) pins the install location instead of the installer's
# XDG platform defaults, which moved the binary from ~/.vite-plus/bin to
# ~/.local/share/vite-plus/bin between releases and would break the check
# below either way.
export VP_BIN_DIR="$HOME/.local/share/vite-plus/bin"
export VP_DATA_DIR="$HOME/.local/share/vite-plus"
export VP_CACHE_DIR="$HOME/.cache/vite-plus"
installer=$(mktemp)
curl -fsSL https://vite.plus -o "$installer"
VP_NODE_MANAGER=no bash "$installer"
rm -f "$installer"

# Non-login lifecycle shells never source the profile the installer edits,
# so expose vp on the default PATH. test -x keeps a bad install loud.
test -x "$VP_BIN_DIR/vp"
sudo ln -sf "$VP_BIN_DIR/vp" /usr/local/bin/vp

# First-run terminal notice, rendered by the devcontainers base image.
sudo mkdir -p /usr/local/etc/vscode-dev-containers
sudo tee /usr/local/etc/vscode-dev-containers/first-run-notice.txt >/dev/null <<'EOF'
T3 Code devcontainer

vp run dev start server + web, then open the pairing URL it
prints (the bare forwarded port will not authenticate)
cp .env.example .env optional: enable T3 Connect cloud features
(public identifiers, not secrets)

Details: docs/internals/devcontainer.md
EOF
19 changes: 19 additions & 0 deletions .devcontainer/update-content.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#!/usr/bin/env bash
# Runs at creation and on every prebuild content refresh, so codespaces start
# with deps installed and caches warm. Everything here is idempotent.
set -euo pipefail

# Volume mounts (pnpm store, node_modules) and the directories docker creates
# for them arrive root-owned; hand them to the dev user before installing.
for dir in "$HOME/.cache" "$HOME/.cache/pnpm" node_modules; do
if [ -d "$dir" ] && [ "$(stat -c %U "$dir")" != "$(id -un)" ]; then
sudo chown "$(id -un):$(id -gn)" "$dir"
fi
done

CI=true vp i
# Repairs electron's path.txt and exec bits after install, same as CI.
vp run --filter @t3tools/desktop ensure:electron
# Pre-warms Vite's dep optimizer (cache is keyed on the absolute path, which
# is stable inside the container).
node apps/web/scripts/warm-dep-cache.ts
8 changes: 8 additions & 0 deletions .github/SECURITY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Security policy

Report security vulnerabilities affecting T3 Code or T3 Tools-operated infrastructure to
[security@ping.gg](mailto:security@ping.gg). Please do not disclose them publicly until we have had
a reasonable opportunity to investigate and remediate them.

See the [full security policy](https://t3.codes/security-policy) for reporting details, scope,
and safe harbor terms for good-faith research.
67 changes: 67 additions & 0 deletions .github/scripts/check-nightly-release.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
const MINIMUM_RELEASE_GAP_MS = 6 * 60 * 60 * 1000;

const isNightlyTag = (tag) => /^v.*-nightly\./.test(tag) || tag.startsWith("nightly-v");

// Newest published nightly by publication time, or undefined when none exists.
async function findLatestNightly({ github, context }) {
const releases = await github.paginate(github.rest.repos.listReleases, {
...context.repo,
per_page: 100,
});
return releases
.filter((release) => !release.draft && release.published_at && isNightlyTag(release.tag_name))
.sort((a, b) => Date.parse(b.published_at) - Date.parse(a.published_at))[0];
}

// Runs after the workflow acquires the nightly concurrency lock.
async function shouldReleaseNightly({ github, context, core, now = Date.now() }) {
const lastNightly = await findLatestNightly({ github, context });

if (!lastNightly) {
core.info("No published nightly found. Proceeding with release.");
return true;
}

if (now - Date.parse(lastNightly.published_at) < MINIMUM_RELEASE_GAP_MS) {
core.info(`Nightly ${lastNightly.tag_name} was published less than six hours ago. Skipping.`);
return false;
}

const { data: comparison } = await github.rest.repos.compareCommitsWithBasehead({
...context.repo,
basehead: `${lastNightly.tag_name}...${context.sha}`,
per_page: 1,
});
if (comparison.status !== "ahead") {
core.info(
`Candidate commit is ${comparison.status} relative to ${lastNightly.tag_name}. Skipping.`,
);
return false;
}

core.info(`New commits since ${lastNightly.tag_name}, and the six-hour gap has passed.`);
return true;
}

// Stable releases build the commit the latest nightly shipped, so the stable
// build is one nightly users already ran. Returns the nightly tag, its commit,
// and the stable version that nightly was a preview of.
async function resolveLatestNightlyCommit({ github, context, core }) {
const lastNightly = await findLatestNightly({ github, context });
if (!lastNightly) {
throw new Error("No published nightly found. Stable releases build the latest nightly commit.");
}

const tag = lastNightly.tag_name;
// repos.getCommit dereferences annotated tags, so this is the commit either way.
const { data: commit } = await github.rest.repos.getCommit({ ...context.repo, ref: tag });
const version = /^(?:nightly-)?v(\d+\.\d+\.\d+)-nightly\./.exec(tag)?.[1];
if (!version) {
throw new Error(`Cannot derive a stable version from nightly tag ${tag}.`);
}

core.info(`Latest nightly ${tag} shipped ${commit.sha} as a preview of ${version}.`);
return { tag, sha: commit.sha, version };
}

module.exports = { shouldReleaseNightly, resolveLatestNightlyCommit };
143 changes: 143 additions & 0 deletions .github/scripts/check-nightly-release.test.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
const assert = require("node:assert/strict");
const test = require("node:test");
const { shouldReleaseNightly } = require("./check-nightly-release.cjs");

const now = Date.parse("2026-09-05T12:00:00Z");
const hour = 60 * 60 * 1000;
const nightly = (hoursAgo, overrides = {}) => ({
tag_name: "v1.0.1-nightly.20260905.123",
draft: false,
published_at: new Date(now - hoursAgo * hour).toISOString(),
...overrides,
});

function fixture({ releases = [nightly(7)], comparisonStatus = "ahead" } = {}) {
const calls = [];
return {
calls,
options: {
now,
context: { repo: { owner: "example", repo: "app" }, sha: "new" },
core: { info() {} },
github: {
rest: {
repos: {
listReleases() {},
async compareCommitsWithBasehead(params) {
calls.push(params);
return { data: { status: comparisonStatus } };
},
},
},
async paginate() {
return releases;
},
},
},
};
}

test("releases the first nightly when no nightly is published", async () => {
const { options } = fixture({
releases: [nightly(0, { tag_name: "v1.0.0" }), nightly(0, { draft: true })],
});
assert.equal(await shouldReleaseNightly(options), true);
});

test("waits six hours after publication, including manual nightlies", async () => {
for (const age of [0, 3, 6 - 1 / 3600]) {
const { options, calls } = fixture({ releases: [nightly(age)] });
assert.equal(await shouldReleaseNightly(options), false);
assert.equal(calls.length, 0);
}
});

test("releases new commits at six hours and after an idle period", async () => {
for (const age of [6, 7, 24]) {
const { options } = fixture({ releases: [nightly(age)] });
assert.equal(await shouldReleaseNightly(options), true);
}
});

test("skips unchanged commits after the gap", async () => {
const { options } = fixture({ comparisonStatus: "identical" });
assert.equal(await shouldReleaseNightly(options), false);
});

test("uses publication time, not release order or the tagged commit date", async () => {
const { options } = fixture({
releases: [nightly(10), nightly(1), nightly(20, { tag_name: "nightly-v0.9.0" })],
});
assert.equal(await shouldReleaseNightly(options), false);
});

test("ignores stable releases and drafts when checking the gap", async () => {
const { options } = fixture({
releases: [nightly(0, { tag_name: "v1.0.0" }), nightly(0, { draft: true }), nightly(7)],
});
assert.equal(await shouldReleaseNightly(options), true);
});

test("compares against the published tag, including legacy nightly tags", async () => {
const tag = "nightly-v0.9.0";
const { options, calls } = fixture({ releases: [nightly(7, { tag_name: tag })] });
assert.equal(await shouldReleaseNightly(options), true);
assert.equal(calls[0].basehead, `${tag}...new`);
});

test("fails instead of releasing when GitHub cannot supply release state", async () => {
const { options } = fixture();
options.github.paginate = async () => {
throw new Error("GitHub unavailable");
};
await assert.rejects(shouldReleaseNightly(options), /GitHub unavailable/);
});

for (const status of ["behind", "diverged"]) {
test(`skips a candidate commit that is ${status} relative to the last nightly`, async () => {
const { options } = fixture({ comparisonStatus: status });
assert.equal(await shouldReleaseNightly(options), false);
});
}

const { resolveLatestNightlyCommit } = require("./check-nightly-release.cjs");

function nightlyCommitFixture({ releases, commitSha = "abc123" }) {
const refs = [];
const { options } = fixture({ releases });
options.github.rest.repos.getCommit = async ({ ref }) => {
refs.push(ref);
return { data: { sha: commitSha } };
};
return { options, refs };
}

test("stable releases resolve the commit of the newest published nightly", async () => {
const { options, refs } = nightlyCommitFixture({
releases: [
nightly(10, { tag_name: "v1.0.1-nightly.20260905.100" }),
nightly(1, { tag_name: "v1.0.1-nightly.20260905.123" }),
nightly(0, { tag_name: "v1.0.0" }),
nightly(0, { draft: true, tag_name: "v1.0.1-nightly.20260905.999" }),
],
commitSha: "deadbeef",
});
assert.deepEqual(await resolveLatestNightlyCommit(options), {
tag: "v1.0.1-nightly.20260905.123",
sha: "deadbeef",
version: "1.0.1",
});
assert.deepEqual(refs, ["v1.0.1-nightly.20260905.123"]);
});

test("stable releases derive the version from legacy nightly tags", async () => {
const { options } = nightlyCommitFixture({
releases: [nightly(1, { tag_name: "nightly-v0.9.0-nightly.20260905.5" })],
});
assert.equal((await resolveLatestNightlyCommit(options)).version, "0.9.0");
});

test("stable releases fail without a published nightly", async () => {
const { options } = nightlyCommitFixture({ releases: [nightly(0, { tag_name: "v1.0.0" })] });
await assert.rejects(resolveLatestNightlyCommit(options), /No published nightly/);
});
Loading
Loading