svamp-cli 0.2.341 → 0.2.346

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 (67) hide show
  1. package/bin/skills/artifact/SKILL.md +1 -1
  2. package/bin/skills/crew/SKILL.md +21 -3
  3. package/dist/DefaultTransport-vfp78fug.mjs +47 -0
  4. package/dist/GeminiTransport-3OkhtFRO.mjs +130 -0
  5. package/dist/KimiTransport-D8n009Tr.mjs +141 -0
  6. package/dist/acpAgentConfig-CObOPlA8.mjs +48 -0
  7. package/dist/acpBackend-BZ1MJhQV.mjs +922 -0
  8. package/dist/{adminCommands-Btl3is3z.mjs → adminCommands-BvsYnRDA.mjs} +2 -18
  9. package/dist/{agentCommands-B7JaByb0.mjs → agentCommands-B2Nl7Fof.mjs} +6 -23
  10. package/dist/api-BHjyC0Ph.mjs +157 -0
  11. package/dist/{auth-pTUm-zt4.mjs → auth-CRz8TsEl.mjs} +1 -22
  12. package/dist/bootStatus-DqtNgJch.mjs +143 -0
  13. package/dist/claudeAuth-iAerdaMr.mjs +247 -0
  14. package/dist/cli.mjs +2939 -5
  15. package/dist/codexAppServerBackend-VGsYtbqg.mjs +786 -0
  16. package/dist/codexProvider-BtxYc5Rj.mjs +68 -0
  17. package/dist/{commands-BaxjRuxM.mjs → commands-BB1Kcyt-.mjs} +13 -19
  18. package/dist/{commands-BUkV04q6.mjs → commands-BOpoVBOM.mjs} +55 -25
  19. package/dist/{commands-C1L_R1H6.mjs → commands-C2aODeVc.mjs} +58 -33
  20. package/dist/{commands-znQSQbTX.mjs → commands-CiRCwjkJ.mjs} +10 -32
  21. package/dist/{commands-C4whLEwv.mjs → commands-D1pZq3d4.mjs} +103 -41
  22. package/dist/{commands-CMCSUI4A.mjs → commands-D69mnkYu.mjs} +20 -30
  23. package/dist/{commands-CfP6gPZF.mjs → commands-DW5RnHZw.mjs} +2 -19
  24. package/dist/{commands-EcIOSJHF.mjs → commands-H4PsTGn8.mjs} +58 -26
  25. package/dist/cron-hHGdb5kU.mjs +132 -0
  26. package/dist/detectIsolation-CzoDCEnh.mjs +319 -0
  27. package/dist/envFlag-COOuJ3AH.mjs +11 -0
  28. package/dist/fileLock-BMPwCrB6.mjs +80 -0
  29. package/dist/{fleet-U-WXVbW_.mjs → fleet-DM_Q7w69.mjs} +85 -24
  30. package/dist/flushExit-C-i6SGjj.mjs +37 -0
  31. package/dist/friendlyName-1UZcyDhu.mjs +586 -0
  32. package/dist/{headlessCli-CptF7_lZ.mjs → headlessCli-C8HzQvis.mjs} +3 -21
  33. package/dist/hookSettings-DYMTUgVA.mjs +10399 -0
  34. package/dist/{httpServer-Be1Hcddr.mjs → httpServer-BzEDbOGn.mjs} +14 -5
  35. package/dist/hyphaClient-ybivOjZo.mjs +49 -0
  36. package/dist/index.mjs +40 -8
  37. package/dist/instance-CeHz5C8v.mjs +203 -0
  38. package/dist/kimiProvider-DbxODebR.mjs +69 -0
  39. package/dist/kimiSetup-NGsoYB5h.mjs +48 -0
  40. package/dist/loopVerify-B47sSjxe.mjs +444 -0
  41. package/dist/machineTools-DygM1jXW.mjs +580 -0
  42. package/dist/model-CUHojegn.mjs +66 -0
  43. package/dist/{notifyCommands-DitnhzYz.mjs → notifyCommands-D-IKIxiq.mjs} +3 -18
  44. package/dist/package-DtuINqf5.mjs +64 -0
  45. package/dist/pinnedCodex-XW4qvOAe.mjs +11 -0
  46. package/dist/pinnedNono-5ZHb6328.mjs +15 -0
  47. package/dist/{rpc-zndUgvJ7.mjs → rpc-BB6RF4-F.mjs} +38 -6
  48. package/dist/{rpc-BPT9DJXL.mjs → rpc-Cf0grcru.mjs} +28 -20
  49. package/dist/{run-CrUTBmi4.mjs → run-ChdsgaSD.mjs} +17 -9
  50. package/dist/run-DkjwF-zA.mjs +9695 -0
  51. package/dist/sandboxDetect-Cdzsj5TC.mjs +19 -0
  52. package/dist/{scheduler-B0h2sfGn.mjs → scheduler-BY30ZrB9.mjs} +38 -6
  53. package/dist/securityContext-Cm5UTCuD.mjs +218 -0
  54. package/dist/serveAuth-DbVLRCRR.mjs +418 -0
  55. package/dist/{serveCommands-DpF0xKvz.mjs → serveCommands-CUHUiYnZ.mjs} +13 -34
  56. package/dist/sharingNotificationSync-qGIQ-3yf.mjs +359 -0
  57. package/dist/{sideband-B5n9fNxM.mjs → sideband-68HhGT0i.mjs} +1 -21
  58. package/dist/store-Bn0ByYev.mjs +347 -0
  59. package/dist/store-fi0f-ff1.mjs +184 -0
  60. package/dist/types-57J3Re0n.mjs +17 -0
  61. package/dist/wantsHelp-6bMOeNUz.mjs +5 -0
  62. package/dist/wrapCommand-CdNawSaa.mjs +117 -0
  63. package/package.json +3 -3
  64. package/dist/cli-pFCLXDrP.mjs +0 -2749
  65. package/dist/package-CigJ8nhu.mjs +0 -64
  66. package/dist/run-LHJh7jLy.mjs +0 -26384
  67. package/dist/sandboxDetect-DNTcbgWD.mjs +0 -12
@@ -0,0 +1,586 @@
1
+ import { rmSync, mkdirSync, writeFileSync, renameSync, statSync, existsSync, readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import os from 'node:os';
4
+ import { randomUUID, randomBytes } from 'node:crypto';
5
+
6
+ const SVAMP_HOME = process.env.SVAMP_HOME || join(os.homedir(), ".svamp");
7
+ const num = (key, def) => {
8
+ const v = Number(process.env[key]);
9
+ return Number.isFinite(v) && v > 0 ? v : def;
10
+ };
11
+ const MAX_AGENT_HOPS = num("SVAMP_INBOX_MAX_HOPS", 3);
12
+ const URGENT_BURST = num("SVAMP_INBOX_URGENT_BURST", 5);
13
+ const URGENT_REFILL_MS = num("SVAMP_INBOX_URGENT_REFILL_MS", 6e4);
14
+ const BREAKER_WINDOW_MS = num("SVAMP_INBOX_BREAKER_WINDOW_MS", 6e4);
15
+ const BREAKER_MAX_WAKES = num("SVAMP_INBOX_BREAKER_MAX_WAKES", 30);
16
+ const BREAKER_COOLDOWN_MS = num("SVAMP_INBOX_BREAKER_COOLDOWN_MS", 12e4);
17
+ const CTX_STALE_MS = num("SVAMP_INBOX_CTX_STALE_MS", 30 * 6e4);
18
+ function ctxPath(sessionId) {
19
+ return join(SVAMP_HOME, "inbound", `${sessionId}.json`);
20
+ }
21
+ function writeInboundContext(sessionId, ctx) {
22
+ try {
23
+ const p = ctxPath(sessionId);
24
+ mkdirSync(join(SVAMP_HOME, "inbound"), { recursive: true });
25
+ const tmp = `${p}.${process.pid}.${randomUUID()}.tmp`;
26
+ writeFileSync(tmp, JSON.stringify({ ...ctx, deliveredAt: Date.now() }));
27
+ renameSync(tmp, p);
28
+ } catch {
29
+ }
30
+ }
31
+ function clearInboundContext(sessionId) {
32
+ try {
33
+ rmSync(ctxPath(sessionId), { force: true });
34
+ } catch {
35
+ }
36
+ }
37
+ function readInboundContext(sessionId) {
38
+ try {
39
+ const p = ctxPath(sessionId);
40
+ if (!existsSync(p)) return null;
41
+ const ctx = JSON.parse(readFileSync(p, "utf-8"));
42
+ if (!ctx || typeof ctx.hopCount !== "number") return null;
43
+ if (Date.now() - (ctx.deliveredAt || 0) > CTX_STALE_MS) return null;
44
+ return ctx;
45
+ } catch {
46
+ return null;
47
+ }
48
+ }
49
+ const AWAIT_TTL_MS = num("SVAMP_INBOX_AWAIT_TTL_MS", 60 * 6e4);
50
+ const AWAIT_MAX = num("SVAMP_INBOX_AWAIT_MAX", 200);
51
+ function awaitPath(sessionId) {
52
+ return join(SVAMP_HOME, "awaiting", `${sessionId}.json`);
53
+ }
54
+ const _sleepSab = new Int32Array(new SharedArrayBuffer(4));
55
+ function sleepSync(ms) {
56
+ try {
57
+ Atomics.wait(_sleepSab, 0, 0, ms);
58
+ } catch {
59
+ }
60
+ }
61
+ function withAwaitLock(sessionId, fn) {
62
+ const lock = awaitPath(sessionId) + ".lock";
63
+ try {
64
+ mkdirSync(join(SVAMP_HOME, "awaiting"), { recursive: true });
65
+ } catch {
66
+ }
67
+ const deadline = Date.now() + 50;
68
+ let held = false;
69
+ while (Date.now() < deadline) {
70
+ try {
71
+ mkdirSync(lock);
72
+ held = true;
73
+ break;
74
+ } catch {
75
+ try {
76
+ if (Date.now() - statSync(lock).mtimeMs > 5e3) {
77
+ rmSync(lock, { recursive: true, force: true });
78
+ continue;
79
+ }
80
+ } catch {
81
+ }
82
+ sleepSync(5);
83
+ }
84
+ }
85
+ try {
86
+ return fn();
87
+ } finally {
88
+ if (held) {
89
+ try {
90
+ rmSync(lock, { recursive: true, force: true });
91
+ } catch {
92
+ }
93
+ }
94
+ }
95
+ }
96
+ function readAwaiting(sessionId) {
97
+ try {
98
+ const p = awaitPath(sessionId);
99
+ if (!existsSync(p)) return {};
100
+ const m = JSON.parse(readFileSync(p, "utf-8"));
101
+ return m && typeof m === "object" ? m : {};
102
+ } catch {
103
+ return {};
104
+ }
105
+ }
106
+ function writeAwaiting(sessionId, map) {
107
+ try {
108
+ mkdirSync(join(SVAMP_HOME, "awaiting"), { recursive: true });
109
+ const p = awaitPath(sessionId);
110
+ const tmp = `${p}.${process.pid}.${randomUUID()}.tmp`;
111
+ writeFileSync(tmp, JSON.stringify(map));
112
+ renameSync(tmp, p);
113
+ } catch {
114
+ }
115
+ }
116
+ function registerAwaitingReply(sessionId, threadId, now = Date.now()) {
117
+ if (!sessionId || !threadId) return;
118
+ withAwaitLock(sessionId, () => {
119
+ const map = readAwaiting(sessionId);
120
+ for (const k of Object.keys(map)) if (now - map[k] > AWAIT_TTL_MS) delete map[k];
121
+ map[threadId] = now;
122
+ const keys = Object.keys(map);
123
+ if (keys.length > AWAIT_MAX) {
124
+ keys.sort((a, b) => map[a] - map[b]).slice(0, keys.length - AWAIT_MAX).forEach((k) => delete map[k]);
125
+ }
126
+ writeAwaiting(sessionId, map);
127
+ });
128
+ }
129
+ function peekAwaitingReply(sessionId, threadId, now = Date.now()) {
130
+ if (!sessionId || !threadId) return false;
131
+ const map = readAwaiting(sessionId);
132
+ const at = map[threadId];
133
+ if (typeof at !== "number") return false;
134
+ return now - at <= AWAIT_TTL_MS;
135
+ }
136
+ function consumeAwaitingReply(sessionId, threadId) {
137
+ if (!sessionId || !threadId) return;
138
+ withAwaitLock(sessionId, () => {
139
+ const map = readAwaiting(sessionId);
140
+ if (!(threadId in map)) return;
141
+ delete map[threadId];
142
+ writeAwaiting(sessionId, map);
143
+ });
144
+ }
145
+ function computeOutboundHop(sessionId) {
146
+ if (!sessionId) return { hopCount: 0, fromInboxTurn: false };
147
+ const ctx = readInboundContext(sessionId);
148
+ if (ctx) return { hopCount: (ctx.hopCount || 0) + 1, threadId: ctx.threadId, fromInboxTurn: true };
149
+ return { hopCount: 1, fromInboxTurn: false };
150
+ }
151
+ const buckets = /* @__PURE__ */ new Map();
152
+ const FULL_REFILL_MS = URGENT_BURST * URGENT_REFILL_MS;
153
+ let lastBucketSweep = 0;
154
+ function pruneIdleBuckets(now) {
155
+ if (now - lastBucketSweep < URGENT_REFILL_MS) return;
156
+ lastBucketSweep = now;
157
+ for (const [k, b] of buckets) {
158
+ if (now - b.last >= FULL_REFILL_MS) buckets.delete(k);
159
+ }
160
+ }
161
+ function takeUrgentToken(sender, now) {
162
+ pruneIdleBuckets(now);
163
+ let b = buckets.get(sender);
164
+ if (!b) {
165
+ b = { tokens: URGENT_BURST, last: now };
166
+ buckets.set(sender, b);
167
+ }
168
+ const refill = Math.floor((now - b.last) / URGENT_REFILL_MS);
169
+ if (refill > 0) {
170
+ b.tokens = Math.min(URGENT_BURST, b.tokens + refill);
171
+ b.last = now;
172
+ }
173
+ if (b.tokens > 0) {
174
+ b.tokens -= 1;
175
+ return true;
176
+ }
177
+ return false;
178
+ }
179
+ let wakeTimes = [];
180
+ let breakerOpenUntil = 0;
181
+ function isBreakerOpenAt(now) {
182
+ return now < breakerOpenUntil;
183
+ }
184
+ function recordWake(now) {
185
+ wakeTimes = wakeTimes.filter((t) => now - t < BREAKER_WINDOW_MS);
186
+ wakeTimes.push(now);
187
+ if (wakeTimes.length > BREAKER_MAX_WAKES) {
188
+ const wasOpen = isBreakerOpenAt(now);
189
+ if (!wasOpen) breakerOpenUntil = now + BREAKER_COOLDOWN_MS;
190
+ return !wasOpen;
191
+ }
192
+ return false;
193
+ }
194
+ function senderIsHuman(message) {
195
+ const f = message.from || "";
196
+ if (!(f.startsWith("cli:") || f.startsWith("user:"))) return false;
197
+ if (message.verified === false) return false;
198
+ return true;
199
+ }
200
+ function senderKey(message) {
201
+ return message.fromSession || message.from || "unknown";
202
+ }
203
+ function classifyInbound(message, now = Date.now(), opts) {
204
+ const hop = message.hopCount ?? 0;
205
+ const human = senderIsHuman(message);
206
+ const self = !!opts?.self;
207
+ const openThreadReply = !!opts?.openThreadReply;
208
+ if (!human && !self && !message.channel && hop > MAX_AGENT_HOPS) {
209
+ return { action: "silent", reason: `loop-guard: hop ${hop} > ${MAX_AGENT_HOPS}` };
210
+ }
211
+ if (human || self) {
212
+ const tripped2 = recordWake(now);
213
+ return { action: "wake", reason: self ? "always-wake (self)" : "always-wake (human)", breakerTripped: tripped2 };
214
+ }
215
+ if (openThreadReply) {
216
+ if (isBreakerOpenAt(now)) {
217
+ return { action: "queue", reason: "open-thread reply (breaker open)" };
218
+ }
219
+ const tripped2 = recordWake(now);
220
+ return { action: "wake", reason: "open-thread reply", breakerTripped: tripped2 };
221
+ }
222
+ if (message.urgency !== "urgent") {
223
+ return { action: "queue", reason: "non-urgent" };
224
+ }
225
+ if (isBreakerOpenAt(now)) {
226
+ return { action: "queue", reason: "circuit-breaker-open" };
227
+ }
228
+ if (!takeUrgentToken(senderKey(message), now)) {
229
+ return { action: "queue", reason: "rate-limited" };
230
+ }
231
+ const tripped = recordWake(now);
232
+ return { action: "wake", reason: "urgent", breakerTripped: tripped };
233
+ }
234
+ function isHopCapParked(message, opts) {
235
+ const hop = message.hopCount ?? 0;
236
+ const human = senderIsHuman(message);
237
+ const self = false;
238
+ return !human && !self && !message.channel && hop > MAX_AGENT_HOPS;
239
+ }
240
+ function applyInboxClear(inbox, opts) {
241
+ let kept;
242
+ if (opts?.messageId) kept = inbox.filter((m) => m.messageId !== opts.messageId);
243
+ else if (opts?.all) kept = [];
244
+ else kept = inbox.filter((m) => !m.read);
245
+ return { kept, removed: inbox.length - kept.length };
246
+ }
247
+
248
+ const ALPHABET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
249
+ const LOWER_ALPHABET = "abcdefghijklmnopqrstuvwxyz";
250
+ function shortId(length = 10, alphabet = ALPHABET) {
251
+ const maxUnbiased = Math.floor(256 / alphabet.length) * alphabet.length;
252
+ let out = "";
253
+ while (out.length < length) {
254
+ const buf = randomBytes(length - out.length);
255
+ for (let i = 0; i < buf.length && out.length < length; i++) {
256
+ const b = buf[i];
257
+ if (b < maxUnbiased) out += alphabet[b % alphabet.length];
258
+ }
259
+ }
260
+ return out;
261
+ }
262
+
263
+ const ADJECTIVES = [
264
+ "able",
265
+ "amber",
266
+ "amused",
267
+ "ancient",
268
+ "arctic",
269
+ "autumn",
270
+ "azure",
271
+ "blithe",
272
+ "bold",
273
+ "brave",
274
+ "breezy",
275
+ "bright",
276
+ "brisk",
277
+ "calm",
278
+ "candid",
279
+ "cheery",
280
+ "chill",
281
+ "clever",
282
+ "cobalt",
283
+ "cosmic",
284
+ "cozy",
285
+ "crimson",
286
+ "crisp",
287
+ "curious",
288
+ "dapper",
289
+ "daring",
290
+ "dawn",
291
+ "deft",
292
+ "dewy",
293
+ "eager",
294
+ "early",
295
+ "easy",
296
+ "electric",
297
+ "fancy",
298
+ "feisty",
299
+ "fleet",
300
+ "fond",
301
+ "frosty",
302
+ "gallant",
303
+ "gentle",
304
+ "giddy",
305
+ "glad",
306
+ "gleaming",
307
+ "golden",
308
+ "graceful",
309
+ "grand",
310
+ "hardy",
311
+ "hazel",
312
+ "hearty",
313
+ "honest",
314
+ "humble",
315
+ "jolly",
316
+ "jovial",
317
+ "keen",
318
+ "kind",
319
+ "lively",
320
+ "loyal",
321
+ "lucky",
322
+ "lunar",
323
+ "mellow",
324
+ "merry",
325
+ "mighty",
326
+ "mint",
327
+ "misty",
328
+ "nimble",
329
+ "noble",
330
+ "opal",
331
+ "patient",
332
+ "peppy",
333
+ "placid",
334
+ "plucky",
335
+ "polar",
336
+ "prim",
337
+ "proud",
338
+ "quick",
339
+ "quiet",
340
+ "quirky",
341
+ "radiant",
342
+ "rapid",
343
+ "ready",
344
+ "regal",
345
+ "rosy",
346
+ "royal",
347
+ "rugged",
348
+ "sage",
349
+ "sandy",
350
+ "scarlet",
351
+ "serene",
352
+ "sharp",
353
+ "shiny",
354
+ "silent",
355
+ "silver",
356
+ "sleek",
357
+ "smooth",
358
+ "snappy",
359
+ "snowy",
360
+ "solar",
361
+ "spry",
362
+ "stellar",
363
+ "sturdy",
364
+ "sunny",
365
+ "swift",
366
+ "tender",
367
+ "tidal",
368
+ "tidy",
369
+ "tranquil",
370
+ "trusty",
371
+ "upbeat",
372
+ "valiant",
373
+ "vivid",
374
+ "warm",
375
+ "whimsical",
376
+ "wise",
377
+ "witty",
378
+ "zesty",
379
+ "zippy"
380
+ ];
381
+ const ANIMALS = [
382
+ "ant",
383
+ "badger",
384
+ "bat",
385
+ "bear",
386
+ "beaver",
387
+ "bee",
388
+ "bison",
389
+ "boar",
390
+ "bobcat",
391
+ "buffalo",
392
+ "camel",
393
+ "caribou",
394
+ "cat",
395
+ "cheetah",
396
+ "cobra",
397
+ "condor",
398
+ "cougar",
399
+ "coyote",
400
+ "crab",
401
+ "crane",
402
+ "cricket",
403
+ "crow",
404
+ "deer",
405
+ "dingo",
406
+ "dolphin",
407
+ "donkey",
408
+ "dove",
409
+ "dragon",
410
+ "duck",
411
+ "eagle",
412
+ "eel",
413
+ "egret",
414
+ "elk",
415
+ "falcon",
416
+ "ferret",
417
+ "finch",
418
+ "fox",
419
+ "frog",
420
+ "gecko",
421
+ "gibbon",
422
+ "goat",
423
+ "goose",
424
+ "gopher",
425
+ "hare",
426
+ "hawk",
427
+ "hedgehog",
428
+ "heron",
429
+ "hippo",
430
+ "horse",
431
+ "ibex",
432
+ "ibis",
433
+ "iguana",
434
+ "jackal",
435
+ "jaguar",
436
+ "jay",
437
+ "kestrel",
438
+ "koala",
439
+ "krill",
440
+ "lark",
441
+ "lemur",
442
+ "leopard",
443
+ "lion",
444
+ "llama",
445
+ "lynx",
446
+ "macaw",
447
+ "magpie",
448
+ "mantis",
449
+ "marmot",
450
+ "marten",
451
+ "meerkat",
452
+ "mink",
453
+ "mole",
454
+ "moose",
455
+ "moth",
456
+ "mouse",
457
+ "newt",
458
+ "ocelot",
459
+ "octopus",
460
+ "orca",
461
+ "osprey",
462
+ "otter",
463
+ "owl",
464
+ "ox",
465
+ "panda",
466
+ "panther",
467
+ "parrot",
468
+ "pelican",
469
+ "penguin",
470
+ "pheasant",
471
+ "pigeon",
472
+ "puffin",
473
+ "puma",
474
+ "quail",
475
+ "rabbit",
476
+ "raccoon",
477
+ "ram",
478
+ "raven",
479
+ "robin",
480
+ "salmon",
481
+ "seal",
482
+ "shark",
483
+ "sheep",
484
+ "shrew",
485
+ "skunk",
486
+ "sloth",
487
+ "snail",
488
+ "sparrow",
489
+ "spider",
490
+ "squid",
491
+ "stag",
492
+ "stoat",
493
+ "stork",
494
+ "swan",
495
+ "tapir",
496
+ "tiger",
497
+ "toad",
498
+ "trout",
499
+ "turtle",
500
+ "viper",
501
+ "vole",
502
+ "walrus",
503
+ "weasel",
504
+ "whale",
505
+ "wolf",
506
+ "wombat",
507
+ "wren",
508
+ "yak",
509
+ "zebra"
510
+ ];
511
+ function pick(arr) {
512
+ const n = arr.length;
513
+ const max = Math.floor(256 / n) * n;
514
+ let b;
515
+ do {
516
+ b = randomBytes(1)[0];
517
+ } while (b >= max);
518
+ return arr[b % n];
519
+ }
520
+ function generateFriendlyName(taken = []) {
521
+ const used = taken instanceof Set ? taken : new Set(taken);
522
+ for (let i = 0; i < 1e3; i++) {
523
+ const name = `${pick(ADJECTIVES)}-${pick(ANIMALS)}`;
524
+ if (!used.has(name)) return name;
525
+ }
526
+ const base = `${pick(ADJECTIVES)}-${pick(ANIMALS)}`;
527
+ let n = 2;
528
+ while (used.has(`${base}-${n}`)) n++;
529
+ return `${base}-${n}`;
530
+ }
531
+ function sanitizeSegment(s) {
532
+ return String(s || "").toLowerCase().replace(/[^a-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "");
533
+ }
534
+ function friendlyNameFromId(id) {
535
+ const m = /^(.+)-[a-zA-Z0-9]{6,10}$/.exec(String(id || ""));
536
+ return m ? m[1] : void 0;
537
+ }
538
+ function composeSessionId(friendlyName, takenIds = [], len = 6) {
539
+ const taken = takenIds instanceof Set ? takenIds : new Set(takenIds);
540
+ const A = LOWER_ALPHABET.length;
541
+ const nthSuffix = (i, width2) => {
542
+ let s = "";
543
+ for (let k = 0; k < width2; k++) {
544
+ s = LOWER_ALPHABET[i % A] + s;
545
+ i = Math.floor(i / A);
546
+ }
547
+ return s;
548
+ };
549
+ let width = Math.max(1, len);
550
+ for (; ; ) {
551
+ const space = Math.pow(A, width);
552
+ for (let i = 0; i < 64; i++) {
553
+ const candidate = `${friendlyName}-${shortId(width, LOWER_ALPHABET)}`;
554
+ if (!taken.has(candidate)) return candidate;
555
+ }
556
+ if (space <= 1e6) {
557
+ for (let i = 0; i < space; i++) {
558
+ const candidate = `${friendlyName}-${nthSuffix(i, width)}`;
559
+ if (!taken.has(candidate)) return candidate;
560
+ }
561
+ }
562
+ width++;
563
+ }
564
+ }
565
+ function formatHandle(projectName, friendlyName) {
566
+ if (!friendlyName) return void 0;
567
+ const proj = sanitizeSegment(projectName || "");
568
+ return proj ? `${proj}:${friendlyName}` : friendlyName;
569
+ }
570
+ function parseHandle(input) {
571
+ const str = String(input || "").trim().replace(/^@/, "");
572
+ if (!str) return null;
573
+ const i = str.indexOf(":");
574
+ if (i === -1) return { name: str.toLowerCase() };
575
+ return { project: sanitizeSegment(str.slice(0, i)), name: str.slice(i + 1).toLowerCase() };
576
+ }
577
+ function handleMatchesMetadata(parsed, metadata) {
578
+ const fn = String(metadata?.friendlyName || "").toLowerCase();
579
+ if (!fn || fn !== parsed.name) return false;
580
+ if (parsed.project) {
581
+ return sanitizeSegment(metadata?.projectName || "") === parsed.project;
582
+ }
583
+ return true;
584
+ }
585
+
586
+ export { composeSessionId as a, applyInboxClear as b, computeOutboundHop as c, friendlyNameFromId as d, clearInboundContext as e, formatHandle as f, generateFriendlyName as g, handleMatchesMetadata as h, isHopCapParked as i, classifyInbound as j, consumeAwaitingReply as k, peekAwaitingReply as l, parseHandle as p, registerAwaitingReply as r, shortId as s, writeInboundContext as w };
@@ -1,27 +1,9 @@
1
- import { a4 as resolveModel, al as describeMisconfiguration, am as buildMachineDeps } from './run-LHJh7jLy.mjs';
2
- import { handleRealtimeEvent, initMachineVoiceSession } from './sideband-B5n9fNxM.mjs';
1
+ import { c as buildMachineDeps } from './machineTools-DygM1jXW.mjs';
2
+ import { r as resolveModel, d as describeMisconfiguration } from './model-CUHojegn.mjs';
3
+ import { handleRealtimeEvent, initMachineVoiceSession } from './sideband-68HhGT0i.mjs';
3
4
  import { WebSocket } from 'ws';
4
5
  import { execSync, spawn } from 'child_process';
5
- import 'os';
6
- import 'fs/promises';
7
- import 'fs';
8
- import 'path';
9
- import 'url';
10
- import 'crypto';
11
- import 'node:fs';
12
- import 'node:path';
13
- import 'node:crypto';
14
6
  import 'node:child_process';
15
- import 'util';
16
- import 'http';
17
- import 'net';
18
- import 'node:os';
19
- import 'node:events';
20
- import '@agentclientprotocol/sdk';
21
- import 'node:util';
22
- import 'node:readline';
23
- import 'node:fs/promises';
24
- import 'yaml';
25
7
 
26
8
  const PCM_RATE = 24e3;
27
9
  function buildHeadlessSessionUpdate(cfg) {