paseo-room 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +118 -13
  2. package/dist/index.js +452 -60
  3. package/dist/index.js.map +1 -1
  4. package/dist/prompts/contract/lead.md +13 -4
  5. package/dist/prompts/contract/shared-authority.md +2 -2
  6. package/dist/prompts/contract/supervisor.md +17 -0
  7. package/dist/runtime-plugin/client/attention-settings.tsx +173 -0
  8. package/dist/runtime-plugin/client/data.ts +14 -2
  9. package/dist/runtime-plugin/client/forms.tsx +326 -0
  10. package/dist/runtime-plugin/client/host.ts +17 -0
  11. package/dist/runtime-plugin/client/kit.tsx +298 -0
  12. package/dist/runtime-plugin/client/model.ts +108 -0
  13. package/dist/runtime-plugin/client/pills.ts +58 -0
  14. package/dist/runtime-plugin/client/record.tsx +241 -0
  15. package/dist/runtime-plugin/client/role-pills.tsx +96 -0
  16. package/dist/runtime-plugin/client/room.tsx +291 -0
  17. package/dist/runtime-plugin/client/tone.ts +2 -0
  18. package/dist/runtime-plugin/client/views.tsx +161 -150
  19. package/dist/runtime-plugin/index.client.tsx +10 -2
  20. package/dist/runtime-plugin/index.server.ts +37 -3
  21. package/dist/runtime-plugin/server/attention/delivery.ts +193 -0
  22. package/dist/runtime-plugin/server/attention/engine.ts +465 -0
  23. package/dist/runtime-plugin/server/attention/key.ts +44 -0
  24. package/dist/runtime-plugin/server/attention/log.ts +54 -0
  25. package/dist/runtime-plugin/server/attention/mask.ts +44 -0
  26. package/dist/runtime-plugin/server/attention/observer.ts +313 -0
  27. package/dist/runtime-plugin/server/attention/portfolio.ts +77 -0
  28. package/dist/runtime-plugin/server/attention/questions.ts +80 -0
  29. package/dist/runtime-plugin/server/attention/seat-starter.ts +166 -0
  30. package/dist/runtime-plugin/server/attention/sensor.ts +207 -0
  31. package/dist/runtime-plugin/server/attention/signals.ts +230 -0
  32. package/dist/runtime-plugin/server/attention/triage.ts +68 -0
  33. package/dist/runtime-plugin/server/brief.ts +13 -1
  34. package/dist/runtime-plugin/server/context.ts +26 -2
  35. package/dist/runtime-plugin/server/contracts/actions.ts +18 -3
  36. package/dist/runtime-plugin/server/controller.ts +361 -58
  37. package/dist/runtime-plugin/server/correlations.ts +7 -3
  38. package/dist/runtime-plugin/server/domain/acceptance.ts +7 -2
  39. package/dist/runtime-plugin/server/domain/scope.ts +191 -0
  40. package/dist/runtime-plugin/server/domain/state.ts +281 -8
  41. package/dist/runtime-plugin/server/domain/views.ts +141 -7
  42. package/dist/runtime-plugin/server/events/schema.ts +33 -2
  43. package/dist/runtime-plugin/server/git.ts +93 -1
  44. package/dist/runtime-plugin/server/handlers/actions.ts +58 -12
  45. package/dist/runtime-plugin/server/handlers/peer.ts +22 -3
  46. package/dist/runtime-plugin/server/handlers/turns.ts +28 -21
  47. package/dist/runtime-plugin/server/host.ts +26 -0
  48. package/dist/runtime-plugin/server/lifecycle.ts +14 -3
  49. package/dist/runtime-plugin/server/notices.ts +26 -3
  50. package/dist/runtime-plugin/server/ownership.ts +1 -1
  51. package/dist/runtime-plugin/server/paseo-port.ts +299 -18
  52. package/dist/runtime-plugin/server/recovery.ts +124 -7
  53. package/dist/runtime-plugin/server/rpc.ts +198 -9
  54. package/dist/runtime-plugin/server/seats.ts +122 -0
  55. package/dist/runtime-plugin/server/tools.ts +9 -6
  56. package/dist/runtime-plugin/shared/attention.ts +70 -0
  57. package/dist/runtime-plugin/shared/identity.ts +8 -0
  58. package/dist/runtime-plugin/shared/limits.ts +6 -0
  59. package/dist/runtime-plugin/shared/policy.ts +2 -2
  60. package/dist/runtime-plugin/shared/rpc-contracts.ts +99 -1
  61. package/package.json +3 -2
package/README.md CHANGED
@@ -278,8 +278,9 @@ recreate an existing Claude session after setup or an update.
278
278
  have none. Only the contract is dropped, never your own memory, and an earlier generation of it
279
279
  is removed rather than left behind. The choice is recorded in `room.json`, so `verify` compares
280
280
  against it and rejects the flag itself; `setup` without the flag restores the fallback. Keep the
281
- fallback unless you have a reason not to: the plugin hook is verified, but whether a *resumed*
282
- session re-enters it is unproven, and `CLAUDE.md` is what covers that case.
281
+ fallback unless you have a reason not to: the plugin hook is verified, and on Paseo 0.9.1 a
282
+ *resumed* session was observed to keep the room prompt, but that is not proven for every
283
+ supported version or for what the model actually reads, and `CLAUDE.md` is what covers that case.
283
284
 
284
285
  Pi providers use a strict command tail:
285
286
 
@@ -506,9 +507,12 @@ healthy owner, and closes the duplicate only after a stable handoff. Ambiguous o
506
507
  health, or concurrent writes go back to Human rather than being guessed or merged.
507
508
 
508
509
  Two further limits are deliberately conservative. **One writable Peer per project**, not one
509
- per moving scope: the room gives you no writer isolation, so separate scopes are not evidence
510
- of separate working trees, and no workspace protocol relaxes the limit. Concurrent writable
511
- Peers in isolated worktrees are a deferred decision, not an oversight. And a seat's **model and
510
+ per moving scope: separate scopes are not evidence of separate working trees, and no workspace
511
+ protocol relaxes the limit. The contract makes one exception — Peers the runtime dispatches into
512
+ its own worktrees with non-overlapping declared scopes (runtime Phase 2,
513
+ [runtime-coordination-phase2.md](docs/design/runtime-coordination-phase2.md); see
514
+ [Isolated writers](#isolated-writers-runtime-phase-2) below). Every other Peer, and every writer in
515
+ Lead's own workspace, is inside the limit. And a seat's **model and
512
516
  reasoning effort are not one knob**: the model stays the profile's default unless a repository
513
517
  protocol explicitly supplies model routing, while the thinking effort is Lead's
514
518
  per-brief choice on task risk, uncertainty, context size and verification burden — lowest that
@@ -616,8 +620,9 @@ npx paseo-room verify
616
620
  points, so a daemon outside that range is refused for runtime while the baseline room keeps
617
621
  working.
618
622
  - **Lead** gains room tools such as `assignment_create`, `assignment_dispatch`, `assignment_answer`,
619
- `assignment_accept` and `gate_run`. **Supervisor** gains `room_status`, `runtime_findings` and
620
- `message_lead`, and cannot change an assignment.
623
+ `assignment_accept`, `gate_run`, and for isolated writers `workspace_close` and `lease_reclaim`.
624
+ **Supervisor** gains `room_status`, `runtime_findings`, `message_lead` (with a `project` for a
625
+ Supervisor of several projects) and `attention_feedback`, and cannot change an assignment.
621
626
  - **A runtime-dispatched Peer** gets exactly two tools, `ask` and `handoff`, for its own assignment,
622
627
  and still no Paseo room tools. A report exists only once one of those calls is accepted; its
623
628
  final message is never read as a report. Claude asks for permission before a Peer's first call
@@ -629,13 +634,110 @@ npx paseo-room verify
629
634
  immutable commit. The runtime reads the commit and changed paths itself, never merges, resets,
630
635
  cleans or stashes, and releases a writer only after Paseo proves the Peer archived.
631
636
  - **State** lives under `~/.paseo-room/runtime/v1` as append-only event files. Setup never edits it.
632
- The **Room runtime** sidebar item and workspace panel show projects, assignments, writer
633
- ownership and findings, each labelled with how it is known (enforced, detected, procedural,
634
- unverifiable).
637
+ - **The Room runtime panel** (sidebar item, and a workspace panel that opens on its own project)
638
+ puts what needs you first. Below that come your projects, ordered by status, then your
639
+ Supervisors.
640
+ - A project shows its Supervisor, its Lead and Peer seats (each opens its agent in Paseo) and its
641
+ runtime record: assignments, isolated writers, findings and recovery.
642
+ - Starting a Supervisor, starting a project and assigning a Supervisor are guided forms.
643
+ - The design notes are in [docs/design/runtime-panel-ux.md](docs/design/runtime-panel-ux.md).
644
+ - **Settings › Room seats** shows which account each seat is signed in to (email, plan and
645
+ organization for Claude; login method for Codex; for Pi, only whether a credential file exists).
646
+ It runs each seat's own `claude auth status` or `codex login status` when you open it or press
647
+ Refresh, and never reads a credential file. A seat linked to another home's login is flagged.
648
+
649
+ ### Room attention: what reaches a Supervisor
650
+
651
+ The runtime watches every room seat Paseo reports — Supervisors, Leads and Peers, including Peers a
652
+ Lead opens with Paseo's own tools — and tells each project's **Supervisor** what it would otherwise
653
+ learn only when you ask it to check.
654
+
655
+ - **Portfolio.** One Supervisor may supervise several projects. A project's Supervisor is the one
656
+ you assign in the **Room** view; otherwise it is the Supervisor that opened the project's Lead;
657
+ otherwise there is none, and that project's signals show only in the panel.
658
+ - **Letters.** Letters arrive as prompts beginning with `[paseo-room attention att_…]`.
659
+ - They report a permission waiting on any seat for 5 minutes, and a Peer result its idle Lead has
660
+ not read for 10 minutes.
661
+ - They report the same failure twice in a row, and possible concurrent writers in one working
662
+ tree.
663
+ - They report a Lead archived while its seats still work, and a Lead's finished turn that the
664
+ Supervisor did not prompt itself.
665
+ - Letters are held until the Supervisor is idle, batched into digests, and limited to a few wakes
666
+ an hour. They are never sent while the Supervisor holds a permission, because a send would
667
+ deny it.
668
+ - Each item has an id for `attention_feedback`. A letter is evidence, not an instruction: the
669
+ Supervisor contract has it ask or nudge the Lead, or relay a question to you, and never direct a
670
+ Peer.
671
+ - **Starting seats.** From the **Room** view, **Start Supervisor** opens one in an existing directory
672
+ outside every repository. **Start project** checks a repository, opens its Lead under the
673
+ Supervisor you pick, and sends a fixed kickoff with your first directive verbatim. **Assign
674
+ Supervisor** moves an existing project under a Supervisor.
675
+ - **Settings › Room attention.** Here you turn letters on or off, change their thresholds, and
676
+ configure the optional **attention sensor**.
677
+ - The sensor speaks the System One HTTP shape, with [TypeSafe Jev](https://docs.typesafe.ai/)
678
+ first and any compatible or self-hosted endpoint after it. It is `off` by default.
679
+ - Without a TypeSafe key, use Jev through OpenRouter: endpoint
680
+ `https://openrouter.ai/api/v1/systemone`, model `typesafe/jev-1.13`, and an OpenRouter key.
681
+ OpenRouter can answer with a dated snapshot such as `typesafe/jev-1.13-20260917`, which the
682
+ sensor accepts as the pinned model.
683
+ - `shadow` assesses Lead messages and records the answers without acting on them. `assist` lets
684
+ them decide, for the question sets you enable, whether a Lead turn wakes the Supervisor, waits
685
+ for a digest, or is only recorded.
686
+ - Nothing leaves the machine until you acknowledge the endpoint's host, and only masked, bounded
687
+ excerpts of Lead messages are sent.
688
+ - The key is write-only: it is stored owner-only under `~/.paseo-room/runtime/v1/secrets` and never
689
+ shown again.
690
+ - **Evaluation.** `npm run attention:eval` (in this repository) reads your Claude Lead transcripts
691
+ read-only and prints what an evaluation would send. `-- --send` runs it against the endpoint, as
692
+ your consent for that run.
693
+
694
+ ### Isolated writers (runtime Phase 2)
695
+
696
+ By default a writable assignment runs in Lead's workspace and excludes every other writer. With
697
+ `isolation: "worktree"` on `assignment_dispatch`, the runtime instead asks Paseo for a new worktree
698
+ cut from the assignment's exact base commit, proves it with Git (its repository, its exact `HEAD`, a
699
+ clean tree, not Lead's directory), and places the Peer there with Lead as its parent. Up to three
700
+ such writers may run at once in one project.
701
+
702
+ The runtime refuses an isolated dispatch before recording anything or asking Paseo for anything,
703
+ and the refusal is final for that dispatch — narrow or sequence the work:
704
+
705
+ | Code | Why |
706
+ |---|---|
707
+ | `worktree_unqualified` | the daemon's version has not passed live qualification for worktree dispatch |
708
+ | `worktree_setup_unobservable` | `paseo.json` at the base declares `worktree.setup`, which Paseo runs where the runtime cannot see it finish |
709
+ | `scope_not_canonical` | a `writeScope` or `serialOnly` item is not a repository-relative path or `*`/`?`/`**` glob |
710
+ | `writer_exclusive` | a writer is still active in Lead's workspace (or, the other way round, isolated writers are active) |
711
+ | `writer_uncertain` | another isolated writer's state is uncertain |
712
+ | `lease_cap` | three isolated writers are already active |
713
+ | `scope_overlap` | the new scope may share a path with an active writer's scope |
714
+ | `serial_path` | both the new scope and an active writer reach a path Lead declared `serialOnly` |
715
+
716
+ Write scopes prevent collisions between isolated writers; **they do not contain a Peer**, which can
717
+ still write anywhere its user can. At handoff the runtime records any changed path outside the
718
+ scope as `scope.exceeded`, and accepting that candidate needs an override. Lead still integrates
719
+ each candidate by hand, in its own workspace, one at a time; the runtime never merges, rebases or
720
+ pushes.
721
+
722
+ When the writer is released, the runtime closes a worktree that is clean at the handed-back
723
+ candidate or the unchanged base. Anything else is kept and Lead is told: `workspace_close` with
724
+ `discardUncommitted` and a reason destroys that work. Closing removes the directory and keeps the
725
+ branch. If a Peer dies, `lease_reclaim` — once Paseo shows it archived — dispatches a new Peer into
726
+ the same worktree at the next lease epoch; the old Peer's late reports are refused. The panel offers
727
+ the Human form of both, only where the runtime would accept it, and asks twice before discarding
728
+ work.
729
+
730
+ Worktree dispatch is enabled per daemon version, only after the live qualification in the Phase 2
731
+ delta §9 passes on that version; `0.9.1` is qualified. On any other version the runtime refuses
732
+ `worktree_unqualified` and dispatch without isolation still works.
635
733
 
636
734
  To stop using it, finish, close or abandon the recorded work, then run setup **without**
637
- `--runtime`. Setup refuses while anything is still active or uncertain, and keeps the recorded
638
- state once it proceeds. `npx paseo-room export --apply` copies that state out; the export omits gate
735
+ `--runtime`. Setup refuses while anything is still active or uncertain — including an isolated
736
+ writer's lease or an unconfirmed worktree create or close — and keeps the recorded state once it
737
+ proceeds. Retained worktrees belong to Paseo, and directories a failed teardown left behind are
738
+ yours: setup and `remove` count both and delete neither. Close a retained worktree from the panel
739
+ before deselecting (or archive it in Paseo afterwards); remove a left-behind directory by hand, and
740
+ its finding clears. `npx paseo-room export --apply` copies that state out; the export omits gate
639
741
  output unless you add `--include-gate-output`, and briefs or commands written by a seat cannot be
640
742
  proven secret-free. `remove --apply` warns about runtime history and then deletes it with the rest
641
743
  of the room.
@@ -651,7 +753,10 @@ of the room.
651
753
  - [docs/product/runtime-coordination-prd.md](docs/product/runtime-coordination-prd.md),
652
754
  [docs/design/runtime-coordination.md](docs/design/runtime-coordination.md) and
653
755
  [docs/plans/runtime-coordination-phase1-implementation-plan.md](docs/plans/runtime-coordination-phase1-implementation-plan.md)
654
- — the runtime coordination preview: requirements, technical design and Phase 1 plan.
756
+ — the runtime coordination preview: requirements, technical design and Phase 1 plan;
757
+ [docs/design/runtime-coordination-phase2.md](docs/design/runtime-coordination-phase2.md) and
758
+ [docs/plans/runtime-coordination-phase2-implementation-plan.md](docs/plans/runtime-coordination-phase2-implementation-plan.md)
759
+ — worktree concurrency (Phase 2).
655
760
  - [docs/product/paseo-room-prd.md](docs/product/paseo-room-prd.md) — the original PRD, kept
656
761
  for history; the transactional-installer requirements in it were deliberately dropped.
657
762