svamp-cli 0.2.81 → 0.2.82

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.
@@ -148,7 +148,7 @@ async function sessionBroadcast(action, args) {
148
148
  console.log(`Broadcast sent: ${action}`);
149
149
  }
150
150
  async function connectToMachineService() {
151
- const { connectAndGetMachine } = await import('./commands-v4NWBPB2.mjs');
151
+ const { connectAndGetMachine } = await import('./commands-BSfZg4aa.mjs');
152
152
  return connectAndGetMachine();
153
153
  }
154
154
  async function inboxSend(targetSessionId, opts) {
@@ -165,7 +165,7 @@ async function inboxSend(targetSessionId, opts) {
165
165
  }
166
166
  const { server, machine } = await connectToMachineService();
167
167
  try {
168
- const { resolveSessionId } = await import('./commands-v4NWBPB2.mjs');
168
+ const { resolveSessionId } = await import('./commands-BSfZg4aa.mjs');
169
169
  const sessions = await machine.listSessions();
170
170
  const match = resolveSessionId(sessions, targetSessionId);
171
171
  const fullTargetId = match.sessionId;
package/dist/cli.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { s as startDaemon, b as stopDaemon, d as daemonStatus } from './run-ChG07q23.mjs';
1
+ import { s as startDaemon, b as stopDaemon, d as daemonStatus } from './run-BvocESxe.mjs';
2
2
  import 'os';
3
3
  import 'fs/promises';
4
4
  import 'fs';
@@ -44,7 +44,7 @@ async function main() {
44
44
  console.error(`svamp daemon restart: ${err.message || err}`);
45
45
  process.exit(1);
46
46
  }
47
- const { restartDaemon } = await import('./run-ChG07q23.mjs').then(function (n) { return n.u; });
47
+ const { restartDaemon } = await import('./run-BvocESxe.mjs').then(function (n) { return n.K; });
48
48
  await restartDaemon();
49
49
  process.exit(0);
50
50
  }
@@ -296,7 +296,7 @@ async function main() {
296
296
  console.error("svamp service: Service commands are not available in sandboxed sessions.");
297
297
  process.exit(1);
298
298
  }
299
- const { handleServiceCommand } = await import('./commands-DG48QiE-.mjs');
299
+ const { handleServiceCommand } = await import('./commands-AzYDzCjE.mjs');
300
300
  await handleServiceCommand();
301
301
  } else if (subcommand === "serve") {
302
302
  const { isSandboxed: isSandboxedServe } = await import('./sandboxDetect-DNTcbgWD.mjs');
@@ -304,7 +304,7 @@ async function main() {
304
304
  console.error("svamp serve: Serve commands are not available in sandboxed sessions.");
305
305
  process.exit(1);
306
306
  }
307
- const { handleServeCommand } = await import('./serveCommands-CLxYFLiG.mjs');
307
+ const { handleServeCommand } = await import('./serveCommands-DJUhkyLk.mjs');
308
308
  await handleServeCommand();
309
309
  process.exit(0);
310
310
  } else if (subcommand === "process" || subcommand === "proc") {
@@ -313,7 +313,7 @@ async function main() {
313
313
  console.error("svamp process: Process commands are not available in sandboxed sessions.");
314
314
  process.exit(1);
315
315
  }
316
- const { processCommand } = await import('./commands-BRmDFn7e.mjs');
316
+ const { processCommand } = await import('./commands-DHOxmh4o.mjs');
317
317
  let machineId;
318
318
  const processArgs = args.slice(1);
319
319
  const mIdx = processArgs.findIndex((a) => a === "--machine" || a === "-m");
@@ -331,7 +331,7 @@ async function main() {
331
331
  } else if (!subcommand || subcommand === "start") {
332
332
  await handleInteractiveCommand();
333
333
  } else if (subcommand === "--version" || subcommand === "-v") {
334
- const pkg = await import('./package-D2aOg03L.mjs').catch(() => ({ default: { version: "unknown" } }));
334
+ const pkg = await import('./package-BmFZfykH.mjs').catch(() => ({ default: { version: "unknown" } }));
335
335
  console.log(`svamp version: ${pkg.default.version}`);
336
336
  } else {
337
337
  console.error(`Unknown command: ${subcommand}`);
@@ -340,7 +340,7 @@ async function main() {
340
340
  }
341
341
  }
342
342
  async function handleInteractiveCommand() {
343
- const { runInteractive } = await import('./run-C-w9-q8d.mjs');
343
+ const { runInteractive } = await import('./run-CrOw9-WG.mjs');
344
344
  const interactiveArgs = subcommand === "start" ? args.slice(1) : args;
345
345
  let directory = process.cwd();
346
346
  let resumeSessionId;
@@ -385,7 +385,7 @@ async function handleAgentCommand() {
385
385
  return;
386
386
  }
387
387
  if (agentArgs[0] === "list") {
388
- const { KNOWN_ACP_AGENTS, KNOWN_MCP_AGENTS: KNOWN_MCP_AGENTS2 } = await import('./run-ChG07q23.mjs').then(function (n) { return n.p; });
388
+ const { KNOWN_ACP_AGENTS, KNOWN_MCP_AGENTS: KNOWN_MCP_AGENTS2 } = await import('./run-BvocESxe.mjs').then(function (n) { return n.F; });
389
389
  console.log("Known agents:");
390
390
  for (const [name, config2] of Object.entries(KNOWN_ACP_AGENTS)) {
391
391
  console.log(` ${name.padEnd(12)} ${config2.command} ${config2.args.join(" ")} (ACP)`);
@@ -397,7 +397,7 @@ async function handleAgentCommand() {
397
397
  console.log('Use "svamp agent -- <command> [args]" for a custom ACP agent.');
398
398
  return;
399
399
  }
400
- const { resolveAcpAgentConfig, KNOWN_MCP_AGENTS } = await import('./run-ChG07q23.mjs').then(function (n) { return n.p; });
400
+ const { resolveAcpAgentConfig, KNOWN_MCP_AGENTS } = await import('./run-BvocESxe.mjs').then(function (n) { return n.F; });
401
401
  let cwd = process.cwd();
402
402
  const filteredArgs = [];
403
403
  for (let i = 0; i < agentArgs.length; i++) {
@@ -421,12 +421,12 @@ async function handleAgentCommand() {
421
421
  console.log(`Starting ${config.agentName} agent in ${cwd}...`);
422
422
  let backend;
423
423
  if (KNOWN_MCP_AGENTS[config.agentName]) {
424
- const { CodexMcpBackend } = await import('./run-ChG07q23.mjs').then(function (n) { return n.q; });
424
+ const { CodexMcpBackend } = await import('./run-BvocESxe.mjs').then(function (n) { return n.G; });
425
425
  backend = new CodexMcpBackend({ cwd, log: logFn });
426
426
  } else {
427
- const { AcpBackend } = await import('./run-ChG07q23.mjs').then(function (n) { return n.o; });
428
- const { GeminiTransport } = await import('./run-ChG07q23.mjs').then(function (n) { return n.G; });
429
- const { DefaultTransport } = await import('./run-ChG07q23.mjs').then(function (n) { return n.D; });
427
+ const { AcpBackend } = await import('./run-BvocESxe.mjs').then(function (n) { return n.E; });
428
+ const { GeminiTransport } = await import('./run-BvocESxe.mjs').then(function (n) { return n.H; });
429
+ const { DefaultTransport } = await import('./run-BvocESxe.mjs').then(function (n) { return n.D; });
430
430
  const transportHandler = config.agentName === "gemini" ? new GeminiTransport() : new DefaultTransport(config.agentName);
431
431
  backend = new AcpBackend({
432
432
  agentName: config.agentName,
@@ -553,7 +553,7 @@ async function handleSessionCommand() {
553
553
  process.exit(1);
554
554
  }
555
555
  }
556
- const { sessionList, sessionSpawn, sessionArchive, sessionResume, sessionDelete, sessionInfo, sessionMessages, sessionAttach, sessionMachines, sessionSend, sessionWait, sessionShare, sessionRalphStart, sessionRalphCancel, sessionRalphStatus, sessionInboxSend, sessionInboxList, sessionInboxRead, sessionInboxReply, sessionInboxClear } = await import('./commands-v4NWBPB2.mjs');
556
+ const { sessionList, sessionSpawn, sessionArchive, sessionResume, sessionDelete, sessionInfo, sessionMessages, sessionAttach, sessionMachines, sessionSend, sessionWait, sessionShare, sessionRalphStart, sessionRalphCancel, sessionRalphStatus, sessionInboxSend, sessionInboxList, sessionInboxRead, sessionInboxReply, sessionInboxClear } = await import('./commands-BSfZg4aa.mjs');
557
557
  const parseFlagStr = (flag, shortFlag) => {
558
558
  for (let i = 1; i < sessionArgs.length; i++) {
559
559
  if ((sessionArgs[i] === flag || shortFlag) && i + 1 < sessionArgs.length) {
@@ -619,7 +619,7 @@ async function handleSessionCommand() {
619
619
  allowDomain.push(sessionArgs[++i]);
620
620
  }
621
621
  }
622
- const { parseShareArg } = await import('./commands-v4NWBPB2.mjs');
622
+ const { parseShareArg } = await import('./commands-BSfZg4aa.mjs');
623
623
  const shareEntries = share.map((s) => parseShareArg(s));
624
624
  await sessionSpawn(agent, dir, targetMachineId, {
625
625
  message,
@@ -705,7 +705,7 @@ async function handleSessionCommand() {
705
705
  console.error(" Spawns a stateless Claude session in <directory>, sends <prompt>, prints the answer, then deletes the session.");
706
706
  process.exit(1);
707
707
  }
708
- const { sessionQuery } = await import('./commands-v4NWBPB2.mjs');
708
+ const { sessionQuery } = await import('./commands-BSfZg4aa.mjs');
709
709
  await sessionQuery(dir, prompt, targetMachineId, {
710
710
  timeout: parseFlagInt("--timeout"),
711
711
  json: hasFlag("--json"),
@@ -738,7 +738,7 @@ async function handleSessionCommand() {
738
738
  console.error("Usage: svamp session approve <session-id> [request-id] [--json]");
739
739
  process.exit(1);
740
740
  }
741
- const { sessionApprove } = await import('./commands-v4NWBPB2.mjs');
741
+ const { sessionApprove } = await import('./commands-BSfZg4aa.mjs');
742
742
  const approveReqId = sessionArgs[2] && !sessionArgs[2].startsWith("--") ? sessionArgs[2] : void 0;
743
743
  await sessionApprove(sessionArgs[1], approveReqId, targetMachineId, {
744
744
  json: hasFlag("--json")
@@ -748,7 +748,7 @@ async function handleSessionCommand() {
748
748
  console.error("Usage: svamp session deny <session-id> [request-id] [--json]");
749
749
  process.exit(1);
750
750
  }
751
- const { sessionDeny } = await import('./commands-v4NWBPB2.mjs');
751
+ const { sessionDeny } = await import('./commands-BSfZg4aa.mjs');
752
752
  const denyReqId = sessionArgs[2] && !sessionArgs[2].startsWith("--") ? sessionArgs[2] : void 0;
753
753
  await sessionDeny(sessionArgs[1], denyReqId, targetMachineId, {
754
754
  json: hasFlag("--json")
@@ -784,7 +784,7 @@ async function handleSessionCommand() {
784
784
  console.error("Usage: svamp session set-title <title>");
785
785
  process.exit(1);
786
786
  }
787
- const { sessionSetTitle } = await import('./agentCommands-B0x3og03.mjs');
787
+ const { sessionSetTitle } = await import('./agentCommands-BPpgoGxT.mjs');
788
788
  await sessionSetTitle(title);
789
789
  } else if (sessionSubcommand === "set-link") {
790
790
  const url = sessionArgs[1];
@@ -793,7 +793,7 @@ async function handleSessionCommand() {
793
793
  process.exit(1);
794
794
  }
795
795
  const label = sessionArgs[2] && !sessionArgs[2].startsWith("--") ? sessionArgs[2] : void 0;
796
- const { sessionSetLink } = await import('./agentCommands-B0x3og03.mjs');
796
+ const { sessionSetLink } = await import('./agentCommands-BPpgoGxT.mjs');
797
797
  await sessionSetLink(url, label);
798
798
  } else if (sessionSubcommand === "notify") {
799
799
  const message = sessionArgs[1];
@@ -802,7 +802,7 @@ async function handleSessionCommand() {
802
802
  process.exit(1);
803
803
  }
804
804
  const level = parseFlagStr("--level") || "info";
805
- const { sessionNotify } = await import('./agentCommands-B0x3og03.mjs');
805
+ const { sessionNotify } = await import('./agentCommands-BPpgoGxT.mjs');
806
806
  await sessionNotify(message, level);
807
807
  } else if (sessionSubcommand === "broadcast") {
808
808
  const action = sessionArgs[1];
@@ -810,7 +810,7 @@ async function handleSessionCommand() {
810
810
  console.error("Usage: svamp session broadcast <action> [args...]\nActions: open-canvas <url> [label], close-canvas, toast <message>");
811
811
  process.exit(1);
812
812
  }
813
- const { sessionBroadcast } = await import('./agentCommands-B0x3og03.mjs');
813
+ const { sessionBroadcast } = await import('./agentCommands-BPpgoGxT.mjs');
814
814
  await sessionBroadcast(action, sessionArgs.slice(2).filter((a) => !a.startsWith("--")));
815
815
  } else if (sessionSubcommand === "inbox") {
816
816
  const inboxSubcmd = sessionArgs[1];
@@ -821,7 +821,7 @@ async function handleSessionCommand() {
821
821
  process.exit(1);
822
822
  }
823
823
  if (agentSessionId) {
824
- const { inboxSend } = await import('./agentCommands-B0x3og03.mjs');
824
+ const { inboxSend } = await import('./agentCommands-BPpgoGxT.mjs');
825
825
  await inboxSend(sessionArgs[2], {
826
826
  body: sessionArgs[3],
827
827
  subject: parseFlagStr("--subject"),
@@ -836,7 +836,7 @@ async function handleSessionCommand() {
836
836
  }
837
837
  } else if (inboxSubcmd === "list" || inboxSubcmd === "ls") {
838
838
  if (agentSessionId && !sessionArgs[2]) {
839
- const { inboxList } = await import('./agentCommands-B0x3og03.mjs');
839
+ const { inboxList } = await import('./agentCommands-BPpgoGxT.mjs');
840
840
  await inboxList({
841
841
  unread: hasFlag("--unread"),
842
842
  limit: parseFlagInt("--limit"),
@@ -858,7 +858,7 @@ async function handleSessionCommand() {
858
858
  process.exit(1);
859
859
  }
860
860
  if (agentSessionId && !sessionArgs[3]) {
861
- const { inboxList } = await import('./agentCommands-B0x3og03.mjs');
861
+ const { inboxList } = await import('./agentCommands-BPpgoGxT.mjs');
862
862
  await sessionInboxRead(agentSessionId, sessionArgs[2], targetMachineId);
863
863
  } else if (sessionArgs[3]) {
864
864
  await sessionInboxRead(sessionArgs[2], sessionArgs[3], targetMachineId);
@@ -868,7 +868,7 @@ async function handleSessionCommand() {
868
868
  }
869
869
  } else if (inboxSubcmd === "reply") {
870
870
  if (agentSessionId && sessionArgs[2] && sessionArgs[3] && !sessionArgs[4]) {
871
- const { inboxReply } = await import('./agentCommands-B0x3og03.mjs');
871
+ const { inboxReply } = await import('./agentCommands-BPpgoGxT.mjs');
872
872
  await inboxReply(sessionArgs[2], sessionArgs[3]);
873
873
  } else if (sessionArgs[2] && sessionArgs[3] && sessionArgs[4]) {
874
874
  await sessionInboxReply(sessionArgs[2], sessionArgs[3], sessionArgs[4], targetMachineId);
@@ -904,7 +904,7 @@ async function handleMachineCommand() {
904
904
  return;
905
905
  }
906
906
  if (machineSubcommand === "share") {
907
- const { machineShare } = await import('./commands-v4NWBPB2.mjs');
907
+ const { machineShare } = await import('./commands-BSfZg4aa.mjs');
908
908
  let machineId;
909
909
  const shareArgs = [];
910
910
  for (let i = 1; i < machineArgs.length; i++) {
@@ -934,7 +934,7 @@ async function handleMachineCommand() {
934
934
  }
935
935
  await machineShare(machineId, { add, remove, list, configPath, showConfig });
936
936
  } else if (machineSubcommand === "exec") {
937
- const { machineExec } = await import('./commands-v4NWBPB2.mjs');
937
+ const { machineExec } = await import('./commands-BSfZg4aa.mjs');
938
938
  let machineId;
939
939
  let cwd;
940
940
  const cmdParts = [];
@@ -954,7 +954,7 @@ async function handleMachineCommand() {
954
954
  }
955
955
  await machineExec(machineId, command, cwd);
956
956
  } else if (machineSubcommand === "info") {
957
- const { machineInfo } = await import('./commands-v4NWBPB2.mjs');
957
+ const { machineInfo } = await import('./commands-BSfZg4aa.mjs');
958
958
  let machineId;
959
959
  for (let i = 1; i < machineArgs.length; i++) {
960
960
  if ((machineArgs[i] === "--machine" || machineArgs[i] === "-m") && i + 1 < machineArgs.length) {
@@ -974,10 +974,10 @@ async function handleMachineCommand() {
974
974
  level = machineArgs[++i];
975
975
  }
976
976
  }
977
- const { machineNotify } = await import('./agentCommands-B0x3og03.mjs');
977
+ const { machineNotify } = await import('./agentCommands-BPpgoGxT.mjs');
978
978
  await machineNotify(message, level);
979
979
  } else if (machineSubcommand === "ls") {
980
- const { machineLs } = await import('./commands-v4NWBPB2.mjs');
980
+ const { machineLs } = await import('./commands-BSfZg4aa.mjs');
981
981
  let machineId;
982
982
  let showHidden = false;
983
983
  let path;
@@ -1035,24 +1035,24 @@ Examples:
1035
1035
  };
1036
1036
  const hasFlag = (name) => fleetArgs.includes(`--${name}`);
1037
1037
  if (sub === "status") {
1038
- const { fleetStatus } = await import('./fleet-BPLL0ecA.mjs');
1038
+ const { fleetStatus } = await import('./fleet-DDYoKg0Q.mjs');
1039
1039
  await fleetStatus();
1040
1040
  } else if (sub === "exec") {
1041
1041
  const command = fleetArgs.slice(1).filter((a) => !a.startsWith("--")).join(" ");
1042
- const { fleetExec } = await import('./fleet-BPLL0ecA.mjs');
1042
+ const { fleetExec } = await import('./fleet-DDYoKg0Q.mjs');
1043
1043
  await fleetExec(command, { cwd: flag("cwd") });
1044
1044
  } else if (sub === "upgrade-claude") {
1045
- const { fleetUpgradeClaude } = await import('./fleet-BPLL0ecA.mjs');
1045
+ const { fleetUpgradeClaude } = await import('./fleet-DDYoKg0Q.mjs');
1046
1046
  await fleetUpgradeClaude({ version: flag("version", "-v") });
1047
1047
  } else if (sub === "upgrade-svamp") {
1048
- const { fleetUpgradeSvamp } = await import('./fleet-BPLL0ecA.mjs');
1048
+ const { fleetUpgradeSvamp } = await import('./fleet-DDYoKg0Q.mjs');
1049
1049
  await fleetUpgradeSvamp({ version: flag("version", "-v"), excludeSelf: hasFlag("exclude-self") });
1050
1050
  } else if (sub === "daemon-restart") {
1051
- const { fleetDaemonRestart } = await import('./fleet-BPLL0ecA.mjs');
1051
+ const { fleetDaemonRestart } = await import('./fleet-DDYoKg0Q.mjs');
1052
1052
  await fleetDaemonRestart({ graceful: !hasFlag("cleanup") });
1053
1053
  } else if (sub === "push-skill") {
1054
1054
  const name = fleetArgs[1];
1055
- const { fleetPushSkill } = await import('./fleet-BPLL0ecA.mjs');
1055
+ const { fleetPushSkill } = await import('./fleet-DDYoKg0Q.mjs');
1056
1056
  await fleetPushSkill(name);
1057
1057
  } else {
1058
1058
  console.error(`Unknown fleet subcommand: ${sub}`);
@@ -1065,10 +1065,10 @@ async function handleSkillsCommand() {
1065
1065
  const skillsArgs = args.slice(1);
1066
1066
  const skillsSubcommand = skillsArgs[0];
1067
1067
  if (!skillsSubcommand || skillsSubcommand === "--help" || skillsSubcommand === "-h") {
1068
- printSkillsHelp();
1068
+ await printSkillsHelp();
1069
1069
  return;
1070
1070
  }
1071
- const { skillsFind, skillsInstall, skillsList, skillsRemove, skillsPublish } = await import('./commands-GMLad6_u.mjs');
1071
+ const { skillsFind, skillsInstall, skillsList, skillsRemove, skillsPublish } = await import('./commands-BXwzw3Mu.mjs');
1072
1072
  if (skillsSubcommand === "find" || skillsSubcommand === "search") {
1073
1073
  const query = skillsArgs.slice(1).filter((a) => !a.startsWith("--")).join(" ");
1074
1074
  if (!query) {
@@ -1101,7 +1101,7 @@ async function handleSkillsCommand() {
1101
1101
  await skillsPublish(publishArgs[0], { version: versionTag });
1102
1102
  } else {
1103
1103
  console.error(`Unknown skills command: ${skillsSubcommand}`);
1104
- printSkillsHelp();
1104
+ await printSkillsHelp();
1105
1105
  process.exit(1);
1106
1106
  }
1107
1107
  process.exit(0);
@@ -1514,7 +1514,7 @@ async function applyClaudeAuthFlags(argv) {
1514
1514
  "--use-hypha-proxy, --use-claude-login, and --anthropic-base-url/--anthropic-api-key are mutually exclusive"
1515
1515
  );
1516
1516
  }
1517
- const mod = await import('./run-ChG07q23.mjs').then(function (n) { return n.t; });
1517
+ const mod = await import('./run-BvocESxe.mjs').then(function (n) { return n.I; });
1518
1518
  if (hasHypha) {
1519
1519
  let url;
1520
1520
  const hyphaIdx = argv.indexOf("--use-hypha-proxy");
@@ -1568,7 +1568,7 @@ async function applyDaemonShareFlag(argv) {
1568
1568
  }
1569
1569
  }
1570
1570
  if (collected.length === 0) return;
1571
- const { updateEnvFile } = await import('./run-ChG07q23.mjs').then(function (n) { return n.t; });
1571
+ const { updateEnvFile } = await import('./run-BvocESxe.mjs').then(function (n) { return n.I; });
1572
1572
  const seen = /* @__PURE__ */ new Set();
1573
1573
  const deduped = collected.filter((e) => {
1574
1574
  const k = e.toLowerCase();
@@ -1581,7 +1581,7 @@ async function applyDaemonShareFlag(argv) {
1581
1581
  }
1582
1582
  async function handleDaemonAuthCommand(argv) {
1583
1583
  const sub = (argv[0] || "status").toLowerCase();
1584
- const mod = await import('./run-ChG07q23.mjs').then(function (n) { return n.t; });
1584
+ const mod = await import('./run-BvocESxe.mjs').then(function (n) { return n.I; });
1585
1585
  if (sub === "--help" || sub === "-h" || sub === "help") {
1586
1586
  console.log(`
1587
1587
  svamp daemon auth \u2014 Configure how Claude subprocesses authenticate
@@ -1871,7 +1871,13 @@ Examples:
1871
1871
  svamp machine share --config ./security-context.json
1872
1872
  `);
1873
1873
  }
1874
- function printSkillsHelp() {
1874
+ async function printSkillsHelp() {
1875
+ let browseUrl = "<HYPHA_SERVER_URL>/<workspace>/artifacts/marketplace (set HYPHA_SERVER_URL)";
1876
+ try {
1877
+ const { getArtifactBaseUrl, SKILLS_COLLECTION } = await import('./run-BvocESxe.mjs').then(function (n) { return n.J; });
1878
+ browseUrl = `${getArtifactBaseUrl()}/${SKILLS_COLLECTION}`;
1879
+ } catch {
1880
+ }
1875
1881
  console.log(`
1876
1882
  svamp skills \u2014 Agent skills marketplace
1877
1883
 
@@ -1886,7 +1892,7 @@ Skills are stored in ~/.claude/skills/ and automatically detected by Claude Code
1886
1892
  Each skill contains a SKILL.md file with instructions and metadata.
1887
1893
  Skills use git-backed storage \u2014 you can also clone and push via git.
1888
1894
 
1889
- Browse online: https://hypha.aicell.io/hypha-cloud/artifacts/marketplace
1895
+ Browse online: ${browseUrl}
1890
1896
 
1891
1897
  Examples:
1892
1898
  svamp skills find "code review"
@@ -58,7 +58,7 @@ async function serviceExpose(args) {
58
58
  process.exit(1);
59
59
  }
60
60
  if (foreground) {
61
- const { runFrpcTunnel } = await import('./frpc-j60b46eU.mjs');
61
+ const { runFrpcTunnel } = await import('./frpc-DPfGAdlj.mjs');
62
62
  await runFrpcTunnel(name, ports, void 0, {
63
63
  group,
64
64
  groupKey,
@@ -68,7 +68,7 @@ async function serviceExpose(args) {
68
68
  });
69
69
  return;
70
70
  }
71
- const { connectAndGetMachine } = await import('./commands-v4NWBPB2.mjs');
71
+ const { connectAndGetMachine } = await import('./commands-BSfZg4aa.mjs');
72
72
  const { server, machine } = await connectAndGetMachine();
73
73
  try {
74
74
  const status = await machine.tunnelStart({
@@ -123,7 +123,7 @@ async function serviceServe(args) {
123
123
  };
124
124
  process.on("SIGINT", cleanup);
125
125
  process.on("SIGTERM", cleanup);
126
- const { runFrpcTunnel } = await import('./frpc-j60b46eU.mjs');
126
+ const { runFrpcTunnel } = await import('./frpc-DPfGAdlj.mjs');
127
127
  await runFrpcTunnel(name, [caddyPort]);
128
128
  } catch (err) {
129
129
  console.error(`Error serving directory: ${err.message}`);
@@ -132,7 +132,7 @@ async function serviceServe(args) {
132
132
  }
133
133
  async function serviceList(_args) {
134
134
  try {
135
- const { connectAndGetMachine } = await import('./commands-v4NWBPB2.mjs');
135
+ const { connectAndGetMachine } = await import('./commands-BSfZg4aa.mjs');
136
136
  const { server, machine } = await connectAndGetMachine();
137
137
  try {
138
138
  const tunnels = await machine.tunnelList({});
@@ -161,7 +161,7 @@ async function serviceDelete(args) {
161
161
  process.exit(1);
162
162
  }
163
163
  try {
164
- const { connectAndGetMachine } = await import('./commands-v4NWBPB2.mjs');
164
+ const { connectAndGetMachine } = await import('./commands-BSfZg4aa.mjs');
165
165
  const { server, machine } = await connectAndGetMachine();
166
166
  try {
167
167
  await machine.tunnelStop({ name });
@@ -2,7 +2,7 @@ import { existsSync, readFileSync } from 'node:fs';
2
2
  import { execSync } from 'node:child_process';
3
3
  import { resolve, join } from 'node:path';
4
4
  import os from 'node:os';
5
- import { n as normalizeAllowedUser, l as loadSecurityContextConfig, e as resolveSecurityContext, f as buildSecurityContextFromFlags, m as mergeSecurityContexts, c as connectToHypha, i as buildSessionShareUrl, j as buildMachineShareUrl } from './run-ChG07q23.mjs';
5
+ import { v as normalizeAllowedUser, w as loadSecurityContextConfig, x as resolveSecurityContext, y as buildSecurityContextFromFlags, z as mergeSecurityContexts, c as connectToHypha, A as buildSessionShareUrl, B as buildMachineShareUrl } from './run-BvocESxe.mjs';
6
6
  import 'os';
7
7
  import 'fs/promises';
8
8
  import 'fs';
@@ -1,129 +1,24 @@
1
1
  import os from 'os';
2
2
  import fs__default from 'fs';
3
- import { join, resolve, relative } from 'path';
4
-
5
- const SKILLS_SERVER = process.env.HYPHA_SKILLS_SERVER || "https://hypha.aicell.io";
6
- const SKILLS_WORKSPACE = process.env.HYPHA_SKILLS_WORKSPACE || "hypha-cloud";
7
- const SKILLS_COLLECTION = process.env.HYPHA_SKILLS_COLLECTION || "marketplace";
8
- const SKILLS_DIR = join(os.homedir(), ".claude", "skills");
9
- function getArtifactBaseUrl() {
10
- return `${SKILLS_SERVER}/${SKILLS_WORKSPACE}/artifacts`;
11
- }
12
- async function fetchWithTimeout(url, options = {}, timeoutMs = 3e4) {
13
- const controller = new AbortController();
14
- const timer = setTimeout(() => controller.abort(), timeoutMs);
15
- try {
16
- return await fetch(url, { ...options, signal: controller.signal });
17
- } catch (err) {
18
- if (err.name === "AbortError") throw new Error(`Request timed out after ${timeoutMs}ms: ${url}`);
19
- throw err;
20
- } finally {
21
- clearTimeout(timer);
22
- }
23
- }
24
- function parseFrontmatter(content) {
25
- const match = content.match(/^---\s*\n([\s\S]*?)\n---/);
26
- if (!match) return null;
27
- const yaml = match[1];
28
- const result = {};
29
- let currentKey = null;
30
- let nestedObj = null;
31
- for (const line of yaml.split("\n")) {
32
- if (!line.trim() || line.trim().startsWith("#")) continue;
33
- const indentMatch = line.match(/^(\s*)/);
34
- const indent = indentMatch ? indentMatch[1].length : 0;
35
- if (indent > 0 && currentKey && nestedObj !== null) {
36
- const kvMatch2 = line.trim().match(/^([^:]+):\s*(.*)$/);
37
- if (kvMatch2) {
38
- nestedObj[kvMatch2[1].trim()] = kvMatch2[2].trim().replace(/^["']|["']$/g, "");
39
- }
40
- continue;
41
- }
42
- if (nestedObj !== null && currentKey) {
43
- result[currentKey] = nestedObj;
44
- nestedObj = null;
45
- currentKey = null;
46
- }
47
- const kvMatch = line.match(/^([^:]+):\s*(.*)$/);
48
- if (!kvMatch) continue;
49
- const key = kvMatch[1].trim();
50
- const value = kvMatch[2].trim();
51
- if (!value) {
52
- currentKey = key;
53
- nestedObj = {};
54
- } else {
55
- result[key] = value.replace(/^["']|["']$/g, "");
56
- }
57
- }
58
- if (nestedObj !== null && currentKey) {
59
- result[currentKey] = nestedObj;
60
- }
61
- if (!result.name || typeof result.name !== "string") return null;
62
- if (!result.description || typeof result.description !== "string") return null;
63
- return result;
64
- }
65
- async function searchSkills(query) {
66
- const base = getArtifactBaseUrl();
67
- const filters = encodeURIComponent(JSON.stringify({ type: "skill" }));
68
- const url = `${base}/${SKILLS_COLLECTION}/children?keywords=${encodeURIComponent(query)}&filters=${filters}&limit=50`;
69
- const resp = await fetchWithTimeout(url);
70
- if (!resp.ok) {
71
- if (resp.status === 404) return [];
72
- throw new Error(`Search failed: ${resp.status} ${resp.statusText}`);
73
- }
74
- const data = await resp.json();
75
- return normalizeSkillList(Array.isArray(data) ? data : data.items || []);
76
- }
77
- async function getSkillInfo(skillAlias) {
78
- const base = getArtifactBaseUrl();
79
- const url = `${base}/${skillAlias}`;
80
- const resp = await fetchWithTimeout(url);
81
- if (!resp.ok) {
82
- if (resp.status === 404) return null;
83
- throw new Error(`Get skill failed: ${resp.status} ${resp.statusText}`);
84
- }
85
- const data = await resp.json();
86
- return normalizeSkill(data);
87
- }
88
- async function listSkillFiles(skillAlias, dir = "") {
89
- const base = getArtifactBaseUrl();
90
- const pathPart = dir ? `/${dir}/` : "/";
91
- const url = `${base}/${skillAlias}/files${pathPart}`;
92
- const resp = await fetchWithTimeout(url);
93
- if (!resp.ok) {
94
- throw new Error(`List files failed: ${resp.status} ${resp.statusText}`);
95
- }
96
- const data = await resp.json();
97
- return Array.isArray(data) ? data : data.items || [];
98
- }
99
- async function downloadSkillFile(skillAlias, filePath) {
100
- const base = getArtifactBaseUrl();
101
- const url = `${base}/${skillAlias}/files/${filePath}`;
102
- const resp = await fetchWithTimeout(url, { redirect: "follow" }, 6e4);
103
- if (!resp.ok) {
104
- throw new Error(`Download failed for ${filePath}: ${resp.status} ${resp.statusText}`);
105
- }
106
- return await resp.text();
107
- }
108
- function normalizeSkillList(items) {
109
- return items.map(normalizeSkill).filter((s) => s !== null);
110
- }
111
- function normalizeSkill(item) {
112
- if (!item) return null;
113
- const manifest = item.manifest || {};
114
- return {
115
- alias: item.alias || manifest.name || item.id || "unknown",
116
- name: manifest.name || item.alias || "unknown",
117
- description: manifest.description || "",
118
- author: manifest.metadata?.author || manifest.author,
119
- version: manifest.metadata?.version || manifest.version,
120
- tags: manifest.tags,
121
- created_at: item.created_at,
122
- last_modified: item.last_modified,
123
- versions: item.versions,
124
- git_url: item.git_url
125
- };
126
- }
3
+ import { resolve, join, relative } from 'path';
4
+ import { p as parseFrontmatter, j as getSkillsServer, k as SKILLS_WORKSPACE, l as SKILLS_COLLECTION, m as fetchWithTimeout, n as searchSkills, o as SKILLS_DIR, q as getSkillInfo, t as downloadSkillFile, u as listSkillFiles } from './run-BvocESxe.mjs';
5
+ import 'fs/promises';
6
+ import 'url';
7
+ import 'child_process';
8
+ import 'crypto';
9
+ import 'node:fs';
10
+ import 'util';
11
+ import 'node:crypto';
12
+ import 'node:path';
13
+ import 'node:child_process';
14
+ import '@agentclientprotocol/sdk';
15
+ import 'node:os';
16
+ import '@modelcontextprotocol/sdk/client/index.js';
17
+ import '@modelcontextprotocol/sdk/client/stdio.js';
18
+ import '@modelcontextprotocol/sdk/types.js';
19
+ import 'zod';
20
+ import 'node:fs/promises';
21
+ import 'node:util';
127
22
 
128
23
  const SVAMP_HOME = process.env.SVAMP_HOME || join(os.homedir(), ".svamp");
129
24
  const ENV_FILE = join(SVAMP_HOME, ".env");
@@ -373,7 +268,7 @@ async function skillsPublish(skillPath, opts) {
373
268
  console.error('Not logged in. Run "svamp login <url>" first.');
374
269
  process.exit(1);
375
270
  }
376
- const serverUrl = process.env.HYPHA_SERVER_URL || SKILLS_SERVER;
271
+ const serverUrl = process.env.HYPHA_SERVER_URL || getSkillsServer();
377
272
  let server;
378
273
  try {
379
274
  const mod = await import('hypha-rpc');
@@ -503,9 +398,10 @@ async function skillsPublish(skillPath, opts) {
503
398
  await server.disconnect();
504
399
  process.exit(1);
505
400
  }
401
+ const skillsServer = getSkillsServer();
506
402
  console.log(`Published "${manifest.name}" (${uploaded} files)${versionTag ? ` as ${versionTag}` : ""}`);
507
- console.log(` View: ${SKILLS_SERVER}/${SKILLS_WORKSPACE}/artifacts/${manifest.name}`);
508
- const gitUrl = `${SKILLS_SERVER}/${SKILLS_WORKSPACE}/git/${manifest.name}`;
403
+ console.log(` View: ${skillsServer}/${SKILLS_WORKSPACE}/artifacts/${manifest.name}`);
404
+ const gitUrl = `${skillsServer}/${SKILLS_WORKSPACE}/git/${manifest.name}`;
509
405
  console.log(` Git: ${gitUrl}`);
510
406
  if (isUpdate) {
511
407
  console.log(` Tip: Use --version <tag> to publish a named version.`);
@@ -1,11 +1,11 @@
1
1
  import { writeFileSync, readFileSync } from 'fs';
2
2
  import { resolve } from 'path';
3
- import { connectAndGetMachine } from './commands-v4NWBPB2.mjs';
3
+ import { connectAndGetMachine } from './commands-BSfZg4aa.mjs';
4
4
  import 'node:fs';
5
5
  import 'node:child_process';
6
6
  import 'node:path';
7
7
  import 'node:os';
8
- import './run-ChG07q23.mjs';
8
+ import './run-BvocESxe.mjs';
9
9
  import 'os';
10
10
  import 'fs/promises';
11
11
  import 'url';
@@ -1,7 +1,7 @@
1
1
  import { existsSync, readFileSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
3
  import os from 'node:os';
4
- import { c as connectToHypha } from './run-ChG07q23.mjs';
4
+ import { c as connectToHypha } from './run-BvocESxe.mjs';
5
5
  import { PINNED_CLAUDE_CODE_VERSION } from './pinnedClaudeCode-HydRNEt7.mjs';
6
6
  import 'os';
7
7
  import 'fs/promises';
@@ -3,6 +3,22 @@ import { mkdirSync, writeFileSync, unlinkSync, existsSync, chmodSync, readFileSy
3
3
  import { join } from 'path';
4
4
  import { homedir, platform, arch } from 'os';
5
5
  import { createHash, randomUUID } from 'crypto';
6
+ import { e as getFrpsSubdomainHost, f as getFrpsServerAddr } from './run-BvocESxe.mjs';
7
+ import 'fs/promises';
8
+ import 'url';
9
+ import 'node:fs';
10
+ import 'util';
11
+ import 'node:crypto';
12
+ import 'node:path';
13
+ import 'node:child_process';
14
+ import '@agentclientprotocol/sdk';
15
+ import 'node:os';
16
+ import '@modelcontextprotocol/sdk/client/index.js';
17
+ import '@modelcontextprotocol/sdk/client/stdio.js';
18
+ import '@modelcontextprotocol/sdk/types.js';
19
+ import 'zod';
20
+ import 'node:fs/promises';
21
+ import 'node:util';
6
22
 
7
23
  function getMachineFingerprint() {
8
24
  const idFile = join(homedir(), ".svamp", "machine-id");
@@ -25,7 +41,7 @@ const FRPC_BIN = join(BIN_DIR, platform() === "win32" ? "frpc.exe" : "frpc");
25
41
  function isInCluster() {
26
42
  return !!(process.env.KUBERNETES_SERVICE_HOST || process.env.SANDBOX_ID);
27
43
  }
28
- const DEFAULT_FRPS_ADDR = isInCluster() ? "frps.hypha.svc.cluster.local" : "frps-ctrl.svc.hypha.aicell.io";
44
+ const FRPS_CLUSTER_ADDR = "frps.hypha.svc.cluster.local";
29
45
  const DEFAULT_FRPS_PORT = isInCluster() ? 7e3 : 443;
30
46
  const FRPS_PUBLIC_TOKEN = "hypha-frps-public";
31
47
  function getFrpcDownloadUrl() {
@@ -212,11 +228,11 @@ class FrpcTunnel {
212
228
  this.log = options.log || ((msg) => console.log(`[FRPC] ${msg}`));
213
229
  const hyphaToken = options.serverConfig?.hyphaToken || process.env.HYPHA_TOKEN || "";
214
230
  this.serverConfig = {
215
- serverAddr: options.serverConfig?.serverAddr || process.env.FRPS_SERVER_ADDR || DEFAULT_FRPS_ADDR,
231
+ serverAddr: options.serverConfig?.serverAddr || process.env.FRPS_SERVER_ADDR || (isInCluster() ? FRPS_CLUSTER_ADDR : getFrpsServerAddr()),
216
232
  serverPort: options.serverConfig?.serverPort || parseInt(process.env.FRPS_SERVER_PORT || "", 10) || DEFAULT_FRPS_PORT,
217
233
  authToken: options.serverConfig?.authToken || process.env.FRPS_AUTH_TOKEN || FRPS_PUBLIC_TOKEN,
218
234
  hyphaToken,
219
- subDomainHost: options.serverConfig?.subDomainHost || process.env.FRPS_SUBDOMAIN_HOST || "svc.hypha.aicell.io"
235
+ subDomainHost: options.serverConfig?.subDomainHost || process.env.FRPS_SUBDOMAIN_HOST || getFrpsSubdomainHost()
220
236
  };
221
237
  if (!this.serverConfig.hyphaToken) {
222
238
  throw new Error(
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- export { c as connectToHypha, d as daemonStatus, g as getHyphaServerUrl, r as registerMachineService, a as registerSessionService, s as startDaemon, b as stopDaemon } from './run-ChG07q23.mjs';
1
+ export { c as connectToHypha, d as daemonStatus, g as getHyphaServerUrl, r as registerMachineService, a as registerSessionService, s as startDaemon, b as stopDaemon } from './run-BvocESxe.mjs';
2
2
  import 'os';
3
3
  import 'fs/promises';
4
4
  import 'fs';
@@ -1,5 +1,5 @@
1
1
  var name = "svamp-cli";
2
- var version = "0.2.81";
2
+ var version = "0.2.82";
3
3
  var description = "Svamp CLI — AI workspace daemon on Hypha Cloud";
4
4
  var author = "Amun AI AB";
5
5
  var license = "SEE LICENSE IN LICENSE";
@@ -1,8 +1,8 @@
1
- import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(import.meta.url);import os$1 from 'os';
1
+ import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(import.meta.url);import os from 'os';
2
2
  import fs, { mkdir as mkdir$1, readdir as readdir$1, readFile, writeFile as writeFile$1, rename, unlink } from 'fs/promises';
3
3
  import { readFileSync as readFileSync$1, mkdirSync, writeFileSync, renameSync, existsSync as existsSync$1, copyFileSync, unlinkSync as unlinkSync$1, watch, rmdirSync, readdirSync } from 'fs';
4
4
  import path__default, { join, dirname, resolve, basename } from 'path';
5
- import { fileURLToPath } from 'url';
5
+ import { URL as URL$1, fileURLToPath } from 'url';
6
6
  import { execFile, spawn as spawn$1, execSync as execSync$1 } from 'child_process';
7
7
  import { randomUUID as randomUUID$1 } from 'crypto';
8
8
  import { existsSync, readFileSync, writeFileSync as writeFileSync$1, mkdirSync as mkdirSync$1, appendFileSync, unlinkSync } from 'node:fs';
@@ -11,7 +11,7 @@ import { randomUUID, createHash } from 'node:crypto';
11
11
  import { join as join$1 } from 'node:path';
12
12
  import { spawn, execSync, execFile as execFile$1, execFileSync } from 'node:child_process';
13
13
  import { ndJsonStream, ClientSideConnection } from '@agentclientprotocol/sdk';
14
- import os, { homedir, platform } from 'node:os';
14
+ import os$1, { homedir, platform } from 'node:os';
15
15
  import { Client } from '@modelcontextprotocol/sdk/client/index.js';
16
16
  import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
17
17
  import { ElicitRequestSchema } from '@modelcontextprotocol/sdk/types.js';
@@ -63,7 +63,7 @@ function parseWorkspaceFromToken(token) {
63
63
  return void 0;
64
64
  }
65
65
  }
66
- function getHyphaServerUrl() {
66
+ function getHyphaServerUrl$1() {
67
67
  return process.env.HYPHA_SERVER_URL || "http://localhost:9527";
68
68
  }
69
69
 
@@ -1393,7 +1393,7 @@ async function registerMachineService(server, machineId, metadata, daemonState,
1393
1393
  const tunnels = handlers.tunnels;
1394
1394
  if (!tunnels) throw new Error("Tunnel management not available");
1395
1395
  if (tunnels.has(params.name)) throw new Error(`Tunnel '${params.name}' already running`);
1396
- const { FrpcTunnel } = await import('./frpc-j60b46eU.mjs');
1396
+ const { FrpcTunnel } = await import('./frpc-DPfGAdlj.mjs');
1397
1397
  const tunnel = new FrpcTunnel({
1398
1398
  name: params.name,
1399
1399
  ports: params.ports,
@@ -5543,11 +5543,57 @@ var claudeAuth = /*#__PURE__*/Object.freeze({
5543
5543
  updateEnvFile: updateEnvFile
5544
5544
  });
5545
5545
 
5546
- const DEFAULT_WEB_BASE = "https://svamp.hypha.aicell.io";
5546
+ function getHyphaServerUrl() {
5547
+ const raw = (process.env.HYPHA_SERVER_URL || "").trim();
5548
+ return raw ? raw.replace(/\/+$/, "") : void 0;
5549
+ }
5550
+ function getHyphaHostname() {
5551
+ const url = getHyphaServerUrl();
5552
+ if (!url) return void 0;
5553
+ try {
5554
+ return new URL$1(url).hostname || void 0;
5555
+ } catch {
5556
+ return void 0;
5557
+ }
5558
+ }
5559
+ function deriveOrThrow(prefix, envVar, purpose) {
5560
+ const host = getHyphaHostname();
5561
+ if (host) return prefix ? `${prefix}.${host}` : host;
5562
+ throw new Error(
5563
+ `Cannot determine ${purpose}: set ${envVar} explicitly, or set HYPHA_SERVER_URL so it can be derived. No hostname is hardcoded as a fallback.`
5564
+ );
5565
+ }
5566
+ function getFrpsSubdomainHost() {
5567
+ const explicit = (process.env.FRPS_SUBDOMAIN_HOST || "").trim();
5568
+ if (explicit) return explicit;
5569
+ return deriveOrThrow("svc", "FRPS_SUBDOMAIN_HOST", "frps subdomain host");
5570
+ }
5571
+ function getFrpsServerAddr() {
5572
+ const explicit = (process.env.FRPS_SERVER_ADDR || "").trim();
5573
+ if (explicit) return explicit;
5574
+ return `frps-ctrl.${getFrpsSubdomainHost()}`;
5575
+ }
5576
+ function getSvampWebBaseUrl() {
5577
+ const explicit = (process.env.SVAMP_WEB_URL || "").trim();
5578
+ if (explicit) return explicit.replace(/\/+$/, "");
5579
+ const host = getHyphaHostname();
5580
+ if (host) return `https://svamp.${host}`;
5581
+ throw new Error(
5582
+ "Cannot determine Svamp web base URL: set SVAMP_WEB_URL explicitly, or set HYPHA_SERVER_URL so it can be derived (https://svamp.<host>). No hostname is hardcoded as a fallback."
5583
+ );
5584
+ }
5585
+ function getSkillsServerUrl() {
5586
+ const explicit = (process.env.HYPHA_SKILLS_SERVER || "").trim();
5587
+ if (explicit) return explicit.replace(/\/+$/, "");
5588
+ const server = getHyphaServerUrl();
5589
+ if (server) return server;
5590
+ throw new Error(
5591
+ "Cannot determine skills marketplace server: set HYPHA_SKILLS_SERVER or HYPHA_SERVER_URL. No hostname is hardcoded as a fallback."
5592
+ );
5593
+ }
5594
+
5547
5595
  function getShareBaseUrl() {
5548
- const fromEnv = (process.env.SVAMP_WEB_URL || "").trim();
5549
- const base = fromEnv || DEFAULT_WEB_BASE;
5550
- return base.replace(/\/+$/, "");
5596
+ return getSvampWebBaseUrl();
5551
5597
  }
5552
5598
  function buildSessionShareUrl(input) {
5553
5599
  const params = new URLSearchParams();
@@ -5930,6 +5976,170 @@ function escapeHtml(s) {
5930
5976
  return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
5931
5977
  }
5932
5978
 
5979
+ const SKILLS_WORKSPACE = process.env.HYPHA_SKILLS_WORKSPACE || "hypha-cloud";
5980
+ const SKILLS_COLLECTION = process.env.HYPHA_SKILLS_COLLECTION || "marketplace";
5981
+ const SKILLS_DIR = join(os.homedir(), ".claude", "skills");
5982
+ function getSkillsServer() {
5983
+ return getSkillsServerUrl();
5984
+ }
5985
+ function getArtifactBaseUrl() {
5986
+ return `${getSkillsServer()}/${SKILLS_WORKSPACE}/artifacts`;
5987
+ }
5988
+ async function fetchWithTimeout(url, options = {}, timeoutMs = 3e4) {
5989
+ const controller = new AbortController();
5990
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
5991
+ try {
5992
+ return await fetch(url, { ...options, signal: controller.signal });
5993
+ } catch (err) {
5994
+ if (err.name === "AbortError") throw new Error(`Request timed out after ${timeoutMs}ms: ${url}`);
5995
+ throw err;
5996
+ } finally {
5997
+ clearTimeout(timer);
5998
+ }
5999
+ }
6000
+ function parseFrontmatter(content) {
6001
+ const match = content.match(/^---\s*\n([\s\S]*?)\n---/);
6002
+ if (!match) return null;
6003
+ const yaml = match[1];
6004
+ const result = {};
6005
+ let currentKey = null;
6006
+ let nestedObj = null;
6007
+ for (const line of yaml.split("\n")) {
6008
+ if (!line.trim() || line.trim().startsWith("#")) continue;
6009
+ const indentMatch = line.match(/^(\s*)/);
6010
+ const indent = indentMatch ? indentMatch[1].length : 0;
6011
+ if (indent > 0 && currentKey && nestedObj !== null) {
6012
+ const kvMatch2 = line.trim().match(/^([^:]+):\s*(.*)$/);
6013
+ if (kvMatch2) {
6014
+ nestedObj[kvMatch2[1].trim()] = kvMatch2[2].trim().replace(/^["']|["']$/g, "");
6015
+ }
6016
+ continue;
6017
+ }
6018
+ if (nestedObj !== null && currentKey) {
6019
+ result[currentKey] = nestedObj;
6020
+ nestedObj = null;
6021
+ currentKey = null;
6022
+ }
6023
+ const kvMatch = line.match(/^([^:]+):\s*(.*)$/);
6024
+ if (!kvMatch) continue;
6025
+ const key = kvMatch[1].trim();
6026
+ const value = kvMatch[2].trim();
6027
+ if (!value) {
6028
+ currentKey = key;
6029
+ nestedObj = {};
6030
+ } else {
6031
+ result[key] = value.replace(/^["']|["']$/g, "");
6032
+ }
6033
+ }
6034
+ if (nestedObj !== null && currentKey) {
6035
+ result[currentKey] = nestedObj;
6036
+ }
6037
+ if (!result.name || typeof result.name !== "string") return null;
6038
+ if (!result.description || typeof result.description !== "string") return null;
6039
+ return result;
6040
+ }
6041
+ async function searchSkills(query) {
6042
+ const base = getArtifactBaseUrl();
6043
+ const filters = encodeURIComponent(JSON.stringify({ type: "skill" }));
6044
+ const url = `${base}/${SKILLS_COLLECTION}/children?keywords=${encodeURIComponent(query)}&filters=${filters}&limit=50`;
6045
+ const resp = await fetchWithTimeout(url);
6046
+ if (!resp.ok) {
6047
+ if (resp.status === 404) return [];
6048
+ throw new Error(`Search failed: ${resp.status} ${resp.statusText}`);
6049
+ }
6050
+ const data = await resp.json();
6051
+ return normalizeSkillList(Array.isArray(data) ? data : data.items || []);
6052
+ }
6053
+ async function listAllSkills(offset = 0, limit = 100) {
6054
+ const base = getArtifactBaseUrl();
6055
+ const filters = encodeURIComponent(JSON.stringify({ type: "skill" }));
6056
+ const url = `${base}/${SKILLS_COLLECTION}/children?filters=${filters}&offset=${offset}&limit=${limit}`;
6057
+ const resp = await fetchWithTimeout(url);
6058
+ if (!resp.ok) {
6059
+ if (resp.status === 404) return [];
6060
+ throw new Error(`List failed: ${resp.status} ${resp.statusText}`);
6061
+ }
6062
+ const data = await resp.json();
6063
+ return normalizeSkillList(Array.isArray(data) ? data : data.items || []);
6064
+ }
6065
+ async function getSkillInfo(skillAlias) {
6066
+ const base = getArtifactBaseUrl();
6067
+ const url = `${base}/${skillAlias}`;
6068
+ const resp = await fetchWithTimeout(url);
6069
+ if (!resp.ok) {
6070
+ if (resp.status === 404) return null;
6071
+ throw new Error(`Get skill failed: ${resp.status} ${resp.statusText}`);
6072
+ }
6073
+ const data = await resp.json();
6074
+ return normalizeSkill(data);
6075
+ }
6076
+ async function listSkillFiles(skillAlias, dir = "") {
6077
+ const base = getArtifactBaseUrl();
6078
+ const pathPart = dir ? `/${dir}/` : "/";
6079
+ const url = `${base}/${skillAlias}/files${pathPart}`;
6080
+ const resp = await fetchWithTimeout(url);
6081
+ if (!resp.ok) {
6082
+ throw new Error(`List files failed: ${resp.status} ${resp.statusText}`);
6083
+ }
6084
+ const data = await resp.json();
6085
+ return Array.isArray(data) ? data : data.items || [];
6086
+ }
6087
+ async function downloadSkillFile(skillAlias, filePath) {
6088
+ const base = getArtifactBaseUrl();
6089
+ const url = `${base}/${skillAlias}/files/${filePath}`;
6090
+ const resp = await fetchWithTimeout(url, { redirect: "follow" }, 6e4);
6091
+ if (!resp.ok) {
6092
+ throw new Error(`Download failed for ${filePath}: ${resp.status} ${resp.statusText}`);
6093
+ }
6094
+ return await resp.text();
6095
+ }
6096
+ async function downloadSkillZip(skillAlias) {
6097
+ const base = getArtifactBaseUrl();
6098
+ const url = `${base}/${skillAlias}/create-zip-file`;
6099
+ const resp = await fetchWithTimeout(url, {}, 12e4);
6100
+ if (!resp.ok) {
6101
+ throw new Error(`Zip download failed: ${resp.status} ${resp.statusText}`);
6102
+ }
6103
+ const ab = await resp.arrayBuffer();
6104
+ return Buffer.from(ab);
6105
+ }
6106
+ function normalizeSkillList(items) {
6107
+ return items.map(normalizeSkill).filter((s) => s !== null);
6108
+ }
6109
+ function normalizeSkill(item) {
6110
+ if (!item) return null;
6111
+ const manifest = item.manifest || {};
6112
+ return {
6113
+ alias: item.alias || manifest.name || item.id || "unknown",
6114
+ name: manifest.name || item.alias || "unknown",
6115
+ description: manifest.description || "",
6116
+ author: manifest.metadata?.author || manifest.author,
6117
+ version: manifest.metadata?.version || manifest.version,
6118
+ tags: manifest.tags,
6119
+ created_at: item.created_at,
6120
+ last_modified: item.last_modified,
6121
+ versions: item.versions,
6122
+ git_url: item.git_url
6123
+ };
6124
+ }
6125
+
6126
+ var api = /*#__PURE__*/Object.freeze({
6127
+ __proto__: null,
6128
+ SKILLS_COLLECTION: SKILLS_COLLECTION,
6129
+ SKILLS_DIR: SKILLS_DIR,
6130
+ SKILLS_WORKSPACE: SKILLS_WORKSPACE,
6131
+ downloadSkillFile: downloadSkillFile,
6132
+ downloadSkillZip: downloadSkillZip,
6133
+ fetchWithTimeout: fetchWithTimeout,
6134
+ getArtifactBaseUrl: getArtifactBaseUrl,
6135
+ getSkillInfo: getSkillInfo,
6136
+ getSkillsServer: getSkillsServer,
6137
+ listAllSkills: listAllSkills,
6138
+ listSkillFiles: listSkillFiles,
6139
+ parseFrontmatter: parseFrontmatter,
6140
+ searchSkills: searchSkills
6141
+ });
6142
+
5933
6143
  const DEFAULT_PROBE_INTERVAL_S = 10;
5934
6144
  const DEFAULT_PROBE_TIMEOUT_S = 5;
5935
6145
  const DEFAULT_PROBE_FAILURE_THRESHOLD = 3;
@@ -6654,7 +6864,7 @@ function resolveContextWindow(opts) {
6654
6864
  return candidate;
6655
6865
  }
6656
6866
 
6657
- const SVAMP_HOME$1 = process.env.SVAMP_HOME || join$1(os.homedir(), ".svamp");
6867
+ const SVAMP_HOME$1 = process.env.SVAMP_HOME || join$1(os$1.homedir(), ".svamp");
6658
6868
  function generateHookSettings(portOrOptions = {}) {
6659
6869
  const opts = typeof portOrOptions === "number" ? { sessionStartPort: portOrOptions } : portOrOptions;
6660
6870
  const hooksDir = join$1(SVAMP_HOME$1, "tmp", "hooks");
@@ -6848,7 +7058,7 @@ function checkTruncation(format, tail, fileSize, head) {
6848
7058
 
6849
7059
  const __filename$1 = fileURLToPath(import.meta.url);
6850
7060
  const __dirname$1 = dirname(__filename$1);
6851
- const CLAUDE_SKILLS_DIR = join(os$1.homedir(), ".claude", "skills");
7061
+ const CLAUDE_SKILLS_DIR = join(os.homedir(), ".claude", "skills");
6852
7062
  function looksLikeClaudeError(line) {
6853
7063
  const l = line.toLowerCase();
6854
7064
  return l.includes("api error") || l.includes("request rejected") || l.includes("error:") || l.includes("overloaded") || l.includes("rate limit") || l.includes("unauthorized") || l.includes("forbidden") || /\b(4\d\d|5\d\d)\b/.test(l) && (l.includes("status") || l.includes("error") || l.includes("rejected"));
@@ -6929,7 +7139,7 @@ async function installSkillFromEndpoint(name, baseUrl) {
6929
7139
  }
6930
7140
  }
6931
7141
  async function installSkillFromMarketplace(name) {
6932
- const BASE = `https://hypha.aicell.io/hypha-cloud/artifacts/${name}`;
7142
+ const BASE = `${getArtifactBaseUrl()}/${name}`;
6933
7143
  async function collectFiles(dir = "") {
6934
7144
  const url = dir ? `${BASE}/files/${dir}` : `${BASE}/files/`;
6935
7145
  const resp = await fetch(url, { signal: AbortSignal.timeout(15e3) });
@@ -7050,7 +7260,7 @@ function preventMachineSleep(logger) {
7050
7260
  }
7051
7261
  async function fetchMarketplaceSkillVersion(name) {
7052
7262
  try {
7053
- const url = `https://hypha.aicell.io/hypha-cloud/artifacts/${name}/files/SKILL.md`;
7263
+ const url = `${getArtifactBaseUrl()}/${name}/files/SKILL.md`;
7054
7264
  const resp = await fetch(url, { signal: AbortSignal.timeout(1e4) });
7055
7265
  if (!resp.ok) return null;
7056
7266
  const md = await resp.text();
@@ -7072,7 +7282,7 @@ async function ensureAutoInstalledSkills(logger) {
7072
7282
  },
7073
7283
  {
7074
7284
  name: "hypha",
7075
- install: () => installSkillFromEndpoint("hypha", "https://hypha.aicell.io/ws/agent-skills/")
7285
+ install: () => installSkillFromEndpoint("hypha", `${getSkillsServer()}/ws/agent-skills/`)
7076
7286
  // hypha skill ships from a different endpoint without a version probe yet.
7077
7287
  },
7078
7288
  {
@@ -7134,14 +7344,14 @@ function loadEnvFile(path) {
7134
7344
  return true;
7135
7345
  }
7136
7346
  function loadDotEnv() {
7137
- const svampEnv = join(process.env.SVAMP_HOME || os$1.homedir() + "/.svamp", ".env");
7347
+ const svampEnv = join(process.env.SVAMP_HOME || os.homedir() + "/.svamp", ".env");
7138
7348
  if (!loadEnvFile(svampEnv)) {
7139
- const hyphaEnv = join(process.env.HYPHA_HOME || os$1.homedir() + "/.hypha", ".env");
7349
+ const hyphaEnv = join(process.env.HYPHA_HOME || os.homedir() + "/.hypha", ".env");
7140
7350
  loadEnvFile(hyphaEnv);
7141
7351
  }
7142
7352
  }
7143
7353
  loadDotEnv();
7144
- const SVAMP_HOME = process.env.SVAMP_HOME || join(os$1.homedir(), ".svamp");
7354
+ const SVAMP_HOME = process.env.SVAMP_HOME || join(os.homedir(), ".svamp");
7145
7355
  const DAEMON_STATE_FILE = join(SVAMP_HOME, "daemon.state.json");
7146
7356
  const DAEMON_LOCK_FILE = join(SVAMP_HOME, "daemon.lock");
7147
7357
  const LOGS_DIR = join(SVAMP_HOME, "logs");
@@ -7970,7 +8180,7 @@ async function startDaemon(options) {
7970
8180
  machineId = readFileSync$1(machineIdFile, "utf-8").trim();
7971
8181
  }
7972
8182
  if (!machineId) {
7973
- machineId = `machine-${os$1.hostname()}-${randomUUID$1().slice(0, 8)}`;
8183
+ machineId = `machine-${os.hostname()}-${randomUUID$1().slice(0, 8)}`;
7974
8184
  try {
7975
8185
  writeFileSync(machineIdFile, machineId, "utf-8");
7976
8186
  } catch {
@@ -8013,7 +8223,7 @@ async function startDaemon(options) {
8013
8223
  const list = loadExposedTunnels().filter((t) => t.name !== name);
8014
8224
  saveExposedTunnels(list);
8015
8225
  }
8016
- const { ServeManager } = await import('./serveManager-CLezyS3P.mjs');
8226
+ const { ServeManager } = await import('./serveManager-bhh_rQ5M.mjs');
8017
8227
  const serveManager = new ServeManager(SVAMP_HOME, (msg) => logger.log(`[SERVE] ${msg}`), hyphaServerUrl);
8018
8228
  ensureAutoInstalledSkills(logger).catch(() => {
8019
8229
  });
@@ -8199,10 +8409,10 @@ async function startDaemon(options) {
8199
8409
  var parseBashPermission = parseBashPermission2, shouldAutoAllow = shouldAutoAllow2, killAndWaitForExit = killAndWaitForExit2, buildIsolationConfig = buildIsolationConfig2;
8200
8410
  let sessionMetadata = {
8201
8411
  path: directory,
8202
- host: os$1.hostname(),
8412
+ host: os.hostname(),
8203
8413
  version: "0.1.0",
8204
8414
  machineId,
8205
- homeDir: os$1.homedir(),
8415
+ homeDir: os.homedir(),
8206
8416
  svampHomeDir: SVAMP_HOME,
8207
8417
  svampLibDir: join(__dirname$1, ".."),
8208
8418
  svampToolsDir: join(__dirname$1, "..", "tools"),
@@ -9784,10 +9994,10 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
9784
9994
  var parseBashPermission = parseBashPermission2, shouldAutoAllow = shouldAutoAllow2;
9785
9995
  let sessionMetadata = {
9786
9996
  path: directory,
9787
- host: os$1.hostname(),
9997
+ host: os.hostname(),
9788
9998
  version: "0.1.0",
9789
9999
  machineId,
9790
- homeDir: os$1.homedir(),
10000
+ homeDir: os.homedir(),
9791
10001
  svampHomeDir: SVAMP_HOME,
9792
10002
  svampLibDir: join(__dirname$1, ".."),
9793
10003
  svampToolsDir: join(__dirname$1, "..", "tools"),
@@ -10482,7 +10692,7 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
10482
10692
  logger.log(`Failed to detect isolation capabilities: ${err}`);
10483
10693
  isolationCapabilities = { available: [], preferred: null, details: { nono: { found: false }, srt: { found: false }, bwrap: { found: false }, docker: { found: false }, podman: { found: false } } };
10484
10694
  }
10485
- const defaultHomeDir = existsSync$1("/data") ? "/data" : os$1.homedir();
10695
+ const defaultHomeDir = existsSync$1("/data") ? "/data" : os.homedir();
10486
10696
  const persistedMachineMeta = loadPersistedMachineMetadata(SVAMP_HOME);
10487
10697
  if (persistedMachineMeta) {
10488
10698
  logger.log(`Restored machine metadata (sharing=${!!persistedMachineMeta.sharing}, securityContextConfig=${!!persistedMachineMeta.securityContextConfig}, injectPlatformGuidance=${persistedMachineMeta.injectPlatformGuidance})`);
@@ -10511,8 +10721,8 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
10511
10721
  }
10512
10722
  }
10513
10723
  const machineMetadata = {
10514
- host: os$1.hostname(),
10515
- platform: os$1.platform(),
10724
+ host: os.hostname(),
10725
+ platform: os.platform(),
10516
10726
  svampVersion: "0.1.0 (hypha)",
10517
10727
  homeDir: defaultHomeDir,
10518
10728
  svampHomeDir: SVAMP_HOME,
@@ -10586,7 +10796,7 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
10586
10796
  const specs = loadExposedTunnels();
10587
10797
  if (specs.length === 0) return;
10588
10798
  logger.log(`[exposed-tunnels] Restoring ${specs.length} tunnel(s) from ${EXPOSED_TUNNELS_FILE}`);
10589
- const { FrpcTunnel } = await import('./frpc-j60b46eU.mjs');
10799
+ const { FrpcTunnel } = await import('./frpc-DPfGAdlj.mjs');
10590
10800
  for (const spec of specs) {
10591
10801
  if (tunnels.has(spec.name)) continue;
10592
10802
  try {
@@ -11290,7 +11500,7 @@ async function restartDaemon() {
11290
11500
  function daemonStatus() {
11291
11501
  const state = readDaemonStateFile();
11292
11502
  if (!state) {
11293
- const plistPath = join(os$1.homedir(), "Library", "LaunchAgents", "io.hypha.svamp.daemon.plist");
11503
+ const plistPath = join(os.homedir(), "Library", "LaunchAgents", "io.hypha.svamp.daemon.plist");
11294
11504
  if (existsSync$1(plistPath)) {
11295
11505
  console.log("Status: Not running (launchd service installed \u2014 may be starting)");
11296
11506
  } else {
@@ -11329,4 +11539,4 @@ var run = /*#__PURE__*/Object.freeze({
11329
11539
  stopDaemon: stopDaemon
11330
11540
  });
11331
11541
 
11332
- export { DefaultTransport$1 as D, GeminiTransport$1 as G, ServeAuth as S, registerSessionService as a, stopDaemon as b, connectToHypha as c, daemonStatus as d, resolveSecurityContext as e, buildSecurityContextFromFlags as f, getHyphaServerUrl as g, hasCookieToken as h, buildSessionShareUrl as i, buildMachineShareUrl as j, generateHookSettings as k, loadSecurityContextConfig as l, mergeSecurityContexts as m, normalizeAllowedUser as n, acpBackend as o, acpAgentConfig as p, codexMcpBackend as q, registerMachineService as r, startDaemon as s, claudeAuth as t, run as u };
11542
+ export { buildSessionShareUrl as A, buildMachineShareUrl as B, generateHookSettings as C, DefaultTransport$1 as D, acpBackend as E, acpAgentConfig as F, codexMcpBackend as G, GeminiTransport$1 as H, claudeAuth as I, api as J, run as K, ServeAuth as S, registerSessionService as a, stopDaemon as b, connectToHypha as c, daemonStatus as d, getFrpsSubdomainHost as e, getFrpsServerAddr as f, getHyphaServerUrl$1 as g, getHyphaServerUrl as h, hasCookieToken as i, getSkillsServer as j, SKILLS_WORKSPACE as k, SKILLS_COLLECTION as l, fetchWithTimeout as m, searchSkills as n, SKILLS_DIR as o, parseFrontmatter as p, getSkillInfo as q, registerMachineService as r, startDaemon as s, downloadSkillFile as t, listSkillFiles as u, normalizeAllowedUser as v, loadSecurityContextConfig as w, resolveSecurityContext as x, buildSecurityContextFromFlags as y, mergeSecurityContexts as z };
@@ -2,7 +2,7 @@ import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(im
2
2
  import os from 'node:os';
3
3
  import { resolve, join } from 'node:path';
4
4
  import { existsSync, readFileSync, watch } from 'node:fs';
5
- import { c as connectToHypha, a as registerSessionService, k as generateHookSettings } from './run-ChG07q23.mjs';
5
+ import { c as connectToHypha, a as registerSessionService, C as generateHookSettings } from './run-BvocESxe.mjs';
6
6
  import { createServer } from 'node:http';
7
7
  import { spawn } from 'node:child_process';
8
8
  import { createInterface } from 'node:readline';
@@ -54,7 +54,7 @@ async function handleServeCommand() {
54
54
  }
55
55
  }
56
56
  async function serveAdd(args, machineId) {
57
- const { connectAndGetMachine } = await import('./commands-v4NWBPB2.mjs');
57
+ const { connectAndGetMachine } = await import('./commands-BSfZg4aa.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-v4NWBPB2.mjs');
96
+ const { connectAndGetMachine } = await import('./commands-BSfZg4aa.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-v4NWBPB2.mjs');
185
+ const { connectAndGetMachine } = await import('./commands-BSfZg4aa.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-v4NWBPB2.mjs');
205
+ const { connectAndGetMachine } = await import('./commands-BSfZg4aa.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-v4NWBPB2.mjs');
238
+ const { connectAndGetMachine } = await import('./commands-BSfZg4aa.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 { S as ServeAuth, h as hasCookieToken } from './run-ChG07q23.mjs';
7
+ import { h as getHyphaServerUrl, S as ServeAuth, i as hasCookieToken } from './run-BvocESxe.mjs';
8
8
  import 'os';
9
9
  import 'fs/promises';
10
10
  import 'url';
@@ -83,7 +83,11 @@ class ServeManager {
83
83
  constructor(svampHome, logger, hyphaServerUrl) {
84
84
  this.persistFile = path.join(svampHome, "serve-mounts.json");
85
85
  this.log = logger || ((msg) => console.log(`[SERVE] ${msg}`));
86
- this.hyphaServerUrl = hyphaServerUrl || process.env.HYPHA_SERVER_URL || "https://hypha.aicell.io";
86
+ const resolvedServerUrl = hyphaServerUrl || getHyphaServerUrl();
87
+ if (!resolvedServerUrl) {
88
+ throw new Error("ServeManager requires a Hypha server URL \u2014 set HYPHA_SERVER_URL.");
89
+ }
90
+ this.hyphaServerUrl = resolvedServerUrl;
87
91
  this.auth = new ServeAuth({ hyphaServerUrl: this.hyphaServerUrl });
88
92
  }
89
93
  // ── Public API ───────────────────────────────────────────────────────
@@ -708,7 +712,7 @@ class ServeManager {
708
712
  const mount = this.mounts.get(mountName);
709
713
  const subdomainOverride = mount?.access === "link" && mount.linkToken ? /* @__PURE__ */ new Map([[this.port, `static-${subdomainSafe}-${mount.linkToken}`]]) : void 0;
710
714
  try {
711
- const { FrpcTunnel } = await import('./frpc-j60b46eU.mjs');
715
+ const { FrpcTunnel } = await import('./frpc-DPfGAdlj.mjs');
712
716
  let tunnel;
713
717
  tunnel = new FrpcTunnel({
714
718
  name: tunnelName,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "svamp-cli",
3
- "version": "0.2.81",
3
+ "version": "0.2.82",
4
4
  "description": "Svamp CLI — AI workspace daemon on Hypha Cloud",
5
5
  "author": "Amun AI AB",
6
6
  "license": "SEE LICENSE IN LICENSE",