svamp-cli 0.1.74 → 0.1.76
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-NVZzP_Vo.mjs +298 -0
- package/dist/cli.mjs +188 -164
- package/dist/{commands-dKkUOvUb.mjs → commands-7Iw1nFwf.mjs} +3 -3
- package/dist/{commands-BLjcT1Vl.mjs → commands-CADr1mQg.mjs} +66 -2
- package/dist/{commands-UFi0_ESV.mjs → commands-DJoYOM_1.mjs} +25 -25
- package/dist/{commands-ClMc3nSg.mjs → commands-lJ8V7MJE.mjs} +77 -141
- package/dist/index.mjs +1 -1
- package/dist/{package-CCjeil_X.mjs → package-Dpz1MLO4.mjs} +4 -3
- package/dist/{run-BgwhZgkT.mjs → run-B29grSMh.mjs} +1 -1
- package/dist/{run-6QgabuQN.mjs → run-BnFGIK0c.mjs} +321 -329
- package/dist/staticServer-B-S9sl6E.mjs +198 -0
- package/package.json +4 -3
- package/dist/agentCommands-7GGmL2zY.mjs +0 -157
package/dist/cli.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { b as stopDaemon, s as startDaemon, d as daemonStatus } from './run-
|
|
1
|
+
import { b as stopDaemon, s as startDaemon, d as daemonStatus } from './run-BnFGIK0c.mjs';
|
|
2
2
|
import 'os';
|
|
3
3
|
import 'fs/promises';
|
|
4
4
|
import 'fs';
|
|
@@ -47,7 +47,7 @@ async function main() {
|
|
|
47
47
|
...process.argv.slice(1, 2),
|
|
48
48
|
// the script path
|
|
49
49
|
"daemon",
|
|
50
|
-
"start-
|
|
50
|
+
"start-supervised",
|
|
51
51
|
...extraArgs
|
|
52
52
|
], {
|
|
53
53
|
detached: true,
|
|
@@ -77,6 +77,94 @@ async function main() {
|
|
|
77
77
|
process.exit(1);
|
|
78
78
|
}
|
|
79
79
|
process.exit(0);
|
|
80
|
+
} else if (daemonSubcommand === "start-supervised") {
|
|
81
|
+
const { spawn: spawnChild } = await import('child_process');
|
|
82
|
+
const { appendFileSync, mkdirSync, existsSync: fsExists } = await import('fs');
|
|
83
|
+
const { join: pathJoin } = await import('path');
|
|
84
|
+
const osModule = await import('os');
|
|
85
|
+
const svampHome = process.env.SVAMP_HOME || pathJoin(osModule.homedir(), ".svamp");
|
|
86
|
+
const logsDir = pathJoin(svampHome, "logs");
|
|
87
|
+
mkdirSync(logsDir, { recursive: true });
|
|
88
|
+
const logFile = pathJoin(logsDir, "daemon-supervised.log");
|
|
89
|
+
const log = (msg) => {
|
|
90
|
+
const line = `[${(/* @__PURE__ */ new Date()).toISOString()}] [supervisor] ${msg}
|
|
91
|
+
`;
|
|
92
|
+
try {
|
|
93
|
+
appendFileSync(logFile, line);
|
|
94
|
+
} catch {
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const extraSyncArgs = [];
|
|
98
|
+
if (args.includes("--no-auto-continue")) extraSyncArgs.push("--no-auto-continue");
|
|
99
|
+
const BASE_DELAY_MS = 2e3;
|
|
100
|
+
const MAX_DELAY_MS = 3e5;
|
|
101
|
+
const BACKOFF_RESET_UPTIME_MS = 6e4;
|
|
102
|
+
let consecutiveRapidCrashes = 0;
|
|
103
|
+
let currentChild = null;
|
|
104
|
+
let stopping = false;
|
|
105
|
+
const onSignal = (sig) => {
|
|
106
|
+
stopping = true;
|
|
107
|
+
if (currentChild && !currentChild.killed) {
|
|
108
|
+
currentChild.kill(sig);
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
process.on("SIGTERM", () => onSignal("SIGTERM"));
|
|
112
|
+
process.on("SIGINT", () => onSignal("SIGINT"));
|
|
113
|
+
process.on("SIGUSR1", () => onSignal("SIGUSR1"));
|
|
114
|
+
log("Supervisor started");
|
|
115
|
+
while (!stopping) {
|
|
116
|
+
const startTime = Date.now();
|
|
117
|
+
const exitCode = await new Promise((resolve) => {
|
|
118
|
+
const child = spawnChild(process.execPath, [
|
|
119
|
+
"--no-warnings",
|
|
120
|
+
"--no-deprecation",
|
|
121
|
+
...process.argv.slice(1, 2),
|
|
122
|
+
"daemon",
|
|
123
|
+
"start-sync",
|
|
124
|
+
...extraSyncArgs
|
|
125
|
+
], {
|
|
126
|
+
stdio: ["ignore", "inherit", "inherit"],
|
|
127
|
+
env: { ...process.env, SVAMP_SUPERVISED: "1" }
|
|
128
|
+
});
|
|
129
|
+
currentChild = child;
|
|
130
|
+
child.on("exit", (code) => resolve(code));
|
|
131
|
+
child.on("error", (err) => {
|
|
132
|
+
log(`Failed to spawn daemon: ${err.message}`);
|
|
133
|
+
resolve(1);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
currentChild = null;
|
|
137
|
+
const uptime = Date.now() - startTime;
|
|
138
|
+
if (stopping) {
|
|
139
|
+
log("Supervisor received stop signal, exiting");
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
if (exitCode === 0) {
|
|
143
|
+
log("Daemon exited cleanly (exit 0), not restarting");
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
if (uptime > BACKOFF_RESET_UPTIME_MS) {
|
|
147
|
+
consecutiveRapidCrashes = 0;
|
|
148
|
+
} else {
|
|
149
|
+
consecutiveRapidCrashes++;
|
|
150
|
+
}
|
|
151
|
+
const backoffExp = Math.min(consecutiveRapidCrashes, 10);
|
|
152
|
+
let delay = Math.min(BASE_DELAY_MS * Math.pow(2, backoffExp), MAX_DELAY_MS);
|
|
153
|
+
delay = Math.max(BASE_DELAY_MS, Math.round(delay + (Math.random() * 0.2 - 0.1) * delay));
|
|
154
|
+
log(`Daemon exited with code ${exitCode} (uptime=${Math.round(uptime / 1e3)}s). Restarting in ${Math.round(delay / 1e3)}s...`);
|
|
155
|
+
await new Promise((resolve) => {
|
|
156
|
+
const timer = setTimeout(resolve, delay);
|
|
157
|
+
const checkStop = setInterval(() => {
|
|
158
|
+
if (stopping) {
|
|
159
|
+
clearTimeout(timer);
|
|
160
|
+
clearInterval(checkStop);
|
|
161
|
+
resolve();
|
|
162
|
+
}
|
|
163
|
+
}, 500);
|
|
164
|
+
setTimeout(() => clearInterval(checkStop), delay + 100);
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
process.exit(0);
|
|
80
168
|
} else if (daemonSubcommand === "start-sync") {
|
|
81
169
|
const noAutoContinue = args.includes("--no-auto-continue");
|
|
82
170
|
await startDaemon({ noAutoContinue });
|
|
@@ -106,10 +194,10 @@ async function main() {
|
|
|
106
194
|
} else if (subcommand === "skills") {
|
|
107
195
|
await handleSkillsCommand();
|
|
108
196
|
} else if (subcommand === "service" || subcommand === "svc") {
|
|
109
|
-
const { handleServiceCommand } = await import('./commands-
|
|
197
|
+
const { handleServiceCommand } = await import('./commands-CADr1mQg.mjs');
|
|
110
198
|
await handleServiceCommand();
|
|
111
199
|
} else if (subcommand === "process" || subcommand === "proc") {
|
|
112
|
-
const { processCommand } = await import('./commands-
|
|
200
|
+
const { processCommand } = await import('./commands-7Iw1nFwf.mjs');
|
|
113
201
|
let machineId;
|
|
114
202
|
const processArgs = args.slice(1);
|
|
115
203
|
const mIdx = processArgs.findIndex((a) => a === "--machine" || a === "-m");
|
|
@@ -127,7 +215,7 @@ async function main() {
|
|
|
127
215
|
} else if (!subcommand || subcommand === "start") {
|
|
128
216
|
await handleInteractiveCommand();
|
|
129
217
|
} else if (subcommand === "--version" || subcommand === "-v") {
|
|
130
|
-
const pkg = await import('./package-
|
|
218
|
+
const pkg = await import('./package-Dpz1MLO4.mjs').catch(() => ({ default: { version: "unknown" } }));
|
|
131
219
|
console.log(`svamp version: ${pkg.default.version}`);
|
|
132
220
|
} else {
|
|
133
221
|
console.error(`Unknown command: ${subcommand}`);
|
|
@@ -136,7 +224,7 @@ async function main() {
|
|
|
136
224
|
}
|
|
137
225
|
}
|
|
138
226
|
async function handleInteractiveCommand() {
|
|
139
|
-
const { runInteractive } = await import('./run-
|
|
227
|
+
const { runInteractive } = await import('./run-B29grSMh.mjs');
|
|
140
228
|
const interactiveArgs = subcommand === "start" ? args.slice(1) : args;
|
|
141
229
|
let directory = process.cwd();
|
|
142
230
|
let resumeSessionId;
|
|
@@ -181,7 +269,7 @@ async function handleAgentCommand() {
|
|
|
181
269
|
return;
|
|
182
270
|
}
|
|
183
271
|
if (agentArgs[0] === "list") {
|
|
184
|
-
const { KNOWN_ACP_AGENTS, KNOWN_MCP_AGENTS: KNOWN_MCP_AGENTS2 } = await import('./run-
|
|
272
|
+
const { KNOWN_ACP_AGENTS, KNOWN_MCP_AGENTS: KNOWN_MCP_AGENTS2 } = await import('./run-BnFGIK0c.mjs').then(function (n) { return n.i; });
|
|
185
273
|
console.log("Known agents:");
|
|
186
274
|
for (const [name, config2] of Object.entries(KNOWN_ACP_AGENTS)) {
|
|
187
275
|
console.log(` ${name.padEnd(12)} ${config2.command} ${config2.args.join(" ")} (ACP)`);
|
|
@@ -193,7 +281,7 @@ async function handleAgentCommand() {
|
|
|
193
281
|
console.log('Use "svamp agent -- <command> [args]" for a custom ACP agent.');
|
|
194
282
|
return;
|
|
195
283
|
}
|
|
196
|
-
const { resolveAcpAgentConfig, KNOWN_MCP_AGENTS } = await import('./run-
|
|
284
|
+
const { resolveAcpAgentConfig, KNOWN_MCP_AGENTS } = await import('./run-BnFGIK0c.mjs').then(function (n) { return n.i; });
|
|
197
285
|
let cwd = process.cwd();
|
|
198
286
|
const filteredArgs = [];
|
|
199
287
|
for (let i = 0; i < agentArgs.length; i++) {
|
|
@@ -217,12 +305,12 @@ async function handleAgentCommand() {
|
|
|
217
305
|
console.log(`Starting ${config.agentName} agent in ${cwd}...`);
|
|
218
306
|
let backend;
|
|
219
307
|
if (KNOWN_MCP_AGENTS[config.agentName]) {
|
|
220
|
-
const { CodexMcpBackend } = await import('./run-
|
|
308
|
+
const { CodexMcpBackend } = await import('./run-BnFGIK0c.mjs').then(function (n) { return n.j; });
|
|
221
309
|
backend = new CodexMcpBackend({ cwd, log: logFn });
|
|
222
310
|
} else {
|
|
223
|
-
const { AcpBackend } = await import('./run-
|
|
224
|
-
const { GeminiTransport } = await import('./run-
|
|
225
|
-
const { DefaultTransport } = await import('./run-
|
|
311
|
+
const { AcpBackend } = await import('./run-BnFGIK0c.mjs').then(function (n) { return n.h; });
|
|
312
|
+
const { GeminiTransport } = await import('./run-BnFGIK0c.mjs').then(function (n) { return n.G; });
|
|
313
|
+
const { DefaultTransport } = await import('./run-BnFGIK0c.mjs').then(function (n) { return n.D; });
|
|
226
314
|
const transportHandler = config.agentName === "gemini" ? new GeminiTransport() : new DefaultTransport(config.agentName);
|
|
227
315
|
backend = new AcpBackend({
|
|
228
316
|
agentName: config.agentName,
|
|
@@ -340,7 +428,7 @@ async function handleSessionCommand() {
|
|
|
340
428
|
printSessionHelp();
|
|
341
429
|
return;
|
|
342
430
|
}
|
|
343
|
-
const { sessionList, sessionSpawn, sessionStop, sessionInfo, sessionMessages, sessionAttach, sessionMachines, sessionSend, sessionWait, sessionShare, sessionRalphStart, sessionRalphCancel, sessionRalphStatus,
|
|
431
|
+
const { sessionList, sessionSpawn, sessionStop, sessionInfo, sessionMessages, sessionAttach, sessionMachines, sessionSend, sessionWait, sessionShare, sessionRalphStart, sessionRalphCancel, sessionRalphStatus, sessionInboxSend, sessionInboxList, sessionInboxRead, sessionInboxReply, sessionInboxClear } = await import('./commands-lJ8V7MJE.mjs');
|
|
344
432
|
const parseFlagStr = (flag, shortFlag) => {
|
|
345
433
|
for (let i = 1; i < sessionArgs.length; i++) {
|
|
346
434
|
if ((sessionArgs[i] === flag || shortFlag) && i + 1 < sessionArgs.length) {
|
|
@@ -400,7 +488,7 @@ async function handleSessionCommand() {
|
|
|
400
488
|
allowDomain.push(sessionArgs[++i]);
|
|
401
489
|
}
|
|
402
490
|
}
|
|
403
|
-
const { parseShareArg } = await import('./commands-
|
|
491
|
+
const { parseShareArg } = await import('./commands-lJ8V7MJE.mjs');
|
|
404
492
|
const shareEntries = share.map((s) => parseShareArg(s));
|
|
405
493
|
await sessionSpawn(agent, dir, targetMachineId, {
|
|
406
494
|
message,
|
|
@@ -484,7 +572,7 @@ async function handleSessionCommand() {
|
|
|
484
572
|
console.error("Usage: svamp session approve <session-id> [request-id] [--json]");
|
|
485
573
|
process.exit(1);
|
|
486
574
|
}
|
|
487
|
-
const { sessionApprove } = await import('./commands-
|
|
575
|
+
const { sessionApprove } = await import('./commands-lJ8V7MJE.mjs');
|
|
488
576
|
const approveReqId = sessionArgs[2] && !sessionArgs[2].startsWith("--") ? sessionArgs[2] : void 0;
|
|
489
577
|
await sessionApprove(sessionArgs[1], approveReqId, targetMachineId, {
|
|
490
578
|
json: hasFlag("--json")
|
|
@@ -494,7 +582,7 @@ async function handleSessionCommand() {
|
|
|
494
582
|
console.error("Usage: svamp session deny <session-id> [request-id] [--json]");
|
|
495
583
|
process.exit(1);
|
|
496
584
|
}
|
|
497
|
-
const { sessionDeny } = await import('./commands-
|
|
585
|
+
const { sessionDeny } = await import('./commands-lJ8V7MJE.mjs');
|
|
498
586
|
const denyReqId = sessionArgs[2] && !sessionArgs[2].startsWith("--") ? sessionArgs[2] : void 0;
|
|
499
587
|
await sessionDeny(sessionArgs[1], denyReqId, targetMachineId, {
|
|
500
588
|
json: hasFlag("--json")
|
|
@@ -530,7 +618,7 @@ async function handleSessionCommand() {
|
|
|
530
618
|
console.error("Usage: svamp session set-title <title>");
|
|
531
619
|
process.exit(1);
|
|
532
620
|
}
|
|
533
|
-
const { sessionSetTitle } = await import('./agentCommands-
|
|
621
|
+
const { sessionSetTitle } = await import('./agentCommands-NVZzP_Vo.mjs');
|
|
534
622
|
await sessionSetTitle(title);
|
|
535
623
|
} else if (sessionSubcommand === "set-link") {
|
|
536
624
|
const url = sessionArgs[1];
|
|
@@ -539,7 +627,7 @@ async function handleSessionCommand() {
|
|
|
539
627
|
process.exit(1);
|
|
540
628
|
}
|
|
541
629
|
const label = sessionArgs[2] && !sessionArgs[2].startsWith("--") ? sessionArgs[2] : void 0;
|
|
542
|
-
const { sessionSetLink } = await import('./agentCommands-
|
|
630
|
+
const { sessionSetLink } = await import('./agentCommands-NVZzP_Vo.mjs');
|
|
543
631
|
await sessionSetLink(url, label);
|
|
544
632
|
} else if (sessionSubcommand === "notify") {
|
|
545
633
|
const message = sessionArgs[1];
|
|
@@ -548,7 +636,7 @@ async function handleSessionCommand() {
|
|
|
548
636
|
process.exit(1);
|
|
549
637
|
}
|
|
550
638
|
const level = parseFlagStr("--level") || "info";
|
|
551
|
-
const { sessionNotify } = await import('./agentCommands-
|
|
639
|
+
const { sessionNotify } = await import('./agentCommands-NVZzP_Vo.mjs');
|
|
552
640
|
await sessionNotify(message, level);
|
|
553
641
|
} else if (sessionSubcommand === "broadcast") {
|
|
554
642
|
const action = sessionArgs[1];
|
|
@@ -556,106 +644,83 @@ async function handleSessionCommand() {
|
|
|
556
644
|
console.error("Usage: svamp session broadcast <action> [args...]\nActions: open-canvas <url> [label], close-canvas, toast <message>");
|
|
557
645
|
process.exit(1);
|
|
558
646
|
}
|
|
559
|
-
const { sessionBroadcast } = await import('./agentCommands-
|
|
647
|
+
const { sessionBroadcast } = await import('./agentCommands-NVZzP_Vo.mjs');
|
|
560
648
|
await sessionBroadcast(action, sessionArgs.slice(2).filter((a) => !a.startsWith("--")));
|
|
561
|
-
} else if (sessionSubcommand === "queue") {
|
|
562
|
-
const queueSubcmd = sessionArgs[1];
|
|
563
|
-
if (queueSubcmd === "add") {
|
|
564
|
-
if (!sessionArgs[2] || !sessionArgs[3]) {
|
|
565
|
-
console.error('Usage: svamp session queue add <session-id> "<message>"');
|
|
566
|
-
process.exit(1);
|
|
567
|
-
}
|
|
568
|
-
await sessionQueueAdd(sessionArgs[2], sessionArgs[3], targetMachineId);
|
|
569
|
-
} else if (queueSubcmd === "list" || queueSubcmd === "ls") {
|
|
570
|
-
if (!sessionArgs[2]) {
|
|
571
|
-
console.error("Usage: svamp session queue list <session-id>");
|
|
572
|
-
process.exit(1);
|
|
573
|
-
}
|
|
574
|
-
await sessionQueueList(sessionArgs[2], targetMachineId);
|
|
575
|
-
} else if (queueSubcmd === "clear") {
|
|
576
|
-
if (!sessionArgs[2]) {
|
|
577
|
-
console.error("Usage: svamp session queue clear <session-id>");
|
|
578
|
-
process.exit(1);
|
|
579
|
-
}
|
|
580
|
-
await sessionQueueClear(sessionArgs[2], targetMachineId);
|
|
581
|
-
} else {
|
|
582
|
-
console.error("Usage: svamp session queue <add|list|clear> <session-id> [args]");
|
|
583
|
-
process.exit(1);
|
|
584
|
-
}
|
|
585
649
|
} else if (sessionSubcommand === "inbox") {
|
|
586
650
|
const inboxSubcmd = sessionArgs[1];
|
|
651
|
+
const agentSessionId = process.env.SVAMP_SESSION_ID;
|
|
587
652
|
if (inboxSubcmd === "send") {
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
console.error('Usage: svamp session inbox send <target-session-id> --subject "..." --body "..."');
|
|
653
|
+
if (!sessionArgs[2] || !sessionArgs[3]) {
|
|
654
|
+
console.error('Usage: svamp session inbox send <target-session-id> "<body>" [--subject "..."] [--urgency urgent|normal] [--json]');
|
|
591
655
|
process.exit(1);
|
|
592
656
|
}
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
657
|
+
if (agentSessionId) {
|
|
658
|
+
const { inboxSend } = await import('./agentCommands-NVZzP_Vo.mjs');
|
|
659
|
+
await inboxSend(sessionArgs[2], {
|
|
660
|
+
body: sessionArgs[3],
|
|
661
|
+
subject: parseFlagStr("--subject"),
|
|
662
|
+
urgency: parseFlagStr("--urgency")
|
|
663
|
+
});
|
|
664
|
+
} else {
|
|
665
|
+
await sessionInboxSend(sessionArgs[2], sessionArgs[3], targetMachineId, {
|
|
666
|
+
subject: parseFlagStr("--subject"),
|
|
667
|
+
urgency: parseFlagStr("--urgency"),
|
|
668
|
+
json: hasFlag("--json")
|
|
669
|
+
});
|
|
670
|
+
}
|
|
604
671
|
} else if (inboxSubcmd === "list" || inboxSubcmd === "ls") {
|
|
605
|
-
|
|
606
|
-
|
|
672
|
+
if (agentSessionId && !sessionArgs[2]) {
|
|
673
|
+
const { inboxList } = await import('./agentCommands-NVZzP_Vo.mjs');
|
|
674
|
+
await inboxList({
|
|
675
|
+
unread: hasFlag("--unread"),
|
|
676
|
+
limit: parseFlagInt("--limit"),
|
|
677
|
+
json: hasFlag("--json")
|
|
678
|
+
});
|
|
679
|
+
} else if (sessionArgs[2]) {
|
|
680
|
+
await sessionInboxList(sessionArgs[2], targetMachineId, {
|
|
681
|
+
unread: hasFlag("--unread"),
|
|
682
|
+
limit: parseFlagInt("--limit"),
|
|
683
|
+
json: hasFlag("--json")
|
|
684
|
+
});
|
|
685
|
+
} else {
|
|
607
686
|
console.error("Usage: svamp session inbox list [session-id] [--unread] [--limit N] [--json]");
|
|
608
687
|
process.exit(1);
|
|
609
688
|
}
|
|
610
|
-
await sessionInboxList(targetId, targetMachineId, {
|
|
611
|
-
unread: hasFlag("--unread"),
|
|
612
|
-
limit: parseFlagInt("--limit"),
|
|
613
|
-
json: hasFlag("--json")
|
|
614
|
-
});
|
|
615
689
|
} else if (inboxSubcmd === "read") {
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
690
|
+
if (!sessionArgs[2]) {
|
|
691
|
+
console.error("Usage: svamp session inbox read <session-id|message-id> [message-id]");
|
|
692
|
+
process.exit(1);
|
|
693
|
+
}
|
|
694
|
+
if (agentSessionId && !sessionArgs[3]) {
|
|
695
|
+
const { inboxList } = await import('./agentCommands-NVZzP_Vo.mjs');
|
|
696
|
+
await sessionInboxRead(agentSessionId, sessionArgs[2], targetMachineId);
|
|
697
|
+
} else if (sessionArgs[3]) {
|
|
698
|
+
await sessionInboxRead(sessionArgs[2], sessionArgs[3], targetMachineId);
|
|
699
|
+
} else {
|
|
619
700
|
console.error("Usage: svamp session inbox read <session-id> <message-id>");
|
|
620
701
|
process.exit(1);
|
|
621
702
|
}
|
|
622
|
-
await sessionInboxRead(targetId, msgId, targetMachineId, {
|
|
623
|
-
json: hasFlag("--json")
|
|
624
|
-
});
|
|
625
703
|
} else if (inboxSubcmd === "reply") {
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
} else
|
|
632
|
-
|
|
633
|
-
msgId = sessionArgs[2];
|
|
634
|
-
}
|
|
635
|
-
if (!targetId || !msgId) {
|
|
636
|
-
console.error('Usage: svamp session inbox reply [session-id] <message-id> --body "..."');
|
|
704
|
+
if (agentSessionId && sessionArgs[2] && sessionArgs[3] && !sessionArgs[4]) {
|
|
705
|
+
const { inboxReply } = await import('./agentCommands-NVZzP_Vo.mjs');
|
|
706
|
+
await inboxReply(sessionArgs[2], sessionArgs[3]);
|
|
707
|
+
} else if (sessionArgs[2] && sessionArgs[3] && sessionArgs[4]) {
|
|
708
|
+
await sessionInboxReply(sessionArgs[2], sessionArgs[3], sessionArgs[4], targetMachineId);
|
|
709
|
+
} else {
|
|
710
|
+
console.error('Usage: svamp session inbox reply <session-id> <message-id> "<body>"');
|
|
637
711
|
process.exit(1);
|
|
638
712
|
}
|
|
639
|
-
await sessionInboxReply(targetId, msgId, targetMachineId, {
|
|
640
|
-
body: parseFlagStr("--body") || "",
|
|
641
|
-
urgency: parseFlagStr("--urgency") || "normal",
|
|
642
|
-
wait: hasFlag("--wait"),
|
|
643
|
-
json: hasFlag("--json")
|
|
644
|
-
});
|
|
645
713
|
} else if (inboxSubcmd === "clear") {
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
714
|
+
if (agentSessionId && !sessionArgs[2]) {
|
|
715
|
+
await sessionInboxClear(agentSessionId, targetMachineId, { all: hasFlag("--all") });
|
|
716
|
+
} else if (sessionArgs[2]) {
|
|
717
|
+
await sessionInboxClear(sessionArgs[2], targetMachineId, { all: hasFlag("--all") });
|
|
718
|
+
} else {
|
|
719
|
+
console.error("Usage: svamp session inbox clear [session-id] [--all]");
|
|
649
720
|
process.exit(1);
|
|
650
721
|
}
|
|
651
|
-
const msgId = sessionArgs[3] && !sessionArgs[3].startsWith("--") ? sessionArgs[3] : void 0;
|
|
652
|
-
await sessionInboxClear(targetId, targetMachineId, {
|
|
653
|
-
messageId: msgId,
|
|
654
|
-
all: hasFlag("--all"),
|
|
655
|
-
json: hasFlag("--json")
|
|
656
|
-
});
|
|
657
722
|
} else {
|
|
658
|
-
console.error("Usage: svamp session inbox <send|list|read|reply|clear> [args]");
|
|
723
|
+
console.error("Usage: svamp session inbox <send|list|read|reply|clear> [session-id] [args]");
|
|
659
724
|
process.exit(1);
|
|
660
725
|
}
|
|
661
726
|
} else {
|
|
@@ -673,7 +738,7 @@ async function handleMachineCommand() {
|
|
|
673
738
|
return;
|
|
674
739
|
}
|
|
675
740
|
if (machineSubcommand === "share") {
|
|
676
|
-
const { machineShare } = await import('./commands-
|
|
741
|
+
const { machineShare } = await import('./commands-lJ8V7MJE.mjs');
|
|
677
742
|
let machineId;
|
|
678
743
|
const shareArgs = [];
|
|
679
744
|
for (let i = 1; i < machineArgs.length; i++) {
|
|
@@ -703,7 +768,7 @@ async function handleMachineCommand() {
|
|
|
703
768
|
}
|
|
704
769
|
await machineShare(machineId, { add, remove, list, configPath, showConfig });
|
|
705
770
|
} else if (machineSubcommand === "exec") {
|
|
706
|
-
const { machineExec } = await import('./commands-
|
|
771
|
+
const { machineExec } = await import('./commands-lJ8V7MJE.mjs');
|
|
707
772
|
let machineId;
|
|
708
773
|
let cwd;
|
|
709
774
|
const cmdParts = [];
|
|
@@ -723,7 +788,7 @@ async function handleMachineCommand() {
|
|
|
723
788
|
}
|
|
724
789
|
await machineExec(machineId, command, cwd);
|
|
725
790
|
} else if (machineSubcommand === "info") {
|
|
726
|
-
const { machineInfo } = await import('./commands-
|
|
791
|
+
const { machineInfo } = await import('./commands-lJ8V7MJE.mjs');
|
|
727
792
|
let machineId;
|
|
728
793
|
for (let i = 1; i < machineArgs.length; i++) {
|
|
729
794
|
if ((machineArgs[i] === "--machine" || machineArgs[i] === "-m") && i + 1 < machineArgs.length) {
|
|
@@ -743,10 +808,10 @@ async function handleMachineCommand() {
|
|
|
743
808
|
level = machineArgs[++i];
|
|
744
809
|
}
|
|
745
810
|
}
|
|
746
|
-
const { machineNotify } = await import('./agentCommands-
|
|
811
|
+
const { machineNotify } = await import('./agentCommands-NVZzP_Vo.mjs');
|
|
747
812
|
await machineNotify(message, level);
|
|
748
813
|
} else if (machineSubcommand === "ls") {
|
|
749
|
-
const { machineLs } = await import('./commands-
|
|
814
|
+
const { machineLs } = await import('./commands-lJ8V7MJE.mjs');
|
|
750
815
|
let machineId;
|
|
751
816
|
let showHidden = false;
|
|
752
817
|
let path;
|
|
@@ -774,7 +839,7 @@ async function handleSkillsCommand() {
|
|
|
774
839
|
printSkillsHelp();
|
|
775
840
|
return;
|
|
776
841
|
}
|
|
777
|
-
const { skillsFind, skillsInstall, skillsList, skillsRemove, skillsPublish } = await import('./commands-
|
|
842
|
+
const { skillsFind, skillsInstall, skillsList, skillsRemove, skillsPublish } = await import('./commands-DJoYOM_1.mjs');
|
|
778
843
|
if (skillsSubcommand === "find" || skillsSubcommand === "search") {
|
|
779
844
|
const query = skillsArgs.slice(1).filter((a) => !a.startsWith("--")).join(" ");
|
|
780
845
|
if (!query) {
|
|
@@ -937,18 +1002,10 @@ async function installDaemonService() {
|
|
|
937
1002
|
<array>
|
|
938
1003
|
<string>${svampBinary}</string>
|
|
939
1004
|
<string>daemon</string>
|
|
940
|
-
<string>start-
|
|
1005
|
+
<string>start-supervised</string>
|
|
941
1006
|
</array>
|
|
942
1007
|
<key>RunAtLoad</key>
|
|
943
1008
|
<true/>
|
|
944
|
-
<key>KeepAlive</key>
|
|
945
|
-
<dict>
|
|
946
|
-
<!-- Only restart on crash (non-zero exit). svamp daemon stop exits 0. -->
|
|
947
|
-
<key>SuccessfulExit</key>
|
|
948
|
-
<false/>
|
|
949
|
-
</dict>
|
|
950
|
-
<key>ThrottleInterval</key>
|
|
951
|
-
<integer>10</integer>
|
|
952
1009
|
<key>StandardOutPath</key>
|
|
953
1010
|
<string>${logsDir}/daemon-supervised.log</string>
|
|
954
1011
|
<key>StandardErrorPath</key>
|
|
@@ -959,8 +1016,6 @@ async function installDaemonService() {
|
|
|
959
1016
|
<string>${supervisedPath}</string>
|
|
960
1017
|
<key>SVAMP_HOME</key>
|
|
961
1018
|
<string>${svampHome}</string>
|
|
962
|
-
<key>SVAMP_SUPERVISED</key>
|
|
963
|
-
<string>1</string>
|
|
964
1019
|
</dict>
|
|
965
1020
|
</dict>
|
|
966
1021
|
</plist>
|
|
@@ -999,12 +1054,9 @@ After=network-online.target
|
|
|
999
1054
|
Wants=network-online.target
|
|
1000
1055
|
|
|
1001
1056
|
[Service]
|
|
1002
|
-
ExecStart=${svampBinary} daemon start-
|
|
1003
|
-
Restart=on-failure
|
|
1004
|
-
RestartSec=10
|
|
1057
|
+
ExecStart=${svampBinary} daemon start-supervised
|
|
1005
1058
|
Environment=PATH=${supervisedPath}
|
|
1006
1059
|
Environment=SVAMP_HOME=${svampHome}
|
|
1007
|
-
Environment=SVAMP_SUPERVISED=1
|
|
1008
1060
|
StandardOutput=append:${logsDir}/daemon-supervised.log
|
|
1009
1061
|
StandardError=append:${logsDir}/daemon-supervised.log
|
|
1010
1062
|
|
|
@@ -1024,47 +1076,24 @@ Svamp daemon service installed and started!`);
|
|
|
1024
1076
|
To stop the service: svamp daemon stop`);
|
|
1025
1077
|
console.log(`To uninstall: svamp daemon uninstall`);
|
|
1026
1078
|
} else {
|
|
1027
|
-
const wrapperPath = join(svampHome, "daemon-supervisor.sh");
|
|
1028
|
-
const wrapper = `#!/bin/sh
|
|
1029
|
-
# Svamp daemon supervisor \u2014 restarts on crash. Run this as your container CMD
|
|
1030
|
-
# or in a background process. Stop with: svamp daemon stop
|
|
1031
|
-
export PATH="${supervisedPath}"
|
|
1032
|
-
export SVAMP_HOME="${svampHome}"
|
|
1033
|
-
export SVAMP_SUPERVISED=1
|
|
1034
|
-
|
|
1035
|
-
mkdir -p "${logsDir}"
|
|
1036
|
-
echo "[svamp-supervisor] Starting svamp daemon supervisor" >> "${logsDir}/daemon-supervised.log"
|
|
1037
|
-
|
|
1038
|
-
while true; do
|
|
1039
|
-
"${svampBinary}" daemon start-sync >> "${logsDir}/daemon-supervised.log" 2>&1
|
|
1040
|
-
EXIT_CODE=$?
|
|
1041
|
-
# Exit code 0 = clean stop (svamp daemon stop). Do not restart.
|
|
1042
|
-
if [ "$EXIT_CODE" -eq 0 ]; then
|
|
1043
|
-
echo "[svamp-supervisor] Daemon stopped cleanly (exit 0). Not restarting." >> "${logsDir}/daemon-supervised.log"
|
|
1044
|
-
break
|
|
1045
|
-
fi
|
|
1046
|
-
echo "[svamp-supervisor] Daemon exited with code $EXIT_CODE. Restarting in 10s..." >> "${logsDir}/daemon-supervised.log"
|
|
1047
|
-
sleep 10
|
|
1048
|
-
done
|
|
1049
|
-
`;
|
|
1050
|
-
fs.writeFileSync(wrapperPath, wrapper, { mode: 493 });
|
|
1051
1079
|
console.log(`
|
|
1052
|
-
|
|
1053
|
-
console.log(` Script: ${wrapperPath}`);
|
|
1054
|
-
console.log(` Log file: ${logsDir}/daemon-supervised.log`);
|
|
1080
|
+
No systemd detected. The built-in supervisor is cross-platform.`);
|
|
1055
1081
|
console.log(`
|
|
1056
|
-
|
|
1057
|
-
console.log(` ${
|
|
1082
|
+
For Docker, set your container CMD to:`);
|
|
1083
|
+
console.log(` ${svampBinary} daemon start-supervised`);
|
|
1058
1084
|
console.log(`
|
|
1059
1085
|
Or run in the background:`);
|
|
1060
|
-
console.log(`
|
|
1086
|
+
console.log(` svamp daemon start`);
|
|
1061
1087
|
console.log(`
|
|
1062
1088
|
To stop the daemon: svamp daemon stop`);
|
|
1063
1089
|
}
|
|
1064
1090
|
} else {
|
|
1065
|
-
console.
|
|
1066
|
-
|
|
1067
|
-
|
|
1091
|
+
console.log(`
|
|
1092
|
+
The built-in supervisor is cross-platform.`);
|
|
1093
|
+
console.log(`
|
|
1094
|
+
Run: svamp daemon start`);
|
|
1095
|
+
console.log(`
|
|
1096
|
+
To stop: svamp daemon stop`);
|
|
1068
1097
|
}
|
|
1069
1098
|
}
|
|
1070
1099
|
async function uninstallDaemonService() {
|
|
@@ -1175,8 +1204,8 @@ Usage:
|
|
|
1175
1204
|
svamp daemon stop --cleanup Stop and mark all sessions as stopped
|
|
1176
1205
|
svamp daemon restart Restart daemon (sessions resume seamlessly)
|
|
1177
1206
|
svamp daemon status Show daemon status
|
|
1178
|
-
svamp daemon install Install as
|
|
1179
|
-
svamp daemon uninstall Remove
|
|
1207
|
+
svamp daemon install Install as login service (macOS/Linux) \u2014 auto-start at login
|
|
1208
|
+
svamp daemon uninstall Remove login service
|
|
1180
1209
|
`);
|
|
1181
1210
|
}
|
|
1182
1211
|
function printSessionHelp() {
|
|
@@ -1237,16 +1266,11 @@ COMMANDS:
|
|
|
1237
1266
|
ralph-status <id> Show loop status
|
|
1238
1267
|
|
|
1239
1268
|
Inbox:
|
|
1240
|
-
inbox send <
|
|
1241
|
-
inbox list
|
|
1242
|
-
inbox read <
|
|
1243
|
-
inbox reply
|
|
1244
|
-
inbox clear <
|
|
1245
|
-
|
|
1246
|
-
Queue (deprecated, use inbox):
|
|
1247
|
-
queue add <id> "<message>" Queue a message (alias for inbox send)
|
|
1248
|
-
queue list <id> List messages (alias for inbox list)
|
|
1249
|
-
queue clear <id> Clear messages (alias for inbox clear)
|
|
1269
|
+
inbox send <id> "<body>" [opts] Send a message to session inbox
|
|
1270
|
+
inbox list <id> [--unread] [--json] List inbox messages
|
|
1271
|
+
inbox read <id> <msg-id> Read and mark a message
|
|
1272
|
+
inbox reply <id> <msg-id> "<body>" Reply to sender's session
|
|
1273
|
+
inbox clear <id> [--all] Clear read (or all) messages
|
|
1250
1274
|
|
|
1251
1275
|
SPAWN OPTIONS:
|
|
1252
1276
|
-d, --directory <path> Working directory (REQUIRED for meaningful work)
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { writeFileSync, readFileSync } from 'fs';
|
|
2
2
|
import { resolve } from 'path';
|
|
3
|
-
import { connectAndGetMachine } from './commands-
|
|
3
|
+
import { connectAndGetMachine } from './commands-lJ8V7MJE.mjs';
|
|
4
4
|
import 'node:fs';
|
|
5
5
|
import 'node:child_process';
|
|
6
|
-
import 'node:crypto';
|
|
7
6
|
import 'node:path';
|
|
8
7
|
import 'node:os';
|
|
9
|
-
import './run-
|
|
8
|
+
import './run-BnFGIK0c.mjs';
|
|
10
9
|
import 'os';
|
|
11
10
|
import 'fs/promises';
|
|
12
11
|
import 'url';
|
|
13
12
|
import 'child_process';
|
|
14
13
|
import 'crypto';
|
|
14
|
+
import 'node:crypto';
|
|
15
15
|
import '@agentclientprotocol/sdk';
|
|
16
16
|
import '@modelcontextprotocol/sdk/client/index.js';
|
|
17
17
|
import '@modelcontextprotocol/sdk/client/stdio.js';
|