Skip to content

Islands: fully separate switchable room contexts #13

Description

@RonTuretzky

Deferred from the 2026-08-05/06 build round (operator call: park it).

Operator-confirmed semantics: an island = a completely fresh room — ideas, builds/fleet, conversation tree, transcript. All windows switch together. Created/switched from a 🏝 Islands control in the ⚙ Controls dock.

Planned architecture (from the approved plan, unbuilt — a first agent attempt died to a session limit leaving no code):

  • IslandManager (new src/server/islands.ts) owning N runtime contexts with ONE active: instantiate the existing createProjectorRuntime boundary per island (registry/ledger/detection/research are already runtime-scoped) via an injected async factory providing per-island builds/<islandId>/ + artifacts roots.
  • Shared singletons (mic session, ASR, hands hub, preview ports) stay outside and reroute to the active island on switch (stop capture → swap → resume).
  • Persistence: artifacts/islands.json {islands:[{id,name,createdAtMs}], activeId}; lazy runtime creation on first switch; boot island wraps the initial runtime.
  • Snapshot gains island: {id, name, all:[{id,name}]}; switching publishes the new island's snapshot over the existing SSE so every window follows automatically.
  • Endpoints: POST /api/island (create+switch), POST /api/island/:id/switch, GET /api/islands.
  • Quiesce inactive islands (pause detection ticker + research cadence); cap ~8 islands.
  • Dock UI: current island name, dwellable island list, "➕ New island".

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions