svamp-cli 0.2.82 → 0.2.84

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-BSfZg4aa.mjs');
151
+ const { connectAndGetMachine } = await import('./commands-B75aXb6C.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-BSfZg4aa.mjs');
168
+ const { resolveSessionId } = await import('./commands-B75aXb6C.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-BvocESxe.mjs';
1
+ import { s as startDaemon, b as stopDaemon, d as daemonStatus } from './run-MQKWgYFS.mjs';
2
2
  import 'os';
3
3
  import 'fs/promises';
4
4
  import 'fs';
@@ -31,6 +31,11 @@ const args = process.argv.slice(2);
31
31
  const subcommand = args[0];
32
32
  let daemonSubcommand = args[1];
33
33
  async function main() {
34
+ try {
35
+ const { getLoadedConfig } = await import('./run-MQKWgYFS.mjs').then(function (n) { return n.K; });
36
+ getLoadedConfig();
37
+ } catch {
38
+ }
34
39
  if (subcommand === "login") {
35
40
  await loginToHypha();
36
41
  } else if (subcommand === "logout") {
@@ -44,7 +49,7 @@ async function main() {
44
49
  console.error(`svamp daemon restart: ${err.message || err}`);
45
50
  process.exit(1);
46
51
  }
47
- const { restartDaemon } = await import('./run-BvocESxe.mjs').then(function (n) { return n.K; });
52
+ const { restartDaemon } = await import('./run-MQKWgYFS.mjs').then(function (n) { return n.M; });
48
53
  await restartDaemon();
49
54
  process.exit(0);
50
55
  }
@@ -296,7 +301,7 @@ async function main() {
296
301
  console.error("svamp service: Service commands are not available in sandboxed sessions.");
297
302
  process.exit(1);
298
303
  }
299
- const { handleServiceCommand } = await import('./commands-AzYDzCjE.mjs');
304
+ const { handleServiceCommand } = await import('./commands-CtYB14Y-.mjs');
300
305
  await handleServiceCommand();
301
306
  } else if (subcommand === "serve") {
302
307
  const { isSandboxed: isSandboxedServe } = await import('./sandboxDetect-DNTcbgWD.mjs');
@@ -304,7 +309,7 @@ async function main() {
304
309
  console.error("svamp serve: Serve commands are not available in sandboxed sessions.");
305
310
  process.exit(1);
306
311
  }
307
- const { handleServeCommand } = await import('./serveCommands-DJUhkyLk.mjs');
312
+ const { handleServeCommand } = await import('./serveCommands-9D4WCoJR.mjs');
308
313
  await handleServeCommand();
309
314
  process.exit(0);
310
315
  } else if (subcommand === "process" || subcommand === "proc") {
@@ -313,7 +318,7 @@ async function main() {
313
318
  console.error("svamp process: Process commands are not available in sandboxed sessions.");
314
319
  process.exit(1);
315
320
  }
316
- const { processCommand } = await import('./commands-DHOxmh4o.mjs');
321
+ const { processCommand } = await import('./commands-biNfOPRI.mjs');
317
322
  let machineId;
318
323
  const processArgs = args.slice(1);
319
324
  const mIdx = processArgs.findIndex((a) => a === "--machine" || a === "-m");
@@ -331,7 +336,7 @@ async function main() {
331
336
  } else if (!subcommand || subcommand === "start") {
332
337
  await handleInteractiveCommand();
333
338
  } else if (subcommand === "--version" || subcommand === "-v") {
334
- const pkg = await import('./package-BmFZfykH.mjs').catch(() => ({ default: { version: "unknown" } }));
339
+ const pkg = await import('./package-CUo2nRNC.mjs').catch(() => ({ default: { version: "unknown" } }));
335
340
  console.log(`svamp version: ${pkg.default.version}`);
336
341
  } else {
337
342
  console.error(`Unknown command: ${subcommand}`);
@@ -340,7 +345,7 @@ async function main() {
340
345
  }
341
346
  }
342
347
  async function handleInteractiveCommand() {
343
- const { runInteractive } = await import('./run-CrOw9-WG.mjs');
348
+ const { runInteractive } = await import('./run-Xk8il2Yz.mjs');
344
349
  const interactiveArgs = subcommand === "start" ? args.slice(1) : args;
345
350
  let directory = process.cwd();
346
351
  let resumeSessionId;
@@ -385,7 +390,7 @@ async function handleAgentCommand() {
385
390
  return;
386
391
  }
387
392
  if (agentArgs[0] === "list") {
388
- const { KNOWN_ACP_AGENTS, KNOWN_MCP_AGENTS: KNOWN_MCP_AGENTS2 } = await import('./run-BvocESxe.mjs').then(function (n) { return n.F; });
393
+ const { KNOWN_ACP_AGENTS, KNOWN_MCP_AGENTS: KNOWN_MCP_AGENTS2 } = await import('./run-MQKWgYFS.mjs').then(function (n) { return n.G; });
389
394
  console.log("Known agents:");
390
395
  for (const [name, config2] of Object.entries(KNOWN_ACP_AGENTS)) {
391
396
  console.log(` ${name.padEnd(12)} ${config2.command} ${config2.args.join(" ")} (ACP)`);
@@ -397,7 +402,7 @@ async function handleAgentCommand() {
397
402
  console.log('Use "svamp agent -- <command> [args]" for a custom ACP agent.');
398
403
  return;
399
404
  }
400
- const { resolveAcpAgentConfig, KNOWN_MCP_AGENTS } = await import('./run-BvocESxe.mjs').then(function (n) { return n.F; });
405
+ const { resolveAcpAgentConfig, KNOWN_MCP_AGENTS } = await import('./run-MQKWgYFS.mjs').then(function (n) { return n.G; });
401
406
  let cwd = process.cwd();
402
407
  const filteredArgs = [];
403
408
  for (let i = 0; i < agentArgs.length; i++) {
@@ -421,12 +426,12 @@ async function handleAgentCommand() {
421
426
  console.log(`Starting ${config.agentName} agent in ${cwd}...`);
422
427
  let backend;
423
428
  if (KNOWN_MCP_AGENTS[config.agentName]) {
424
- const { CodexMcpBackend } = await import('./run-BvocESxe.mjs').then(function (n) { return n.G; });
429
+ const { CodexMcpBackend } = await import('./run-MQKWgYFS.mjs').then(function (n) { return n.H; });
425
430
  backend = new CodexMcpBackend({ cwd, log: logFn });
426
431
  } else {
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; });
432
+ const { AcpBackend } = await import('./run-MQKWgYFS.mjs').then(function (n) { return n.F; });
433
+ const { GeminiTransport } = await import('./run-MQKWgYFS.mjs').then(function (n) { return n.I; });
434
+ const { DefaultTransport } = await import('./run-MQKWgYFS.mjs').then(function (n) { return n.E; });
430
435
  const transportHandler = config.agentName === "gemini" ? new GeminiTransport() : new DefaultTransport(config.agentName);
431
436
  backend = new AcpBackend({
432
437
  agentName: config.agentName,
@@ -553,7 +558,7 @@ async function handleSessionCommand() {
553
558
  process.exit(1);
554
559
  }
555
560
  }
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');
561
+ const { sessionList, sessionSpawn, sessionArchive, sessionResume, sessionDelete, sessionInfo, sessionMessages, sessionAttach, sessionMachines, sessionSend, sessionWait, sessionShare, sessionRalphStart, sessionRalphCancel, sessionRalphStatus, sessionInboxSend, sessionInboxList, sessionInboxRead, sessionInboxReply, sessionInboxClear } = await import('./commands-B75aXb6C.mjs');
557
562
  const parseFlagStr = (flag, shortFlag) => {
558
563
  for (let i = 1; i < sessionArgs.length; i++) {
559
564
  if ((sessionArgs[i] === flag || shortFlag) && i + 1 < sessionArgs.length) {
@@ -619,7 +624,7 @@ async function handleSessionCommand() {
619
624
  allowDomain.push(sessionArgs[++i]);
620
625
  }
621
626
  }
622
- const { parseShareArg } = await import('./commands-BSfZg4aa.mjs');
627
+ const { parseShareArg } = await import('./commands-B75aXb6C.mjs');
623
628
  const shareEntries = share.map((s) => parseShareArg(s));
624
629
  await sessionSpawn(agent, dir, targetMachineId, {
625
630
  message,
@@ -705,7 +710,7 @@ async function handleSessionCommand() {
705
710
  console.error(" Spawns a stateless Claude session in <directory>, sends <prompt>, prints the answer, then deletes the session.");
706
711
  process.exit(1);
707
712
  }
708
- const { sessionQuery } = await import('./commands-BSfZg4aa.mjs');
713
+ const { sessionQuery } = await import('./commands-B75aXb6C.mjs');
709
714
  await sessionQuery(dir, prompt, targetMachineId, {
710
715
  timeout: parseFlagInt("--timeout"),
711
716
  json: hasFlag("--json"),
@@ -738,7 +743,7 @@ async function handleSessionCommand() {
738
743
  console.error("Usage: svamp session approve <session-id> [request-id] [--json]");
739
744
  process.exit(1);
740
745
  }
741
- const { sessionApprove } = await import('./commands-BSfZg4aa.mjs');
746
+ const { sessionApprove } = await import('./commands-B75aXb6C.mjs');
742
747
  const approveReqId = sessionArgs[2] && !sessionArgs[2].startsWith("--") ? sessionArgs[2] : void 0;
743
748
  await sessionApprove(sessionArgs[1], approveReqId, targetMachineId, {
744
749
  json: hasFlag("--json")
@@ -748,7 +753,7 @@ async function handleSessionCommand() {
748
753
  console.error("Usage: svamp session deny <session-id> [request-id] [--json]");
749
754
  process.exit(1);
750
755
  }
751
- const { sessionDeny } = await import('./commands-BSfZg4aa.mjs');
756
+ const { sessionDeny } = await import('./commands-B75aXb6C.mjs');
752
757
  const denyReqId = sessionArgs[2] && !sessionArgs[2].startsWith("--") ? sessionArgs[2] : void 0;
753
758
  await sessionDeny(sessionArgs[1], denyReqId, targetMachineId, {
754
759
  json: hasFlag("--json")
@@ -784,7 +789,7 @@ async function handleSessionCommand() {
784
789
  console.error("Usage: svamp session set-title <title>");
785
790
  process.exit(1);
786
791
  }
787
- const { sessionSetTitle } = await import('./agentCommands-BPpgoGxT.mjs');
792
+ const { sessionSetTitle } = await import('./agentCommands-C10NivHS.mjs');
788
793
  await sessionSetTitle(title);
789
794
  } else if (sessionSubcommand === "set-link") {
790
795
  const url = sessionArgs[1];
@@ -793,7 +798,7 @@ async function handleSessionCommand() {
793
798
  process.exit(1);
794
799
  }
795
800
  const label = sessionArgs[2] && !sessionArgs[2].startsWith("--") ? sessionArgs[2] : void 0;
796
- const { sessionSetLink } = await import('./agentCommands-BPpgoGxT.mjs');
801
+ const { sessionSetLink } = await import('./agentCommands-C10NivHS.mjs');
797
802
  await sessionSetLink(url, label);
798
803
  } else if (sessionSubcommand === "notify") {
799
804
  const message = sessionArgs[1];
@@ -802,7 +807,7 @@ async function handleSessionCommand() {
802
807
  process.exit(1);
803
808
  }
804
809
  const level = parseFlagStr("--level") || "info";
805
- const { sessionNotify } = await import('./agentCommands-BPpgoGxT.mjs');
810
+ const { sessionNotify } = await import('./agentCommands-C10NivHS.mjs');
806
811
  await sessionNotify(message, level);
807
812
  } else if (sessionSubcommand === "broadcast") {
808
813
  const action = sessionArgs[1];
@@ -810,7 +815,7 @@ async function handleSessionCommand() {
810
815
  console.error("Usage: svamp session broadcast <action> [args...]\nActions: open-canvas <url> [label], close-canvas, toast <message>");
811
816
  process.exit(1);
812
817
  }
813
- const { sessionBroadcast } = await import('./agentCommands-BPpgoGxT.mjs');
818
+ const { sessionBroadcast } = await import('./agentCommands-C10NivHS.mjs');
814
819
  await sessionBroadcast(action, sessionArgs.slice(2).filter((a) => !a.startsWith("--")));
815
820
  } else if (sessionSubcommand === "inbox") {
816
821
  const inboxSubcmd = sessionArgs[1];
@@ -821,7 +826,7 @@ async function handleSessionCommand() {
821
826
  process.exit(1);
822
827
  }
823
828
  if (agentSessionId) {
824
- const { inboxSend } = await import('./agentCommands-BPpgoGxT.mjs');
829
+ const { inboxSend } = await import('./agentCommands-C10NivHS.mjs');
825
830
  await inboxSend(sessionArgs[2], {
826
831
  body: sessionArgs[3],
827
832
  subject: parseFlagStr("--subject"),
@@ -836,7 +841,7 @@ async function handleSessionCommand() {
836
841
  }
837
842
  } else if (inboxSubcmd === "list" || inboxSubcmd === "ls") {
838
843
  if (agentSessionId && !sessionArgs[2]) {
839
- const { inboxList } = await import('./agentCommands-BPpgoGxT.mjs');
844
+ const { inboxList } = await import('./agentCommands-C10NivHS.mjs');
840
845
  await inboxList({
841
846
  unread: hasFlag("--unread"),
842
847
  limit: parseFlagInt("--limit"),
@@ -858,7 +863,7 @@ async function handleSessionCommand() {
858
863
  process.exit(1);
859
864
  }
860
865
  if (agentSessionId && !sessionArgs[3]) {
861
- const { inboxList } = await import('./agentCommands-BPpgoGxT.mjs');
866
+ const { inboxList } = await import('./agentCommands-C10NivHS.mjs');
862
867
  await sessionInboxRead(agentSessionId, sessionArgs[2], targetMachineId);
863
868
  } else if (sessionArgs[3]) {
864
869
  await sessionInboxRead(sessionArgs[2], sessionArgs[3], targetMachineId);
@@ -868,7 +873,7 @@ async function handleSessionCommand() {
868
873
  }
869
874
  } else if (inboxSubcmd === "reply") {
870
875
  if (agentSessionId && sessionArgs[2] && sessionArgs[3] && !sessionArgs[4]) {
871
- const { inboxReply } = await import('./agentCommands-BPpgoGxT.mjs');
876
+ const { inboxReply } = await import('./agentCommands-C10NivHS.mjs');
872
877
  await inboxReply(sessionArgs[2], sessionArgs[3]);
873
878
  } else if (sessionArgs[2] && sessionArgs[3] && sessionArgs[4]) {
874
879
  await sessionInboxReply(sessionArgs[2], sessionArgs[3], sessionArgs[4], targetMachineId);
@@ -904,7 +909,7 @@ async function handleMachineCommand() {
904
909
  return;
905
910
  }
906
911
  if (machineSubcommand === "share") {
907
- const { machineShare } = await import('./commands-BSfZg4aa.mjs');
912
+ const { machineShare } = await import('./commands-B75aXb6C.mjs');
908
913
  let machineId;
909
914
  const shareArgs = [];
910
915
  for (let i = 1; i < machineArgs.length; i++) {
@@ -934,7 +939,7 @@ async function handleMachineCommand() {
934
939
  }
935
940
  await machineShare(machineId, { add, remove, list, configPath, showConfig });
936
941
  } else if (machineSubcommand === "exec") {
937
- const { machineExec } = await import('./commands-BSfZg4aa.mjs');
942
+ const { machineExec } = await import('./commands-B75aXb6C.mjs');
938
943
  let machineId;
939
944
  let cwd;
940
945
  const cmdParts = [];
@@ -954,7 +959,7 @@ async function handleMachineCommand() {
954
959
  }
955
960
  await machineExec(machineId, command, cwd);
956
961
  } else if (machineSubcommand === "info") {
957
- const { machineInfo } = await import('./commands-BSfZg4aa.mjs');
962
+ const { machineInfo } = await import('./commands-B75aXb6C.mjs');
958
963
  let machineId;
959
964
  for (let i = 1; i < machineArgs.length; i++) {
960
965
  if ((machineArgs[i] === "--machine" || machineArgs[i] === "-m") && i + 1 < machineArgs.length) {
@@ -974,10 +979,10 @@ async function handleMachineCommand() {
974
979
  level = machineArgs[++i];
975
980
  }
976
981
  }
977
- const { machineNotify } = await import('./agentCommands-BPpgoGxT.mjs');
982
+ const { machineNotify } = await import('./agentCommands-C10NivHS.mjs');
978
983
  await machineNotify(message, level);
979
984
  } else if (machineSubcommand === "ls") {
980
- const { machineLs } = await import('./commands-BSfZg4aa.mjs');
985
+ const { machineLs } = await import('./commands-B75aXb6C.mjs');
981
986
  let machineId;
982
987
  let showHidden = false;
983
988
  let path;
@@ -1035,24 +1040,24 @@ Examples:
1035
1040
  };
1036
1041
  const hasFlag = (name) => fleetArgs.includes(`--${name}`);
1037
1042
  if (sub === "status") {
1038
- const { fleetStatus } = await import('./fleet-DDYoKg0Q.mjs');
1043
+ const { fleetStatus } = await import('./fleet-D_sem31C.mjs');
1039
1044
  await fleetStatus();
1040
1045
  } else if (sub === "exec") {
1041
1046
  const command = fleetArgs.slice(1).filter((a) => !a.startsWith("--")).join(" ");
1042
- const { fleetExec } = await import('./fleet-DDYoKg0Q.mjs');
1047
+ const { fleetExec } = await import('./fleet-D_sem31C.mjs');
1043
1048
  await fleetExec(command, { cwd: flag("cwd") });
1044
1049
  } else if (sub === "upgrade-claude") {
1045
- const { fleetUpgradeClaude } = await import('./fleet-DDYoKg0Q.mjs');
1050
+ const { fleetUpgradeClaude } = await import('./fleet-D_sem31C.mjs');
1046
1051
  await fleetUpgradeClaude({ version: flag("version", "-v") });
1047
1052
  } else if (sub === "upgrade-svamp") {
1048
- const { fleetUpgradeSvamp } = await import('./fleet-DDYoKg0Q.mjs');
1053
+ const { fleetUpgradeSvamp } = await import('./fleet-D_sem31C.mjs');
1049
1054
  await fleetUpgradeSvamp({ version: flag("version", "-v"), excludeSelf: hasFlag("exclude-self") });
1050
1055
  } else if (sub === "daemon-restart") {
1051
- const { fleetDaemonRestart } = await import('./fleet-DDYoKg0Q.mjs');
1056
+ const { fleetDaemonRestart } = await import('./fleet-D_sem31C.mjs');
1052
1057
  await fleetDaemonRestart({ graceful: !hasFlag("cleanup") });
1053
1058
  } else if (sub === "push-skill") {
1054
1059
  const name = fleetArgs[1];
1055
- const { fleetPushSkill } = await import('./fleet-DDYoKg0Q.mjs');
1060
+ const { fleetPushSkill } = await import('./fleet-D_sem31C.mjs');
1056
1061
  await fleetPushSkill(name);
1057
1062
  } else {
1058
1063
  console.error(`Unknown fleet subcommand: ${sub}`);
@@ -1068,7 +1073,7 @@ async function handleSkillsCommand() {
1068
1073
  await printSkillsHelp();
1069
1074
  return;
1070
1075
  }
1071
- const { skillsFind, skillsInstall, skillsList, skillsRemove, skillsPublish } = await import('./commands-BXwzw3Mu.mjs');
1076
+ const { skillsFind, skillsInstall, skillsList, skillsRemove, skillsPublish } = await import('./commands-BeZMEZhQ.mjs');
1072
1077
  if (skillsSubcommand === "find" || skillsSubcommand === "search") {
1073
1078
  const query = skillsArgs.slice(1).filter((a) => !a.startsWith("--")).join(" ");
1074
1079
  if (!query) {
@@ -1107,12 +1112,28 @@ async function handleSkillsCommand() {
1107
1112
  process.exit(0);
1108
1113
  }
1109
1114
  async function loginToHypha() {
1110
- const serverUrl = args[1] || process.env.HYPHA_SERVER_URL;
1111
- if (!serverUrl) {
1112
- console.error("Usage: svamp login <server-url>");
1113
- console.error(" Or set HYPHA_SERVER_URL environment variable");
1115
+ const anchorArg = args[1] || process.env.SVAMP_INSTANCE_URL || process.env.HYPHA_SERVER_URL;
1116
+ if (!anchorArg) {
1117
+ console.error("Usage: svamp login <frontend-url> (e.g. https://svamp.aicell.io)");
1118
+ console.error(" The frontend serves /svamp.json, which carries the Hypha server URL and");
1119
+ console.error(" routing config. A Hypha server URL also works as a legacy fallback.");
1114
1120
  process.exit(1);
1115
1121
  }
1122
+ const anchor = anchorArg.replace(/\/+$/, "");
1123
+ const { loadInstanceConfig } = await import('./run-MQKWgYFS.mjs').then(function (n) { return n.K; });
1124
+ let cfg = null;
1125
+ try {
1126
+ cfg = await loadInstanceConfig({ anchor, force: true });
1127
+ } catch {
1128
+ }
1129
+ const configMode = !!(cfg && typeof cfg.hyphaServerUrl === "string" && cfg.hyphaServerUrl.trim());
1130
+ const serverUrl = configMode ? cfg.hyphaServerUrl.trim().replace(/\/+$/, "") : anchor;
1131
+ if (configMode) {
1132
+ console.log(`Found Svamp instance config at ${anchor}`);
1133
+ console.log(` Hypha server: ${serverUrl}`);
1134
+ } else {
1135
+ console.log(`No svamp.json found at ${anchor} \u2014 using it as the Hypha server (legacy mode).`);
1136
+ }
1116
1137
  console.log(`Logging in to Hypha server: ${serverUrl}`);
1117
1138
  console.log("A browser window will open for authentication...");
1118
1139
  try {
@@ -1162,13 +1183,17 @@ Please open this URL in your browser:
1162
1183
  const existing = fs.readFileSync(envFile, "utf-8").split("\n");
1163
1184
  for (const line of existing) {
1164
1185
  const trimmed = line.trim();
1165
- if (trimmed.startsWith("HYPHA_TOKEN=") || trimmed.startsWith("HYPHA_WORKSPACE=") || trimmed.startsWith("HYPHA_SERVER_URL=")) {
1186
+ if (trimmed.startsWith("HYPHA_TOKEN=") || trimmed.startsWith("HYPHA_WORKSPACE=") || trimmed.startsWith("HYPHA_SERVER_URL=") || trimmed.startsWith("SVAMP_INSTANCE_URL=")) {
1166
1187
  continue;
1167
1188
  }
1168
1189
  envLines.push(line);
1169
1190
  }
1170
1191
  }
1171
- envLines.push(`HYPHA_SERVER_URL=${serverUrl}`);
1192
+ if (configMode) {
1193
+ envLines.push(`SVAMP_INSTANCE_URL=${anchor}`);
1194
+ } else {
1195
+ envLines.push(`HYPHA_SERVER_URL=${serverUrl}`);
1196
+ }
1172
1197
  envLines.push(`HYPHA_TOKEN=${longLivedToken}`);
1173
1198
  envLines.push(`HYPHA_WORKSPACE=${workspace}`);
1174
1199
  while (envLines.length > 0 && envLines[envLines.length - 1].trim() === "") {
@@ -1205,12 +1230,17 @@ async function logoutFromHypha() {
1205
1230
  await stopDaemon();
1206
1231
  } catch {
1207
1232
  }
1233
+ try {
1234
+ const { clearInstanceConfigCache } = await import('./run-MQKWgYFS.mjs').then(function (n) { return n.K; });
1235
+ clearInstanceConfigCache();
1236
+ } catch {
1237
+ }
1208
1238
  if (fs.existsSync(envFile)) {
1209
1239
  const existing = fs.readFileSync(envFile, "utf-8").split("\n");
1210
1240
  const kept = [];
1211
1241
  for (const line of existing) {
1212
1242
  const trimmed = line.trim();
1213
- if (trimmed.startsWith("HYPHA_TOKEN=") || trimmed.startsWith("HYPHA_WORKSPACE=") || trimmed.startsWith("HYPHA_SERVER_URL=")) {
1243
+ if (trimmed.startsWith("HYPHA_TOKEN=") || trimmed.startsWith("HYPHA_WORKSPACE=") || trimmed.startsWith("HYPHA_SERVER_URL=") || trimmed.startsWith("SVAMP_INSTANCE_URL=")) {
1214
1244
  continue;
1215
1245
  }
1216
1246
  kept.push(line);
@@ -1514,7 +1544,7 @@ async function applyClaudeAuthFlags(argv) {
1514
1544
  "--use-hypha-proxy, --use-claude-login, and --anthropic-base-url/--anthropic-api-key are mutually exclusive"
1515
1545
  );
1516
1546
  }
1517
- const mod = await import('./run-BvocESxe.mjs').then(function (n) { return n.I; });
1547
+ const mod = await import('./run-MQKWgYFS.mjs').then(function (n) { return n.J; });
1518
1548
  if (hasHypha) {
1519
1549
  let url;
1520
1550
  const hyphaIdx = argv.indexOf("--use-hypha-proxy");
@@ -1568,7 +1598,7 @@ async function applyDaemonShareFlag(argv) {
1568
1598
  }
1569
1599
  }
1570
1600
  if (collected.length === 0) return;
1571
- const { updateEnvFile } = await import('./run-BvocESxe.mjs').then(function (n) { return n.I; });
1601
+ const { updateEnvFile } = await import('./run-MQKWgYFS.mjs').then(function (n) { return n.J; });
1572
1602
  const seen = /* @__PURE__ */ new Set();
1573
1603
  const deduped = collected.filter((e) => {
1574
1604
  const k = e.toLowerCase();
@@ -1581,7 +1611,7 @@ async function applyDaemonShareFlag(argv) {
1581
1611
  }
1582
1612
  async function handleDaemonAuthCommand(argv) {
1583
1613
  const sub = (argv[0] || "status").toLowerCase();
1584
- const mod = await import('./run-BvocESxe.mjs').then(function (n) { return n.I; });
1614
+ const mod = await import('./run-MQKWgYFS.mjs').then(function (n) { return n.J; });
1585
1615
  if (sub === "--help" || sub === "-h" || sub === "help") {
1586
1616
  console.log(`
1587
1617
  svamp daemon auth \u2014 Configure how Claude subprocesses authenticate
@@ -1874,8 +1904,8 @@ Examples:
1874
1904
  async function printSkillsHelp() {
1875
1905
  let browseUrl = "<HYPHA_SERVER_URL>/<workspace>/artifacts/marketplace (set HYPHA_SERVER_URL)";
1876
1906
  try {
1877
- const { getArtifactBaseUrl, SKILLS_COLLECTION } = await import('./run-BvocESxe.mjs').then(function (n) { return n.J; });
1878
- browseUrl = `${getArtifactBaseUrl()}/${SKILLS_COLLECTION}`;
1907
+ const { getArtifactBaseUrl, getSkillsCollectionName } = await import('./run-MQKWgYFS.mjs').then(function (n) { return n.L; });
1908
+ browseUrl = `${getArtifactBaseUrl()}/${getSkillsCollectionName()}`;
1879
1909
  } catch {
1880
1910
  }
1881
1911
  console.log(`
@@ -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 { 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';
5
+ import { w as normalizeAllowedUser, x as loadSecurityContextConfig, y as resolveSecurityContext, z as buildSecurityContextFromFlags, A as mergeSecurityContexts, c as connectToHypha, B as buildSessionShareUrl, C as buildMachineShareUrl } from './run-MQKWgYFS.mjs';
6
6
  import 'os';
7
7
  import 'fs/promises';
8
8
  import 'fs';
@@ -1,7 +1,7 @@
1
1
  import os from 'os';
2
2
  import fs__default from 'fs';
3
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';
4
+ import { p as parseFrontmatter, k as getSkillsServer, l as getSkillsWorkspaceName, m as getSkillsCollectionName, n as fetchWithTimeout, o as searchSkills, q as SKILLS_DIR, t as getSkillInfo, u as downloadSkillFile, v as listSkillFiles } from './run-MQKWgYFS.mjs';
5
5
  import 'fs/promises';
6
6
  import 'url';
7
7
  import 'child_process';
@@ -276,7 +276,7 @@ async function skillsPublish(skillPath, opts) {
276
276
  server = await connectToServer({
277
277
  server_url: serverUrl,
278
278
  token,
279
- workspace: SKILLS_WORKSPACE
279
+ workspace: getSkillsWorkspaceName()
280
280
  });
281
281
  } catch (err) {
282
282
  console.error(`Failed to connect to Hypha: ${err.message}`);
@@ -295,7 +295,7 @@ async function skillsPublish(skillPath, opts) {
295
295
  let existingArtifact = null;
296
296
  try {
297
297
  existingArtifact = await am.read({
298
- artifact_id: `${SKILLS_WORKSPACE}/${manifest.name}`,
298
+ artifact_id: `${getSkillsWorkspaceName()}/${manifest.name}`,
299
299
  _rkwargs: true
300
300
  });
301
301
  } catch {
@@ -325,7 +325,7 @@ async function skillsPublish(skillPath, opts) {
325
325
  const created = await am.create({
326
326
  alias: manifest.name,
327
327
  type: "skill",
328
- parent_id: `${SKILLS_WORKSPACE}/${SKILLS_COLLECTION}`,
328
+ parent_id: `${getSkillsWorkspaceName()}/${getSkillsCollectionName()}`,
329
329
  manifest: {
330
330
  name: manifest.name,
331
331
  description: manifest.description,
@@ -400,8 +400,8 @@ async function skillsPublish(skillPath, opts) {
400
400
  }
401
401
  const skillsServer = getSkillsServer();
402
402
  console.log(`Published "${manifest.name}" (${uploaded} files)${versionTag ? ` as ${versionTag}` : ""}`);
403
- console.log(` View: ${skillsServer}/${SKILLS_WORKSPACE}/artifacts/${manifest.name}`);
404
- const gitUrl = `${skillsServer}/${SKILLS_WORKSPACE}/git/${manifest.name}`;
403
+ console.log(` View: ${skillsServer}/${getSkillsWorkspaceName()}/artifacts/${manifest.name}`);
404
+ const gitUrl = `${skillsServer}/${getSkillsWorkspaceName()}/git/${manifest.name}`;
405
405
  console.log(` Git: ${gitUrl}`);
406
406
  if (isUpdate) {
407
407
  console.log(` Tip: Use --version <tag> to publish a named version.`);
@@ -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-DPfGAdlj.mjs');
61
+ const { runFrpcTunnel } = await import('./frpc-D3LiH7GX.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-BSfZg4aa.mjs');
71
+ const { connectAndGetMachine } = await import('./commands-B75aXb6C.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-DPfGAdlj.mjs');
126
+ const { runFrpcTunnel } = await import('./frpc-D3LiH7GX.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-BSfZg4aa.mjs');
135
+ const { connectAndGetMachine } = await import('./commands-B75aXb6C.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-BSfZg4aa.mjs');
164
+ const { connectAndGetMachine } = await import('./commands-B75aXb6C.mjs');
165
165
  const { server, machine } = await connectAndGetMachine();
166
166
  try {
167
167
  await machine.tunnelStop({ name });
@@ -1,11 +1,11 @@
1
1
  import { writeFileSync, readFileSync } from 'fs';
2
2
  import { resolve } from 'path';
3
- import { connectAndGetMachine } from './commands-BSfZg4aa.mjs';
3
+ import { connectAndGetMachine } from './commands-B75aXb6C.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-BvocESxe.mjs';
8
+ import './run-MQKWgYFS.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-BvocESxe.mjs';
4
+ import { c as connectToHypha } from './run-MQKWgYFS.mjs';
5
5
  import { PINNED_CLAUDE_CODE_VERSION } from './pinnedClaudeCode-HydRNEt7.mjs';
6
6
  import 'os';
7
7
  import 'fs/promises';
@@ -3,7 +3,7 @@ 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';
6
+ import { e as getFrpsSubdomainHost, f as getFrpsServerPort, h as getFrpsServerAddr } from './run-MQKWgYFS.mjs';
7
7
  import 'fs/promises';
8
8
  import 'url';
9
9
  import 'node:fs';
@@ -229,7 +229,7 @@ class FrpcTunnel {
229
229
  const hyphaToken = options.serverConfig?.hyphaToken || process.env.HYPHA_TOKEN || "";
230
230
  this.serverConfig = {
231
231
  serverAddr: options.serverConfig?.serverAddr || process.env.FRPS_SERVER_ADDR || (isInCluster() ? FRPS_CLUSTER_ADDR : getFrpsServerAddr()),
232
- serverPort: options.serverConfig?.serverPort || parseInt(process.env.FRPS_SERVER_PORT || "", 10) || DEFAULT_FRPS_PORT,
232
+ serverPort: options.serverConfig?.serverPort || getFrpsServerPort() || DEFAULT_FRPS_PORT,
233
233
  authToken: options.serverConfig?.authToken || process.env.FRPS_AUTH_TOKEN || FRPS_PUBLIC_TOKEN,
234
234
  hyphaToken,
235
235
  subDomainHost: options.serverConfig?.subDomainHost || process.env.FRPS_SUBDOMAIN_HOST || getFrpsSubdomainHost()
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-BvocESxe.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-MQKWgYFS.mjs';
2
2
  import 'os';
3
3
  import 'fs/promises';
4
4
  import 'fs';
@@ -0,0 +1,63 @@
1
+ var name = "svamp-cli";
2
+ var version = "0.2.84";
3
+ var description = "Svamp CLI — AI workspace daemon on Hypha Cloud";
4
+ var author = "Amun AI AB";
5
+ var license = "SEE LICENSE IN LICENSE";
6
+ var type = "module";
7
+ var bin = {
8
+ svamp: "./bin/svamp.mjs"
9
+ };
10
+ var files = [
11
+ "dist",
12
+ "bin"
13
+ ];
14
+ var main = "./dist/index.mjs";
15
+ var exports$1 = {
16
+ ".": "./dist/index.mjs",
17
+ "./cli": "./dist/cli.mjs"
18
+ };
19
+ var scripts = {
20
+ build: "rm -rf dist bin/skills && mkdir -p bin/skills && cp -r ../../skills/artifact bin/skills/artifact && tsc --noEmit && pkgroll",
21
+ typecheck: "tsc --noEmit",
22
+ test: "npx tsx test/test-context-window.mjs && npx tsx test/test-instance-config.mjs && npx tsx test/test-authorize.mjs && npx tsx test/test-normalize-allowed-user.mjs && npx tsx test/test-share-url.mjs && npx tsx test/test-update-sharing-normalization.mjs && npx tsx test/test-staged-homes-sweep.mjs && npx tsx test/test-session-helpers.mjs && npx tsx test/test-cli-routing.mjs && npx tsx test/test-security-context.mjs && npx tsx test/test-isolation-decision.mjs && npx tsx test/test-ralph-loop.mjs && npx tsx test/test-message-helpers.mjs && npx tsx test/test-agent-config.mjs && npx tsx test/test-wrap-command.mjs && npx tsx test/test-credential-staging.mjs && npx tsx test/test-claude-auth.mjs && npx tsx test/test-output-formatters.mjs && npx tsx test/test-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-ralph-loop-integration.mjs && npx tsx test/test-ralph-loop-modes.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 && npx tsx test/test-clear-detection.mjs && npx tsx test/test-session-consolidation.mjs && npx tsx test/test-inbox.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 && node test/pinnedClaudeCode.test.mjs && node test/fleet.test.mjs",
23
+ "test:hypha": "node --no-warnings test/test-hypha-service.mjs",
24
+ dev: "tsx src/cli.ts",
25
+ "dev:daemon": "tsx src/cli.ts daemon start-sync",
26
+ "test:e2e": "node --no-warnings test/e2e-session-tests.mjs",
27
+ "test:frpc": "npx tsx test/test-frpc-e2e.mjs"
28
+ };
29
+ var dependencies = {
30
+ "@agentclientprotocol/sdk": "^0.14.1",
31
+ "@modelcontextprotocol/sdk": "^1.25.3",
32
+ "hypha-rpc": "0.21.40",
33
+ "node-pty": "1.2.0-beta.11",
34
+ ws: "^8.18.0",
35
+ yaml: "^2.8.2",
36
+ zod: "^3.24.4"
37
+ };
38
+ var devDependencies = {
39
+ "@types/node": ">=20",
40
+ "@types/ws": "^8.5.14",
41
+ pkgroll: "^2.14.2",
42
+ tsx: "^4.20.6",
43
+ typescript: "5.9.3"
44
+ };
45
+ var packageManager = "yarn@1.22.22";
46
+ var _package = {
47
+ name: name,
48
+ version: version,
49
+ description: description,
50
+ author: author,
51
+ license: license,
52
+ type: type,
53
+ bin: bin,
54
+ files: files,
55
+ main: main,
56
+ exports: exports$1,
57
+ scripts: scripts,
58
+ dependencies: dependencies,
59
+ devDependencies: devDependencies,
60
+ packageManager: packageManager
61
+ };
62
+
63
+ export { author, bin, _package as default, dependencies, description, devDependencies, exports$1 as exports, files, license, main, name, packageManager, scripts, type, version };
@@ -1,8 +1,8 @@
1
- import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(import.meta.url);import os from 'os';
1
+ import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(import.meta.url);import os, { homedir as homedir$1 } 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
- import { readFileSync as readFileSync$1, mkdirSync, writeFileSync, renameSync, existsSync as existsSync$1, copyFileSync, unlinkSync as unlinkSync$1, watch, rmdirSync, readdirSync } from 'fs';
3
+ import { readFileSync as readFileSync$1, mkdirSync, writeFileSync, renameSync, existsSync as existsSync$1, rmSync, copyFileSync, unlinkSync as unlinkSync$1, watch, rmdirSync, readdirSync } from 'fs';
4
4
  import path__default, { join, dirname, resolve, basename } from 'path';
5
- import { URL as URL$1, fileURLToPath } from 'url';
5
+ import { 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';
@@ -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-DPfGAdlj.mjs');
1396
+ const { FrpcTunnel } = await import('./frpc-D3LiH7GX.mjs');
1397
1397
  const tunnel = new FrpcTunnel({
1398
1398
  name: params.name,
1399
1399
  ports: params.ports,
@@ -1522,9 +1522,22 @@ async function registerMachineService(server, machineId, metadata, daemonState,
1522
1522
  await sm.recreateTunnel();
1523
1523
  return { success: true, health: sm.getTunnelHealth() };
1524
1524
  },
1525
- // WISE voice — create ephemeral token for OpenAI Realtime API
1525
+ // WISE voice — create ephemeral token for OpenAI Realtime API.
1526
+ //
1527
+ // Minting is intentionally NOT gated on machine sharing. The mint only
1528
+ // exchanges an OpenAI key for a short-lived ephemeral token; anything the
1529
+ // resulting WISE agent actually does flows back through the session/machine
1530
+ // RPCs (sendMessage=interact, bash/terminal=admin, …), each authorized on
1531
+ // its own. Gating the mint on `interact` here added no real protection —
1532
+ // an interact user can already drive the agent to do anything on this box —
1533
+ // but it DID cause false failures when the resolved machine wasn't shared
1534
+ // to the caller's identity (e.g. a machine with sharing disabled). We only
1535
+ // require a signed-in, non-anonymous user so the daemon isn't an open
1536
+ // OpenAI relay. (No context at all = internal call → allowed.)
1526
1537
  wiseCreateEphemeralToken: async (params, context) => {
1527
- authorizeRequest(context, currentMetadata.sharing, "interact");
1538
+ if (context && (!context.user || context.user.is_anonymous)) {
1539
+ return { success: false, error: "Sign in to use WISE voice." };
1540
+ }
1528
1541
  const apiKey = params.apiKey || process.env.OPENAI_API_KEY;
1529
1542
  if (!apiKey) {
1530
1543
  return { success: false, error: "No OpenAI API key found. Set OPENAI_API_KEY or pass apiKey." };
@@ -5543,54 +5556,177 @@ var claudeAuth = /*#__PURE__*/Object.freeze({
5543
5556
  updateEnvFile: updateEnvFile
5544
5557
  });
5545
5558
 
5546
- function getHyphaServerUrl() {
5547
- const raw = (process.env.HYPHA_SERVER_URL || "").trim();
5548
- return raw ? raw.replace(/\/+$/, "") : void 0;
5559
+ const SVAMP_HOME$2 = process.env.SVAMP_HOME || join(homedir$1(), ".svamp");
5560
+ const CACHE_FILE = join(SVAMP_HOME$2, "instance-config.json");
5561
+ const CONFIG_FILENAME = "svamp.json";
5562
+ let _config = null;
5563
+ let _loaded = false;
5564
+ function stripSlash$1(u) {
5565
+ return u.replace(/\/+$/, "");
5566
+ }
5567
+ function getInstanceUrl() {
5568
+ const raw = (process.env.SVAMP_INSTANCE_URL || "").trim();
5569
+ return raw ? stripSlash$1(raw) : void 0;
5570
+ }
5571
+ function configUrlsFor(anchor) {
5572
+ const base = stripSlash$1(anchor);
5573
+ return [`${base}/${CONFIG_FILENAME}`, `${base}/.well-known/${CONFIG_FILENAME}`];
5574
+ }
5575
+ async function fetchConfig(anchor) {
5576
+ for (const url of configUrlsFor(anchor)) {
5577
+ try {
5578
+ const resp = await fetch(url, { signal: AbortSignal.timeout(8e3) });
5579
+ if (!resp.ok) continue;
5580
+ const data = await resp.json();
5581
+ if (data && typeof data === "object" && !Array.isArray(data)) {
5582
+ return data;
5583
+ }
5584
+ } catch {
5585
+ }
5586
+ }
5587
+ return null;
5549
5588
  }
5550
- function getHyphaHostname() {
5551
- const url = getHyphaServerUrl();
5552
- if (!url) return void 0;
5589
+ function readCache() {
5553
5590
  try {
5554
- return new URL$1(url).hostname || void 0;
5591
+ if (existsSync$1(CACHE_FILE)) {
5592
+ const data = JSON.parse(readFileSync$1(CACHE_FILE, "utf-8"));
5593
+ if (data && typeof data === "object" && !Array.isArray(data)) return data;
5594
+ }
5555
5595
  } catch {
5556
- return void 0;
5557
5596
  }
5597
+ return null;
5558
5598
  }
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
- );
5599
+ function writeCache(cfg) {
5600
+ try {
5601
+ mkdirSync(SVAMP_HOME$2, { recursive: true });
5602
+ writeFileSync(CACHE_FILE, JSON.stringify(cfg, null, 2) + "\n", "utf-8");
5603
+ } catch {
5604
+ }
5605
+ }
5606
+ function applyConfig(cfg) {
5607
+ _config = cfg;
5608
+ if (cfg.hyphaServerUrl && typeof cfg.hyphaServerUrl === "string") {
5609
+ process.env.HYPHA_SERVER_URL = stripSlash$1(cfg.hyphaServerUrl.trim());
5610
+ }
5611
+ }
5612
+ async function loadInstanceConfig(opts = {}) {
5613
+ if (_loaded && !opts.force) return _config;
5614
+ const anchor = opts.anchor ? stripSlash$1(opts.anchor) : getInstanceUrl();
5615
+ if (anchor) {
5616
+ const fetched = await fetchConfig(anchor);
5617
+ if (fetched) {
5618
+ applyConfig(fetched);
5619
+ writeCache(fetched);
5620
+ _loaded = true;
5621
+ return _config;
5622
+ }
5623
+ }
5624
+ const cached = readCache();
5625
+ if (cached) applyConfig(cached);
5626
+ _loaded = true;
5627
+ return _config;
5628
+ }
5629
+ function getLoadedConfig() {
5630
+ if (!_loaded) {
5631
+ const cached = readCache();
5632
+ if (cached) applyConfig(cached);
5633
+ _loaded = true;
5634
+ }
5635
+ return _config;
5636
+ }
5637
+ function clearInstanceConfigCache() {
5638
+ _config = null;
5639
+ _loaded = false;
5640
+ try {
5641
+ if (existsSync$1(CACHE_FILE)) rmSync(CACHE_FILE);
5642
+ } catch {
5643
+ }
5644
+ }
5645
+ function __setConfigForTest(cfg) {
5646
+ _config = cfg;
5647
+ _loaded = true;
5648
+ if (cfg) applyConfig(cfg);
5649
+ }
5650
+ function __resetForTest() {
5651
+ _config = null;
5652
+ _loaded = false;
5653
+ }
5654
+
5655
+ var instanceConfig = /*#__PURE__*/Object.freeze({
5656
+ __proto__: null,
5657
+ CONFIG_FILENAME: CONFIG_FILENAME,
5658
+ __resetForTest: __resetForTest,
5659
+ __setConfigForTest: __setConfigForTest,
5660
+ clearInstanceConfigCache: clearInstanceConfigCache,
5661
+ configUrlsFor: configUrlsFor,
5662
+ getInstanceUrl: getInstanceUrl,
5663
+ getLoadedConfig: getLoadedConfig,
5664
+ loadInstanceConfig: loadInstanceConfig
5665
+ });
5666
+
5667
+ function stripSlash(u) {
5668
+ return u.replace(/\/+$/, "");
5669
+ }
5670
+ function getHyphaServerUrl() {
5671
+ const fromCfg = getLoadedConfig()?.hyphaServerUrl;
5672
+ if (typeof fromCfg === "string" && fromCfg.trim()) return stripSlash(fromCfg.trim());
5673
+ const env = (process.env.HYPHA_SERVER_URL || "").trim();
5674
+ return env ? stripSlash(env) : void 0;
5565
5675
  }
5566
5676
  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");
5677
+ const fromCfg = getLoadedConfig()?.frps?.subdomainHost;
5678
+ if (typeof fromCfg === "string" && fromCfg.trim()) return fromCfg.trim();
5679
+ const env = (process.env.FRPS_SUBDOMAIN_HOST || "").trim();
5680
+ if (env) return env;
5681
+ throw new Error(
5682
+ 'frps subdomain host is not configured. Serve a svamp.json with "frps.subdomainHost" at your frontend URL (svamp login <frontend-url>), or set FRPS_SUBDOMAIN_HOST (legacy). It is deployment-specific and never guessed.'
5683
+ );
5570
5684
  }
5571
5685
  function getFrpsServerAddr() {
5572
- const explicit = (process.env.FRPS_SERVER_ADDR || "").trim();
5573
- if (explicit) return explicit;
5686
+ const fromCfg = getLoadedConfig()?.frps?.serverAddr;
5687
+ if (typeof fromCfg === "string" && fromCfg.trim()) return fromCfg.trim();
5688
+ const env = (process.env.FRPS_SERVER_ADDR || "").trim();
5689
+ if (env) return env;
5574
5690
  return `frps-ctrl.${getFrpsSubdomainHost()}`;
5575
5691
  }
5692
+ function getFrpsServerPort() {
5693
+ const fromCfg = getLoadedConfig()?.frps?.serverPort;
5694
+ if (typeof fromCfg === "number" && Number.isFinite(fromCfg)) return fromCfg;
5695
+ const env = parseInt(process.env.FRPS_SERVER_PORT || "", 10);
5696
+ return Number.isFinite(env) ? env : void 0;
5697
+ }
5576
5698
  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}`;
5699
+ const fromCfg = getLoadedConfig()?.web?.baseUrl;
5700
+ if (typeof fromCfg === "string" && fromCfg.trim()) return stripSlash(fromCfg.trim());
5701
+ const env = (process.env.SVAMP_WEB_URL || "").trim();
5702
+ if (env) return stripSlash(env);
5703
+ const instance = getInstanceUrl();
5704
+ if (instance) return instance;
5581
5705
  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."
5706
+ 'Svamp web base URL is not configured. Serve a svamp.json with "web.baseUrl", log in with your frontend URL (svamp login <frontend-url>), or set SVAMP_WEB_URL (legacy).'
5583
5707
  );
5584
5708
  }
5585
5709
  function getSkillsServerUrl() {
5586
- const explicit = (process.env.HYPHA_SKILLS_SERVER || "").trim();
5587
- if (explicit) return explicit.replace(/\/+$/, "");
5710
+ const fromCfg = getLoadedConfig()?.skills?.server;
5711
+ if (typeof fromCfg === "string" && fromCfg.trim()) return stripSlash(fromCfg.trim());
5712
+ const env = (process.env.HYPHA_SKILLS_SERVER || "").trim();
5713
+ if (env) return stripSlash(env);
5588
5714
  const server = getHyphaServerUrl();
5589
5715
  if (server) return server;
5590
5716
  throw new Error(
5591
- "Cannot determine skills marketplace server: set HYPHA_SKILLS_SERVER or HYPHA_SERVER_URL. No hostname is hardcoded as a fallback."
5717
+ "Cannot determine skills marketplace server. Serve a svamp.json or set HYPHA_SERVER_URL."
5592
5718
  );
5593
5719
  }
5720
+ function getSkillsWorkspace() {
5721
+ const fromCfg = getLoadedConfig()?.skills?.workspace;
5722
+ if (typeof fromCfg === "string" && fromCfg.trim()) return fromCfg.trim();
5723
+ return (process.env.HYPHA_SKILLS_WORKSPACE || "").trim() || "hypha-cloud";
5724
+ }
5725
+ function getSkillsCollection() {
5726
+ const fromCfg = getLoadedConfig()?.skills?.collection;
5727
+ if (typeof fromCfg === "string" && fromCfg.trim()) return fromCfg.trim();
5728
+ return (process.env.HYPHA_SKILLS_COLLECTION || "").trim() || "marketplace";
5729
+ }
5594
5730
 
5595
5731
  function getShareBaseUrl() {
5596
5732
  return getSvampWebBaseUrl();
@@ -5976,14 +6112,18 @@ function escapeHtml(s) {
5976
6112
  return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
5977
6113
  }
5978
6114
 
5979
- const SKILLS_WORKSPACE = process.env.HYPHA_SKILLS_WORKSPACE || "hypha-cloud";
5980
- const SKILLS_COLLECTION = process.env.HYPHA_SKILLS_COLLECTION || "marketplace";
5981
6115
  const SKILLS_DIR = join(os.homedir(), ".claude", "skills");
6116
+ function getSkillsWorkspaceName() {
6117
+ return getSkillsWorkspace();
6118
+ }
6119
+ function getSkillsCollectionName() {
6120
+ return getSkillsCollection();
6121
+ }
5982
6122
  function getSkillsServer() {
5983
6123
  return getSkillsServerUrl();
5984
6124
  }
5985
6125
  function getArtifactBaseUrl() {
5986
- return `${getSkillsServer()}/${SKILLS_WORKSPACE}/artifacts`;
6126
+ return `${getSkillsServer()}/${getSkillsWorkspaceName()}/artifacts`;
5987
6127
  }
5988
6128
  async function fetchWithTimeout(url, options = {}, timeoutMs = 3e4) {
5989
6129
  const controller = new AbortController();
@@ -6041,7 +6181,7 @@ function parseFrontmatter(content) {
6041
6181
  async function searchSkills(query) {
6042
6182
  const base = getArtifactBaseUrl();
6043
6183
  const filters = encodeURIComponent(JSON.stringify({ type: "skill" }));
6044
- const url = `${base}/${SKILLS_COLLECTION}/children?keywords=${encodeURIComponent(query)}&filters=${filters}&limit=50`;
6184
+ const url = `${base}/${getSkillsCollectionName()}/children?keywords=${encodeURIComponent(query)}&filters=${filters}&limit=50`;
6045
6185
  const resp = await fetchWithTimeout(url);
6046
6186
  if (!resp.ok) {
6047
6187
  if (resp.status === 404) return [];
@@ -6053,7 +6193,7 @@ async function searchSkills(query) {
6053
6193
  async function listAllSkills(offset = 0, limit = 100) {
6054
6194
  const base = getArtifactBaseUrl();
6055
6195
  const filters = encodeURIComponent(JSON.stringify({ type: "skill" }));
6056
- const url = `${base}/${SKILLS_COLLECTION}/children?filters=${filters}&offset=${offset}&limit=${limit}`;
6196
+ const url = `${base}/${getSkillsCollectionName()}/children?filters=${filters}&offset=${offset}&limit=${limit}`;
6057
6197
  const resp = await fetchWithTimeout(url);
6058
6198
  if (!resp.ok) {
6059
6199
  if (resp.status === 404) return [];
@@ -6125,15 +6265,15 @@ function normalizeSkill(item) {
6125
6265
 
6126
6266
  var api = /*#__PURE__*/Object.freeze({
6127
6267
  __proto__: null,
6128
- SKILLS_COLLECTION: SKILLS_COLLECTION,
6129
6268
  SKILLS_DIR: SKILLS_DIR,
6130
- SKILLS_WORKSPACE: SKILLS_WORKSPACE,
6131
6269
  downloadSkillFile: downloadSkillFile,
6132
6270
  downloadSkillZip: downloadSkillZip,
6133
6271
  fetchWithTimeout: fetchWithTimeout,
6134
6272
  getArtifactBaseUrl: getArtifactBaseUrl,
6135
6273
  getSkillInfo: getSkillInfo,
6274
+ getSkillsCollectionName: getSkillsCollectionName,
6136
6275
  getSkillsServer: getSkillsServer,
6276
+ getSkillsWorkspaceName: getSkillsWorkspaceName,
6137
6277
  listAllSkills: listAllSkills,
6138
6278
  listSkillFiles: listSkillFiles,
6139
6279
  parseFrontmatter: parseFrontmatter,
@@ -8160,10 +8300,16 @@ async function startDaemon(options) {
8160
8300
  process.exit(0);
8161
8301
  }
8162
8302
  }
8303
+ try {
8304
+ await loadInstanceConfig();
8305
+ } catch (err) {
8306
+ logger.log(`[config] Instance config load failed (continuing with env): ${err?.message || err}`);
8307
+ }
8163
8308
  const hyphaServerUrl = process.env.HYPHA_SERVER_URL;
8164
8309
  if (!hyphaServerUrl) {
8165
- console.error("HYPHA_SERVER_URL is required.");
8166
- console.error('Run "svamp login <server-url>" first, or set it in .env or environment.');
8310
+ console.error("No Hypha server configured.");
8311
+ console.error('Run "svamp login <frontend-url>" first (e.g. https://svamp.aicell.io),');
8312
+ console.error("or set SVAMP_INSTANCE_URL / HYPHA_SERVER_URL in .env or the environment.");
8167
8313
  process.exit(1);
8168
8314
  }
8169
8315
  const hyphaToken = process.env.HYPHA_TOKEN;
@@ -8223,7 +8369,7 @@ async function startDaemon(options) {
8223
8369
  const list = loadExposedTunnels().filter((t) => t.name !== name);
8224
8370
  saveExposedTunnels(list);
8225
8371
  }
8226
- const { ServeManager } = await import('./serveManager-bhh_rQ5M.mjs');
8372
+ const { ServeManager } = await import('./serveManager-j2Z-hrHL.mjs');
8227
8373
  const serveManager = new ServeManager(SVAMP_HOME, (msg) => logger.log(`[SERVE] ${msg}`), hyphaServerUrl);
8228
8374
  ensureAutoInstalledSkills(logger).catch(() => {
8229
8375
  });
@@ -10796,7 +10942,7 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
10796
10942
  const specs = loadExposedTunnels();
10797
10943
  if (specs.length === 0) return;
10798
10944
  logger.log(`[exposed-tunnels] Restoring ${specs.length} tunnel(s) from ${EXPOSED_TUNNELS_FILE}`);
10799
- const { FrpcTunnel } = await import('./frpc-DPfGAdlj.mjs');
10945
+ const { FrpcTunnel } = await import('./frpc-D3LiH7GX.mjs');
10800
10946
  for (const spec of specs) {
10801
10947
  if (tunnels.has(spec.name)) continue;
10802
10948
  try {
@@ -10822,11 +10968,15 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
10822
10968
  })().catch(() => {
10823
10969
  });
10824
10970
  if (seededSharing?.enabled) {
10825
- const shareUrl = buildMachineShareUrl({
10826
- machineId,
10827
- workspace: server.config?.workspace
10828
- });
10829
- logger.log(`Machine share URL: ${shareUrl}`);
10971
+ try {
10972
+ const shareUrl = buildMachineShareUrl({
10973
+ machineId,
10974
+ workspace: server.config?.workspace
10975
+ });
10976
+ logger.log(`Machine share URL: ${shareUrl}`);
10977
+ } catch (err) {
10978
+ logger.log(`Machine sharing is enabled but the share URL can't be built: ${err.message}`);
10979
+ }
10830
10980
  const userList = (seededSharing.allowedUsers || []).map((u) => u.email).join(", ");
10831
10981
  if (userList) logger.log(` Shared with: ${userList}`);
10832
10982
  }
@@ -11539,4 +11689,4 @@ var run = /*#__PURE__*/Object.freeze({
11539
11689
  stopDaemon: stopDaemon
11540
11690
  });
11541
11691
 
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 };
11692
+ export { mergeSecurityContexts as A, buildSessionShareUrl as B, buildMachineShareUrl as C, generateHookSettings as D, DefaultTransport$1 as E, acpBackend as F, acpAgentConfig as G, codexMcpBackend as H, GeminiTransport$1 as I, claudeAuth as J, instanceConfig as K, api as L, run as M, ServeAuth as S, registerSessionService as a, stopDaemon as b, connectToHypha as c, daemonStatus as d, getFrpsSubdomainHost as e, getFrpsServerPort as f, getHyphaServerUrl$1 as g, getFrpsServerAddr as h, getHyphaServerUrl as i, hasCookieToken as j, getSkillsServer as k, getSkillsWorkspaceName as l, getSkillsCollectionName as m, fetchWithTimeout as n, searchSkills as o, parseFrontmatter as p, SKILLS_DIR as q, registerMachineService as r, startDaemon as s, getSkillInfo as t, downloadSkillFile as u, listSkillFiles as v, normalizeAllowedUser as w, loadSecurityContextConfig as x, resolveSecurityContext as y, buildSecurityContextFromFlags 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, C as generateHookSettings } from './run-BvocESxe.mjs';
5
+ import { c as connectToHypha, a as registerSessionService, D as generateHookSettings } from './run-MQKWgYFS.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-BSfZg4aa.mjs');
57
+ const { connectAndGetMachine } = await import('./commands-B75aXb6C.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-BSfZg4aa.mjs');
96
+ const { connectAndGetMachine } = await import('./commands-B75aXb6C.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-BSfZg4aa.mjs');
185
+ const { connectAndGetMachine } = await import('./commands-B75aXb6C.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-BSfZg4aa.mjs');
205
+ const { connectAndGetMachine } = await import('./commands-B75aXb6C.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-BSfZg4aa.mjs');
238
+ const { connectAndGetMachine } = await import('./commands-B75aXb6C.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 { h as getHyphaServerUrl, S as ServeAuth, i as hasCookieToken } from './run-BvocESxe.mjs';
7
+ import { i as getHyphaServerUrl, S as ServeAuth, j as hasCookieToken } from './run-MQKWgYFS.mjs';
8
8
  import 'os';
9
9
  import 'fs/promises';
10
10
  import 'url';
@@ -712,7 +712,7 @@ class ServeManager {
712
712
  const mount = this.mounts.get(mountName);
713
713
  const subdomainOverride = mount?.access === "link" && mount.linkToken ? /* @__PURE__ */ new Map([[this.port, `static-${subdomainSafe}-${mount.linkToken}`]]) : void 0;
714
714
  try {
715
- const { FrpcTunnel } = await import('./frpc-DPfGAdlj.mjs');
715
+ const { FrpcTunnel } = await import('./frpc-D3LiH7GX.mjs');
716
716
  let tunnel;
717
717
  tunnel = new FrpcTunnel({
718
718
  name: tunnelName,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "svamp-cli",
3
- "version": "0.2.82",
3
+ "version": "0.2.84",
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 && tsc --noEmit && pkgroll",
22
22
  "typecheck": "tsc --noEmit",
23
- "test": "npx tsx test/test-context-window.mjs && npx tsx test/test-authorize.mjs && npx tsx test/test-normalize-allowed-user.mjs && npx tsx test/test-share-url.mjs && npx tsx test/test-update-sharing-normalization.mjs && npx tsx test/test-staged-homes-sweep.mjs && npx tsx test/test-session-helpers.mjs && npx tsx test/test-cli-routing.mjs && npx tsx test/test-security-context.mjs && npx tsx test/test-isolation-decision.mjs && npx tsx test/test-ralph-loop.mjs && npx tsx test/test-message-helpers.mjs && npx tsx test/test-agent-config.mjs && npx tsx test/test-wrap-command.mjs && npx tsx test/test-credential-staging.mjs && npx tsx test/test-claude-auth.mjs && npx tsx test/test-output-formatters.mjs && npx tsx test/test-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-ralph-loop-integration.mjs && npx tsx test/test-ralph-loop-modes.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 && npx tsx test/test-clear-detection.mjs && npx tsx test/test-session-consolidation.mjs && npx tsx test/test-inbox.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 && node test/pinnedClaudeCode.test.mjs && node test/fleet.test.mjs",
23
+ "test": "npx tsx test/test-context-window.mjs && npx tsx test/test-instance-config.mjs && npx tsx test/test-authorize.mjs && npx tsx test/test-normalize-allowed-user.mjs && npx tsx test/test-share-url.mjs && npx tsx test/test-update-sharing-normalization.mjs && npx tsx test/test-staged-homes-sweep.mjs && npx tsx test/test-session-helpers.mjs && npx tsx test/test-cli-routing.mjs && npx tsx test/test-security-context.mjs && npx tsx test/test-isolation-decision.mjs && npx tsx test/test-ralph-loop.mjs && npx tsx test/test-message-helpers.mjs && npx tsx test/test-agent-config.mjs && npx tsx test/test-wrap-command.mjs && npx tsx test/test-credential-staging.mjs && npx tsx test/test-claude-auth.mjs && npx tsx test/test-output-formatters.mjs && npx tsx test/test-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-ralph-loop-integration.mjs && npx tsx test/test-ralph-loop-modes.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 && npx tsx test/test-clear-detection.mjs && npx tsx test/test-session-consolidation.mjs && npx tsx test/test-inbox.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 && node test/pinnedClaudeCode.test.mjs && node test/fleet.test.mjs",
24
24
  "test:hypha": "node --no-warnings test/test-hypha-service.mjs",
25
25
  "dev": "tsx src/cli.ts",
26
26
  "dev:daemon": "tsx src/cli.ts daemon start-sync",
@@ -1,63 +0,0 @@
1
- var name = "svamp-cli";
2
- var version = "0.2.82";
3
- var description = "Svamp CLI — AI workspace daemon on Hypha Cloud";
4
- var author = "Amun AI AB";
5
- var license = "SEE LICENSE IN LICENSE";
6
- var type = "module";
7
- var bin = {
8
- svamp: "./bin/svamp.mjs"
9
- };
10
- var files = [
11
- "dist",
12
- "bin"
13
- ];
14
- var main = "./dist/index.mjs";
15
- var exports$1 = {
16
- ".": "./dist/index.mjs",
17
- "./cli": "./dist/cli.mjs"
18
- };
19
- var scripts = {
20
- build: "rm -rf dist bin/skills && mkdir -p bin/skills && cp -r ../../skills/artifact bin/skills/artifact && tsc --noEmit && pkgroll",
21
- typecheck: "tsc --noEmit",
22
- test: "npx tsx test/test-context-window.mjs && npx tsx test/test-authorize.mjs && npx tsx test/test-normalize-allowed-user.mjs && npx tsx test/test-share-url.mjs && npx tsx test/test-update-sharing-normalization.mjs && npx tsx test/test-staged-homes-sweep.mjs && npx tsx test/test-session-helpers.mjs && npx tsx test/test-cli-routing.mjs && npx tsx test/test-security-context.mjs && npx tsx test/test-isolation-decision.mjs && npx tsx test/test-ralph-loop.mjs && npx tsx test/test-message-helpers.mjs && npx tsx test/test-agent-config.mjs && npx tsx test/test-wrap-command.mjs && npx tsx test/test-credential-staging.mjs && npx tsx test/test-claude-auth.mjs && npx tsx test/test-output-formatters.mjs && npx tsx test/test-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-ralph-loop-integration.mjs && npx tsx test/test-ralph-loop-modes.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 && npx tsx test/test-clear-detection.mjs && npx tsx test/test-session-consolidation.mjs && npx tsx test/test-inbox.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 && node test/pinnedClaudeCode.test.mjs && node test/fleet.test.mjs",
23
- "test:hypha": "node --no-warnings test/test-hypha-service.mjs",
24
- dev: "tsx src/cli.ts",
25
- "dev:daemon": "tsx src/cli.ts daemon start-sync",
26
- "test:e2e": "node --no-warnings test/e2e-session-tests.mjs",
27
- "test:frpc": "npx tsx test/test-frpc-e2e.mjs"
28
- };
29
- var dependencies = {
30
- "@agentclientprotocol/sdk": "^0.14.1",
31
- "@modelcontextprotocol/sdk": "^1.25.3",
32
- "hypha-rpc": "0.21.40",
33
- "node-pty": "1.2.0-beta.11",
34
- ws: "^8.18.0",
35
- yaml: "^2.8.2",
36
- zod: "^3.24.4"
37
- };
38
- var devDependencies = {
39
- "@types/node": ">=20",
40
- "@types/ws": "^8.5.14",
41
- pkgroll: "^2.14.2",
42
- tsx: "^4.20.6",
43
- typescript: "5.9.3"
44
- };
45
- var packageManager = "yarn@1.22.22";
46
- var _package = {
47
- name: name,
48
- version: version,
49
- description: description,
50
- author: author,
51
- license: license,
52
- type: type,
53
- bin: bin,
54
- files: files,
55
- main: main,
56
- exports: exports$1,
57
- scripts: scripts,
58
- dependencies: dependencies,
59
- devDependencies: devDependencies,
60
- packageManager: packageManager
61
- };
62
-
63
- export { author, bin, _package as default, dependencies, description, devDependencies, exports$1 as exports, files, license, main, name, packageManager, scripts, type, version };