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.
- package/dist/{agentCommands-B0x3og03.mjs → agentCommands-BPpgoGxT.mjs} +2 -2
- package/dist/cli.mjs +51 -45
- package/dist/{commands-DG48QiE-.mjs → commands-AzYDzCjE.mjs} +5 -5
- package/dist/{commands-v4NWBPB2.mjs → commands-BSfZg4aa.mjs} +1 -1
- package/dist/{commands-GMLad6_u.mjs → commands-BXwzw3Mu.mjs} +23 -127
- package/dist/{commands-BRmDFn7e.mjs → commands-DHOxmh4o.mjs} +2 -2
- package/dist/{fleet-BPLL0ecA.mjs → fleet-DDYoKg0Q.mjs} +1 -1
- package/dist/{frpc-j60b46eU.mjs → frpc-DPfGAdlj.mjs} +19 -3
- package/dist/index.mjs +1 -1
- package/dist/{package-D2aOg03L.mjs → package-BmFZfykH.mjs} +1 -1
- package/dist/{run-ChG07q23.mjs → run-BvocESxe.mjs} +239 -29
- package/dist/{run-C-w9-q8d.mjs → run-CrOw9-WG.mjs} +1 -1
- package/dist/{serveCommands-CLxYFLiG.mjs → serveCommands-DJUhkyLk.mjs} +5 -5
- package/dist/{serveManager-CLezyS3P.mjs → serveManager-bhh_rQ5M.mjs} +7 -3
- package/package.json +1 -1
|
@@ -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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
428
|
-
const { GeminiTransport } = await import('./run-
|
|
429
|
-
const { DefaultTransport } = await import('./run-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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:
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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 {
|
|
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 {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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 ||
|
|
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: ${
|
|
508
|
-
const gitUrl = `${
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
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 ||
|
|
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 ||
|
|
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-
|
|
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,8 +1,8 @@
|
|
|
1
|
-
import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(import.meta.url);import 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-
|
|
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
|
-
|
|
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
|
-
|
|
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, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
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
|
|
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 =
|
|
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 =
|
|
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",
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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-
|
|
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
|
|
8412
|
+
host: os.hostname(),
|
|
8203
8413
|
version: "0.1.0",
|
|
8204
8414
|
machineId,
|
|
8205
|
-
homeDir: os
|
|
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
|
|
9997
|
+
host: os.hostname(),
|
|
9788
9998
|
version: "0.1.0",
|
|
9789
9999
|
machineId,
|
|
9790
|
-
homeDir: os
|
|
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
|
|
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
|
|
10515
|
-
platform: os
|
|
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-
|
|
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
|
|
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
|
|
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,
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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,
|
|
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
|
-
|
|
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-
|
|
715
|
+
const { FrpcTunnel } = await import('./frpc-DPfGAdlj.mjs');
|
|
712
716
|
let tunnel;
|
|
713
717
|
tunnel = new FrpcTunnel({
|
|
714
718
|
name: tunnelName,
|