svamp-cli 0.2.2 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -148,7 +148,7 @@ async function sessionBroadcast(action, args) {
148
148
  console.log(`Broadcast sent: ${action}`);
149
149
  }
150
150
  async function connectToMachineService() {
151
- const { connectAndGetMachine } = await import('./commands-BuUZ7yRk.mjs');
151
+ const { connectAndGetMachine } = await import('./commands-DxBS60bF.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-BuUZ7yRk.mjs');
168
+ const { resolveSessionId } = await import('./commands-DxBS60bF.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 { b as stopDaemon, s as startDaemon, d as daemonStatus } from './run-BFwCZAeM.mjs';
1
+ import { b as stopDaemon, s as startDaemon, d as daemonStatus } from './run-DA-51t9q.mjs';
2
2
  import 'os';
3
3
  import 'fs/promises';
4
4
  import 'fs';
@@ -231,7 +231,7 @@ async function main() {
231
231
  console.error("svamp process: Process commands are not available in sandboxed sessions.");
232
232
  process.exit(1);
233
233
  }
234
- const { processCommand } = await import('./commands-GswfCT87.mjs');
234
+ const { processCommand } = await import('./commands-C-numdSB.mjs');
235
235
  let machineId;
236
236
  const processArgs = args.slice(1);
237
237
  const mIdx = processArgs.findIndex((a) => a === "--machine" || a === "-m");
@@ -249,7 +249,7 @@ async function main() {
249
249
  } else if (!subcommand || subcommand === "start") {
250
250
  await handleInteractiveCommand();
251
251
  } else if (subcommand === "--version" || subcommand === "-v") {
252
- const pkg = await import('./package-M_gN8K12.mjs').catch(() => ({ default: { version: "unknown" } }));
252
+ const pkg = await import('./package-j4rcEm88.mjs').catch(() => ({ default: { version: "unknown" } }));
253
253
  console.log(`svamp version: ${pkg.default.version}`);
254
254
  } else {
255
255
  console.error(`Unknown command: ${subcommand}`);
@@ -258,7 +258,7 @@ async function main() {
258
258
  }
259
259
  }
260
260
  async function handleInteractiveCommand() {
261
- const { runInteractive } = await import('./run-BBII8Oqn.mjs');
261
+ const { runInteractive } = await import('./run-8oWEecqT.mjs');
262
262
  const interactiveArgs = subcommand === "start" ? args.slice(1) : args;
263
263
  let directory = process.cwd();
264
264
  let resumeSessionId;
@@ -303,7 +303,7 @@ async function handleAgentCommand() {
303
303
  return;
304
304
  }
305
305
  if (agentArgs[0] === "list") {
306
- const { KNOWN_ACP_AGENTS, KNOWN_MCP_AGENTS: KNOWN_MCP_AGENTS2 } = await import('./run-BFwCZAeM.mjs').then(function (n) { return n.i; });
306
+ const { KNOWN_ACP_AGENTS, KNOWN_MCP_AGENTS: KNOWN_MCP_AGENTS2 } = await import('./run-DA-51t9q.mjs').then(function (n) { return n.i; });
307
307
  console.log("Known agents:");
308
308
  for (const [name, config2] of Object.entries(KNOWN_ACP_AGENTS)) {
309
309
  console.log(` ${name.padEnd(12)} ${config2.command} ${config2.args.join(" ")} (ACP)`);
@@ -315,7 +315,7 @@ async function handleAgentCommand() {
315
315
  console.log('Use "svamp agent -- <command> [args]" for a custom ACP agent.');
316
316
  return;
317
317
  }
318
- const { resolveAcpAgentConfig, KNOWN_MCP_AGENTS } = await import('./run-BFwCZAeM.mjs').then(function (n) { return n.i; });
318
+ const { resolveAcpAgentConfig, KNOWN_MCP_AGENTS } = await import('./run-DA-51t9q.mjs').then(function (n) { return n.i; });
319
319
  let cwd = process.cwd();
320
320
  const filteredArgs = [];
321
321
  for (let i = 0; i < agentArgs.length; i++) {
@@ -339,12 +339,12 @@ async function handleAgentCommand() {
339
339
  console.log(`Starting ${config.agentName} agent in ${cwd}...`);
340
340
  let backend;
341
341
  if (KNOWN_MCP_AGENTS[config.agentName]) {
342
- const { CodexMcpBackend } = await import('./run-BFwCZAeM.mjs').then(function (n) { return n.j; });
342
+ const { CodexMcpBackend } = await import('./run-DA-51t9q.mjs').then(function (n) { return n.j; });
343
343
  backend = new CodexMcpBackend({ cwd, log: logFn });
344
344
  } else {
345
- const { AcpBackend } = await import('./run-BFwCZAeM.mjs').then(function (n) { return n.h; });
346
- const { GeminiTransport } = await import('./run-BFwCZAeM.mjs').then(function (n) { return n.G; });
347
- const { DefaultTransport } = await import('./run-BFwCZAeM.mjs').then(function (n) { return n.D; });
345
+ const { AcpBackend } = await import('./run-DA-51t9q.mjs').then(function (n) { return n.h; });
346
+ const { GeminiTransport } = await import('./run-DA-51t9q.mjs').then(function (n) { return n.G; });
347
+ const { DefaultTransport } = await import('./run-DA-51t9q.mjs').then(function (n) { return n.D; });
348
348
  const transportHandler = config.agentName === "gemini" ? new GeminiTransport() : new DefaultTransport(config.agentName);
349
349
  backend = new AcpBackend({
350
350
  agentName: config.agentName,
@@ -471,7 +471,7 @@ async function handleSessionCommand() {
471
471
  process.exit(1);
472
472
  }
473
473
  }
474
- const { sessionList, sessionSpawn, sessionStop, sessionInfo, sessionMessages, sessionAttach, sessionMachines, sessionSend, sessionWait, sessionShare, sessionRalphStart, sessionRalphCancel, sessionRalphStatus, sessionInboxSend, sessionInboxList, sessionInboxRead, sessionInboxReply, sessionInboxClear } = await import('./commands-BuUZ7yRk.mjs');
474
+ const { sessionList, sessionSpawn, sessionStop, sessionInfo, sessionMessages, sessionAttach, sessionMachines, sessionSend, sessionWait, sessionShare, sessionRalphStart, sessionRalphCancel, sessionRalphStatus, sessionInboxSend, sessionInboxList, sessionInboxRead, sessionInboxReply, sessionInboxClear } = await import('./commands-DxBS60bF.mjs');
475
475
  const parseFlagStr = (flag, shortFlag) => {
476
476
  for (let i = 1; i < sessionArgs.length; i++) {
477
477
  if ((sessionArgs[i] === flag || shortFlag) && i + 1 < sessionArgs.length) {
@@ -531,7 +531,7 @@ async function handleSessionCommand() {
531
531
  allowDomain.push(sessionArgs[++i]);
532
532
  }
533
533
  }
534
- const { parseShareArg } = await import('./commands-BuUZ7yRk.mjs');
534
+ const { parseShareArg } = await import('./commands-DxBS60bF.mjs');
535
535
  const shareEntries = share.map((s) => parseShareArg(s));
536
536
  await sessionSpawn(agent, dir, targetMachineId, {
537
537
  message,
@@ -617,7 +617,7 @@ async function handleSessionCommand() {
617
617
  console.error("Usage: svamp session approve <session-id> [request-id] [--json]");
618
618
  process.exit(1);
619
619
  }
620
- const { sessionApprove } = await import('./commands-BuUZ7yRk.mjs');
620
+ const { sessionApprove } = await import('./commands-DxBS60bF.mjs');
621
621
  const approveReqId = sessionArgs[2] && !sessionArgs[2].startsWith("--") ? sessionArgs[2] : void 0;
622
622
  await sessionApprove(sessionArgs[1], approveReqId, targetMachineId, {
623
623
  json: hasFlag("--json")
@@ -627,7 +627,7 @@ async function handleSessionCommand() {
627
627
  console.error("Usage: svamp session deny <session-id> [request-id] [--json]");
628
628
  process.exit(1);
629
629
  }
630
- const { sessionDeny } = await import('./commands-BuUZ7yRk.mjs');
630
+ const { sessionDeny } = await import('./commands-DxBS60bF.mjs');
631
631
  const denyReqId = sessionArgs[2] && !sessionArgs[2].startsWith("--") ? sessionArgs[2] : void 0;
632
632
  await sessionDeny(sessionArgs[1], denyReqId, targetMachineId, {
633
633
  json: hasFlag("--json")
@@ -663,7 +663,7 @@ async function handleSessionCommand() {
663
663
  console.error("Usage: svamp session set-title <title>");
664
664
  process.exit(1);
665
665
  }
666
- const { sessionSetTitle } = await import('./agentCommands-Co86kmSw.mjs');
666
+ const { sessionSetTitle } = await import('./agentCommands-D4sWJpjZ.mjs');
667
667
  await sessionSetTitle(title);
668
668
  } else if (sessionSubcommand === "set-link") {
669
669
  const url = sessionArgs[1];
@@ -672,7 +672,7 @@ async function handleSessionCommand() {
672
672
  process.exit(1);
673
673
  }
674
674
  const label = sessionArgs[2] && !sessionArgs[2].startsWith("--") ? sessionArgs[2] : void 0;
675
- const { sessionSetLink } = await import('./agentCommands-Co86kmSw.mjs');
675
+ const { sessionSetLink } = await import('./agentCommands-D4sWJpjZ.mjs');
676
676
  await sessionSetLink(url, label);
677
677
  } else if (sessionSubcommand === "notify") {
678
678
  const message = sessionArgs[1];
@@ -681,7 +681,7 @@ async function handleSessionCommand() {
681
681
  process.exit(1);
682
682
  }
683
683
  const level = parseFlagStr("--level") || "info";
684
- const { sessionNotify } = await import('./agentCommands-Co86kmSw.mjs');
684
+ const { sessionNotify } = await import('./agentCommands-D4sWJpjZ.mjs');
685
685
  await sessionNotify(message, level);
686
686
  } else if (sessionSubcommand === "broadcast") {
687
687
  const action = sessionArgs[1];
@@ -689,7 +689,7 @@ async function handleSessionCommand() {
689
689
  console.error("Usage: svamp session broadcast <action> [args...]\nActions: open-canvas <url> [label], close-canvas, toast <message>");
690
690
  process.exit(1);
691
691
  }
692
- const { sessionBroadcast } = await import('./agentCommands-Co86kmSw.mjs');
692
+ const { sessionBroadcast } = await import('./agentCommands-D4sWJpjZ.mjs');
693
693
  await sessionBroadcast(action, sessionArgs.slice(2).filter((a) => !a.startsWith("--")));
694
694
  } else if (sessionSubcommand === "inbox") {
695
695
  const inboxSubcmd = sessionArgs[1];
@@ -700,7 +700,7 @@ async function handleSessionCommand() {
700
700
  process.exit(1);
701
701
  }
702
702
  if (agentSessionId) {
703
- const { inboxSend } = await import('./agentCommands-Co86kmSw.mjs');
703
+ const { inboxSend } = await import('./agentCommands-D4sWJpjZ.mjs');
704
704
  await inboxSend(sessionArgs[2], {
705
705
  body: sessionArgs[3],
706
706
  subject: parseFlagStr("--subject"),
@@ -715,7 +715,7 @@ async function handleSessionCommand() {
715
715
  }
716
716
  } else if (inboxSubcmd === "list" || inboxSubcmd === "ls") {
717
717
  if (agentSessionId && !sessionArgs[2]) {
718
- const { inboxList } = await import('./agentCommands-Co86kmSw.mjs');
718
+ const { inboxList } = await import('./agentCommands-D4sWJpjZ.mjs');
719
719
  await inboxList({
720
720
  unread: hasFlag("--unread"),
721
721
  limit: parseFlagInt("--limit"),
@@ -737,7 +737,7 @@ async function handleSessionCommand() {
737
737
  process.exit(1);
738
738
  }
739
739
  if (agentSessionId && !sessionArgs[3]) {
740
- const { inboxList } = await import('./agentCommands-Co86kmSw.mjs');
740
+ const { inboxList } = await import('./agentCommands-D4sWJpjZ.mjs');
741
741
  await sessionInboxRead(agentSessionId, sessionArgs[2], targetMachineId);
742
742
  } else if (sessionArgs[3]) {
743
743
  await sessionInboxRead(sessionArgs[2], sessionArgs[3], targetMachineId);
@@ -747,7 +747,7 @@ async function handleSessionCommand() {
747
747
  }
748
748
  } else if (inboxSubcmd === "reply") {
749
749
  if (agentSessionId && sessionArgs[2] && sessionArgs[3] && !sessionArgs[4]) {
750
- const { inboxReply } = await import('./agentCommands-Co86kmSw.mjs');
750
+ const { inboxReply } = await import('./agentCommands-D4sWJpjZ.mjs');
751
751
  await inboxReply(sessionArgs[2], sessionArgs[3]);
752
752
  } else if (sessionArgs[2] && sessionArgs[3] && sessionArgs[4]) {
753
753
  await sessionInboxReply(sessionArgs[2], sessionArgs[3], sessionArgs[4], targetMachineId);
@@ -783,7 +783,7 @@ async function handleMachineCommand() {
783
783
  return;
784
784
  }
785
785
  if (machineSubcommand === "share") {
786
- const { machineShare } = await import('./commands-BuUZ7yRk.mjs');
786
+ const { machineShare } = await import('./commands-DxBS60bF.mjs');
787
787
  let machineId;
788
788
  const shareArgs = [];
789
789
  for (let i = 1; i < machineArgs.length; i++) {
@@ -813,7 +813,7 @@ async function handleMachineCommand() {
813
813
  }
814
814
  await machineShare(machineId, { add, remove, list, configPath, showConfig });
815
815
  } else if (machineSubcommand === "exec") {
816
- const { machineExec } = await import('./commands-BuUZ7yRk.mjs');
816
+ const { machineExec } = await import('./commands-DxBS60bF.mjs');
817
817
  let machineId;
818
818
  let cwd;
819
819
  const cmdParts = [];
@@ -833,7 +833,7 @@ async function handleMachineCommand() {
833
833
  }
834
834
  await machineExec(machineId, command, cwd);
835
835
  } else if (machineSubcommand === "info") {
836
- const { machineInfo } = await import('./commands-BuUZ7yRk.mjs');
836
+ const { machineInfo } = await import('./commands-DxBS60bF.mjs');
837
837
  let machineId;
838
838
  for (let i = 1; i < machineArgs.length; i++) {
839
839
  if ((machineArgs[i] === "--machine" || machineArgs[i] === "-m") && i + 1 < machineArgs.length) {
@@ -853,10 +853,10 @@ async function handleMachineCommand() {
853
853
  level = machineArgs[++i];
854
854
  }
855
855
  }
856
- const { machineNotify } = await import('./agentCommands-Co86kmSw.mjs');
856
+ const { machineNotify } = await import('./agentCommands-D4sWJpjZ.mjs');
857
857
  await machineNotify(message, level);
858
858
  } else if (machineSubcommand === "ls") {
859
- const { machineLs } = await import('./commands-BuUZ7yRk.mjs');
859
+ const { machineLs } = await import('./commands-DxBS60bF.mjs');
860
860
  let machineId;
861
861
  let showHidden = false;
862
862
  let path;
@@ -1,11 +1,11 @@
1
1
  import { writeFileSync, readFileSync } from 'fs';
2
2
  import { resolve } from 'path';
3
- import { connectAndGetMachine } from './commands-BuUZ7yRk.mjs';
3
+ import { connectAndGetMachine } from './commands-DxBS60bF.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-BFwCZAeM.mjs';
8
+ import './run-DA-51t9q.mjs';
9
9
  import 'os';
10
10
  import 'fs/promises';
11
11
  import 'url';
@@ -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 { l as loadSecurityContextConfig, e as resolveSecurityContext, f as buildSecurityContextFromFlags, m as mergeSecurityContexts, c as connectToHypha } from './run-BFwCZAeM.mjs';
5
+ import { l as loadSecurityContextConfig, e as resolveSecurityContext, f as buildSecurityContextFromFlags, m as mergeSecurityContexts, c as connectToHypha } from './run-DA-51t9q.mjs';
6
6
  import 'os';
7
7
  import 'fs/promises';
8
8
  import 'fs';
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-BFwCZAeM.mjs';
1
+ export { c as connectToHypha, d as daemonStatus, g as getHyphaServerUrl, r as registerMachineService, a as registerSessionService, s as startDaemon, b as stopDaemon } from './run-DA-51t9q.mjs';
2
2
  import 'os';
3
3
  import 'fs/promises';
4
4
  import 'fs';
@@ -1,5 +1,5 @@
1
1
  var name = "svamp-cli";
2
- var version = "0.2.2";
2
+ var version = "0.2.4";
3
3
  var description = "Svamp CLI — AI workspace daemon on Hypha Cloud";
4
4
  var author = "Amun AI AB";
5
5
  var license = "SEE LICENSE IN LICENSE";
@@ -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 { join, resolve } from 'node:path';
4
4
  import { mkdirSync, writeFileSync, existsSync, unlinkSync, readFileSync, watch } from 'node:fs';
5
- import { c as connectToHypha, a as registerSessionService } from './run-BFwCZAeM.mjs';
5
+ import { c as connectToHypha, a as registerSessionService } from './run-DA-51t9q.mjs';
6
6
  import { createServer } from 'node:http';
7
7
  import { spawn } from 'node:child_process';
8
8
  import { createInterface } from 'node:readline';
@@ -1710,6 +1710,61 @@ function createSessionStore(server, sessionId, initialMetadata, initialAgentStat
1710
1710
  } catch {
1711
1711
  }
1712
1712
  return { success: true, listenerId: listeners.length - 1 };
1713
+ },
1714
+ // ── BTW (By The Way) — ephemeral side-channel ──
1715
+ btw: async (question, context) => {
1716
+ authorizeRequest(context, metadata.sharing, "view");
1717
+ if (!question || typeof question !== "string") {
1718
+ return { success: false, error: "Question is required" };
1719
+ }
1720
+ const claudeSessionId = metadata.claudeSessionId;
1721
+ if (!claudeSessionId) {
1722
+ return { success: false, error: "No active Claude session to query" };
1723
+ }
1724
+ const { spawn } = await import('child_process');
1725
+ const cwd = metadata.path || process.cwd();
1726
+ return new Promise((resolve) => {
1727
+ const args = [
1728
+ "--print",
1729
+ question,
1730
+ "--resume",
1731
+ claudeSessionId,
1732
+ "--fork-session",
1733
+ "--no-session-persistence",
1734
+ "--output-format",
1735
+ "json",
1736
+ "--max-turns",
1737
+ "1"
1738
+ ];
1739
+ const child = spawn("claude", args, {
1740
+ cwd,
1741
+ timeout: 6e4,
1742
+ env: { ...process.env, CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: "1" }
1743
+ });
1744
+ let stdout = "";
1745
+ let stderr = "";
1746
+ child.stdout?.on("data", (d) => {
1747
+ stdout += d.toString();
1748
+ });
1749
+ child.stderr?.on("data", (d) => {
1750
+ stderr += d.toString();
1751
+ });
1752
+ child.on("close", (code) => {
1753
+ if (code !== 0 && !stdout) {
1754
+ resolve({ success: false, error: stderr || `claude exited with code ${code}` });
1755
+ return;
1756
+ }
1757
+ try {
1758
+ const result = JSON.parse(stdout);
1759
+ resolve({ success: true, answer: result.result || result.text || stdout });
1760
+ } catch {
1761
+ resolve({ success: true, answer: stdout.trim() });
1762
+ }
1763
+ });
1764
+ child.on("error", (err) => {
1765
+ resolve({ success: false, error: err.message });
1766
+ });
1767
+ });
1713
1768
  }
1714
1769
  };
1715
1770
  const store = {
@@ -5354,7 +5409,7 @@ function createSvampConfigChecker(directory, sessionId, getMetadata, setMetadata
5354
5409
  if (rl && typeof rl === "object" && typeof rl.task === "string") {
5355
5410
  const contextMode = rl.context_mode === "fresh" || rl.context_mode === "continue" ? rl.context_mode : void 0;
5356
5411
  writeRalphState(ralphStatePath, {
5357
- iteration: rl.current_iteration || 1,
5412
+ iteration: typeof rl.current_iteration === "number" ? Math.max(0, rl.current_iteration - 1) : 0,
5358
5413
  max_iterations: typeof rl.max_iterations === "number" ? rl.max_iterations : 0,
5359
5414
  completion_promise: rl.completion_promise === "none" || rl.completion_promise === null ? null : rl.completion_promise || "DONE",
5360
5415
  cooldown_seconds: (() => {
@@ -6341,6 +6396,20 @@ async function startDaemon(options) {
6341
6396
  sessionService.pushMessage({ type: "session_event", message: taskInfo }, "session");
6342
6397
  }
6343
6398
  signalProcessing(false);
6399
+ sessionWasProcessing = false;
6400
+ if (claudeResumeId && !trackedSession.stopped) {
6401
+ saveSession({
6402
+ sessionId,
6403
+ directory,
6404
+ claudeResumeId,
6405
+ permissionMode: currentPermissionMode,
6406
+ spawnMeta: lastSpawnMeta,
6407
+ metadata: sessionMetadata,
6408
+ createdAt: Date.now(),
6409
+ machineId,
6410
+ wasProcessing: false
6411
+ });
6412
+ }
6344
6413
  turnInitiatedByUser = true;
6345
6414
  continue;
6346
6415
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "svamp-cli",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "Svamp CLI — AI workspace daemon on Hypha Cloud",
5
5
  "author": "Amun AI AB",
6
6
  "license": "SEE LICENSE IN LICENSE",