remote-pi 0.4.3 → 0.5.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 +33 -0
- package/dist/daemon/client.js +5 -2
- package/dist/daemon/client.js.map +1 -1
- package/dist/daemon/control_protocol.d.ts +68 -0
- package/dist/daemon/control_protocol.js.map +1 -1
- package/dist/daemon/cron_log.d.ts +45 -0
- package/dist/daemon/cron_log.js +72 -0
- package/dist/daemon/cron_log.js.map +1 -0
- package/dist/daemon/cron_registry.d.ts +80 -0
- package/dist/daemon/cron_registry.js +194 -0
- package/dist/daemon/cron_registry.js.map +1 -0
- package/dist/daemon/id.d.ts +6 -0
- package/dist/daemon/id.js +6 -0
- package/dist/daemon/id.js.map +1 -1
- package/dist/daemon/install.d.ts +9 -2
- package/dist/daemon/install.js +54 -10
- package/dist/daemon/install.js.map +1 -1
- package/dist/daemon/registry.d.ts +17 -1
- package/dist/daemon/registry.js +34 -4
- package/dist/daemon/registry.js.map +1 -1
- package/dist/daemon/rpc_child.d.ts +60 -0
- package/dist/daemon/rpc_child.js +150 -5
- package/dist/daemon/rpc_child.js.map +1 -1
- package/dist/daemon/supervisor.d.ts +44 -0
- package/dist/daemon/supervisor.js +256 -21
- package/dist/daemon/supervisor.js.map +1 -1
- package/dist/index.d.ts +68 -11
- package/dist/index.js +0 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/mesh_server.js +18 -9
- package/dist/mcp/mesh_server.js.map +1 -1
- package/dist/pairing/qr.d.ts +8 -1
- package/dist/pairing/qr.js +13 -3
- package/dist/pairing/qr.js.map +1 -1
- package/dist/protocol/codec.js +1 -0
- package/dist/protocol/codec.js.map +1 -1
- package/dist/protocol/types.d.ts +11 -0
- package/dist/rooms.d.ts +20 -0
- package/dist/rooms.js +35 -0
- package/dist/rooms.js.map +1 -1
- package/dist/session/broker.d.ts +79 -3
- package/dist/session/broker.js +155 -28
- package/dist/session/broker.js.map +1 -1
- package/dist/session/broker_remote.d.ts +30 -10
- package/dist/session/broker_remote.js +77 -39
- package/dist/session/broker_remote.js.map +1 -1
- package/dist/session/cwd_lock.d.ts +7 -2
- package/dist/session/cwd_lock.js +39 -9
- package/dist/session/cwd_lock.js.map +1 -1
- package/dist/session/global_config.d.ts +12 -2
- package/dist/session/global_config.js +16 -3
- package/dist/session/global_config.js.map +1 -1
- package/dist/session/ipc.d.ts +27 -0
- package/dist/session/ipc.js +22 -0
- package/dist/session/ipc.js.map +1 -0
- package/dist/session/leader_election.js +8 -2
- package/dist/session/leader_election.js.map +1 -1
- package/dist/session/local_config.d.ts +36 -6
- package/dist/session/local_config.js +103 -28
- package/dist/session/local_config.js.map +1 -1
- package/dist/session/mesh_node.d.ts +15 -1
- package/dist/session/mesh_node.js +26 -5
- package/dist/session/mesh_node.js.map +1 -1
- package/dist/session/peer.d.ts +19 -2
- package/dist/session/peer.js +45 -9
- package/dist/session/peer.js.map +1 -1
- package/dist/session/tools.js +14 -12
- package/dist/session/tools.js.map +1 -1
- package/package.json +2 -1
- package/service-templates/task-scheduler.xml.template +38 -0
- package/skills/agent-network/SKILL.md +63 -26
package/dist/pairing/qr.js
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
import { randomBytes } from "node:crypto";
|
|
2
2
|
import qrTerminal from "qrcode-terminal";
|
|
3
|
-
|
|
3
|
+
/** Default ephemeral-token lifetime (also the QR rotation period). */
|
|
4
|
+
export const TOKEN_TTL_MS = 60_000;
|
|
5
|
+
/** Bounds for a caller-supplied pairing TTL (e.g. `/remote-pi pair --ttl <s>`). */
|
|
6
|
+
export const PAIR_TTL_MIN_MS = 10_000;
|
|
7
|
+
export const PAIR_TTL_MAX_MS = 600_000;
|
|
8
|
+
/** Clamp an arbitrary ttl (ms) into the safe pairing range; NaN → default. */
|
|
9
|
+
export function clampPairTtlMs(ttlMs) {
|
|
10
|
+
if (!Number.isFinite(ttlMs))
|
|
11
|
+
return TOKEN_TTL_MS;
|
|
12
|
+
return Math.min(PAIR_TTL_MAX_MS, Math.max(PAIR_TTL_MIN_MS, Math.floor(ttlMs)));
|
|
13
|
+
}
|
|
4
14
|
/** Encapsulates the single active QR token. One instance per Pi process. */
|
|
5
15
|
export class QRSession {
|
|
6
16
|
active = null;
|
|
@@ -12,9 +22,9 @@ export class QRSession {
|
|
|
12
22
|
* Issues a new active token, invalidating any previous one.
|
|
13
23
|
* Returns the token and its expiry timestamp.
|
|
14
24
|
*/
|
|
15
|
-
issueToken() {
|
|
25
|
+
issueToken(ttlMs = TOKEN_TTL_MS) {
|
|
16
26
|
const token = this.generateToken();
|
|
17
|
-
const expiresAt = Date.now() +
|
|
27
|
+
const expiresAt = Date.now() + ttlMs;
|
|
18
28
|
this.active = { token, expiresAt, consumed: false };
|
|
19
29
|
return { token, expiresAt };
|
|
20
30
|
}
|
package/dist/pairing/qr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qr.js","sourceRoot":"","sources":["../../src/pairing/qr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,UAAU,MAAM,iBAAiB,CAAC;AAEzC,MAAM,YAAY,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"qr.js","sourceRoot":"","sources":["../../src/pairing/qr.ts"],"names":[],"mappings":"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"}
|
package/dist/protocol/codec.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/protocol/codec.ts"],"names":[],"mappings":"AAEA,MAAM,YAAY,GAAG,IAAI,GAAG,CAAwB;IAClD,SAAS;IACT,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,YAAY;IACZ,eAAe;IACf,cAAc;IACd,aAAa;IACb,OAAO;IACP,WAAW;IACX,MAAM;IACN,KAAK;IACL,iBAAiB;CAClB,CAAC,CAAC;AAEH,MAAM,OAAO,WAAY,SAAQ,KAAK;IAElB;IADlB,YACkB,IAA4C,EAC5D,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAwC;QAI5D,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,UAAU,YAAY,CAAC,GAAkB;IAC7C,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,WAAW,CAAC,iBAAiB,EAAE,aAAc,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,IACE,CAAC,GAAG;QACJ,OAAO,GAAG,KAAK,QAAQ;QACvB,OAAQ,GAA+B,CAAC,IAAI,KAAK,QAAQ,EACzD,CAAC;QACD,MAAM,IAAI,WAAW,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,CAAC,GAAI,GAA+B,CAAC,IAAc,CAAC;IAC1D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAA0B,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,WAAW,CAAC,kBAAkB,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,GAAoB,CAAC;AAC9B,CAAC"}
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/protocol/codec.ts"],"names":[],"mappings":"AAEA,MAAM,YAAY,GAAG,IAAI,GAAG,CAAwB;IAClD,SAAS;IACT,YAAY;IACZ,YAAY;IACZ,sBAAsB;IACtB,aAAa;IACb,YAAY;IACZ,eAAe;IACf,cAAc;IACd,aAAa;IACb,OAAO;IACP,WAAW;IACX,MAAM;IACN,KAAK;IACL,iBAAiB;CAClB,CAAC,CAAC;AAEH,MAAM,OAAO,WAAY,SAAQ,KAAK;IAElB;IADlB,YACkB,IAA4C,EAC5D,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAwC;QAI5D,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,UAAU,YAAY,CAAC,GAAkB;IAC7C,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,WAAW,CAAC,iBAAiB,EAAE,aAAc,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,IACE,CAAC,GAAG;QACJ,OAAO,GAAG,KAAK,QAAQ;QACvB,OAAQ,GAA+B,CAAC,IAAI,KAAK,QAAQ,EACzD,CAAC;QACD,MAAM,IAAI,WAAW,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,CAAC,GAAI,GAA+B,CAAC,IAAc,CAAC;IAC1D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAA0B,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,WAAW,CAAC,kBAAkB,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,GAAoB,CAAC;AAC9B,CAAC"}
|
package/dist/protocol/types.d.ts
CHANGED
|
@@ -9,6 +9,13 @@ export type ClientMessage = {
|
|
|
9
9
|
id: string;
|
|
10
10
|
text: string;
|
|
11
11
|
images?: WireImage[];
|
|
12
|
+
} | {
|
|
13
|
+
type: "queued_message_set";
|
|
14
|
+
id: string;
|
|
15
|
+
text: string;
|
|
16
|
+
} | {
|
|
17
|
+
type: "queued_message_clear";
|
|
18
|
+
id: string;
|
|
12
19
|
} | {
|
|
13
20
|
type: "approve_tool";
|
|
14
21
|
id: string;
|
|
@@ -132,6 +139,10 @@ export type ServerMessage = {
|
|
|
132
139
|
id: string;
|
|
133
140
|
text: string;
|
|
134
141
|
images?: WireImage[];
|
|
142
|
+
} | {
|
|
143
|
+
type: "queued_message_state";
|
|
144
|
+
id?: string;
|
|
145
|
+
text?: string;
|
|
135
146
|
} | {
|
|
136
147
|
type: "agent_chunk";
|
|
137
148
|
in_reply_to: string;
|
package/dist/rooms.d.ts
CHANGED
|
@@ -7,3 +7,23 @@
|
|
|
7
7
|
* Format: first 12 chars of base64url(sha256(realpath)).
|
|
8
8
|
*/
|
|
9
9
|
export declare function roomIdForCwd(cwd: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* THE single derivation of the App↔Pi `room_id` (plan/41) — keyed by
|
|
12
|
+
* `(cwd, name)` so several agents in the SAME folder get distinct rooms (the
|
|
13
|
+
* app then renders one tile per agent instead of merging them into one).
|
|
14
|
+
*
|
|
15
|
+
* Default-preserving: when `name` is absent OR equals `defaultAgentName(cwd)`
|
|
16
|
+
* (an agent with no custom `agent_name`), it returns the LEGACY `roomIdForCwd`
|
|
17
|
+
* EXACTLY — so a single unnamed agent's existing conversation is NOT re-keyed
|
|
18
|
+
* on upgrade. A custom or `#N`-suffixed name → a name-scoped id (same formula
|
|
19
|
+
* the cwd-lock uses).
|
|
20
|
+
*
|
|
21
|
+
* Using the ASSIGNED leaf name (the broker's `#N` on collision) disambiguates
|
|
22
|
+
* even two unnamed agents: the 1st stays `folder` (== default → legacy room),
|
|
23
|
+
* the 2nd becomes `folder#2` (≠ default → name-scoped room).
|
|
24
|
+
*
|
|
25
|
+
* INVARIANT: every callsite that derives the App↔Pi room for the same agent
|
|
26
|
+
* MUST go through this function — otherwise the app would pair on a room the
|
|
27
|
+
* Pi never announces.
|
|
28
|
+
*/
|
|
29
|
+
export declare function roomIdFor(cwd: string, name?: string): string;
|
package/dist/rooms.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { realpathSync } from "node:fs";
|
|
3
|
+
import { defaultAgentName } from "./session/local_config.js";
|
|
3
4
|
/**
|
|
4
5
|
* Deterministic room id derived from a cwd. Two Pi processes in the same
|
|
5
6
|
* directory produce the same id; different cwds produce different ids
|
|
@@ -19,4 +20,38 @@ export function roomIdForCwd(cwd) {
|
|
|
19
20
|
}
|
|
20
21
|
return createHash("sha256").update(target).digest("base64url").slice(0, 12);
|
|
21
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* THE single derivation of the App↔Pi `room_id` (plan/41) — keyed by
|
|
25
|
+
* `(cwd, name)` so several agents in the SAME folder get distinct rooms (the
|
|
26
|
+
* app then renders one tile per agent instead of merging them into one).
|
|
27
|
+
*
|
|
28
|
+
* Default-preserving: when `name` is absent OR equals `defaultAgentName(cwd)`
|
|
29
|
+
* (an agent with no custom `agent_name`), it returns the LEGACY `roomIdForCwd`
|
|
30
|
+
* EXACTLY — so a single unnamed agent's existing conversation is NOT re-keyed
|
|
31
|
+
* on upgrade. A custom or `#N`-suffixed name → a name-scoped id (same formula
|
|
32
|
+
* the cwd-lock uses).
|
|
33
|
+
*
|
|
34
|
+
* Using the ASSIGNED leaf name (the broker's `#N` on collision) disambiguates
|
|
35
|
+
* even two unnamed agents: the 1st stays `folder` (== default → legacy room),
|
|
36
|
+
* the 2nd becomes `folder#2` (≠ default → name-scoped room).
|
|
37
|
+
*
|
|
38
|
+
* INVARIANT: every callsite that derives the App↔Pi room for the same agent
|
|
39
|
+
* MUST go through this function — otherwise the app would pair on a room the
|
|
40
|
+
* Pi never announces.
|
|
41
|
+
*/
|
|
42
|
+
export function roomIdFor(cwd, name) {
|
|
43
|
+
if (!name || name === defaultAgentName(cwd))
|
|
44
|
+
return roomIdForCwd(cwd);
|
|
45
|
+
let target;
|
|
46
|
+
try {
|
|
47
|
+
target = realpathSync(cwd);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
target = cwd;
|
|
51
|
+
}
|
|
52
|
+
// NUL separator (U+0000): impossible in a POSIX path and stripped from any
|
|
53
|
+
// sanitized name, so the cwd/name boundary is unambiguous.
|
|
54
|
+
const sep = String.fromCharCode(0);
|
|
55
|
+
return createHash("sha256").update(target + sep + name).digest("base64url").slice(0, 12);
|
|
56
|
+
}
|
|
22
57
|
//# sourceMappingURL=rooms.js.map
|
package/dist/rooms.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rooms.js","sourceRoot":"","sources":["../src/rooms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"rooms.js","sourceRoot":"","sources":["../src/rooms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;QACrE,MAAM,GAAG,GAAG,CAAC;IACf,CAAC;IACD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,IAAa;IAClD,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,gBAAgB,CAAC,GAAG,CAAC;QAAE,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;IACtE,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,GAAG,GAAG,CAAC;IACf,CAAC;IACD,2EAA2E;IAC3E,2DAA2D;IAC3D,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACnC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC3F,CAAC"}
|
package/dist/session/broker.d.ts
CHANGED
|
@@ -1,5 +1,47 @@
|
|
|
1
1
|
import type { Server } from "node:net";
|
|
2
2
|
import { type Envelope } from "./envelope.js";
|
|
3
|
+
/**
|
|
4
|
+
* Structured view of one mesh peer (plan/38). The `address` is the canonical
|
|
5
|
+
* routing key; the other fields let a client group/label peers WITHOUT parsing
|
|
6
|
+
* the address string. `pc` is undefined for local peers (filled cross-PC in
|
|
7
|
+
* Fase 2). Returned by `list_peers` as `peers_detailed`.
|
|
8
|
+
*/
|
|
9
|
+
export interface PeerInfo {
|
|
10
|
+
/** Cross-PC label; undefined for a local peer. */
|
|
11
|
+
pc?: string;
|
|
12
|
+
/** Working directory (realpath). Empty string for a legacy peer (no cwd). */
|
|
13
|
+
cwd: string;
|
|
14
|
+
/** Clean leaf name (carries a `#N` only on a same-(cwd,name) collision). */
|
|
15
|
+
name: string;
|
|
16
|
+
/** Canonical address — the broker's Map key and the `to`/`from` on the wire. */
|
|
17
|
+
address: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* THE sole encoder of a peer address (plan/38): `[<pc>:]<cwd>@<nome>`.
|
|
21
|
+
*
|
|
22
|
+
* - `cwd` present → `<cwd>@<nome>` (the `@` separates name from path so a `/`
|
|
23
|
+
* in the path never confuses lookup, which is exact-match anyway).
|
|
24
|
+
* - `cwd` empty (legacy peer that sent no cwd) → `address == name`, preserving
|
|
25
|
+
* pre-plan/38 behavior so a mixed mesh keeps routing.
|
|
26
|
+
* - `pc` present (cross-PC, Fase 2) → prefixed `<pc>:`.
|
|
27
|
+
*
|
|
28
|
+
* Does NOT sanitize — callers sanitize the `name` once (see `sanitizeMeshName`)
|
|
29
|
+
* before composing, so an already-appended `#N` collision suffix survives.
|
|
30
|
+
* Everyone else ECHOES `peer.address` verbatim; only the broker composes.
|
|
31
|
+
*/
|
|
32
|
+
export declare function composeAddress(parts: {
|
|
33
|
+
pc?: string;
|
|
34
|
+
cwd: string;
|
|
35
|
+
name: string;
|
|
36
|
+
}): string;
|
|
37
|
+
/**
|
|
38
|
+
* Sanitize a requested mesh name to a safe leaf while PRESERVING a trailing
|
|
39
|
+
* `#N` collision suffix (which the cwd-lock or a prior assignment may have
|
|
40
|
+
* added — `sanitizeSegment` alone would mangle `#`→`-`). The base is run through
|
|
41
|
+
* `sanitizeSegment` (af66d04); an unusable base (empty / reserved keyword) falls
|
|
42
|
+
* back to `"agent"`.
|
|
43
|
+
*/
|
|
44
|
+
export declare function sanitizeMeshName(raw: string): string;
|
|
3
45
|
/**
|
|
4
46
|
* Broker hosted by the session leader. Accepts UDS connections, maintains a
|
|
5
47
|
* `name → connection` map, routes envelopes per the `to` field, and appends
|
|
@@ -50,9 +92,15 @@ export interface RemoteRouter {
|
|
|
50
92
|
* prefix at all.
|
|
51
93
|
*/
|
|
52
94
|
tryRouteOutbound(env: Envelope): boolean;
|
|
53
|
-
/** Aggregated remote peer
|
|
54
|
-
* `list_peers` reply.
|
|
95
|
+
/** Aggregated remote peer addresses (`<pc_label>:<cwd>@<nome>`) for the
|
|
96
|
+
* `list_peers` reply's `peers` (string) field. Empty when nothing known. */
|
|
55
97
|
listRemotePeers(): string[];
|
|
98
|
+
/** Structured remote roster (plan/38 Fase 2): one `PeerInfo` per cross-PC
|
|
99
|
+
* peer with `pc` filled (the sibling label), `cwd`/`name` from the sibling's
|
|
100
|
+
* inventory, and `address` prefixed `<pc>:<cwd>@<nome>`. Powers the
|
|
101
|
+
* `peers_detailed` half of `list_peers` so clients group by `pc`/`cwd`
|
|
102
|
+
* without parsing. Empty when nothing known. */
|
|
103
|
+
listRemotePeerInfos(): PeerInfo[];
|
|
56
104
|
}
|
|
57
105
|
/** Local outcome of a cross-PC envelope injection. broker_remote uses this
|
|
58
106
|
* to construct the ACK envelope it sends back via the relay. plan/34: `busy`
|
|
@@ -90,7 +138,35 @@ export declare class Broker {
|
|
|
90
138
|
private _onData;
|
|
91
139
|
private _handleLine;
|
|
92
140
|
private _handleRegister;
|
|
93
|
-
|
|
141
|
+
/**
|
|
142
|
+
* Answer a read-only `list_peers` request from an UNREGISTERED connection
|
|
143
|
+
* (the `remote-pi peers` CLI probe). Returns true when the line was such a
|
|
144
|
+
* probe — the reply is written and the connection stays unregistered: no
|
|
145
|
+
* name assigned, no `peer_joined`/`peer_left` broadcast, no sibling push, so
|
|
146
|
+
* querying the roster from the shell never perturbs the mesh. Returns false
|
|
147
|
+
* (not a probe) so the caller falls through to the register handshake.
|
|
148
|
+
*/
|
|
149
|
+
private _tryObserverProbe;
|
|
150
|
+
/** Local UDS peer names plus cross-PC `<pc>:<peer>` entries from the remote
|
|
151
|
+
* router (empty when no bridge). Shared by the registered `list_peers`
|
|
152
|
+
* handler and the unregistered observer probe. */
|
|
153
|
+
private _allPeerNames;
|
|
154
|
+
/** Structured roster of LOCAL UDS peers (plan/38): one `PeerInfo` each, no
|
|
155
|
+
* `pc` (they're on this machine). Public so the cross-PC router
|
|
156
|
+
* (`broker_remote`) can read the authoritative local inventory directly to
|
|
157
|
+
* push to siblings — no `list_peers` round-trip, no stale cache. */
|
|
158
|
+
localPeerInfos(): PeerInfo[];
|
|
159
|
+
/** Structured roster (plan/38): local peers (no `pc`) + cross-PC peers with
|
|
160
|
+
* `pc`/`cwd`/`name` filled by the remote router (Fase 2). */
|
|
161
|
+
private _allPeerInfos;
|
|
162
|
+
/**
|
|
163
|
+
* Resolve a free `(name, address)` for a register, keyed by **(cwd, name)**
|
|
164
|
+
* (plan/38): the collision check is on the composed ADDRESS, so a name only
|
|
165
|
+
* collides with another peer in the SAME cwd. `#N` is appended to the name
|
|
166
|
+
* (matching the cwd-lock's suffix scheme) until the address is free; for a
|
|
167
|
+
* legacy peer (cwd "") the address is the name, preserving global-name `#N`.
|
|
168
|
+
*/
|
|
169
|
+
private _uniqueIdentity;
|
|
94
170
|
private _onClose;
|
|
95
171
|
private _route;
|
|
96
172
|
private _resolveTargets;
|
package/dist/session/broker.js
CHANGED
|
@@ -1,6 +1,36 @@
|
|
|
1
1
|
import { appendFile, mkdir } from "node:fs/promises";
|
|
2
2
|
import { dirname } from "node:path";
|
|
3
3
|
import { parse, serialize, uuidv7, EnvelopeError } from "./envelope.js";
|
|
4
|
+
import { sanitizeSegment } from "./local_config.js";
|
|
5
|
+
/**
|
|
6
|
+
* THE sole encoder of a peer address (plan/38): `[<pc>:]<cwd>@<nome>`.
|
|
7
|
+
*
|
|
8
|
+
* - `cwd` present → `<cwd>@<nome>` (the `@` separates name from path so a `/`
|
|
9
|
+
* in the path never confuses lookup, which is exact-match anyway).
|
|
10
|
+
* - `cwd` empty (legacy peer that sent no cwd) → `address == name`, preserving
|
|
11
|
+
* pre-plan/38 behavior so a mixed mesh keeps routing.
|
|
12
|
+
* - `pc` present (cross-PC, Fase 2) → prefixed `<pc>:`.
|
|
13
|
+
*
|
|
14
|
+
* Does NOT sanitize — callers sanitize the `name` once (see `sanitizeMeshName`)
|
|
15
|
+
* before composing, so an already-appended `#N` collision suffix survives.
|
|
16
|
+
* Everyone else ECHOES `peer.address` verbatim; only the broker composes.
|
|
17
|
+
*/
|
|
18
|
+
export function composeAddress(parts) {
|
|
19
|
+
const base = parts.cwd ? `${parts.cwd}@${parts.name}` : parts.name;
|
|
20
|
+
return parts.pc ? `${parts.pc}:${base}` : base;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Sanitize a requested mesh name to a safe leaf while PRESERVING a trailing
|
|
24
|
+
* `#N` collision suffix (which the cwd-lock or a prior assignment may have
|
|
25
|
+
* added — `sanitizeSegment` alone would mangle `#`→`-`). The base is run through
|
|
26
|
+
* `sanitizeSegment` (af66d04); an unusable base (empty / reserved keyword) falls
|
|
27
|
+
* back to `"agent"`.
|
|
28
|
+
*/
|
|
29
|
+
export function sanitizeMeshName(raw) {
|
|
30
|
+
const m = /^(.*?)(#\d+)?$/.exec(raw);
|
|
31
|
+
const base = sanitizeSegment(m?.[1] ?? raw) ?? "agent";
|
|
32
|
+
return m?.[2] ? base + m[2] : base;
|
|
33
|
+
}
|
|
4
34
|
const BROKER_NAME = "broker";
|
|
5
35
|
export class Broker {
|
|
6
36
|
peers = new Map();
|
|
@@ -65,7 +95,7 @@ export class Broker {
|
|
|
65
95
|
}
|
|
66
96
|
// ── connection lifecycle ──────────────────────────────────────────────────
|
|
67
97
|
_handleConnection(socket) {
|
|
68
|
-
const conn = { name: "", socket, buf: "" };
|
|
98
|
+
const conn = { name: "", cwd: "", address: "", socket, buf: "" };
|
|
69
99
|
socket.setEncoding("utf8");
|
|
70
100
|
socket.on("data", (chunk) => this._onData(conn, chunk));
|
|
71
101
|
socket.on("close", () => this._onClose(conn));
|
|
@@ -83,8 +113,12 @@ export class Broker {
|
|
|
83
113
|
}
|
|
84
114
|
}
|
|
85
115
|
async _handleLine(conn, line) {
|
|
86
|
-
// Unregistered conn
|
|
116
|
+
// Unregistered conn: a read-only `list_peers` probe (the `remote-pi peers`
|
|
117
|
+
// CLI — answered without registering, so it leaves no trace on the mesh) or
|
|
118
|
+
// the mandatory `register` handshake. Anything else `_handleRegister` drops.
|
|
87
119
|
if (!conn.name) {
|
|
120
|
+
if (this._tryObserverProbe(conn, line))
|
|
121
|
+
return;
|
|
88
122
|
this._handleRegister(conn, line);
|
|
89
123
|
return;
|
|
90
124
|
}
|
|
@@ -98,8 +132,9 @@ export class Broker {
|
|
|
98
132
|
return; // malformed; drop silently
|
|
99
133
|
throw e;
|
|
100
134
|
}
|
|
101
|
-
// Force `from` to the registered
|
|
102
|
-
|
|
135
|
+
// Force `from` to the registered ADDRESS (security: peer can't spoof; and
|
|
136
|
+
// replies/ACKs address back by the same canonical key the Map is keyed on).
|
|
137
|
+
env.from = conn.address;
|
|
103
138
|
await this._route(env);
|
|
104
139
|
}
|
|
105
140
|
_handleRegister(conn, line) {
|
|
@@ -119,32 +154,114 @@ export class Broker {
|
|
|
119
154
|
conn.socket.destroy();
|
|
120
155
|
return;
|
|
121
156
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
157
|
+
// (cwd, name) identity (plan/38). The cwd is the first-class axis: the
|
|
158
|
+
// address embeds it, so two same-named agents in DIFFERENT folders get
|
|
159
|
+
// distinct addresses and never collide — `#N` fires only on the same cwd +
|
|
160
|
+
// same name. A legacy peer (no cwd) → cwd "" → `address == name`, preserving
|
|
161
|
+
// the old global-name behavior so a mixed mesh keeps routing.
|
|
162
|
+
conn.cwd = typeof req.cwd === "string" ? req.cwd : "";
|
|
163
|
+
const { name, address } = this._uniqueIdentity(conn.cwd, req.name);
|
|
164
|
+
conn.name = name;
|
|
165
|
+
conn.address = address;
|
|
166
|
+
this.peers.set(address, conn);
|
|
167
|
+
// `name_assigned` doubles as the compat alias: for a legacy peer it equals
|
|
168
|
+
// `address_assigned` (cwd empty → address == name), so old clients that read
|
|
169
|
+
// `name_assigned` still get a routable identity.
|
|
170
|
+
const ack = { type: "register_ack", address_assigned: address, name_assigned: name };
|
|
126
171
|
try {
|
|
127
172
|
conn.socket.write(JSON.stringify(ack) + "\n");
|
|
128
173
|
}
|
|
129
174
|
catch { /* peer hung up */ }
|
|
130
|
-
// Notify others (peer_joined broadcast).
|
|
131
|
-
this._broadcastSystem({ type: "peer_joined", name:
|
|
175
|
+
// Notify others (peer_joined broadcast). The field carries the ADDRESS.
|
|
176
|
+
this._broadcastSystem({ type: "peer_joined", name: address, address }, address);
|
|
132
177
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
178
|
+
/**
|
|
179
|
+
* Answer a read-only `list_peers` request from an UNREGISTERED connection
|
|
180
|
+
* (the `remote-pi peers` CLI probe). Returns true when the line was such a
|
|
181
|
+
* probe — the reply is written and the connection stays unregistered: no
|
|
182
|
+
* name assigned, no `peer_joined`/`peer_left` broadcast, no sibling push, so
|
|
183
|
+
* querying the roster from the shell never perturbs the mesh. Returns false
|
|
184
|
+
* (not a probe) so the caller falls through to the register handshake.
|
|
185
|
+
*/
|
|
186
|
+
_tryObserverProbe(conn, line) {
|
|
187
|
+
let parsed;
|
|
188
|
+
try {
|
|
189
|
+
parsed = JSON.parse(line);
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
return false; // not JSON → let _handleRegister destroy it
|
|
193
|
+
}
|
|
194
|
+
if (!parsed || typeof parsed !== "object" || parsed.type !== "list_peers") {
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
const reply = {
|
|
198
|
+
from: BROKER_NAME,
|
|
199
|
+
to: "observer", // synthetic: the conn has no registered name
|
|
200
|
+
id: uuidv7(),
|
|
201
|
+
re: null,
|
|
202
|
+
body: {
|
|
203
|
+
type: "list_peers_reply",
|
|
204
|
+
peers: this._allPeerNames(),
|
|
205
|
+
peers_detailed: this._allPeerInfos(),
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
try {
|
|
209
|
+
conn.socket.write(serialize(reply));
|
|
210
|
+
}
|
|
211
|
+
catch { /* probe hung up */ }
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
/** Local UDS peer names plus cross-PC `<pc>:<peer>` entries from the remote
|
|
215
|
+
* router (empty when no bridge). Shared by the registered `list_peers`
|
|
216
|
+
* handler and the unregistered observer probe. */
|
|
217
|
+
_allPeerNames() {
|
|
218
|
+
const remote = this.remoteRouter ? this.remoteRouter.listRemotePeers() : [];
|
|
219
|
+
return [...this.peerNames(), ...remote];
|
|
220
|
+
}
|
|
221
|
+
/** Structured roster of LOCAL UDS peers (plan/38): one `PeerInfo` each, no
|
|
222
|
+
* `pc` (they're on this machine). Public so the cross-PC router
|
|
223
|
+
* (`broker_remote`) can read the authoritative local inventory directly to
|
|
224
|
+
* push to siblings — no `list_peers` round-trip, no stale cache. */
|
|
225
|
+
localPeerInfos() {
|
|
226
|
+
return [...this.peers.values()].map((p) => ({
|
|
227
|
+
cwd: p.cwd,
|
|
228
|
+
name: p.name,
|
|
229
|
+
address: p.address,
|
|
230
|
+
}));
|
|
231
|
+
}
|
|
232
|
+
/** Structured roster (plan/38): local peers (no `pc`) + cross-PC peers with
|
|
233
|
+
* `pc`/`cwd`/`name` filled by the remote router (Fase 2). */
|
|
234
|
+
_allPeerInfos() {
|
|
235
|
+
const remote = this.remoteRouter?.listRemotePeerInfos() ?? [];
|
|
236
|
+
return [...this.localPeerInfos(), ...remote];
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Resolve a free `(name, address)` for a register, keyed by **(cwd, name)**
|
|
240
|
+
* (plan/38): the collision check is on the composed ADDRESS, so a name only
|
|
241
|
+
* collides with another peer in the SAME cwd. `#N` is appended to the name
|
|
242
|
+
* (matching the cwd-lock's suffix scheme) until the address is free; for a
|
|
243
|
+
* legacy peer (cwd "") the address is the name, preserving global-name `#N`.
|
|
244
|
+
*/
|
|
245
|
+
_uniqueIdentity(cwd, requested) {
|
|
246
|
+
const sanitized = sanitizeMeshName(requested);
|
|
247
|
+
let address = composeAddress({ cwd, name: sanitized });
|
|
248
|
+
if (!this.peers.has(address))
|
|
249
|
+
return { name: sanitized, address };
|
|
250
|
+
// Collision: strip any client-provided `#N`, then re-suffix from #2.
|
|
251
|
+
const base = sanitized.replace(/#\d+$/, "");
|
|
136
252
|
for (let n = 2; n < 1000; n++) {
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
|
|
253
|
+
const name = `${base}#${n}`;
|
|
254
|
+
address = composeAddress({ cwd, name });
|
|
255
|
+
if (!this.peers.has(address))
|
|
256
|
+
return { name, address };
|
|
140
257
|
}
|
|
141
|
-
throw new Error(`name space exhausted for ${
|
|
258
|
+
throw new Error(`name space exhausted for ${base} in ${cwd || "(no cwd)"}`);
|
|
142
259
|
}
|
|
143
260
|
_onClose(conn) {
|
|
144
|
-
if (!conn.
|
|
261
|
+
if (!conn.address)
|
|
145
262
|
return;
|
|
146
|
-
this.peers.delete(conn.
|
|
147
|
-
this._broadcastSystem({ type: "peer_left", name: conn.
|
|
263
|
+
this.peers.delete(conn.address);
|
|
264
|
+
this._broadcastSystem({ type: "peer_left", name: conn.address, address: conn.address }, conn.address);
|
|
148
265
|
}
|
|
149
266
|
// ── routing ───────────────────────────────────────────────────────────────
|
|
150
267
|
async _route(env) {
|
|
@@ -193,7 +310,15 @@ export class Broker {
|
|
|
193
310
|
}
|
|
194
311
|
_resolveTargets(env) {
|
|
195
312
|
if (env.to === "broadcast") {
|
|
196
|
-
|
|
313
|
+
// plan/38 decision C: broadcast is scoped to the sender's cwd (folder
|
|
314
|
+
// colleagues), local-only. A peer in /a/b never hears /a/c. The sender is
|
|
315
|
+
// keyed by its address (= env.from); legacy peers (cwd "") broadcast among
|
|
316
|
+
// other cwd-less peers, matching pre-plan/38 behavior.
|
|
317
|
+
const sender = this.peers.get(env.from);
|
|
318
|
+
const scope = sender?.cwd ?? "";
|
|
319
|
+
return [...this.peers.values()]
|
|
320
|
+
.filter((p) => p.address !== env.from && p.cwd === scope)
|
|
321
|
+
.map((p) => p.address);
|
|
197
322
|
}
|
|
198
323
|
if (Array.isArray(env.to)) {
|
|
199
324
|
return env.to.filter((n) => n !== env.from);
|
|
@@ -234,14 +359,16 @@ export class Broker {
|
|
|
234
359
|
if (!body || typeof body !== "object")
|
|
235
360
|
return;
|
|
236
361
|
if (body.type === "list_peers") {
|
|
237
|
-
const remote = this.remoteRouter ? this.remoteRouter.listRemotePeers() : [];
|
|
238
|
-
const peers = [...this.peerNames(), ...remote];
|
|
239
362
|
const reply = {
|
|
240
363
|
from: BROKER_NAME,
|
|
241
364
|
to: env.from,
|
|
242
365
|
id: uuidv7(),
|
|
243
366
|
re: env.id,
|
|
244
|
-
body: {
|
|
367
|
+
body: {
|
|
368
|
+
type: "list_peers_reply",
|
|
369
|
+
peers: this._allPeerNames(), // addresses — legacy clients route by these
|
|
370
|
+
peers_detailed: this._allPeerInfos(), // plan/38 — clients group without parsing
|
|
371
|
+
},
|
|
245
372
|
};
|
|
246
373
|
const peer = this.peers.get(env.from);
|
|
247
374
|
if (peer) {
|
|
@@ -256,13 +383,13 @@ export class Broker {
|
|
|
256
383
|
// delivery on busy state. The Pi extension still publishes working state
|
|
257
384
|
// as room_meta over the relay (index.ts), independent of the broker.
|
|
258
385
|
}
|
|
259
|
-
_broadcastSystem(body,
|
|
260
|
-
for (const [
|
|
261
|
-
if (
|
|
386
|
+
_broadcastSystem(body, excludeAddress) {
|
|
387
|
+
for (const [address, peer] of this.peers) {
|
|
388
|
+
if (address === excludeAddress)
|
|
262
389
|
continue;
|
|
263
390
|
const env = {
|
|
264
391
|
from: BROKER_NAME,
|
|
265
|
-
to:
|
|
392
|
+
to: address,
|
|
266
393
|
id: uuidv7(),
|
|
267
394
|
re: null,
|
|
268
395
|
body,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"broker.js","sourceRoot":"","sources":["../../src/session/broker.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"broker.js","sourceRoot":"","sources":["../../src/session/broker.ts"],"names":[],"mappings":"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"}
|