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/cli.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { b as stopDaemon, s as startDaemon, d as daemonStatus } from './run-6QgabuQN.mjs';
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-sync",
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-BLjcT1Vl.mjs');
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-dKkUOvUb.mjs');
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-CCjeil_X.mjs').catch(() => ({ default: { version: "unknown" } }));
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-BgwhZgkT.mjs');
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-6QgabuQN.mjs').then(function (n) { return n.i; });
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-6QgabuQN.mjs').then(function (n) { return n.i; });
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-6QgabuQN.mjs').then(function (n) { return n.j; });
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-6QgabuQN.mjs').then(function (n) { return n.h; });
224
- const { GeminiTransport } = await import('./run-6QgabuQN.mjs').then(function (n) { return n.G; });
225
- const { DefaultTransport } = await import('./run-6QgabuQN.mjs').then(function (n) { return n.D; });
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, sessionQueueAdd, sessionQueueList, sessionQueueClear, sessionInboxSend, sessionInboxList, sessionInboxRead, sessionInboxReply, sessionInboxClear } = await import('./commands-ClMc3nSg.mjs');
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-ClMc3nSg.mjs');
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-ClMc3nSg.mjs');
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-ClMc3nSg.mjs');
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-7GGmL2zY.mjs');
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-7GGmL2zY.mjs');
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-7GGmL2zY.mjs');
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-7GGmL2zY.mjs');
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
- const targetId = sessionArgs[2];
589
- if (!targetId) {
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
- const ccStr = parseFlagStr("--cc");
594
- await sessionInboxSend(targetId, targetMachineId, {
595
- subject: parseFlagStr("--subject") || "",
596
- body: parseFlagStr("--body") || "",
597
- urgency: parseFlagStr("--urgency") || "normal",
598
- replyTo: parseFlagStr("--reply-to"),
599
- cc: ccStr ? ccStr.split(",").map((s) => s.trim()).filter(Boolean) : void 0,
600
- wait: hasFlag("--wait"),
601
- timeout: parseFlagInt("--timeout"),
602
- json: hasFlag("--json")
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
- const targetId = sessionArgs[2] && !sessionArgs[2].startsWith("--") ? sessionArgs[2] : process.env.SVAMP_SESSION_ID;
606
- if (!targetId) {
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
- const targetId = sessionArgs[2];
617
- const msgId = sessionArgs[3];
618
- if (!targetId || !msgId) {
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
- let targetId;
627
- let msgId;
628
- if (sessionArgs[3] && !sessionArgs[3].startsWith("--")) {
629
- targetId = sessionArgs[2];
630
- msgId = sessionArgs[3];
631
- } else if (sessionArgs[2] && !sessionArgs[2].startsWith("--")) {
632
- targetId = process.env.SVAMP_SESSION_ID;
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
- const targetId = sessionArgs[2];
647
- if (!targetId) {
648
- console.error("Usage: svamp session inbox clear <session-id> [--all]");
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-ClMc3nSg.mjs');
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-ClMc3nSg.mjs');
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-ClMc3nSg.mjs');
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-7GGmL2zY.mjs');
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-ClMc3nSg.mjs');
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-UFi0_ESV.mjs');
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-sync</string>
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-sync
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
- Svamp daemon supervisor script written!`);
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
- To use in Docker, set your container CMD to:`);
1057
- console.log(` ${wrapperPath}`);
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(` nohup ${wrapperPath} &`);
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.error(`Daemon service install is not supported on ${process.platform}.`);
1066
- console.error("Supported platforms: macOS (launchd), Linux (systemd or wrapper script).");
1067
- process.exit(1);
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 launchd service (macOS) \u2014 auto-restart on crash
1179
- svamp daemon uninstall Remove launchd service
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 <target> --subject "..." --body "..." Send inbox message
1241
- inbox list [session-id] [--unread] [--json] List inbox messages
1242
- inbox read <session-id> <message-id> Read a message
1243
- inbox reply [session-id] <message-id> --body "..." Reply to a message
1244
- inbox clear <session-id> [--all] Clear inbox
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-ClMc3nSg.mjs';
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-6QgabuQN.mjs';
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';