svamp-cli 0.2.306 → 0.2.307

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-Cx_Rp-TR.mjs → adminCommands-DZ9MECkY.mjs} +1 -1
  2. package/dist/{agentCommands-CUcyA_KE.mjs → agentCommands-D68wBf-y.mjs} +5 -5
  3. package/dist/{auth-BBjbREk1.mjs → auth-DDgr4YFE.mjs} +1 -1
  4. package/dist/{cli-Jj5S5UOL.mjs → cli-Bk6IPB9M.mjs} +69 -69
  5. package/dist/cli.mjs +2 -2
  6. package/dist/{commands-BRQBNTsJ.mjs → commands-Bl9AtWkD.mjs} +2 -2
  7. package/dist/{commands-DkKdjnPE.mjs → commands-BlIR3KBq.mjs} +2 -2
  8. package/dist/{commands-BeD9b-Eh.mjs → commands-CESl13XD.mjs} +2 -2
  9. package/dist/{commands-CvwLQ3MM.mjs → commands-CJVqMnNf.mjs} +1 -1
  10. package/dist/{commands-DlyOpWwF.mjs → commands-DJwSJOPD.mjs} +1 -1
  11. package/dist/{commands-3UnC4Lnb.mjs → commands-Dh2S9Gf1.mjs} +1 -1
  12. package/dist/{commands-ByP8QKuO.mjs → commands-DsfIIri_.mjs} +7 -7
  13. package/dist/{commands-DJt9EFd7.mjs → commands-rGFSTXKu.mjs} +2 -2
  14. package/dist/{fleet-cBng1VMn.mjs → fleet-okzhGLEY.mjs} +1 -1
  15. package/dist/{frpc-C1jS23Sn.mjs → frpc-NDcBtpwa.mjs} +1 -1
  16. package/dist/{headlessCli-CsnDECCN.mjs → headlessCli-BkU5B5Jp.mjs} +2 -2
  17. package/dist/index.mjs +1 -1
  18. package/dist/{notifyCommands-D7Ja6442.mjs → notifyCommands-Oh0kvQgj.mjs} +1 -1
  19. package/dist/package-k1G6ygGP.mjs +64 -0
  20. package/dist/{rpc-BxmbyDga.mjs → rpc-DSyBSuTF.mjs} +1 -1
  21. package/dist/{rpc-iNafaHoh.mjs → rpc-K5xzddMF.mjs} +1 -1
  22. package/dist/{run-D351s_uv.mjs → run-09G0RL2B.mjs} +1 -1
  23. package/dist/{run-Bd57zohL.mjs → run-DYVmYsvg.mjs} +88 -44
  24. package/dist/{scheduler-CZYOanXt.mjs → scheduler-CtKlSyIq.mjs} +1 -1
  25. package/dist/{serveCommands-DotLju8m.mjs → serveCommands-BnOmV2Z3.mjs} +5 -5
  26. package/dist/{sideband-DM1-IAV7.mjs → sideband-CdJ0O6L6.mjs} +1 -1
  27. package/package.json +2 -2
  28. package/dist/package-DUF-safU.mjs +0 -64
@@ -1,7 +1,7 @@
1
1
  import os from 'os';
2
2
  import fs__default from 'fs';
3
3
  import { resolve, join, relative } from 'path';
4
- import { T as parseFrontmatter, U as getSkillsServer, V as getSkillsWorkspaceName, W as getSkillsCollectionName, X as fetchWithTimeout, Y as searchSkills, Z as SKILLS_DIR, _ as getSkillInfo, $ as downloadSkillFile, a0 as listSkillFiles } from './run-Bd57zohL.mjs';
4
+ import { T as parseFrontmatter, U as getSkillsServer, V as getSkillsWorkspaceName, W as getSkillsCollectionName, X as fetchWithTimeout, Y as searchSkills, Z as SKILLS_DIR, _ as getSkillInfo, $ as downloadSkillFile, a0 as listSkillFiles } from './run-DYVmYsvg.mjs';
5
5
  import 'fs/promises';
6
6
  import 'url';
7
7
  import 'child_process';
@@ -1,5 +1,5 @@
1
1
  import { spawnSync } from 'node:child_process';
2
- import { j as resolveProjectRoot, J as workflowSteps, z as setWorkflowEnabled, F as isWorkflowEnabled, A as removeWorkflow, x as getWorkflow, E as listWorkflows, C as saveWorkflow, D as rawWorkflow } from './run-Bd57zohL.mjs';
2
+ import { j as resolveProjectRoot, J as workflowSteps, z as setWorkflowEnabled, F as isWorkflowEnabled, A as removeWorkflow, x as getWorkflow, E as listWorkflows, C as saveWorkflow, D as rawWorkflow } from './run-DYVmYsvg.mjs';
3
3
  import 'os';
4
4
  import 'fs/promises';
5
5
  import 'fs';
@@ -60,7 +60,7 @@ async function serviceExpose(args) {
60
60
  process.exit(1);
61
61
  }
62
62
  if (foreground) {
63
- const { runFrpcTunnel } = await import('./frpc-C1jS23Sn.mjs');
63
+ const { runFrpcTunnel } = await import('./frpc-NDcBtpwa.mjs');
64
64
  await runFrpcTunnel(name, ports, void 0, {
65
65
  group,
66
66
  groupKey,
@@ -70,7 +70,7 @@ async function serviceExpose(args) {
70
70
  });
71
71
  return;
72
72
  }
73
- const { connectAndGetMachine } = await import('./commands-CvwLQ3MM.mjs');
73
+ const { connectAndGetMachine } = await import('./commands-CJVqMnNf.mjs');
74
74
  const { server, machine } = await connectAndGetMachine();
75
75
  try {
76
76
  const status = await machine.tunnelStart({
@@ -92,7 +92,7 @@ async function serviceExpose(args) {
92
92
  console.log(` port ${port}: ${url}`);
93
93
  }
94
94
  if (process.env.SVAMP_SESSION_ID) {
95
- const { autoAddSessionLink } = await import('./agentCommands-CUcyA_KE.mjs');
95
+ const { autoAddSessionLink } = await import('./agentCommands-D68wBf-y.mjs');
96
96
  let added = 0;
97
97
  for (const [port, url] of urlEntries) {
98
98
  const label = urlEntries.length > 1 ? `${name}:${port}` : name;
@@ -129,7 +129,7 @@ async function serviceServe(args) {
129
129
  console.log(`Serving ${resolvedDir}`);
130
130
  const servePort = 18080;
131
131
  const http = await import('http');
132
- const { serveStaticMount } = await import('./run-Bd57zohL.mjs').then(function (n) { return n.am; });
132
+ const { serveStaticMount } = await import('./run-DYVmYsvg.mjs').then(function (n) { return n.am; });
133
133
  const server = http.createServer((req, res) => {
134
134
  const u = new URL(req.url || "/", "http://127.0.0.1");
135
135
  let rel = u.pathname;
@@ -140,7 +140,7 @@ async function serviceServe(args) {
140
140
  server.once("error", reject);
141
141
  server.listen(servePort, "127.0.0.1", () => resolve());
142
142
  });
143
- const { runFrpcTunnel } = await import('./frpc-C1jS23Sn.mjs');
143
+ const { runFrpcTunnel } = await import('./frpc-NDcBtpwa.mjs');
144
144
  void server;
145
145
  await runFrpcTunnel(name, [servePort]);
146
146
  } catch (err) {
@@ -150,7 +150,7 @@ async function serviceServe(args) {
150
150
  }
151
151
  async function serviceList(_args) {
152
152
  try {
153
- const { connectAndGetMachine } = await import('./commands-CvwLQ3MM.mjs');
153
+ const { connectAndGetMachine } = await import('./commands-CJVqMnNf.mjs');
154
154
  const { server, machine } = await connectAndGetMachine();
155
155
  try {
156
156
  const tunnels = await machine.tunnelList({});
@@ -190,7 +190,7 @@ async function serviceDelete(args) {
190
190
  process.exit(1);
191
191
  }
192
192
  try {
193
- const { connectAndGetMachine } = await import('./commands-CvwLQ3MM.mjs');
193
+ const { connectAndGetMachine } = await import('./commands-CJVqMnNf.mjs');
194
194
  const { server, machine } = await connectAndGetMachine();
195
195
  try {
196
196
  await machine.tunnelStop({ name });
@@ -1,8 +1,8 @@
1
1
  import { existsSync } from 'node:fs';
2
2
  import { resolve } from 'node:path';
3
- import { connectAndGetMachine, resolveSessionId, createWorktree, connectAndResolveSession } from './commands-CvwLQ3MM.mjs';
3
+ import { connectAndGetMachine, resolveSessionId, createWorktree, connectAndResolveSession } from './commands-CJVqMnNf.mjs';
4
4
  import { execFileSync } from 'node:child_process';
5
- import { u as updateIssue, m as addComment, n as addIssue, i as shortId } from './run-Bd57zohL.mjs';
5
+ import { u as updateIssue, m as addComment, n as addIssue, i as shortId } from './run-DYVmYsvg.mjs';
6
6
  import 'node:os';
7
7
  import 'os';
8
8
  import 'fs/promises';
@@ -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-Bd57zohL.mjs';
4
+ import { c as connectToHypha } from './run-DYVmYsvg.mjs';
5
5
  import { PINNED_CLAUDE_CODE_VERSION } from './pinnedClaudeCode-BaMR97BE.mjs';
6
6
  import 'os';
7
7
  import 'fs/promises';
@@ -4,7 +4,7 @@ import { mkdirSync, chmodSync, writeFileSync, unlinkSync, existsSync, readFileSy
4
4
  import { join } from 'path';
5
5
  import { homedir, platform, arch } from 'os';
6
6
  import { randomUUID, createHash } from 'crypto';
7
- import { e as getFrpsSubdomainHost, f as getFrpsServerPort, h as getFrpsServerAddr } from './run-Bd57zohL.mjs';
7
+ import { e as getFrpsSubdomainHost, f as getFrpsServerPort, h as getFrpsServerAddr } from './run-DYVmYsvg.mjs';
8
8
  import 'fs/promises';
9
9
  import 'url';
10
10
  import 'node:crypto';
@@ -1,5 +1,5 @@
1
- import { a1 as resolveModel, ag as describeMisconfiguration, ah as buildMachineDeps } from './run-Bd57zohL.mjs';
2
- import { handleRealtimeEvent, initMachineVoiceSession } from './sideband-DM1-IAV7.mjs';
1
+ import { a1 as resolveModel, ag as describeMisconfiguration, ah as buildMachineDeps } from './run-DYVmYsvg.mjs';
2
+ import { handleRealtimeEvent, initMachineVoiceSession } from './sideband-CdJ0O6L6.mjs';
3
3
  import { WebSocket } from 'ws';
4
4
  import { execSync, spawn } from 'child_process';
5
5
  import 'os';
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- export { c as connectToHypha, a as createSessionStore, d as daemonStatus, g as getHyphaServerUrl, r as registerMachineService, s as startDaemon, b as stopDaemon } from './run-Bd57zohL.mjs';
1
+ export { c as connectToHypha, a as createSessionStore, d as daemonStatus, g as getHyphaServerUrl, r as registerMachineService, s as startDaemon, b as stopDaemon } from './run-DYVmYsvg.mjs';
2
2
  import 'os';
3
3
  import 'fs/promises';
4
4
  import 'fs';
@@ -1,4 +1,4 @@
1
- import { c as connectToHypha, S as SharingNotificationSync, K as parseJwtEmail } from './run-Bd57zohL.mjs';
1
+ import { c as connectToHypha, S as SharingNotificationSync, K as parseJwtEmail } from './run-DYVmYsvg.mjs';
2
2
  import { randomUUID } from 'node:crypto';
3
3
  import { existsSync, readFileSync } from 'node:fs';
4
4
  import { join } from 'node:path';
@@ -0,0 +1,64 @@
1
+ var name = "svamp-cli";
2
+ var version = "0.2.307";
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-sharing-notify-resolve.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-outpost-setup.mjs && npx tsx test/test-outpost-pairing.mjs && npx tsx test/test-outpost-coordinator.mjs && npx tsx test/e2e-outpost-transport.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-session-rpc-role-map.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-listener-backoff.mjs && npx tsx test/test-session-identity-env.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-store-lock.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-runs-lock.mjs && npx tsx test/test-workflow-idle.mjs && npx tsx test/test-workflow-reconcile.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-store-lock.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 && npx tsx test/test-codex-skills.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, v as getRun, w as listRuns, x as getWorkflow, y as runWorkflow, z as setWorkflowEnabled, A as removeWorkflow, B as validateWorkflowName, C as saveWorkflow, D as rawWorkflow, E as listWorkflows } from './run-Bd57zohL.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 validateWorkflowName, C as saveWorkflow, D as rawWorkflow, E as listWorkflows } from './run-DYVmYsvg.mjs';
2
2
  import 'os';
3
3
  import 'fs/promises';
4
4
  import 'fs';
@@ -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-Bd57zohL.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-DYVmYsvg.mjs';
2
2
  import 'os';
3
3
  import 'fs/promises';
4
4
  import 'fs';
@@ -1,4 +1,4 @@
1
- import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(import.meta.url);import { ai as applyClaudeProxyEnv, aj as composeSessionId, ak as generateFriendlyName, c as connectToHypha, a as createSessionStore, r as registerMachineService, al as generateHookSettings } from './run-Bd57zohL.mjs';
1
+ import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(import.meta.url);import { ai as applyClaudeProxyEnv, aj as composeSessionId, ak as generateFriendlyName, c as connectToHypha, a as createSessionStore, r as registerMachineService, al as generateHookSettings } from './run-DYVmYsvg.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';
@@ -3047,7 +3047,7 @@ Connection: close\r
3047
3047
  const mount = this.mounts.get(mountName);
3048
3048
  const subdomainOverride = mount?.access === "link" && mount.linkToken ? /* @__PURE__ */ new Map([[this.port, buildLinkSubdomain(subdomainSafe, mount.linkToken)]]) : void 0;
3049
3049
  try {
3050
- const { FrpcTunnel } = await import('./frpc-C1jS23Sn.mjs');
3050
+ const { FrpcTunnel } = await import('./frpc-NDcBtpwa.mjs');
3051
3051
  let tunnel;
3052
3052
  tunnel = new FrpcTunnel({
3053
3053
  name: tunnelName,
@@ -6088,7 +6088,7 @@ async function registerMachineService(server, machineId, metadata, daemonState,
6088
6088
  const tunnels = handlers.tunnels;
6089
6089
  if (!tunnels) throw new Error("Tunnel management not available");
6090
6090
  if (tunnels.has(params.name)) throw new Error(`Tunnel '${params.name}' already running`);
6091
- const { FrpcTunnel } = await import('./frpc-C1jS23Sn.mjs');
6091
+ const { FrpcTunnel } = await import('./frpc-NDcBtpwa.mjs');
6092
6092
  const tunnel = new FrpcTunnel({
6093
6093
  name: params.name,
6094
6094
  ports: params.ports,
@@ -6582,7 +6582,7 @@ QUESTION: ${params.question || "Summarize this concisely."}` }
6582
6582
  }
6583
6583
  const deps = buildSessionDeps(rpc, { cwd, ownerEmail: owner });
6584
6584
  const sender = { name: context?.user?.email || context?.user?.id || "user", kind: "user", verified: true };
6585
- const { toolsForRole } = await import('./sideband-DM1-IAV7.mjs');
6585
+ const { toolsForRole } = await import('./sideband-CdJ0O6L6.mjs');
6586
6586
  const r2 = await runWiseAgent({ message: params.message, sender, config: { tools: toolsForRole(role2) }, deps, transport, model: resolved.model });
6587
6587
  return fmt(r2);
6588
6588
  }
@@ -6687,7 +6687,7 @@ QUESTION: ${params.question || "Summarize this concisely."}` }
6687
6687
  return { ok: false, call_id: callId, status: "busy", error: "channel is busy (too many concurrent requests) \u2014 retry shortly" };
6688
6688
  }
6689
6689
  const rendered = renderMessage(c, { sender: r.sender, body: { message: kwargs.message }, callId });
6690
- const { queryCore } = await import('./commands-CvwLQ3MM.mjs');
6690
+ const { queryCore } = await import('./commands-CJVqMnNf.mjs');
6691
6691
  const timeout = c.reply?.timeout_sec || 120;
6692
6692
  let result;
6693
6693
  try {
@@ -10479,18 +10479,56 @@ function eventAlias(eventId, recipientEmail) {
10479
10479
  class SharingNotificationSync {
10480
10480
  server;
10481
10481
  artifactManager = null;
10482
+ amResolvedAt = 0;
10482
10483
  shareCollectionId = null;
10483
10484
  eventCollectionId = null;
10484
10485
  initialized = false;
10485
10486
  log;
10487
+ // A resolved `public/artifact-manager` proxy is bound to a SPECIFIC backend client_id. When that
10488
+ // backend pod is replaced (deploy/restart/idle-evict), the new instance registers under the same
10489
+ // public alias but a fresh client_id — the cached proxy dangles and every call TIMES OUT (~30s).
10490
+ // Before this fix that silently broke ALL zero-click share writes fleet-wide (empty
10491
+ // svamp-shared-sessions → recipients never auto-discovered). So we re-resolve on a short TTL and,
10492
+ // on any RPC error, force one fresh re-resolve + retry (a dead pod's proxy always fails first).
10493
+ static AM_TTL_MS = 3e4;
10486
10494
  constructor(server, log) {
10487
10495
  this.server = server;
10488
10496
  this.log = log;
10489
10497
  }
10498
+ /**
10499
+ * Resolve `public/artifact-manager` on the daemon's live connection. hypha-rpc re-queries the
10500
+ * server registry on each getService() call, so a fresh resolve yields the CURRENTLY-registered
10501
+ * live instance (not the dangling cached one). Cached within a short TTL to avoid a lookup per
10502
+ * write; `force` bypasses the cache after a failure.
10503
+ */
10504
+ async getAM(force = false) {
10505
+ const now = Date.now();
10506
+ if (!force && this.artifactManager && now - this.amResolvedAt < SharingNotificationSync.AM_TTL_MS) {
10507
+ return this.artifactManager;
10508
+ }
10509
+ const am = await this.server.getService("public/artifact-manager");
10510
+ this.artifactManager = am;
10511
+ this.amResolvedAt = Date.now();
10512
+ return am;
10513
+ }
10514
+ /**
10515
+ * Run an artifact-manager operation with automatic recovery from a stale/dead proxy: try with the
10516
+ * (possibly cached) instance; on ANY error, force a fresh re-resolve and retry ONCE. This is the
10517
+ * heart of the stale-proxy fix — a replaced backend pod makes the first call time out, the retry
10518
+ * re-binds to the live instance and succeeds. The caller still catches the final error.
10519
+ */
10520
+ async withAM(op) {
10521
+ try {
10522
+ return await op(await this.getAM(false));
10523
+ } catch (err) {
10524
+ this.log(`[SHARING NOTIFY] artifact-manager call failed (${err?.message}); re-resolving + retrying`);
10525
+ return await op(await this.getAM(true));
10526
+ }
10527
+ }
10490
10528
  async init() {
10491
10529
  try {
10492
- this.artifactManager = await this.server.getService("public/artifact-manager");
10493
- if (!this.artifactManager) {
10530
+ const am = await this.getAM(true);
10531
+ if (!am) {
10494
10532
  this.log("[SHARING NOTIFY] Artifact manager not available");
10495
10533
  return;
10496
10534
  }
@@ -10519,15 +10557,17 @@ class SharingNotificationSync {
10519
10557
  shareType: params.shareType || "session"
10520
10558
  };
10521
10559
  try {
10522
- const artifact = await this.artifactManager.create({
10523
- alias,
10524
- parent_id: this.shareCollectionId,
10525
- type: "share-notification",
10526
- stage: true,
10527
- manifest,
10528
- _rkwargs: true
10529
- });
10530
- await this.artifactManager.commit({ artifact_id: artifact.id, _rkwargs: true }).catch(() => {
10560
+ await this.withAM(async (am) => {
10561
+ const artifact = await am.create({
10562
+ alias,
10563
+ parent_id: this.shareCollectionId,
10564
+ type: "share-notification",
10565
+ stage: true,
10566
+ manifest,
10567
+ _rkwargs: true
10568
+ });
10569
+ await am.commit({ artifact_id: artifact.id, _rkwargs: true }).catch(() => {
10570
+ });
10531
10571
  });
10532
10572
  } catch (createErr) {
10533
10573
  this.log(`[SHARING NOTIFY] share-notification attach skipped for ${params.recipientEmail}: ${createErr.message}`);
@@ -10569,14 +10609,16 @@ class SharingNotificationSync {
10569
10609
  if (!this.initialized || !this.shareCollectionId) return;
10570
10610
  const alias = shareAlias(sessionId, recipientEmail);
10571
10611
  try {
10572
- const existing = await this.artifactManager.read({
10573
- artifact_id: alias,
10574
- parent_id: this.shareCollectionId,
10575
- _rkwargs: true
10576
- });
10577
- await this.artifactManager.delete({
10578
- artifact_id: existing.id,
10579
- _rkwargs: true
10612
+ await this.withAM(async (am) => {
10613
+ const existing = await am.read({
10614
+ artifact_id: alias,
10615
+ parent_id: this.shareCollectionId,
10616
+ _rkwargs: true
10617
+ });
10618
+ await am.delete({
10619
+ artifact_id: existing.id,
10620
+ _rkwargs: true
10621
+ });
10580
10622
  });
10581
10623
  this.log(`[SHARING NOTIFY] Removed share notification for ${recipientEmail} on ${sessionId.slice(0, 8)}`);
10582
10624
  } catch {
@@ -10607,17 +10649,19 @@ class SharingNotificationSync {
10607
10649
  if (!this.initialized || !this.eventCollectionId) return;
10608
10650
  const alias = eventAlias(event.id, event.recipientEmail);
10609
10651
  try {
10610
- const artifact = await this.artifactManager.create({
10611
- alias,
10612
- parent_id: this.eventCollectionId,
10613
- type: "user-event",
10614
- stage: true,
10615
- manifest: event,
10616
- _rkwargs: true
10617
- });
10618
- await this.artifactManager.commit({
10619
- artifact_id: artifact.id,
10620
- _rkwargs: true
10652
+ await this.withAM(async (am) => {
10653
+ const artifact = await am.create({
10654
+ alias,
10655
+ parent_id: this.eventCollectionId,
10656
+ type: "user-event",
10657
+ stage: true,
10658
+ manifest: event,
10659
+ _rkwargs: true
10660
+ });
10661
+ await am.commit({
10662
+ artifact_id: artifact.id,
10663
+ _rkwargs: true
10664
+ });
10621
10665
  });
10622
10666
  this.log(`[USER EVENT] Published ${event.type} to ${event.recipientEmail}`);
10623
10667
  try {
@@ -10644,7 +10688,7 @@ class SharingNotificationSync {
10644
10688
  const all = [];
10645
10689
  const seen = /* @__PURE__ */ new Set();
10646
10690
  for (let offset = 0; ; offset += PAGE) {
10647
- const page = await this.artifactManager.list({ parent_id: parentId, offset, limit: PAGE, _rkwargs: true });
10691
+ const page = await this.withAM((am) => am.list({ parent_id: parentId, offset, limit: PAGE, _rkwargs: true }));
10648
10692
  if (!Array.isArray(page) || page.length === 0) break;
10649
10693
  let fresh = 0;
10650
10694
  for (const c of page) {
@@ -10685,7 +10729,7 @@ class SharingNotificationSync {
10685
10729
  live.push(m);
10686
10730
  }
10687
10731
  for (const id of expiredOwnedIds) {
10688
- this.artifactManager.delete({ artifact_id: id, _rkwargs: true }).catch(() => {
10732
+ this.withAM((am) => am.delete({ artifact_id: id, _rkwargs: true })).catch(() => {
10689
10733
  });
10690
10734
  }
10691
10735
  return live.sort((a, b) => (b.createdAt || 0) - (a.createdAt || 0));
@@ -10711,7 +10755,7 @@ class SharingNotificationSync {
10711
10755
  return m && typeof m.id === "string" && (m.id === eventId || m.id.slice(0, 8) === short) && typeof m.recipientEmail === "string" && m.recipientEmail.toLowerCase() === normalized;
10712
10756
  });
10713
10757
  if (!match) return false;
10714
- await this.artifactManager.delete({ artifact_id: match.id, _rkwargs: true });
10758
+ await this.withAM((am) => am.delete({ artifact_id: match.id, _rkwargs: true }));
10715
10759
  this.log(`[USER EVENT] Acked ${eventId.slice(0, 8)} for ${recipientEmail}`);
10716
10760
  return true;
10717
10761
  } catch (err) {
@@ -17475,7 +17519,7 @@ async function startDaemon(options) {
17475
17519
  try {
17476
17520
  const dir = loadSessionIndex()[sessionId]?.directory;
17477
17521
  if (!dir) return;
17478
- const { reconcileServiceLinks } = await import('./agentCommands-CUcyA_KE.mjs');
17522
+ const { reconcileServiceLinks } = await import('./agentCommands-D68wBf-y.mjs');
17479
17523
  const configPath = getSvampConfigPath(dir, sessionId);
17480
17524
  const config = readSvampConfig(configPath);
17481
17525
  const entries = Array.from(urls.entries());
@@ -17493,7 +17537,7 @@ async function startDaemon(options) {
17493
17537
  }
17494
17538
  }
17495
17539
  async function createExposedTunnel(spec) {
17496
- const { FrpcTunnel } = await import('./frpc-C1jS23Sn.mjs');
17540
+ const { FrpcTunnel } = await import('./frpc-NDcBtpwa.mjs');
17497
17541
  const tunnel = new FrpcTunnel({
17498
17542
  name: spec.name,
17499
17543
  ports: spec.ports,
@@ -19711,11 +19755,11 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
19711
19755
  });
19712
19756
  },
19713
19757
  onIssue: async (params) => {
19714
- const { issueRpc } = await import('./rpc-iNafaHoh.mjs');
19758
+ const { issueRpc } = await import('./rpc-K5xzddMF.mjs');
19715
19759
  return issueRpc(params?.cwd || directory, params || {}, { notifySession: notifyIssueOwner, rekickLoopOwner });
19716
19760
  },
19717
19761
  onWorkflow: async (params) => {
19718
- const { workflowRpc } = await import('./rpc-BxmbyDga.mjs');
19762
+ const { workflowRpc } = await import('./rpc-DSyBSuTF.mjs');
19719
19763
  return workflowRpc(params?.cwd || directory, params || {});
19720
19764
  },
19721
19765
  onRipgrep: async (args, cwd) => {
@@ -20347,11 +20391,11 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
20347
20391
  });
20348
20392
  },
20349
20393
  onIssue: async (params) => {
20350
- const { issueRpc } = await import('./rpc-iNafaHoh.mjs');
20394
+ const { issueRpc } = await import('./rpc-K5xzddMF.mjs');
20351
20395
  return issueRpc(params?.cwd || directory, params || {}, { notifySession: notifyIssueOwner, rekickLoopOwner });
20352
20396
  },
20353
20397
  onWorkflow: async (params) => {
20354
- const { workflowRpc } = await import('./rpc-BxmbyDga.mjs');
20398
+ const { workflowRpc } = await import('./rpc-DSyBSuTF.mjs');
20355
20399
  return workflowRpc(params?.cwd || directory, params || {});
20356
20400
  },
20357
20401
  onRipgrep: async (args, cwd) => {
@@ -21502,7 +21546,7 @@ ${oracle.output.trim().slice(0, 500)}`, "\u{1F501} Continuing loop");
21502
21546
  const PING_TIMEOUT_MS = 15e3;
21503
21547
  const POST_RECONNECT_GRACE_MS = 2e4;
21504
21548
  const RECONNECT_JITTER_MS = 2500;
21505
- const { WorkflowScheduler } = await import('./scheduler-CZYOanXt.mjs');
21549
+ const { WorkflowScheduler } = await import('./scheduler-CtKlSyIq.mjs');
21506
21550
  const workflowProjectRoots = () => {
21507
21551
  const dirs = /* @__PURE__ */ new Set();
21508
21552
  for (const s of pidToTrackedSession.values()) {
@@ -1,4 +1,4 @@
1
- import { j as resolveProjectRoot, E as listWorkflows, F as isWorkflowEnabled, G as workflowCrons, y as runWorkflow, H as cronMatches } from './run-Bd57zohL.mjs';
1
+ import { j as resolveProjectRoot, E as listWorkflows, F as isWorkflowEnabled, G as workflowCrons, y as runWorkflow, H as cronMatches } from './run-DYVmYsvg.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-CvwLQ3MM.mjs');
57
+ const { connectAndGetMachine } = await import('./commands-CJVqMnNf.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-CvwLQ3MM.mjs');
96
+ const { connectAndGetMachine } = await import('./commands-CJVqMnNf.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-CvwLQ3MM.mjs');
185
+ const { connectAndGetMachine } = await import('./commands-CJVqMnNf.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-CvwLQ3MM.mjs');
205
+ const { connectAndGetMachine } = await import('./commands-CJVqMnNf.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-CvwLQ3MM.mjs');
238
+ const { connectAndGetMachine } = await import('./commands-CJVqMnNf.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, N as loadMachineContext, O as buildMachineInstructions, P as machineToolsForRole, Q as buildMachineTools } from './run-Bd57zohL.mjs';
1
+ import { R as READ_ONLY_TOOLS, N as loadMachineContext, O as buildMachineInstructions, P as machineToolsForRole, Q as buildMachineTools } from './run-DYVmYsvg.mjs';
2
2
  import 'node:child_process';
3
3
  import 'os';
4
4
  import 'fs/promises';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "svamp-cli",
3
- "version": "0.2.306",
3
+ "version": "0.2.307",
4
4
  "description": "Svamp CLI — AI workspace daemon on Hypha Cloud",
5
5
  "author": "Amun AI AB",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -20,7 +20,7 @@
20
20
  "scripts": {
21
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
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-outpost-setup.mjs && npx tsx test/test-outpost-pairing.mjs && npx tsx test/test-outpost-coordinator.mjs && npx tsx test/e2e-outpost-transport.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-session-rpc-role-map.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-listener-backoff.mjs && npx tsx test/test-session-identity-env.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-store-lock.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-runs-lock.mjs && npx tsx test/test-workflow-idle.mjs && npx tsx test/test-workflow-reconcile.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-store-lock.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 && npx tsx test/test-codex-skills.mjs",
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-sharing-notify-resolve.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-outpost-setup.mjs && npx tsx test/test-outpost-pairing.mjs && npx tsx test/test-outpost-coordinator.mjs && npx tsx test/e2e-outpost-transport.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-session-rpc-role-map.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-listener-backoff.mjs && npx tsx test/test-session-identity-env.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-store-lock.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-runs-lock.mjs && npx tsx test/test-workflow-idle.mjs && npx tsx test/test-workflow-reconcile.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-store-lock.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 && npx tsx test/test-codex-skills.mjs",
24
24
  "test:hypha": "node --no-warnings test/test-hypha-service.mjs",
25
25
  "dev": "tsx src/cli.ts",
26
26
  "dev:daemon": "tsx src/cli.ts daemon start-sync",