svamp-cli 0.1.31 → 0.1.33

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 { s as startDaemon, b as stopDaemon, d as daemonStatus } from './run-dBWhjQRf.mjs';
1
+ import { s as startDaemon, b as stopDaemon, d as daemonStatus } from './run-fEuWMTdD.mjs';
2
2
  import 'os';
3
3
  import 'fs/promises';
4
4
  import 'fs';
@@ -86,10 +86,12 @@ async function main() {
86
86
  await handleAgentCommand();
87
87
  } else if (subcommand === "session") {
88
88
  await handleSessionCommand();
89
- } else if (subcommand === "--help" || subcommand === "-h" || !subcommand) {
89
+ } else if (subcommand === "--help" || subcommand === "-h") {
90
90
  printHelp();
91
+ } else if (!subcommand || subcommand === "start") {
92
+ await handleInteractiveCommand();
91
93
  } else if (subcommand === "--version" || subcommand === "-v") {
92
- const pkg = await import('./package-BtoCHVOd.mjs').catch(() => ({ default: { version: "unknown" } }));
94
+ const pkg = await import('./package-CMmjP_vD.mjs').catch(() => ({ default: { version: "unknown" } }));
93
95
  console.log(`svamp version: ${pkg.default.version}`);
94
96
  } else {
95
97
  console.error(`Unknown command: ${subcommand}`);
@@ -97,6 +99,45 @@ async function main() {
97
99
  process.exit(1);
98
100
  }
99
101
  }
102
+ async function handleInteractiveCommand() {
103
+ const { runInteractive } = await import('./run-COUdcjR7.mjs');
104
+ const interactiveArgs = subcommand === "start" ? args.slice(1) : args;
105
+ let directory = process.cwd();
106
+ let resumeSessionId;
107
+ let continueSession = false;
108
+ let permissionMode;
109
+ const claudeArgs = [];
110
+ let pastSeparator = false;
111
+ for (let i = 0; i < interactiveArgs.length; i++) {
112
+ if (pastSeparator) {
113
+ claudeArgs.push(interactiveArgs[i]);
114
+ continue;
115
+ }
116
+ if (interactiveArgs[i] === "--") {
117
+ pastSeparator = true;
118
+ continue;
119
+ }
120
+ if ((interactiveArgs[i] === "-d" || interactiveArgs[i] === "--directory") && i + 1 < interactiveArgs.length) {
121
+ directory = interactiveArgs[++i];
122
+ } else if ((interactiveArgs[i] === "--resume" || interactiveArgs[i] === "-r") && i + 1 < interactiveArgs.length) {
123
+ resumeSessionId = interactiveArgs[++i];
124
+ } else if (interactiveArgs[i] === "--continue" || interactiveArgs[i] === "-c") {
125
+ continueSession = true;
126
+ } else if ((interactiveArgs[i] === "--permission-mode" || interactiveArgs[i] === "-p") && i + 1 < interactiveArgs.length) {
127
+ permissionMode = interactiveArgs[++i];
128
+ } else if (interactiveArgs[i] === "--help" || interactiveArgs[i] === "-h") {
129
+ printInteractiveHelp();
130
+ return;
131
+ }
132
+ }
133
+ await runInteractive({
134
+ directory,
135
+ resumeSessionId,
136
+ continueSession,
137
+ permissionMode,
138
+ claudeArgs: claudeArgs.length > 0 ? claudeArgs : void 0
139
+ });
140
+ }
100
141
  async function handleAgentCommand() {
101
142
  const agentArgs = args.slice(1);
102
143
  if (agentArgs.length === 0 || agentArgs[0] === "--help" || agentArgs[0] === "-h") {
@@ -104,19 +145,19 @@ async function handleAgentCommand() {
104
145
  return;
105
146
  }
106
147
  if (agentArgs[0] === "list") {
107
- const { KNOWN_ACP_AGENTS } = await import('./run-dBWhjQRf.mjs').then(function (n) { return n.f; });
108
- console.log("Known ACP agents:");
148
+ const { KNOWN_ACP_AGENTS, KNOWN_MCP_AGENTS: KNOWN_MCP_AGENTS2 } = await import('./run-fEuWMTdD.mjs').then(function (n) { return n.f; });
149
+ console.log("Known agents:");
109
150
  for (const [name, config2] of Object.entries(KNOWN_ACP_AGENTS)) {
110
- console.log(` ${name.padEnd(12)} ${config2.command} ${config2.args.join(" ")}`);
151
+ console.log(` ${name.padEnd(12)} ${config2.command} ${config2.args.join(" ")} (ACP)`);
152
+ }
153
+ for (const [name, config2] of Object.entries(KNOWN_MCP_AGENTS2)) {
154
+ console.log(` ${name.padEnd(12)} ${config2.command} ${config2.args.join(" ")} (MCP)`);
111
155
  }
112
156
  console.log('\nUse "svamp agent <name>" to start an interactive session.');
113
157
  console.log('Use "svamp agent -- <command> [args]" for a custom ACP agent.');
114
158
  return;
115
159
  }
116
- const { resolveAcpAgentConfig } = await import('./run-dBWhjQRf.mjs').then(function (n) { return n.f; });
117
- const { AcpBackend } = await import('./run-dBWhjQRf.mjs').then(function (n) { return n.e; });
118
- const { GeminiTransport } = await import('./run-dBWhjQRf.mjs').then(function (n) { return n.G; });
119
- const { DefaultTransport } = await import('./run-dBWhjQRf.mjs').then(function (n) { return n.D; });
160
+ const { resolveAcpAgentConfig, KNOWN_MCP_AGENTS } = await import('./run-fEuWMTdD.mjs').then(function (n) { return n.f; });
120
161
  let cwd = process.cwd();
121
162
  const filteredArgs = [];
122
163
  for (let i = 0; i < agentArgs.length; i++) {
@@ -134,20 +175,28 @@ async function handleAgentCommand() {
134
175
  console.error(err.message);
135
176
  process.exit(1);
136
177
  }
178
+ const logFn = (...logArgs) => {
179
+ if (process.env.DEBUG) console.error("[debug]", ...logArgs);
180
+ };
137
181
  console.log(`Starting ${config.agentName} agent in ${cwd}...`);
138
- const transportHandler = config.agentName === "gemini" ? new GeminiTransport() : new DefaultTransport(config.agentName);
139
- const backend = new AcpBackend({
140
- agentName: config.agentName,
141
- cwd,
142
- command: config.command,
143
- args: config.args,
144
- transportHandler,
145
- log: (...logArgs) => {
146
- if (process.env.DEBUG) {
147
- console.error("[debug]", ...logArgs);
148
- }
149
- }
150
- });
182
+ let backend;
183
+ if (KNOWN_MCP_AGENTS[config.agentName]) {
184
+ const { CodexMcpBackend } = await import('./run-fEuWMTdD.mjs').then(function (n) { return n.h; });
185
+ backend = new CodexMcpBackend({ cwd, log: logFn });
186
+ } else {
187
+ const { AcpBackend } = await import('./run-fEuWMTdD.mjs').then(function (n) { return n.e; });
188
+ const { GeminiTransport } = await import('./run-fEuWMTdD.mjs').then(function (n) { return n.G; });
189
+ const { DefaultTransport } = await import('./run-fEuWMTdD.mjs').then(function (n) { return n.D; });
190
+ const transportHandler = config.agentName === "gemini" ? new GeminiTransport() : new DefaultTransport(config.agentName);
191
+ backend = new AcpBackend({
192
+ agentName: config.agentName,
193
+ cwd,
194
+ command: config.command,
195
+ args: config.args,
196
+ transportHandler,
197
+ log: logFn
198
+ });
199
+ }
151
200
  let currentText = "";
152
201
  backend.onMessage((msg) => {
153
202
  switch (msg.type) {
@@ -255,7 +304,7 @@ async function handleSessionCommand() {
255
304
  printSessionHelp();
256
305
  return;
257
306
  }
258
- const { sessionList, sessionSpawn, sessionStop, sessionInfo, sessionMessages, sessionAttach, sessionMachines, sessionSend, sessionWait } = await import('./commands-78RHC879.mjs');
307
+ const { sessionList, sessionSpawn, sessionStop, sessionInfo, sessionMessages, sessionAttach, sessionMachines, sessionSend, sessionWait } = await import('./commands-EjpBlIl0.mjs');
259
308
  const parseFlagStr = (flag, shortFlag) => {
260
309
  for (let i = 1; i < sessionArgs.length; i++) {
261
310
  if ((sessionArgs[i] === flag || shortFlag) && i + 1 < sessionArgs.length) {
@@ -645,32 +694,36 @@ async function uninstallDaemonService() {
645
694
  }
646
695
  function printHelp() {
647
696
  console.log(`
648
- svamp \u2014 Svamp CLI with Hypha transport
697
+ svamp \u2014 AI workspace on Hypha Cloud
649
698
 
650
699
  Usage:
700
+ svamp Start interactive Claude session (synced to cloud)
701
+ svamp start [-d <path>] Same as above, with explicit directory
651
702
  svamp login [url] Login to Hypha (opens browser, stores token)
652
703
  svamp daemon start Start the daemon (detached)
653
704
  svamp daemon stop Stop the daemon (sessions preserved for restart)
654
- svamp daemon stop --cleanup Stop and mark all sessions as stopped
655
705
  svamp daemon status Show daemon status
656
706
  svamp daemon install Install as system service (launchd/systemd/wrapper)
657
- svamp daemon uninstall Remove system service
658
- svamp session list List active daemon sessions
659
- svamp session machines List discoverable machines
707
+ svamp session list List active sessions
660
708
  svamp session spawn Spawn a new session on the daemon
661
- svamp session attach <id> Attach to a session (interactive)
709
+ svamp session attach <id> Attach to a session
662
710
  svamp session --help Show all session commands
663
- svamp agent list List known ACP agents
664
- svamp agent <name> Start local ACP agent session
665
- svamp agent -- <cmd> Start custom ACP agent
711
+ svamp agent list List known agents
712
+ svamp agent <name> Start local agent session (gemini, codex)
666
713
  svamp --version Show version
667
714
  svamp --help Show this help
668
715
 
716
+ Interactive mode:
717
+ When you run 'svamp' with no arguments, Claude starts in your terminal
718
+ with full interactive access. Your session is synced to Hypha Cloud so
719
+ it's visible in the web app. When a message arrives from the web app,
720
+ svamp switches to remote mode to process it, then you can press
721
+ Space-Space to return to local mode.
722
+
669
723
  Environment variables:
670
- HYPHA_SERVER_URL Hypha server URL (required for daemon)
724
+ HYPHA_SERVER_URL Hypha server URL (required for cloud sync)
671
725
  HYPHA_TOKEN Hypha auth token (stored by login command)
672
726
  HYPHA_WORKSPACE Hypha workspace / user ID (stored by login command)
673
- SVAMP_MACHINE_ID Machine identifier (optional, auto-generated)
674
727
  SVAMP_HOME Config directory (default: ~/.svamp)
675
728
  `);
676
729
  }
@@ -689,7 +742,7 @@ Usage:
689
742
  }
690
743
  function printSessionHelp() {
691
744
  console.log(`
692
- svamp session \u2014 Manage daemon sessions (Claude, Gemini, OpenCode)
745
+ svamp session \u2014 Manage daemon sessions (Claude, Gemini, Codex)
693
746
 
694
747
  Usage:
695
748
  svamp session list [--active] [--json] List sessions (alias: ls)
@@ -708,7 +761,7 @@ Usage:
708
761
  Options:
709
762
  --machine <id>, -m <id> Target a specific machine (prefix match supported)
710
763
 
711
- Agents: claude (default), gemini, opencode
764
+ Agents: claude (default), gemini, codex
712
765
 
713
766
  Session and machine IDs can be abbreviated (prefix match, like Docker).
714
767
 
@@ -728,22 +781,50 @@ Examples:
728
781
  svamp session attach abc12345
729
782
  `);
730
783
  }
784
+ function printInteractiveHelp() {
785
+ console.log(`
786
+ svamp \u2014 Interactive Claude session with cloud sync
787
+
788
+ Usage:
789
+ svamp [-d <path>] [--resume <id>] [--continue] [--permission-mode <mode>] [-- <claude-args>]
790
+ svamp start [-d <path>] [...]
791
+
792
+ Options:
793
+ -d, --directory <path> Working directory (default: cwd)
794
+ -r, --resume <id> Resume a Claude session by ID
795
+ -c, --continue Continue the last Claude session
796
+ -p, --permission-mode <m> Permission mode: default, acceptEdits, bypassPermissions, plan
797
+ -- Pass remaining args to Claude CLI
798
+
799
+ Modes:
800
+ Local mode Full interactive Claude terminal UI (default)
801
+ Remote mode Processes messages from the web app
802
+
803
+ Switching:
804
+ When a message arrives from the web app \u2192 automatically switches to remote mode
805
+ Space Space Switch from remote mode back to local mode
806
+ Ctrl-C Ctrl-C Exit from remote mode
807
+
808
+ The session is synced to Hypha Cloud so it's visible in the web app.
809
+ Works offline if no Hypha credentials are configured.
810
+ `);
811
+ }
731
812
  function printAgentHelp() {
732
813
  console.log(`
733
- svamp agent \u2014 Interactive ACP agent sessions
814
+ svamp agent \u2014 Interactive agent sessions (local, no daemon required)
734
815
 
735
816
  Usage:
736
- svamp agent list List known ACP agents
817
+ svamp agent list List known agents
737
818
  svamp agent <name> [-d <path>] Start interactive agent session
738
819
  svamp agent -- <cmd> [args] Start custom ACP agent
739
820
 
740
821
  Examples:
741
822
  svamp agent gemini Start Gemini agent in current directory
742
823
  svamp agent gemini -d /tmp/proj Start Gemini agent in /tmp/proj
743
- svamp agent opencode Start OpenCode agent
824
+ svamp agent codex Start Codex agent
744
825
  svamp agent -- mycli --acp Start custom ACP-compatible agent
745
826
 
746
- Known agents: gemini, opencode
827
+ Known agents: gemini (ACP), codex (MCP)
747
828
  `);
748
829
  }
749
830
  main().catch((err) => {
@@ -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-dBWhjQRf.mjs';
4
+ import { c as connectToHypha } from './run-fEuWMTdD.mjs';
5
5
  import 'os';
6
6
  import 'fs/promises';
7
7
  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-dBWhjQRf.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-fEuWMTdD.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.1.31";
2
+ var version = "0.1.32";
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";