paseo-room 0.6.1 → 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.
- package/README.md +118 -13
- package/dist/index.js +452 -60
- package/dist/index.js.map +1 -1
- package/dist/prompts/contract/lead.md +13 -4
- package/dist/prompts/contract/shared-authority.md +2 -2
- package/dist/prompts/contract/supervisor.md +17 -0
- package/dist/runtime-plugin/client/attention-settings.tsx +173 -0
- package/dist/runtime-plugin/client/data.ts +14 -2
- package/dist/runtime-plugin/client/forms.tsx +326 -0
- package/dist/runtime-plugin/client/host.ts +17 -0
- package/dist/runtime-plugin/client/kit.tsx +298 -0
- package/dist/runtime-plugin/client/model.ts +108 -0
- package/dist/runtime-plugin/client/pills.ts +58 -0
- package/dist/runtime-plugin/client/record.tsx +241 -0
- package/dist/runtime-plugin/client/role-pills.tsx +96 -0
- package/dist/runtime-plugin/client/room.tsx +291 -0
- package/dist/runtime-plugin/client/tone.ts +2 -0
- package/dist/runtime-plugin/client/views.tsx +161 -150
- package/dist/runtime-plugin/index.client.tsx +10 -2
- package/dist/runtime-plugin/index.server.ts +37 -3
- package/dist/runtime-plugin/server/attention/delivery.ts +193 -0
- package/dist/runtime-plugin/server/attention/engine.ts +465 -0
- package/dist/runtime-plugin/server/attention/key.ts +44 -0
- package/dist/runtime-plugin/server/attention/log.ts +54 -0
- package/dist/runtime-plugin/server/attention/mask.ts +44 -0
- package/dist/runtime-plugin/server/attention/observer.ts +313 -0
- package/dist/runtime-plugin/server/attention/portfolio.ts +77 -0
- package/dist/runtime-plugin/server/attention/questions.ts +80 -0
- package/dist/runtime-plugin/server/attention/seat-starter.ts +166 -0
- package/dist/runtime-plugin/server/attention/sensor.ts +207 -0
- package/dist/runtime-plugin/server/attention/signals.ts +230 -0
- package/dist/runtime-plugin/server/attention/triage.ts +68 -0
- package/dist/runtime-plugin/server/brief.ts +13 -1
- package/dist/runtime-plugin/server/context.ts +26 -2
- package/dist/runtime-plugin/server/contracts/actions.ts +18 -3
- package/dist/runtime-plugin/server/controller.ts +357 -55
- package/dist/runtime-plugin/server/correlations.ts +7 -3
- package/dist/runtime-plugin/server/domain/acceptance.ts +7 -2
- package/dist/runtime-plugin/server/domain/scope.ts +191 -0
- package/dist/runtime-plugin/server/domain/state.ts +281 -8
- package/dist/runtime-plugin/server/domain/views.ts +141 -7
- package/dist/runtime-plugin/server/events/schema.ts +33 -2
- package/dist/runtime-plugin/server/git.ts +93 -1
- package/dist/runtime-plugin/server/handlers/actions.ts +58 -12
- package/dist/runtime-plugin/server/handlers/peer.ts +22 -3
- package/dist/runtime-plugin/server/handlers/turns.ts +28 -21
- package/dist/runtime-plugin/server/host.ts +26 -0
- package/dist/runtime-plugin/server/lifecycle.ts +14 -3
- package/dist/runtime-plugin/server/notices.ts +26 -3
- package/dist/runtime-plugin/server/ownership.ts +1 -1
- package/dist/runtime-plugin/server/paseo-port.ts +271 -13
- package/dist/runtime-plugin/server/recovery.ts +124 -7
- package/dist/runtime-plugin/server/rpc.ts +198 -9
- package/dist/runtime-plugin/server/seats.ts +122 -0
- package/dist/runtime-plugin/server/tools.ts +9 -6
- package/dist/runtime-plugin/shared/attention.ts +70 -0
- package/dist/runtime-plugin/shared/identity.ts +8 -0
- package/dist/runtime-plugin/shared/limits.ts +6 -0
- package/dist/runtime-plugin/shared/policy.ts +2 -2
- package/dist/runtime-plugin/shared/rpc-contracts.ts +99 -1
- 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,
|
|
282
|
-
session
|
|
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:
|
|
510
|
-
|
|
511
|
-
|
|
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
|
|
620
|
-
`
|
|
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
|
-
|
|
633
|
-
|
|
634
|
-
|
|
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
|
|
638
|
-
|
|
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
|
|