svamp-cli 0.2.289 → 0.2.291

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.
Files changed (28) hide show
  1. package/dist/{adminCommands-C7-LgldE.mjs → adminCommands-DuA0IQ8B.mjs} +1 -1
  2. package/dist/{agentCommands-B7HQJo3X.mjs → agentCommands-CoPsnzwK.mjs} +5 -5
  3. package/dist/{auth-BB_4_6P7.mjs → auth-Dj_Pcii4.mjs} +1 -1
  4. package/dist/{cli-BH5LIMPI.mjs → cli-CuzIOUig.mjs} +72 -68
  5. package/dist/cli.mjs +2 -2
  6. package/dist/{commands-BaVcBOKA.mjs → commands-B-VYM4sA.mjs} +1 -1
  7. package/dist/commands-B9puiDBS.mjs +329 -0
  8. package/dist/{commands-Cf9KT-Ob.mjs → commands-Bfgme-kK.mjs} +2 -2
  9. package/dist/{commands-BNxsrqSl.mjs → commands-Cx8mEjjt.mjs} +2 -2
  10. package/dist/{commands-CZSPOqtd.mjs → commands-DSI9ZUTG.mjs} +1 -1
  11. package/dist/{commands-BsiQdwUs.mjs → commands-DwQIShcm.mjs} +2 -2
  12. package/dist/{commands-Bb-RzoKB.mjs → commands-eBqn9KgI.mjs} +1 -1
  13. package/dist/{commands-DFSD7jBH.mjs → commands-kahqMkYE.mjs} +8 -8
  14. package/dist/{fleet-2c-iNucb.mjs → fleet-CqbZhBG2.mjs} +1 -1
  15. package/dist/{frpc-CuvdlU0g.mjs → frpc-BeGCyERl.mjs} +45 -27
  16. package/dist/{headlessCli-CftEZbxm.mjs → headlessCli-CJiHG0gu.mjs} +2 -2
  17. package/dist/index.mjs +1 -1
  18. package/dist/{notifyCommands-1q8COUDd.mjs → notifyCommands-CXjWSZHe.mjs} +1 -1
  19. package/dist/package-C0aVCX6O.mjs +64 -0
  20. package/dist/{rpc-DMpJef5v.mjs → rpc-1Ic_yDzC.mjs} +1 -1
  21. package/dist/{rpc-C9U0Ho27.mjs → rpc-DiG_DaMK.mjs} +1 -1
  22. package/dist/{run-BNeZiySO.mjs → run-CKLU1B02.mjs} +119 -26
  23. package/dist/{run-CCENV09o.mjs → run-DZJuuuAu.mjs} +1 -1
  24. package/dist/{scheduler-CAUwniWA.mjs → scheduler-C5Gk_hYP.mjs} +1 -1
  25. package/dist/{serveCommands-XJVDS4zB.mjs → serveCommands-Dipn0QHs.mjs} +5 -5
  26. package/dist/{sideband-DB4Uipz9.mjs → sideband-BCMGW33d.mjs} +1 -1
  27. package/package.json +46 -46
  28. package/dist/package-DrTlgNWY.mjs +0 -64
@@ -0,0 +1,64 @@
1
+ var name = "svamp-cli";
2
+ var version = "0.2.291";
3
+ var description = "Svamp CLI — AI workspace daemon on Hypha Cloud";
4
+ var author = "Amun AI AB";
5
+ var license = "SEE LICENSE IN LICENSE";
6
+ var type = "module";
7
+ var bin = {
8
+ svamp: "./bin/svamp.mjs"
9
+ };
10
+ var files = [
11
+ "dist",
12
+ "bin"
13
+ ];
14
+ var main = "./dist/index.mjs";
15
+ var exports$1 = {
16
+ ".": "./dist/index.mjs",
17
+ "./cli": "./dist/cli.mjs"
18
+ };
19
+ var scripts = {
20
+ build: "rm -rf dist bin/skills bin/commands && mkdir -p bin/skills && cp -r ../../skills/artifact bin/skills/artifact && cp -r ../../skills/crew bin/skills/crew && cp -r ../../commands bin/commands && tsc --noEmit && pkgroll",
21
+ typecheck: "tsc --noEmit",
22
+ test: "npx tsx test/test-context-window.mjs && npx tsx test/test-ratelimit-retry.mjs && npx tsx test/test-instance-config.mjs && 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-sharing-notify-sync.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-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-backend-accounts.mjs && npx tsx test/test-codex-force-model.mjs && npx tsx test/test-backend-oauth.mjs && npx tsx test/test-btw-proxy-env.mjs && npx tsx test/test-output-formatters.mjs && npx tsx test/test-inbox-guard.mjs && npx tsx test/test-user-events.mjs && npx tsx test/test-migrate-children.mjs && npx tsx test/test-outpost-install.mjs && npx tsx test/test-inbox-reconcile.mjs && npx tsx test/test-auto-topic.mjs && npx tsx test/test-project-info.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-isolation-disable.mjs && npx tsx test/test-machine-service-logic.mjs && npx tsx test/test-session-access-fallback.mjs && npx tsx test/test-interactive-helpers.mjs && npx tsx test/test-codex-app-server.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-session-send-query.mjs && npx tsx test/test-skills.mjs && npx tsx test/test-agent-grouping.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 && node test/test-supervisor-restart.mjs && npx tsx test/test-clear-detection.mjs && npx tsx test/test-compact-detect.mjs && npx tsx test/test-session-consolidation.mjs && npx tsx test/test-inbox-store.mjs && npx tsx test/test-inbox.mjs && npx tsx test/test-inbox-cross-machine.mjs && npx tsx test/test-issue-store.mjs && npx tsx test/test-issue-close-gate.mjs && npx tsx test/test-loop-verify.mjs && npx tsx test/test-restore-decision.mjs && npx tsx test/test-issue-rpc.mjs && npx tsx test/test-issue-pause.mjs && npx tsx test/test-workflow-store.mjs && npx tsx test/test-workflow-rpc.mjs && npx tsx test/test-workflow-scheduler.mjs && npx tsx test/test-cron.mjs && npx tsx test/test-workflow-runs.mjs && npx tsx test/test-workflow-idle.mjs && npx tsx test/test-serve-link-subdomain.mjs && npx tsx test/test-short-id.mjs && npx tsx test/test-transcript-edit.mjs && npx tsx test/test-edit-history.mjs && npx tsx test/test-friendly-name.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-ws-upgrade.mjs && npx tsx test/test-serve-auth.mjs && npx tsx test/test-static-file-server.mjs && npx tsx test/test-serve-stability.mjs && npx tsx test/test-frpc-e2e.mjs --unit-only && npx tsx test/test-frpc-status.mjs && node test/pinnedClaudeCode.test.mjs && node test/fleet.test.mjs && npx tsx test/test-session-file.mjs && npx tsx test/test-channel-rpc.mjs && npx tsx test/test-wise-agent.mjs && npx tsx test/test-channel-agent.mjs && npx tsx test/test-channels-service.mjs && npx tsx test/test-hotreload-seam.mjs && npx tsx test/test-hot-reload.mjs && npx tsx test/test-hot-reload-live.mjs && npx tsx test/test-session-core.mjs && npx tsx test/test-channel-async-reply.mjs && npx tsx test/test-outbox-reload.mjs && npx tsx test/test-channel-binding.mjs && npx tsx test/test-channel-identity.mjs && npx tsx test/test-stateless-dispatch-limiter.mjs && npx tsx test/test-shared-session-identity.mjs && npx tsx test/test-wise-agent-auth.mjs && npx tsx test/test-channel-http.mjs && npx tsx test/test-channel-upload.mjs && npx tsx test/test-wise-voice.mjs && npx tsx test/test-wise-headless.mjs && npx tsx test/test-wise-machine.mjs && npx tsx test/test-crew-merge.mjs && npx tsx test/test-crew-verdict-routing.mjs && npx tsx test/test-crew-standalone.mjs && npx tsx test/test-session-links.mjs && npx tsx test/test-issue-loop-pause-guard.mjs && npx tsx test/test-artifact-guard.mjs && npx tsx test/test-artifact-sync-pagination.mjs && npx tsx test/test-graceful-restart.mjs && npx tsx test/test-flush-exit.mjs",
23
+ "test:hypha": "node --no-warnings test/test-hypha-service.mjs",
24
+ dev: "tsx src/cli.ts",
25
+ "dev:daemon": "tsx src/cli.ts daemon start-sync",
26
+ "test:e2e": "node --no-warnings test/e2e-session-tests.mjs",
27
+ "test:frpc": "npx tsx test/test-frpc-e2e.mjs",
28
+ prepublishOnly: "yarn build"
29
+ };
30
+ var dependencies = {
31
+ "@agentclientprotocol/sdk": "^0.14.1",
32
+ "@modelcontextprotocol/sdk": "^1.25.3",
33
+ "hypha-rpc": "0.21.42",
34
+ "node-pty": "1.2.0-beta.11",
35
+ ws: "^8.18.0",
36
+ yaml: "^2.8.2",
37
+ zod: "^3.24.4"
38
+ };
39
+ var devDependencies = {
40
+ "@types/node": ">=20",
41
+ "@types/ws": "^8.5.14",
42
+ pkgroll: "^2.14.2",
43
+ tsx: "^4.20.6",
44
+ typescript: "5.9.3"
45
+ };
46
+ var packageManager = "yarn@1.22.22";
47
+ var _package = {
48
+ name: name,
49
+ version: version,
50
+ description: description,
51
+ author: author,
52
+ license: license,
53
+ type: type,
54
+ bin: bin,
55
+ files: files,
56
+ main: main,
57
+ exports: exports$1,
58
+ scripts: scripts,
59
+ dependencies: dependencies,
60
+ devDependencies: devDependencies,
61
+ packageManager: packageManager
62
+ };
63
+
64
+ export { author, bin, _package as default, dependencies, description, devDependencies, exports$1 as exports, files, license, main, name, packageManager, scripts, type, version };
@@ -1,4 +1,4 @@
1
- import { j as resolveProjectRoot, u as updateIssue, k as getIssue, l as resumeIssue, p as pauseIssue, m as addComment, n as addIssue, o as listIssues, q as searchIssues, t as isVisibleTo } from './run-BNeZiySO.mjs';
1
+ import { j as resolveProjectRoot, u as updateIssue, k as getIssue, l as resumeIssue, p as pauseIssue, m as addComment, n as addIssue, o as listIssues, q as searchIssues, t as isVisibleTo } from './run-CKLU1B02.mjs';
2
2
  import 'os';
3
3
  import 'fs/promises';
4
4
  import 'fs';
@@ -1,4 +1,4 @@
1
- import { j as resolveProjectRoot, v as getRun, w as listRuns, x as getWorkflow, y as runWorkflow, z as setWorkflowEnabled, A as removeWorkflow, B as saveWorkflow, C as rawWorkflow, D as listWorkflows } from './run-BNeZiySO.mjs';
1
+ import { j as resolveProjectRoot, v as getRun, w as listRuns, x as getWorkflow, y as runWorkflow, z as setWorkflowEnabled, A as removeWorkflow, B as saveWorkflow, C as rawWorkflow, D as listWorkflows } from './run-CKLU1B02.mjs';
2
2
  import 'os';
3
3
  import 'fs/promises';
4
4
  import 'fs';
@@ -2973,7 +2973,7 @@ Connection: close\r
2973
2973
  const mount = this.mounts.get(mountName);
2974
2974
  const subdomainOverride = mount?.access === "link" && mount.linkToken ? /* @__PURE__ */ new Map([[this.port, buildLinkSubdomain(subdomainSafe, mount.linkToken)]]) : void 0;
2975
2975
  try {
2976
- const { FrpcTunnel } = await import('./frpc-CuvdlU0g.mjs');
2976
+ const { FrpcTunnel } = await import('./frpc-BeGCyERl.mjs');
2977
2977
  let tunnel;
2978
2978
  tunnel = new FrpcTunnel({
2979
2979
  name: tunnelName,
@@ -3269,11 +3269,17 @@ function buildCodexProviderArgs(cfg) {
3269
3269
  if (cfg.model) configArgs.push("-c", `model=${JSON.stringify(cfg.model)}`);
3270
3270
  return { configArgs, env: { [CODEX_PROVIDER_KEY_ENV]: cfg.apiKey }, model: cfg.model };
3271
3271
  }
3272
+ function codexForcedModel(env = process.env) {
3273
+ const f = (env.SVAMP_CODEX_FORCE_MODEL || "").toLowerCase();
3274
+ if (!f || f === "0" || f === "false" || f === "no" || f === "off") return void 0;
3275
+ return env.SVAMP_CODEX_MODEL || env.LLM_MODEL || void 0;
3276
+ }
3272
3277
 
3273
3278
  var codexProvider = /*#__PURE__*/Object.freeze({
3274
3279
  __proto__: null,
3275
3280
  CODEX_PROVIDER_KEY_ENV: CODEX_PROVIDER_KEY_ENV,
3276
3281
  buildCodexProviderArgs: buildCodexProviderArgs,
3282
+ codexForcedModel: codexForcedModel,
3277
3283
  codexPermissionSettings: codexPermissionSettings,
3278
3284
  hasCustomProvider: hasCustomProvider,
3279
3285
  resolveCodexProvider: resolveCodexProvider
@@ -4361,6 +4367,48 @@ function renderMessage(channel, { sender = {}, body = {}, query = {}, callId, no
4361
4367
  return renderTemplate(channel.template || DEFAULT_TEMPLATE, ctx);
4362
4368
  }
4363
4369
 
4370
+ class StatelessDispatchLimiter {
4371
+ constructor(maxConcurrent, maxPerSender) {
4372
+ this.maxConcurrent = maxConcurrent;
4373
+ this.maxPerSender = maxPerSender;
4374
+ }
4375
+ inflight = 0;
4376
+ perSender = /* @__PURE__ */ new Map();
4377
+ /** Try to reserve a dispatch slot for `sender`. Returns false (reserve nothing) if either cap
4378
+ * is already at its limit. On true, the caller MUST call release(sender) exactly once. */
4379
+ tryAcquire(sender) {
4380
+ const key = sender || "anonymous";
4381
+ if (this.inflight >= this.maxConcurrent) return false;
4382
+ const s = this.perSender.get(key) || 0;
4383
+ if (s >= this.maxPerSender) return false;
4384
+ this.inflight++;
4385
+ this.perSender.set(key, s + 1);
4386
+ return true;
4387
+ }
4388
+ /** Release a slot previously reserved by tryAcquire. Clamped so a double-release can't drive
4389
+ * the counters negative. */
4390
+ release(sender) {
4391
+ const key = sender || "anonymous";
4392
+ if (this.inflight > 0) this.inflight--;
4393
+ const s = (this.perSender.get(key) || 0) - 1;
4394
+ if (s > 0) this.perSender.set(key, s);
4395
+ else this.perSender.delete(key);
4396
+ }
4397
+ /** Current total in-flight dispatches (for diagnostics/tests). */
4398
+ get active() {
4399
+ return this.inflight;
4400
+ }
4401
+ }
4402
+ function statelessDispatchCaps(env = process.env) {
4403
+ const num = (v, dflt) => {
4404
+ const n = Number(v);
4405
+ return Number.isFinite(n) && n > 0 ? Math.floor(n) : dflt;
4406
+ };
4407
+ const concurrent = num(env.SVAMP_CHANNEL_MAX_CONCURRENT, 6);
4408
+ const perSender = Math.min(num(env.SVAMP_CHANNEL_MAX_PER_SENDER, 2), concurrent);
4409
+ return { concurrent, perSender };
4410
+ }
4411
+
4364
4412
  const MAX_PER_CHANNEL = 200;
4365
4413
  const TTL_MS = 60 * 60 * 1e3;
4366
4414
  const COMPACT_EVERY = 500;
@@ -4588,6 +4636,11 @@ class ChannelOutbox {
4588
4636
  }
4589
4637
  }
4590
4638
 
4639
+ var outbox = /*#__PURE__*/Object.freeze({
4640
+ __proto__: null,
4641
+ ChannelOutbox: ChannelOutbox
4642
+ });
4643
+
4591
4644
  function getParamNames(fn) {
4592
4645
  const src = fn.toString();
4593
4646
  const match = src.match(/^(?:async\s+)?(?:function\s*\w*)?\s*\(([^)]*)\)/);
@@ -5816,7 +5869,7 @@ async function registerMachineService(server, machineId, metadata, daemonState,
5816
5869
  const tunnels = handlers.tunnels;
5817
5870
  if (!tunnels) throw new Error("Tunnel management not available");
5818
5871
  if (tunnels.has(params.name)) throw new Error(`Tunnel '${params.name}' already running`);
5819
- const { FrpcTunnel } = await import('./frpc-CuvdlU0g.mjs');
5872
+ const { FrpcTunnel } = await import('./frpc-BeGCyERl.mjs');
5820
5873
  const tunnel = new FrpcTunnel({
5821
5874
  name: params.name,
5822
5875
  ports: params.ports,
@@ -6292,7 +6345,7 @@ QUESTION: ${params.question || "Summarize this concisely."}` }
6292
6345
  }
6293
6346
  const deps = buildSessionDeps(rpc, { cwd, ownerEmail: owner });
6294
6347
  const sender = { name: context?.user?.email || context?.user?.id || "user", kind: "user", verified: true };
6295
- const { toolsForRole } = await import('./sideband-DB4Uipz9.mjs');
6348
+ const { toolsForRole } = await import('./sideband-BCMGW33d.mjs');
6296
6349
  const r2 = await runWiseAgent({ message: params.message, sender, config: { tools: toolsForRole(role2) }, deps, transport, model: resolved.model });
6297
6350
  return fmt(r2);
6298
6351
  }
@@ -6379,6 +6432,8 @@ QUESTION: ${params.question || "Summarize this concisely."}` }
6379
6432
  return handler(...callArgs);
6380
6433
  }
6381
6434
  };
6435
+ const _caps = statelessDispatchCaps();
6436
+ const statelessLimiter = new StatelessDispatchLimiter(_caps.concurrent, _caps.perSender);
6382
6437
  const dispatchStateless = async (c, dir, kwargs, context) => {
6383
6438
  const u = context?.user;
6384
6439
  const r = resolveSender(c, {
@@ -6390,8 +6445,12 @@ QUESTION: ${params.question || "Summarize this concisely."}` }
6390
6445
  });
6391
6446
  if (r.error || !r.sender) return { error: r.error || "unauthorized" };
6392
6447
  const callId = "call_" + Math.random().toString(16).slice(2, 12);
6448
+ const senderKey = (r.sender.name || "anonymous").toLowerCase();
6449
+ if (!statelessLimiter.tryAcquire(senderKey)) {
6450
+ return { ok: false, call_id: callId, status: "busy", error: "channel is busy (too many concurrent requests) \u2014 retry shortly" };
6451
+ }
6393
6452
  const rendered = renderMessage(c, { sender: r.sender, body: { message: kwargs.message }, callId });
6394
- const { queryCore } = await import('./commands-BaVcBOKA.mjs');
6453
+ const { queryCore } = await import('./commands-B-VYM4sA.mjs');
6395
6454
  const timeout = c.reply?.timeout_sec || 120;
6396
6455
  let result;
6397
6456
  try {
@@ -6399,6 +6458,7 @@ QUESTION: ${params.question || "Summarize this concisely."}` }
6399
6458
  } catch (e) {
6400
6459
  return { ok: false, call_id: callId, status: "error", error: e?.message || String(e) };
6401
6460
  } finally {
6461
+ statelessLimiter.release(senderKey);
6402
6462
  if (result?.sessionId) {
6403
6463
  try {
6404
6464
  handlers.deleteSession?.(result.sessionId);
@@ -6462,7 +6522,7 @@ ${d?.error || "not found"}`;
6462
6522
  if ("error" in res) return { error: res.error };
6463
6523
  if (res.tier === "stateless") return dispatchStateless(res.c, res.dir, kwargs, context);
6464
6524
  if ("stopped" in res) return { error: `session ${res.sessionId.slice(0, 8)} is stopped \u2014 resume it to reach this channel` };
6465
- return res.rpc.channelSend({ channel: kwargs.channel, message: kwargs.message, from: kwargs.from, key: kwargs.key, session: kwargs.session, reply_to: kwargs.reply_to }, context);
6525
+ return res.rpc.channelSend({ channel: kwargs.channel, message: kwargs.message, from: kwargs.from, key: kwargs.key, session: kwargs.session, reply_to: kwargs.reply_to, no_reply: kwargs.no_reply }, context);
6466
6526
  },
6467
6527
  // Async reply retrieval for queue-mode channels — long-poll the channel outbox
6468
6528
  // for replies addressed to the caller. Routed to the session the message landed
@@ -6723,7 +6783,9 @@ function recordWake(now) {
6723
6783
  }
6724
6784
  function senderIsHuman(message) {
6725
6785
  const f = message.from || "";
6726
- return f.startsWith("cli:") || f.startsWith("user:");
6786
+ if (!(f.startsWith("cli:") || f.startsWith("user:"))) return false;
6787
+ if (message.verified === false) return false;
6788
+ return true;
6727
6789
  }
6728
6790
  function senderKey(message) {
6729
6791
  return message.fromSession || message.from || "unknown";
@@ -7734,7 +7796,8 @@ function createSessionStore(server, sessionId, initialMetadata, initialAgentStat
7734
7796
  }
7735
7797
  if (c.action?.kind === "loop") return { error: "loop channels are served by the channel server, not channelSend" };
7736
7798
  const queue = c.reply?.mode === "queue";
7737
- const replySession = queue ? params.reply_to?.session : void 0;
7799
+ const wantReply = queue && !params.no_reply;
7800
+ const replySession = wantReply ? params.reply_to?.session : void 0;
7738
7801
  const inboxMsg = {
7739
7802
  messageId: callId,
7740
7803
  body: xmlEscape(String(params.message ?? "").slice(0, 16 * 1024)),
@@ -7745,12 +7808,12 @@ function createSessionStore(server, sessionId, initialMetadata, initialAgentStat
7745
7808
  channel: c.name,
7746
7809
  subject: c.name,
7747
7810
  ...replySession ? { fromSession: replySession, threadId: callId } : {},
7748
- ...queue ? { channelId: c.id, correlationId: callId } : {}
7811
+ ...wantReply ? { channelId: c.id, correlationId: callId } : {}
7749
7812
  };
7750
7813
  await rpcHandlers.sendInboxMessage(inboxMsg, ownerCtx);
7751
7814
  channelStore.recordCall(c.id, { sender: r.sender.name, verified: r.sender.verified, callId, outcome: "delivered" });
7752
7815
  syncChannelsToMetadata();
7753
- return { ok: true, call_id: callId, status: queue ? "queued" : "accepted", ...queue ? { correlationId: callId } : {} };
7816
+ return { ok: true, call_id: callId, status: wantReply ? "queued" : "accepted", ...wantReply ? { correlationId: callId } : {} };
7754
7817
  } catch (e) {
7755
7818
  channelStore.recordCall(c.id, { sender: r.sender.name, verified: r.sender.verified, callId, outcome: "error" });
7756
7819
  return { ok: false, call_id: callId, status: "error", error: e?.message || String(e) };
@@ -9388,10 +9451,27 @@ class SessionArtifactSync {
9388
9451
  async listRemoteSessions() {
9389
9452
  if (!this.initialized || !this.artifactManager || !this.collectionId) return [];
9390
9453
  try {
9391
- const children = await this.artifactManager.list({
9392
- parent_id: this.collectionId,
9393
- _rkwargs: true
9394
- });
9454
+ const PAGE = 100;
9455
+ const children = [];
9456
+ const seen = /* @__PURE__ */ new Set();
9457
+ for (let offset = 0; ; offset += PAGE) {
9458
+ const page = await this.artifactManager.list({
9459
+ parent_id: this.collectionId,
9460
+ offset,
9461
+ limit: PAGE,
9462
+ _rkwargs: true
9463
+ });
9464
+ if (!Array.isArray(page) || page.length === 0) break;
9465
+ let fresh = 0;
9466
+ for (const c of page) {
9467
+ const k = String(c?.id ?? c?.manifest?.id ?? c?.alias ?? `${offset}:${fresh}`);
9468
+ if (seen.has(k)) continue;
9469
+ seen.add(k);
9470
+ children.push(c);
9471
+ fresh++;
9472
+ }
9473
+ if (page.length < PAGE || fresh === 0) break;
9474
+ }
9395
9475
  return (children || []).map((child) => ({
9396
9476
  sessionId: child.manifest?.sessionId || child.alias?.replace("session-", ""),
9397
9477
  machineId: child.manifest?.machineId,
@@ -12497,6 +12577,13 @@ function shouldIsolate(input) {
12497
12577
  return input.optionsSecurityContext !== null && input.optionsSecurityContext !== void 0;
12498
12578
  }
12499
12579
 
12580
+ function classifyRestoreContinuation(opts) {
12581
+ if (opts.isOrphaned) return "none";
12582
+ if (opts.loopActive) return "loop-resume";
12583
+ if (opts.wasProcessing && opts.hasResumeId) return "auto-continue";
12584
+ return "none";
12585
+ }
12586
+
12500
12587
  function getShareBaseUrl() {
12501
12588
  return getSvampWebBaseUrl();
12502
12589
  }
@@ -16187,7 +16274,7 @@ async function startDaemon(options) {
16187
16274
  try {
16188
16275
  const dir = loadSessionIndex()[sessionId]?.directory;
16189
16276
  if (!dir) return;
16190
- const { reconcileServiceLinks } = await import('./agentCommands-B7HQJo3X.mjs');
16277
+ const { reconcileServiceLinks } = await import('./agentCommands-CoPsnzwK.mjs');
16191
16278
  const configPath = getSvampConfigPath(dir, sessionId);
16192
16279
  const config = readSvampConfig(configPath);
16193
16280
  const entries = Array.from(urls.entries());
@@ -16205,7 +16292,7 @@ async function startDaemon(options) {
16205
16292
  }
16206
16293
  }
16207
16294
  async function createExposedTunnel(spec) {
16208
- const { FrpcTunnel } = await import('./frpc-CuvdlU0g.mjs');
16295
+ const { FrpcTunnel } = await import('./frpc-BeGCyERl.mjs');
16209
16296
  const tunnel = new FrpcTunnel({
16210
16297
  name: spec.name,
16211
16298
  ports: spec.ports,
@@ -18421,11 +18508,11 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
18421
18508
  });
18422
18509
  },
18423
18510
  onIssue: async (params) => {
18424
- const { issueRpc } = await import('./rpc-DMpJef5v.mjs');
18511
+ const { issueRpc } = await import('./rpc-1Ic_yDzC.mjs');
18425
18512
  return issueRpc(params?.cwd || directory, params || {}, { notifySession: notifyIssueOwner, rekickLoopOwner });
18426
18513
  },
18427
18514
  onWorkflow: async (params) => {
18428
- const { workflowRpc } = await import('./rpc-C9U0Ho27.mjs');
18515
+ const { workflowRpc } = await import('./rpc-DiG_DaMK.mjs');
18429
18516
  return workflowRpc(params?.cwd || directory, params || {});
18430
18517
  },
18431
18518
  onRipgrep: async (args, cwd) => {
@@ -18797,7 +18884,8 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
18797
18884
  logger.log(`[${agentName} Session ${sessionId}] Ignoring meta.permissionMode='${msgMeta.permissionMode}' from sendMessage (current: ${currentPermissionMode}; use switchMode to change)`);
18798
18885
  }
18799
18886
  {
18800
- const rawModel = typeof msgMeta?.model === "string" && msgMeta.model ? msgMeta.model : void 0;
18887
+ const forcedModel = agentName === "codex" ? codexForcedModel() : void 0;
18888
+ const rawModel = forcedModel || (typeof msgMeta?.model === "string" && msgMeta.model ? msgMeta.model : void 0);
18801
18889
  const desiredModel = rawModel || agentConfig?.default_model || void 0;
18802
18890
  if (desiredModel !== appliedAgentModel) {
18803
18891
  agentBackend?.setModel?.(desiredModel);
@@ -19037,11 +19125,11 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
19037
19125
  });
19038
19126
  },
19039
19127
  onIssue: async (params) => {
19040
- const { issueRpc } = await import('./rpc-DMpJef5v.mjs');
19128
+ const { issueRpc } = await import('./rpc-1Ic_yDzC.mjs');
19041
19129
  return issueRpc(params?.cwd || directory, params || {}, { notifySession: notifyIssueOwner, rekickLoopOwner });
19042
19130
  },
19043
19131
  onWorkflow: async (params) => {
19044
- const { workflowRpc } = await import('./rpc-C9U0Ho27.mjs');
19132
+ const { workflowRpc } = await import('./rpc-DiG_DaMK.mjs');
19045
19133
  return workflowRpc(params?.cwd || directory, params || {});
19046
19134
  },
19047
19135
  onRipgrep: async (args, cwd) => {
@@ -19217,7 +19305,7 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
19217
19305
  }
19218
19306
  }
19219
19307
  }
19220
- const codexModel = options2.model || agentConfig?.default_model || provider.model || void 0;
19308
+ const codexModel = codexForcedModel() || options2.model || agentConfig?.default_model || provider.model || void 0;
19221
19309
  const codexPerm = codexPermissionSettings(currentPermissionMode);
19222
19310
  logger.log(`[Agent Session ${sessionId}] Codex backend: app-server (model=${codexModel ?? "default"}${provider.apiBase ? `, provider=${provider.apiBase}` : ""}${accountDesc ? `, account=${accountDesc}` : ""}, mode=${currentPermissionMode} \u2192 approval=${codexPerm.approvalPolicy}/sandbox=${codexPerm.sandbox})`);
19223
19311
  if (acpResumeThreadId) logger.log(`[Agent Session ${sessionId}] Resuming Codex thread ${acpResumeThreadId} (restart recovery)`);
@@ -19992,10 +20080,15 @@ ${oracle.output.trim().slice(0, 500)}`, "\u{1F501} Continuing loop");
19992
20080
  break;
19993
20081
  }
19994
20082
  }
19995
- if (persisted.wasProcessing && persisted.claudeResumeId && !isOrphaned) {
20083
+ const _restoreAction = classifyRestoreContinuation({
20084
+ wasProcessing: !!persisted.wasProcessing,
20085
+ hasResumeId: !!persisted.claudeResumeId,
20086
+ isOrphaned: !!isOrphaned,
20087
+ loopActive: isLoopActiveForSession(persisted.directory, persisted.sessionId)
20088
+ });
20089
+ if (_restoreAction === "auto-continue") {
19996
20090
  sessionsToAutoContinue.push(persisted.sessionId);
19997
- }
19998
- if (!isOrphaned && !persisted.wasProcessing && isLoopActiveForSession(persisted.directory, persisted.sessionId)) {
20091
+ } else if (_restoreAction === "loop-resume") {
19999
20092
  sessionsToLoopResume.push({ sessionId: persisted.sessionId, directory: persisted.directory });
20000
20093
  }
20001
20094
  } else {
@@ -20156,7 +20249,7 @@ ${oracle.output.trim().slice(0, 500)}`, "\u{1F501} Continuing loop");
20156
20249
  const PING_TIMEOUT_MS = 15e3;
20157
20250
  const POST_RECONNECT_GRACE_MS = 2e4;
20158
20251
  const RECONNECT_JITTER_MS = 2500;
20159
- const { WorkflowScheduler } = await import('./scheduler-CAUwniWA.mjs');
20252
+ const { WorkflowScheduler } = await import('./scheduler-C5Gk_hYP.mjs');
20160
20253
  const workflowScheduler = new WorkflowScheduler({
20161
20254
  projectRoots: () => {
20162
20255
  const dirs = /* @__PURE__ */ new Set();
@@ -20779,4 +20872,4 @@ var run = /*#__PURE__*/Object.freeze({
20779
20872
  writeStopMarker: writeStopMarker
20780
20873
  });
20781
20874
 
20782
- export { listSkillFiles as $, removeWorkflow as A, saveWorkflow as B, rawWorkflow as C, listWorkflows as D, isWorkflowEnabled as E, workflowCrons as F, cronMatches as G, summarize as H, workflowSteps as I, parseJwtEmail as J, computeCollectionConfigUpdate as K, SYSTEM_COLLECTION_CONFIG as L, loadMachineContext as M, buildMachineInstructions as N, machineToolsForRole as O, buildMachineTools as P, parseFrontmatter as Q, READ_ONLY_TOOLS as R, SharingNotificationSync as S, getSkillsServer as T, getSkillsWorkspaceName as U, getSkillsCollectionName as V, fetchWithTimeout as W, searchSkills as X, SKILLS_DIR as Y, getSkillInfo as Z, downloadSkillFile as _, createSessionStore as a, resolveModel as a0, clearStopMarker as a1, stopMarkerExists as a2, formatHandle as a3, normalizeAllowedUser as a4, loadSecurityContextConfig as a5, resolveSecurityContext as a6, buildSecurityContextFromFlags as a7, mergeSecurityContexts as a8, buildSessionShareUrl as a9, computeOutboundHop as aa, registerAwaitingReply as ab, buildMachineShareUrl as ac, parseHandle as ad, handleMatchesMetadata as ae, describeMisconfiguration as af, buildMachineDeps as ag, applyClaudeProxyEnv as ah, composeSessionId as ai, generateFriendlyName as aj, generateHookSettings as ak, staticFileServer as al, instanceConfig as am, claudeAuth as an, codexProvider as ao, projectInfo as ap, DefaultTransport$1 as aq, acpBackend as ar, acpAgentConfig as as, codexAppServerBackend as at, GeminiTransport$1 as au, api as av, run as aw, stopDaemon as b, connectToHypha as c, daemonStatus as d, getFrpsSubdomainHost as e, getFrpsServerPort as f, getHyphaServerUrl$1 as g, getFrpsServerAddr as h, shortId as i, resolveProjectRoot as j, getIssue as k, resumeIssue as l, addComment as m, addIssue as n, listIssues as o, pauseIssue as p, searchIssues as q, registerMachineService as r, startDaemon as s, isVisibleTo as t, updateIssue as u, getRun as v, listRuns as w, getWorkflow as x, runWorkflow as y, setWorkflowEnabled as z };
20875
+ export { listSkillFiles as $, removeWorkflow as A, saveWorkflow as B, rawWorkflow as C, listWorkflows as D, isWorkflowEnabled as E, workflowCrons as F, cronMatches as G, summarize as H, workflowSteps as I, parseJwtEmail as J, computeCollectionConfigUpdate as K, SYSTEM_COLLECTION_CONFIG as L, loadMachineContext as M, buildMachineInstructions as N, machineToolsForRole as O, buildMachineTools as P, parseFrontmatter as Q, READ_ONLY_TOOLS as R, SharingNotificationSync as S, getSkillsServer as T, getSkillsWorkspaceName as U, getSkillsCollectionName as V, fetchWithTimeout as W, searchSkills as X, SKILLS_DIR as Y, getSkillInfo as Z, downloadSkillFile as _, createSessionStore as a, resolveModel as a0, clearStopMarker as a1, stopMarkerExists as a2, ChannelStore as a3, gatewayBase as a4, genKey as a5, formatHandle as a6, normalizeAllowedUser as a7, loadSecurityContextConfig as a8, resolveSecurityContext as a9, run as aA, buildSecurityContextFromFlags as aa, mergeSecurityContexts as ab, buildSessionShareUrl as ac, computeOutboundHop as ad, registerAwaitingReply as ae, buildMachineShareUrl as af, parseHandle as ag, handleMatchesMetadata as ah, describeMisconfiguration as ai, buildMachineDeps as aj, applyClaudeProxyEnv as ak, composeSessionId as al, generateFriendlyName as am, generateHookSettings as an, staticFileServer as ao, instanceConfig as ap, claudeAuth as aq, codexProvider as ar, outbox as as, projectInfo as at, DefaultTransport$1 as au, acpBackend as av, acpAgentConfig as aw, codexAppServerBackend as ax, GeminiTransport$1 as ay, api as az, stopDaemon as b, connectToHypha as c, daemonStatus as d, getFrpsSubdomainHost as e, getFrpsServerPort as f, getHyphaServerUrl$1 as g, getFrpsServerAddr as h, shortId as i, resolveProjectRoot as j, getIssue as k, resumeIssue as l, addComment as m, addIssue as n, listIssues as o, pauseIssue as p, searchIssues as q, registerMachineService as r, startDaemon as s, isVisibleTo as t, updateIssue as u, getRun as v, listRuns as w, getWorkflow as x, runWorkflow as y, setWorkflowEnabled as z };
@@ -1,4 +1,4 @@
1
- import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(import.meta.url);import { ah as applyClaudeProxyEnv, ai as composeSessionId, aj as generateFriendlyName, c as connectToHypha, a as createSessionStore, r as registerMachineService, ak as generateHookSettings } from './run-BNeZiySO.mjs';
1
+ import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(import.meta.url);import { ak as applyClaudeProxyEnv, al as composeSessionId, am as generateFriendlyName, c as connectToHypha, a as createSessionStore, r as registerMachineService, an as generateHookSettings } from './run-CKLU1B02.mjs';
2
2
  import os from 'node:os';
3
3
  import { resolve, join } from 'node:path';
4
4
  import { existsSync, readFileSync, watch } from 'node:fs';
@@ -1,4 +1,4 @@
1
- import { j as resolveProjectRoot, D as listWorkflows, E as isWorkflowEnabled, F as workflowCrons, y as runWorkflow, G as cronMatches } from './run-BNeZiySO.mjs';
1
+ import { j as resolveProjectRoot, D as listWorkflows, E as isWorkflowEnabled, F as workflowCrons, y as runWorkflow, G as cronMatches } from './run-CKLU1B02.mjs';
2
2
  import 'os';
3
3
  import 'fs/promises';
4
4
  import 'fs';
@@ -54,7 +54,7 @@ async function handleServeCommand() {
54
54
  }
55
55
  }
56
56
  async function serveAdd(args, machineId) {
57
- const { connectAndGetMachine } = await import('./commands-BaVcBOKA.mjs');
57
+ const { connectAndGetMachine } = await import('./commands-B-VYM4sA.mjs');
58
58
  const pos = positionalArgs(args);
59
59
  const name = pos[0];
60
60
  if (!name) {
@@ -93,7 +93,7 @@ async function serveAdd(args, machineId) {
93
93
  }
94
94
  }
95
95
  async function serveApply(args, machineId) {
96
- const { connectAndGetMachine } = await import('./commands-BaVcBOKA.mjs');
96
+ const { connectAndGetMachine } = await import('./commands-B-VYM4sA.mjs');
97
97
  const fs = await import('fs');
98
98
  const yaml = await import('yaml');
99
99
  const file = positionalArgs(args)[0];
@@ -182,7 +182,7 @@ async function serveApply(args, machineId) {
182
182
  }
183
183
  }
184
184
  async function serveRemove(args, machineId) {
185
- const { connectAndGetMachine } = await import('./commands-BaVcBOKA.mjs');
185
+ const { connectAndGetMachine } = await import('./commands-B-VYM4sA.mjs');
186
186
  const pos = positionalArgs(args);
187
187
  const name = pos[0];
188
188
  if (!name) {
@@ -202,7 +202,7 @@ async function serveRemove(args, machineId) {
202
202
  }
203
203
  }
204
204
  async function serveList(args, machineId) {
205
- const { connectAndGetMachine } = await import('./commands-BaVcBOKA.mjs');
205
+ const { connectAndGetMachine } = await import('./commands-B-VYM4sA.mjs');
206
206
  const all = hasFlag(args, "--all", "-a");
207
207
  const json = hasFlag(args, "--json");
208
208
  const sessionId = getFlag(args, "--session");
@@ -235,7 +235,7 @@ async function serveList(args, machineId) {
235
235
  }
236
236
  }
237
237
  async function serveInfo(machineId) {
238
- const { connectAndGetMachine } = await import('./commands-BaVcBOKA.mjs');
238
+ const { connectAndGetMachine } = await import('./commands-B-VYM4sA.mjs');
239
239
  const { machine, server } = await connectAndGetMachine(machineId);
240
240
  try {
241
241
  const info = await machine.serveInfo();
@@ -1,4 +1,4 @@
1
- import { R as READ_ONLY_TOOLS, M as loadMachineContext, N as buildMachineInstructions, O as machineToolsForRole, P as buildMachineTools } from './run-BNeZiySO.mjs';
1
+ import { R as READ_ONLY_TOOLS, M as loadMachineContext, N as buildMachineInstructions, O as machineToolsForRole, P as buildMachineTools } from './run-CKLU1B02.mjs';
2
2
  import 'node:child_process';
3
3
  import 'os';
4
4
  import 'fs/promises';
package/package.json CHANGED
@@ -1,48 +1,48 @@
1
1
  {
2
- "name": "svamp-cli",
3
- "version": "0.2.289",
4
- "description": "Svamp CLI — AI workspace daemon on Hypha Cloud",
5
- "author": "Amun AI AB",
6
- "license": "SEE LICENSE IN LICENSE",
7
- "type": "module",
8
- "bin": {
9
- "svamp": "./bin/svamp.mjs"
10
- },
11
- "files": [
12
- "dist",
13
- "bin"
14
- ],
15
- "main": "./dist/index.mjs",
16
- "exports": {
17
- ".": "./dist/index.mjs",
18
- "./cli": "./dist/cli.mjs"
19
- },
20
- "scripts": {
21
- "build": "rm -rf dist bin/skills bin/commands && mkdir -p bin/skills && cp -r ../../skills/artifact bin/skills/artifact && cp -r ../../skills/crew bin/skills/crew && cp -r ../../commands bin/commands && tsc --noEmit && pkgroll",
22
- "typecheck": "tsc --noEmit",
23
- "test": "npx tsx test/test-context-window.mjs && npx tsx test/test-ratelimit-retry.mjs && npx tsx test/test-instance-config.mjs && 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-sharing-notify-sync.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-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-backend-accounts.mjs && npx tsx test/test-backend-oauth.mjs && npx tsx test/test-btw-proxy-env.mjs && npx tsx test/test-output-formatters.mjs && npx tsx test/test-inbox-guard.mjs && npx tsx test/test-user-events.mjs && npx tsx test/test-migrate-children.mjs && npx tsx test/test-inbox-reconcile.mjs && npx tsx test/test-auto-topic.mjs && npx tsx test/test-project-info.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-isolation-disable.mjs && npx tsx test/test-machine-service-logic.mjs && npx tsx test/test-session-access-fallback.mjs && npx tsx test/test-interactive-helpers.mjs && npx tsx test/test-codex-app-server.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-session-send-query.mjs && npx tsx test/test-skills.mjs && npx tsx test/test-agent-grouping.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 && node test/test-supervisor-restart.mjs && npx tsx test/test-clear-detection.mjs && npx tsx test/test-compact-detect.mjs && npx tsx test/test-session-consolidation.mjs && npx tsx test/test-inbox-store.mjs && npx tsx test/test-inbox.mjs && npx tsx test/test-inbox-cross-machine.mjs && npx tsx test/test-issue-store.mjs && npx tsx test/test-issue-close-gate.mjs && npx tsx test/test-loop-verify.mjs && npx tsx test/test-issue-rpc.mjs && npx tsx test/test-issue-pause.mjs && npx tsx test/test-workflow-store.mjs && npx tsx test/test-workflow-rpc.mjs && npx tsx test/test-workflow-scheduler.mjs && npx tsx test/test-cron.mjs && npx tsx test/test-workflow-runs.mjs && npx tsx test/test-workflow-idle.mjs && npx tsx test/test-serve-link-subdomain.mjs && npx tsx test/test-short-id.mjs && npx tsx test/test-transcript-edit.mjs && npx tsx test/test-edit-history.mjs && npx tsx test/test-friendly-name.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-ws-upgrade.mjs && npx tsx test/test-serve-auth.mjs && npx tsx test/test-static-file-server.mjs && npx tsx test/test-serve-stability.mjs && npx tsx test/test-frpc-e2e.mjs --unit-only && npx tsx test/test-frpc-status.mjs && node test/pinnedClaudeCode.test.mjs && node test/fleet.test.mjs && npx tsx test/test-session-file.mjs && npx tsx test/test-channel-rpc.mjs && npx tsx test/test-wise-agent.mjs && npx tsx test/test-channel-agent.mjs && npx tsx test/test-channels-service.mjs && npx tsx test/test-hotreload-seam.mjs && npx tsx test/test-hot-reload.mjs && npx tsx test/test-hot-reload-live.mjs && npx tsx test/test-session-core.mjs && npx tsx test/test-channel-async-reply.mjs && npx tsx test/test-outbox-reload.mjs && npx tsx test/test-channel-binding.mjs && npx tsx test/test-channel-identity.mjs && npx tsx test/test-shared-session-identity.mjs && npx tsx test/test-wise-agent-auth.mjs && npx tsx test/test-channel-http.mjs && npx tsx test/test-channel-upload.mjs && npx tsx test/test-wise-voice.mjs && npx tsx test/test-wise-headless.mjs && npx tsx test/test-wise-machine.mjs && npx tsx test/test-crew-merge.mjs && npx tsx test/test-crew-verdict-routing.mjs && npx tsx test/test-crew-standalone.mjs && npx tsx test/test-session-links.mjs && npx tsx test/test-issue-loop-pause-guard.mjs && npx tsx test/test-artifact-guard.mjs && npx tsx test/test-graceful-restart.mjs && npx tsx test/test-flush-exit.mjs",
24
- "test:hypha": "node --no-warnings test/test-hypha-service.mjs",
25
- "dev": "tsx src/cli.ts",
26
- "dev:daemon": "tsx src/cli.ts daemon start-sync",
27
- "test:e2e": "node --no-warnings test/e2e-session-tests.mjs",
28
- "test:frpc": "npx tsx test/test-frpc-e2e.mjs",
29
- "prepublishOnly": "yarn build"
30
- },
31
- "dependencies": {
32
- "@agentclientprotocol/sdk": "^0.14.1",
33
- "@modelcontextprotocol/sdk": "^1.25.3",
34
- "hypha-rpc": "0.21.42",
35
- "node-pty": "1.2.0-beta.11",
36
- "ws": "^8.18.0",
37
- "yaml": "^2.8.2",
38
- "zod": "^3.24.4"
39
- },
40
- "devDependencies": {
41
- "@types/node": ">=20",
42
- "@types/ws": "^8.5.14",
43
- "pkgroll": "^2.14.2",
44
- "tsx": "^4.20.6",
45
- "typescript": "5.9.3"
46
- },
47
- "packageManager": "yarn@1.22.22"
2
+ "name": "svamp-cli",
3
+ "version": "0.2.291",
4
+ "description": "Svamp CLI — AI workspace daemon on Hypha Cloud",
5
+ "author": "Amun AI AB",
6
+ "license": "SEE LICENSE IN LICENSE",
7
+ "type": "module",
8
+ "bin": {
9
+ "svamp": "./bin/svamp.mjs"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "bin"
14
+ ],
15
+ "main": "./dist/index.mjs",
16
+ "exports": {
17
+ ".": "./dist/index.mjs",
18
+ "./cli": "./dist/cli.mjs"
19
+ },
20
+ "scripts": {
21
+ "build": "rm -rf dist bin/skills bin/commands && mkdir -p bin/skills && cp -r ../../skills/artifact bin/skills/artifact && cp -r ../../skills/crew bin/skills/crew && cp -r ../../commands bin/commands && tsc --noEmit && pkgroll",
22
+ "typecheck": "tsc --noEmit",
23
+ "test": "npx tsx test/test-context-window.mjs && npx tsx test/test-ratelimit-retry.mjs && npx tsx test/test-instance-config.mjs && 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-sharing-notify-sync.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-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-backend-accounts.mjs && npx tsx test/test-codex-force-model.mjs && npx tsx test/test-backend-oauth.mjs && npx tsx test/test-btw-proxy-env.mjs && npx tsx test/test-output-formatters.mjs && npx tsx test/test-inbox-guard.mjs && npx tsx test/test-user-events.mjs && npx tsx test/test-migrate-children.mjs && npx tsx test/test-outpost-install.mjs && npx tsx test/test-inbox-reconcile.mjs && npx tsx test/test-auto-topic.mjs && npx tsx test/test-project-info.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-isolation-disable.mjs && npx tsx test/test-machine-service-logic.mjs && npx tsx test/test-session-access-fallback.mjs && npx tsx test/test-interactive-helpers.mjs && npx tsx test/test-codex-app-server.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-session-send-query.mjs && npx tsx test/test-skills.mjs && npx tsx test/test-agent-grouping.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 && node test/test-supervisor-restart.mjs && npx tsx test/test-clear-detection.mjs && npx tsx test/test-compact-detect.mjs && npx tsx test/test-session-consolidation.mjs && npx tsx test/test-inbox-store.mjs && npx tsx test/test-inbox.mjs && npx tsx test/test-inbox-cross-machine.mjs && npx tsx test/test-issue-store.mjs && npx tsx test/test-issue-close-gate.mjs && npx tsx test/test-loop-verify.mjs && npx tsx test/test-restore-decision.mjs && npx tsx test/test-issue-rpc.mjs && npx tsx test/test-issue-pause.mjs && npx tsx test/test-workflow-store.mjs && npx tsx test/test-workflow-rpc.mjs && npx tsx test/test-workflow-scheduler.mjs && npx tsx test/test-cron.mjs && npx tsx test/test-workflow-runs.mjs && npx tsx test/test-workflow-idle.mjs && npx tsx test/test-serve-link-subdomain.mjs && npx tsx test/test-short-id.mjs && npx tsx test/test-transcript-edit.mjs && npx tsx test/test-edit-history.mjs && npx tsx test/test-friendly-name.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-ws-upgrade.mjs && npx tsx test/test-serve-auth.mjs && npx tsx test/test-static-file-server.mjs && npx tsx test/test-serve-stability.mjs && npx tsx test/test-frpc-e2e.mjs --unit-only && npx tsx test/test-frpc-status.mjs && node test/pinnedClaudeCode.test.mjs && node test/fleet.test.mjs && npx tsx test/test-session-file.mjs && npx tsx test/test-channel-rpc.mjs && npx tsx test/test-wise-agent.mjs && npx tsx test/test-channel-agent.mjs && npx tsx test/test-channels-service.mjs && npx tsx test/test-hotreload-seam.mjs && npx tsx test/test-hot-reload.mjs && npx tsx test/test-hot-reload-live.mjs && npx tsx test/test-session-core.mjs && npx tsx test/test-channel-async-reply.mjs && npx tsx test/test-outbox-reload.mjs && npx tsx test/test-channel-binding.mjs && npx tsx test/test-channel-identity.mjs && npx tsx test/test-stateless-dispatch-limiter.mjs && npx tsx test/test-shared-session-identity.mjs && npx tsx test/test-wise-agent-auth.mjs && npx tsx test/test-channel-http.mjs && npx tsx test/test-channel-upload.mjs && npx tsx test/test-wise-voice.mjs && npx tsx test/test-wise-headless.mjs && npx tsx test/test-wise-machine.mjs && npx tsx test/test-crew-merge.mjs && npx tsx test/test-crew-verdict-routing.mjs && npx tsx test/test-crew-standalone.mjs && npx tsx test/test-session-links.mjs && npx tsx test/test-issue-loop-pause-guard.mjs && npx tsx test/test-artifact-guard.mjs && npx tsx test/test-artifact-sync-pagination.mjs && npx tsx test/test-graceful-restart.mjs && npx tsx test/test-flush-exit.mjs",
24
+ "test:hypha": "node --no-warnings test/test-hypha-service.mjs",
25
+ "dev": "tsx src/cli.ts",
26
+ "dev:daemon": "tsx src/cli.ts daemon start-sync",
27
+ "test:e2e": "node --no-warnings test/e2e-session-tests.mjs",
28
+ "test:frpc": "npx tsx test/test-frpc-e2e.mjs",
29
+ "prepublishOnly": "yarn build"
30
+ },
31
+ "dependencies": {
32
+ "@agentclientprotocol/sdk": "^0.14.1",
33
+ "@modelcontextprotocol/sdk": "^1.25.3",
34
+ "hypha-rpc": "0.21.42",
35
+ "node-pty": "1.2.0-beta.11",
36
+ "ws": "^8.18.0",
37
+ "yaml": "^2.8.2",
38
+ "zod": "^3.24.4"
39
+ },
40
+ "devDependencies": {
41
+ "@types/node": ">=20",
42
+ "@types/ws": "^8.5.14",
43
+ "pkgroll": "^2.14.2",
44
+ "tsx": "^4.20.6",
45
+ "typescript": "5.9.3"
46
+ },
47
+ "packageManager": "yarn@1.22.22"
48
48
  }