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
|
@@ -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
|
|
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
|
-
/**
|
|
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 →
|
|
75
|
+
/** Returns the full cross-PC inventory: pc_label → addresses (TTL-respected). */
|
|
60
76
|
getAllRemote(): Record<string, string[]>;
|
|
61
|
-
/**
|
|
62
|
-
* `list_peers`
|
|
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(
|
|
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
|
-
/**
|
|
143
|
-
* unknown / expired. */
|
|
144
|
-
|
|
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
|
|
151
|
+
return entry.infos;
|
|
151
152
|
}
|
|
152
|
-
/** Returns the
|
|
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
|
-
/**
|
|
163
|
-
* `list_peers`
|
|
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
|
|
168
|
-
out.push(`${label}:${
|
|
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(
|
|
180
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
332
|
-
this.remotePeers.set(pcLabel, {
|
|
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":"AACA,OAAO,EAAiB,QAAQ,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAGhE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,MAAM,YAAY,GAAG,CAAC,GAAG,MAAM,CAAC;AAChC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AACvC,MAAM,WAAW,GAAG,QAAQ,CAAC;AA8D7B,MAAM,OAAO,YAAY;IACN,MAAM,CAAS;IACf,EAAE,CAAkB;IACpB,WAAW,CAAS;IACpB,YAAY,CAAS;IACrB,UAAU,CAAS;IACnB,GAAG,CAAwB;IAE5C,oEAAoE;IACnD,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5D,+DAA+D;IAC9C,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE7D,0CAA0C;IACzB,WAAW,GAAG,IAAI,GAAG,EAA2B,CAAC;IAClE,0DAA0D;IACzC,YAAY,GAAG,IAAI,GAAG,EAA4B,CAAC;IAEnD,UAAU,CAA0C;IAC7D,QAAQ,GAAG,KAAK,CAAC;IAEzB,YAAY,IAAyB;QACnC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,YAAY,CAAC;QAClD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAErD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,EAAE;YAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAEzD,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAExC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAElC,kEAAkE;QAClE,mEAAmE;QACnE,qEAAqE;QACrE,kEAAkE;QAClE,kEAAkE;QAClE,4CAA4C;QAC5C,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAChC,CAAC;IAED;;6CAEyC;IACjC,sBAAsB;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACpC,KAAK,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC/C,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;YAC/D,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED;;;;wDAIoD;IAC5C,eAAe;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAC9C,OAAO;YACL,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACrC,cAAc,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;SACxF,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,6EAA6E;IAE7E;;;yEAGqE;IACrE,WAAW,CAAC,IAAmB;QAC7B,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1C,oDAAoD;QACpD,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,CAAC;QACD,iEAAiE;QACjE,oEAAoE;QACpE,kEAAkE;QAClE,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACpC,KAAK,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC/C,IAAI,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,SAAS;YACxC,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;YAC/D,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,CAAc;QAChC,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ;YAAE,OAAO;QACtC,IAAI,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,WAAW;YAAE,OAAO,CAAE,6BAA6B;QAC1E,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY;YAAE,OAAO;QAC7C,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,6EAA6E;IAE7E;+DAC2D;IACnD,YAAY,CAAC,OAAe;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QACtB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,UAAU;YAAE,OAAO,EAAE,CAAC;QACvD,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED;sEACkE;IAClE,cAAc,CAAC,OAAe;QAC5B,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,iFAAiF;IACjF,YAAY;QACV,MAAM,GAAG,GAA6B,EAAE,CAAC;QACzC,KAAK,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YACzC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;QAC3C,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED;0EACsE;IACtE,eAAe;QACb,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACvC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5C,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;+EAE2E;IAC3E,mBAAmB;QACjB,MAAM,GAAG,GAAe,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACvC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5C,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC/F,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,6EAA6E;IAE7E;;;;OAIG;IACH,mBAAmB,CAAC,MAAgB;QAClC,wEAAwE;QACxE,yEAAyE;QACzE,4EAA4E;QAC5E,gBAAgB;QAChB,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACpC,KAAK,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC/C,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,6EAA6E;IAE7E;;;;;;;;;;;;;;OAcG;IACH,gBAAgB,CAAC,GAAa;QAC5B,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAChC,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC7C,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QAC3B,IAAI,OAAO,KAAK,IAAI,CAAC,WAAW;YAAE,OAAO,KAAK,CAAC,CAAE,yBAAyB;QAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC,CAAE,gCAAgC;QAE/D,kEAAkE;QAClE,MAAM,SAAS,GAAa;YAC1B,GAAG,GAAG;YACN,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC,IAAI,EAAE;SACxC,CAAC;QAEF,oEAAoE;QACpE,sEAAsE;QACtE,kEAAkE;QAClE,iDAAiD;QACjD,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC/C,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;YAChD,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,eAAe,EAA6B,CAAC,CAAC;YAC3F,KAAK,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6EAA6E;IAE7E;;;;OAIG;IACH,cAAc,CAAC,GAAa,EAAE,MAAc;QAC1C,0EAA0E;QAC1E,4DAA4D;QAC5D,kEAAkE;QAClE,oEAAoE;QACpE,2DAA2D;QAC3D,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC;YACnC,OAAO;QACT,CAAC;QAED,0EAA0E;QAC1E,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,IAAI,CAAC,GAAG,CACN,iCAAiC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,wBAAwB,CAC7E,CAAC;YACF,OAAO;QACT,CAAC;QACD,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7C,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;gBAChC,IAAI,CAAC,GAAG,CACN,wCAAwC,GAAG,CAAC,IAAI,WAAW;oBAC3D,6BAA6B,YAAY,GAAG,CAC7C,CAAC;gBACF,OAAO;YACT,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAG,GAAG,CAAC,IAAiC,CAAC;QACnD,MAAM,QAAQ,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAE1E,0EAA0E;QAC1E,IAAI,QAAQ,KAAK,cAAc,EAAE,CAAC;YAChC,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,iBAAiB,CAAC,IAAuB,CAAC,CAAC,CAAC;YACvF,OAAO;QACT,CAAC;QAED,0EAA0E;QAC1E,IAAI,QAAQ,KAAK,eAAe,EAAE,CAAC;YACjC,iEAAiE;YACjE,kEAAkE;YAClE,mEAAmE;YACnE,mEAAmE;YACnE,mEAAmE;YACnE,4DAA4D;YAC5D,mEAAmE;YACnE,+DAA+D;YAC/D,gDAAgD;YAChD,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,0EAA0E;QAC1E,iEAAiE;QACjE,4DAA4D;QAC5D,sEAAsE;QACtE,uEAAuE;QAEvE,0EAA0E;QAC1E,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;YAC3E,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,WAAW,GAAG,GAAG,CAAC;QACtB,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;YACtD,WAAW,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAClD,CAAC;aAAM,IAAI,QAAQ,EAAE,CAAC;YACpB,wDAAwD;YACxD,IAAI,CAAC,GAAG,CACN,sCAAsC,GAAG,CAAC,EAAE,qBAAqB;gBACjE,gBAAgB,IAAI,CAAC,WAAW,GAAG,CACpC,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QACzD,mEAAmE;QACnE,wCAAwC;QACxC,IAAI,QAAQ,KAAK,KAAK;YAAE,OAAO;QAE/B,gEAAgE;QAChE,6CAA6C;QAC7C,MAAM,OAAO,GAAY,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAY,EAAE,CAAC;QACnF,MAAM,MAAM,GAAa;YACvB,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,IAAI,WAAW,EAAE;YAC1C,EAAE,EAAE,GAAG,CAAC,IAAI;YACZ,EAAE,EAAE,MAAM,EAAE;YACZ,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,OAAO;SACd,CAAC;QACF,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,6EAA6E;IAErE,eAAe,CACrB,OAAe,EACf,QAAgB,EAChB,KAAqB;QAErB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACnE,8DAA8D;QAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;gBAC3B,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACzB,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,CAAC;YACD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,OAAe,EAAE,SAAiB;QACxD,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACnC,MAAM,IAAI,GAAgB;gBACxB,OAAO;gBACP,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE;oBACrB,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBAC3C,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;oBAClB,OAAO,EAAE,CAAC;gBACZ,CAAC,EAAE,SAAS,CAAC;aACd,CAAC;YACF,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,EAAe,CAAC;YACrE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACd,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,wBAAwB,CAAC,GAAa;QAC5C,mEAAmE;QACnE,+DAA+D;QAC/D,uDAAuD;QACvD,sEAAsE;QACtE,sEAAsE;QACtE,qEAAqE;QACrE,8DAA8D;QAC9D,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ;YAAE,OAAO;QACvC,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAa,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC,WAAW;YACtE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE;YACjC,CAAC,CAAC,GAAG,CAAC;QACR,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAEO,oBAAoB,CAC1B,IAAY,EACZ,IAAwC;QAExC,MAAM,GAAG,GAAa,QAAQ,CAC5B,GAAG,IAAI,CAAC,WAAW,iBAAiB,EACpC,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,GAAG,iBAAiB,EACrD,IAAI,EACJ,IAAI,CACL,CAAC;QACF,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC;IAEO,eAAe,CAAC,QAAgB;QACtC,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;CACF;AAED,gFAAgF;AAEhF;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAC1B,EAAU;IAEV,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,KAAK,EAAE,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;AACpE,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,iBAAiB,CAAC,IAAqB;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC;IACrC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAC,MAAM,CACpB,CAAC,CAAC,EAAqB,EAAE,CACvB,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;YAC5B,OAAQ,CAAkB,CAAC,GAAG,KAAK,QAAQ;YAC3C,OAAQ,CAAkB,CAAC,IAAI,KAAK,QAAQ;YAC5C,OAAQ,CAAkB,CAAC,OAAO,KAAK,QAAQ,CAClD,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1D,OAAO,KAAK;SACT,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;SACjD,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -9,7 +9,12 @@ export interface RefusedLock {
|
|
|
9
9
|
lockPath: string;
|
|
10
10
|
}
|
|
11
11
|
export type CwdLockResult = AcquiredLock | RefusedLock;
|
|
12
|
-
/**
|
|
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>;
|
package/dist/session/cwd_lock.js
CHANGED
|
@@ -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 {
|
|
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 `
|
|
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
|
-
/**
|
|
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
|
|
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 =
|
|
58
|
-
|
|
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
|
-
//
|
|
70
|
-
|
|
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,
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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;
|
|
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
|
-
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAkB,gBAAgB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"leader_election.js","sourceRoot":"","sources":["../../src/session/leader_election.ts"],"names":[],"mappings":"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"}
|