svamp-cli 0.2.167 → 0.2.169

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 (24) hide show
  1. package/bin/skills/loop/bin/stop-gate.mjs +2 -2
  2. package/dist/{agentCommands-juw5_q8v.mjs → agentCommands-DsFjNOme.mjs} +5 -5
  3. package/dist/{auth-DFU6j82G.mjs → auth-BnsFO6Ry.mjs} +1 -1
  4. package/dist/cli.mjs +61 -97
  5. package/dist/{commands-Jm-BUsrf.mjs → commands-BH_EjCPM.mjs} +2 -2
  6. package/dist/{commands-B9-jAYZy.mjs → commands-BIp-xxDy.mjs} +10 -39
  7. package/dist/{commands-C2gVT2LM.mjs → commands-D39YUhlU.mjs} +5 -5
  8. package/dist/{commands-CevXJKdi.mjs → commands-DCCaygY9.mjs} +1 -1
  9. package/dist/{commands-BYEL5DqA.mjs → commands-DJv_H3rc.mjs} +1 -1
  10. package/dist/{commands-D_Hlxfog.mjs → commands-VQJom2wo.mjs} +2 -2
  11. package/dist/{commands-yYLA6w6t.mjs → commands-hypEnMfp.mjs} +2 -119
  12. package/dist/{commands-Bb4Sr_iq.mjs → commands-mz1ZfhKj.mjs} +1 -1
  13. package/dist/{fleet-DGWqm1_M.mjs → fleet-D01NyQ31.mjs} +1 -1
  14. package/dist/{frpc-Cd9N3gGU.mjs → frpc-DyWyrIAA.mjs} +1 -1
  15. package/dist/{headlessCli-BlKUictN.mjs → headlessCli-g7q-ccAr.mjs} +2 -2
  16. package/dist/{httpServer-COU4szUc.mjs → httpServer-B9kdEU1z.mjs} +28 -0
  17. package/dist/index.mjs +1 -1
  18. package/dist/{package-CrzrTOTn.mjs → package-CTA2WTCH.mjs} +2 -2
  19. package/dist/{run-BeIP-YpD.mjs → run-DbJt6BE_.mjs} +49 -181
  20. package/dist/{run-BOdCp1Ru.mjs → run-Ld92ruLI.mjs} +1 -1
  21. package/dist/{serveCommands-BoV_jArl.mjs → serveCommands-BUPlnpAP.mjs} +5 -5
  22. package/dist/{serveManager-Do0sF4Rz.mjs → serveManager-CniGuJKe.mjs} +2 -2
  23. package/dist/{sideband-6iHsRWJX.mjs → sideband-BT55liUs.mjs} +1 -1
  24. package/package.json +2 -2
@@ -486,7 +486,7 @@ function buildTools(deps, skills) {
486
486
  {
487
487
  name: "set_checklist",
488
488
  readOnly: false,
489
- description: "Create or replace the bound session's checklist (the loop's success criteria) and start the self-verifying loop. Each item is a concrete, checkable requirement. ONLY after the caller confirmed the proposal.",
489
+ description: "Turn the caller's goals into tracked ISSUES (the backlog = the loop's success criteria) and start the self-verifying loop. Each item becomes one concrete, checkable issue (optional per-item oracle \u2192 its verify-cmd). ONLY after the caller confirmed the proposal.",
490
490
  parameters: { type: "object", properties: {
491
491
  items: { type: "array", description: "The checklist items (success criteria).", items: { type: "object", properties: {
492
492
  text: { type: "string", description: "A concrete, checkable requirement." },
@@ -503,7 +503,7 @@ function buildTools(deps, skills) {
503
503
  prompt: a?.prompt ? str$1(a.prompt) : void 0,
504
504
  maxIterations: typeof a?.max_iterations === "number" ? a.max_iterations : void 0
505
505
  });
506
- return r.ok ? `Set a ${items.length}-item checklist and started the loop.` : `Could not set the checklist: ${r.error || "unknown error"}.`;
506
+ return r.ok ? `Created ${items.length} issue(s) and started the backlog loop.` : `Could not create the issues: ${r.error || "unknown error"}.`;
507
507
  }
508
508
  },
509
509
  {
@@ -665,7 +665,7 @@ You are WISE Agent, a fast, text-mode companion to the deep coding agent (Claude
665
665
  - run_bash \u2014 run a shell command on the session's machine (when granted).
666
666
  - send_to_session \u2014 hand a clear, reformulated instruction to the deep coding agent (when granted); pass wait=true to block for its reply.
667
667
  - create_routine / create_loop / create_channel \u2014 set up a scheduled/triggered routine, a self-verifying loop, or an inbound channel for this session (when granted). ALWAYS propose first and confirm before calling these (see below).
668
- - set_checklist / stop_loop \u2014 turn the caller's goals into a tracked checklist (the loop's success criteria) and start the self-verifying loop, or stop a running loop (when granted). Each item is one concrete, checkable requirement (optional per-item oracle command). ALWAYS propose the items first and confirm before calling.
668
+ - set_checklist / stop_loop \u2014 turn the caller's goals into tracked ISSUES (the backlog = the loop's success criteria) and start the self-verifying loop, or stop a running loop (when granted). Each item becomes one concrete, checkable issue (optional per-item oracle command \u2192 its verify-cmd). ALWAYS propose the items first and confirm before calling.
669
669
 
670
670
  # Instructions
671
671
  - Answer general questions and questions about yourself directly. Use tools only to act on the machine/session.
@@ -1074,23 +1074,27 @@ function buildSessionDeps(rpc, opts = {}) {
1074
1074
  }, ctx);
1075
1075
  },
1076
1076
  async applyChecklist(items, opts2) {
1077
- const built = (items || []).filter((i) => i?.text && i.text.trim()).map((i, idx) => ({
1078
- id: `wise-${Date.now().toString(36)}-${idx}`,
1079
- text: i.text.trim(),
1080
- status: "todo",
1081
- disposition: "inline",
1082
- scope: "session",
1083
- ...i.oracle && i.oracle.trim() ? { verify: { type: "command", text: i.oracle.trim() }, oracle: i.oracle.trim() } : {}
1084
- }));
1077
+ const list = (items || []).filter((i) => i?.text && i.text.trim());
1078
+ const shq = (s) => `'${String(s).replace(/'/g, "'\\''")}'`;
1079
+ let created = 0;
1080
+ for (const i of list) {
1081
+ const oracle = i.oracle?.trim();
1082
+ const cmd = `svamp issue add --ready ${oracle ? `--verify-cmd ${shq(oracle)} ` : ""}--body ${shq(i.text.trim())}`;
1083
+ try {
1084
+ const r = normalizeBash(await rpc.bash(cmd, void 0, void 0, ctx));
1085
+ if (r.exitCode === 0) created++;
1086
+ } catch {
1087
+ }
1088
+ }
1085
1089
  await rpc.updateConfig({
1086
- checklist: built,
1087
- checklistConfig: {
1088
- ...opts2?.prompt ? { prompt: opts2.prompt } : {},
1089
- maxIterations: opts2?.maxIterations ?? 20,
1090
+ loop: {
1091
+ task: opts2?.prompt?.trim() || "Work the ready issues in this session backlog until none remain (`svamp issue list --status ready`).",
1092
+ oracle: "svamp issue pending",
1093
+ max_iterations: opts2?.maxIterations ?? 20,
1090
1094
  evaluator: true
1091
1095
  }
1092
1096
  }, ctx);
1093
- return { ok: true };
1097
+ return { ok: created > 0 || list.length === 0, ...created === 0 && list.length ? { error: "could not create issues" } : {} };
1094
1098
  },
1095
1099
  async stopLoop() {
1096
1100
  await rpc.updateConfig({ loop: null }, ctx);
@@ -1292,7 +1296,7 @@ function validateRoutine(r) {
1292
1296
  if (!a || !ACTION_KINDS.includes(a.kind)) errs.push(`action.kind must be one of ${ACTION_KINDS.join("|")}`);
1293
1297
  if (a?.kind === "message" && !a.template) errs.push("action.template required for message action");
1294
1298
  if (a?.kind === "loop" && !a.loop && !a.task_template) errs.push("action.loop or action.task_template required for loop action");
1295
- if (a?.kind === "verify" && !r.dir) errs.push("a verify (checklist watchdog) action requires a dir (the project root holding .svamp/<sid>/loop/criteria.json)");
1299
+ if (a?.kind === "verify" && !r.dir) errs.push("a verify (backlog watchdog) action requires a dir (the project root holding .svamp/issues)");
1296
1300
  if (r.overlap && !OVERLAP.includes(r.overlap)) errs.push(`overlap must be one of ${OVERLAP.join("|")}`);
1297
1301
  if (r.bind && r.bind !== "stateful" && r.bind !== "stateless") errs.push('bind must be "stateful" or "stateless"');
1298
1302
  if (r.bind === "stateless") {
@@ -2787,7 +2791,7 @@ async function registerMachineService(server, machineId, metadata, daemonState,
2787
2791
  const tunnels = handlers.tunnels;
2788
2792
  if (!tunnels) throw new Error("Tunnel management not available");
2789
2793
  if (tunnels.has(params.name)) throw new Error(`Tunnel '${params.name}' already running`);
2790
- const { FrpcTunnel } = await import('./frpc-Cd9N3gGU.mjs');
2794
+ const { FrpcTunnel } = await import('./frpc-DyWyrIAA.mjs');
2791
2795
  const tunnel = new FrpcTunnel({
2792
2796
  name: params.name,
2793
2797
  ports: params.ports,
@@ -3088,7 +3092,13 @@ async function registerMachineService(server, machineId, metadata, daemonState,
3088
3092
  wiseMeetingStatus: async (params) => {
3089
3093
  if (params?.sessionId) {
3090
3094
  const rec = activeMeetingAgents.get(params.sessionId);
3091
- return { active: !!rec, meeting: rec || null };
3095
+ let transcript = [];
3096
+ try {
3097
+ const r = await handlers.getSessionRPCHandlers?.(params.sessionId)?.getMeetingActivity?.();
3098
+ transcript = r?.activity || [];
3099
+ } catch {
3100
+ }
3101
+ return { active: !!rec, meeting: rec || null, transcript };
3092
3102
  }
3093
3103
  return { active: activeMeetingAgents.size > 0, meetings: Array.from(activeMeetingAgents.values()) };
3094
3104
  },
@@ -3228,7 +3238,7 @@ QUESTION: ${params.question || "Summarize this concisely."}` }
3228
3238
  }
3229
3239
  const deps = buildSessionDeps(rpc, { cwd, ownerEmail: owner });
3230
3240
  const sender = { name: context?.user?.email || context?.user?.id || "user", kind: "user", verified: true };
3231
- const { toolsForRole } = await import('./sideband-6iHsRWJX.mjs');
3241
+ const { toolsForRole } = await import('./sideband-BT55liUs.mjs');
3232
3242
  const r2 = await runWiseAgent({ message: params.message, sender, config: { tools: toolsForRole(role2) }, deps, transport, model: resolved.model });
3233
3243
  return fmt(r2);
3234
3244
  }
@@ -3327,7 +3337,7 @@ QUESTION: ${params.question || "Summarize this concisely."}` }
3327
3337
  if (r.error || !r.sender) return { error: r.error || "unauthorized" };
3328
3338
  const callId = "call_" + Math.random().toString(16).slice(2, 12);
3329
3339
  const rendered = renderMessage(c, { sender: r.sender, body: { message: kwargs.message }, callId });
3330
- const { queryCore } = await import('./commands-yYLA6w6t.mjs');
3340
+ const { queryCore } = await import('./commands-hypEnMfp.mjs');
3331
3341
  const timeout = c.reply?.timeout_sec || 120;
3332
3342
  let result;
3333
3343
  try {
@@ -3959,6 +3969,7 @@ function createSessionStore(server, sessionId, initialMetadata, initialAgentStat
3959
3969
  callbacks.onMetadataUpdate?.(metadata);
3960
3970
  };
3961
3971
  const channelStore = new ChannelStore(initialMetadata.path);
3972
+ const meetingActivity = [];
3962
3973
  const channelOutbox = new ChannelOutbox(initialMetadata.path);
3963
3974
  const cfg = server?.config || {};
3964
3975
  const channelsServiceId = cfg.workspace && cfg.client_id ? `${cfg.workspace}/${cfg.client_id}:channels` : void 0;
@@ -4431,6 +4442,18 @@ function createSessionStore(server, sessionId, initialMetadata, initialAgentStat
4431
4442
  return { error: e?.message || String(e) };
4432
4443
  }
4433
4444
  },
4445
+ recordMeetingActivity: async (params) => {
4446
+ const c = channelStore.get(params.channel);
4447
+ if (!c || c.enabled === false) return { error: "channel not found" };
4448
+ const r = resolveSender(c, { key: params.key, from: params.from });
4449
+ if (r.error || !r.sender) return { error: r.error || "unauthorized" };
4450
+ const text = String(params.text || "").replace(/\s+/g, " ").trim().slice(0, 1e3);
4451
+ if (!text) return { ok: true };
4452
+ meetingActivity.push({ kind: params.kind === "wise" ? "wise" : "user", text, ts: Date.now() });
4453
+ if (meetingActivity.length > 80) meetingActivity.splice(0, meetingActivity.length - 80);
4454
+ return { ok: true };
4455
+ },
4456
+ getMeetingActivity: async () => ({ activity: meetingActivity.slice(-40) }),
4434
4457
  channelDescribe: async (id) => {
4435
4458
  const c = channelStore.get(id);
4436
4459
  if (!c || c.enabled === false || c.system) return { error: "not found" };
@@ -10143,117 +10166,6 @@ class ProcessSupervisor {
10143
10166
  }
10144
10167
  }
10145
10168
 
10146
- const STATUS_TO_MARKER = {
10147
- todo: " ",
10148
- active: "~",
10149
- verifying: "*",
10150
- awaiting_review: "?",
10151
- rework: "r",
10152
- blocked: "!",
10153
- done: "x"
10154
- };
10155
- function renderCriteria(items) {
10156
- if (!items.length) return "";
10157
- const lines = items.map((it) => {
10158
- const tag = it.disposition === "delegated" ? " (delegated)" : "";
10159
- let how = "";
10160
- if (it.disposition !== "delegated" && it.eval) {
10161
- if (it.eval.type === "agent" && it.eval.prompt) how = `
10162
- \u21B3 verify: ${it.eval.prompt}`;
10163
- else if (it.eval.type === "oracle") how = `
10164
- \u21B3 verify by command (must pass): ${it.eval.cmd}`;
10165
- else if (it.eval.type === "manual") how = `
10166
- \u21B3 verify: manual sign-off`;
10167
- }
10168
- return `- [${STATUS_TO_MARKER[it.status] ?? " "}] ${it.text}${tag}${how}`;
10169
- });
10170
- const { done, total } = summarize$1(items);
10171
- return `Success criteria \u2014 drive this checklist to all-done (${done}/${total}):
10172
- ${lines.join("\n")}`;
10173
- }
10174
- function compileChecklist(items) {
10175
- const criteria = renderCriteria(items);
10176
- const oracleItem = items.find((i) => i.disposition === "inline" && i.eval?.type === "oracle");
10177
- const oracle = oracleItem && oracleItem.eval?.type === "oracle" ? oracleItem.eval.cmd : void 0;
10178
- return { criteria, ...oracle ? { oracle } : {} };
10179
- }
10180
- const VALID_STATUS = /* @__PURE__ */ new Set(["todo", "active", "verifying", "awaiting_review", "rework", "blocked", "done"]);
10181
- function validateChecklist(items) {
10182
- const errs = [];
10183
- const ids = /* @__PURE__ */ new Set();
10184
- for (const it of items) {
10185
- if (!it.id) errs.push("item missing id");
10186
- else if (ids.has(it.id)) errs.push(`duplicate item id "${it.id}"`);
10187
- else ids.add(it.id);
10188
- if (!it.text || !it.text.trim()) errs.push(`item "${it.id}" has empty text`);
10189
- if (it.disposition !== "inline" && it.disposition !== "delegated") errs.push(`item "${it.id}" bad disposition`);
10190
- if (!VALID_STATUS.has(it.status)) errs.push(`item "${it.id}" bad status "${it.status}"`);
10191
- if (it.eval?.type === "oracle" && !it.eval.cmd.trim()) errs.push(`item "${it.id}" oracle eval needs a cmd`);
10192
- }
10193
- return errs;
10194
- }
10195
- function summarize$1(items) {
10196
- const by = (s) => items.filter((i) => i.status === s).length;
10197
- const done = by("done");
10198
- return {
10199
- total: items.length,
10200
- done,
10201
- todo: by("todo"),
10202
- active: by("active"),
10203
- blocked: by("blocked"),
10204
- awaiting_review: by("awaiting_review"),
10205
- delegated: items.filter((i) => i.disposition === "delegated").length,
10206
- allDone: items.length > 0 && done === items.length
10207
- };
10208
- }
10209
- function newItem(text, opts = {}, order = 0, now = Date.now()) {
10210
- return {
10211
- id: shortId(),
10212
- text: text.trim(),
10213
- disposition: opts.disposition ?? "inline",
10214
- ...opts.eval ? { eval: opts.eval } : {},
10215
- status: "todo",
10216
- order,
10217
- createdAt: now
10218
- };
10219
- }
10220
- function checklistPath(projectRoot, sessionId) {
10221
- return join(projectRoot, ".svamp", sessionId, "loop", "criteria.json");
10222
- }
10223
- function legacyChecklistPath(projectRoot, sessionId) {
10224
- return join(projectRoot, ".svamp", sessionId, "criteria.json");
10225
- }
10226
-
10227
- function readChecklist(projectRoot, sessionId) {
10228
- let p = checklistPath(projectRoot, sessionId);
10229
- if (!existsSync(p)) {
10230
- const legacy = legacyChecklistPath(projectRoot, sessionId);
10231
- if (!existsSync(legacy)) return [];
10232
- p = legacy;
10233
- }
10234
- try {
10235
- const parsed = JSON.parse(readFileSync(p, "utf8"));
10236
- return Array.isArray(parsed?.items) ? parsed.items : [];
10237
- } catch {
10238
- return [];
10239
- }
10240
- }
10241
- function writeChecklist(projectRoot, sessionId, items) {
10242
- const p = checklistPath(projectRoot, sessionId);
10243
- mkdirSync(dirname(p), { recursive: true });
10244
- const file = { version: 1, items, updatedAt: Date.now() };
10245
- const tmp = p + ".tmp";
10246
- writeFileSync(tmp, JSON.stringify(file, null, 2));
10247
- renameSync(tmp, p);
10248
- }
10249
- function clearChecklist(projectRoot, sessionId) {
10250
- const p = checklistPath(projectRoot, sessionId);
10251
- try {
10252
- if (existsSync(p)) rmSync(p);
10253
- } catch {
10254
- }
10255
- }
10256
-
10257
10169
  const FIELD_ORDER = ["id", "title", "status", "scope", "labels", "verify", "disposition", "triaged", "branch", "session", "original", "created", "closed"];
10258
10170
  function resolveProjectRoot(start = process.cwd()) {
10259
10171
  let dir = start;
@@ -11549,51 +11461,7 @@ Or verify and finish \u2014 an independent Stop gate re-checks before you can st
11549
11461
  const { [_gateKey]: _drop, ...restPatch } = patch;
11550
11462
  patch = restPatch;
11551
11463
  }
11552
- if ("checklist" in patch) {
11553
- const raw = patch.checklist;
11554
- const items = Array.isArray(raw) ? raw : [];
11555
- const ccfg = patch.checklistConfig && typeof patch.checklistConfig === "object" ? patch.checklistConfig : {};
11556
- const generalPrompt = typeof ccfg.prompt === "string" ? ccfg.prompt.trim() : "";
11557
- if (items.length || generalPrompt) {
11558
- const errs = items.length ? validateChecklist(items) : [];
11559
- if (errs.length) {
11560
- sessionService.pushMessage({ type: "message", message: `Checklist rejected: ${errs.join("; ")}`, level: "error" }, "event");
11561
- } else {
11562
- let checklistCriteria = "";
11563
- let oracle;
11564
- if (items.length) {
11565
- writeChecklist(directory, sessionId, items);
11566
- const compiled = compileChecklist(items);
11567
- checklistCriteria = compiled.criteria;
11568
- oracle = compiled.oracle;
11569
- } else {
11570
- clearChecklist(directory, sessionId);
11571
- }
11572
- const task = generalPrompt || checklistCriteria;
11573
- const criteria = [generalPrompt, checklistCriteria].filter(Boolean).join("\n\n") || task;
11574
- const maxIterations = typeof ccfg.maxIterations === "number" ? ccfg.maxIterations : typeof ccfg.max_iterations === "number" ? ccfg.max_iterations : 20;
11575
- const evaluator = ccfg.evaluator !== false;
11576
- const budget = parseLoopBudget(ccfg.budget);
11577
- const ok = initLoop(directory, { task, criteria, oracle, maxIterations, evaluator, budget, sessionId });
11578
- const s = summarize$1(items);
11579
- if (ok) {
11580
- const idle = getMetadata().lifecycleState === "idle";
11581
- if (idle) {
11582
- const q = getMetadata().messageQueue || [];
11583
- const nudge = items.length ? `Your goal checklist was updated (${s.done}/${s.total} done). Work the open items in order; an independent Stop gate re-checks the criteria before you can stop.` : `Your loop goal was set. Work toward it; an independent Stop gate re-checks the criteria before you can stop.`;
11584
- setMetadata((m) => ({ ...m, messageQueue: [...q, { id: randomUUID$1(), text: nudge, displayText: items.length ? `\u{1F4CB} Checklist updated` : `\u{1F501} Loop goal set`, createdAt: Date.now() }] }));
11585
- onLoopActivated?.();
11586
- }
11587
- const msg = items.length ? `\u{1F4CB} Checklist set \u2014 ${s.total} item${s.total === 1 ? "" : "s"} (${s.delegated} delegated), ${s.done} done.` : `\u{1F501} Loop goal set.`;
11588
- sessionService.pushMessage({ type: "message", message: msg }, "event");
11589
- logger.log(`[svampConfig] Checklist set (${s.total} items, ${s.delegated} delegated, prompt=${generalPrompt ? "yes" : "no"})`);
11590
- }
11591
- }
11592
- } else {
11593
- clearChecklist(directory, sessionId);
11594
- deactivateLoop(directory, sessionId);
11595
- sessionService.pushMessage({ type: "message", message: "Checklist cleared." }, "event");
11596
- }
11464
+ if ("checklist" in patch || "checklistConfig" in patch) {
11597
11465
  const { checklist: _c, checklistConfig: _cc, ...restPatch } = patch;
11598
11466
  patch = restPatch;
11599
11467
  }
@@ -12025,7 +11893,7 @@ async function startDaemon(options) {
12025
11893
  saveExposedTunnels(list);
12026
11894
  }
12027
11895
  async function createExposedTunnel(spec) {
12028
- const { FrpcTunnel } = await import('./frpc-Cd9N3gGU.mjs');
11896
+ const { FrpcTunnel } = await import('./frpc-DyWyrIAA.mjs');
12029
11897
  const tunnel = new FrpcTunnel({
12030
11898
  name: spec.name,
12031
11899
  ports: spec.ports,
@@ -12045,7 +11913,7 @@ async function startDaemon(options) {
12045
11913
  return tunnel;
12046
11914
  }
12047
11915
  const tunnelRecreateState = /* @__PURE__ */ new Map();
12048
- const { ServeManager } = await import('./serveManager-Do0sF4Rz.mjs');
11916
+ const { ServeManager } = await import('./serveManager-CniGuJKe.mjs');
12049
11917
  const serveManager = new ServeManager(SVAMP_HOME, (msg) => logger.log(`[SERVE] ${msg}`), hyphaServerUrl);
12050
11918
  ensureAutoInstalledSkills(logger).catch(() => {
12051
11919
  });
@@ -14828,7 +14696,7 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
14828
14696
  const channelHttpPort = Number(process.env.SVAMP_CHANNEL_HTTP_PORT) || 0;
14829
14697
  if (channelHttpPort > 0) {
14830
14698
  try {
14831
- const { createChannelHttpServer } = await import('./httpServer-COU4szUc.mjs');
14699
+ const { createChannelHttpServer } = await import('./httpServer-B9kdEU1z.mjs');
14832
14700
  const channelHttpServer = createChannelHttpServer({
14833
14701
  getSessionIds: () => {
14834
14702
  const ids = [];
@@ -15653,4 +15521,4 @@ var run = /*#__PURE__*/Object.freeze({
15653
15521
  writeStopMarker: writeStopMarker
15654
15522
  });
15655
15523
 
15656
- export { buildMachineShareUrl as $, getSkillsCollectionName as A, fetchWithTimeout as B, searchSkills as C, SKILLS_DIR as D, getSkillInfo as E, downloadSkillFile as F, listSkillFiles as G, loadMachineContext as H, buildMachineInstructions as I, machineToolsForRole as J, buildMachineTools as K, resolveModel as L, readChecklist as M, compileChecklist as N, RoutineStore as O, RoutineRunner as P, formatHandle as Q, READ_ONLY_TOOLS as R, ServeAuth as S, normalizeAllowedUser as T, loadSecurityContextConfig as U, resolveSecurityContext as V, buildSecurityContextFromFlags as W, mergeSecurityContexts as X, buildSessionShareUrl as Y, validateChecklist as Z, computeOutboundHop as _, createSessionStore as a, summarize$1 as a0, newItem as a1, parseHandle as a2, handleMatchesMetadata as a3, describeMisconfiguration as a4, buildMachineDeps as a5, composeSessionId as a6, generateFriendlyName as a7, generateHookSettings as a8, projectInfo as a9, DefaultTransport$1 as aa, acpBackend as ab, acpAgentConfig as ac, codexMcpBackend as ad, GeminiTransport$1 as ae, claudeAuth as af, instanceConfig as ag, api as ah, run as ai, stopDaemon as b, connectToHypha as c, daemonStatus as d, clearStopMarker as e, stopMarkerExists as f, getHyphaServerUrl$1 as g, getFrpsSubdomainHost as h, getFrpsServerPort as i, getFrpsServerAddr as j, getHyphaServerUrl as k, hasCookieToken as l, resolveProjectRoot as m, searchIssues as n, listIssues as o, addComment as p, getIssue as q, registerMachineService as r, startDaemon as s, summarize as t, updateIssue as u, addIssue as v, shortId as w, parseFrontmatter as x, getSkillsServer as y, getSkillsWorkspaceName as z };
15524
+ export { describeMisconfiguration as $, getSkillsWorkspaceName as A, getSkillsCollectionName as B, fetchWithTimeout as C, searchSkills as D, SKILLS_DIR as E, getSkillInfo as F, downloadSkillFile as G, listSkillFiles as H, READ_ONLY_TOOLS as I, loadMachineContext as J, buildMachineInstructions as K, machineToolsForRole as L, buildMachineTools as M, resolveModel as N, formatHandle as O, normalizeAllowedUser as P, loadSecurityContextConfig as Q, RoutineStore as R, ServeAuth as S, resolveSecurityContext as T, buildSecurityContextFromFlags as U, mergeSecurityContexts as V, buildSessionShareUrl as W, computeOutboundHop as X, buildMachineShareUrl as Y, parseHandle as Z, handleMatchesMetadata as _, createSessionStore as a, buildMachineDeps as a0, composeSessionId as a1, generateFriendlyName as a2, generateHookSettings as a3, projectInfo as a4, DefaultTransport$1 as a5, acpBackend as a6, acpAgentConfig as a7, codexMcpBackend as a8, GeminiTransport$1 as a9, claudeAuth as aa, instanceConfig as ab, api as ac, run as ad, stopDaemon as b, connectToHypha as c, daemonStatus as d, clearStopMarker as e, stopMarkerExists as f, getHyphaServerUrl$1 as g, getFrpsSubdomainHost as h, getFrpsServerPort as i, getFrpsServerAddr as j, getHyphaServerUrl as k, hasCookieToken as l, resolveProjectRoot as m, searchIssues as n, listIssues as o, addComment as p, getIssue as q, registerMachineService as r, startDaemon as s, summarize as t, updateIssue as u, addIssue as v, RoutineRunner as w, shortId as x, parseFrontmatter as y, getSkillsServer as z };
@@ -1,4 +1,4 @@
1
- import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(import.meta.url);import { a6 as composeSessionId, a7 as generateFriendlyName, c as connectToHypha, a as createSessionStore, r as registerMachineService, a8 as generateHookSettings } from './run-BeIP-YpD.mjs';
1
+ import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(import.meta.url);import { a1 as composeSessionId, a2 as generateFriendlyName, c as connectToHypha, a as createSessionStore, r as registerMachineService, a3 as generateHookSettings } from './run-DbJt6BE_.mjs';
2
2
  import os from 'node:os';
3
3
  import { resolve, join } from 'node:path';
4
4
  import { existsSync, readFileSync, watch } from 'node:fs';
@@ -54,7 +54,7 @@ async function handleServeCommand() {
54
54
  }
55
55
  }
56
56
  async function serveAdd(args, machineId) {
57
- const { connectAndGetMachine } = await import('./commands-yYLA6w6t.mjs');
57
+ const { connectAndGetMachine } = await import('./commands-hypEnMfp.mjs');
58
58
  const pos = positionalArgs(args);
59
59
  const name = pos[0];
60
60
  if (!name) {
@@ -93,7 +93,7 @@ async function serveAdd(args, machineId) {
93
93
  }
94
94
  }
95
95
  async function serveApply(args, machineId) {
96
- const { connectAndGetMachine } = await import('./commands-yYLA6w6t.mjs');
96
+ const { connectAndGetMachine } = await import('./commands-hypEnMfp.mjs');
97
97
  const fs = await import('fs');
98
98
  const yaml = await import('yaml');
99
99
  const file = positionalArgs(args)[0];
@@ -182,7 +182,7 @@ async function serveApply(args, machineId) {
182
182
  }
183
183
  }
184
184
  async function serveRemove(args, machineId) {
185
- const { connectAndGetMachine } = await import('./commands-yYLA6w6t.mjs');
185
+ const { connectAndGetMachine } = await import('./commands-hypEnMfp.mjs');
186
186
  const pos = positionalArgs(args);
187
187
  const name = pos[0];
188
188
  if (!name) {
@@ -202,7 +202,7 @@ async function serveRemove(args, machineId) {
202
202
  }
203
203
  }
204
204
  async function serveList(args, machineId) {
205
- const { connectAndGetMachine } = await import('./commands-yYLA6w6t.mjs');
205
+ const { connectAndGetMachine } = await import('./commands-hypEnMfp.mjs');
206
206
  const all = hasFlag(args, "--all", "-a");
207
207
  const json = hasFlag(args, "--json");
208
208
  const sessionId = getFlag(args, "--session");
@@ -235,7 +235,7 @@ async function serveList(args, machineId) {
235
235
  }
236
236
  }
237
237
  async function serveInfo(machineId) {
238
- const { connectAndGetMachine } = await import('./commands-yYLA6w6t.mjs');
238
+ const { connectAndGetMachine } = await import('./commands-hypEnMfp.mjs');
239
239
  const { machine, server } = await connectAndGetMachine(machineId);
240
240
  try {
241
241
  const info = await machine.serveInfo();
@@ -4,7 +4,7 @@ import * as fs from 'fs';
4
4
  import * as http from 'http';
5
5
  import * as net from 'net';
6
6
  import * as path from 'path';
7
- import { k as getHyphaServerUrl, S as ServeAuth, l as hasCookieToken } from './run-BeIP-YpD.mjs';
7
+ import { k as getHyphaServerUrl, S as ServeAuth, l as hasCookieToken } from './run-DbJt6BE_.mjs';
8
8
  import 'os';
9
9
  import 'fs/promises';
10
10
  import 'url';
@@ -733,7 +733,7 @@ class ServeManager {
733
733
  const mount = this.mounts.get(mountName);
734
734
  const subdomainOverride = mount?.access === "link" && mount.linkToken ? /* @__PURE__ */ new Map([[this.port, buildLinkSubdomain(subdomainSafe, mount.linkToken)]]) : void 0;
735
735
  try {
736
- const { FrpcTunnel } = await import('./frpc-Cd9N3gGU.mjs');
736
+ const { FrpcTunnel } = await import('./frpc-DyWyrIAA.mjs');
737
737
  let tunnel;
738
738
  tunnel = new FrpcTunnel({
739
739
  name: tunnelName,
@@ -1,4 +1,4 @@
1
- import { R as READ_ONLY_TOOLS, H as loadMachineContext, I as buildMachineInstructions, J as machineToolsForRole, K as buildMachineTools } from './run-BeIP-YpD.mjs';
1
+ import { I as READ_ONLY_TOOLS, J as loadMachineContext, K as buildMachineInstructions, L as machineToolsForRole, M as buildMachineTools } from './run-DbJt6BE_.mjs';
2
2
  import 'node:child_process';
3
3
  import 'os';
4
4
  import 'fs/promises';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "svamp-cli",
3
- "version": "0.2.167",
3
+ "version": "0.2.169",
4
4
  "description": "Svamp CLI — AI workspace daemon on Hypha Cloud",
5
5
  "author": "Amun AI AB",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -20,7 +20,7 @@
20
20
  "scripts": {
21
21
  "build": "rm -rf dist bin/skills && mkdir -p bin/skills && cp -r ../../skills/artifact bin/skills/artifact && cp -r ../../skills/loop bin/skills/loop && cp -r ../../skills/crew bin/skills/crew && tsc --noEmit && pkgroll",
22
22
  "typecheck": "tsc --noEmit",
23
- "test": "npx tsx test/test-context-window.mjs && npx tsx test/test-ratelimit-retry.mjs && npx tsx test/test-instance-config.mjs && npx tsx test/test-authorize.mjs && npx tsx test/test-normalize-allowed-user.mjs && npx tsx test/test-share-url.mjs && npx tsx test/test-update-sharing-normalization.mjs && npx tsx test/test-staged-homes-sweep.mjs && npx tsx test/test-session-helpers.mjs && npx tsx test/test-cli-routing.mjs && npx tsx test/test-security-context.mjs && npx tsx test/test-isolation-decision.mjs && npx tsx test/test-loop-activation.mjs && npx tsx test/test-message-helpers.mjs && npx tsx test/test-agent-config.mjs && npx tsx test/test-wrap-command.mjs && npx tsx test/test-credential-staging.mjs && npx tsx test/test-claude-auth.mjs && npx tsx test/test-output-formatters.mjs && npx tsx test/test-inbox-guard.mjs && npx tsx test/test-auto-topic.mjs && npx tsx test/test-project-info.mjs && npx tsx test/test-agent-types.mjs && npx tsx test/test-transport.mjs && npx tsx test/test-session-update-handlers.mjs && npx tsx test/test-session-scanner.mjs && npx tsx test/test-hypha-client.mjs && npx tsx test/test-hook-settings.mjs && npx tsx test/test-session-service-logic.mjs && npx tsx test/test-daemon-persistence.mjs && npx tsx test/test-detect-isolation.mjs && npx tsx test/test-machine-service-logic.mjs && npx tsx test/test-interactive-helpers.mjs && npx tsx test/test-codex-backend.mjs && npx tsx test/test-acp-backend.mjs && npx tsx test/test-acp-bridge.mjs && npx tsx test/test-hook-server.mjs && npx tsx test/test-session-commands.mjs && npx tsx test/test-interactive-console.mjs && npx tsx test/test-session-messages.mjs && npx tsx test/test-session-send-query.mjs && npx tsx test/test-skills.mjs && npx tsx test/test-agent-grouping.mjs && npx tsx test/test-machine-list-directory.mjs && npx tsx test/test-service-commands.mjs && npx tsx test/test-supervisor.mjs && npx tsx test/test-supervisor-lock.mjs && node test/test-supervisor-restart.mjs && npx tsx test/test-clear-detection.mjs && npx tsx test/test-session-consolidation.mjs && npx tsx test/test-inbox.mjs && npx tsx test/test-inbox-cross-machine.mjs && npx tsx test/test-checklist.mjs && npx tsx test/test-checklist-cli.mjs && npx tsx test/test-issue-store.mjs && npx tsx test/test-issue-close-gate.mjs && npx tsx test/test-workflow-store.mjs && npx tsx test/test-serve-link-subdomain.mjs && npx tsx test/test-short-id.mjs && npx tsx test/test-transcript-edit.mjs && npx tsx test/test-edit-history.mjs && npx tsx test/test-friendly-name.mjs && npx tsx test/test-session-rpc-dispatch.mjs && npx tsx test/test-sandbox-cli.mjs && npx tsx test/test-serve-manager.mjs && npx tsx test/test-serve-stability.mjs && npx tsx test/test-frpc-e2e.mjs --unit-only && npx tsx test/test-frpc-status.mjs && node test/pinnedClaudeCode.test.mjs && node test/fleet.test.mjs && npx tsx test/test-routine.mjs && npx tsx test/test-routine-rpc.mjs && npx tsx test/test-checklist-watchdog.mjs && npx tsx test/test-session-file.mjs && npx tsx test/test-channel-rpc.mjs && npx tsx test/test-wise-agent.mjs && npx tsx test/test-channel-agent.mjs && npx tsx test/test-channels-service.mjs && npx tsx test/test-channel-async-reply.mjs && npx tsx test/test-channel-binding.mjs && npx tsx test/test-channel-identity.mjs && npx tsx test/test-shared-session-identity.mjs && npx tsx test/test-wise-agent-auth.mjs && npx tsx test/test-channel-http.mjs && npx tsx test/test-wise-voice.mjs && npx tsx test/test-wise-headless.mjs && npx tsx test/test-wise-machine.mjs && npx tsx test/test-crew-merge.mjs && npx tsx test/test-crew-verdict-routing.mjs",
23
+ "test": "npx tsx test/test-context-window.mjs && npx tsx test/test-ratelimit-retry.mjs && npx tsx test/test-instance-config.mjs && npx tsx test/test-authorize.mjs && npx tsx test/test-normalize-allowed-user.mjs && npx tsx test/test-share-url.mjs && npx tsx test/test-update-sharing-normalization.mjs && npx tsx test/test-staged-homes-sweep.mjs && npx tsx test/test-session-helpers.mjs && npx tsx test/test-cli-routing.mjs && npx tsx test/test-security-context.mjs && npx tsx test/test-isolation-decision.mjs && npx tsx test/test-loop-activation.mjs && npx tsx test/test-message-helpers.mjs && npx tsx test/test-agent-config.mjs && npx tsx test/test-wrap-command.mjs && npx tsx test/test-credential-staging.mjs && npx tsx test/test-claude-auth.mjs && npx tsx test/test-output-formatters.mjs && npx tsx test/test-inbox-guard.mjs && npx tsx test/test-auto-topic.mjs && npx tsx test/test-project-info.mjs && npx tsx test/test-agent-types.mjs && npx tsx test/test-transport.mjs && npx tsx test/test-session-update-handlers.mjs && npx tsx test/test-session-scanner.mjs && npx tsx test/test-hypha-client.mjs && npx tsx test/test-hook-settings.mjs && npx tsx test/test-session-service-logic.mjs && npx tsx test/test-daemon-persistence.mjs && npx tsx test/test-detect-isolation.mjs && npx tsx test/test-machine-service-logic.mjs && npx tsx test/test-interactive-helpers.mjs && npx tsx test/test-codex-backend.mjs && npx tsx test/test-acp-backend.mjs && npx tsx test/test-acp-bridge.mjs && npx tsx test/test-hook-server.mjs && npx tsx test/test-session-commands.mjs && npx tsx test/test-interactive-console.mjs && npx tsx test/test-session-messages.mjs && npx tsx test/test-session-send-query.mjs && npx tsx test/test-skills.mjs && npx tsx test/test-agent-grouping.mjs && npx tsx test/test-machine-list-directory.mjs && npx tsx test/test-service-commands.mjs && npx tsx test/test-supervisor.mjs && npx tsx test/test-supervisor-lock.mjs && node test/test-supervisor-restart.mjs && npx tsx test/test-clear-detection.mjs && npx tsx test/test-session-consolidation.mjs && npx tsx test/test-inbox.mjs && npx tsx test/test-inbox-cross-machine.mjs && npx tsx test/test-issue-store.mjs && npx tsx test/test-issue-close-gate.mjs && npx tsx test/test-workflow-store.mjs && npx tsx test/test-serve-link-subdomain.mjs && npx tsx test/test-short-id.mjs && npx tsx test/test-transcript-edit.mjs && npx tsx test/test-edit-history.mjs && npx tsx test/test-friendly-name.mjs && npx tsx test/test-session-rpc-dispatch.mjs && npx tsx test/test-sandbox-cli.mjs && npx tsx test/test-serve-manager.mjs && npx tsx test/test-serve-stability.mjs && npx tsx test/test-frpc-e2e.mjs --unit-only && npx tsx test/test-frpc-status.mjs && node test/pinnedClaudeCode.test.mjs && node test/fleet.test.mjs && npx tsx test/test-routine.mjs && npx tsx test/test-routine-rpc.mjs && npx tsx test/test-session-file.mjs && npx tsx test/test-channel-rpc.mjs && npx tsx test/test-wise-agent.mjs && npx tsx test/test-channel-agent.mjs && npx tsx test/test-channels-service.mjs && npx tsx test/test-channel-async-reply.mjs && npx tsx test/test-channel-binding.mjs && npx tsx test/test-channel-identity.mjs && npx tsx test/test-shared-session-identity.mjs && npx tsx test/test-wise-agent-auth.mjs && npx tsx test/test-channel-http.mjs && npx tsx test/test-wise-voice.mjs && npx tsx test/test-wise-headless.mjs && npx tsx test/test-wise-machine.mjs && npx tsx test/test-crew-merge.mjs && npx tsx test/test-crew-verdict-routing.mjs",
24
24
  "test:hypha": "node --no-warnings test/test-hypha-service.mjs",
25
25
  "dev": "tsx src/cli.ts",
26
26
  "dev:daemon": "tsx src/cli.ts daemon start-sync",