paseo-room 0.8.0 → 0.10.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 (54) hide show
  1. package/README.md +73 -23
  2. package/dist/index.js +306 -172
  3. package/dist/index.js.map +1 -1
  4. package/dist/plugin-assets/paseo-plugin.json +1 -1
  5. package/dist/prompts/contract/supervisor.md +22 -1
  6. package/dist/prompts/runtime/handoff-request.md +43 -0
  7. package/dist/prompts/runtime/successor-kickoff.md +14 -0
  8. package/dist/runtime-plugin/client/context-settings.tsx +93 -0
  9. package/dist/runtime-plugin/client/data.ts +6 -0
  10. package/dist/runtime-plugin/client/forms.tsx +167 -77
  11. package/dist/runtime-plugin/client/kit.tsx +4 -11
  12. package/dist/runtime-plugin/client/model.ts +136 -1
  13. package/dist/runtime-plugin/client/pills.ts +7 -1
  14. package/dist/runtime-plugin/client/record.tsx +2 -1
  15. package/dist/runtime-plugin/client/room.tsx +91 -11
  16. package/dist/runtime-plugin/client/succession.tsx +279 -0
  17. package/dist/runtime-plugin/client/time.ts +21 -0
  18. package/dist/runtime-plugin/client/views.tsx +18 -5
  19. package/dist/runtime-plugin/index.server.ts +40 -34
  20. package/dist/runtime-plugin/paseo-plugin.json +1 -1
  21. package/dist/runtime-plugin/server/attention/delivery.ts +21 -6
  22. package/dist/runtime-plugin/server/attention/engine.ts +101 -5
  23. package/dist/runtime-plugin/server/attention/log.ts +7 -1
  24. package/dist/runtime-plugin/server/attention/observer.ts +100 -22
  25. package/dist/runtime-plugin/server/attention/seat-starter.ts +16 -5
  26. package/dist/runtime-plugin/server/attention/signals.ts +28 -2
  27. package/dist/runtime-plugin/server/attention/succession-store.ts +115 -0
  28. package/dist/runtime-plugin/server/attention/succession.ts +662 -0
  29. package/dist/runtime-plugin/server/brief.ts +8 -0
  30. package/dist/runtime-plugin/server/context.ts +33 -6
  31. package/dist/runtime-plugin/server/contracts/actions.ts +12 -5
  32. package/dist/runtime-plugin/server/controller.ts +57 -16
  33. package/dist/runtime-plugin/server/domain/acceptance.ts +12 -2
  34. package/dist/runtime-plugin/server/domain/state.ts +6 -3
  35. package/dist/runtime-plugin/server/domain/views.ts +40 -0
  36. package/dist/runtime-plugin/server/events/schema.ts +3 -0
  37. package/dist/runtime-plugin/server/generated/succession.ts +11 -0
  38. package/dist/runtime-plugin/server/git.ts +8 -4
  39. package/dist/runtime-plugin/server/handlers/actions.ts +41 -13
  40. package/dist/runtime-plugin/server/handlers/turns.ts +62 -2
  41. package/dist/runtime-plugin/server/hooks.ts +81 -0
  42. package/dist/runtime-plugin/server/notices.ts +136 -50
  43. package/dist/runtime-plugin/server/paseo-port.ts +107 -9
  44. package/dist/runtime-plugin/server/recovery.ts +13 -7
  45. package/dist/runtime-plugin/server/rpc.ts +52 -14
  46. package/dist/runtime-plugin/server/store/project.ts +29 -10
  47. package/dist/runtime-plugin/server/timeout.ts +24 -0
  48. package/dist/runtime-plugin/server/tools.ts +9 -4
  49. package/dist/runtime-plugin/shared/identity.ts +31 -10
  50. package/dist/runtime-plugin/shared/limits.ts +2 -0
  51. package/dist/runtime-plugin/shared/policy.ts +5 -1
  52. package/dist/runtime-plugin/shared/rpc-contracts.ts +39 -1
  53. package/dist/runtime-plugin/shared/seat-context.ts +81 -0
  54. package/package.json +1 -1
package/README.md CHANGED
@@ -73,9 +73,9 @@ starts, its exit code is preserved; a signal is returned using the conventional
73
73
  - A running Paseo daemon with CLI and daemon on the same version. Codex requires
74
74
  **0.8.0-beta.1 or newer**; any selection containing Claude or Pi requires **0.8.0 or newer**.
75
75
  Claude also requires Paseo plugins to be enabled explicitly: the generated trusted server plugin
76
- is the strong contract carrier, and `paseo-room` never enables plugins for you. The plugin is
77
- version-bounded to `>=0.8.0 <0.10.0`. `paseo-room` checks compatibility before touching anything,
78
- and never installs or upgrades Paseo.
76
+ is the strong contract carrier, and `paseo-room` never enables plugins for you. The plugin
77
+ requires Paseo `>=0.8.0` and has no upper bound. `paseo-room` checks compatibility before
78
+ touching anything, and never installs or upgrades Paseo.
79
79
  - An initialised Codex home (`~/.codex/config.toml`) and/or Claude Code home (`~/.claude`).
80
80
  Codex must be new enough for `codex debug models` to print its JSON model catalog: the room
81
81
  seats Codex only if it can generate the scrubbed catalog copy.
@@ -98,7 +98,7 @@ starts, its exit code is preserved; a signal is returned using the conventional
98
98
  SKILL.md, references/ # procedure plus a scaffold loaded only when the skill runs
99
99
  room/skill-projections/<agent>/lead/ # exact Lead skill aggregate for each seated agent
100
100
  plugin/ # Claude only: trusted creation-time system-prompt append carrier
101
- paseo-plugin.json # accepts Paseo >=0.8.0 <0.10.0
101
+ paseo-plugin.json # accepts Paseo >=0.8.0
102
102
  index.server.ts, server/ # exact provider map + generated role contracts
103
103
  roles/codex/<role>/
104
104
  config.toml # your config.toml + the room's overrides
@@ -278,9 +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, 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.
281
+ fallback unless you have a reason not to: the plugin hook is verified, and a *resumed* session
282
+ keeps the room prompt it was created with (on Paseo 0.9.2 a daemon restart does not refresh it),
283
+ but what the model actually reads is not proven, and `CLAUDE.md` is what covers that case.
284
284
 
285
285
  Pi providers use a strict command tail:
286
286
 
@@ -406,8 +406,10 @@ npx paseo-room@<new-version> verify
406
406
  First inspect the dry run, then apply it. The apply regenerates managed prompt carriers,
407
407
  the Codex model catalogs and `AUTHENTICATION.md` from the newly resolved binaries, but
408
408
  preserves role credential paths and the operator agent homes. Stop and restart every affected
409
- seat after the apply; sending another turn to an already-running seat is not a restart.
410
- `setup` and `verify` prove the files and live Paseo configuration, not that an existing model
409
+ seat after the apply; sending another turn to an already-running seat is not a restart. A
410
+ Claude seat keeps the contract Paseo stored when it was created, and a daemon restart resumes it
411
+ with that same prompt, so for Claude open a new seat instead. `setup` and `verify` prove the
412
+ files and live Paseo configuration, not that an existing model
411
413
  context reloaded them. Only a newly launched seat context is expected to ingest the
412
414
  regenerated instructions.
413
415
 
@@ -618,12 +620,18 @@ npx paseo-room verify
618
620
  - **Trust.** Like the carrier, the runtime is trusted, unsandboxed code running in your daemon.
619
621
  Enable Paseo plugins yourself; `paseo-room` never does. It is not an operating-system sandbox and
620
622
  cannot stop a process running as your user.
621
- - **Range.** Runtime requires Paseo `>=0.8.0 <0.10.0`. `0.8.0` and `0.9.1` are both live-qualified
622
- points, so a daemon outside that range is refused for runtime while the baseline room keeps
623
- working.
623
+ - **Range.** Runtime requires Paseo `>=0.8.0`, with no upper bound: Paseo releases faster than each
624
+ release could be checked first, so a newer one is accepted unread. `0.8.0` and `0.9.1` are
625
+ live-qualified, and `0.10.1` was compared file by file with `0.9.2`. If a release breaks the
626
+ plugin, Paseo reports it `failed` and `verify` fails with the load error.
624
627
  - **Lead** gains room tools such as `assignment_create`, `assignment_dispatch`, `assignment_answer`,
625
628
  `assignment_accept`, `gate_run`, and for isolated writers `workspace_close` and `lease_reclaim`.
626
629
  `assignment_create` refuses a base that is not a commit of the repository (`base_unknown`).
630
+ `gate_run` runs in the background, and a notice tells Lead when the gate ends, green, red or
631
+ without a trustworthy result.
632
+ `assignment_status` leaves out the brief Lead wrote (its outcome stays), keeps the last 10 history
633
+ entries, and gives a decided assignment with nothing left to close one line, unless Lead passes
634
+ `full: true`.
627
635
  **Supervisor** gains `room_status`, `runtime_findings`, `message_lead` (with a `project` for a
628
636
  Supervisor of several projects) and `attention_feedback`, and cannot change an assignment. Its
629
637
  status and findings cover only its portfolio and the project it stands in; `room_status` lists
@@ -636,6 +644,18 @@ npx paseo-room verify
636
644
  `ultracode`, which start agents on their own. It records the choice, shows it with the reason to
637
645
  Supervisor and in the panel, and keeps it for a reclaimed Peer while you still allow it. The model
638
646
  itself is never Lead's to change.
647
+ - **Seat context.** The panel and each seat's role pill show how full the seat's context is, as
648
+ Paseo reports it for the latest model call, and when the runtime last saw it compact. **Settings ›
649
+ Room seats › Seat context** sets marks per role, as a share of each seat's own model window:
650
+ - *Lead · report at* (30%): past it, the Lead's Supervisor gets one fact line and the panel shows
651
+ it with **Replace Lead…**, so you can hand over to a fresh Lead rather than let this one compact.
652
+ The Supervisor may then replace that Lead itself, as below. Turning the mark off leaves
653
+ replacing a Lead to you alone.
654
+ - *compact at* (Lead 50%, Supervisor and Peer off): a room Claude seat gets
655
+ `CLAUDE_CODE_AUTO_COMPACT_WINDOW` when its session opens, at creation or on a resume after a
656
+ daemon restart, so Claude compacts at that share instead of near the end of a 1M window. An open
657
+ session keeps what it opened with. Codex and Pi seats show their context and keep their own
658
+ compaction.
639
659
  - **A runtime-dispatched Peer** is titled `<Disposition> · <outcome gist> · <assignment id>` (for
640
660
  example `Reviewer · Review the Docker Compose dev env… · asg_…`), and the runtime's notices to Lead
641
661
  name the assignment the same way. It gets exactly two tools, `ask` and `handoff`, for its own
@@ -653,9 +673,10 @@ npx paseo-room verify
653
673
  puts what needs you first. Below that come your projects, ordered by status, then your
654
674
  Supervisors.
655
675
  - A project shows its Supervisor, its Lead and Peer seats (each opens its agent in Paseo, and
656
- shows the model and thinking option it runs with) and its runtime record: assignments, isolated
657
- writers, findings and recovery.
658
- - Starting a Supervisor, starting a project and assigning a Supervisor are guided forms.
676
+ shows the model and thinking option it runs with, and the worktree or main checkout it works in
677
+ with its branch) and its runtime record: assignments, isolated writers, findings and recovery.
678
+ - Starting a Supervisor, adding a repository, starting a Lead for a project that has none, and
679
+ assigning a Supervisor are guided forms.
659
680
  - The design notes are in [docs/design/runtime-panel-ux.md](docs/design/runtime-panel-ux.md).
660
681
  - **Settings › Room seats** shows which account each seat is signed in to (email, plan and
661
682
  organization for Claude; login method for Codex; for Pi, only whether a credential file exists).
@@ -679,6 +700,7 @@ learn only when you ask it to check.
679
700
  count.
680
701
  - They report a Lead archived while its seats still work, and a Lead's finished turn that the
681
702
  Supervisor did not prompt itself.
703
+ - They report, in a digest, a Lead whose context passes the rotation mark, once per crossing.
682
704
  - The Lead contract has Lead put a question for you on a line beginning `NEEDS-HUMAN:` and an
683
705
  incident on one beginning `INCIDENT:`. The first wakes the Supervisor and the second pages it,
684
706
  even for a turn it prompted, once per line, and the letter quotes those lines rather than the
@@ -689,10 +711,38 @@ learn only when you ask it to check.
689
711
  - Each item has an id for `attention_feedback`, and a letter's own id rates every item in it. A
690
712
  letter is evidence, not an instruction: the Supervisor contract has it ask or nudge the Lead, or
691
713
  relay a question to you, and never direct a Peer.
692
- - **Starting seats.** From the **Room** view, **Start Supervisor** opens one in an existing directory
693
- outside every repository. **Start project** checks a repository, opens its Lead under the
694
- Supervisor you pick, and sends a fixed kickoff with your first directive verbatim. **Assign
695
- Supervisor** moves an existing project under a Supervisor.
714
+ - **Starting seats.** From the **Room** view, **New Supervisor** opens one in an existing directory
715
+ outside every repository. **Add repository** checks a repository, opens its Lead under the
716
+ Supervisor you pick, and sends a fixed kickoff with your first directive verbatim; it also offers
717
+ the projects the room observes without a Lead. A project with no live Lead offers **Start Lead**
718
+ on its own screen, with its Supervisor preselected. **Assign Supervisor** moves an existing
719
+ project under a Supervisor.
720
+ - **Replacing a Lead.** **Replace Lead…** above a project's seats, or on a *context past rotation
721
+ mark* item, hands the project to a fresh Lead:
722
+ - It checks for a quiet point first: the Lead idle, every runtime assignment it leads settled, no
723
+ runtime notice waiting for it, no seat it opened still working. It also shows what Paseo's
724
+ archive does to each seat the Lead opened: those in its workspace are archived with it, and one
725
+ in another workspace or open in a tab is detached and kept.
726
+ - It asks the Lead for a handoff in fixed sections, and you review and edit it. Nothing is
727
+ archived until you confirm, and you may cancel until then.
728
+ - On **Replace Lead**, the runtime archives the Lead and starts `<repository> — Lead` with the same
729
+ agent under the same Supervisor. The new Lead's first message is the kickoff and your reviewed
730
+ handoff, verbatim, and it verifies the handoff and reports to you before it acts outside the
731
+ repository. The Supervisor gets one line naming the new Lead.
732
+ - The handoff stays on this machine, under `~/.paseo-room/runtime/v1/attention/successions/`,
733
+ owner-only and never sent to the sensor or in a letter. Finished replacements are pruned after 30
734
+ days.
735
+ - If the replacement stops after the archive, the project offers **Finish replacing Lead**, which
736
+ creates no second Lead, or cancel, which leaves the project as it is. A replacement that fails
737
+ before the archive stays on the project's screen for a day, with the reason.
738
+ - Paseo archives the seats in the Lead's workspace with it; the runtime archives them too when the
739
+ Lead is not running, when Paseo would take none.
740
+ - **The Supervisor may do the same**, but only for a Lead of its own project that is past its
741
+ rotation mark, through the runtime's `lead_replace_*` tools. The runtime refuses a Lead below
742
+ the mark and applies the same quiet-point checks. The Supervisor reviews the handoff against the
743
+ repository, confirms it, and tells you which Lead now owns the project. The panel shows a
744
+ replacement the Supervisor started, and you may cancel it until it completes. Any other reason to
745
+ replace a Lead stays yours.
696
746
  - **Settings › Room attention.** Here you turn letters on or off, change their thresholds, and
697
747
  configure the optional **attention sensor**.
698
748
  - The sensor speaks the System One HTTP shape, with [TypeSafe Jev](https://docs.typesafe.ai/)
@@ -725,7 +775,7 @@ and the refusal is final for that dispatch — narrow or sequence the work:
725
775
 
726
776
  | Code | Why |
727
777
  |---|---|
728
- | `worktree_unqualified` | the daemon's version has not passed live qualification for worktree dispatch |
778
+ | `worktree_unqualified` | the daemon is older than `0.9.1`, the first Paseo release worktree dispatch was qualified on, or runs a prerelease |
729
779
  | `worktree_setup_unobservable` | `paseo.json` at the base declares `worktree.setup`, which Paseo runs where the runtime cannot see it finish |
730
780
  | `scope_not_canonical` | a `writeScope` or `serialOnly` item is not a repository-relative path or `*`/`?`/`**` glob |
731
781
  | `writer_exclusive` | a writer is still active in Lead's workspace (or, the other way round, isolated writers are active) |
@@ -748,9 +798,9 @@ the same worktree at the next lease epoch; the old Peer's late reports are refus
748
798
  the Human form of both, only where the runtime would accept it, and asks twice before discarding
749
799
  work.
750
800
 
751
- Worktree dispatch is enabled per daemon version, only after the live qualification in the Phase 2
752
- delta §9 passes on that version; `0.9.1` is qualified. On any other version the runtime refuses
753
- `worktree_unqualified` and dispatch without isolation still works.
801
+ Worktree dispatch is enabled on every Paseo release the runtime accepts from `0.9.1`, the release
802
+ that passed the live qualification in the Phase 2 delta §9. An earlier release, or a prerelease or
803
+ build-stamped version, refuses `worktree_unqualified`, and dispatch without isolation still works.
754
804
 
755
805
  To stop using it, finish, close or abandon the recorded work, then run setup **without**
756
806
  `--runtime`. Setup refuses while anything is still active or uncertain — including an isolated