svamp-cli 0.2.296 → 0.2.297

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-CGpZCy6r.mjs → adminCommands-DgjPSsrK.mjs} +1 -1
  2. package/dist/{agentCommands-BB9V70n7.mjs → agentCommands-B7naHDWq.mjs} +5 -5
  3. package/dist/{auth-CTcFSmNv.mjs → auth-BELggWCf.mjs} +1 -1
  4. package/dist/{cli-DLq5wuL-.mjs → cli-C-dcoT95.mjs} +69 -69
  5. package/dist/cli.mjs +2 -2
  6. package/dist/{commands-BGyQASCT.mjs → commands-6NGsQNcq.mjs} +2 -2
  7. package/dist/{commands-C6-J2cYh.mjs → commands-9RCokP3o.mjs} +2 -2
  8. package/dist/{commands-COqzlq3t.mjs → commands-B-sJlyvW.mjs} +2 -2
  9. package/dist/{commands-BY4rS-E4.mjs → commands-BJZyPz9N.mjs} +1 -1
  10. package/dist/{commands-glTd_gyw.mjs → commands-BxKXn8q2.mjs} +2 -2
  11. package/dist/{commands-C91Cya-X.mjs → commands-DVw-VfWc.mjs} +1 -1
  12. package/dist/{commands-llyYnyLR.mjs → commands-Dk18oHFj.mjs} +7 -7
  13. package/dist/{commands-DOHvsmKj.mjs → commands-cVnS-T4r.mjs} +1 -1
  14. package/dist/{fleet-PEJuRu8I.mjs → fleet-CbdPguLQ.mjs} +1 -1
  15. package/dist/{frpc-BtNpheHe.mjs → frpc-DXiVmDEz.mjs} +1 -1
  16. package/dist/{headlessCli-CsNSt80-.mjs → headlessCli-DLqmC4KJ.mjs} +2 -2
  17. package/dist/index.mjs +1 -1
  18. package/dist/{notifyCommands-5tlRpkjz.mjs → notifyCommands-DYFhp4eV.mjs} +1 -1
  19. package/dist/package-Bbhk823j.mjs +64 -0
  20. package/dist/{rpc-Dm2C8f67.mjs → rpc-CJbR3vhe.mjs} +1 -1
  21. package/dist/{rpc-DmQuRSyU.mjs → rpc-v1hrwmCr.mjs} +1 -1
  22. package/dist/{run-zUX_Ur8D.mjs → run-8Q-jBpEp.mjs} +1 -1
  23. package/dist/{run-BLmCDxvV.mjs → run-BKR-KNMV.mjs} +150 -12
  24. package/dist/{scheduler-Bup5XvL_.mjs → scheduler-DXE6xA8q.mjs} +1 -1
  25. package/dist/{serveCommands-Qj1CYwXe.mjs → serveCommands-B57iAgxC.mjs} +5 -5
  26. package/dist/{sideband-COVIgnXL.mjs → sideband-C5_SnwE7.mjs} +1 -1
  27. package/package.json +2 -2
  28. package/dist/package-B3cVZ2-p.mjs +0 -64
@@ -2,7 +2,7 @@ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
2
2
  import { execSync } from 'node:child_process';
3
3
  import { join } from 'node:path';
4
4
  import os from 'node:os';
5
- import { H as buildOutpostInstall, I as ChannelStore, J as DEFAULT_OUTPOST_DOWNLOAD_BASE, K as setupOutpostChannel } from './run-BLmCDxvV.mjs';
5
+ import { H as buildOutpostInstall, I as ChannelStore, J as DEFAULT_OUTPOST_DOWNLOAD_BASE, K as setupOutpostChannel } from './run-BKR-KNMV.mjs';
6
6
  import 'os';
7
7
  import 'fs/promises';
8
8
  import 'fs';
@@ -187,7 +187,7 @@ async function outpostCommand(args) {
187
187
  console.error('usage: svamp outpost exec [--machine <id>] "<command>"');
188
188
  process.exit(1);
189
189
  }
190
- const { ChannelOutbox } = await import('./run-BLmCDxvV.mjs').then(function (n) { return n.at; });
190
+ const { ChannelOutbox } = await import('./run-BKR-KNMV.mjs').then(function (n) { return n.at; });
191
191
  const outbox = new ChannelOutbox(projectDir());
192
192
  const id = "x" + Date.now().toString(36);
193
193
  outbox.append(cfg.channel, { to: "outpost", body: JSON.stringify({ type: "exec", id, cmd, target: target || "" }) });
@@ -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 { W as parseFrontmatter, X as getSkillsServer, Y as getSkillsWorkspaceName, Z as getSkillsCollectionName, _ as fetchWithTimeout, $ as searchSkills, a0 as SKILLS_DIR, a1 as getSkillInfo, a2 as downloadSkillFile, a3 as listSkillFiles } from './run-BLmCDxvV.mjs';
4
+ import { W as parseFrontmatter, X as getSkillsServer, Y as getSkillsWorkspaceName, Z as getSkillsCollectionName, _ as fetchWithTimeout, $ as searchSkills, a0 as SKILLS_DIR, a1 as getSkillInfo, a2 as downloadSkillFile, a3 as listSkillFiles } from './run-BKR-KNMV.mjs';
5
5
  import 'fs/promises';
6
6
  import 'url';
7
7
  import 'child_process';
@@ -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-BtNpheHe.mjs');
63
+ const { runFrpcTunnel } = await import('./frpc-DXiVmDEz.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-BY4rS-E4.mjs');
73
+ const { connectAndGetMachine } = await import('./commands-BJZyPz9N.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-BB9V70n7.mjs');
95
+ const { autoAddSessionLink } = await import('./agentCommands-B7naHDWq.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-BLmCDxvV.mjs').then(function (n) { return n.ap; });
132
+ const { serveStaticMount } = await import('./run-BKR-KNMV.mjs').then(function (n) { return n.ap; });
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-BtNpheHe.mjs');
143
+ const { runFrpcTunnel } = await import('./frpc-DXiVmDEz.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-BY4rS-E4.mjs');
153
+ const { connectAndGetMachine } = await import('./commands-BJZyPz9N.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-BY4rS-E4.mjs');
193
+ const { connectAndGetMachine } = await import('./commands-BJZyPz9N.mjs');
194
194
  const { server, machine } = await connectAndGetMachine();
195
195
  try {
196
196
  await machine.tunnelStop({ name });
@@ -1,5 +1,5 @@
1
1
  import { spawnSync } from 'node:child_process';
2
- import { j as resolveProjectRoot, M as workflowSteps, z as setWorkflowEnabled, E as isWorkflowEnabled, A as removeWorkflow, x as getWorkflow, D as listWorkflows, B as saveWorkflow, C as rawWorkflow } from './run-BLmCDxvV.mjs';
2
+ import { j as resolveProjectRoot, M as workflowSteps, z as setWorkflowEnabled, E as isWorkflowEnabled, A as removeWorkflow, x as getWorkflow, D as listWorkflows, B as saveWorkflow, C as rawWorkflow } from './run-BKR-KNMV.mjs';
3
3
  import 'os';
4
4
  import 'fs/promises';
5
5
  import 'fs';
@@ -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-BLmCDxvV.mjs';
4
+ import { c as connectToHypha } from './run-BKR-KNMV.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-BLmCDxvV.mjs';
7
+ import { e as getFrpsSubdomainHost, f as getFrpsServerPort, h as getFrpsServerAddr } from './run-BKR-KNMV.mjs';
8
8
  import 'fs/promises';
9
9
  import 'url';
10
10
  import 'node:crypto';
@@ -1,5 +1,5 @@
1
- import { a4 as resolveModel, aj as describeMisconfiguration, ak as buildMachineDeps } from './run-BLmCDxvV.mjs';
2
- import { handleRealtimeEvent, initMachineVoiceSession } from './sideband-COVIgnXL.mjs';
1
+ import { a4 as resolveModel, aj as describeMisconfiguration, ak as buildMachineDeps } from './run-BKR-KNMV.mjs';
2
+ import { handleRealtimeEvent, initMachineVoiceSession } from './sideband-C5_SnwE7.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-BLmCDxvV.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-BKR-KNMV.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, N as parseJwtEmail } from './run-BLmCDxvV.mjs';
1
+ import { c as connectToHypha, S as SharingNotificationSync, N as parseJwtEmail } from './run-BKR-KNMV.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.297";
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-outpost-setup.mjs && npx tsx test/test-outpost-pairing.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 && 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, 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-BLmCDxvV.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-BKR-KNMV.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-BLmCDxvV.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-BKR-KNMV.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 { al as applyClaudeProxyEnv, am as composeSessionId, an as generateFriendlyName, c as connectToHypha, a as createSessionStore, r as registerMachineService, ao as generateHookSettings } from './run-BLmCDxvV.mjs';
1
+ import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(import.meta.url);import { al as applyClaudeProxyEnv, am as composeSessionId, an as generateFriendlyName, c as connectToHypha, a as createSessionStore, r as registerMachineService, ao as generateHookSettings } from './run-BKR-KNMV.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';
@@ -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-BtNpheHe.mjs');
2976
+ const { FrpcTunnel } = await import('./frpc-DXiVmDEz.mjs');
2977
2977
  let tunnel;
2978
2978
  tunnel = new FrpcTunnel({
2979
2979
  name: tunnelName,
@@ -5869,7 +5869,7 @@ async function registerMachineService(server, machineId, metadata, daemonState,
5869
5869
  const tunnels = handlers.tunnels;
5870
5870
  if (!tunnels) throw new Error("Tunnel management not available");
5871
5871
  if (tunnels.has(params.name)) throw new Error(`Tunnel '${params.name}' already running`);
5872
- const { FrpcTunnel } = await import('./frpc-BtNpheHe.mjs');
5872
+ const { FrpcTunnel } = await import('./frpc-DXiVmDEz.mjs');
5873
5873
  const tunnel = new FrpcTunnel({
5874
5874
  name: params.name,
5875
5875
  ports: params.ports,
@@ -6345,7 +6345,7 @@ QUESTION: ${params.question || "Summarize this concisely."}` }
6345
6345
  }
6346
6346
  const deps = buildSessionDeps(rpc, { cwd, ownerEmail: owner });
6347
6347
  const sender = { name: context?.user?.email || context?.user?.id || "user", kind: "user", verified: true };
6348
- const { toolsForRole } = await import('./sideband-COVIgnXL.mjs');
6348
+ const { toolsForRole } = await import('./sideband-C5_SnwE7.mjs');
6349
6349
  const r2 = await runWiseAgent({ message: params.message, sender, config: { tools: toolsForRole(role2) }, deps, transport, model: resolved.model });
6350
6350
  return fmt(r2);
6351
6351
  }
@@ -6450,7 +6450,7 @@ QUESTION: ${params.question || "Summarize this concisely."}` }
6450
6450
  return { ok: false, call_id: callId, status: "busy", error: "channel is busy (too many concurrent requests) \u2014 retry shortly" };
6451
6451
  }
6452
6452
  const rendered = renderMessage(c, { sender: r.sender, body: { message: kwargs.message }, callId });
6453
- const { queryCore } = await import('./commands-BY4rS-E4.mjs');
6453
+ const { queryCore } = await import('./commands-BJZyPz9N.mjs');
6454
6454
  const timeout = c.reply?.timeout_sec || 120;
6455
6455
  let result;
6456
6456
  try {
@@ -6960,6 +6960,124 @@ function setupOutpostChannel(params) {
6960
6960
  };
6961
6961
  }
6962
6962
 
6963
+ const CODE_ALPHABET = "abcdefghjkmnpqrstuvwxyz23456789";
6964
+ const CODE_LEN = 7;
6965
+ const DEFAULT_PAIRING_TTL_MS = 30 * 60 * 1e3;
6966
+ function pairingsFilePath(svampHome) {
6967
+ const home = svampHome || process.env.SVAMP_HOME || join$1(homedir$1(), ".svamp");
6968
+ return join$1(home, "outpost-pairings.json");
6969
+ }
6970
+ function loadPairings(svampHome) {
6971
+ const file = pairingsFilePath(svampHome);
6972
+ if (!existsSync(file)) return [];
6973
+ try {
6974
+ const parsed = JSON.parse(readFileSync(file, "utf-8"));
6975
+ if (!parsed || !Array.isArray(parsed.pairings)) return [];
6976
+ return parsed.pairings;
6977
+ } catch {
6978
+ return [];
6979
+ }
6980
+ }
6981
+ function savePairings(pairings, svampHome) {
6982
+ const file = pairingsFilePath(svampHome);
6983
+ const dir = join$1(file, "..");
6984
+ if (!existsSync(dir)) mkdirSync$1(dir, { recursive: true });
6985
+ const payload = { version: 1, pairings };
6986
+ writeFileSync$1(file, JSON.stringify(payload, null, 2) + "\n", { encoding: "utf-8", mode: 384 });
6987
+ try {
6988
+ chmodSync(file, 384);
6989
+ } catch {
6990
+ }
6991
+ }
6992
+ function generatePairingCode(len = CODE_LEN) {
6993
+ const n = CODE_ALPHABET.length;
6994
+ const max = Math.floor(256 / n) * n;
6995
+ let out = "";
6996
+ while (out.length < len) {
6997
+ const buf = randomBytes(len * 2);
6998
+ for (let i = 0; i < buf.length && out.length < len; i++) {
6999
+ const b = buf[i];
7000
+ if (b < max) out += CODE_ALPHABET[b % n];
7001
+ }
7002
+ }
7003
+ return out;
7004
+ }
7005
+ async function deletePairingArtifact(am, artifactId, log) {
7006
+ try {
7007
+ await am.delete({ artifact_id: artifactId, _rkwargs: true });
7008
+ } catch (e) {
7009
+ log?.(`[OUTPOST PAIRING] delete ${artifactId} failed (ok if already gone): ${e?.message || e}`);
7010
+ }
7011
+ }
7012
+ async function sweepExpiredPairings(am, svampHome, log) {
7013
+ const now = Date.now();
7014
+ const all = loadPairings(svampHome);
7015
+ const expired = all.filter((p) => p.expiresAt <= now);
7016
+ if (expired.length === 0) return;
7017
+ for (const p of expired) await deletePairingArtifact(am, p.artifactId, log);
7018
+ savePairings(all.filter((p) => p.expiresAt > now), svampHome);
7019
+ }
7020
+ async function burnSessionPairings(am, session, svampHome, log) {
7021
+ const all = loadPairings(svampHome);
7022
+ const mine = all.filter((p) => p.session === session);
7023
+ if (mine.length === 0) return;
7024
+ for (const p of mine) await deletePairingArtifact(am, p.artifactId, log);
7025
+ savePairings(all.filter((p) => p.session !== session), svampHome);
7026
+ }
7027
+ async function mintPairingCode(opts) {
7028
+ const { am, session, payload, log } = opts;
7029
+ const resolver = (opts.resolverBase || "https://hypha.aicell.io").replace(/\/$/, "");
7030
+ const ttlMs = opts.ttlMs && opts.ttlMs > 0 ? opts.ttlMs : DEFAULT_PAIRING_TTL_MS;
7031
+ await sweepExpiredPairings(am, opts.svampHome, log).catch(() => {
7032
+ });
7033
+ const now = Date.now();
7034
+ const existing = loadPairings(opts.svampHome).find((p) => p.session === session && p.expiresAt > now + 3e4);
7035
+ if (existing) {
7036
+ return { code: existing.code, resolver, expiresAt: existing.expiresAt };
7037
+ }
7038
+ const code = generatePairingCode();
7039
+ const alias = `svamp-op-${code}`;
7040
+ const artifactId = `public/${alias}`;
7041
+ const expiresAt = now + ttlMs;
7042
+ const pairJson = JSON.stringify({
7043
+ server: payload.server,
7044
+ channel: payload.channel,
7045
+ token: payload.token,
7046
+ session: payload.session,
7047
+ expiresAt
7048
+ });
7049
+ await am.create({
7050
+ alias,
7051
+ workspace: "public",
7052
+ type: "generic",
7053
+ manifest: { name: `Svamp outpost pairing ${code}`, description: "One-time short-code pairing for an FDE outpost. Single-use, TTL-limited." },
7054
+ config: { permissions: { "*": "r" } },
7055
+ stage: true,
7056
+ _rkwargs: true
7057
+ });
7058
+ const putUrl = await am.put_file({ artifact_id: artifactId, file_path: "pair.json", download_weight: 0, _rkwargs: true });
7059
+ if (!putUrl || typeof putUrl !== "string") throw new Error(`put_file returned invalid URL: ${putUrl}`);
7060
+ const controller = new AbortController();
7061
+ const timer = setTimeout(() => controller.abort(), 3e4);
7062
+ try {
7063
+ const resp = await fetch(putUrl, {
7064
+ method: "PUT",
7065
+ body: pairJson,
7066
+ headers: { "Content-Type": "application/json" },
7067
+ signal: controller.signal
7068
+ });
7069
+ if (!resp.ok) throw new Error(`pair.json upload failed: ${resp.status} ${resp.statusText}`);
7070
+ } finally {
7071
+ clearTimeout(timer);
7072
+ }
7073
+ await am.commit({ artifact_id: artifactId, _rkwargs: true });
7074
+ const all = loadPairings(opts.svampHome);
7075
+ all.push({ session, code, artifactId, expiresAt, createdAt: now });
7076
+ savePairings(all, opts.svampHome);
7077
+ log?.(`[OUTPOST PAIRING] minted ${code} for ${session} (expires in ${Math.round(ttlMs / 6e4)}m)`);
7078
+ return { code, resolver, expiresAt };
7079
+ }
7080
+
6963
7081
  const PARTICIPANTS_CHANNEL_ID = "sys-participants";
6964
7082
  function channelPublicView(c) {
6965
7083
  const u = c.upload;
@@ -7716,7 +7834,27 @@ function createSessionStore(server, sessionId, initialMetadata, initialAgentStat
7716
7834
  downloadBase: params?.downloadBase || process.env.SVAMP_OUTPOST_DL
7717
7835
  });
7718
7836
  syncChannelsToMetadata();
7719
- return { ok: true, ...info };
7837
+ let pairing = {};
7838
+ try {
7839
+ const am = await server.getService("public/artifact-manager");
7840
+ if (am) {
7841
+ if (info.connectedCount > 0) {
7842
+ await burnSessionPairings(am, sessionId, void 0, (m) => console.log(m));
7843
+ } else {
7844
+ const r = await mintPairingCode({
7845
+ am,
7846
+ session: sessionId,
7847
+ payload: { server: info.serverBase, channel: info.channelId, token: info.token, session: sessionId },
7848
+ resolverBase: channelsBaseUrl,
7849
+ log: (m) => console.log(m)
7850
+ });
7851
+ pairing = { pairingCode: r.code, pairingResolver: r.resolver, pairingExpiresAt: r.expiresAt };
7852
+ }
7853
+ }
7854
+ } catch (e) {
7855
+ console.log(`[OUTPOST PAIRING] mint skipped (Form 1 still works): ${e?.message || e}`);
7856
+ }
7857
+ return { ok: true, ...info, ...pairing };
7720
7858
  } catch (e) {
7721
7859
  return { error: e?.message || String(e) };
7722
7860
  }
@@ -16446,7 +16584,7 @@ async function startDaemon(options) {
16446
16584
  try {
16447
16585
  const dir = loadSessionIndex()[sessionId]?.directory;
16448
16586
  if (!dir) return;
16449
- const { reconcileServiceLinks } = await import('./agentCommands-BB9V70n7.mjs');
16587
+ const { reconcileServiceLinks } = await import('./agentCommands-B7naHDWq.mjs');
16450
16588
  const configPath = getSvampConfigPath(dir, sessionId);
16451
16589
  const config = readSvampConfig(configPath);
16452
16590
  const entries = Array.from(urls.entries());
@@ -16464,7 +16602,7 @@ async function startDaemon(options) {
16464
16602
  }
16465
16603
  }
16466
16604
  async function createExposedTunnel(spec) {
16467
- const { FrpcTunnel } = await import('./frpc-BtNpheHe.mjs');
16605
+ const { FrpcTunnel } = await import('./frpc-DXiVmDEz.mjs');
16468
16606
  const tunnel = new FrpcTunnel({
16469
16607
  name: spec.name,
16470
16608
  ports: spec.ports,
@@ -18680,11 +18818,11 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
18680
18818
  });
18681
18819
  },
18682
18820
  onIssue: async (params) => {
18683
- const { issueRpc } = await import('./rpc-Dm2C8f67.mjs');
18821
+ const { issueRpc } = await import('./rpc-CJbR3vhe.mjs');
18684
18822
  return issueRpc(params?.cwd || directory, params || {}, { notifySession: notifyIssueOwner, rekickLoopOwner });
18685
18823
  },
18686
18824
  onWorkflow: async (params) => {
18687
- const { workflowRpc } = await import('./rpc-DmQuRSyU.mjs');
18825
+ const { workflowRpc } = await import('./rpc-v1hrwmCr.mjs');
18688
18826
  return workflowRpc(params?.cwd || directory, params || {});
18689
18827
  },
18690
18828
  onRipgrep: async (args, cwd) => {
@@ -19297,11 +19435,11 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
19297
19435
  });
19298
19436
  },
19299
19437
  onIssue: async (params) => {
19300
- const { issueRpc } = await import('./rpc-Dm2C8f67.mjs');
19438
+ const { issueRpc } = await import('./rpc-CJbR3vhe.mjs');
19301
19439
  return issueRpc(params?.cwd || directory, params || {}, { notifySession: notifyIssueOwner, rekickLoopOwner });
19302
19440
  },
19303
19441
  onWorkflow: async (params) => {
19304
- const { workflowRpc } = await import('./rpc-DmQuRSyU.mjs');
19442
+ const { workflowRpc } = await import('./rpc-v1hrwmCr.mjs');
19305
19443
  return workflowRpc(params?.cwd || directory, params || {});
19306
19444
  },
19307
19445
  onRipgrep: async (args, cwd) => {
@@ -20428,7 +20566,7 @@ ${oracle.output.trim().slice(0, 500)}`, "\u{1F501} Continuing loop");
20428
20566
  const PING_TIMEOUT_MS = 15e3;
20429
20567
  const POST_RECONNECT_GRACE_MS = 2e4;
20430
20568
  const RECONNECT_JITTER_MS = 2500;
20431
- const { WorkflowScheduler } = await import('./scheduler-Bup5XvL_.mjs');
20569
+ const { WorkflowScheduler } = await import('./scheduler-DXE6xA8q.mjs');
20432
20570
  const workflowScheduler = new WorkflowScheduler({
20433
20571
  projectRoots: () => {
20434
20572
  const dirs = /* @__PURE__ */ new Set();
@@ -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-BLmCDxvV.mjs';
1
+ import { j as resolveProjectRoot, D as listWorkflows, E as isWorkflowEnabled, F as workflowCrons, y as runWorkflow, G as cronMatches } from './run-BKR-KNMV.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-BY4rS-E4.mjs');
57
+ const { connectAndGetMachine } = await import('./commands-BJZyPz9N.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-BY4rS-E4.mjs');
96
+ const { connectAndGetMachine } = await import('./commands-BJZyPz9N.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-BY4rS-E4.mjs');
185
+ const { connectAndGetMachine } = await import('./commands-BJZyPz9N.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-BY4rS-E4.mjs');
205
+ const { connectAndGetMachine } = await import('./commands-BJZyPz9N.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-BY4rS-E4.mjs');
238
+ const { connectAndGetMachine } = await import('./commands-BJZyPz9N.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, Q as loadMachineContext, T as buildMachineInstructions, U as machineToolsForRole, V as buildMachineTools } from './run-BLmCDxvV.mjs';
1
+ import { R as READ_ONLY_TOOLS, Q as loadMachineContext, T as buildMachineInstructions, U as machineToolsForRole, V as buildMachineTools } from './run-BKR-KNMV.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.296",
3
+ "version": "0.2.297",
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-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 && 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-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-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 && 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",