svamp-cli 0.2.272 → 0.2.274

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 (26) hide show
  1. package/dist/{agentCommands-Bpx4k5-9.mjs → agentCommands-iom4Qnpt.mjs} +5 -5
  2. package/dist/{auth-6i4iqmQ6.mjs → auth-C5eN8Hte.mjs} +1 -1
  3. package/dist/{cli-D_rlz1U0.mjs → cli-P3Tx1nrm.mjs} +63 -63
  4. package/dist/cli.mjs +2 -2
  5. package/dist/{commands-Coa5AUr5.mjs → commands-B6LByF-g.mjs} +1 -1
  6. package/dist/{commands-DN-ZJc3M.mjs → commands-C7J1hEg3.mjs} +2 -2
  7. package/dist/{commands-C2zF5GQ2.mjs → commands-CKhDT3cQ.mjs} +41 -18
  8. package/dist/{commands-DZvhiRGC.mjs → commands-CQHlltkU.mjs} +2 -2
  9. package/dist/{commands-CginH27R.mjs → commands-CgrbLgCc.mjs} +1 -1
  10. package/dist/{commands-D1H-lJoD.mjs → commands-D606feNR.mjs} +4 -4
  11. package/dist/{commands-jx07BOIK.mjs → commands-VvErX3uk.mjs} +11 -9
  12. package/dist/{fleet-g2e67_Yp.mjs → fleet-B1PDO1l8.mjs} +2 -2
  13. package/dist/{frpc-DosdqHuk.mjs → frpc-Dzhtizmd.mjs} +73 -32
  14. package/dist/{headlessCli-DHJyqLIl.mjs → headlessCli-1WzEZVMV.mjs} +2 -2
  15. package/dist/index.mjs +1 -1
  16. package/dist/package-BYElq4R_.mjs +64 -0
  17. package/dist/{pinnedClaudeCode-B9O-hKxm.mjs → pinnedClaudeCode-CgEtGkX2.mjs} +1 -1
  18. package/dist/{rpc-CbFNQklQ.mjs → rpc-BMoQLUTg.mjs} +1 -1
  19. package/dist/{rpc-9Zy0N3ge.mjs → rpc-CIs3wZAu.mjs} +1 -1
  20. package/dist/{run-BD6NkC4f.mjs → run-DxoIx34n.mjs} +1 -1
  21. package/dist/{run-DPUt9qXV.mjs → run-l_8UB-9h.mjs} +154 -22
  22. package/dist/{scheduler-9E9vo0X7.mjs → scheduler-uZ__o3N7.mjs} +1 -1
  23. package/dist/{serveCommands-DwjBIACz.mjs → serveCommands-twuwB_gw.mjs} +5 -5
  24. package/dist/{sideband-D-t-OX0C.mjs → sideband-C8myzP2c.mjs} +1 -1
  25. package/package.json +2 -2
  26. package/dist/package-BIPODvcD.mjs +0 -64
@@ -1390,9 +1390,15 @@ function serveStaticMount(req, res, opts) {
1390
1390
  return;
1391
1391
  }
1392
1392
  const indexPath = realContainedPath(rootDir, path.join(target, "index.html"));
1393
- if (indexPath && fs.statSync(indexPath).isFile()) {
1394
- sendFile(req, res, indexPath, fs.statSync(indexPath));
1395
- return;
1393
+ if (indexPath) {
1394
+ try {
1395
+ const ist = fs.statSync(indexPath);
1396
+ if (ist.isFile()) {
1397
+ sendFile(req, res, indexPath, ist);
1398
+ return;
1399
+ }
1400
+ } catch {
1401
+ }
1396
1402
  }
1397
1403
  if (!browse) {
1398
1404
  res.writeHead(403, { ...CORS, "Content-Type": "text/plain" });
@@ -2896,7 +2902,7 @@ Connection: close\r
2896
2902
  const mount = this.mounts.get(mountName);
2897
2903
  const subdomainOverride = mount?.access === "link" && mount.linkToken ? /* @__PURE__ */ new Map([[this.port, buildLinkSubdomain(subdomainSafe, mount.linkToken)]]) : void 0;
2898
2904
  try {
2899
- const { FrpcTunnel } = await import('./frpc-DosdqHuk.mjs');
2905
+ const { FrpcTunnel } = await import('./frpc-Dzhtizmd.mjs');
2900
2906
  let tunnel;
2901
2907
  tunnel = new FrpcTunnel({
2902
2908
  name: tunnelName,
@@ -5698,7 +5704,7 @@ async function registerMachineService(server, machineId, metadata, daemonState,
5698
5704
  const tunnels = handlers.tunnels;
5699
5705
  if (!tunnels) throw new Error("Tunnel management not available");
5700
5706
  if (tunnels.has(params.name)) throw new Error(`Tunnel '${params.name}' already running`);
5701
- const { FrpcTunnel } = await import('./frpc-DosdqHuk.mjs');
5707
+ const { FrpcTunnel } = await import('./frpc-Dzhtizmd.mjs');
5702
5708
  const tunnel = new FrpcTunnel({
5703
5709
  name: params.name,
5704
5710
  ports: params.ports,
@@ -6172,7 +6178,7 @@ QUESTION: ${params.question || "Summarize this concisely."}` }
6172
6178
  }
6173
6179
  const deps = buildSessionDeps(rpc, { cwd, ownerEmail: owner });
6174
6180
  const sender = { name: context?.user?.email || context?.user?.id || "user", kind: "user", verified: true };
6175
- const { toolsForRole } = await import('./sideband-D-t-OX0C.mjs');
6181
+ const { toolsForRole } = await import('./sideband-C8myzP2c.mjs');
6176
6182
  const r2 = await runWiseAgent({ message: params.message, sender, config: { tools: toolsForRole(role2) }, deps, transport, model: resolved.model });
6177
6183
  return fmt(r2);
6178
6184
  }
@@ -6271,7 +6277,7 @@ QUESTION: ${params.question || "Summarize this concisely."}` }
6271
6277
  if (r.error || !r.sender) return { error: r.error || "unauthorized" };
6272
6278
  const callId = "call_" + Math.random().toString(16).slice(2, 12);
6273
6279
  const rendered = renderMessage(c, { sender: r.sender, body: { message: kwargs.message }, callId });
6274
- const { queryCore } = await import('./commands-D1H-lJoD.mjs');
6280
+ const { queryCore } = await import('./commands-D606feNR.mjs');
6275
6281
  const timeout = c.reply?.timeout_sec || 120;
6276
6282
  let result;
6277
6283
  try {
@@ -6637,6 +6643,12 @@ function classifyInbound(message, now = Date.now(), opts) {
6637
6643
  const tripped = recordWake(now);
6638
6644
  return { action: "wake", reason: "urgent", breakerTripped: tripped };
6639
6645
  }
6646
+ function isHopCapParked(message, opts) {
6647
+ const hop = message.hopCount ?? 0;
6648
+ const human = senderIsHuman(message);
6649
+ const self = false;
6650
+ return !human && !self && !message.channel && hop > MAX_AGENT_HOPS;
6651
+ }
6640
6652
  function applyInboxClear(inbox, opts) {
6641
6653
  let kept;
6642
6654
  if (opts?.messageId) kept = inbox.filter((m) => m.messageId !== opts.messageId);
@@ -6670,6 +6682,9 @@ function saveInbox(projectDir, sessionId, inbox) {
6670
6682
  } catch {
6671
6683
  }
6672
6684
  }
6685
+ function isPending(m) {
6686
+ return !m.handled && !m.read;
6687
+ }
6673
6688
 
6674
6689
  function envInt(name, fallback) {
6675
6690
  const raw = process.env[name];
@@ -7654,10 +7669,13 @@ function createSessionStore(server, sessionId, initialMetadata, initialAgentStat
7654
7669
  },
7655
7670
  // Agent/owner answers a queued (async) channel message → channel outbox, addressed
7656
7671
  // to the original external caller. Routed here by `inbox reply` for channel-origin
7657
- // inbox messages (which carry channelId + correlationId + from). Owner-gated since
7658
- // it's the session speaking on its own behalf.
7672
+ // inbox messages (which carry channelId + correlationId + from). #0466: owner-gated
7673
+ // (admin tier — the highest shared role; owner + same-owner-workspace still pass
7674
+ // above) since this speaks AS the session to EXTERNAL parties, recorded verified:true.
7675
+ // A mere interact-tier collaborator must not be able to emit outbound replies as the
7676
+ // session — that would be attribution spoofing to third parties.
7659
7677
  channelReply: async (params, context) => {
7660
- authorizeRequest(context, metadata.sharing, "interact");
7678
+ authorizeRequest(context, metadata.sharing, "admin");
7661
7679
  const c = channelStore.get(params.channel);
7662
7680
  if (!c) return { ok: false, error: "channel not found" };
7663
7681
  if (!params.to || !params.body) return { ok: false, error: "to and body are required" };
@@ -11834,6 +11852,26 @@ function transcriptSessionIdMatches(file, expectedSessionId) {
11834
11852
  }
11835
11853
 
11836
11854
  const execFileAsync = promisify$1(execFile$1);
11855
+ const VERIFY_HARD_TIMEOUT_MS = 2e4;
11856
+ async function verifyWithHardTimeout(method, binaryPath, timeoutMs = VERIFY_HARD_TIMEOUT_MS) {
11857
+ let timer;
11858
+ try {
11859
+ return await Promise.race([
11860
+ verifyIsolation(method, binaryPath),
11861
+ new Promise((resolve) => {
11862
+ timer = setTimeout(
11863
+ () => resolve({
11864
+ passed: false,
11865
+ error: `verification timed out after ${timeoutMs}ms (runtime unresponsive)`
11866
+ }),
11867
+ timeoutMs
11868
+ );
11869
+ })
11870
+ ]);
11871
+ } finally {
11872
+ if (timer) clearTimeout(timer);
11873
+ }
11874
+ }
11837
11875
  const SVAMP_TOOLS_DIR = join$1(homedir$1(), ".svamp", "tools");
11838
11876
  const SVAMP_BIN_DIR = join$1(SVAMP_TOOLS_DIR, "bin");
11839
11877
  async function checkCommand(command, versionArgs) {
@@ -12007,7 +12045,7 @@ async function verifyNonoIsolation(binaryPath) {
12007
12045
  }
12008
12046
  async function verifyContainerIsolation(method, binaryPath) {
12009
12047
  try {
12010
- await execFileAsync(binaryPath, ["info"], { timeout: 15e3 });
12048
+ await execFileAsync(binaryPath, ["info"], { timeout: 15e3, killSignal: "SIGKILL" });
12011
12049
  } catch (e) {
12012
12050
  return { passed: false, error: `${method} daemon not accessible: ${e.message}` };
12013
12051
  }
@@ -12015,7 +12053,7 @@ async function verifyContainerIsolation(method, binaryPath) {
12015
12053
  const { stdout } = await execFileAsync(
12016
12054
  binaryPath,
12017
12055
  ["run", "--rm", "--network=none", "alpine", "echo", "isolation-ok"],
12018
- { timeout: 3e4 }
12056
+ { timeout: 3e4, killSignal: "SIGKILL" }
12019
12057
  );
12020
12058
  if (!stdout.includes("isolation-ok")) {
12021
12059
  return { passed: false, error: `container test returned unexpected output: ${stdout.trim()}` };
@@ -12069,7 +12107,7 @@ async function detectIsolationCapabilities() {
12069
12107
  await Promise.all(
12070
12108
  foundMethods.map(async (method) => {
12071
12109
  const binaryPath = details[method].path || method;
12072
- const result = await verifyIsolation(method, binaryPath);
12110
+ const result = await verifyWithHardTimeout(method, binaryPath);
12073
12111
  details[method].verified = result.passed;
12074
12112
  if (!result.passed) {
12075
12113
  details[method].verificationError = result.error;
@@ -15919,7 +15957,7 @@ async function startDaemon(options) {
15919
15957
  try {
15920
15958
  const dir = loadSessionIndex()[sessionId]?.directory;
15921
15959
  if (!dir) return;
15922
- const { reconcileServiceLinks } = await import('./agentCommands-Bpx4k5-9.mjs');
15960
+ const { reconcileServiceLinks } = await import('./agentCommands-iom4Qnpt.mjs');
15923
15961
  const configPath = getSvampConfigPath(dir, sessionId);
15924
15962
  const config = readSvampConfig(configPath);
15925
15963
  const entries = Array.from(urls.entries());
@@ -15937,7 +15975,7 @@ async function startDaemon(options) {
15937
15975
  }
15938
15976
  }
15939
15977
  async function createExposedTunnel(spec) {
15940
- const { FrpcTunnel } = await import('./frpc-DosdqHuk.mjs');
15978
+ const { FrpcTunnel } = await import('./frpc-Dzhtizmd.mjs');
15941
15979
  const tunnel = new FrpcTunnel({
15942
15980
  name: spec.name,
15943
15981
  ports: spec.ports,
@@ -15965,7 +16003,7 @@ async function startDaemon(options) {
15965
16003
  ensureAutoInstalledCommands(logger);
15966
16004
  (async () => {
15967
16005
  try {
15968
- const { beginClaudeVersionReconcile } = await import('./pinnedClaudeCode-B9O-hKxm.mjs');
16006
+ const { beginClaudeVersionReconcile } = await import('./pinnedClaudeCode-CgEtGkX2.mjs');
15969
16007
  beginClaudeVersionReconcile((msg) => logger.log(msg));
15970
16008
  } catch (e) {
15971
16009
  logger.log(`[claude-version] check failed: ${e?.message || e}`);
@@ -18127,11 +18165,11 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
18127
18165
  });
18128
18166
  },
18129
18167
  onIssue: async (params) => {
18130
- const { issueRpc } = await import('./rpc-9Zy0N3ge.mjs');
18168
+ const { issueRpc } = await import('./rpc-CIs3wZAu.mjs');
18131
18169
  return issueRpc(params?.cwd || directory, params || {}, { notifySession: notifyIssueOwner, rekickLoopOwner });
18132
18170
  },
18133
18171
  onWorkflow: async (params) => {
18134
- const { workflowRpc } = await import('./rpc-CbFNQklQ.mjs');
18172
+ const { workflowRpc } = await import('./rpc-BMoQLUTg.mjs');
18135
18173
  return workflowRpc(params?.cwd || directory, params || {});
18136
18174
  },
18137
18175
  onRipgrep: async (args, cwd) => {
@@ -18348,6 +18386,47 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
18348
18386
  sessionMetadata = { ...sessionMetadata, lifecycleState: "idle" };
18349
18387
  sessionService.updateMetadata(sessionMetadata);
18350
18388
  logger.log(`Session ${sessionId} registered on Hypha, waiting for first message to spawn Claude`);
18389
+ const inboxReconcileMs = Number(process.env.SVAMP_INBOX_RECONCILE_MS);
18390
+ const INBOX_RECONCILE_INTERVAL_MS = Number.isFinite(inboxReconcileMs) && inboxReconcileMs >= 0 ? inboxReconcileMs : 15e3;
18391
+ let inboxReconcileTimer = null;
18392
+ const reconcileIdleInbox = () => {
18393
+ if (trackedSession.stopped) {
18394
+ if (inboxReconcileTimer) clearInterval(inboxReconcileTimer);
18395
+ return;
18396
+ }
18397
+ if (sessionWasProcessing) return;
18398
+ if (isKillingClaude || isRestartingClaude || isSwitchingMode) return;
18399
+ const queue = sessionMetadata.messageQueue;
18400
+ if (queue && queue.length > 0) {
18401
+ processMessageQueueRef?.();
18402
+ return;
18403
+ }
18404
+ let inbox = [];
18405
+ try {
18406
+ inbox = loadInbox(directory, sessionId);
18407
+ } catch {
18408
+ return;
18409
+ }
18410
+ const deliverable = inbox.filter((m) => isPending(m) && !isHopCapParked(m));
18411
+ if (deliverable.length === 0) return;
18412
+ logger.log(`[Session ${sessionId}] Idle-inbox reconcile: ${deliverable.length} undelivered pending message(s) on an idle agent \u2014 delivering`);
18413
+ const existing = sessionMetadata.messageQueue || [];
18414
+ const seen = new Set(existing.map((e) => e.id));
18415
+ const additions = deliverable.filter((m) => !seen.has(m.messageId)).map((m) => {
18416
+ const formatted = formatInboxMessageXml(m);
18417
+ return { id: m.messageId, text: formatted, displayText: formatted, createdAt: Date.now(), inboxHop: m.hopCount ?? 0, inboxThreadId: m.threadId || m.messageId };
18418
+ });
18419
+ if (additions.length === 0) {
18420
+ processMessageQueueRef?.();
18421
+ return;
18422
+ }
18423
+ sessionMetadata = { ...sessionMetadata, messageQueue: [...existing, ...additions] };
18424
+ sessionService.updateMetadata(sessionMetadata);
18425
+ processMessageQueueRef?.();
18426
+ };
18427
+ if (INBOX_RECONCILE_INTERVAL_MS > 0) {
18428
+ inboxReconcileTimer = setInterval(reconcileIdleInbox, INBOX_RECONCILE_INTERVAL_MS);
18429
+ }
18351
18430
  return {
18352
18431
  type: "success",
18353
18432
  sessionId,
@@ -18701,11 +18780,11 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
18701
18780
  });
18702
18781
  },
18703
18782
  onIssue: async (params) => {
18704
- const { issueRpc } = await import('./rpc-9Zy0N3ge.mjs');
18783
+ const { issueRpc } = await import('./rpc-CIs3wZAu.mjs');
18705
18784
  return issueRpc(params?.cwd || directory, params || {}, { notifySession: notifyIssueOwner, rekickLoopOwner });
18706
18785
  },
18707
18786
  onWorkflow: async (params) => {
18708
- const { workflowRpc } = await import('./rpc-CbFNQklQ.mjs');
18787
+ const { workflowRpc } = await import('./rpc-BMoQLUTg.mjs');
18709
18788
  return workflowRpc(params?.cwd || directory, params || {});
18710
18789
  },
18711
18790
  onRipgrep: async (args, cwd) => {
@@ -19141,6 +19220,59 @@ ${oracle.output.trim().slice(0, 500)}`, "\u{1F501} Continuing loop");
19141
19220
  }
19142
19221
  };
19143
19222
  pidToTrackedSession.set(randomUUID$1(), trackedSession);
19223
+ let acpInboxReconcileTimer = null;
19224
+ const reconcileAcpIdleInbox = () => {
19225
+ if (acpStopped) {
19226
+ if (acpInboxReconcileTimer) clearInterval(acpInboxReconcileTimer);
19227
+ return;
19228
+ }
19229
+ if (!acpBackendReady) return;
19230
+ if (sessionMetadata.lifecycleState !== "idle") return;
19231
+ let inbox = [];
19232
+ try {
19233
+ inbox = loadInbox(directory, sessionId);
19234
+ } catch {
19235
+ return;
19236
+ }
19237
+ const existing = sessionMetadata.messageQueue || [];
19238
+ const seen = new Set(existing.map((e) => e.id));
19239
+ const deliverable = inbox.filter((m) => isPending(m) && !isHopCapParked(m) && !seen.has(m.messageId));
19240
+ let queue = existing;
19241
+ if (deliverable.length > 0) {
19242
+ const additions = deliverable.map((m) => {
19243
+ const formatted = formatInboxMessageXml(m);
19244
+ return { id: m.messageId, text: formatted, displayText: formatted, createdAt: Date.now(), inboxHop: m.hopCount ?? 0, inboxThreadId: m.threadId || m.messageId };
19245
+ });
19246
+ queue = [...existing, ...additions];
19247
+ sessionMetadata = { ...sessionMetadata, messageQueue: queue };
19248
+ sessionService.updateMetadata(sessionMetadata);
19249
+ }
19250
+ if (!queue || queue.length === 0) return;
19251
+ const next = queue[0];
19252
+ const remaining = queue.slice(1);
19253
+ sessionMetadata = { ...sessionMetadata, messageQueue: remaining.length > 0 ? remaining : void 0, lifecycleState: "running" };
19254
+ sessionService.updateMetadata(sessionMetadata);
19255
+ if (typeof next.inboxHop === "number") {
19256
+ writeInboundContext(sessionId, { hopCount: next.inboxHop, threadId: next.inboxThreadId });
19257
+ sessionService.markInboxHandled(next.id);
19258
+ }
19259
+ logger.log(`[${agentName} Session ${sessionId}] Idle-inbox reconcile: delivering queued message to idle agent`);
19260
+ sessionService.pushMessage(next.displayText || next.text, "user");
19261
+ sessionService.sendKeepAlive(true);
19262
+ agentBackend.sendPrompt(sessionId, next.text).catch((err) => {
19263
+ logger.error(`[${agentName} Session ${sessionId}] Error delivering reconciled inbox message: ${err.message}`);
19264
+ if (!acpStopped) {
19265
+ sessionMetadata = { ...sessionMetadata, lifecycleState: "idle" };
19266
+ sessionService.updateMetadata(sessionMetadata);
19267
+ sessionService.sendSessionEnd();
19268
+ }
19269
+ });
19270
+ };
19271
+ {
19272
+ const acpReconcileMs = Number(process.env.SVAMP_INBOX_RECONCILE_MS);
19273
+ const acpReconcileInterval = Number.isFinite(acpReconcileMs) && acpReconcileMs >= 0 ? acpReconcileMs : 15e3;
19274
+ if (acpReconcileInterval > 0) acpInboxReconcileTimer = setInterval(reconcileAcpIdleInbox, acpReconcileInterval);
19275
+ }
19144
19276
  logger.log(`[Agent Session ${sessionId}] Starting ${agentName} backend...`);
19145
19277
  agentBackend.startSession().then(() => {
19146
19278
  acpBackendReady = true;
@@ -19544,7 +19676,7 @@ ${oracle.output.trim().slice(0, 500)}`, "\u{1F501} Continuing loop");
19544
19676
  }
19545
19677
  if (persistedSessions.length > 0) {
19546
19678
  try {
19547
- const { awaitClaudeVersionReady } = await import('./pinnedClaudeCode-B9O-hKxm.mjs');
19679
+ const { awaitClaudeVersionReady } = await import('./pinnedClaudeCode-CgEtGkX2.mjs');
19548
19680
  await awaitClaudeVersionReady();
19549
19681
  } catch {
19550
19682
  }
@@ -19741,7 +19873,7 @@ ${oracle.output.trim().slice(0, 500)}`, "\u{1F501} Continuing loop");
19741
19873
  const PING_TIMEOUT_MS = 15e3;
19742
19874
  const POST_RECONNECT_GRACE_MS = 2e4;
19743
19875
  const RECONNECT_JITTER_MS = 2500;
19744
- const { WorkflowScheduler } = await import('./scheduler-9E9vo0X7.mjs');
19876
+ const { WorkflowScheduler } = await import('./scheduler-uZ__o3N7.mjs');
19745
19877
  const workflowScheduler = new WorkflowScheduler({
19746
19878
  projectRoots: () => {
19747
19879
  const dirs = /* @__PURE__ */ new Set();
@@ -1,4 +1,4 @@
1
- import { j as resolveProjectRoot, D as listWorkflows, E as isWorkflowEnabled, F as workflowCrons, y as runWorkflow, G as cronMatches } from './run-DPUt9qXV.mjs';
1
+ import { j as resolveProjectRoot, D as listWorkflows, E as isWorkflowEnabled, F as workflowCrons, y as runWorkflow, G as cronMatches } from './run-l_8UB-9h.mjs';
2
2
  import 'os';
3
3
  import 'fs/promises';
4
4
  import '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-D1H-lJoD.mjs');
57
+ const { connectAndGetMachine } = await import('./commands-D606feNR.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-D1H-lJoD.mjs');
96
+ const { connectAndGetMachine } = await import('./commands-D606feNR.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-D1H-lJoD.mjs');
185
+ const { connectAndGetMachine } = await import('./commands-D606feNR.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-D1H-lJoD.mjs');
205
+ const { connectAndGetMachine } = await import('./commands-D606feNR.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-D1H-lJoD.mjs');
238
+ const { connectAndGetMachine } = await import('./commands-D606feNR.mjs');
239
239
  const { machine, server } = await connectAndGetMachine(machineId);
240
240
  try {
241
241
  const info = await machine.serveInfo();
@@ -1,4 +1,4 @@
1
- import { R as READ_ONLY_TOOLS, J as loadMachineContext, K as buildMachineInstructions, L as machineToolsForRole, M as buildMachineTools } from './run-DPUt9qXV.mjs';
1
+ import { R as READ_ONLY_TOOLS, J as loadMachineContext, K as buildMachineInstructions, L as machineToolsForRole, M as buildMachineTools } from './run-l_8UB-9h.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.272",
3
+ "version": "0.2.274",
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 bin/commands && mkdir -p bin/skills && cp -r ../../skills/artifact bin/skills/artifact && cp -r ../../skills/crew bin/skills/crew && cp -r ../../commands bin/commands && 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-sharing-notify-sync.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-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-backend-accounts.mjs && npx tsx test/test-backend-oauth.mjs && npx tsx test/test-btw-proxy-env.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-session-access-fallback.mjs && npx tsx test/test-interactive-helpers.mjs && npx tsx test/test-codex-app-server.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-compact-detect.mjs && npx tsx test/test-session-consolidation.mjs && npx tsx test/test-inbox-store.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-loop-verify.mjs && npx tsx test/test-issue-rpc.mjs && npx tsx test/test-issue-pause.mjs && npx tsx test/test-workflow-store.mjs && npx tsx test/test-workflow-rpc.mjs && npx tsx test/test-workflow-scheduler.mjs && npx tsx test/test-cron.mjs && npx tsx test/test-workflow-runs.mjs && npx tsx test/test-workflow-idle.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-ws-upgrade.mjs && npx tsx test/test-serve-auth.mjs && npx tsx test/test-static-file-server.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-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-hotreload-seam.mjs && npx tsx test/test-hot-reload.mjs && npx tsx test/test-hot-reload-live.mjs && npx tsx test/test-session-core.mjs && npx tsx test/test-channel-async-reply.mjs && npx tsx test/test-outbox-reload.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-channel-upload.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 && npx tsx test/test-crew-standalone.mjs && npx tsx test/test-session-links.mjs && npx tsx test/test-issue-loop-pause-guard.mjs && npx tsx test/test-artifact-guard.mjs && npx tsx test/test-graceful-restart.mjs && npx tsx test/test-flush-exit.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-sharing-notify-sync.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-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-backend-accounts.mjs && npx tsx test/test-backend-oauth.mjs && npx tsx test/test-btw-proxy-env.mjs && npx tsx test/test-output-formatters.mjs && npx tsx test/test-inbox-guard.mjs && npx tsx test/test-inbox-reconcile.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-session-access-fallback.mjs && npx tsx test/test-interactive-helpers.mjs && npx tsx test/test-codex-app-server.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-compact-detect.mjs && npx tsx test/test-session-consolidation.mjs && npx tsx test/test-inbox-store.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-loop-verify.mjs && npx tsx test/test-issue-rpc.mjs && npx tsx test/test-issue-pause.mjs && npx tsx test/test-workflow-store.mjs && npx tsx test/test-workflow-rpc.mjs && npx tsx test/test-workflow-scheduler.mjs && npx tsx test/test-cron.mjs && npx tsx test/test-workflow-runs.mjs && npx tsx test/test-workflow-idle.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-ws-upgrade.mjs && npx tsx test/test-serve-auth.mjs && npx tsx test/test-static-file-server.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-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-hotreload-seam.mjs && npx tsx test/test-hot-reload.mjs && npx tsx test/test-hot-reload-live.mjs && npx tsx test/test-session-core.mjs && npx tsx test/test-channel-async-reply.mjs && npx tsx test/test-outbox-reload.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-channel-upload.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 && npx tsx test/test-crew-standalone.mjs && npx tsx test/test-session-links.mjs && npx tsx test/test-issue-loop-pause-guard.mjs && npx tsx test/test-artifact-guard.mjs && npx tsx test/test-graceful-restart.mjs && npx tsx test/test-flush-exit.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",
@@ -1,64 +0,0 @@
1
- var name = "svamp-cli";
2
- var version = "0.2.272";
3
- var description = "Svamp CLI — AI workspace daemon on Hypha Cloud";
4
- var author = "Amun AI AB";
5
- var license = "SEE LICENSE IN LICENSE";
6
- var type = "module";
7
- var bin = {
8
- svamp: "./bin/svamp.mjs"
9
- };
10
- var files = [
11
- "dist",
12
- "bin"
13
- ];
14
- var main = "./dist/index.mjs";
15
- var exports$1 = {
16
- ".": "./dist/index.mjs",
17
- "./cli": "./dist/cli.mjs"
18
- };
19
- var scripts = {
20
- build: "rm -rf dist bin/skills bin/commands && mkdir -p bin/skills && cp -r ../../skills/artifact bin/skills/artifact && cp -r ../../skills/crew bin/skills/crew && cp -r ../../commands bin/commands && tsc --noEmit && pkgroll",
21
- typecheck: "tsc --noEmit",
22
- 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-sharing-notify-sync.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-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-backend-accounts.mjs && npx tsx test/test-backend-oauth.mjs && npx tsx test/test-btw-proxy-env.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-session-access-fallback.mjs && npx tsx test/test-interactive-helpers.mjs && npx tsx test/test-codex-app-server.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-compact-detect.mjs && npx tsx test/test-session-consolidation.mjs && npx tsx test/test-inbox-store.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-loop-verify.mjs && npx tsx test/test-issue-rpc.mjs && npx tsx test/test-issue-pause.mjs && npx tsx test/test-workflow-store.mjs && npx tsx test/test-workflow-rpc.mjs && npx tsx test/test-workflow-scheduler.mjs && npx tsx test/test-cron.mjs && npx tsx test/test-workflow-runs.mjs && npx tsx test/test-workflow-idle.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-ws-upgrade.mjs && npx tsx test/test-serve-auth.mjs && npx tsx test/test-static-file-server.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-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-hotreload-seam.mjs && npx tsx test/test-hot-reload.mjs && npx tsx test/test-hot-reload-live.mjs && npx tsx test/test-session-core.mjs && npx tsx test/test-channel-async-reply.mjs && npx tsx test/test-outbox-reload.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-channel-upload.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 && npx tsx test/test-crew-standalone.mjs && npx tsx test/test-session-links.mjs && npx tsx test/test-issue-loop-pause-guard.mjs && npx tsx test/test-artifact-guard.mjs && npx tsx test/test-graceful-restart.mjs && npx tsx test/test-flush-exit.mjs",
23
- "test:hypha": "node --no-warnings test/test-hypha-service.mjs",
24
- dev: "tsx src/cli.ts",
25
- "dev:daemon": "tsx src/cli.ts daemon start-sync",
26
- "test:e2e": "node --no-warnings test/e2e-session-tests.mjs",
27
- "test:frpc": "npx tsx test/test-frpc-e2e.mjs",
28
- prepublishOnly: "yarn build"
29
- };
30
- var dependencies = {
31
- "@agentclientprotocol/sdk": "^0.14.1",
32
- "@modelcontextprotocol/sdk": "^1.25.3",
33
- "hypha-rpc": "0.21.42",
34
- "node-pty": "1.2.0-beta.11",
35
- ws: "^8.18.0",
36
- yaml: "^2.8.2",
37
- zod: "^3.24.4"
38
- };
39
- var devDependencies = {
40
- "@types/node": ">=20",
41
- "@types/ws": "^8.5.14",
42
- pkgroll: "^2.14.2",
43
- tsx: "^4.20.6",
44
- typescript: "5.9.3"
45
- };
46
- var packageManager = "yarn@1.22.22";
47
- var _package = {
48
- name: name,
49
- version: version,
50
- description: description,
51
- author: author,
52
- license: license,
53
- type: type,
54
- bin: bin,
55
- files: files,
56
- main: main,
57
- exports: exports$1,
58
- scripts: scripts,
59
- dependencies: dependencies,
60
- devDependencies: devDependencies,
61
- packageManager: packageManager
62
- };
63
-
64
- export { author, bin, _package as default, dependencies, description, devDependencies, exports$1 as exports, files, license, main, name, packageManager, scripts, type, version };