svamp-cli 0.2.310 → 0.2.311

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-BcH3OlSL.mjs → adminCommands-U5D7i8tD.mjs} +1 -1
  2. package/dist/{agentCommands-9GHpj3mp.mjs → agentCommands-BefFTl6g.mjs} +5 -5
  3. package/dist/{auth-CuN-K8i9.mjs → auth-DgGAjihq.mjs} +1 -1
  4. package/dist/{cli-Co_GXbrT.mjs → cli-B0TyKXyU.mjs} +70 -70
  5. package/dist/cli.mjs +2 -2
  6. package/dist/{commands-Eo0kocpm.mjs → commands-BCQbBzYU.mjs} +2 -2
  7. package/dist/{commands-D-RsuMqs.mjs → commands-BoGUxb2o.mjs} +1 -1
  8. package/dist/{commands-B0cRa6cc.mjs → commands-CEOhve0Y.mjs} +2 -2
  9. package/dist/{commands-DrVsg0Q1.mjs → commands-CjVl4amM.mjs} +8 -8
  10. package/dist/{commands-Dx4S6f_G.mjs → commands-CnqL60f7.mjs} +1 -1
  11. package/dist/{commands-DBiIsRQ_.mjs → commands-XQ8-fOSu.mjs} +1 -1
  12. package/dist/{commands-DuLlH97k.mjs → commands-imLC7CK2.mjs} +2 -2
  13. package/dist/{commands-DiuHHJ6r.mjs → commands-xoalqGUY.mjs} +2 -2
  14. package/dist/{fleet-CFpET-T5.mjs → fleet-BS5eS0Wz.mjs} +1 -1
  15. package/dist/{frpc-DxIjZ8o_.mjs → frpc-DvBVvsZC.mjs} +1 -1
  16. package/dist/{headlessCli-BIY-YePw.mjs → headlessCli-C9wTLm1x.mjs} +2 -2
  17. package/dist/index.mjs +1 -1
  18. package/dist/{notifyCommands-DldLQlDU.mjs → notifyCommands-0IltLO-S.mjs} +1 -1
  19. package/dist/package-CFhmZcVJ.mjs +64 -0
  20. package/dist/{rpc-D7_Gj0Kt.mjs → rpc-BLWr4p8g.mjs} +1 -1
  21. package/dist/{rpc-BVw8Tv9l.mjs → rpc-BXpuORiQ.mjs} +1 -1
  22. package/dist/{run-DLk7NGih.mjs → run-CMoQtnIj.mjs} +1 -1
  23. package/dist/{run-CqO23ro_.mjs → run-DtVX2pQN.mjs} +70 -24
  24. package/dist/{scheduler-q7Refevo.mjs → scheduler-7aLvf5mn.mjs} +1 -1
  25. package/dist/{serveCommands-BJjvhDxp.mjs → serveCommands-D7BieIJ5.mjs} +5 -5
  26. package/dist/{sideband-Dv3qNlQN.mjs → sideband-DjjXlVhw.mjs} +1 -1
  27. package/package.json +2 -2
  28. package/dist/package-BKmrvBsb.mjs +0 -64
@@ -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-DxIjZ8o_.mjs');
63
+ const { runFrpcTunnel } = await import('./frpc-DvBVvsZC.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-D-RsuMqs.mjs');
73
+ const { connectAndGetMachine } = await import('./commands-BoGUxb2o.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-9GHpj3mp.mjs');
95
+ const { autoAddSessionLink } = await import('./agentCommands-BefFTl6g.mjs');
96
96
  let added = 0;
97
97
  for (const [port, url] of urlEntries) {
98
98
  const label = urlEntries.length > 1 ? `${name}:${port}` : name;
@@ -128,8 +128,8 @@ async function serviceServe(args) {
128
128
  const resolvedDir = path.resolve(directory);
129
129
  console.log(`Serving ${resolvedDir}`);
130
130
  const http = await import('http');
131
- const { serveStaticMount } = await import('./run-CqO23ro_.mjs').then(function (n) { return n.ap; });
132
- const { getFreePort } = await import('./frpc-DxIjZ8o_.mjs');
131
+ const { serveStaticMount } = await import('./run-DtVX2pQN.mjs').then(function (n) { return n.ap; });
132
+ const { getFreePort } = await import('./frpc-DvBVvsZC.mjs');
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;
@@ -152,7 +152,7 @@ async function serviceServe(args) {
152
152
  resolve(18080);
153
153
  });
154
154
  });
155
- const { runFrpcTunnel } = await import('./frpc-DxIjZ8o_.mjs');
155
+ const { runFrpcTunnel } = await import('./frpc-DvBVvsZC.mjs');
156
156
  void server;
157
157
  await runFrpcTunnel(name, [servePort]);
158
158
  } catch (err) {
@@ -162,7 +162,7 @@ async function serviceServe(args) {
162
162
  }
163
163
  async function serviceList(_args) {
164
164
  try {
165
- const { connectAndGetMachine } = await import('./commands-D-RsuMqs.mjs');
165
+ const { connectAndGetMachine } = await import('./commands-BoGUxb2o.mjs');
166
166
  const { server, machine } = await connectAndGetMachine();
167
167
  try {
168
168
  const tunnels = await machine.tunnelList({});
@@ -202,7 +202,7 @@ async function serviceDelete(args) {
202
202
  process.exit(1);
203
203
  }
204
204
  try {
205
- const { connectAndGetMachine } = await import('./commands-D-RsuMqs.mjs');
205
+ const { connectAndGetMachine } = await import('./commands-BoGUxb2o.mjs');
206
206
  const { server, machine } = await connectAndGetMachine();
207
207
  try {
208
208
  await machine.tunnelStop({ name });
@@ -1,5 +1,5 @@
1
1
  import { spawnSync } from 'node:child_process';
2
- import { j as resolveProjectRoot, K 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-CqO23ro_.mjs';
2
+ import { j as resolveProjectRoot, K 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-DtVX2pQN.mjs';
3
3
  import 'os';
4
4
  import 'fs/promises';
5
5
  import 'fs';
@@ -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 { V as parseFrontmatter, W as getSkillsServer, X as getSkillsWorkspaceName, Y as getSkillsCollectionName, Z as fetchWithTimeout, _ as searchSkills, $ as SKILLS_DIR, a0 as getSkillInfo, a1 as downloadSkillFile, a2 as listSkillFiles } from './run-CqO23ro_.mjs';
4
+ import { V as parseFrontmatter, W as getSkillsServer, X as getSkillsWorkspaceName, Y as getSkillsCollectionName, Z as fetchWithTimeout, _ as searchSkills, $ as SKILLS_DIR, a0 as getSkillInfo, a1 as downloadSkillFile, a2 as listSkillFiles } from './run-DtVX2pQN.mjs';
5
5
  import 'fs/promises';
6
6
  import 'url';
7
7
  import 'child_process';
@@ -1,9 +1,9 @@
1
- import { connectAndResolveSession } from './commands-D-RsuMqs.mjs';
1
+ import { connectAndResolveSession } from './commands-BoGUxb2o.mjs';
2
2
  import 'node:fs';
3
3
  import 'node:child_process';
4
4
  import 'node:path';
5
5
  import 'node:os';
6
- import './run-CqO23ro_.mjs';
6
+ import './run-DtVX2pQN.mjs';
7
7
  import 'os';
8
8
  import 'fs/promises';
9
9
  import 'fs';
@@ -1,8 +1,8 @@
1
1
  import { execSync } from 'node:child_process';
2
2
  import { existsSync, readFileSync } from 'node:fs';
3
3
  import { join } from 'node:path';
4
- import { f as flushAndExit } from './cli-Co_GXbrT.mjs';
5
- import { j as resolveProjectRoot, q as searchIssues, o as listIssues, l as resumeIssue, p as pauseIssue, m as addComment, u as updateIssue, k as getIssue, t as isVisibleTo, J as summarize, n as addIssue } from './run-CqO23ro_.mjs';
4
+ import { f as flushAndExit } from './cli-B0TyKXyU.mjs';
5
+ import { j as resolveProjectRoot, q as searchIssues, o as listIssues, l as resumeIssue, p as pauseIssue, m as addComment, u as updateIssue, k as getIssue, t as isVisibleTo, J as summarize, n as addIssue } from './run-DtVX2pQN.mjs';
6
6
  import './serviceManager-hlOVxkhW.mjs';
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 { U as PINNED_CODEX_VERSION, c as connectToHypha } from './run-CqO23ro_.mjs';
4
+ import { U as PINNED_CODEX_VERSION, c as connectToHypha } from './run-DtVX2pQN.mjs';
5
5
  import { PINNED_CLAUDE_CODE_VERSION } from './pinnedClaudeCode-zDzkOTi2.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-CqO23ro_.mjs';
7
+ import { e as getFrpsSubdomainHost, f as getFrpsServerPort, h as getFrpsServerAddr } from './run-DtVX2pQN.mjs';
8
8
  import 'fs/promises';
9
9
  import 'url';
10
10
  import 'node:crypto';
@@ -1,5 +1,5 @@
1
- import { a3 as resolveModel, aj as describeMisconfiguration, ak as buildMachineDeps } from './run-CqO23ro_.mjs';
2
- import { handleRealtimeEvent, initMachineVoiceSession } from './sideband-Dv3qNlQN.mjs';
1
+ import { a3 as resolveModel, aj as describeMisconfiguration, ak as buildMachineDeps } from './run-DtVX2pQN.mjs';
2
+ import { handleRealtimeEvent, initMachineVoiceSession } from './sideband-DjjXlVhw.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-CqO23ro_.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-DtVX2pQN.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, L as parseJwtEmail } from './run-CqO23ro_.mjs';
1
+ import { c as connectToHypha, S as SharingNotificationSync, L as parseJwtEmail } from './run-DtVX2pQN.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.311";
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-stdin-delivery.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-machine-session-visibility.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-pinned-codex.mjs && npx tsx test/test-codex-request-timeout.mjs && npx tsx test/test-codex-app-server.mjs && npx tsx test/e2e-codex-midturn-steer.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, 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-CqO23ro_.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-DtVX2pQN.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 validateWorkflowName, C as saveWorkflow, D as rawWorkflow, E as listWorkflows } from './run-CqO23ro_.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-DtVX2pQN.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-CqO23ro_.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-DtVX2pQN.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';
@@ -3147,7 +3147,7 @@ Connection: close\r
3147
3147
  const mount = this.mounts.get(mountName);
3148
3148
  const subdomainOverride = mount?.access === "link" && mount.linkToken ? /* @__PURE__ */ new Map([[this.port, buildLinkSubdomain(subdomainSafe, mount.linkToken)]]) : void 0;
3149
3149
  try {
3150
- const { FrpcTunnel } = await import('./frpc-DxIjZ8o_.mjs');
3150
+ const { FrpcTunnel } = await import('./frpc-DvBVvsZC.mjs');
3151
3151
  let tunnel;
3152
3152
  tunnel = new FrpcTunnel({
3153
3153
  name: tunnelName,
@@ -6280,7 +6280,7 @@ async function registerMachineService(server, machineId, metadata, daemonState,
6280
6280
  const tunnels = handlers.tunnels;
6281
6281
  if (!tunnels) throw new Error("Tunnel management not available");
6282
6282
  if (tunnels.has(params.name)) throw new Error(`Tunnel '${params.name}' already running`);
6283
- const { FrpcTunnel } = await import('./frpc-DxIjZ8o_.mjs');
6283
+ const { FrpcTunnel } = await import('./frpc-DvBVvsZC.mjs');
6284
6284
  const tunnel = new FrpcTunnel({
6285
6285
  name: params.name,
6286
6286
  ports: params.ports,
@@ -6773,7 +6773,7 @@ QUESTION: ${params.question || "Summarize this concisely."}` }
6773
6773
  }
6774
6774
  const deps = buildSessionDeps(rpc, { cwd, ownerEmail: owner });
6775
6775
  const sender = { name: context?.user?.email || context?.user?.id || "user", kind: "user", verified: true };
6776
- const { toolsForRole } = await import('./sideband-Dv3qNlQN.mjs');
6776
+ const { toolsForRole } = await import('./sideband-DjjXlVhw.mjs');
6777
6777
  const r2 = await runWiseAgent({ message: params.message, sender, config: { tools: toolsForRole(role2) }, deps, transport, model: resolved.model });
6778
6778
  return fmt(r2);
6779
6779
  }
@@ -6878,7 +6878,7 @@ QUESTION: ${params.question || "Summarize this concisely."}` }
6878
6878
  return { ok: false, call_id: callId, status: "busy", error: "channel is busy (too many concurrent requests) \u2014 retry shortly" };
6879
6879
  }
6880
6880
  const rendered = renderMessage(c, { sender: r.sender, body: { message: kwargs.message }, callId });
6881
- const { queryCore } = await import('./commands-D-RsuMqs.mjs');
6881
+ const { queryCore } = await import('./commands-BoGUxb2o.mjs');
6882
6882
  const timeout = c.reply?.timeout_sec || 120;
6883
6883
  let result;
6884
6884
  try {
@@ -16358,6 +16358,28 @@ async function writeSessionFileChunk(directory, sessionMetadata, path, content,
16358
16358
  }
16359
16359
  }
16360
16360
 
16361
+ function isStdinWritable(proc) {
16362
+ if (!proc || proc.exitCode !== null) return false;
16363
+ const stdin = proc.stdin;
16364
+ if (!stdin) return false;
16365
+ if (stdin.destroyed === true) return false;
16366
+ if (stdin.writable === false) return false;
16367
+ return true;
16368
+ }
16369
+ function serializeUserFrame(text) {
16370
+ return JSON.stringify({ type: "user", message: { role: "user", content: text } }) + "\n";
16371
+ }
16372
+ function writeUserFrame(proc, text, onError) {
16373
+ if (!isStdinWritable(proc)) return false;
16374
+ try {
16375
+ proc.stdin.write(serializeUserFrame(text));
16376
+ return true;
16377
+ } catch (err) {
16378
+ onError?.(err);
16379
+ return false;
16380
+ }
16381
+ }
16382
+
16361
16383
  const __filename$1 = fileURLToPath(import.meta.url);
16362
16384
  const __dirname$1 = dirname$1(__filename$1);
16363
16385
  const CLAUDE_SKILLS_DIR = join(os$1.homedir(), ".claude", "skills");
@@ -17855,7 +17877,7 @@ async function startDaemon(options) {
17855
17877
  try {
17856
17878
  const dir = loadSessionIndex()[sessionId]?.directory;
17857
17879
  if (!dir) return;
17858
- const { reconcileServiceLinks } = await import('./agentCommands-9GHpj3mp.mjs');
17880
+ const { reconcileServiceLinks } = await import('./agentCommands-BefFTl6g.mjs');
17859
17881
  const configPath = getSvampConfigPath(dir, sessionId);
17860
17882
  const config = readSvampConfig(configPath);
17861
17883
  const entries = Array.from(urls.entries());
@@ -17873,7 +17895,7 @@ async function startDaemon(options) {
17873
17895
  }
17874
17896
  }
17875
17897
  async function createExposedTunnel(spec) {
17876
- const { FrpcTunnel } = await import('./frpc-DxIjZ8o_.mjs');
17898
+ const { FrpcTunnel } = await import('./frpc-DvBVvsZC.mjs');
17877
17899
  const tunnel = new FrpcTunnel({
17878
17900
  name: spec.name,
17879
17901
  ports: spec.ports,
@@ -19472,6 +19494,9 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
19472
19494
  }
19473
19495
  return child;
19474
19496
  };
19497
+ const writeUserFrameToClaude = (text) => writeUserFrame(claudeProcess, text, (err) => {
19498
+ logger.log(`[Session ${sessionId}] Claude stdin write failed: ${err?.message || err}`);
19499
+ });
19475
19500
  const restartClaudeHandler = async (opts) => {
19476
19501
  logger.log(`[Session ${sessionId}] Restart Claude requested`);
19477
19502
  if (isRestartingClaude || isSwitchingMode) {
@@ -19510,6 +19535,9 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
19510
19535
  spawnClaude(void 0, { permissionMode: currentPermissionMode });
19511
19536
  sessionService.updateMetadata(sessionMetadata);
19512
19537
  logger.log(`[Session ${sessionId}] Claude respawned with --resume ${claudeResumeId}`);
19538
+ if ((sessionMetadata.messageQueue?.length ?? 0) > 0 && !trackedSession?.stopped) {
19539
+ setTimeout(() => processMessageQueueRef?.(), 300);
19540
+ }
19513
19541
  if (beforeRespawnError) {
19514
19542
  return { success: false, message: `Edit failed (session restored): ${beforeRespawnError}` };
19515
19543
  }
@@ -19734,15 +19762,26 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
19734
19762
  pendingCompactTurn = isCompactCommand(text);
19735
19763
  if (!claudeProcess || claudeProcess.exitCode !== null) {
19736
19764
  spawnClaude(text, msgMeta);
19765
+ signalProcessing(true);
19766
+ sessionWasProcessing = true;
19767
+ } else if (writeUserFrameToClaude(text)) {
19768
+ signalProcessing(true);
19769
+ sessionWasProcessing = true;
19737
19770
  } else {
19738
- const stdinMsg = JSON.stringify({
19739
- type: "user",
19740
- message: { role: "user", content: text }
19741
- });
19742
- claudeProcess.stdin?.write(stdinMsg + "\n");
19771
+ logger.log(`[Session ${sessionId}] Claude stdin unwritable \u2014 requeueing message for respawn delivery`);
19772
+ const existingQueue = sessionMetadata.messageQueue || [];
19773
+ sessionMetadata = {
19774
+ ...sessionMetadata,
19775
+ messageQueue: [...existingQueue, { id: randomUUID$1(), text, createdAt: Date.now(), alreadyStored: true }]
19776
+ };
19777
+ sessionService.updateMetadata(sessionMetadata);
19778
+ signalProcessing(true);
19779
+ sessionWasProcessing = true;
19780
+ try {
19781
+ claudeProcess.kill("SIGTERM");
19782
+ } catch {
19783
+ }
19743
19784
  }
19744
- signalProcessing(true);
19745
- sessionWasProcessing = true;
19746
19785
  },
19747
19786
  onAbort: () => {
19748
19787
  logger.log(`[Session ${sessionId}] Abort requested`);
@@ -19844,6 +19883,9 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
19844
19883
  isKillingClaude = false;
19845
19884
  if (trackedSession?.stopped) return;
19846
19885
  spawnClaude(void 0, { permissionMode: normalizedMode });
19886
+ if ((sessionMetadata.messageQueue?.length ?? 0) > 0 && !trackedSession?.stopped) {
19887
+ setTimeout(() => processMessageQueueRef?.(), 300);
19888
+ }
19847
19889
  } finally {
19848
19890
  isKillingClaude = false;
19849
19891
  isSwitchingMode = false;
@@ -20107,11 +20149,11 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
20107
20149
  });
20108
20150
  },
20109
20151
  onIssue: async (params) => {
20110
- const { issueRpc } = await import('./rpc-D7_Gj0Kt.mjs');
20152
+ const { issueRpc } = await import('./rpc-BLWr4p8g.mjs');
20111
20153
  return issueRpc(params?.cwd || directory, params || {}, { notifySession: notifyIssueOwner, rekickLoopOwner });
20112
20154
  },
20113
20155
  onWorkflow: async (params) => {
20114
- const { workflowRpc } = await import('./rpc-BVw8Tv9l.mjs');
20156
+ const { workflowRpc } = await import('./rpc-BXpuORiQ.mjs');
20115
20157
  return workflowRpc(params?.cwd || directory, params || {});
20116
20158
  },
20117
20159
  onRipgrep: async (args, cwd) => {
@@ -20257,12 +20299,7 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
20257
20299
  try {
20258
20300
  if (!claudeProcess || claudeProcess.exitCode !== null) {
20259
20301
  spawnClaude(next.text);
20260
- } else {
20261
- const stdinMsg = JSON.stringify({
20262
- type: "user",
20263
- message: { role: "user", content: next.text }
20264
- });
20265
- claudeProcess.stdin?.write(stdinMsg + "\n");
20302
+ } else if (writeUserFrameToClaude(next.text)) {
20266
20303
  if (claudeResumeId && !trackedSession?.stopped) {
20267
20304
  saveSession({
20268
20305
  sessionId,
@@ -20276,6 +20313,15 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
20276
20313
  wasProcessing: true
20277
20314
  });
20278
20315
  }
20316
+ } else {
20317
+ logger.log(`[Session ${sessionId}] Claude stdin unwritable during queue drain \u2014 restoring head + respawning`);
20318
+ sessionMetadata = { ...sessionMetadata, messageQueue: [next, ...remaining] };
20319
+ sessionService.updateMetadata(sessionMetadata);
20320
+ sessionWasProcessing = false;
20321
+ try {
20322
+ claudeProcess.kill("SIGTERM");
20323
+ } catch {
20324
+ }
20279
20325
  }
20280
20326
  } catch (err) {
20281
20327
  logger.log(`[Session ${sessionId}] Error in processMessageQueue spawn: ${err.message}`);
@@ -20781,11 +20827,11 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
20781
20827
  });
20782
20828
  },
20783
20829
  onIssue: async (params) => {
20784
- const { issueRpc } = await import('./rpc-D7_Gj0Kt.mjs');
20830
+ const { issueRpc } = await import('./rpc-BLWr4p8g.mjs');
20785
20831
  return issueRpc(params?.cwd || directory, params || {}, { notifySession: notifyIssueOwner, rekickLoopOwner });
20786
20832
  },
20787
20833
  onWorkflow: async (params) => {
20788
- const { workflowRpc } = await import('./rpc-BVw8Tv9l.mjs');
20834
+ const { workflowRpc } = await import('./rpc-BXpuORiQ.mjs');
20789
20835
  return workflowRpc(params?.cwd || directory, params || {});
20790
20836
  },
20791
20837
  onRipgrep: async (args, cwd) => {
@@ -21948,7 +21994,7 @@ ${oracle.output.trim().slice(0, 500)}`, "\u{1F501} Continuing loop");
21948
21994
  const PING_TIMEOUT_MS = 15e3;
21949
21995
  const POST_RECONNECT_GRACE_MS = 2e4;
21950
21996
  const RECONNECT_JITTER_MS = 2500;
21951
- const { WorkflowScheduler } = await import('./scheduler-q7Refevo.mjs');
21997
+ const { WorkflowScheduler } = await import('./scheduler-7aLvf5mn.mjs');
21952
21998
  const workflowProjectRoots = () => {
21953
21999
  const dirs = /* @__PURE__ */ new Set();
21954
22000
  for (const s of pidToTrackedSession.values()) {
@@ -1,4 +1,4 @@
1
- import { j as resolveProjectRoot, E as listWorkflows, F as isWorkflowEnabled, G as workflowSchedules, H as inZone, y as runWorkflow, I as cronMatches } from './run-CqO23ro_.mjs';
1
+ import { j as resolveProjectRoot, E as listWorkflows, F as isWorkflowEnabled, G as workflowSchedules, H as inZone, y as runWorkflow, I as cronMatches } from './run-DtVX2pQN.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-D-RsuMqs.mjs');
57
+ const { connectAndGetMachine } = await import('./commands-BoGUxb2o.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-D-RsuMqs.mjs');
96
+ const { connectAndGetMachine } = await import('./commands-BoGUxb2o.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-D-RsuMqs.mjs');
185
+ const { connectAndGetMachine } = await import('./commands-BoGUxb2o.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-D-RsuMqs.mjs');
205
+ const { connectAndGetMachine } = await import('./commands-BoGUxb2o.mjs');
206
206
  const all = hasFlag(args, "--all", "-a");
207
207
  const json = hasFlag(args, "--json");
208
208
  const sessionId = getFlag(args, "--session");
@@ -236,7 +236,7 @@ async function serveList(args, machineId) {
236
236
  }
237
237
  }
238
238
  async function serveInfo(machineId) {
239
- const { connectAndGetMachine } = await import('./commands-D-RsuMqs.mjs');
239
+ const { connectAndGetMachine } = await import('./commands-BoGUxb2o.mjs');
240
240
  const { machine, server } = await connectAndGetMachine(machineId);
241
241
  try {
242
242
  const info = await machine.serveInfo();
@@ -1,4 +1,4 @@
1
- import { R as READ_ONLY_TOOLS, O as loadMachineContext, P as buildMachineInstructions, Q as machineToolsForRole, T as buildMachineTools } from './run-CqO23ro_.mjs';
1
+ import { R as READ_ONLY_TOOLS, O as loadMachineContext, P as buildMachineInstructions, Q as machineToolsForRole, T as buildMachineTools } from './run-DtVX2pQN.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.310",
3
+ "version": "0.2.311",
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-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-machine-session-visibility.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-pinned-codex.mjs && npx tsx test/test-codex-request-timeout.mjs && npx tsx test/test-codex-app-server.mjs && npx tsx test/e2e-codex-midturn-steer.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-stdin-delivery.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-machine-session-visibility.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-pinned-codex.mjs && npx tsx test/test-codex-request-timeout.mjs && npx tsx test/test-codex-app-server.mjs && npx tsx test/e2e-codex-midturn-steer.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",