svamp-cli 0.2.193 → 0.2.195

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 (25) hide show
  1. package/bin/skills/crew/SKILL.md +24 -1
  2. package/dist/{agentCommands-BmA4np5o.mjs → agentCommands-IdOiOg0f.mjs} +5 -5
  3. package/dist/{auth-DiC4bXUT.mjs → auth-DmrnqTLo.mjs} +1 -1
  4. package/dist/cli.mjs +60 -60
  5. package/dist/{commands-By97uPq7.mjs → commands-B3uk2hcj.mjs} +1 -1
  6. package/dist/{commands-CPT-Wu41.mjs → commands-BlTV-jYX.mjs} +12 -4
  7. package/dist/{commands-D_Dqz5Kt.mjs → commands-CbBOkn_G.mjs} +1 -1
  8. package/dist/{commands-CGAgeoBz.mjs → commands-DAYpMdgB.mjs} +2 -2
  9. package/dist/{commands-B6mOqtXM.mjs → commands-DHI31wAh.mjs} +1 -1
  10. package/dist/{commands-CRmtBdgs.mjs → commands-DZhCJXnB.mjs} +137 -49
  11. package/dist/{commands-QzPRQeKZ.mjs → commands-DjT7M2al.mjs} +5 -5
  12. package/dist/{fleet-CZpk6-Xg.mjs → fleet-BtwsNKuT.mjs} +1 -1
  13. package/dist/{frpc-B7NXLQsh.mjs → frpc-WpRu5zE_.mjs} +1 -1
  14. package/dist/{headlessCli-Dw7jUz1h.mjs → headlessCli-Dy049YdV.mjs} +2 -2
  15. package/dist/index.mjs +1 -1
  16. package/dist/{package-CzvXt0G5.mjs → package-ARvCEkBY.mjs} +2 -2
  17. package/dist/{rpc-CBVukorH.mjs → rpc-CvpwmghB.mjs} +1 -1
  18. package/dist/{rpc-MAQMw8il.mjs → rpc-DgV6_G_Q.mjs} +29 -5
  19. package/dist/{run-iqdE_9Ef.mjs → run-D79u_Ud4.mjs} +1 -1
  20. package/dist/{run-B_UWCqRV.mjs → run-DiCtjIs5.mjs} +63 -16
  21. package/dist/{scheduler-TfLOcnBs.mjs → scheduler-D8Xj2_vB.mjs} +1 -1
  22. package/dist/{serveCommands-DFrOQUs1.mjs → serveCommands-Bc9DXaQv.mjs} +5 -5
  23. package/dist/{serveManager-DpIlnzKd.mjs → serveManager-C2ykbnxd.mjs} +2 -2
  24. package/dist/{sideband-C-cTD2o2.mjs → sideband-B9uONcBg.mjs} +1 -1
  25. package/package.json +2 -2
@@ -2720,7 +2720,7 @@ async function registerMachineService(server, machineId, metadata, daemonState,
2720
2720
  const tunnels = handlers.tunnels;
2721
2721
  if (!tunnels) throw new Error("Tunnel management not available");
2722
2722
  if (tunnels.has(params.name)) throw new Error(`Tunnel '${params.name}' already running`);
2723
- const { FrpcTunnel } = await import('./frpc-B7NXLQsh.mjs');
2723
+ const { FrpcTunnel } = await import('./frpc-WpRu5zE_.mjs');
2724
2724
  const tunnel = new FrpcTunnel({
2725
2725
  name: params.name,
2726
2726
  ports: params.ports,
@@ -3167,7 +3167,7 @@ QUESTION: ${params.question || "Summarize this concisely."}` }
3167
3167
  }
3168
3168
  const deps = buildSessionDeps(rpc, { cwd, ownerEmail: owner });
3169
3169
  const sender = { name: context?.user?.email || context?.user?.id || "user", kind: "user", verified: true };
3170
- const { toolsForRole } = await import('./sideband-C-cTD2o2.mjs');
3170
+ const { toolsForRole } = await import('./sideband-B9uONcBg.mjs');
3171
3171
  const r2 = await runWiseAgent({ message: params.message, sender, config: { tools: toolsForRole(role2) }, deps, transport, model: resolved.model });
3172
3172
  return fmt(r2);
3173
3173
  }
@@ -3266,7 +3266,7 @@ QUESTION: ${params.question || "Summarize this concisely."}` }
3266
3266
  if (r.error || !r.sender) return { error: r.error || "unauthorized" };
3267
3267
  const callId = "call_" + Math.random().toString(16).slice(2, 12);
3268
3268
  const rendered = renderMessage(c, { sender: r.sender, body: { message: kwargs.message }, callId });
3269
- const { queryCore } = await import('./commands-By97uPq7.mjs');
3269
+ const { queryCore } = await import('./commands-B3uk2hcj.mjs');
3270
3270
  const timeout = c.reply?.timeout_sec || 120;
3271
3271
  let result;
3272
3272
  try {
@@ -3782,7 +3782,6 @@ function formatInboxMessageXml(msg) {
3782
3782
  if (msg.subject) attrs.push(`subject="${escapeXml(msg.subject)}"`);
3783
3783
  if (msg.urgency) attrs.push(`urgency="${msg.urgency}"`);
3784
3784
  if (msg.replyTo) attrs.push(`reply-to="${escapeXml(msg.replyTo)}"`);
3785
- if (msg.cc && msg.cc.length > 0) attrs.push(`cc="${msg.cc.map(escapeXml).join(",")}"`);
3786
3785
  if (msg.threadId) attrs.push(`thread-id="${escapeXml(msg.threadId)}"`);
3787
3786
  attrs.push(`timestamp="${msg.timestamp}"`);
3788
3787
  return `<svamp-message ${attrs.join(" ")}>
@@ -3942,13 +3941,15 @@ function createSessionStore(server, sessionId, initialMetadata, initialAgentStat
3942
3941
  body: m.body,
3943
3942
  timestamp: m.timestamp,
3944
3943
  read: m.read,
3944
+ // `handled` = agent consumed it; drives the "pending" (unread) badge
3945
+ // together with `read` so handled messages don't linger as phantom-unread.
3946
+ ...m.handled ? { handled: true } : {},
3945
3947
  from: m.from,
3946
3948
  fromSession: m.fromSession,
3947
3949
  to: m.to,
3948
3950
  subject: m.subject,
3949
3951
  urgency: m.urgency,
3950
3952
  replyTo: m.replyTo,
3951
- cc: m.cc,
3952
3953
  threadId: m.threadId,
3953
3954
  // Channel provenance so the inbox UI can show who/verified.
3954
3955
  ...m.verified !== void 0 ? { verified: m.verified } : {},
@@ -5063,6 +5064,13 @@ Output ONLY the full revised reply text \u2014 no preamble, no commentary, no su
5063
5064
  syncInboxToMetadata();
5064
5065
  }
5065
5066
  },
5067
+ markInboxHandled: (messageId) => {
5068
+ const msg = inbox.find((m) => m.messageId === messageId);
5069
+ if (msg && !msg.handled) {
5070
+ msg.handled = true;
5071
+ syncInboxToMetadata();
5072
+ }
5073
+ },
5066
5074
  disconnect: async () => {
5067
5075
  const toRemove = [...listeners];
5068
5076
  for (const listener of toRemove) {
@@ -9913,7 +9921,7 @@ function normalizeStatus(s) {
9913
9921
  if (s === "done") return "archived";
9914
9922
  return s === "ready" || s === "in_progress" || s === "archived" ? s : "ready";
9915
9923
  }
9916
- const FIELD_ORDER = ["id", "title", "status", "scope", "labels", "verify", "disposition", "triaged", "branch", "session", "original", "created", "closed"];
9924
+ const FIELD_ORDER = ["id", "title", "status", "scope", "labels", "verify", "disposition", "triaged", "branch", "session", "owner", "original", "created", "closed"];
9917
9925
  function resolveProjectRoot(start = process.cwd()) {
9918
9926
  let dir = start;
9919
9927
  for (let i = 0; i < 40; i++) {
@@ -9970,6 +9978,7 @@ function parseIssue(content) {
9970
9978
  triaged: fm.triaged === true,
9971
9979
  branch: fm.branch ?? null,
9972
9980
  session: fm.session ?? null,
9981
+ owner: fm.owner ?? null,
9973
9982
  original: fm.original ?? null,
9974
9983
  created: String(fm.created ?? (/* @__PURE__ */ new Date()).toISOString()),
9975
9984
  closed: fm.closed ?? null,
@@ -9997,6 +10006,13 @@ function listIssues(projectRoot, opts = {}) {
9997
10006
  if (opts.scope) items = items.filter((i) => i.scope === opts.scope);
9998
10007
  return items.sort((a, b) => Number(a.id) - Number(b.id));
9999
10008
  }
10009
+ function isVisibleTo(issue, session) {
10010
+ if (issue.scope === "session") return issue.session === session || issue.owner === session;
10011
+ if (issue.owner === session) return true;
10012
+ if (issue.session === session) return true;
10013
+ if (!issue.owner && !issue.session) return true;
10014
+ return false;
10015
+ }
10000
10016
  function getIssue(projectRoot, id) {
10001
10017
  const padded = /^\d+$/.test(id) ? id.padStart(4, "0") : id;
10002
10018
  for (const p of [issuePath(projectRoot, padded), issuePath(projectRoot, padded, true)]) {
@@ -10033,6 +10049,7 @@ function addIssue(projectRoot, fields) {
10033
10049
  triaged: fields.triaged ?? false,
10034
10050
  branch: null,
10035
10051
  session: fields.session ?? null,
10052
+ owner: fields.owner ?? null,
10036
10053
  original: fields.original ?? null,
10037
10054
  created: (/* @__PURE__ */ new Date()).toISOString(),
10038
10055
  closed: null,
@@ -11614,7 +11631,7 @@ async function startDaemon(options) {
11614
11631
  saveExposedTunnels(list);
11615
11632
  }
11616
11633
  async function createExposedTunnel(spec) {
11617
- const { FrpcTunnel } = await import('./frpc-B7NXLQsh.mjs');
11634
+ const { FrpcTunnel } = await import('./frpc-WpRu5zE_.mjs');
11618
11635
  const tunnel = new FrpcTunnel({
11619
11636
  name: spec.name,
11620
11637
  ports: spec.ports,
@@ -11634,7 +11651,7 @@ async function startDaemon(options) {
11634
11651
  return tunnel;
11635
11652
  }
11636
11653
  const tunnelRecreateState = /* @__PURE__ */ new Map();
11637
- const { ServeManager } = await import('./serveManager-DpIlnzKd.mjs');
11654
+ const { ServeManager } = await import('./serveManager-C2ykbnxd.mjs');
11638
11655
  const serveManager = new ServeManager(SVAMP_HOME, (msg) => logger.log(`[SERVE] ${msg}`), hyphaServerUrl);
11639
11656
  ensureAutoInstalledSkills(logger).catch(() => {
11640
11657
  });
@@ -11710,6 +11727,29 @@ ${v.guidance ? v.guidance + "\n" : ""}Criteria: ${v.criteria || "(none)"}
11710
11727
  } catch {
11711
11728
  }
11712
11729
  };
11730
+ const notifyIssueOwner = (sessionId, text) => {
11731
+ try {
11732
+ const target = Array.from(pidToTrackedSession.values()).find((t) => t.svampSessionId === sessionId && !t.stopped);
11733
+ const send = target?.sessionRPCHandlers?.sendInboxMessage;
11734
+ if (!send) {
11735
+ logger.log(`[issue] follow-up notify skipped \u2014 owner session ${sessionId.slice(0, 8)} not live on this machine`);
11736
+ return;
11737
+ }
11738
+ Promise.resolve(send({
11739
+ messageId: randomUUID$1(),
11740
+ from: "system:issues",
11741
+ subject: "issue follow-up",
11742
+ body: text,
11743
+ timestamp: Date.now(),
11744
+ read: false,
11745
+ urgency: "normal",
11746
+ hopCount: 1
11747
+ })).catch(() => {
11748
+ });
11749
+ logger.log(`[issue] follow-up notify \u2192 owner ${sessionId.slice(0, 8)}`);
11750
+ } catch {
11751
+ }
11752
+ };
11713
11753
  server.on("services_registered", () => {
11714
11754
  if (consecutiveHeartbeatFailures > 0) {
11715
11755
  logger.log(`Hypha reconnection successful \u2014 services re-registered (resetting ${consecutiveHeartbeatFailures} failures)`);
@@ -13393,6 +13433,7 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
13393
13433
  }
13394
13434
  if (decision.action === "wake") {
13395
13435
  logger.log(`[Session ${sessionId}] Delivering inbox message to agent`);
13436
+ sessionService.markInboxHandled(message.messageId);
13396
13437
  writeInboundContext(sessionId, { hopCount: message.hopCount ?? 0, threadId: message.threadId || message.messageId });
13397
13438
  sessionService.pushMessage(formatted, "user");
13398
13439
  if (!claudeProcess || claudeProcess.exitCode !== null) {
@@ -13475,11 +13516,11 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
13475
13516
  });
13476
13517
  },
13477
13518
  onIssue: async (params) => {
13478
- const { issueRpc } = await import('./rpc-MAQMw8il.mjs');
13479
- return issueRpc(params?.cwd || directory, params || {});
13519
+ const { issueRpc } = await import('./rpc-DgV6_G_Q.mjs');
13520
+ return issueRpc(params?.cwd || directory, params || {}, { notifySession: notifyIssueOwner });
13480
13521
  },
13481
13522
  onWorkflow: async (params) => {
13482
- const { workflowRpc } = await import('./rpc-CBVukorH.mjs');
13523
+ const { workflowRpc } = await import('./rpc-CvpwmghB.mjs');
13483
13524
  return workflowRpc(params?.cwd || directory, params || {});
13484
13525
  },
13485
13526
  onRipgrep: async (args, cwd) => {
@@ -13600,6 +13641,7 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
13600
13641
  sessionService.updateMetadata(sessionMetadata);
13601
13642
  if (typeof next.inboxHop === "number") {
13602
13643
  writeInboundContext(sessionId, { hopCount: next.inboxHop, threadId: next.inboxThreadId });
13644
+ sessionService.markInboxHandled(next.id);
13603
13645
  }
13604
13646
  logger.log(`[Session ${sessionId}] Processing queued message: "${next.text.slice(0, 50)}..."`);
13605
13647
  sessionWasProcessing = true;
@@ -13875,6 +13917,7 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
13875
13917
  const wake = decision.action === "wake" && acpBackendReady;
13876
13918
  if (wake) {
13877
13919
  logger.log(`[${agentName} Session ${sessionId}] Delivering inbox message to agent`);
13920
+ sessionService.markInboxHandled(message.messageId);
13878
13921
  writeInboundContext(sessionId, { hopCount: message.hopCount ?? 0, threadId: message.threadId || message.messageId });
13879
13922
  sessionService.pushMessage(formatted, "user");
13880
13923
  sessionMetadata = { ...sessionMetadata, lifecycleState: "running" };
@@ -13905,6 +13948,7 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
13905
13948
  sessionService.updateMetadata(sessionMetadata);
13906
13949
  if (typeof next.inboxHop === "number") {
13907
13950
  writeInboundContext(sessionId, { hopCount: next.inboxHop, threadId: next.inboxThreadId });
13951
+ sessionService.markInboxHandled(next.id);
13908
13952
  }
13909
13953
  sessionService.pushMessage(next.text, "user");
13910
13954
  sessionService.sendKeepAlive(true);
@@ -13956,6 +14000,7 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
13956
14000
  const remaining = queue.slice(1);
13957
14001
  sessionMetadata = { ...sessionMetadata, messageQueue: remaining.length > 0 ? remaining : void 0, lifecycleState: "running" };
13958
14002
  sessionService.updateMetadata(sessionMetadata);
14003
+ sessionService.markInboxHandled(next.id);
13959
14004
  logger.log(`[Session ${sessionId}] Processing queued message from metadata update: "${next.text.slice(0, 50)}..."`);
13960
14005
  sessionService.sendKeepAlive(true);
13961
14006
  agentBackend.sendPrompt(sessionId, next.text).catch((err) => {
@@ -13985,11 +14030,11 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
13985
14030
  });
13986
14031
  },
13987
14032
  onIssue: async (params) => {
13988
- const { issueRpc } = await import('./rpc-MAQMw8il.mjs');
13989
- return issueRpc(params?.cwd || directory, params || {});
14033
+ const { issueRpc } = await import('./rpc-DgV6_G_Q.mjs');
14034
+ return issueRpc(params?.cwd || directory, params || {}, { notifySession: notifyIssueOwner });
13990
14035
  },
13991
14036
  onWorkflow: async (params) => {
13992
- const { workflowRpc } = await import('./rpc-CBVukorH.mjs');
14037
+ const { workflowRpc } = await import('./rpc-CvpwmghB.mjs');
13993
14038
  return workflowRpc(params?.cwd || directory, params || {});
13994
14039
  },
13995
14040
  onRipgrep: async (args, cwd) => {
@@ -14090,6 +14135,7 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
14090
14135
  const remaining = queue.slice(1);
14091
14136
  sessionMetadata = { ...sessionMetadata, messageQueue: remaining.length > 0 ? remaining : void 0, lifecycleState: "running" };
14092
14137
  sessionService.updateMetadata(sessionMetadata);
14138
+ sessionService.markInboxHandled(next.id);
14093
14139
  logger.log(`[Session ${sessionId}] Processing queued message (ACP loop activation): "${next.text.slice(0, 50)}..."`);
14094
14140
  sessionService.sendKeepAlive(true);
14095
14141
  agentBackend.sendPrompt(sessionId, next.text).catch((err) => {
@@ -14180,6 +14226,7 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
14180
14226
  sessionMetadata = { ...sessionMetadata, messageQueue: remaining.length > 0 ? remaining : void 0, lifecycleState: "running" };
14181
14227
  sessionService.updateMetadata(sessionMetadata);
14182
14228
  sessionService.sendKeepAlive(true);
14229
+ sessionService.markInboxHandled(next.id);
14183
14230
  logger.log(`[Session ${sessionId}] Processing queued message: "${next.text.slice(0, 50)}..."`);
14184
14231
  sessionService.pushMessage(next.displayText || next.text, "user");
14185
14232
  agentBackend.sendPrompt(sessionId, next.text).catch((err) => {
@@ -14742,7 +14789,7 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
14742
14789
  const PING_TIMEOUT_MS = 15e3;
14743
14790
  const POST_RECONNECT_GRACE_MS = 2e4;
14744
14791
  const RECONNECT_JITTER_MS = 2500;
14745
- const { WorkflowScheduler } = await import('./scheduler-TfLOcnBs.mjs');
14792
+ const { WorkflowScheduler } = await import('./scheduler-D8Xj2_vB.mjs');
14746
14793
  const workflowScheduler = new WorkflowScheduler({
14747
14794
  projectRoots: () => {
14748
14795
  const dirs = /* @__PURE__ */ new Set();
@@ -15321,4 +15368,4 @@ var run = /*#__PURE__*/Object.freeze({
15321
15368
  writeStopMarker: writeStopMarker
15322
15369
  });
15323
15370
 
15324
- export { buildMachineDeps as $, machineToolsForRole as A, buildMachineTools as B, parseFrontmatter as C, getSkillsServer as D, getSkillsWorkspaceName as E, getSkillsCollectionName as F, fetchWithTimeout as G, searchSkills as H, SKILLS_DIR as I, getSkillInfo as J, downloadSkillFile as K, listSkillFiles as L, resolveModel as M, formatHandle as N, normalizeAllowedUser as O, loadSecurityContextConfig as P, resolveSecurityContext as Q, READ_ONLY_TOOLS as R, ServeAuth as S, buildSecurityContextFromFlags as T, mergeSecurityContexts as U, buildSessionShareUrl as V, computeOutboundHop as W, buildMachineShareUrl as X, parseHandle as Y, handleMatchesMetadata as Z, describeMisconfiguration as _, createSessionStore as a, applyClaudeProxyEnv as a0, composeSessionId as a1, generateFriendlyName as a2, generateHookSettings as a3, claudeAuth as a4, projectInfo as a5, DefaultTransport$1 as a6, acpBackend as a7, acpAgentConfig as a8, codexMcpBackend as a9, GeminiTransport$1 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, getIssue as n, addComment as o, addIssue as p, listIssues as q, registerMachineService as r, startDaemon as s, searchIssues as t, updateIssue as u, cronMatches as v, summarize as w, shortId as x, loadMachineContext as y, buildMachineInstructions as z };
15371
+ export { describeMisconfiguration as $, buildMachineInstructions as A, machineToolsForRole as B, buildMachineTools as C, parseFrontmatter as D, getSkillsServer as E, getSkillsWorkspaceName as F, getSkillsCollectionName as G, fetchWithTimeout as H, searchSkills as I, SKILLS_DIR as J, getSkillInfo as K, downloadSkillFile as L, listSkillFiles as M, resolveModel as N, formatHandle as O, normalizeAllowedUser as P, loadSecurityContextConfig as Q, READ_ONLY_TOOLS 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, applyClaudeProxyEnv as a1, composeSessionId as a2, generateFriendlyName as a3, generateHookSettings as a4, claudeAuth as a5, projectInfo as a6, DefaultTransport$1 as a7, acpBackend as a8, acpAgentConfig as a9, codexMcpBackend as aa, GeminiTransport$1 as ab, instanceConfig as ac, api as ad, run as ae, 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, getIssue as n, addComment as o, addIssue as p, listIssues as q, registerMachineService as r, startDaemon as s, searchIssues as t, updateIssue as u, isVisibleTo as v, cronMatches as w, summarize as x, shortId as y, loadMachineContext as z };
@@ -1,5 +1,5 @@
1
1
  import { spawn } from 'node:child_process';
2
- import { m as resolveProjectRoot, v as cronMatches } from './run-B_UWCqRV.mjs';
2
+ import { m as resolveProjectRoot, w as cronMatches } from './run-DiCtjIs5.mjs';
3
3
  import { l as listWorkflows, i as isWorkflowEnabled, c as workflowCrons, w as workflowSteps } from './store-DEZ8e-uE.mjs';
4
4
  import 'os';
5
5
  import 'fs/promises';
@@ -54,7 +54,7 @@ async function handleServeCommand() {
54
54
  }
55
55
  }
56
56
  async function serveAdd(args, machineId) {
57
- const { connectAndGetMachine } = await import('./commands-By97uPq7.mjs');
57
+ const { connectAndGetMachine } = await import('./commands-B3uk2hcj.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-By97uPq7.mjs');
96
+ const { connectAndGetMachine } = await import('./commands-B3uk2hcj.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-By97uPq7.mjs');
185
+ const { connectAndGetMachine } = await import('./commands-B3uk2hcj.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-By97uPq7.mjs');
205
+ const { connectAndGetMachine } = await import('./commands-B3uk2hcj.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-By97uPq7.mjs');
238
+ const { connectAndGetMachine } = await import('./commands-B3uk2hcj.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-B_UWCqRV.mjs';
7
+ import { k as getHyphaServerUrl, S as ServeAuth, l as hasCookieToken } from './run-DiCtjIs5.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-B7NXLQsh.mjs');
736
+ const { FrpcTunnel } = await import('./frpc-WpRu5zE_.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, y as loadMachineContext, z as buildMachineInstructions, A as machineToolsForRole, B as buildMachineTools } from './run-B_UWCqRV.mjs';
1
+ import { R as READ_ONLY_TOOLS, z as loadMachineContext, A as buildMachineInstructions, B as machineToolsForRole, C as buildMachineTools } from './run-DiCtjIs5.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.193",
3
+ "version": "0.2.195",
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-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-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-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-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-issue-rpc.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-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-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-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-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-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-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-issue-rpc.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-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-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 && npx tsx test/test-crew-standalone.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",