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.
Files changed (71) hide show
  1. package/README.md +33 -0
  2. package/dist/daemon/client.js +5 -2
  3. package/dist/daemon/client.js.map +1 -1
  4. package/dist/daemon/control_protocol.d.ts +68 -0
  5. package/dist/daemon/control_protocol.js.map +1 -1
  6. package/dist/daemon/cron_log.d.ts +45 -0
  7. package/dist/daemon/cron_log.js +72 -0
  8. package/dist/daemon/cron_log.js.map +1 -0
  9. package/dist/daemon/cron_registry.d.ts +80 -0
  10. package/dist/daemon/cron_registry.js +194 -0
  11. package/dist/daemon/cron_registry.js.map +1 -0
  12. package/dist/daemon/id.d.ts +6 -0
  13. package/dist/daemon/id.js +6 -0
  14. package/dist/daemon/id.js.map +1 -1
  15. package/dist/daemon/install.d.ts +9 -2
  16. package/dist/daemon/install.js +54 -10
  17. package/dist/daemon/install.js.map +1 -1
  18. package/dist/daemon/registry.d.ts +17 -1
  19. package/dist/daemon/registry.js +34 -4
  20. package/dist/daemon/registry.js.map +1 -1
  21. package/dist/daemon/rpc_child.d.ts +60 -0
  22. package/dist/daemon/rpc_child.js +150 -5
  23. package/dist/daemon/rpc_child.js.map +1 -1
  24. package/dist/daemon/supervisor.d.ts +44 -0
  25. package/dist/daemon/supervisor.js +256 -21
  26. package/dist/daemon/supervisor.js.map +1 -1
  27. package/dist/index.d.ts +68 -11
  28. package/dist/index.js +0 -0
  29. package/dist/index.js.map +1 -1
  30. package/dist/mcp/mesh_server.js +18 -9
  31. package/dist/mcp/mesh_server.js.map +1 -1
  32. package/dist/pairing/qr.d.ts +8 -1
  33. package/dist/pairing/qr.js +13 -3
  34. package/dist/pairing/qr.js.map +1 -1
  35. package/dist/protocol/codec.js +1 -0
  36. package/dist/protocol/codec.js.map +1 -1
  37. package/dist/protocol/types.d.ts +11 -0
  38. package/dist/rooms.d.ts +20 -0
  39. package/dist/rooms.js +35 -0
  40. package/dist/rooms.js.map +1 -1
  41. package/dist/session/broker.d.ts +79 -3
  42. package/dist/session/broker.js +155 -28
  43. package/dist/session/broker.js.map +1 -1
  44. package/dist/session/broker_remote.d.ts +30 -10
  45. package/dist/session/broker_remote.js +77 -39
  46. package/dist/session/broker_remote.js.map +1 -1
  47. package/dist/session/cwd_lock.d.ts +7 -2
  48. package/dist/session/cwd_lock.js +39 -9
  49. package/dist/session/cwd_lock.js.map +1 -1
  50. package/dist/session/global_config.d.ts +12 -2
  51. package/dist/session/global_config.js +16 -3
  52. package/dist/session/global_config.js.map +1 -1
  53. package/dist/session/ipc.d.ts +27 -0
  54. package/dist/session/ipc.js +22 -0
  55. package/dist/session/ipc.js.map +1 -0
  56. package/dist/session/leader_election.js +8 -2
  57. package/dist/session/leader_election.js.map +1 -1
  58. package/dist/session/local_config.d.ts +36 -6
  59. package/dist/session/local_config.js +103 -28
  60. package/dist/session/local_config.js.map +1 -1
  61. package/dist/session/mesh_node.d.ts +15 -1
  62. package/dist/session/mesh_node.js +26 -5
  63. package/dist/session/mesh_node.js.map +1 -1
  64. package/dist/session/peer.d.ts +19 -2
  65. package/dist/session/peer.js +45 -9
  66. package/dist/session/peer.js.map +1 -1
  67. package/dist/session/tools.js +14 -12
  68. package/dist/session/tools.js.map +1 -1
  69. package/package.json +2 -1
  70. package/service-templates/task-scheduler.xml.template +38 -0
  71. package/skills/agent-network/SKILL.md +63 -26
@@ -1,8 +1,17 @@
1
- import type { Broker, RemoteRouter } from "./broker.js";
1
+ import type { Broker, RemoteRouter, PeerInfo } from "./broker.js";
2
2
  import { type Envelope } from "./envelope.js";
3
3
  import type { PiForwardClient } from "../transport/pi_forward_client.js";
4
+ /** A sibling peer as carried on the wire in `peers_update.peers_detailed`:
5
+ * the sibling's LOCAL `(cwd, name, address)` — no `pc`/prefix (the receiver
6
+ * fills `pc` from the verified sibling label). */
7
+ export interface WirePeerInfo {
8
+ cwd: string;
9
+ name: string;
10
+ address: string;
11
+ }
4
12
  export interface RemotePeerEntry {
5
- peers: string[];
13
+ /** The sibling's local peers (unprefixed `(cwd, name, address)`). */
14
+ infos: WirePeerInfo[];
6
15
  pcPubkey: string;
7
16
  ts: number;
8
17
  }
@@ -37,8 +46,6 @@ export declare class BrokerRemote implements RemoteRouter {
37
46
  private readonly remotePeers;
38
47
  /** In-flight `peers_request` calls, keyed by pc_label. */
39
48
  private readonly pendingFills;
40
- /** Local peers (UDS) at the moment of last `onLocalPeersChanged` call. */
41
- private lastLocalPeers;
42
49
  private readonly onIncoming;
43
50
  private detached;
44
51
  constructor(opts: BrokerRemoteOptions);
@@ -46,6 +53,12 @@ export declare class BrokerRemote implements RemoteRouter {
46
53
  * Single helper so `_addSibling` can reuse half of it when a new
47
54
  * sibling appears via `setSiblings`. */
48
55
  private _bootstrapWithSiblings;
56
+ /** Fresh local inventory for a `peers_update` push, read straight from the
57
+ * broker (authoritative + sync — no stale cache, drive-letter-safe: the
58
+ * broker knows its real local peers, no `:`-heuristic). Always carries BOTH
59
+ * `peers` (addresses, back-compat for Fase-1-only siblings) and the
60
+ * structured `peers_detailed` (plan/38 Fase 2). */
61
+ private _localPeersBody;
49
62
  detach(): void;
50
63
  /** Replace or extend the sibling set. Idempotent on identical input.
51
64
  * Removes any sibling missing from `next`. Plan/25 Wave B bootstrap:
@@ -53,20 +66,27 @@ export declare class BrokerRemote implements RemoteRouter {
53
66
  * set so the cache warms up without waiting for their next push. */
54
67
  setSiblings(next: SiblingInfo[]): void;
55
68
  private _addSibling;
56
- /** Returns the cached peer list for a remote pc_label, or [] when
57
- * unknown / expired. */
69
+ /** Structured cached peers for a remote pc_label (the sibling's local
70
+ * `(cwd,name,address)`), or [] when unknown / expired. */
71
+ private _remoteInfos;
72
+ /** Returns the cached peer ADDRESSES for a remote pc_label (the sibling's
73
+ * local, unprefixed addresses), or [] when unknown / expired. */
58
74
  getRemotePeers(pcLabel: string): string[];
59
- /** Returns the full cross-PC inventory: pc_label → peers (TTL-respected). */
75
+ /** Returns the full cross-PC inventory: pc_label → addresses (TTL-respected). */
60
76
  getAllRemote(): Record<string, string[]>;
61
- /** Returns aggregated remote peer names (`<pc>:<peer>`) for the broker's
62
- * `list_peers` reply. Skips siblings with no cache entry. */
77
+ /** Aggregated remote peer addresses (`<pc>:<cwd>@<nome>`) for the broker's
78
+ * `list_peers` `peers` field. Skips siblings with no cache entry. */
63
79
  listRemotePeers(): string[];
80
+ /** Structured remote roster (plan/38 Fase 2): one `PeerInfo` per cross-PC
81
+ * peer with `pc` = sibling label, `cwd`/`name` from the sibling's inventory,
82
+ * and `address` prefixed `<pc>:<cwd>@<nome>`. Powers `peers_detailed`. */
83
+ listRemotePeerInfos(): PeerInfo[];
64
84
  /**
65
85
  * Called whenever the local UDS broker's peer set changes
66
86
  * (peer_joined/peer_left). We push a `peers_update` envelope to every
67
87
  * sibling so their caches stay fresh without polling.
68
88
  */
69
- onLocalPeersChanged(peers: string[]): void;
89
+ onLocalPeersChanged(_peers: string[]): void;
70
90
  /**
71
91
  * Broker hook (plan/25 Wave C). Inspect `env.to` for a `<pc>:` prefix:
72
92
  *
@@ -50,8 +50,6 @@ export class BrokerRemote {
50
50
  remotePeers = new Map();
51
51
  /** In-flight `peers_request` calls, keyed by pc_label. */
52
52
  pendingFills = new Map();
53
- /** Local peers (UDS) at the moment of last `onLocalPeersChanged` call. */
54
- lastLocalPeers = [];
55
53
  onIncoming;
56
54
  detached = false;
57
55
  constructor(opts) {
@@ -66,12 +64,6 @@ export class BrokerRemote {
66
64
  this.onIncoming = (env, fromPc) => this.handleIncoming(env, fromPc);
67
65
  this.pi.on("envelope", this.onIncoming);
68
66
  this.broker.setRemoteRouter(this);
69
- // Seed `lastLocalPeers` from the live broker so the first
70
- // `onLocalPeersChanged`-triggered push (or the bootstrap pushes below)
71
- // already carry real state. Without seeding, the same single-peer
72
- // mesh bug applies to OUTGOING `peers_update`s too: we'd announce
73
- // ourselves to siblings as having zero peers.
74
- this.lastLocalPeers = this.broker.peerNames();
75
67
  // Plan/25 Wave B bootstrap: kick a `peers_request` at every known
76
68
  // sibling so the cache is warm before anyone calls `list_peers` or
77
69
  // `agent_send` cross-PC. Also push our current peer list proactively
@@ -84,14 +76,25 @@ export class BrokerRemote {
84
76
  * Single helper so `_addSibling` can reuse half of it when a new
85
77
  * sibling appears via `setSiblings`. */
86
78
  _bootstrapWithSiblings() {
79
+ const body = this._localPeersBody();
87
80
  for (const [, pcPubkey] of this.siblingByLabel) {
88
81
  this._sendControlEnvelope(pcPubkey, { type: "peers_request" });
89
- this._sendControlEnvelope(pcPubkey, {
90
- type: "peers_update",
91
- peers: this.lastLocalPeers,
92
- });
82
+ this._sendControlEnvelope(pcPubkey, body);
93
83
  }
94
84
  }
85
+ /** Fresh local inventory for a `peers_update` push, read straight from the
86
+ * broker (authoritative + sync — no stale cache, drive-letter-safe: the
87
+ * broker knows its real local peers, no `:`-heuristic). Always carries BOTH
88
+ * `peers` (addresses, back-compat for Fase-1-only siblings) and the
89
+ * structured `peers_detailed` (plan/38 Fase 2). */
90
+ _localPeersBody() {
91
+ const detailed = this.broker.localPeerInfos();
92
+ return {
93
+ type: "peers_update",
94
+ peers: detailed.map((p) => p.address),
95
+ peers_detailed: detailed.map((p) => ({ cwd: p.cwd, name: p.name, address: p.address })),
96
+ };
97
+ }
95
98
  detach() {
96
99
  if (this.detached)
97
100
  return;
@@ -118,14 +121,12 @@ export class BrokerRemote {
118
121
  // For newly-added pubkeys: do the same announce+request pair the
119
122
  // constructor does. Re-pinging siblings we already knew about would
120
123
  // be wasteful (and triggers redundant audit lines on their side).
124
+ const body = this._localPeersBody();
121
125
  for (const [, pcPubkey] of this.siblingByLabel) {
122
126
  if (prevPubkeys.has(pcPubkey))
123
127
  continue;
124
128
  this._sendControlEnvelope(pcPubkey, { type: "peers_request" });
125
- this._sendControlEnvelope(pcPubkey, {
126
- type: "peers_update",
127
- peers: this.lastLocalPeers,
128
- });
129
+ this._sendControlEnvelope(pcPubkey, body);
129
130
  }
130
131
  }
131
132
  _addSibling(s) {
@@ -139,17 +140,22 @@ export class BrokerRemote {
139
140
  this.siblingByPubkey.set(s.pcPubkey, s.pcLabel);
140
141
  }
141
142
  // ── Public cache API ──────────────────────────────────────────────────────
142
- /** Returns the cached peer list for a remote pc_label, or [] when
143
- * unknown / expired. */
144
- getRemotePeers(pcLabel) {
143
+ /** Structured cached peers for a remote pc_label (the sibling's local
144
+ * `(cwd,name,address)`), or [] when unknown / expired. */
145
+ _remoteInfos(pcLabel) {
145
146
  const entry = this.remotePeers.get(pcLabel);
146
147
  if (!entry)
147
148
  return [];
148
149
  if (Date.now() - entry.ts > this.cacheTtlMs)
149
150
  return [];
150
- return [...entry.peers];
151
+ return entry.infos;
151
152
  }
152
- /** Returns the full cross-PC inventory: pc_label peers (TTL-respected). */
153
+ /** Returns the cached peer ADDRESSES for a remote pc_label (the sibling's
154
+ * local, unprefixed addresses), or [] when unknown / expired. */
155
+ getRemotePeers(pcLabel) {
156
+ return this._remoteInfos(pcLabel).map((i) => i.address);
157
+ }
158
+ /** Returns the full cross-PC inventory: pc_label → addresses (TTL-respected). */
153
159
  getAllRemote() {
154
160
  const out = {};
155
161
  for (const [label] of this.remotePeers) {
@@ -159,13 +165,25 @@ export class BrokerRemote {
159
165
  }
160
166
  return out;
161
167
  }
162
- /** Returns aggregated remote peer names (`<pc>:<peer>`) for the broker's
163
- * `list_peers` reply. Skips siblings with no cache entry. */
168
+ /** Aggregated remote peer addresses (`<pc>:<cwd>@<nome>`) for the broker's
169
+ * `list_peers` `peers` field. Skips siblings with no cache entry. */
164
170
  listRemotePeers() {
165
171
  const out = [];
166
172
  for (const [label] of this.remotePeers) {
167
- for (const peer of this.getRemotePeers(label)) {
168
- out.push(`${label}:${peer}`);
173
+ for (const info of this._remoteInfos(label)) {
174
+ out.push(`${label}:${info.address}`);
175
+ }
176
+ }
177
+ return out;
178
+ }
179
+ /** Structured remote roster (plan/38 Fase 2): one `PeerInfo` per cross-PC
180
+ * peer with `pc` = sibling label, `cwd`/`name` from the sibling's inventory,
181
+ * and `address` prefixed `<pc>:<cwd>@<nome>`. Powers `peers_detailed`. */
182
+ listRemotePeerInfos() {
183
+ const out = [];
184
+ for (const [label] of this.remotePeers) {
185
+ for (const info of this._remoteInfos(label)) {
186
+ out.push({ pc: label, cwd: info.cwd, name: info.name, address: `${label}:${info.address}` });
169
187
  }
170
188
  }
171
189
  return out;
@@ -176,11 +194,14 @@ export class BrokerRemote {
176
194
  * (peer_joined/peer_left). We push a `peers_update` envelope to every
177
195
  * sibling so their caches stay fresh without polling.
178
196
  */
179
- onLocalPeersChanged(peers) {
180
- this.lastLocalPeers = [...peers];
197
+ onLocalPeersChanged(_peers) {
198
+ // The arg is just a change TRIGGER — we push the broker's authoritative
199
+ // inventory (`_localPeersBody`), not the caller's list, so a caller that
200
+ // miscomputed "local" (e.g. a naive `:`-split on Windows) can't poison what
201
+ // siblings see.
181
202
  if (this.siblingByLabel.size === 0)
182
203
  return;
183
- const body = { type: "peers_update", peers: this.lastLocalPeers };
204
+ const body = this._localPeersBody();
184
205
  for (const [, pcPubkey] of this.siblingByLabel) {
185
206
  this._sendControlEnvelope(pcPubkey, body);
186
207
  }
@@ -265,10 +286,7 @@ export class BrokerRemote {
265
286
  const bodyType = body && typeof body === "object" ? body.type : undefined;
266
287
  // ── control: peers_update ──────────────────────────────────────────────
267
288
  if (bodyType === "peers_update") {
268
- const peers = Array.isArray(body.peers)
269
- ? body.peers.filter((p) => typeof p === "string")
270
- : [];
271
- this._setRemoteCache(claimedLabel, fromPc, peers);
289
+ this._setRemoteCache(claimedLabel, fromPc, _parsePeersUpdate(body));
272
290
  return;
273
291
  }
274
292
  // ── control: peers_request ─────────────────────────────────────────────
@@ -282,11 +300,7 @@ export class BrokerRemote {
282
300
  // siblings see us as "no peers" → cache populates empty → cross-PC
283
301
  // `list_peers` misses us. Querying broker.peerNames() resolves
284
302
  // sync (Map keys), so this is essentially free.
285
- const currentLocal = this.broker.peerNames();
286
- this._sendControlEnvelope(fromPc, {
287
- type: "peers_update",
288
- peers: currentLocal,
289
- });
303
+ this._sendControlEnvelope(fromPc, this._localPeersBody());
290
304
  return;
291
305
  }
292
306
  // ── control: ack ───────────────────────────────────────────────────────
@@ -328,8 +342,8 @@ export class BrokerRemote {
328
342
  this.pi.sendEnvelopeToPi(fromPc, ackEnv);
329
343
  }
330
344
  // ── Internals ─────────────────────────────────────────────────────────────
331
- _setRemoteCache(pcLabel, pcPubkey, peers) {
332
- this.remotePeers.set(pcLabel, { peers, pcPubkey, ts: Date.now() });
345
+ _setRemoteCache(pcLabel, pcPubkey, infos) {
346
+ this.remotePeers.set(pcLabel, { infos, pcPubkey, ts: Date.now() });
333
347
  // Resolve any pending `peers_request` waiters for this label.
334
348
  const pending = this.pendingFills.get(pcLabel);
335
349
  if (pending) {
@@ -394,4 +408,28 @@ export function parseAddress(to) {
394
408
  return null;
395
409
  return { pcLabel: to.slice(0, idx), peerName: to.slice(idx + 1) };
396
410
  }
411
+ /**
412
+ * Parse an inbound `peers_update` body into structured `WirePeerInfo[]`
413
+ * (plan/38 Fase 2), tolerant of two sender generations:
414
+ *
415
+ * - **Fase 2 sibling** sends `peers_detailed` → use it (validating each entry
416
+ * has string `cwd`/`name`/`address`).
417
+ * - **Fase 1-only sibling** sends only `peers: string[]` (addresses) → each
418
+ * becomes `{cwd:"", name:addr, address:addr}` so the mesh stays mixed-safe.
419
+ *
420
+ * Untrusted input: every field is shape-checked; malformed entries are dropped.
421
+ */
422
+ function _parsePeersUpdate(body) {
423
+ const detailed = body.peers_detailed;
424
+ if (Array.isArray(detailed)) {
425
+ return detailed.filter((e) => !!e && typeof e === "object" &&
426
+ typeof e.cwd === "string" &&
427
+ typeof e.name === "string" &&
428
+ typeof e.address === "string");
429
+ }
430
+ const peers = Array.isArray(body.peers) ? body.peers : [];
431
+ return peers
432
+ .filter((p) => typeof p === "string")
433
+ .map((address) => ({ cwd: "", name: address, address }));
434
+ }
397
435
  //# sourceMappingURL=broker_remote.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"broker_remote.js","sourceRoot":"","sources":["../../src/session/broker_remote.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"broker_remote.js","sourceRoot":"","sources":["../../src/session/broker_remote.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,12 @@ export interface RefusedLock {
9
9
  lockPath: string;
10
10
  }
11
11
  export type CwdLockResult = AcquiredLock | RefusedLock;
12
- /** Path of the lock socket for a given cwd. Pure helper (no IO). */
12
+ /**
13
+ * Local-IPC address of the lock for a given (cwd, name). Pure helper (no IO).
14
+ * POSIX → a `.sock` file under `locksDir()`; Windows → a per-user named pipe.
15
+ */
16
+ export declare function lockPathFor(cwd: string, name?: string): string;
17
+ /** Back-compat alias: the cwd-only lock path (no name component). */
13
18
  export declare function lockPathForCwd(cwd: string): string;
14
19
  /**
15
20
  * Attempts to acquire the cwd lock. Resolves with either:
@@ -25,4 +30,4 @@ export declare function lockPathForCwd(cwd: string): string;
25
30
  * useful — the next-Pi-attempt's `tryConnect` succeeding is the entire
26
31
  * signal we care about.
27
32
  */
28
- export declare function acquireCwdLock(cwd: string): Promise<CwdLockResult>;
33
+ export declare function acquireCwdLock(cwd: string, name?: string): Promise<CwdLockResult>;
@@ -1,8 +1,9 @@
1
1
  import { mkdirSync } from "node:fs";
2
2
  import { homedir } from "node:os";
3
3
  import { dirname, join } from "node:path";
4
- import { roomIdForCwd } from "../rooms.js";
4
+ import { roomIdFor } from "../rooms.js";
5
5
  import { removeStaleSock, tryBind, tryConnect } from "./leader_election.js";
6
+ import { ipcAddress, usesNamedPipe } from "./ipc.js";
6
7
  /**
7
8
  * Per-cwd singleton lock for `/remote-pi`. At most one Pi process per
8
9
  * working directory may hold the lock; the second attempt is refused.
@@ -20,7 +21,7 @@ import { removeStaleSock, tryBind, tryConnect } from "./leader_election.js";
20
21
  * is `sha256(realpath(cwd))[:12]` and `<root>` is `$REMOTE_PI_HOME` or the
21
22
  * home dir), NOT inside the cwd itself, to dodge:
22
23
  * - The 104/108-char path-length limit on UDS sockets on macOS/Linux.
23
- * - Symlinked cwds (realpath canonicalization happens in `roomIdForCwd`).
24
+ * - Symlinked cwds (realpath canonicalization happens in `roomIdFor`).
24
25
  * - Read-only cwds (the home directory is always writable).
25
26
  *
26
27
  * Caller workflow:
@@ -35,9 +36,32 @@ function locksDir() {
35
36
  const root = process.env["REMOTE_PI_HOME"] || homedir();
36
37
  return join(root, ".pi", "remote", "locks");
37
38
  }
38
- /** Path of the lock socket for a given cwd. Pure helper (no IO). */
39
+ /**
40
+ * Lock id for an agent. Keyed by **(cwd, name)** so several agents can run in
41
+ * the SAME folder as long as their names differ — the per-folder singleton is
42
+ * now a per-(folder,name) singleton.
43
+ *
44
+ * plan/41: this is the SAME derivation as the App↔Pi `room_id` — `lockIdFor`
45
+ * delegates to the shared `roomIdFor(cwd, name)`. So the per-(folder,name) lock
46
+ * and the announced room stay in lockstep: a default/unnamed agent locks the
47
+ * legacy cwd id (and owns the legacy room); a custom or `#N`-suffixed name gets
48
+ * a name-scoped id for both. Symlinks canonicalize via `realpath` inside
49
+ * `roomIdFor`.
50
+ */
51
+ function lockIdFor(cwd, name) {
52
+ return roomIdFor(cwd, name);
53
+ }
54
+ /**
55
+ * Local-IPC address of the lock for a given (cwd, name). Pure helper (no IO).
56
+ * POSIX → a `.sock` file under `locksDir()`; Windows → a per-user named pipe.
57
+ */
58
+ export function lockPathFor(cwd, name) {
59
+ const id = lockIdFor(cwd, name);
60
+ return ipcAddress(`lock-${id}`, join(locksDir(), `${id}.sock`));
61
+ }
62
+ /** Back-compat alias: the cwd-only lock path (no name component). */
39
63
  export function lockPathForCwd(cwd) {
40
- return join(locksDir(), `${roomIdForCwd(cwd)}.sock`);
64
+ return lockPathFor(cwd);
41
65
  }
42
66
  /**
43
67
  * Attempts to acquire the cwd lock. Resolves with either:
@@ -53,9 +77,12 @@ export function lockPathForCwd(cwd) {
53
77
  * useful — the next-Pi-attempt's `tryConnect` succeeding is the entire
54
78
  * signal we care about.
55
79
  */
56
- export async function acquireCwdLock(cwd) {
57
- const lockPath = lockPathForCwd(cwd);
58
- mkdirSync(dirname(lockPath), { recursive: true });
80
+ export async function acquireCwdLock(cwd, name) {
81
+ const lockPath = lockPathFor(cwd, name);
82
+ // POSIX: the lock socket is a file under locksDir → ensure the dir exists.
83
+ // Windows: lockPath is a named pipe (`\\.\pipe\…`) — no parent dir to create.
84
+ if (!usesNamedPipe())
85
+ mkdirSync(dirname(lockPath), { recursive: true });
59
86
  // First attempt: bind directly.
60
87
  let server = await tryBind(lockPath);
61
88
  if (server)
@@ -66,8 +93,11 @@ export async function acquireCwdLock(cwd) {
66
93
  probe.destroy();
67
94
  return { ok: false, lockPath };
68
95
  }
69
- // Socket is stale (no listener answered). Clean up + retry bind once.
70
- removeStaleSock(lockPath);
96
+ // POSIX: a leftover stale `.sock` file blocks the bind → clean it + retry.
97
+ // Windows: a named pipe auto-disappears when its owner exits, so there is
98
+ // never a stale pipe to remove.
99
+ if (!usesNamedPipe())
100
+ removeStaleSock(lockPath);
71
101
  server = await tryBind(lockPath);
72
102
  if (server)
73
103
  return _acquired(server, lockPath);
@@ -1 +1 @@
1
- {"version":3,"file":"cwd_lock.js","sourceRoot":"","sources":["../../src/session/cwd_lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE5E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;mEAEmE;AACnE,SAAS,QAAQ;IACf,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,OAAO,EAAE,CAAC;IACxD,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAgBD,oEAAoE;AACpE,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACvD,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW;IAC9C,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACrC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAElD,gCAAgC;IAChC,IAAI,MAAM,GAAkB,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpD,IAAI,MAAM;QAAE,OAAO,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAE/C,uEAAuE;IACvE,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,CAAC,OAAO,EAAE,CAAC;QAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IACjC,CAAC;IAED,sEAAsE;IACtE,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC1B,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,MAAM;QAAE,OAAO,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAE/C,wEAAwE;IACxE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,SAAS,CAAC,MAAc,EAAE,SAAiB;IAClD,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,mEAAmE;IACnE,mEAAmE;IACnE,iEAAiE;IACjE,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,OAAO;QACL,EAAE,EAAE,IAAI;QACR,OAAO,EAAE,GAAG,EAAE;YACZ,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,CAAC;gBAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC;QACjD,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"cwd_lock.js","sourceRoot":"","sources":["../../src/session/cwd_lock.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,11 @@
9
9
  export declare const LOCAL_SESSION_NAME = "local";
10
10
  /** Ensures the new subdirs exist inside the existing ~/.pi/remote/. */
11
11
  export declare function ensureGlobalDirs(): void;
12
- /** Path to the UDS socket for a named session. */
12
+ /**
13
+ * Local-IPC address for a session's broker. POSIX → a `.sock` file under the
14
+ * session dir; Windows → a per-user named pipe (plan/40). The `net` API treats
15
+ * both the same; only the address string differs.
16
+ */
13
17
  export declare function sessionSockPath(name: string): string;
14
18
  /** Path to the audit log for a named session. */
15
19
  export declare function sessionAuditPath(name: string): string;
@@ -19,5 +23,11 @@ export declare function sessionsDir(): string;
19
23
  export declare function skillsDir(): string;
20
24
  /** Lists discovered session names from disk. */
21
25
  export declare function listSessions(): string[];
22
- /** Heuristic: a session has an existing broker.sock file. */
26
+ /**
27
+ * Heuristic: a session has an existing broker socket FILE (POSIX only). On
28
+ * Windows the broker is a named pipe with no file to stat, so this returns
29
+ * false — the authoritative liveness check there is a connect-probe
30
+ * (`leader_election.tryConnect` / `client.supervisorOnline`), not this. Only
31
+ * legacy `session/wizard.ts` consumes this.
32
+ */
23
33
  export declare function sessionHasSock(name: string): boolean;
@@ -1,6 +1,7 @@
1
1
  import { existsSync, mkdirSync, readdirSync, statSync } from "node:fs";
2
2
  import { homedir } from "node:os";
3
3
  import { join } from "node:path";
4
+ import { ipcAddress, usesNamedPipe } from "./ipc.js";
4
5
  const HOME_PI_REMOTE = join(homedir(), ".pi", "remote");
5
6
  const SESSIONS_DIR = join(HOME_PI_REMOTE, "sessions");
6
7
  const SKILLS_DIR = join(HOME_PI_REMOTE, "skills");
@@ -18,9 +19,13 @@ export function ensureGlobalDirs() {
18
19
  mkdirSync(SESSIONS_DIR, { recursive: true });
19
20
  mkdirSync(SKILLS_DIR, { recursive: true });
20
21
  }
21
- /** Path to the UDS socket for a named session. */
22
+ /**
23
+ * Local-IPC address for a session's broker. POSIX → a `.sock` file under the
24
+ * session dir; Windows → a per-user named pipe (plan/40). The `net` API treats
25
+ * both the same; only the address string differs.
26
+ */
22
27
  export function sessionSockPath(name) {
23
- return join(SESSIONS_DIR, name, "broker.sock");
28
+ return ipcAddress(`broker-${name}`, join(SESSIONS_DIR, name, "broker.sock"));
24
29
  }
25
30
  /** Path to the audit log for a named session. */
26
31
  export function sessionAuditPath(name) {
@@ -53,8 +58,16 @@ export function listSessions() {
53
58
  return [];
54
59
  }
55
60
  }
56
- /** Heuristic: a session has an existing broker.sock file. */
61
+ /**
62
+ * Heuristic: a session has an existing broker socket FILE (POSIX only). On
63
+ * Windows the broker is a named pipe with no file to stat, so this returns
64
+ * false — the authoritative liveness check there is a connect-probe
65
+ * (`leader_election.tryConnect` / `client.supervisorOnline`), not this. Only
66
+ * legacy `session/wizard.ts` consumes this.
67
+ */
57
68
  export function sessionHasSock(name) {
69
+ if (usesNamedPipe())
70
+ return false;
58
71
  return existsSync(sessionSockPath(name));
59
72
  }
60
73
  //# sourceMappingURL=global_config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"global_config.js","sourceRoot":"","sources":["../../src/session/global_config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AACxD,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;AACtD,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;AAElD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAE1C,uEAAuE;AACvE,MAAM,UAAU,gBAAgB;IAC9B,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;AACjD,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;AACjD,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,YAAY;IAC1B,gBAAgB,EAAE,CAAC;IACnB,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YAChD,IAAI,CAAC;gBACH,OAAO,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAC3D,CAAC;YAAC,MAAM,CAAC;gBAAC,OAAO,KAAK,CAAC;YAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3C,CAAC"}
1
+ {"version":3,"file":"global_config.js","sourceRoot":"","sources":["../../src/session/global_config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAErD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AACxD,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;AACtD,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;AAElD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAE1C,uEAAuE;AACvE,MAAM,UAAU,gBAAgB;IAC9B,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,UAAU,CAAC,UAAU,IAAI,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;AACjD,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,YAAY;IAC1B,gBAAgB,EAAE,CAAC;IACnB,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YAChD,IAAI,CAAC;gBACH,OAAO,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAC3D,CAAC;YAAC,MAAM,CAAC;gBAAC,OAAO,KAAK,CAAC;YAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,aAAa,EAAE;QAAE,OAAO,KAAK,CAAC;IAClC,OAAO,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Cross-platform local-IPC address resolution (plan/40).
3
+ *
4
+ * Node's `net` implements local IPC differently per OS:
5
+ * - **POSIX**: a filesystem Unix-domain socket — a `.sock` path under
6
+ * `~/.pi/remote/`. The file lingers if the owner crashes (stale-socket
7
+ * cleanup via `unlink` matters).
8
+ * - **Windows**: a **named pipe** (`\\.\pipe\<name>`). There is NO file —
9
+ * `existsSync`/`unlink` don't apply, and the pipe vanishes automatically
10
+ * when the owning process exits (so there's never a stale pipe to clean).
11
+ * Pipes are machine-global, so the name embeds the user to avoid collisions
12
+ * between two accounts on the same host.
13
+ *
14
+ * The `net` API itself (`createServer().listen(addr)`, `createConnection({ path:
15
+ * addr })`, framing) is identical — only the address STRING and the lifecycle
16
+ * (skip file cleanup on Windows) change. `platform`/`user` are injectable so
17
+ * tests can exercise the win32 branch on a POSIX dev host.
18
+ */
19
+ export type Plat = NodeJS.Platform;
20
+ /** True when local IPC uses named pipes (no socket files to manage). */
21
+ export declare function usesNamedPipe(plat?: Plat): boolean;
22
+ /**
23
+ * Resolve a local-IPC address. On Windows returns a per-user named pipe
24
+ * (`\\.\pipe\remote-pi-<suffix>-<user>`); on POSIX returns `filePath` (the
25
+ * filesystem UDS path) unchanged.
26
+ */
27
+ export declare function ipcAddress(suffix: string, filePath: string, plat?: Plat, user?: string): string;
@@ -0,0 +1,22 @@
1
+ import { platform as osPlatform, userInfo } from "node:os";
2
+ /** True when local IPC uses named pipes (no socket files to manage). */
3
+ export function usesNamedPipe(plat = osPlatform()) {
4
+ return plat === "win32";
5
+ }
6
+ /** Keep a name component safe for a Windows pipe path. */
7
+ function safe(s) {
8
+ return s.replace(/[^A-Za-z0-9_.-]/g, "_");
9
+ }
10
+ /**
11
+ * Resolve a local-IPC address. On Windows returns a per-user named pipe
12
+ * (`\\.\pipe\remote-pi-<suffix>-<user>`); on POSIX returns `filePath` (the
13
+ * filesystem UDS path) unchanged.
14
+ */
15
+ export function ipcAddress(suffix, filePath, plat = osPlatform(), user) {
16
+ if (plat === "win32") {
17
+ const u = safe((user ?? userInfo().username) || "user");
18
+ return `\\\\.\\pipe\\remote-pi-${safe(suffix)}-${u}`;
19
+ }
20
+ return filePath;
21
+ }
22
+ //# sourceMappingURL=ipc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc.js","sourceRoot":"","sources":["../../src/session/ipc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAuB3D,wEAAwE;AACxE,MAAM,UAAU,aAAa,CAAC,OAAa,UAAU,EAAE;IACrD,OAAO,IAAI,KAAK,OAAO,CAAC;AAC1B,CAAC;AAED,0DAA0D;AAC1D,SAAS,IAAI,CAAC,CAAS;IACrB,OAAO,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACxB,MAAc,EACd,QAAgB,EAChB,OAAa,UAAU,EAAE,EACzB,IAAa;IAEb,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC;QACxD,OAAO,0BAA0B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;IACvD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { createConnection, createServer } from "node:net";
2
2
  import { existsSync, lstatSync, unlinkSync } from "node:fs";
3
3
  import { setTimeout as delay } from "node:timers/promises";
4
+ import { usesNamedPipe } from "./ipc.js";
4
5
  const MAX_ATTEMPTS = 20;
5
6
  const BASE_BACKOFF_MS = 30;
6
7
  const JITTER_MS = 70;
@@ -13,12 +14,17 @@ const PROBE_TIMEOUT_MS = 500;
13
14
  * Returns the role + the live handle (server for leader, socket for follower).
14
15
  */
15
16
  export async function joinOrLead(sockPath) {
17
+ const pipe = usesNamedPipe();
16
18
  for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
17
- if (existsSync(sockPath)) {
19
+ // Windows named pipes have no file to `existsSync`; always connect-probe
20
+ // first and never `unlink` (the pipe auto-disappears when its owner exits).
21
+ // POSIX keeps the existsSync fast-path + stale-socket cleanup.
22
+ if (pipe || existsSync(sockPath)) {
18
23
  const sock = await _tryConnect(sockPath);
19
24
  if (sock)
20
25
  return { role: "follower", socket: sock };
21
- _removeStaleSock(sockPath);
26
+ if (!pipe)
27
+ _removeStaleSock(sockPath);
22
28
  }
23
29
  const server = await _tryBind(sockPath);
24
30
  if (server)
@@ -1 +1 @@
1
- {"version":3,"file":"leader_election.js","sourceRoot":"","sources":["../../src/session/leader_election.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"leader_election.js","sourceRoot":"","sources":["../../src/session/leader_election.ts"],"names":[],"mappings":"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"}