Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
260 commits
Select commit Hold shift + click to select a range
7c56feb
fleet(#1261): guard installed AND wired on Linux/WSL (AC4)
jeonghun-jj-lee Sep 18, 2026
9b80ea5
fleet(#1262): proxy /amicode/* to the host in client mode — bypass lo…
jeonghun-jj-lee Sep 18, 2026
1106ae9
fleet(#1262): /amicode/* write refetch variant + multi-client concurr…
jeonghun-jj-lee Sep 18, 2026
741128d
fleet(#1263): WebSocket/PTY upgrade proxying through the client relay…
jeonghun-jj-lee Sep 19, 2026
d4dd4aa
fleet(#1264): lossless per-session SSE reconnect — cursor resume + bo…
jeonghun-jj-lee Sep 19, 2026
b0a32d8
fleet(#780): posture state file — schema + transition-only sole write…
jeonghun-jj-lee Sep 19, 2026
7cd51a6
fleet(#780): context plugin renders honest machine posture — read-onl…
jeonghun-jj-lee Sep 19, 2026
3cb4bd2
fleet(#780): wire the posture-state writer into the client attach loo…
jeonghun-jj-lee Sep 19, 2026
d207283
fleet(#780): plugin comment must not name the raw role config — F1 on…
jeonghun-jj-lee Sep 19, 2026
50d24e0
fleet(#1265): relay posture → #780 single-writer seam + honest degrad…
jeonghun-jj-lee Sep 19, 2026
f176900
fleet(#1260): transport provider seam + ssh provider (AC2/AC3/AC4)
jeonghun-jj-lee Sep 19, 2026
42b46ae
fleet(#1260): wire the provider into the host — ssh = no regression, …
jeonghun-jj-lee Sep 19, 2026
93ecc79
fleet(#1260): the amicode.fleetTransport setting selects the provider…
jeonghun-jj-lee Sep 19, 2026
dbce1a5
fleet(#1260): complete the transport Data Contract — start()/stop() l…
jeonghun-jj-lee Sep 19, 2026
228f742
fleet(#1260): the tailscale transport provider — MagicDNS + loopback-…
jeonghun-jj-lee Sep 19, 2026
b657acd
fleet(#1260): the direct transport provider — supplied URL + health p…
jeonghun-jj-lee Sep 19, 2026
c98e7f2
fleet(#1260): direct is selectable + wired to its OWN supplied URL — …
jeonghun-jj-lee Sep 19, 2026
d27625d
fleet(#1258): hub-service unit renderers — launchd RunAtLoad+KeepAliv…
jeonghun-jj-lee Sep 19, 2026
fe8b1d4
fleet(#1258): installer provisions the canonical hub service (server-…
jeonghun-jj-lee Sep 19, 2026
1dbadae
docs(adr): 0025 Remote-SSH default posture, thin-client as lifeboat —…
jeonghun-jj-lee Sep 19, 2026
f461d99
fleet(#1267): amico-host:// FileSystemProvider — native Explorer show…
jeonghun-jj-lee Sep 19, 2026
7ef9765
fleet(#1272): window-mode as its own field + writer/signature + surfa…
jeonghun-jj-lee Sep 19, 2026
ae677a8
fleet(#1270): prove host-side Remote-SSH relocation adopts the durabl…
jeonghun-jj-lee Sep 19, 2026
f596252
fleet(#1271): opt-in Remote-SSH entry — connect editor to hub from th…
jeonghun-jj-lee Sep 19, 2026
e8c802e
fleet(#1273): prove single-writer across a thin-client ⇄ Remote-SSH m…
jeonghun-jj-lee Sep 19, 2026
bf1446b
fleet(#1274): P2 ui-kind always-local companion — feasibility spike +…
jeonghun-jj-lee Sep 19, 2026
7d27170
fleet(#1275): client-side link sensor in the companion (bundles + reu…
jeonghun-jj-lee Sep 19, 2026
6bfc950
fleet(#1276): auto-DOWN orchestration — safe (floor/dirty-guard/anti-…
jeonghun-jj-lee Sep 19, 2026
f0f6b7f
fleet(#1277): prompt-UP to Remote-SSH on sustained recovery (never fo…
jeonghun-jj-lee Sep 19, 2026
d928bb8
fleet(#1278): cross-scheme editor-URI carry across the posture switch
jeonghun-jj-lee Sep 19, 2026
21e6281
docs(adr): 0026 generalizable machine capabilities + host-owned roster
jeonghun-jj-lee Sep 20, 2026
5a3bd38
docs(adr): 0026 fix roster route (off /amicode/fleet/*) + slice count
jeonghun-jj-lee Sep 20, 2026
1951ebf
Fleet setup, generalizable machine roles & the Fleet Manager (#1316) …
jeonghun-jj-lee Sep 20, 2026
a85ba17
feat(fleet): redesign sidebar fleet section as a device list (#1359)
jeonghun-jj-lee Sep 21, 2026
3d1d96c
fix(fleet): fleet enroll verify-attach — port collision + auth gap + …
jeonghun-jj-lee Sep 21, 2026
f70d6aa
fix(fleet): complete the enroll port/auth layout + pin real version +…
jeonghun-jj-lee Sep 21, 2026
f891a04
feat(fleet): action bar with Manage + Troubleshoot buttons (#1359)
jeonghun-jj-lee Sep 21, 2026
1622fa3
fix(fleet): sidebar client-side peer visibility — proxy-read host ros…
jeonghun-jj-lee Sep 21, 2026
0ada0f0
Peer fleet studios (ADR 0027, Horizon 1) — #1341–#1346 (#1353)
jeonghun-jj-lee Sep 21, 2026
190bf2d
docs(fleet): document peer studios alongside hub/star (ADR 0027) (#1369)
jeonghun-jj-lee Sep 21, 2026
5c6f8ba
docs(fleet): ADR 0028 (device identity) + ADR 0029 (unified fleet) + …
jeonghun-jj-lee Sep 21, 2026
a5346e3
fleet: self-reported device identity in the roster (#1368) (#1374)
jeonghun-jj-lee Sep 21, 2026
007e998
feat(fleet): live health indicators with staleness detection (#1375) …
jeonghun-jj-lee Sep 21, 2026
a8cdf27
feat(fleet): CSS tooltip on status indicator dot (#1375)
jeonghun-jj-lee Sep 21, 2026
a627190
fix(fleet): reposition dot tooltip to top-right + fractional time uni…
jeonghun-jj-lee Sep 21, 2026
4a0aa76
test: skip hub-service tests + fix fleet_heartbeat typecheck (#1390)
jeonghun-jj-lee Sep 21, 2026
1aaa219
docs(fleet): unify ADR 0027/0029 — chain, promote to accepted (#1377)
jeonghun-jj-lee Sep 21, 2026
e5bb18f
fleet(#1378): FleetPlane generalization + resolver wiring in dispatch…
jeonghun-jj-lee Sep 21, 2026
42525eb
fleet(#1379): serving advertisement — roster serving tag + device_typ…
jeonghun-jj-lee Sep 21, 2026
acd77e4
fleet(#1381): attach/detach upstream lifecycle + credential injection…
jeonghun-jj-lee Sep 21, 2026
96e2c07
fleet(#1382): peer-unreachable posture — named 503, hold, no silent l…
jeonghun-jj-lee Sep 21, 2026
95461b4
fleet(#1383): real-ssh two-engine e2e test — AC2/AC3 proof, CI-gated …
jeonghun-jj-lee Sep 21, 2026
e20a375
fleet(#1394): display 'peer' for non-hub servers in sidebar and toolt…
jeonghun-jj-lee Sep 21, 2026
aaa2834
fleet: fix heartbeat — add missing sshAlias/transport + serving capab…
jeonghun-jj-lee Sep 21, 2026
4af7463
fleet: target heartbeat at hub service for server-mode machines (#1397)
jeonghun-jj-lee Sep 21, 2026
beb6ade
fleet: peer roster sync — heartbeat pushes rows to peers via SSH (#1399)
jeonghun-jj-lee Sep 21, 2026
992e044
fleet: derive posture badge from roster health for server-mode peers …
jeonghun-jj-lee Sep 21, 2026
3961ebd
fleet: tighten heartbeat to 30s, yellow at 60s, red at 120s (#1401)
jeonghun-jj-lee Sep 21, 2026
dbe2638
fleet: hide Manage button until Fleet Manager is wired (#1402)
jeonghun-jj-lee Sep 21, 2026
4c858bb
fleet: skip guard/settings/tunnel drift checks for server-mode machin…
jeonghun-jj-lee Sep 21, 2026
f0cbfcc
fleet: replace Fix fleet / Show details popup with Troubleshoot (#1406)
jeonghun-jj-lee Sep 21, 2026
4d781de
feat(fleet): connect to fleet device from the sidebar (#1409) (#1415)
jeonghun-jj-lee Sep 21, 2026
153224c
feat(fleet): transport-aware heartbeat — HTTPS push for tailscale/dir…
jeonghun-jj-lee Sep 22, 2026
3997704
fix(fleet): resolve tailscale CLI at known paths for GUI apps
Sep 22, 2026
d24865e
debug: add fleet tailscale resolution logging
Sep 22, 2026
d8231dd
chore: remove debug logging from fleet tailscale resolution
Sep 22, 2026
c6049ba
fix: show warning toast when disabled Quick Pick item is selected (#1…
Sep 22, 2026
b09895e
fix: remove credential gate from thin-client Quick Pick option (#1413)
Sep 22, 2026
cc8be1e
fix: show warning when thin-client attach fails (#1413)
Sep 22, 2026
2495a71
fix: surface diagnostic reason when thin-client attach fails (#1413)
Sep 22, 2026
ef8cf3c
fix: correct /fleet/attach route path — missing /amicode prefix (#1413)
Sep 22, 2026
057477f
Fleet Studio (#1436): peer-trust credential, fleet-wide sessions, mul…
jeonghun-jj-lee Sep 23, 2026
3f9d01f
Fleet Studio wiring (#1436): connect dormant slices W0–W5 [WIP] (#1455)
jeonghun-jj-lee Sep 23, 2026
9a41e9e
Wire fleet peer-token mint + revoke routes at boot (#1470) (#1471)
jeonghun-jj-lee Sep 23, 2026
c33fa99
docs: define base peer-studio control (#1476)
jeonghun-jj-lee Sep 23, 2026
4d71d5a
fix: reset legacy global SSE cursor on attachment switch (#1468)
Sep 23, 2026
edb21db
Merge remote-tracking branch 'origin/main' into feature/free-tier-fleet
Sep 23, 2026
e05406a
feat: stable peer identity, keeper authority, roster repair (#1477) (…
jeonghun-jj-lee Sep 23, 2026
c4c2a65
Fleet Studio #1479: managed per-peer transport supervisor (#1493)
jeonghun-jj-lee Sep 23, 2026
39b1030
feat(fleet): base peer-studio activation for unentitled serving peers…
jeonghun-jj-lee Sep 23, 2026
a96059a
Fleet Studio #1480: bound Observe trust bootstrap (off-URL, identity-…
jeonghun-jj-lee Sep 23, 2026
4d9b6c6
Fleet Studio #1485: production boundary parity + headless peer boot (…
jeonghun-jj-lee Sep 23, 2026
6ca7b03
Fleet Studio #1481: trusted Observe projection + session UI + remote …
jeonghun-jj-lee Sep 23, 2026
95793cc
Fleet Studio #1486: target-enforced Control lifecycle + revocation (#…
jeonghun-jj-lee Sep 23, 2026
db53897
Fleet Studio #1482: control-gated peer routing + owner safety (#1505)
jeonghun-jj-lee Sep 23, 2026
3a46b43
Fleet Studio #1487: headless peer relationship rehydration (#1507)
jeonghun-jj-lee Sep 23, 2026
e81ec25
Fleet Studio #1484: control-room UI wiring (#1508)
jeonghun-jj-lee Sep 23, 2026
a927633
Fleet Studio #1489: non-skipped two-peer release E2E (#1509)
jeonghun-jj-lee Sep 23, 2026
c056129
Fleet Studio #1511: SSE fan-in aggregator + lossless resume (ADR 0033…
jeonghun-jj-lee Sep 24, 2026
3dfebc7
fix(app): eliminate scroll jank from competing scroll-to-bottom mecha…
jeonghun-jj-lee Sep 24, 2026
6b9dd59
Reconcile feature/free-tier-fleet with main (+ instruction.test.ts $T…
jeonghun-jj-lee Sep 24, 2026
837e066
Merge origin/main into feature/free-tier-fleet (establish ancestry)
Sep 24, 2026
ea83720
Fleet Studio #1519: wire the SSE fan-in aggregator into the /event ro…
jeonghun-jj-lee Sep 24, 2026
579d452
Fleet Studio #1522: wire real focusSnapshot into SSE fan-in connect f…
jeonghun-jj-lee Sep 24, 2026
007a269
Fleet Studio #1524: base peer-observation routes mount without hub-ac…
jeonghun-jj-lee Sep 24, 2026
e687e1b
Fleet Studio #1525 (B1, read-only): merge peer sessions into the titl…
jeonghun-jj-lee Sep 24, 2026
a5e74d1
Fleet Studio #1537 (B2a): owner-routed open of a peer session + retir…
jeonghun-jj-lee Sep 24, 2026
ae8e7f3
Fleet Studio #1537 (B2b, read seam): owner-route peer-session reads o…
Sep 24, 2026
1026a39
Fleet Studio B2b (#1540): accept ADR 0034 + peer-control glossary
Sep 24, 2026
e055927
fix(app): gate directory-store mutations for remote SSE events (#1539…
jeonghun-jj-lee Sep 24, 2026
d89ffb2
Fleet Studio B2b (#1540): deliberate-review corrections to ADR 0034 +…
Sep 24, 2026
1d45df8
Fleet Studio B2b (#1540) — remote peer-studio control + live streamin…
jeonghun-jj-lee Sep 24, 2026
87d90d8
Fleet Studio B2b: wire the Enable-control act end-to-end + re-home it…
jeonghun-jj-lee Sep 25, 2026
0d01238
fix(app): observe the interactive control flip via a shared polled pr…
Sep 25, 2026
d5ad9e4
fix(extension): self-heal missing lifecycle authority + honest enable…
Sep 25, 2026
71182b8
feat(app): group the Sessions dropdown by owner machine (Slice C)
Sep 25, 2026
d8f49ae
fix(fleet): guard optional getBlockedPeers() in headless rehydration
Sep 25, 2026
06a64ba
fix(fleet): sanitize PII from test fixtures and ADR docs
Sep 26, 2026
988f8ff
fix(fleet): fetch cross-project sessions in fleet projection
Sep 26, 2026
9fdcf71
chore: update app-bundle manifest hashes
Sep 26, 2026
af79b73
feat(app): replace driving banner with monitor icon on session tab
Sep 26, 2026
fd5f41c
Fix remote session SSE delivery + host-side presence awareness (#1564…
jeonghun-jj-lee Sep 26, 2026
bb8e542
test(#1577): RED — titlebar portal dedup registry + tests
Sep 26, 2026
88fa3e6
fix(#1577): enforce single portal source per titlebar mount point
Sep 26, 2026
ad6fb1b
feat(adopt): hub engine adoption — editor adopts the hub, no rival en…
Sep 26, 2026
66e09a6
docs: correct stale fleet_hub_service comment — hub now writes handsh…
Sep 26, 2026
23d62f8
feat(fleet): editor adopts the hub engine — one engine + one DB per s…
Sep 26, 2026
e9cf693
fix(app): enforce single portal source per titlebar mount point — no …
Sep 26, 2026
35a46d3
feat(service-runner): PID-file lifecycle — kill stale engine on resta…
Sep 26, 2026
e6a66d1
fix(service-runner): PID-file lifecycle — kill stale engine on hub re…
Sep 26, 2026
951df5e
feat(service-runner): handshake lifecycle — write on boot, delete on …
Sep 26, 2026
da1078b
feat(service-runner): write handshake on boot so the extension adopts…
Sep 26, 2026
42e8251
fix(fleet): wire hubPollBudgetMs on server machines so the extension …
Sep 26, 2026
c373bbb
fix(fleet): close the three adoption gaps — real hashes, unarmed audi…
Sep 26, 2026
57bb0a5
fix(fleet): fan-in serves /global/event, not just /event (#1580)
Sep 26, 2026
7addc0f
fix(fleet): open fan-in arms against /global/event (#1580)
Sep 26, 2026
1c5ded6
fix(app): restore entity rail + harden session-message race condition…
Sep 27, 2026
a5cd1e6
fix(fleet): hub spawn injects external-skill suppression + machine sk…
Sep 27, 2026
3361b80
fix(fleet): hub spawn defaults machine skill root to shipped library …
Sep 27, 2026
7f570c1
test(fleet): RED — hub engine env must carry the FULL machine-stable …
Sep 27, 2026
f54dff2
fix(fleet): hub spawn injects the FULL machine-stable config, not jus…
Sep 27, 2026
bd92267
fix(fleet): serialize concurrent prompts to one session — FIFO queue …
Sep 27, 2026
a6125df
chore(app-bundle): refresh manifest to clear stale overlay drift (#1588)
Sep 27, 2026
43f44f0
Webview stream liveness & rail self-heal (#1583) (#1587)
jeonghun-jj-lee Sep 27, 2026
1d7e1d0
chore: remove code-adjacent config/specs — specs live in the vault (#…
jeonghun-jj-lee Sep 27, 2026
774e666
fix(fleet): ESM↔CJS interop banner on the hub runner bundle so L2's y…
Sep 27, 2026
aa5281c
Merge origin/main into feature/free-tier-fleet
Sep 27, 2026
79a5565
fix(mcp): resolve MCP bundle path, spawn node/npx absolute, and injec…
Sep 27, 2026
3da4bc5
fix(fleet): enable session multiplexer by default — non-session /amic…
Sep 28, 2026
19b49c3
fix(engine): sweep stray engines machine-wide, not per-port (#1592) (…
jeonghun-jj-lee Sep 28, 2026
23e7456
fix(amicode-service): reconcile re-opens the dead LOCAL fan-in arm (#…
jeonghun-jj-lee Sep 28, 2026
2484f96
Detached engine lifecycle: adopt-safe restart, fleet-aware self-shutd…
jeonghun-jj-lee Sep 28, 2026
11728e8
refactor(app): fold engine toggle into the amicode MCP row (#1598) (#…
jeonghun-jj-lee Sep 28, 2026
733c18e
fix(app): default engine state to 'on' — popover can only render when…
jeonghun-jj-lee Sep 28, 2026
a844d55
fix(app): drop the confirmation on engine toggle-off (#1598)
Sep 28, 2026
7d61dd4
fix(app): drop the confirmation on Quit too (#1598)
Sep 28, 2026
d15dbc1
fix(fleet): one engine per server — owner-guard the hub handshake + f…
Sep 28, 2026
48d0988
fix(mcp): set ELECTRON_RUN_AS_NODE=1 for the amico MCP server — stop …
Sep 28, 2026
df7b7a4
fix(fleet): role=server window rides the hub engine — retire the ext-…
Sep 28, 2026
cf082a6
fix(fleet): ride-hub only on the UNARMED hub — an armed-peer adopt is…
Sep 28, 2026
c189267
fix(fleet): a fleet server never deletes the shared handshake either …
Sep 28, 2026
7e3aae7
fix(fleet): deterministic unarmed-hub probe — ride the hub without tr…
Sep 28, 2026
ab38be4
fix(fleet): live yield-back to a returning hub — no manual reload, no…
Sep 28, 2026
5159594
fix(fleet): never reap the hub PID — structural, tested (#1607 Slice 4)
Sep 28, 2026
73590b8
fix(engine/overlay): deterministic abort-signal combiner — kill the A…
Sep 28, 2026
e01d5d9
fix(engine/app): graceful engine toggle-off — relay-forward engine-st…
Sep 28, 2026
994202d
fix(app): engine toggle never stuck on stopping; remove the off-narra…
Sep 28, 2026
2adbeb6
fix(#1608): engine toggle updates live on self-expiry (BUG1b)
Sep 28, 2026
175cbf1
feat(#1615): seamless engine toggle-on for hub windows — in-place re-…
Sep 28, 2026
010f8fc
fix(#1616): inline engine toggle Starting…/Stopping… narration
Sep 28, 2026
323de69
fix(#1616): lowercase the inline starting…/stopping… narration
Sep 28, 2026
d353ea5
fix(#1617): re-arm fan-in backpressure (flowing stuck false → stale u…
Sep 28, 2026
81ac490
fix(ui): stop status-popover toggle flipping between square and pill …
jeonghun-jj-lee Sep 28, 2026
7fc23e3
chore(app-bundle): refresh overlay provenance manifest for #1618 swit…
Sep 28, 2026
429d0b8
fix(session-dropdown): flicker, show-more pagination, sort control (#…
jeonghun-jj-lee Sep 28, 2026
1717c79
fix(#1617): backpressure the fleet-of-one verbatim path too (solo-ses…
Sep 28, 2026
f29f720
refactor(dropdown): replace sort toggle buttons with MenuV2 dropdown
Sep 28, 2026
5fbd1d4
style(dropdown): match sort menu font size to flyout, drop accent on …
Sep 28, 2026
7c3c9c1
fix(dropdown): exempt sort menu portal from flyout outside-click dismiss
Sep 28, 2026
54e8622
fix(#1617): rail streaming floor — a racing/stale idle can't blank a …
Sep 28, 2026
09d5172
test(fleet): stop real-SSH suites leaking ssh -N forwards + authorize…
jeonghun-jj-lee Sep 28, 2026
1097543
test(fleet): de-duplicate the three SSH_READY probes onto the shared …
jeonghun-jj-lee Sep 28, 2026
658daa0
fix(#1638): fan-in resumes re-opened arm from last-delivered cursor +…
Sep 28, 2026
10c6809
fix(#1636): stamp monotonic per-session seq at SessionStatus.set + dr…
Sep 28, 2026
9f91171
merge(#1636): server status seq at SessionStatus.set + drop-older guard
Sep 28, 2026
04a26ef
merge(#1638): fan-in resumes from last-delivered cursor + composite-o…
Sep 28, 2026
6ed2261
fix(#1637): turn-active floor keyed on execution.started + fallback c…
Sep 28, 2026
49afaa3
fix(#1637): plumb the turn-active floor into the global-sync child store
Sep 28, 2026
fba87ba
fix(#1637): migrate transcript indicator + context-tab busy memo onto…
Sep 28, 2026
65de8ed
fix(#1637): reconcile status from /session/status on reconnect/gap + …
Sep 28, 2026
df275d8
chore(#1637): refresh app-bundle manifest for the overlay edits (900 …
Sep 28, 2026
7d3a8fc
merge(#1637): client turn-active floor + status reconcile + honor seq
Sep 28, 2026
f4518fe
Merge pull request #1642 from harmoniqs/fix/1617-staleness-roots
jeonghun-jj-lee Sep 28, 2026
7c06843
fix(dropdown): coordinate sort MenuV2 dismiss with flyout outside-click
Sep 28, 2026
58889f6
fix(dropdown): drop MenuV2.Portal — render sort menu inline inside fl…
Sep 28, 2026
7ed619b
fix(dropdown): make sort MenuV2 non-modal — the real fix
Sep 28, 2026
6fde1f8
feat(fleet): pre-flight gate + peer-home-base service routes (#1643, …
Sep 28, 2026
c69dbbf
feat(app): owner-header producer + pre-flight gate wiring (#1643, S3+S4)
Sep 28, 2026
8864c3f
test(fleet): connected wire + opt-in real create-leg E2E (#1643, S5+S6)
Sep 28, 2026
6ccaeec
fix(dropdown): keep the machine badge when a remote session is live/open
Sep 28, 2026
0c53b42
fix(prompt-input): resolve conn from useServer().current, not sdk().s…
Sep 28, 2026
89206f2
feat(fleet): live peer-workspace read unblocks remote create (#1643)
Sep 29, 2026
563cdc0
fix(fleet): hub runner wires observation-only fleet so servers serve …
Sep 29, 2026
b86ae8c
perf(dropdown): throttle the active-session list against streaming churn
Sep 29, 2026
363894b
fix(#1637-followup): raise the turn-active floor on the session.statu…
Sep 29, 2026
01a5876
Merge pull request #1645 from harmoniqs/fix/1637-phantom-execution-event
jeonghun-jj-lee Sep 29, 2026
3106c2c
fix(fleet): fail-closed control default for remote peer sessions
Sep 29, 2026
87c3595
fix(fleet): guard archive against remote peer sessions (phantom-archi…
Sep 29, 2026
abf5f24
feat(fleet): owner-routed remote archive from a peer (control-gated)
Sep 29, 2026
97b6329
fix(fleet): carry peer control overlay onto dropdown rows (#1646)
Sep 29, 2026
c4363b9
fix(fleet): force-sync per-session store on archive so composer flips…
Sep 29, 2026
4a9705e
fix(fleet): composer archived banner reacts to the archive event (#1646)
Sep 29, 2026
9c96c2b
fix(fleet): header archive menu flips read-only in place, keeps unarc…
jeonghun-jj-lee Sep 29, 2026
831ac2e
chore(app-bundle): refresh manifest for #1646 archive-menu fix
jeonghun-jj-lee Sep 29, 2026
f54987a
fix(session): a forced resolve must not ride a stale in-flight reques…
Sep 29, 2026
6134c91
docs(fleet): add troubleshoot-fleet + add-fleet-device; modernize cre…
Sep 29, 2026
b398264
fix(session): a forced sync must not ride a non-forced in-flight requ…
Sep 29, 2026
005ef26
fix(app): chat transcript self-heals on SSE reconnect/wedge (#1646)
Sep 29, 2026
99ec106
feat(fleet): fan out archived session list to peers (#1647 S1+S2)
Sep 29, 2026
606b84a
feat(app): fleet-aware Archive tab — merge peer-owned archived sessio…
Sep 29, 2026
a29264f
feat(app): archived-row parity + chat-menu archive polish for remote …
Sep 29, 2026
61f510d
test(runner): de-flake PID-safety sanity checks — poll exec/kill inst…
Sep 29, 2026
977b12e
feat(app): keep the Archived tab live while open (#1647 S6)
Sep 29, 2026
d35d5b7
fix(app): flip the owner's composer to read-only promptly on remote a…
Sep 29, 2026
2de445f
fix(app): keep the tab's computer icon after archiving a remote sessi…
Sep 29, 2026
88576bc
fix(app): remote archive from the session list now updates the list (…
Sep 29, 2026
f3ec3e8
fix(app): poll the dropdown fleet projection so a remote unarchive re…
Sep 29, 2026
431dfc3
fix(fleet): dial the resolved peer with its own token on remote sessi…
Sep 29, 2026
7c914f2
fix(app): keep the base Authorization on an owner-armed session create
Sep 29, 2026
a30ddaa
feat(fleet): free-tier remote session create routes to the owning peer
Sep 29, 2026
49d34fb
fix(fleet): strip the creator directory from a proxied remote create
Sep 29, 2026
939512b
fix(fleet): keep a remote-create directory only when it is a project …
Sep 29, 2026
0b9e83b
fix(fleet): read the local loopback engine without a password in the …
Sep 29, 2026
bee23ff
fix(app): show local sessions from the fleet projection in the dropdown
Sep 29, 2026
4b4dbf2
fix(app): thought rail stays live during a foreground subagent (#1649)
Sep 29, 2026
19a6542
fix(app): de-lag the sessions dropdown, unblock the machine tag, gate…
Sep 30, 2026
62e45b6
fix(app): stop the sessions-dropdown hover flash, teleport the owner tag
Sep 30, 2026
563c99e
fix(app): the owner tag slides (not teleports), keeping full length o…
Sep 30, 2026
b14999a
Merge remote-tracking branch 'origin/main' into reconcile/free-tier-f…
Oct 11, 2026
f83681e
fix: amico-run retirement compliance — 4 feature-added violations rew…
Oct 11, 2026
34b8078
chore(app-bundle): refresh manifest after merge (drift gate compliance)
Oct 11, 2026
38cad16
Merge pull request #1763 from harmoniqs/reconcile/free-tier-fleet-mai…
jeonghun-jj-lee Oct 11, 2026
fd37762
perf(app): archive/unarchive flip the composer via info-only resolve,…
Oct 12, 2026
5738e1e
fix(app): archived sessions vanish instantly from the Sessions dropdo…
Oct 12, 2026
78449e1
feat(chat): shared chat-session launcher + per-panel app-ready state …
Oct 12, 2026
3c7c43d
feat(sidebar): Add machine + both Troubleshoot entry points on the sh…
Oct 12, 2026
51ff0ad
feat(sidebar): FLEET header Refresh re-arms the watcher, then re-read…
Oct 12, 2026
6605b80
feat(sidebar): visible focus control + focus re-renders the FLEET sec…
Oct 12, 2026
a635631
docs(glossary): Machine + Focused machine; FLEET section says machine…
Oct 12, 2026
d98e887
fix(sidebar): empty fleet → create-a-fleet; remove per-row focus cont…
Oct 12, 2026
f787b75
Merge pull request #1765 from harmoniqs/amico/issue-1764-fleet-header…
jeonghun-jj-lee Oct 12, 2026
2e54fd4
feat(fleet): owner map records each session's directory (#1766, check…
Oct 12, 2026
d352b81
feat(fleet): fleet session-status read — resolution + fan-out halves …
Oct 12, 2026
b86b426
feat(fleet): GET /amicode/fleet/session-status route (#1766, checkpoi…
Oct 12, 2026
26487e8
feat(app): fleet session-status re-seed client + fallback (#1766, che…
Oct 12, 2026
f4a6de1
feat(app): fleet re-seed triggers + 10 s self-heal + end-to-end (#176…
Oct 12, 2026
01b076d
fix(app): self-heal ticks do not re-arm the unknown-retry budget (#1766)
Oct 12, 2026
d8c2791
Update peer fleet setup guidance
jack-champagne Oct 12, 2026
cca006d
Merge pull request #1769 from harmoniqs/docs/peer-fleet-tailscale-gui…
jeonghun-jj-lee Oct 12, 2026
4f7981a
Merge pull request #1768 from harmoniqs/amico/issue-1766-fleet-sessio…
jeonghun-jj-lee Oct 12, 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
  •  
  •  
  •  
17 changes: 17 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,13 @@ jobs:
needs: [build-binary]
steps:
- uses: actions/checkout@v7
# full history: the #1346 additive-invariants-gate diffs the enroll/guard
# set vs `git merge-base HEAD <base>` — a shallow (depth-1) checkout has no
# common ancestor, so the merge-base is empty and the gate (correctly)
# refuses to pass an UNVERIFIABLE AC1 under INVARIANT_STRICT=1. Full history
# lets it actually verify. (#1346)
with:
fetch-depth: 0
- uses: pnpm/action-setup@v6 # version pinned by packageManager in package.json
- uses: actions/setup-node@v7
with: { node-version: 20, cache: pnpm }
Expand All @@ -112,6 +119,16 @@ jobs:
run: node packages/extension/scripts/assert_packaged_cli.mjs
- name: fleet-gate — guard + tunnel template sane (#324)
run: bash packages/extension/scripts/assert_fleet_guard.sh
- name: additive-invariants-gate — peer studios stay additive (ADR 0027, #1346)
env:
INVARIANT_STRICT: "1" # CI must be able to verify AC1 — an unverifiable base is a hard fail
run: |
# AC1 diffs the enroll/guard set vs the MERGE-BASE with the base branch.
# A shallow checkout may not carry the base branch, so fetch it here —
# this also persists the ref for the later vitest subprocess in the
# `pnpm -r run test` step, which runs the same gate.
git fetch --no-tags --quiet origin "${GITHUB_BASE_REF:-feature/free-tier-fleet}" || true
bash packages/extension/scripts/assert_additive_invariants.sh
# Pasqal python provisioning gate, source lane: the SHIPPED connector
# assets must provision a working interpreter (real venv + pip + SDK
# import at the pinned version + validator env-guard smoke). Guards the
Expand Down
54 changes: 51 additions & 3 deletions CONTEXT.md
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,26 @@ source)
The per-machine stance for where Sessions are served from, in three values. `standalone` — this machine spawns and owns its own chat server, detached and survivable so it outlives an extension-host reload and is re-adopted rather than dying with the editor (the default; the only mode that ever spawns). `server` — this machine runs the Canonical Server as a system service and the panel attaches to it. `client` — this machine never serves; the panel attaches to the Canonical Server through a Managed Tunnel. Determined by `~/.amico/ops/fleet/fleet.json` (no file = standalone). Machine-scoped, never synced.
_Avoid_: profile, spawn vs attach (as concept names)

**Capability**:
An orthogonal, open tag describing what a machine is *for* — distinct from its serve-stance (Server mode). Two known, behavior-adjacent tags: `compute` (a solve-target hint — declared-but-inert until a fleet-peer executor exists, an explicit non-goal today) and `roaming` (a transport hint that defaults a machine to Tailscale). Any other tag is a free descriptive label with no behavioral meaning; it round-trips verbatim. A Capability never overrides the guard/tunnel/hub decision — Server mode stays the only serve-stance authority (ADR 0026).
_Avoid_: role (that is Server mode), type, class

**Roster**:
The amicode-owned, fleet-wide device list on the Canonical Server (`~/.amico/ops/fleet/roster.json`) — one row per machine, each machine the single writer of its own row (a registry/heartbeat model). A row is `{ machine_id, name, server_mode, capabilities[], sshAlias, transport, last_report, health, device_type? }` with `health ∈ {reachable, degraded, down}`; the UI labels `server_mode` as "role" and `last_report` as "last-seen". Surfaced at `GET /amicode/roster` (read) + `POST /amicode/roster` (self-report), on the proxied `/amicode/*` namespace so a client sees it through the host proxy. Separate from `fleet.json` (untouched — one-parser invariant, ADR 0023) and from the per-machine projection (which carries only this machine's topology). ADR 0026.
_Avoid_: fleet.json (a different, per-machine file), device table, inventory

**Device identity**:
The self-reported, human-facing half of a Roster row: the machine's friendly **name** (macOS `scutil` ComputerName / Linux `PRETTY_HOSTNAME` / an explicit `amicode.deviceName` override, else the prettified hostname) and its **device type** (`server | desktop | laptop`, an open set — macOS `system_profiler` model / Linux chassis / an `amicode.deviceType` override, else absent). Derived once by logic shared between the enroll producer and the sidebar self-row so a machine and its peers cannot disagree; absent/undefined values fall back honestly (type → `server_mode`), never fabricated. The Canonical Server self-registers its own device identity keyed by `machine_id = canonical.host`. Refreshed by re-enroll. ADR 0028.
_Avoid_: hostname (the raw FQDN, not the friendly name), machine_id (the identity key, not the display name)

**Machine**:
One computer in the Fleet — the unit a Roster row describes and Enroll brings in.
_Avoid_: device (a Device is a QPU or emulator behind a Connection), node

**Focused machine**:
The one Machine the window's working surfaces are scoped to, chosen in the FLEET section and defaulting to this machine; a UI selection, never a Roster change.
_Avoid_: active machine, selected device

**Fleet config**:
The file at `~/.amico/ops/fleet/fleet.json` that declares this machine's fleet role and the canonical server's coordinates (`host`, `port`, `sshAlias`). No file on disk = standalone. The guard script, extension, and installer all resolve role from this file — never from a hardcoded hostname.
_Avoid_: fleet.toml, fleet settings (those are VS Code settings, a different thing)
Expand All @@ -184,13 +204,17 @@ The one chat server that owns the fleet's Session store — the single writer ev
_Avoid_: master, primary, host

**Fleet**:
The user's machines acting as one logical studio: exactly one Canonical Server plus zero-or-more clients, all attaching to the same Session store.
The user's machines acting as one logical studio. Two topologies, both "the Fleet": the **single-store** shape — exactly one Canonical Server plus zero-or-more clients, all attaching to the same Session store — and the **independent-peer** shape (ADR 0031/0034), where **Peer studios** each own their own Sessions and reach each other by Observe/Control rather than a shared writer. A keeper/canonical coordinate owns roster and bootstrap authority in both.
_Avoid_: mesh, cluster

**Go Standalone**:
The user-invoked mode switch from `client` to `standalone` — the machine leaves the fleet and serves itself permanently. Not an escape hatch: a first-class choice. Sessions made locally stay local. Re-enrollment in a fleet is a separate flow (Enroll, deferred).
The user-invoked mode switch from `client` to `standalone` — the machine leaves the fleet and serves itself permanently. Not an escape hatch: a first-class choice. Sessions made locally stay local. Re-enrollment in a fleet is a separate flow (Enroll).
_Avoid_: local fallback, offline mode, degraded mode

**Enroll**:
The idempotent, verifiable flow that brings one machine into a fleet — the inverse of Go Standalone. Server-first, the standard join-token pattern: `amico fleet enroll --as-server` provisions the durable hub service, mints the Fleet token, and emits a **join token** (`{ canonical, fleet_token, transport_hint, pin_version }` — a secret, 0600, never logged). A client redeems it with `amico fleet enroll --join-token`: it rejects a pin-mismatched token before writing anything, then writes `fleet.json` (role + canonical only — capabilities go to the roster row), registers its roster row, sets the transport (`tailscale` when the machine roams, else the token's hint), runs the installer (which installs the never-fork guard), and **verify-attaches** — reporting success only after a live probe of the just-set transport passes. A re-run repairs in place; a failed verify surfaces the specific cause with its fix and never reports a false success. `amico fleet enroll` is a distinct verb from the session registry — it writes membership, not session records.
_Avoid_: register (as the verb name), pair, handshake

**Fleet token**:
The shared secret authenticating a client to the Canonical Server's data routes — minted when the fleet server is enabled, stored at 0600, handed to clients during the ssh-based setup flow. The sibling of the per-boot server password (ADR 0002): that guards a spawned server its extension owns; this guards the service no extension spawns.
_Avoid_: API key, password
Expand All @@ -215,6 +239,30 @@ _Avoid_: keepalive, lock, busy flag
The interval after an extension-host teardown during which a detached standalone server stays alive awaiting re-adoption. On expiry with no adoption and no active-work pin the server self-exits and deletes its handshake; a reload re-adopts well within it, a genuine quit does not.
_Avoid_: timeout, linger period

**Peer studio**:
An independent serving peer whose Sessions it owns, observed or controlled from another machine's window. The independent-peer complement to the single-store Canonical Server: Peer studios do **not** share one Session store — each owns its own, and cross-machine access is by Observe/Control, never a shared writer (ADR 0031, 0034).
_Avoid_: remote server (that is transport), replica, node

**Observe (peer observation)**:
Read-only visibility into a Peer studio's Sessions from another machine — its session list, one session's history and events. Unlocked by **trust** (a reader token seeded at Enroll), not by a Control grant. A peer-owned session's reads route to the owner with the owner's own reader token; a write never routes on the observation path (#1537).
_Avoid_: view, mirror, follow, spectate

**Control (peer control)**:
The authority to *drive* a Peer studio's Session from another machine — send prompts, archive, delete. A strictly higher unlock than Observe, carried by a persisted per-peer **Control grant** (`control` scope) and re-armed each session (never auto-restored). Fails closed: no grant, revoked, transport-down, or observe-only → the write is denied, never served locally.
_Avoid_: write access, remote admin, takeover

**Enable control**:
The explicit, per-session act that arms Control on a peer. For a **self-owned** peer with verified management access it is one click on the controlling machine, authorized at Enroll — no target-side prompt, since a headless peer has no window. For a **shared** peer it is the far side of a request→approve handshake routed to the peer's Lifecycle-admin authority.
_Avoid_: grant (that is the record), connect, claim

**Lifecycle-admin authority**:
The machine/operator that may mint, revoke, and re-admit a Peer studio's grants — the `lifecycle-admin` scope, **not** a superset of Control. Seeded at Enroll (the enroller is recorded as the peer's `authorityIdentityKey`), so a headless peer's Control can be approved from a UI-bearing machine; the peer itself only *enforces* presented tokens, never rendering approval.
_Avoid_: owner, root, keeper (keeper is roster/bootstrap coordination, a different authority)

**Driving**:
The live state in which one window is authoring turns on a Peer studio's Session under active Control, marked by a persistent "driving `<peer>`" banner so control is never ambient.
_Avoid_: remote session, controlling (as a noun), piloting

### Surfaces

**Work Column**:
Expand All @@ -238,7 +286,7 @@ A sandboxed ES-module card rendered in an iframe within Home. Authored by the ag
_Avoid_: Card (ambiguous — the UI has many cards), tile (as the concept name — tile is a size class)

**Sidebar**:
The webview in the VS Code activity bar container, showing project navigation and system status. Contains action buttons (open chat, create project), a session-aware unified project tree (Research Projects with lifecycle metadata expanding into file trees; Dev Projects as plain expandable folders), and a collapsible fleet section (deferred). The sidebar is navigation chrome — it follows the active session's project binding but never drives session switching. Single-clicking a file opens it as a tab in Preview (the multi-document file workspace in the side panel); double-clicking opens a native VS Code editor tab.
The webview in the VS Code activity bar container, showing project navigation and system status. Contains action buttons (open chat, create project), a session-aware unified project tree (Research Projects with lifecycle metadata expanding into file trees; Dev Projects as plain expandable folders), and a collapsible fleet section that is **read-only** toward the fleet — a glanceable list of Machines from the host-owned Roster (one row per machine: name, `server_mode` labeled "role" + capability chips, a `reachable`/`degraded`/`down` health indicator, and `last_report` labeled "last-seen"), marking the Focused machine. It offers navigation actions only — connect, focus, Troubleshoot, Add machine, Refresh — and never writes fleet config or Roster rows. The section refreshes on posture-change and shows an honest empty/degraded state when the roster host is down — never a fabricated list (#1321, ADR 0026). The sidebar is navigation chrome — it renders state and navigates, never mutating fleet config or driving session switching. Single-clicking a file opens it as a tab in Preview (the multi-document file workspace in the side panel); double-clicking opens a native VS Code editor tab.
_Avoid_: Explorer (VS Code's native file explorer is separate), Panel (the in-app dismissible drawer is a different concept)

**Preview**:
Expand Down
Loading
Loading