svamp-cli 0.2.55 → 0.2.56

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.
@@ -1,22 +1,22 @@
1
1
  ---
2
- name: html-output
3
- version: 0.5.0
4
- description: Render rich inline visual output in chat. Write an HTML file (or point at a URL) and emit a single self-closing `<html-output src="..." />` tag — the Svamp client renders it as a sandboxed iframe.
2
+ name: artifact
3
+ version: 1.0.0
4
+ description: Embed a rendered HTML file or live URL inline in chat via a single self-closing `<artifact src="..." />` tag — the Svamp client renders it as a sandboxed iframe with modes for inline, card, bare, and immersive.
5
5
  tags:
6
6
  - svamp
7
- - html
7
+ - artifact
8
8
  - rendering
9
9
  - visualization
10
10
  author: svamp
11
11
  license: MIT
12
12
  ---
13
13
 
14
- # HTML Output
14
+ # Artifact
15
15
 
16
- Render rich visual output by writing an HTML file (or pointing at a running server's URL) and emitting a single self-closing tag:
16
+ Embed rich visual output inline by writing an HTML file (or pointing at a running server's URL) and emitting a single self-closing tag:
17
17
 
18
18
  ```
19
- <html-output src="./outputs/dashboard.html" title="Dashboard" />
19
+ <artifact src="./outputs/dashboard.html" title="Dashboard" />
20
20
  ```
21
21
 
22
22
  The client reads the file, inlines relative refs (`./image.png` etc.) as data URIs, and renders it in a sandboxed iframe — like a Jupyter cell output. **Default to plain markdown for ordinary answers.**
@@ -27,19 +27,19 @@ Three options, pick the lightest that works:
27
27
 
28
28
  | Mechanism | When |
29
29
  |---|---|
30
- | **Inline `<html-output src="./viz.html" />`** | Self-contained visualization. Cards, charts, animations, prototypes. Files live on disk; the chat marker is tiny. |
31
- | **URL `<html-output src="https://my-app.example.com/" height="540" />`** | Embed a live server you're running, or any external site. Like a Canvas panel inline. |
30
+ | **Inline `<artifact src="./viz.html" />`** | Self-contained visualization. Cards, charts, animations, prototypes. Files live on disk; the chat marker is tiny. |
31
+ | **URL `<artifact src="https://my-app.example.com/" height="540" />`** | Embed a live server you're running, or any external site. Like a Canvas panel inline. |
32
32
  | **Standalone server (`svamp serve` / `svamp service expose`)** | Real apps with backend, database, multi-user state. Post the URL as a normal markdown link. |
33
33
 
34
34
  **Decision tree:**
35
35
  1. Need a backend / database / persistent state? → standalone server.
36
- 2. Iterating on a single artifact (HTML file, dashboard, dataviz)? → write to file, emit `<html-output src="..." />`.
36
+ 2. Iterating on a single artifact (HTML file, dashboard, dataviz)? → write to file, emit `<artifact src="..." />`.
37
37
  3. Want to embed a running server inline (preview a dev server, show a deployed app)? → URL src.
38
38
 
39
39
  ## Attributes
40
40
 
41
41
  ```html
42
- <html-output
42
+ <artifact
43
43
  src="./outputs/viz.html" <!-- REQUIRED: relative file path or absolute URL -->
44
44
  title="Dashboard" <!-- header label -->
45
45
  height="540" <!-- fixed pixel height (10..4000); default = auto-size for files -->
@@ -95,7 +95,7 @@ Pick disposable when the output is throwaway (one-off charts, scratch demos). Pi
95
95
 
96
96
  ## Iteration
97
97
 
98
- When you iterate on the same artifact, **edit the file in place** and emit a new `<html-output src="..." />` tag. The client auto-detects that two blocks share a `src` and:
98
+ When you iterate on the same artifact, **edit the file in place** and emit a new `<artifact src="..." />` tag. The client auto-detects that two blocks share a `src` and:
99
99
  - Renders only the **latest** block inline.
100
100
  - Collapses older ones into a "Newer version below ↓" pill that scrolls to the latest on click.
101
101
 
@@ -227,7 +227,7 @@ Lean on what HTML does well — flow layout, typography, animation — without o
227
227
 
228
228
  Then write it to `./outputs/comparison.html` and emit:
229
229
  ```
230
- <html-output src="./outputs/comparison.html" title="Comparison" />
230
+ <artifact src="./outputs/comparison.html" title="Comparison" />
231
231
  ```
232
232
 
233
233
  ### 2. Animated entry (no JS framework)
@@ -280,7 +280,7 @@ Then write it to `./outputs/comparison.html` and emit:
280
280
 
281
281
  Emit:
282
282
  ```
283
- <html-output src="./outputs/3d.html" title="3D viewer" height="540" mode="card" poster="./outputs/3d-thumb.png" description="Click to launch the rotating cube demo" />
283
+ <artifact src="./outputs/3d.html" title="3D viewer" height="540" mode="card" poster="./outputs/3d-thumb.png" description="Click to launch the rotating cube demo" />
284
284
  ```
285
285
 
286
286
  ### 4. Live data from agent-spawned API
@@ -312,7 +312,7 @@ svamp service expose sales-api --port 8000
312
312
 
313
313
  Then emit:
314
314
  ```
315
- <html-output src="./outputs/sales-dashboard.html" title="Sales (live)" />
315
+ <artifact src="./outputs/sales-dashboard.html" title="Sales (live)" />
316
316
  ```
317
317
 
318
318
  ### 5. URL embed (CanvasPanel-style)
@@ -320,23 +320,23 @@ Then emit:
320
320
  For a running dev server, deployed app, or external site:
321
321
 
322
322
  ```
323
- <html-output src="https://my-app.example.com/" title="My app" height="640" />
323
+ <artifact src="https://my-app.example.com/" title="My app" height="640" />
324
324
  ```
325
325
 
326
326
  No file needed. Auto-resize doesn't work for URL embeds — set `height` explicitly.
327
327
 
328
328
  ## Anti-patterns
329
329
 
330
- - **Don't put HTML inline** — `<html-output>...HTML body...</html-output>` is not supported. Always use `src="./file.html"`.
330
+ - **Don't put HTML inline** — `<artifact>...HTML body...</artifact>` is not supported. Always use `src="./file.html"`.
331
331
  - **Don't fetch from non-CORS endpoints.** If you don't control the server, the iframe can't reach it. Pre-compute and embed.
332
332
  - **Don't omit `<!doctype html>`** in your HTML file. Quirks mode breaks CSS.
333
- - **Don't open multiple `<html-output>`s back-to-back** for content that could be one. One artifact = one file = one tag.
333
+ - **Don't open multiple `<artifact>`s back-to-back** for content that could be one. One artifact = one file = one tag.
334
334
  - **Don't write huge files** (>5 MB total inlined assets). The block won't render past the cap.
335
335
  - **Don't put visualization assets in git** when they're disposable — use `.svamp/<sessionId>/outputs/`.
336
336
 
337
337
  ## Checklist
338
338
 
339
- Before emitting `<html-output src="..." />`:
339
+ Before emitting `<artifact src="..." />`:
340
340
  1. Did you actually write the file? (Use the Write tool.)
341
341
  2. Is the path relative to the session cwd, OR an absolute `https://` URL?
342
342
  3. For fullscreen-only content, set `mode="card"` with a `poster`.
@@ -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-DMK1Aj5z.mjs');
151
+ const { connectAndGetMachine } = await import('./commands-CEq6IsUJ.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-DMK1Aj5z.mjs');
168
+ const { resolveSessionId } = await import('./commands-CEq6IsUJ.mjs');
169
169
  const sessions = await machine.listSessions();
170
170
  const match = resolveSessionId(sessions, targetSessionId);
171
171
  const fullTargetId = match.sessionId;
package/dist/cli.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { s as startDaemon, b as stopDaemon, d as daemonStatus } from './run-3bGmfj05.mjs';
1
+ import { s as startDaemon, b as stopDaemon, d as daemonStatus } from './run-a3tcb38_.mjs';
2
2
  import 'os';
3
3
  import 'fs/promises';
4
4
  import 'fs';
@@ -43,7 +43,7 @@ async function main() {
43
43
  console.error(`svamp daemon restart: ${err.message || err}`);
44
44
  process.exit(1);
45
45
  }
46
- const { restartDaemon } = await import('./run-3bGmfj05.mjs').then(function (n) { return n.u; });
46
+ const { restartDaemon } = await import('./run-a3tcb38_.mjs').then(function (n) { return n.u; });
47
47
  await restartDaemon();
48
48
  process.exit(0);
49
49
  }
@@ -279,7 +279,7 @@ async function main() {
279
279
  console.error("svamp service: Service commands are not available in sandboxed sessions.");
280
280
  process.exit(1);
281
281
  }
282
- const { handleServiceCommand } = await import('./commands-Dv0QB3Lt.mjs');
282
+ const { handleServiceCommand } = await import('./commands-DfifaEbW.mjs');
283
283
  await handleServiceCommand();
284
284
  } else if (subcommand === "serve") {
285
285
  const { isSandboxed: isSandboxedServe } = await import('./sandboxDetect-DNTcbgWD.mjs');
@@ -287,7 +287,7 @@ async function main() {
287
287
  console.error("svamp serve: Serve commands are not available in sandboxed sessions.");
288
288
  process.exit(1);
289
289
  }
290
- const { handleServeCommand } = await import('./serveCommands-Dx8qGlqL.mjs');
290
+ const { handleServeCommand } = await import('./serveCommands-C77qUVpI.mjs');
291
291
  await handleServeCommand();
292
292
  process.exit(0);
293
293
  } else if (subcommand === "process" || subcommand === "proc") {
@@ -296,7 +296,7 @@ async function main() {
296
296
  console.error("svamp process: Process commands are not available in sandboxed sessions.");
297
297
  process.exit(1);
298
298
  }
299
- const { processCommand } = await import('./commands-BtZQY_f4.mjs');
299
+ const { processCommand } = await import('./commands-DR7o1R2b.mjs');
300
300
  let machineId;
301
301
  const processArgs = args.slice(1);
302
302
  const mIdx = processArgs.findIndex((a) => a === "--machine" || a === "-m");
@@ -314,7 +314,7 @@ async function main() {
314
314
  } else if (!subcommand || subcommand === "start") {
315
315
  await handleInteractiveCommand();
316
316
  } else if (subcommand === "--version" || subcommand === "-v") {
317
- const pkg = await import('./package-CQXxJuAV.mjs').catch(() => ({ default: { version: "unknown" } }));
317
+ const pkg = await import('./package-DUYA_zrl.mjs').catch(() => ({ default: { version: "unknown" } }));
318
318
  console.log(`svamp version: ${pkg.default.version}`);
319
319
  } else {
320
320
  console.error(`Unknown command: ${subcommand}`);
@@ -323,7 +323,7 @@ async function main() {
323
323
  }
324
324
  }
325
325
  async function handleInteractiveCommand() {
326
- const { runInteractive } = await import('./run-CV4UIwhB.mjs');
326
+ const { runInteractive } = await import('./run-D-yYK3EG.mjs');
327
327
  const interactiveArgs = subcommand === "start" ? args.slice(1) : args;
328
328
  let directory = process.cwd();
329
329
  let resumeSessionId;
@@ -368,7 +368,7 @@ async function handleAgentCommand() {
368
368
  return;
369
369
  }
370
370
  if (agentArgs[0] === "list") {
371
- const { KNOWN_ACP_AGENTS, KNOWN_MCP_AGENTS: KNOWN_MCP_AGENTS2 } = await import('./run-3bGmfj05.mjs').then(function (n) { return n.p; });
371
+ const { KNOWN_ACP_AGENTS, KNOWN_MCP_AGENTS: KNOWN_MCP_AGENTS2 } = await import('./run-a3tcb38_.mjs').then(function (n) { return n.p; });
372
372
  console.log("Known agents:");
373
373
  for (const [name, config2] of Object.entries(KNOWN_ACP_AGENTS)) {
374
374
  console.log(` ${name.padEnd(12)} ${config2.command} ${config2.args.join(" ")} (ACP)`);
@@ -380,7 +380,7 @@ async function handleAgentCommand() {
380
380
  console.log('Use "svamp agent -- <command> [args]" for a custom ACP agent.');
381
381
  return;
382
382
  }
383
- const { resolveAcpAgentConfig, KNOWN_MCP_AGENTS } = await import('./run-3bGmfj05.mjs').then(function (n) { return n.p; });
383
+ const { resolveAcpAgentConfig, KNOWN_MCP_AGENTS } = await import('./run-a3tcb38_.mjs').then(function (n) { return n.p; });
384
384
  let cwd = process.cwd();
385
385
  const filteredArgs = [];
386
386
  for (let i = 0; i < agentArgs.length; i++) {
@@ -404,12 +404,12 @@ async function handleAgentCommand() {
404
404
  console.log(`Starting ${config.agentName} agent in ${cwd}...`);
405
405
  let backend;
406
406
  if (KNOWN_MCP_AGENTS[config.agentName]) {
407
- const { CodexMcpBackend } = await import('./run-3bGmfj05.mjs').then(function (n) { return n.q; });
407
+ const { CodexMcpBackend } = await import('./run-a3tcb38_.mjs').then(function (n) { return n.q; });
408
408
  backend = new CodexMcpBackend({ cwd, log: logFn });
409
409
  } else {
410
- const { AcpBackend } = await import('./run-3bGmfj05.mjs').then(function (n) { return n.o; });
411
- const { GeminiTransport } = await import('./run-3bGmfj05.mjs').then(function (n) { return n.G; });
412
- const { DefaultTransport } = await import('./run-3bGmfj05.mjs').then(function (n) { return n.D; });
410
+ const { AcpBackend } = await import('./run-a3tcb38_.mjs').then(function (n) { return n.o; });
411
+ const { GeminiTransport } = await import('./run-a3tcb38_.mjs').then(function (n) { return n.G; });
412
+ const { DefaultTransport } = await import('./run-a3tcb38_.mjs').then(function (n) { return n.D; });
413
413
  const transportHandler = config.agentName === "gemini" ? new GeminiTransport() : new DefaultTransport(config.agentName);
414
414
  backend = new AcpBackend({
415
415
  agentName: config.agentName,
@@ -536,7 +536,7 @@ async function handleSessionCommand() {
536
536
  process.exit(1);
537
537
  }
538
538
  }
539
- const { sessionList, sessionSpawn, sessionStop, sessionInfo, sessionMessages, sessionAttach, sessionMachines, sessionSend, sessionWait, sessionShare, sessionRalphStart, sessionRalphCancel, sessionRalphStatus, sessionInboxSend, sessionInboxList, sessionInboxRead, sessionInboxReply, sessionInboxClear } = await import('./commands-DMK1Aj5z.mjs');
539
+ const { sessionList, sessionSpawn, sessionStop, sessionInfo, sessionMessages, sessionAttach, sessionMachines, sessionSend, sessionWait, sessionShare, sessionRalphStart, sessionRalphCancel, sessionRalphStatus, sessionInboxSend, sessionInboxList, sessionInboxRead, sessionInboxReply, sessionInboxClear } = await import('./commands-CEq6IsUJ.mjs');
540
540
  const parseFlagStr = (flag, shortFlag) => {
541
541
  for (let i = 1; i < sessionArgs.length; i++) {
542
542
  if ((sessionArgs[i] === flag || shortFlag) && i + 1 < sessionArgs.length) {
@@ -596,7 +596,7 @@ async function handleSessionCommand() {
596
596
  allowDomain.push(sessionArgs[++i]);
597
597
  }
598
598
  }
599
- const { parseShareArg } = await import('./commands-DMK1Aj5z.mjs');
599
+ const { parseShareArg } = await import('./commands-CEq6IsUJ.mjs');
600
600
  const shareEntries = share.map((s) => parseShareArg(s));
601
601
  await sessionSpawn(agent, dir, targetMachineId, {
602
602
  message,
@@ -682,7 +682,7 @@ async function handleSessionCommand() {
682
682
  console.error("Usage: svamp session approve <session-id> [request-id] [--json]");
683
683
  process.exit(1);
684
684
  }
685
- const { sessionApprove } = await import('./commands-DMK1Aj5z.mjs');
685
+ const { sessionApprove } = await import('./commands-CEq6IsUJ.mjs');
686
686
  const approveReqId = sessionArgs[2] && !sessionArgs[2].startsWith("--") ? sessionArgs[2] : void 0;
687
687
  await sessionApprove(sessionArgs[1], approveReqId, targetMachineId, {
688
688
  json: hasFlag("--json")
@@ -692,7 +692,7 @@ async function handleSessionCommand() {
692
692
  console.error("Usage: svamp session deny <session-id> [request-id] [--json]");
693
693
  process.exit(1);
694
694
  }
695
- const { sessionDeny } = await import('./commands-DMK1Aj5z.mjs');
695
+ const { sessionDeny } = await import('./commands-CEq6IsUJ.mjs');
696
696
  const denyReqId = sessionArgs[2] && !sessionArgs[2].startsWith("--") ? sessionArgs[2] : void 0;
697
697
  await sessionDeny(sessionArgs[1], denyReqId, targetMachineId, {
698
698
  json: hasFlag("--json")
@@ -728,7 +728,7 @@ async function handleSessionCommand() {
728
728
  console.error("Usage: svamp session set-title <title>");
729
729
  process.exit(1);
730
730
  }
731
- const { sessionSetTitle } = await import('./agentCommands-D3sy9AT2.mjs');
731
+ const { sessionSetTitle } = await import('./agentCommands-3F23ymKC.mjs');
732
732
  await sessionSetTitle(title);
733
733
  } else if (sessionSubcommand === "set-link") {
734
734
  const url = sessionArgs[1];
@@ -737,7 +737,7 @@ async function handleSessionCommand() {
737
737
  process.exit(1);
738
738
  }
739
739
  const label = sessionArgs[2] && !sessionArgs[2].startsWith("--") ? sessionArgs[2] : void 0;
740
- const { sessionSetLink } = await import('./agentCommands-D3sy9AT2.mjs');
740
+ const { sessionSetLink } = await import('./agentCommands-3F23ymKC.mjs');
741
741
  await sessionSetLink(url, label);
742
742
  } else if (sessionSubcommand === "notify") {
743
743
  const message = sessionArgs[1];
@@ -746,7 +746,7 @@ async function handleSessionCommand() {
746
746
  process.exit(1);
747
747
  }
748
748
  const level = parseFlagStr("--level") || "info";
749
- const { sessionNotify } = await import('./agentCommands-D3sy9AT2.mjs');
749
+ const { sessionNotify } = await import('./agentCommands-3F23ymKC.mjs');
750
750
  await sessionNotify(message, level);
751
751
  } else if (sessionSubcommand === "broadcast") {
752
752
  const action = sessionArgs[1];
@@ -754,7 +754,7 @@ async function handleSessionCommand() {
754
754
  console.error("Usage: svamp session broadcast <action> [args...]\nActions: open-canvas <url> [label], close-canvas, toast <message>");
755
755
  process.exit(1);
756
756
  }
757
- const { sessionBroadcast } = await import('./agentCommands-D3sy9AT2.mjs');
757
+ const { sessionBroadcast } = await import('./agentCommands-3F23ymKC.mjs');
758
758
  await sessionBroadcast(action, sessionArgs.slice(2).filter((a) => !a.startsWith("--")));
759
759
  } else if (sessionSubcommand === "inbox") {
760
760
  const inboxSubcmd = sessionArgs[1];
@@ -765,7 +765,7 @@ async function handleSessionCommand() {
765
765
  process.exit(1);
766
766
  }
767
767
  if (agentSessionId) {
768
- const { inboxSend } = await import('./agentCommands-D3sy9AT2.mjs');
768
+ const { inboxSend } = await import('./agentCommands-3F23ymKC.mjs');
769
769
  await inboxSend(sessionArgs[2], {
770
770
  body: sessionArgs[3],
771
771
  subject: parseFlagStr("--subject"),
@@ -780,7 +780,7 @@ async function handleSessionCommand() {
780
780
  }
781
781
  } else if (inboxSubcmd === "list" || inboxSubcmd === "ls") {
782
782
  if (agentSessionId && !sessionArgs[2]) {
783
- const { inboxList } = await import('./agentCommands-D3sy9AT2.mjs');
783
+ const { inboxList } = await import('./agentCommands-3F23ymKC.mjs');
784
784
  await inboxList({
785
785
  unread: hasFlag("--unread"),
786
786
  limit: parseFlagInt("--limit"),
@@ -802,7 +802,7 @@ async function handleSessionCommand() {
802
802
  process.exit(1);
803
803
  }
804
804
  if (agentSessionId && !sessionArgs[3]) {
805
- const { inboxList } = await import('./agentCommands-D3sy9AT2.mjs');
805
+ const { inboxList } = await import('./agentCommands-3F23ymKC.mjs');
806
806
  await sessionInboxRead(agentSessionId, sessionArgs[2], targetMachineId);
807
807
  } else if (sessionArgs[3]) {
808
808
  await sessionInboxRead(sessionArgs[2], sessionArgs[3], targetMachineId);
@@ -812,7 +812,7 @@ async function handleSessionCommand() {
812
812
  }
813
813
  } else if (inboxSubcmd === "reply") {
814
814
  if (agentSessionId && sessionArgs[2] && sessionArgs[3] && !sessionArgs[4]) {
815
- const { inboxReply } = await import('./agentCommands-D3sy9AT2.mjs');
815
+ const { inboxReply } = await import('./agentCommands-3F23ymKC.mjs');
816
816
  await inboxReply(sessionArgs[2], sessionArgs[3]);
817
817
  } else if (sessionArgs[2] && sessionArgs[3] && sessionArgs[4]) {
818
818
  await sessionInboxReply(sessionArgs[2], sessionArgs[3], sessionArgs[4], targetMachineId);
@@ -848,7 +848,7 @@ async function handleMachineCommand() {
848
848
  return;
849
849
  }
850
850
  if (machineSubcommand === "share") {
851
- const { machineShare } = await import('./commands-DMK1Aj5z.mjs');
851
+ const { machineShare } = await import('./commands-CEq6IsUJ.mjs');
852
852
  let machineId;
853
853
  const shareArgs = [];
854
854
  for (let i = 1; i < machineArgs.length; i++) {
@@ -878,7 +878,7 @@ async function handleMachineCommand() {
878
878
  }
879
879
  await machineShare(machineId, { add, remove, list, configPath, showConfig });
880
880
  } else if (machineSubcommand === "exec") {
881
- const { machineExec } = await import('./commands-DMK1Aj5z.mjs');
881
+ const { machineExec } = await import('./commands-CEq6IsUJ.mjs');
882
882
  let machineId;
883
883
  let cwd;
884
884
  const cmdParts = [];
@@ -898,7 +898,7 @@ async function handleMachineCommand() {
898
898
  }
899
899
  await machineExec(machineId, command, cwd);
900
900
  } else if (machineSubcommand === "info") {
901
- const { machineInfo } = await import('./commands-DMK1Aj5z.mjs');
901
+ const { machineInfo } = await import('./commands-CEq6IsUJ.mjs');
902
902
  let machineId;
903
903
  for (let i = 1; i < machineArgs.length; i++) {
904
904
  if ((machineArgs[i] === "--machine" || machineArgs[i] === "-m") && i + 1 < machineArgs.length) {
@@ -918,10 +918,10 @@ async function handleMachineCommand() {
918
918
  level = machineArgs[++i];
919
919
  }
920
920
  }
921
- const { machineNotify } = await import('./agentCommands-D3sy9AT2.mjs');
921
+ const { machineNotify } = await import('./agentCommands-3F23ymKC.mjs');
922
922
  await machineNotify(message, level);
923
923
  } else if (machineSubcommand === "ls") {
924
- const { machineLs } = await import('./commands-DMK1Aj5z.mjs');
924
+ const { machineLs } = await import('./commands-CEq6IsUJ.mjs');
925
925
  let machineId;
926
926
  let showHidden = false;
927
927
  let path;
@@ -1388,7 +1388,7 @@ async function applyClaudeAuthFlags(argv) {
1388
1388
  "--use-hypha-proxy, --use-claude-login, and --anthropic-base-url/--anthropic-api-key are mutually exclusive"
1389
1389
  );
1390
1390
  }
1391
- const mod = await import('./run-3bGmfj05.mjs').then(function (n) { return n.t; });
1391
+ const mod = await import('./run-a3tcb38_.mjs').then(function (n) { return n.t; });
1392
1392
  if (hasHypha) {
1393
1393
  mod.setClaudeAuthHyphaProxy();
1394
1394
  console.log("Claude auth configured: hypha-proxy (uses HYPHA_TOKEN live at each spawn).");
@@ -1426,7 +1426,7 @@ async function applyDaemonShareFlag(argv) {
1426
1426
  }
1427
1427
  }
1428
1428
  if (collected.length === 0) return;
1429
- const { updateEnvFile } = await import('./run-3bGmfj05.mjs').then(function (n) { return n.t; });
1429
+ const { updateEnvFile } = await import('./run-a3tcb38_.mjs').then(function (n) { return n.t; });
1430
1430
  const seen = /* @__PURE__ */ new Set();
1431
1431
  const deduped = collected.filter((e) => {
1432
1432
  const k = e.toLowerCase();
@@ -1439,7 +1439,7 @@ async function applyDaemonShareFlag(argv) {
1439
1439
  }
1440
1440
  async function handleDaemonAuthCommand(argv) {
1441
1441
  const sub = (argv[0] || "status").toLowerCase();
1442
- const mod = await import('./run-3bGmfj05.mjs').then(function (n) { return n.t; });
1442
+ const mod = await import('./run-a3tcb38_.mjs').then(function (n) { return n.t; });
1443
1443
  if (sub === "--help" || sub === "-h" || sub === "help") {
1444
1444
  console.log(`
1445
1445
  svamp daemon auth \u2014 Configure how Claude subprocesses authenticate
@@ -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 { n as normalizeAllowedUser, l as loadSecurityContextConfig, e as resolveSecurityContext, f as buildSecurityContextFromFlags, m as mergeSecurityContexts, c as connectToHypha, i as buildSessionShareUrl, j as buildMachineShareUrl } from './run-3bGmfj05.mjs';
5
+ import { n as normalizeAllowedUser, l as loadSecurityContextConfig, e as resolveSecurityContext, f as buildSecurityContextFromFlags, m as mergeSecurityContexts, c as connectToHypha, i as buildSessionShareUrl, j as buildMachineShareUrl } from './run-a3tcb38_.mjs';
6
6
  import 'os';
7
7
  import 'fs/promises';
8
8
  import 'fs';
@@ -1,11 +1,11 @@
1
1
  import { writeFileSync, readFileSync } from 'fs';
2
2
  import { resolve } from 'path';
3
- import { connectAndGetMachine } from './commands-DMK1Aj5z.mjs';
3
+ import { connectAndGetMachine } from './commands-CEq6IsUJ.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-3bGmfj05.mjs';
8
+ import './run-a3tcb38_.mjs';
9
9
  import 'os';
10
10
  import 'fs/promises';
11
11
  import 'url';
@@ -97,7 +97,7 @@ async function serviceServe(args) {
97
97
  }
98
98
  async function serviceList(_args) {
99
99
  try {
100
- const { connectAndGetMachine } = await import('./commands-DMK1Aj5z.mjs');
100
+ const { connectAndGetMachine } = await import('./commands-CEq6IsUJ.mjs');
101
101
  const { server, machine } = await connectAndGetMachine();
102
102
  try {
103
103
  const tunnels = await machine.tunnelList({});
@@ -126,7 +126,7 @@ async function serviceDelete(args) {
126
126
  process.exit(1);
127
127
  }
128
128
  try {
129
- const { connectAndGetMachine } = await import('./commands-DMK1Aj5z.mjs');
129
+ const { connectAndGetMachine } = await import('./commands-CEq6IsUJ.mjs');
130
130
  const { server, machine } = await connectAndGetMachine();
131
131
  try {
132
132
  await machine.tunnelStop({ name });
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-3bGmfj05.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-a3tcb38_.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.55";
2
+ var version = "0.2.56";
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";
@@ -17,7 +17,7 @@ var exports$1 = {
17
17
  "./cli": "./dist/cli.mjs"
18
18
  };
19
19
  var scripts = {
20
- build: "rm -rf dist bin/skills && mkdir -p bin/skills && cp -r ../../skills/html-output bin/skills/html-output && tsc --noEmit && pkgroll",
20
+ build: "rm -rf dist bin/skills && mkdir -p bin/skills && cp -r ../../skills/artifact bin/skills/artifact && tsc --noEmit && pkgroll",
21
21
  typecheck: "tsc --noEmit",
22
22
  test: "npx tsx test/test-authorize.mjs && npx tsx test/test-normalize-allowed-user.mjs && npx tsx test/test-share-url.mjs && npx tsx test/test-update-sharing-normalization.mjs && npx tsx test/test-staged-homes-sweep.mjs && npx tsx test/test-session-helpers.mjs && npx tsx test/test-cli-routing.mjs && npx tsx test/test-security-context.mjs && npx tsx test/test-isolation-decision.mjs && npx tsx test/test-ralph-loop.mjs && npx tsx test/test-message-helpers.mjs && npx tsx test/test-agent-config.mjs && npx tsx test/test-wrap-command.mjs && npx tsx test/test-credential-staging.mjs && npx tsx test/test-claude-auth.mjs && npx tsx test/test-output-formatters.mjs && npx tsx test/test-agent-types.mjs && npx tsx test/test-transport.mjs && npx tsx test/test-session-update-handlers.mjs && npx tsx test/test-session-scanner.mjs && npx tsx test/test-hypha-client.mjs && npx tsx test/test-hook-settings.mjs && npx tsx test/test-session-service-logic.mjs && npx tsx test/test-daemon-persistence.mjs && npx tsx test/test-detect-isolation.mjs && npx tsx test/test-machine-service-logic.mjs && npx tsx test/test-interactive-helpers.mjs && npx tsx test/test-codex-backend.mjs && npx tsx test/test-acp-backend.mjs && npx tsx test/test-acp-bridge.mjs && npx tsx test/test-hook-server.mjs && npx tsx test/test-session-commands.mjs && npx tsx test/test-interactive-console.mjs && npx tsx test/test-session-messages.mjs && npx tsx test/test-skills.mjs && npx tsx test/test-agent-grouping.mjs && npx tsx test/test-ralph-loop-integration.mjs && npx tsx test/test-ralph-loop-modes.mjs && npx tsx test/test-machine-list-directory.mjs && npx tsx test/test-service-commands.mjs && npx tsx test/test-supervisor.mjs && npx tsx test/test-supervisor-lock.mjs && npx tsx test/test-clear-detection.mjs && npx tsx test/test-session-consolidation.mjs && npx tsx test/test-inbox.mjs && npx tsx test/test-session-rpc-dispatch.mjs && npx tsx test/test-sandbox-cli.mjs && npx tsx test/test-serve-manager.mjs && npx tsx test/test-serve-stability.mjs && npx tsx test/test-frpc-e2e.mjs --unit-only",
23
23
  "test:hypha": "node --no-warnings test/test-hypha-service.mjs",
@@ -2,7 +2,7 @@ import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(im
2
2
  import os from 'node:os';
3
3
  import { resolve, join } from 'node:path';
4
4
  import { existsSync, readFileSync, watch } from 'node:fs';
5
- import { c as connectToHypha, a as registerSessionService, k as generateHookSettings } from './run-3bGmfj05.mjs';
5
+ import { c as connectToHypha, a as registerSessionService, k as generateHookSettings } from './run-a3tcb38_.mjs';
6
6
  import { createServer } from 'node:http';
7
7
  import { spawn } from 'node:child_process';
8
8
  import { createInterface } from 'node:readline';
@@ -6126,7 +6126,7 @@ You are running inside a Svamp session (id: ${sessionId}) on Hypha Cloud. Use th
6126
6126
  - \`svamp session set-link "<url>" "<label>"\` \u2014 surface any viewable artifact as a button
6127
6127
  - \`svamp session notify "<msg>" [--level info|warning|error]\` \u2014 send a user notification
6128
6128
 
6129
- **Rich HTML output:** Write HTML to a file (\`.svamp/<sessionId>/outputs/\` for disposable, \`./outputs/\` for persistent) and emit \`<html-output src="./outputs/viz.html" title="..." />\` \u2014 the Svamp client renders it inline as a sandboxed iframe with theme CSS vars, auto-resize, file inlining, and a header with Reload/Fullscreen/\u22EE menu. Modes: \`default\`, \`bare\` (controls on hover), \`immersive\` (no chrome), \`card\` (click-to-open preview with \`description\`+\`poster\`). Use \`<html-output src="https://..." height="540" />\` to embed a live server. Run \`svamp serve <name> <dir>\` to share. Use a real backend server (\`svamp service expose\`) when you need persistence/auth. See the \`html-output\` skill.
6129
+ **Artifacts (rich inline output):** Write HTML to a file (\`.svamp/<sessionId>/outputs/\` for disposable, \`./outputs/\` for persistent) and emit \`<artifact src="./outputs/viz.html" title="..." />\` \u2014 the Svamp client renders it inline as a sandboxed iframe with theme CSS vars, auto-resize, file inlining, and a header with Reload/Fullscreen/\u22EE menu. Modes: \`default\`, \`bare\` (controls on hover), \`immersive\` (no chrome), \`card\` (click-to-open preview with \`description\`+\`poster\`). Use \`<artifact src="https://..." height="540" />\` to embed a live server. Run \`svamp serve <name> <dir>\` to share. Use a real backend server (\`svamp service expose\`) when you need persistence/auth. See the \`artifact\` skill.
6130
6130
 
6131
6131
  ## Parallel Agents
6132
6132
 
@@ -6519,20 +6519,20 @@ async function ensureAutoInstalledSkills(logger) {
6519
6519
  // hypha skill ships from a different endpoint without a version probe yet.
6520
6520
  },
6521
6521
  {
6522
- // `<html-output>` block rendering — see packages/svamp-app/.../HtmlOutput.tsx.
6523
- // Bundled inside the npm package (bin/skills/html-output/) so it's installed
6522
+ // `<artifact>` block rendering — see packages/svamp-app/.../Artifact.tsx.
6523
+ // Bundled inside the npm package (bin/skills/artifact/) so it's installed
6524
6524
  // by default even before the marketplace artifact is published, and even offline.
6525
6525
  // Optional: also publish to the marketplace via:
6526
- // HYPHA_TOKEN=$HYPHA_SKILLS_TOKEN node scripts/publish-skills.mjs html-output
6527
- name: "html-output",
6526
+ // HYPHA_TOKEN=$HYPHA_SKILLS_TOKEN node scripts/publish-skills.mjs artifact
6527
+ name: "artifact",
6528
6528
  install: async () => {
6529
6529
  try {
6530
- installBundledSkill("html-output");
6530
+ installBundledSkill("artifact");
6531
6531
  } catch {
6532
- await installSkillFromMarketplace("html-output");
6532
+ await installSkillFromMarketplace("artifact");
6533
6533
  }
6534
6534
  },
6535
- marketplaceVersion: async () => readBundledSkillVersion("html-output")
6535
+ marketplaceVersion: async () => readBundledSkillVersion("artifact")
6536
6536
  }
6537
6537
  ];
6538
6538
  for (const task of tasks) {
@@ -7375,7 +7375,7 @@ async function startDaemon(options) {
7375
7375
  const supervisor = new ProcessSupervisor(join(SVAMP_HOME, "processes"));
7376
7376
  await supervisor.init();
7377
7377
  const tunnels = /* @__PURE__ */ new Map();
7378
- const { ServeManager } = await import('./serveManager-BHwz3pu2.mjs');
7378
+ const { ServeManager } = await import('./serveManager-D0rSoflf.mjs');
7379
7379
  const serveManager = new ServeManager(SVAMP_HOME, (msg) => logger.log(`[SERVE] ${msg}`), hyphaServerUrl);
7380
7380
  ensureAutoInstalledSkills(logger).catch(() => {
7381
7381
  });
@@ -54,7 +54,7 @@ async function handleServeCommand() {
54
54
  }
55
55
  }
56
56
  async function serveAdd(args, machineId) {
57
- const { connectAndGetMachine } = await import('./commands-DMK1Aj5z.mjs');
57
+ const { connectAndGetMachine } = await import('./commands-CEq6IsUJ.mjs');
58
58
  const pos = positionalArgs(args);
59
59
  const name = pos[0];
60
60
  if (!name) {
@@ -86,7 +86,7 @@ async function serveAdd(args, machineId) {
86
86
  }
87
87
  }
88
88
  async function serveApply(args, machineId) {
89
- const { connectAndGetMachine } = await import('./commands-DMK1Aj5z.mjs');
89
+ const { connectAndGetMachine } = await import('./commands-CEq6IsUJ.mjs');
90
90
  const fs = await import('fs');
91
91
  const yaml = await import('yaml');
92
92
  const file = positionalArgs(args)[0];
@@ -171,7 +171,7 @@ async function serveApply(args, machineId) {
171
171
  }
172
172
  }
173
173
  async function serveRemove(args, machineId) {
174
- const { connectAndGetMachine } = await import('./commands-DMK1Aj5z.mjs');
174
+ const { connectAndGetMachine } = await import('./commands-CEq6IsUJ.mjs');
175
175
  const pos = positionalArgs(args);
176
176
  const name = pos[0];
177
177
  if (!name) {
@@ -191,7 +191,7 @@ async function serveRemove(args, machineId) {
191
191
  }
192
192
  }
193
193
  async function serveList(args, machineId) {
194
- const { connectAndGetMachine } = await import('./commands-DMK1Aj5z.mjs');
194
+ const { connectAndGetMachine } = await import('./commands-CEq6IsUJ.mjs');
195
195
  const all = hasFlag(args, "--all", "-a");
196
196
  const json = hasFlag(args, "--json");
197
197
  const sessionId = getFlag(args, "--session");
@@ -224,7 +224,7 @@ async function serveList(args, machineId) {
224
224
  }
225
225
  }
226
226
  async function serveInfo(machineId) {
227
- const { connectAndGetMachine } = await import('./commands-DMK1Aj5z.mjs');
227
+ const { connectAndGetMachine } = await import('./commands-CEq6IsUJ.mjs');
228
228
  const { machine, server } = await connectAndGetMachine(machineId);
229
229
  try {
230
230
  const info = await machine.serveInfo();
@@ -3,7 +3,7 @@ import * as fs from 'fs';
3
3
  import * as http from 'http';
4
4
  import * as net from 'net';
5
5
  import * as path from 'path';
6
- import { S as ServeAuth, h as hasCookieToken } from './run-3bGmfj05.mjs';
6
+ import { S as ServeAuth, h as hasCookieToken } from './run-a3tcb38_.mjs';
7
7
  import 'os';
8
8
  import 'fs/promises';
9
9
  import 'url';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "svamp-cli",
3
- "version": "0.2.55",
3
+ "version": "0.2.56",
4
4
  "description": "Svamp CLI — AI workspace daemon on Hypha Cloud",
5
5
  "author": "Amun AI AB",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -18,7 +18,7 @@
18
18
  "./cli": "./dist/cli.mjs"
19
19
  },
20
20
  "scripts": {
21
- "build": "rm -rf dist bin/skills && mkdir -p bin/skills && cp -r ../../skills/html-output bin/skills/html-output && tsc --noEmit && pkgroll",
21
+ "build": "rm -rf dist bin/skills && mkdir -p bin/skills && cp -r ../../skills/artifact bin/skills/artifact && tsc --noEmit && pkgroll",
22
22
  "typecheck": "tsc --noEmit",
23
23
  "test": "npx tsx test/test-authorize.mjs && npx tsx test/test-normalize-allowed-user.mjs && npx tsx test/test-share-url.mjs && npx tsx test/test-update-sharing-normalization.mjs && npx tsx test/test-staged-homes-sweep.mjs && npx tsx test/test-session-helpers.mjs && npx tsx test/test-cli-routing.mjs && npx tsx test/test-security-context.mjs && npx tsx test/test-isolation-decision.mjs && npx tsx test/test-ralph-loop.mjs && npx tsx test/test-message-helpers.mjs && npx tsx test/test-agent-config.mjs && npx tsx test/test-wrap-command.mjs && npx tsx test/test-credential-staging.mjs && npx tsx test/test-claude-auth.mjs && npx tsx test/test-output-formatters.mjs && npx tsx test/test-agent-types.mjs && npx tsx test/test-transport.mjs && npx tsx test/test-session-update-handlers.mjs && npx tsx test/test-session-scanner.mjs && npx tsx test/test-hypha-client.mjs && npx tsx test/test-hook-settings.mjs && npx tsx test/test-session-service-logic.mjs && npx tsx test/test-daemon-persistence.mjs && npx tsx test/test-detect-isolation.mjs && npx tsx test/test-machine-service-logic.mjs && npx tsx test/test-interactive-helpers.mjs && npx tsx test/test-codex-backend.mjs && npx tsx test/test-acp-backend.mjs && npx tsx test/test-acp-bridge.mjs && npx tsx test/test-hook-server.mjs && npx tsx test/test-session-commands.mjs && npx tsx test/test-interactive-console.mjs && npx tsx test/test-session-messages.mjs && npx tsx test/test-skills.mjs && npx tsx test/test-agent-grouping.mjs && npx tsx test/test-ralph-loop-integration.mjs && npx tsx test/test-ralph-loop-modes.mjs && npx tsx test/test-machine-list-directory.mjs && npx tsx test/test-service-commands.mjs && npx tsx test/test-supervisor.mjs && npx tsx test/test-supervisor-lock.mjs && npx tsx test/test-clear-detection.mjs && npx tsx test/test-session-consolidation.mjs && npx tsx test/test-inbox.mjs && npx tsx test/test-session-rpc-dispatch.mjs && npx tsx test/test-sandbox-cli.mjs && npx tsx test/test-serve-manager.mjs && npx tsx test/test-serve-stability.mjs && npx tsx test/test-frpc-e2e.mjs --unit-only",
24
24
  "test:hypha": "node --no-warnings test/test-hypha-service.mjs",