@yefengr/remote-pi 0.7.4 → 0.7.6

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 (165) hide show
  1. package/README.md +81 -586
  2. package/dist/bin/supervisord.js +4 -5
  3. package/dist/bin/supervisord.js.map +1 -1
  4. package/dist/config.d.ts +1 -1
  5. package/dist/config.js +2 -2
  6. package/dist/daemon/cli-links.d.ts +30 -0
  7. package/dist/daemon/cli-links.js +134 -0
  8. package/dist/daemon/cli-links.js.map +1 -0
  9. package/dist/daemon/commands.d.ts +27 -0
  10. package/dist/daemon/commands.js +295 -0
  11. package/dist/daemon/commands.js.map +1 -0
  12. package/dist/daemon/control_protocol.d.ts +53 -31
  13. package/dist/daemon/control_protocol.js +8 -31
  14. package/dist/daemon/control_protocol.js.map +1 -1
  15. package/dist/daemon/cron_log.d.ts +2 -23
  16. package/dist/daemon/cron_log.js +10 -25
  17. package/dist/daemon/cron_log.js.map +1 -1
  18. package/dist/daemon/cron_registry.d.ts +3 -40
  19. package/dist/daemon/cron_registry.js +58 -103
  20. package/dist/daemon/cron_registry.js.map +1 -1
  21. package/dist/daemon/install-runtime.d.ts +10 -0
  22. package/dist/daemon/install-runtime.js +81 -0
  23. package/dist/daemon/install-runtime.js.map +1 -0
  24. package/dist/daemon/install.d.ts +3 -63
  25. package/dist/daemon/install.js +5 -289
  26. package/dist/daemon/install.js.map +1 -1
  27. package/dist/daemon/preflight.d.ts +51 -0
  28. package/dist/daemon/preflight.js +136 -0
  29. package/dist/daemon/preflight.js.map +1 -0
  30. package/dist/daemon/registry.d.ts +33 -45
  31. package/dist/daemon/registry.js +171 -117
  32. package/dist/daemon/registry.js.map +1 -1
  33. package/dist/daemon/rpc_child.d.ts +92 -146
  34. package/dist/daemon/rpc_child.js +336 -263
  35. package/dist/daemon/rpc_child.js.map +1 -1
  36. package/dist/daemon/status.d.ts +45 -0
  37. package/dist/daemon/status.js +87 -0
  38. package/dist/daemon/status.js.map +1 -0
  39. package/dist/daemon/supervisor-ipc.d.ts +2 -0
  40. package/dist/daemon/supervisor-ipc.js +20 -0
  41. package/dist/daemon/supervisor-ipc.js.map +1 -0
  42. package/dist/daemon/supervisor.d.ts +48 -71
  43. package/dist/daemon/supervisor.js +430 -420
  44. package/dist/daemon/supervisor.js.map +1 -1
  45. package/dist/extension_ui_bridge.d.ts +4 -3
  46. package/dist/extension_ui_bridge.js +10 -0
  47. package/dist/extension_ui_bridge.js.map +1 -1
  48. package/dist/index.d.ts +25 -230
  49. package/dist/index.js +515 -5553
  50. package/dist/index.js.map +1 -1
  51. package/dist/pairing/crypto.d.ts +8 -1
  52. package/dist/pairing/crypto.js +56 -6
  53. package/dist/pairing/crypto.js.map +1 -1
  54. package/dist/pairing/owner_storage.d.ts +42 -0
  55. package/dist/pairing/owner_storage.js +207 -0
  56. package/dist/pairing/owner_storage.js.map +1 -0
  57. package/dist/pairing/qr.d.ts +3 -42
  58. package/dist/pairing/qr.js +9 -59
  59. package/dist/pairing/qr.js.map +1 -1
  60. package/dist/pairing/storage.d.ts +3 -45
  61. package/dist/pairing/storage.js +10 -223
  62. package/dist/pairing/storage.js.map +1 -1
  63. package/dist/protocol/types.d.ts +1 -1
  64. package/dist/protocol/v2/schemas.d.ts +1 -1
  65. package/dist/protocol/v2/schemas.js +1 -1
  66. package/dist/protocol/v2/schemas.js.map +1 -1
  67. package/dist/runtime/owner_router.d.ts +16 -0
  68. package/dist/runtime/owner_router.js +37 -0
  69. package/dist/runtime/owner_router.js.map +1 -0
  70. package/dist/session/ipc.d.ts +1 -22
  71. package/dist/session/ipc.js +4 -11
  72. package/dist/session/ipc.js.map +1 -1
  73. package/dist/session/local_config.d.ts +4 -47
  74. package/dist/session/local_config.js +19 -101
  75. package/dist/session/local_config.js.map +1 -1
  76. package/dist/transport/peer_channel.d.ts +25 -39
  77. package/dist/transport/peer_channel.js +74 -131
  78. package/dist/transport/peer_channel.js.map +1 -1
  79. package/dist/transport/relay_client.d.ts +26 -70
  80. package/dist/transport/relay_client.js +37 -106
  81. package/dist/transport/relay_client.js.map +1 -1
  82. package/docs/daemon.md +91 -207
  83. package/package.json +21 -17
  84. package/dist/daemon/id.d.ts +0 -24
  85. package/dist/daemon/id.js +0 -36
  86. package/dist/daemon/id.js.map +0 -1
  87. package/dist/mcp/mesh_result.d.ts +0 -10
  88. package/dist/mcp/mesh_result.js +0 -42
  89. package/dist/mcp/mesh_result.js.map +0 -1
  90. package/dist/mcp/mesh_server.d.ts +0 -16
  91. package/dist/mcp/mesh_server.js +0 -327
  92. package/dist/mcp/mesh_server.js.map +0 -1
  93. package/dist/mesh/canonical.d.ts +0 -30
  94. package/dist/mesh/canonical.js +0 -61
  95. package/dist/mesh/canonical.js.map +0 -1
  96. package/dist/mesh/client.d.ts +0 -18
  97. package/dist/mesh/client.js +0 -125
  98. package/dist/mesh/client.js.map +0 -1
  99. package/dist/mesh/encoding.d.ts +0 -38
  100. package/dist/mesh/encoding.js +0 -216
  101. package/dist/mesh/encoding.js.map +0 -1
  102. package/dist/mesh/self_revoke.d.ts +0 -73
  103. package/dist/mesh/self_revoke.js +0 -401
  104. package/dist/mesh/self_revoke.js.map +0 -1
  105. package/dist/mesh/siblings.d.ts +0 -49
  106. package/dist/mesh/siblings.js +0 -159
  107. package/dist/mesh/siblings.js.map +0 -1
  108. package/dist/mesh/types.d.ts +0 -34
  109. package/dist/mesh/types.js +0 -11
  110. package/dist/mesh/types.js.map +0 -1
  111. package/dist/mesh/verify.d.ts +0 -17
  112. package/dist/mesh/verify.js +0 -86
  113. package/dist/mesh/verify.js.map +0 -1
  114. package/dist/rooms.d.ts +0 -29
  115. package/dist/rooms.js +0 -57
  116. package/dist/rooms.js.map +0 -1
  117. package/dist/session/bridge.d.ts +0 -37
  118. package/dist/session/bridge.js +0 -130
  119. package/dist/session/bridge.js.map +0 -1
  120. package/dist/session/broker.d.ts +0 -189
  121. package/dist/session/broker.js +0 -507
  122. package/dist/session/broker.js.map +0 -1
  123. package/dist/session/broker_remote.d.ts +0 -74
  124. package/dist/session/broker_remote.js +0 -583
  125. package/dist/session/broker_remote.js.map +0 -1
  126. package/dist/session/cwd_lock.d.ts +0 -33
  127. package/dist/session/cwd_lock.js +0 -126
  128. package/dist/session/cwd_lock.js.map +0 -1
  129. package/dist/session/envelope.d.ts +0 -33
  130. package/dist/session/envelope.js +0 -117
  131. package/dist/session/envelope.js.map +0 -1
  132. package/dist/session/global_config.d.ts +0 -33
  133. package/dist/session/global_config.js +0 -73
  134. package/dist/session/global_config.js.map +0 -1
  135. package/dist/session/leader_election.d.ts +0 -32
  136. package/dist/session/leader_election.js +0 -106
  137. package/dist/session/leader_election.js.map +0 -1
  138. package/dist/session/mesh_node.d.ts +0 -116
  139. package/dist/session/mesh_node.js +0 -573
  140. package/dist/session/mesh_node.js.map +0 -1
  141. package/dist/session/peer.d.ts +0 -139
  142. package/dist/session/peer.js +0 -451
  143. package/dist/session/peer.js.map +0 -1
  144. package/dist/session/peer_inventory.d.ts +0 -13
  145. package/dist/session/peer_inventory.js +0 -48
  146. package/dist/session/peer_inventory.js.map +0 -1
  147. package/dist/session/peer_limits.d.ts +0 -9
  148. package/dist/session/peer_limits.js +0 -21
  149. package/dist/session/peer_limits.js.map +0 -1
  150. package/dist/session/setup_wizard.d.ts +0 -39
  151. package/dist/session/setup_wizard.js +0 -63
  152. package/dist/session/setup_wizard.js.map +0 -1
  153. package/dist/session/tools.d.ts +0 -24
  154. package/dist/session/tools.js +0 -252
  155. package/dist/session/tools.js.map +0 -1
  156. package/dist/session/wizard.d.ts +0 -13
  157. package/dist/session/wizard.js +0 -20
  158. package/dist/session/wizard.js.map +0 -1
  159. package/dist/transport/pi_forward_client.d.ts +0 -29
  160. package/dist/transport/pi_forward_client.js +0 -62
  161. package/dist/transport/pi_forward_client.js.map +0 -1
  162. package/dist/ui/footer.d.ts +0 -32
  163. package/dist/ui/footer.js +0 -34
  164. package/dist/ui/footer.js.map +0 -1
  165. package/skills/agent-network/SKILL.md +0 -310
@@ -1,583 +0,0 @@
1
- import { asTransportErrorBody, envelope, isUuid, parse, serialize, uuidv7, } from "./envelope.js";
2
- import { canonicalizeEd25519PublicKey, decodeEd25519PublicKey, encodeEd25519PublicKey, publicKeyFingerprint, } from "../mesh/encoding.js";
3
- import { isBoundedPeerAddresses, isBoundedPeerRoster, } from "./peer_limits.js";
4
- const CACHE_TTL_MS = 5 * 60_000;
5
- const PEERS_REQUEST_TIMEOUT_MS = 2_000;
6
- const REANNOUNCE_INTERVAL_MS = 2 * 60_000;
7
- const BROKER_NAME = "broker";
8
- const LEGACY_RELAY_ID_RE = /^[0-9a-f]{32}$/;
9
- function compareAscii(left, right) {
10
- return left < right ? -1 : left > right ? 1 : 0;
11
- }
12
- function validateAlias(alias, field) {
13
- if (typeof alias !== "string" ||
14
- alias.length === 0 ||
15
- alias.includes(":")) {
16
- throw new Error(`mesh: ${field} is not a valid routing alias`);
17
- }
18
- return alias;
19
- }
20
- function validateLegacyPcLabel(label, field) {
21
- if (typeof label !== "string" || label.length === 0) {
22
- throw new Error(`mesh: ${field} is not a valid legacy PC label`);
23
- }
24
- return label;
25
- }
26
- function buildRoutingState(topology, expectedSelfPubkey) {
27
- const selfLabel = validateAlias(topology.self?.pcLabel, "self.pcLabel");
28
- const selfLegacyPcLabel = validateLegacyPcLabel(topology.self?.legacyPcLabel, "self.legacyPcLabel");
29
- const selfPubkey = canonicalizeEd25519PublicKey(topology.self?.pcPubkey, "self public key");
30
- if (expectedSelfPubkey && selfPubkey !== expectedSelfPubkey) {
31
- throw new Error("mesh: self public key cannot change");
32
- }
33
- const normalizedSiblings = topology.siblings
34
- .map((sibling, index) => ({
35
- pcLabel: validateAlias(sibling?.pcLabel, `siblings[${index}].pcLabel`),
36
- legacyPcLabel: validateLegacyPcLabel(sibling?.legacyPcLabel, `siblings[${index}].legacyPcLabel`),
37
- pcPubkey: canonicalizeEd25519PublicKey(sibling?.pcPubkey, `siblings[${index}].pcPubkey`),
38
- }))
39
- .filter((sibling) => sibling.pcPubkey !== selfPubkey)
40
- .sort((left, right) => compareAscii(left.pcPubkey, right.pcPubkey));
41
- const siblingByLabel = new Map();
42
- const siblingByPubkey = new Map();
43
- const siblingLegacyLabelByPubkey = new Map();
44
- for (const sibling of normalizedSiblings) {
45
- if (sibling.pcLabel === selfLabel) {
46
- throw new Error("mesh: sibling routing alias conflicts with self");
47
- }
48
- if (siblingByPubkey.has(sibling.pcPubkey)) {
49
- throw new Error("mesh: duplicate sibling public key");
50
- }
51
- if (siblingByLabel.has(sibling.pcLabel)) {
52
- throw new Error("mesh: duplicate sibling routing alias");
53
- }
54
- siblingByLabel.set(sibling.pcLabel, sibling.pcPubkey);
55
- siblingByPubkey.set(sibling.pcPubkey, sibling.pcLabel);
56
- siblingLegacyLabelByPubkey.set(sibling.pcPubkey, sibling.legacyPcLabel);
57
- }
58
- return {
59
- self: Object.freeze({
60
- pcLabel: selfLabel,
61
- pcPubkey: selfPubkey,
62
- legacyPcLabel: selfLegacyPcLabel,
63
- }),
64
- siblingByLabel,
65
- siblingByPubkey,
66
- siblingLegacyLabelByPubkey,
67
- };
68
- }
69
- export class BrokerRemote {
70
- broker;
71
- pi;
72
- technicalSelfPubkey;
73
- cacheTtlMs;
74
- reannounceIntervalMs;
75
- log;
76
- routing;
77
- /** Canonical sibling pubkey → cached local roster. */
78
- remotePeers = new Map();
79
- /** Canonical sibling pubkeys whose active topology refresh must be retried. */
80
- topologyRefreshNeeded = new Set();
81
- /** Canonical sibling pubkey → in-flight roster fills. */
82
- pendingFills = new Map();
83
- onIncoming;
84
- reannounceTimer = null;
85
- lifecycle = "dormant";
86
- constructor(opts) {
87
- this.broker = opts.broker;
88
- this.pi = opts.pi;
89
- this.routing = buildRoutingState(opts.topology);
90
- this.technicalSelfPubkey = this.routing.self.pcPubkey;
91
- this.cacheTtlMs = opts.cacheTtlMs ?? CACHE_TTL_MS;
92
- this.reannounceIntervalMs =
93
- opts.reannounceIntervalMs ?? REANNOUNCE_INTERVAL_MS;
94
- this.log = opts.log ?? ((message) => console.error(message));
95
- this.onIncoming = (env, fromPc) => this.handleIncoming(env, fromPc);
96
- if (opts.activateOnConstruct !== false)
97
- this.activate();
98
- }
99
- activate() {
100
- if (this.lifecycle === "active")
101
- return;
102
- if (this.lifecycle === "detached") {
103
- throw new Error("mesh: BrokerRemote is detached");
104
- }
105
- try {
106
- this.pi.on("envelope", this.onIncoming);
107
- this.broker.setRemoteRouter(this);
108
- this._bootstrapWithSiblings();
109
- this.topologyRefreshNeeded.clear();
110
- if (this.reannounceIntervalMs > 0) {
111
- this.reannounceTimer = setInterval(() => {
112
- if (this.lifecycle !== "active" ||
113
- this.routing.siblingByPubkey.size === 0) {
114
- return;
115
- }
116
- try {
117
- this._bootstrapWithSiblings();
118
- this.topologyRefreshNeeded.clear();
119
- }
120
- catch {
121
- this._logMetadataOnly("[broker_remote] event=reannounce_failed reason=send_failure");
122
- }
123
- }, this.reannounceIntervalMs);
124
- this.reannounceTimer.unref?.();
125
- }
126
- this.lifecycle = "active";
127
- }
128
- catch (error) {
129
- if (this.reannounceTimer) {
130
- clearInterval(this.reannounceTimer);
131
- this.reannounceTimer = null;
132
- }
133
- try {
134
- this.pi.off("envelope", this.onIncoming);
135
- }
136
- catch {
137
- // best-effort rollback
138
- }
139
- try {
140
- this.broker.clearRemoteRouter(this);
141
- }
142
- catch {
143
- // preserve the activation error
144
- }
145
- this.lifecycle = "detached";
146
- throw error;
147
- }
148
- }
149
- detach() {
150
- if (this.lifecycle === "detached")
151
- return;
152
- const wasActive = this.lifecycle === "active";
153
- this.lifecycle = "detached";
154
- if (this.reannounceTimer) {
155
- clearInterval(this.reannounceTimer);
156
- this.reannounceTimer = null;
157
- }
158
- this._clearAllPendingFills();
159
- this.topologyRefreshNeeded.clear();
160
- if (!wasActive)
161
- return;
162
- this.pi.off("envelope", this.onIncoming);
163
- this.broker.clearRemoteRouter(this);
164
- }
165
- setTopology(next) {
166
- if (this.lifecycle === "detached") {
167
- throw new Error("mesh: BrokerRemote is detached");
168
- }
169
- const previous = this.routing;
170
- const replacement = buildRoutingState(next, this.technicalSelfPubkey);
171
- for (const pcPubkey of [...this.remotePeers.keys()]) {
172
- if (!replacement.siblingByPubkey.has(pcPubkey)) {
173
- this.remotePeers.delete(pcPubkey);
174
- }
175
- }
176
- for (const pcPubkey of [...this.pendingFills.keys()]) {
177
- if (!replacement.siblingByPubkey.has(pcPubkey)) {
178
- this._clearPendingFills(pcPubkey);
179
- }
180
- }
181
- for (const pcPubkey of [...this.topologyRefreshNeeded]) {
182
- if (!replacement.siblingByPubkey.has(pcPubkey)) {
183
- this.topologyRefreshNeeded.delete(pcPubkey);
184
- }
185
- }
186
- this.routing = replacement;
187
- if (this.lifecycle !== "active")
188
- return;
189
- const refreshKeys = new Set(this.topologyRefreshNeeded);
190
- for (const [pcPubkey, alias] of replacement.siblingByPubkey) {
191
- if (previous.siblingByPubkey.get(pcPubkey) !== alias ||
192
- previous.siblingLegacyLabelByPubkey.get(pcPubkey) !==
193
- replacement.siblingLegacyLabelByPubkey.get(pcPubkey)) {
194
- refreshKeys.add(pcPubkey);
195
- }
196
- }
197
- if (previous.self.pcLabel !== replacement.self.pcLabel ||
198
- previous.self.legacyPcLabel !== replacement.self.legacyPcLabel) {
199
- for (const pcPubkey of replacement.siblingByPubkey.keys()) {
200
- refreshKeys.add(pcPubkey);
201
- }
202
- }
203
- if (refreshKeys.size === 0)
204
- return;
205
- let body;
206
- try {
207
- body = this._localPeersBody();
208
- }
209
- catch {
210
- for (const pcPubkey of refreshKeys) {
211
- this.topologyRefreshNeeded.add(pcPubkey);
212
- }
213
- this._logMetadataOnly("[broker_remote] event=topology_refresh_failed reason=inventory_failure");
214
- return;
215
- }
216
- for (const pcPubkey of refreshKeys) {
217
- let failed = false;
218
- try {
219
- this._sendControlEnvelope(pcPubkey, { type: "peers_request" });
220
- }
221
- catch {
222
- failed = true;
223
- }
224
- try {
225
- this._sendControlEnvelope(pcPubkey, body);
226
- }
227
- catch {
228
- failed = true;
229
- }
230
- if (failed) {
231
- this.topologyRefreshNeeded.add(pcPubkey);
232
- this._logMetadataOnly("[broker_remote] event=topology_refresh_failed reason=send_failure");
233
- }
234
- else {
235
- this.topologyRefreshNeeded.delete(pcPubkey);
236
- }
237
- }
238
- }
239
- _bootstrapWithSiblings() {
240
- const body = this._localPeersBody();
241
- for (const pcPubkey of this.routing.siblingByPubkey.keys()) {
242
- this._sendControlEnvelope(pcPubkey, { type: "peers_request" });
243
- this._sendControlEnvelope(pcPubkey, body);
244
- }
245
- }
246
- _localPeersBody() {
247
- const detailed = this.broker.localPeerInfos();
248
- if (!isBoundedPeerRoster(detailed)) {
249
- throw new Error("mesh: local peer roster exceeds wire limits");
250
- }
251
- const peers = detailed.map((peer) => peer.address);
252
- if (!isBoundedPeerAddresses(peers)) {
253
- throw new Error("mesh: local peer addresses exceed wire limits");
254
- }
255
- return {
256
- type: "peers_update",
257
- peers,
258
- peers_detailed: detailed.map((peer) => ({
259
- cwd: peer.cwd,
260
- name: peer.name,
261
- address: peer.address,
262
- })),
263
- };
264
- }
265
- _remoteInfosByPubkey(pcPubkey) {
266
- const entry = this.remotePeers.get(pcPubkey);
267
- if (!entry)
268
- return [];
269
- if (Date.now() - entry.ts > this.cacheTtlMs) {
270
- this.remotePeers.delete(pcPubkey);
271
- return [];
272
- }
273
- return entry.infos;
274
- }
275
- getRemotePeers(pcLabel) {
276
- const pcPubkey = this.routing.siblingByLabel.get(pcLabel);
277
- return pcPubkey
278
- ? this._remoteInfosByPubkey(pcPubkey).map((info) => info.address)
279
- : [];
280
- }
281
- getAllRemote() {
282
- const entries = [];
283
- for (const [pcPubkey, pcLabel] of this.routing.siblingByPubkey) {
284
- const peers = this._remoteInfosByPubkey(pcPubkey).map((info) => info.address);
285
- if (peers.length > 0)
286
- entries.push([pcLabel, peers]);
287
- }
288
- return Object.fromEntries(entries);
289
- }
290
- listRemotePeers() {
291
- const output = [];
292
- for (const [pcPubkey, pcLabel] of this.routing.siblingByPubkey) {
293
- for (const info of this._remoteInfosByPubkey(pcPubkey)) {
294
- output.push(`${pcLabel}:${info.address}`);
295
- }
296
- }
297
- return output;
298
- }
299
- listRemotePeerInfos() {
300
- const output = [];
301
- for (const [pcPubkey, pcLabel] of this.routing.siblingByPubkey) {
302
- for (const info of this._remoteInfosByPubkey(pcPubkey)) {
303
- output.push({
304
- pc: pcLabel,
305
- cwd: info.cwd,
306
- name: info.name,
307
- address: `${pcLabel}:${info.address}`,
308
- });
309
- }
310
- }
311
- return output;
312
- }
313
- onLocalPeersChanged(_peers) {
314
- if (this.lifecycle !== "active" ||
315
- this.routing.siblingByPubkey.size === 0) {
316
- return;
317
- }
318
- let body;
319
- try {
320
- body = this._localPeersBody();
321
- }
322
- catch {
323
- this._logMetadataOnly("[broker_remote] event=local_roster_dropped reason=wire_limits");
324
- return;
325
- }
326
- for (const pcPubkey of this.routing.siblingByPubkey.keys()) {
327
- this._sendControlEnvelope(pcPubkey, body);
328
- }
329
- }
330
- tryRouteOutbound(env) {
331
- if (this.lifecycle !== "active" || typeof env.to !== "string") {
332
- return false;
333
- }
334
- const parsed = parseAddress(env.to);
335
- if (!parsed)
336
- return false;
337
- const siblingKey = this.routing.siblingByLabel.get(parsed.pcLabel);
338
- if (siblingKey)
339
- return this._routeToCanonicalSibling(siblingKey, env);
340
- return false;
341
- }
342
- _routeToCanonicalSibling(siblingKey, env) {
343
- const destination = parseAddress(env.to);
344
- const legacyDestinationLabel = this.routing.siblingLegacyLabelByPubkey.get(siblingKey);
345
- if (!destination || !legacyDestinationLabel)
346
- return false;
347
- const rewritten = {
348
- ...env,
349
- from: `${this.routing.self.legacyPcLabel}:${env.from}`,
350
- to: `${legacyDestinationLabel}:${destination.peerName}`,
351
- };
352
- this.pi.sendEnvelopeToPi(siblingKey, rewritten);
353
- if (!this.remotePeers.has(siblingKey)) {
354
- this._sendControlEnvelope(siblingKey, { type: "peers_request" });
355
- void this._awaitPeersFill(siblingKey, PEERS_REQUEST_TIMEOUT_MS);
356
- }
357
- return true;
358
- }
359
- handleIncoming(env, fromPc) {
360
- if (this.lifecycle !== "active")
361
- return;
362
- if (fromPc === "_relay") {
363
- this._propagateTransportError(env);
364
- return;
365
- }
366
- let canonicalFromPc;
367
- let fromPcBytes;
368
- try {
369
- fromPcBytes = decodeEd25519PublicKey(fromPc, "from_pc");
370
- canonicalFromPc = encodeEd25519PublicKey(fromPcBytes);
371
- }
372
- catch {
373
- this._dropMetadataOnly("invalid_from_pc");
374
- return;
375
- }
376
- const localAlias = this.routing.siblingByPubkey.get(canonicalFromPc);
377
- if (!localAlias) {
378
- this._dropMetadataOnly("unknown_from_pc", publicKeyFingerprint(fromPcBytes));
379
- return;
380
- }
381
- if (typeof env.to !== "string") {
382
- this._dropMetadataOnly("invalid_to");
383
- return;
384
- }
385
- const senderLegacyLabel = this.routing.siblingLegacyLabelByPubkey.get(canonicalFromPc);
386
- const senderLocalAddress = stripKnownPcPrefix(env.from, senderLegacyLabel);
387
- const targetLocalAddress = stripKnownPcPrefix(env.to, this.routing.self.legacyPcLabel);
388
- if (!senderLocalAddress || !targetLocalAddress) {
389
- this._dropMetadataOnly("invalid_cross_pc_address");
390
- return;
391
- }
392
- let normalized;
393
- try {
394
- // Cross-PC frames bypass the UDS parser. Round-trip their rewritten
395
- // envelope before inspecting a body or mutating control/cache state.
396
- normalized = parse(serialize({
397
- ...env,
398
- from: `${localAlias}:${senderLocalAddress}`,
399
- to: targetLocalAddress,
400
- }));
401
- }
402
- catch {
403
- this._dropMetadataOnly("invalid_envelope");
404
- return;
405
- }
406
- if (typeof normalized.to !== "string") {
407
- this._dropMetadataOnly("invalid_envelope");
408
- return;
409
- }
410
- const body = normalized.body;
411
- const bodyType = body && typeof body === "object" ? body.type : undefined;
412
- const isControlEndpoint = senderLocalAddress === "_broker_remote" &&
413
- targetLocalAddress === "_broker_remote";
414
- if (isControlEndpoint && bodyType === "peers_update") {
415
- const infos = _parsePeersUpdate(body);
416
- if (!infos) {
417
- this._dropMetadataOnly("invalid_peers_update");
418
- return;
419
- }
420
- this._setRemoteCache(canonicalFromPc, infos);
421
- return;
422
- }
423
- if (isControlEndpoint && bodyType === "peers_request") {
424
- try {
425
- this._sendControlEnvelope(canonicalFromPc, this._localPeersBody());
426
- }
427
- catch {
428
- this._logMetadataOnly("[broker_remote] event=control_reply_failed reason=inventory_failure");
429
- }
430
- return;
431
- }
432
- const status = this.broker.injectFromRemote(normalized);
433
- if (bodyType === "ack")
434
- return;
435
- const ackBody = {
436
- type: "ack",
437
- status,
438
- target: normalized.to,
439
- };
440
- const ackEnv = {
441
- from: `${this.routing.self.legacyPcLabel}:${BROKER_NAME}`,
442
- to: env.from,
443
- id: uuidv7(),
444
- re: normalized.id,
445
- body: ackBody,
446
- };
447
- this.pi.sendEnvelopeToPi(canonicalFromPc, ackEnv);
448
- }
449
- _setRemoteCache(pcPubkey, infos) {
450
- this.remotePeers.set(pcPubkey, {
451
- infos,
452
- pcPubkey,
453
- ts: Date.now(),
454
- });
455
- this._clearPendingFills(pcPubkey);
456
- }
457
- _awaitPeersFill(pcPubkey, timeoutMs) {
458
- return new Promise((resolve) => {
459
- const slot = {
460
- resolve,
461
- timer: setTimeout(() => {
462
- const pending = this.pendingFills.get(pcPubkey);
463
- pending?.delete(slot);
464
- if (pending?.size === 0)
465
- this.pendingFills.delete(pcPubkey);
466
- resolve();
467
- }, timeoutMs),
468
- };
469
- const pending = this.pendingFills.get(pcPubkey) ?? new Set();
470
- pending.add(slot);
471
- this.pendingFills.set(pcPubkey, pending);
472
- });
473
- }
474
- _clearPendingFills(pcPubkey) {
475
- const pending = this.pendingFills.get(pcPubkey);
476
- if (!pending)
477
- return;
478
- for (const slot of pending) {
479
- clearTimeout(slot.timer);
480
- slot.resolve();
481
- }
482
- this.pendingFills.delete(pcPubkey);
483
- }
484
- _clearAllPendingFills() {
485
- for (const pcPubkey of [...this.pendingFills.keys()]) {
486
- this._clearPendingFills(pcPubkey);
487
- }
488
- }
489
- _propagateTransportError(env) {
490
- const body = asTransportErrorBody(env.body);
491
- const target = typeof env.to === "string"
492
- ? stripKnownPcPrefix(env.to, this.routing.self.legacyPcLabel)
493
- : null;
494
- // Relay-first compatibility: only the authenticated Relay sentinel may
495
- // carry its former lowercase 32-hex id shape. Normalize it locally before
496
- // it reaches Broker's normal strict envelope boundary.
497
- const normalizedId = LEGACY_RELAY_ID_RE.test(env.id)
498
- ? `${env.id.slice(0, 8)}-${env.id.slice(8, 12)}-${env.id.slice(12, 16)}-${env.id.slice(16, 20)}-${env.id.slice(20)}`
499
- : isUuid(env.id)
500
- ? env.id
501
- : null;
502
- if (env.from !== "_relay" ||
503
- !normalizedId ||
504
- !isUuid(env.re) ||
505
- !target ||
506
- target === "broadcast" ||
507
- !body) {
508
- this._dropMetadataOnly("invalid_relay_error");
509
- return;
510
- }
511
- this.broker.injectFromRemote({
512
- ...env,
513
- id: normalizedId,
514
- from: BROKER_NAME,
515
- to: target,
516
- body,
517
- });
518
- }
519
- _sendControlEnvelope(toPc, body) {
520
- const env = envelope(`${this.routing.self.legacyPcLabel}:_broker_remote`, `${this._legacyLabelForPubkey(toPc) ?? "?"}:_broker_remote`, body, null);
521
- this.pi.sendEnvelopeToPi(toPc, env);
522
- }
523
- _legacyLabelForPubkey(pcPubkey) {
524
- return this.routing.siblingLegacyLabelByPubkey.get(pcPubkey);
525
- }
526
- _dropMetadataOnly(reason, fingerprint) {
527
- this._logMetadataOnly(`[broker_remote] event=drop reason=${reason}` +
528
- (fingerprint ? ` fingerprint=${fingerprint}` : ""));
529
- }
530
- _logMetadataOnly(message) {
531
- try {
532
- this.log(message);
533
- }
534
- catch {
535
- // Diagnostics are best-effort and must not break routing or timers.
536
- }
537
- }
538
- }
539
- export function parseAddress(to) {
540
- const separator = to.indexOf(":");
541
- if (separator <= 0 || separator === to.length - 1)
542
- return null;
543
- return {
544
- pcLabel: to.slice(0, separator),
545
- peerName: to.slice(separator + 1),
546
- };
547
- }
548
- function stripKnownPcPrefix(value, legacyPcLabel) {
549
- if (typeof value !== "string")
550
- return null;
551
- const exactPrefix = legacyPcLabel === undefined ? undefined : `${legacyPcLabel}:`;
552
- if (exactPrefix && value.startsWith(exactPrefix)) {
553
- const remainder = value.slice(exactPrefix.length);
554
- return remainder.length > 0 ? remainder : null;
555
- }
556
- // Legacy labels are display-only after Relay authentication. Preserve the
557
- // old first-colon behavior for a divergent receiver view rather than using
558
- // text as an additional authorization gate.
559
- return stripRequiredPcPrefix(value);
560
- }
561
- function stripRequiredPcPrefix(value) {
562
- const separator = value.indexOf(":");
563
- if (separator <= 0 || separator === value.length - 1)
564
- return null;
565
- return value.slice(separator + 1);
566
- }
567
- function _parsePeersUpdate(body) {
568
- const peers = body.peers;
569
- if (!Array.isArray(peers) || !isBoundedPeerAddresses(peers))
570
- return null;
571
- const detailed = body.peers_detailed;
572
- if (Array.isArray(detailed)) {
573
- if (!isBoundedPeerRoster(detailed))
574
- return null;
575
- return detailed.map((entry) => ({
576
- cwd: entry.cwd,
577
- name: entry.name,
578
- address: entry.address,
579
- }));
580
- }
581
- return peers.map((address) => ({ cwd: "", name: address, address }));
582
- }
583
- //# sourceMappingURL=broker_remote.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"broker_remote.js","sourceRoot":"","sources":["../../src/session/broker_remote.ts"],"names":[],"mappings":"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"}
@@ -1,33 +0,0 @@
1
- export interface AcquiredLock {
2
- ok: true;
3
- /** Manual release. Optional — process exit cleans up too. */
4
- release(): void;
5
- }
6
- export interface RefusedLock {
7
- ok: false;
8
- /** Where the live lock socket lives, in case the caller wants to log it. */
9
- lockPath: string;
10
- }
11
- export type CwdLockResult = AcquiredLock | RefusedLock;
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). */
18
- export declare function lockPathForCwd(cwd: string): string;
19
- /**
20
- * Attempts to acquire the cwd lock. Resolves with either:
21
- * - `{ ok: true, release }` when we own it (server bound + retained).
22
- * - `{ ok: false, lockPath }` when a live Pi already holds the lock.
23
- *
24
- * Self-healing path: if the prior holder crashed, the leftover socket file
25
- * fails `tryConnect` (ECONNREFUSED). We unlink it and retry the bind — the
26
- * second attempt then succeeds.
27
- *
28
- * The server holds no actual listener logic; its only job is to keep the
29
- * UDS endpoint pinned by the OS. No incoming connection ever does anything
30
- * useful — the next-Pi-attempt's `tryConnect` succeeding is the entire
31
- * signal we care about.
32
- */
33
- export declare function acquireCwdLock(cwd: string, name?: string): Promise<CwdLockResult>;