paseo-room 0.14.2 → 0.15.1
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 +8 -23
- package/dist/index.js +36 -6
- package/dist/index.js.map +1 -1
- package/dist/runtime-plugin/client/attention-settings.tsx +8 -103
- package/dist/runtime-plugin/client/data.ts +1 -2
- package/dist/runtime-plugin/client/model.ts +0 -1
- package/dist/runtime-plugin/client/room.tsx +1 -1
- package/dist/runtime-plugin/server/attention/engine.ts +8 -31
- package/dist/runtime-plugin/server/attention/log.ts +1 -2
- package/dist/runtime-plugin/server/attention/mask.ts +6 -11
- package/dist/runtime-plugin/server/attention/signals.ts +2 -21
- package/dist/runtime-plugin/server/attention/triage.ts +4 -50
- package/dist/runtime-plugin/server/context.ts +4 -10
- package/dist/runtime-plugin/server/controller.ts +3 -2
- package/dist/runtime-plugin/server/domain/acceptance.ts +8 -5
- package/dist/runtime-plugin/server/domain/state.ts +33 -1
- package/dist/runtime-plugin/server/domain/views.ts +5 -3
- package/dist/runtime-plugin/server/rpc.ts +5 -31
- package/dist/runtime-plugin/server/store/project.ts +30 -1
- package/dist/runtime-plugin/server/tools.ts +2 -2
- package/dist/runtime-plugin/shared/attention.ts +1 -39
- package/dist/runtime-plugin/shared/rpc-contracts.ts +2 -9
- package/package.json +1 -2
- package/dist/runtime-plugin/server/attention/key.ts +0 -44
- package/dist/runtime-plugin/server/attention/questions.ts +0 -80
- package/dist/runtime-plugin/server/attention/sensor.ts +0 -207
package/README.md
CHANGED
|
@@ -757,8 +757,7 @@ learn only when you ask it to check.
|
|
|
757
757
|
handoff, verbatim, and it verifies the handoff and reports to you before it acts outside the
|
|
758
758
|
repository. The Supervisor gets one line naming the new Lead.
|
|
759
759
|
- The handoff stays on this machine, under `~/.paseo-room/runtime/v1/attention/successions/`,
|
|
760
|
-
owner-only and never
|
|
761
|
-
days.
|
|
760
|
+
owner-only and never put in a letter. Finished replacements are pruned after 30 days.
|
|
762
761
|
- If the replacement stops after the archive, the project offers **Finish replacing Lead**, which
|
|
763
762
|
creates no second Lead, or cancel, which leaves the project as it is. A replacement that fails
|
|
764
763
|
before the archive stays on the project's screen for a day, with the reason.
|
|
@@ -772,30 +771,14 @@ learn only when you ask it to check.
|
|
|
772
771
|
may cancel it until it completes. Any other reason to replace a Lead stays yours.
|
|
773
772
|
- **Settings › Room attention.** Here you turn letters on or off, see what reached Supervisors in
|
|
774
773
|
the last 24 hours (letters by level, incidents, Lead turns by what was decided, and the ratings you
|
|
775
|
-
or a Supervisor gave), change when a Supervisor is told and how often
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
- The sensor speaks the System One HTTP shape, with [TypeSafe Jev](https://docs.typesafe.ai/)
|
|
779
|
-
first and any compatible or self-hosted endpoint after it. It is `off` by default.
|
|
780
|
-
- Without a TypeSafe key, use Jev through OpenRouter: endpoint
|
|
781
|
-
`https://openrouter.ai/api/v1/systemone`, model `typesafe/jev-1.13`, and an OpenRouter key.
|
|
782
|
-
OpenRouter can answer with a dated snapshot such as `typesafe/jev-1.13-20260917`, which the
|
|
783
|
-
sensor accepts as the pinned model.
|
|
784
|
-
- `shadow` assesses Lead messages and records the answers without acting on them. `assist` lets
|
|
785
|
-
them decide, for the question sets you enable, whether a Lead turn wakes the Supervisor, waits
|
|
786
|
-
for a digest, or is only recorded.
|
|
787
|
-
- Nothing leaves the machine until you acknowledge the endpoint's host, and only masked, bounded
|
|
788
|
-
excerpts of Lead messages are sent.
|
|
789
|
-
- The key is write-only: it is stored owner-only under `~/.paseo-room/runtime/v1/secrets` and never
|
|
790
|
-
shown again.
|
|
791
|
-
- **Evaluation.** `npm run attention:eval` (in this repository) reads your Claude Lead transcripts
|
|
792
|
-
read-only and prints what an evaluation would send. `-- --send` runs it against the endpoint, as
|
|
793
|
-
your consent for that run.
|
|
774
|
+
or a Supervisor gave), and change when a Supervisor is told and how often. Code decides every
|
|
775
|
+
letter: no model ranks a Lead turn, and nothing about your projects leaves the machine. Releases
|
|
776
|
+
before 0.15.0 had an optional attention sensor; 0.15.0 removed it and deletes the key it stored.
|
|
794
777
|
- **Usage report.** `npm run attention:report -- --since 2026-09-24 --until 2026-09-30` (in this
|
|
795
778
|
repository) reads the room home read-only. It prints what reached the Supervisors over that window:
|
|
796
779
|
- Lead turns by routing, and letters by level and delay;
|
|
797
780
|
- Lead answers to `message_lead`, and whether they arrived;
|
|
798
|
-
- feedback
|
|
781
|
+
- feedback;
|
|
799
782
|
- what the Supervisor and Lead seats read, and how long a question to you waited.
|
|
800
783
|
|
|
801
784
|
It prints counts and durations only, never message text. The window defaults to the last seven
|
|
@@ -825,7 +808,9 @@ and the refusal is final for that dispatch — narrow or sequence the work:
|
|
|
825
808
|
|
|
826
809
|
Write scopes prevent collisions between isolated writers; **they do not contain a Peer**, which can
|
|
827
810
|
still write anywhere its user can. At handoff the runtime records any changed path outside the
|
|
828
|
-
scope as `scope.exceeded
|
|
811
|
+
scope as `scope.exceeded` and tells Lead. Accepting the candidate needs an override only for an
|
|
812
|
+
outside path another writer holds or has changed: one inside another live lease's scope or a
|
|
813
|
+
serial-only path, or one another open candidate also changed. Lead still integrates
|
|
829
814
|
each candidate by hand, in its own workspace, one at a time; the runtime never merges, rebases or
|
|
830
815
|
pushes.
|
|
831
816
|
|
package/dist/index.js
CHANGED
|
@@ -15,7 +15,7 @@ var init_package = __esm({
|
|
|
15
15
|
"package.json"() {
|
|
16
16
|
package_default = {
|
|
17
17
|
name: "paseo-room",
|
|
18
|
-
version: "0.
|
|
18
|
+
version: "0.15.1",
|
|
19
19
|
description: "One CLI that configures Codex, Claude Code, and Pi role homes in $HOME and registers them with your local Paseo daemon.",
|
|
20
20
|
keywords: [
|
|
21
21
|
"paseo",
|
|
@@ -52,7 +52,6 @@ var init_package = __esm({
|
|
|
52
52
|
build: `tsup && node --input-type=module -e "import { cpSync, rmSync } from 'node:fs'; for (const [source, target] of [['src/room/prompts', 'dist/prompts'], ['src/room/skills', 'dist/skills'], ['src/plugin-assets', 'dist/plugin-assets'], ['src/runtime-plugin', 'dist/runtime-plugin']]) { rmSync(target, { recursive: true, force: true }); cpSync(source, target, { recursive: true }); }"`,
|
|
53
53
|
prepack: "npm run build",
|
|
54
54
|
verify: "npm run typecheck && npm run lint && npm test && npm run build && npm run test:package",
|
|
55
|
-
"attention:eval": "node --experimental-transform-types --no-warnings --import ./scripts/ts-resolve.mjs scripts/attention-eval.ts",
|
|
56
55
|
"attention:report": "node --experimental-transform-types --no-warnings --import ./scripts/ts-resolve.mjs scripts/attention-report.ts"
|
|
57
56
|
},
|
|
58
57
|
dependencies: {
|
|
@@ -2483,10 +2482,11 @@ function runtimePluginEntries(layout, agents, roles) {
|
|
|
2483
2482
|
path: join12(root, path),
|
|
2484
2483
|
content: path === LOCATION_MODULE ? renderRuntimeLocation(layout) : path === SUCCESSION_MODULE ? renderSuccessionText() : readFileSync4(join12(BUNDLE, path), "utf8")
|
|
2485
2484
|
})),
|
|
2486
|
-
{ kind: "file", path: join12(root, MANIFEST_FILE), content: renderRuntimeManifestFile(agents, roles) }
|
|
2485
|
+
{ kind: "file", path: join12(root, MANIFEST_FILE), content: renderRuntimeManifestFile(agents, roles) },
|
|
2486
|
+
...REMOVED_FILES.map((path) => ({ kind: "absent", path: join12(root, path) }))
|
|
2487
2487
|
];
|
|
2488
2488
|
}
|
|
2489
|
-
var BUNDLE, LOCATION_MODULE, SUCCESSION_MODULE;
|
|
2489
|
+
var BUNDLE, LOCATION_MODULE, SUCCESSION_MODULE, REMOVED_FILES;
|
|
2490
2490
|
var init_runtime = __esm({
|
|
2491
2491
|
"src/runtime.ts"() {
|
|
2492
2492
|
"use strict";
|
|
@@ -2500,6 +2500,12 @@ var init_runtime = __esm({
|
|
|
2500
2500
|
BUNDLE = fileURLToPath(new URL("./runtime-plugin/", import.meta.url));
|
|
2501
2501
|
LOCATION_MODULE = "server/generated/location.ts";
|
|
2502
2502
|
SUCCESSION_MODULE = "server/generated/succession.ts";
|
|
2503
|
+
REMOVED_FILES = [
|
|
2504
|
+
// The attention sensor, removed in 0.15.0.
|
|
2505
|
+
"server/attention/key.ts",
|
|
2506
|
+
"server/attention/questions.ts",
|
|
2507
|
+
"server/attention/sensor.ts"
|
|
2508
|
+
];
|
|
2503
2509
|
}
|
|
2504
2510
|
});
|
|
2505
2511
|
|
|
@@ -3893,6 +3899,29 @@ async function readJsonFiles(directory, names) {
|
|
|
3893
3899
|
await Promise.all(Array.from({ length: Math.min(REPLAY_READS_IN_FLIGHT, names.length) }, reader));
|
|
3894
3900
|
return files;
|
|
3895
3901
|
}
|
|
3902
|
+
async function readEventFiles(directory, names) {
|
|
3903
|
+
let known = READS.get(directory);
|
|
3904
|
+
if (known === void 0) {
|
|
3905
|
+
known = /* @__PURE__ */ new Map();
|
|
3906
|
+
READS.set(directory, known);
|
|
3907
|
+
}
|
|
3908
|
+
const present = new Set(names);
|
|
3909
|
+
for (const name of known.keys()) if (!present.has(name)) known.delete(name);
|
|
3910
|
+
const missing = names.filter((name) => !known.has(name));
|
|
3911
|
+
if (missing.length > 0) {
|
|
3912
|
+
const read = readJsonFiles(directory, missing);
|
|
3913
|
+
for (const name of missing) {
|
|
3914
|
+
const file = read.then((files2) => files2.get(name) ?? { error: "The event file was not read." });
|
|
3915
|
+
known.set(name, file);
|
|
3916
|
+
void file.then((result) => {
|
|
3917
|
+
if ("error" in result && known.get(name) === file) known.delete(name);
|
|
3918
|
+
});
|
|
3919
|
+
}
|
|
3920
|
+
}
|
|
3921
|
+
const files = /* @__PURE__ */ new Map();
|
|
3922
|
+
for (const name of names) files.set(name, await (known.get(name) ?? Promise.resolve({ error: "The event file was not read." })));
|
|
3923
|
+
return files;
|
|
3924
|
+
}
|
|
3896
3925
|
function eventName(sequence) {
|
|
3897
3926
|
return `${String(sequence).padStart(12, "0")}.json`;
|
|
3898
3927
|
}
|
|
@@ -3900,7 +3929,7 @@ function slug(root) {
|
|
|
3900
3929
|
const name = basename2(root).toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 32);
|
|
3901
3930
|
return name === "" ? "project" : name;
|
|
3902
3931
|
}
|
|
3903
|
-
var RUNTIME_LAYOUT_VERSION, EVENT_FILE, MAX_SEQUENCE_ATTEMPTS, REPLAY_READS_IN_FLIGHT, metaSchema, ProjectStore;
|
|
3932
|
+
var RUNTIME_LAYOUT_VERSION, EVENT_FILE, MAX_SEQUENCE_ATTEMPTS, REPLAY_READS_IN_FLIGHT, metaSchema, READS, ProjectStore;
|
|
3904
3933
|
var init_project = __esm({
|
|
3905
3934
|
"src/runtime-plugin/server/store/project.ts"() {
|
|
3906
3935
|
"use strict";
|
|
@@ -3917,6 +3946,7 @@ var init_project = __esm({
|
|
|
3917
3946
|
canonicalRoot: z12.string().min(1),
|
|
3918
3947
|
gitCommonDir: z12.string().min(1)
|
|
3919
3948
|
});
|
|
3949
|
+
READS = /* @__PURE__ */ new Map();
|
|
3920
3950
|
ProjectStore = class _ProjectStore {
|
|
3921
3951
|
constructor(directory, meta, now) {
|
|
3922
3952
|
this.directory = directory;
|
|
@@ -3989,7 +4019,7 @@ var init_project = __esm({
|
|
|
3989
4019
|
/** Reads every event strictly. Any unreadable file pauses the project; nothing is moved. */
|
|
3990
4020
|
async replay() {
|
|
3991
4021
|
const names = (await readdir4(this.eventsDirectory)).sort();
|
|
3992
|
-
const files = await
|
|
4022
|
+
const files = await readEventFiles(this.eventsDirectory, names.filter((name) => EVENT_FILE.test(name)));
|
|
3993
4023
|
const problems = [];
|
|
3994
4024
|
const events = [];
|
|
3995
4025
|
const ids = /* @__PURE__ */ new Map();
|