svamp-cli 0.2.304 → 0.2.306

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-DlD78CYk.mjs → adminCommands-Cx_Rp-TR.mjs} +1 -1
  2. package/dist/{agentCommands-B3FTfsg-.mjs → agentCommands-CUcyA_KE.mjs} +5 -5
  3. package/dist/{auth-2-M7wMHL.mjs → auth-BBjbREk1.mjs} +1 -1
  4. package/dist/{cli-CU9Xku8r.mjs → cli-Jj5S5UOL.mjs} +76 -70
  5. package/dist/cli.mjs +2 -2
  6. package/dist/{commands-CaeLSCaX.mjs → commands-3UnC4Lnb.mjs} +1 -1
  7. package/dist/{commands-CfSAnB1T.mjs → commands-BRQBNTsJ.mjs} +2 -2
  8. package/dist/{commands-DG0V3dvG.mjs → commands-BeD9b-Eh.mjs} +2 -2
  9. package/dist/{commands-CG6AF59l.mjs → commands-ByP8QKuO.mjs} +7 -7
  10. package/dist/{commands--WPYI2sm.mjs → commands-CvwLQ3MM.mjs} +1 -1
  11. package/dist/{commands-BO-oHKFw.mjs → commands-DJt9EFd7.mjs} +2 -2
  12. package/dist/{commands-CjZKWU9a.mjs → commands-DkKdjnPE.mjs} +2 -2
  13. package/dist/{commands-mm9jZg5L.mjs → commands-DlyOpWwF.mjs} +1 -1
  14. package/dist/{fleet-GklB5DQn.mjs → fleet-cBng1VMn.mjs} +1 -1
  15. package/dist/{frpc-Dsada5ox.mjs → frpc-C1jS23Sn.mjs} +30 -6
  16. package/dist/{headlessCli-B2IWICNI.mjs → headlessCli-CsnDECCN.mjs} +2 -2
  17. package/dist/{httpServer-CSMZTpoh.mjs → httpServer-1XjB2h3K.mjs} +15 -2
  18. package/dist/index.mjs +1 -1
  19. package/dist/{notifyCommands-BzCPoBy8.mjs → notifyCommands-D7Ja6442.mjs} +1 -1
  20. package/dist/{package-TCz4K-zx.mjs → package-DUF-safU.mjs} +2 -2
  21. package/dist/{rpc-DOVHyr_6.mjs → rpc-BxmbyDga.mjs} +2 -1
  22. package/dist/{rpc--eK356Xz.mjs → rpc-iNafaHoh.mjs} +1 -1
  23. package/dist/{run-BtVKqoF4.mjs → run-Bd57zohL.mjs} +784 -345
  24. package/dist/{run-IqHyd8bA.mjs → run-D351s_uv.mjs} +1 -1
  25. package/dist/{scheduler-DAkzJVgr.mjs → scheduler-CZYOanXt.mjs} +1 -1
  26. package/dist/{serveCommands-AEtGwfIU.mjs → serveCommands-DotLju8m.mjs} +6 -6
  27. package/dist/{sideband-CSwHDjzp.mjs → sideband-DM1-IAV7.mjs} +1 -1
  28. package/package.json +2 -2
@@ -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-CU9Xku8r.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, H as summarize, n as addIssue } from './run-BtVKqoF4.mjs';
4
+ import { f as flushAndExit } from './cli-Jj5S5UOL.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, I as summarize, n as addIssue } from './run-Bd57zohL.mjs';
6
6
  import './serviceManager-hlOVxkhW.mjs';
7
7
  import 'os';
8
8
  import 'fs/promises';
@@ -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-Dsada5ox.mjs');
63
+ const { runFrpcTunnel } = await import('./frpc-C1jS23Sn.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--WPYI2sm.mjs');
73
+ const { connectAndGetMachine } = await import('./commands-CvwLQ3MM.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-B3FTfsg-.mjs');
95
+ const { autoAddSessionLink } = await import('./agentCommands-CUcyA_KE.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-BtVKqoF4.mjs').then(function (n) { return n.al; });
132
+ const { serveStaticMount } = await import('./run-Bd57zohL.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-Dsada5ox.mjs');
143
+ const { runFrpcTunnel } = await import('./frpc-C1jS23Sn.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--WPYI2sm.mjs');
153
+ const { connectAndGetMachine } = await import('./commands-CvwLQ3MM.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--WPYI2sm.mjs');
193
+ const { connectAndGetMachine } = await import('./commands-CvwLQ3MM.mjs');
194
194
  const { server, machine } = await connectAndGetMachine();
195
195
  try {
196
196
  await machine.tunnelStop({ name });
@@ -2,7 +2,7 @@ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
2
2
  import { execSync, execFileSync } from 'node:child_process';
3
3
  import { basename, resolve, join, isAbsolute } from 'node:path';
4
4
  import os from 'node:os';
5
- import { a3 as formatHandle, a4 as normalizeAllowedUser, a5 as loadSecurityContextConfig, a6 as resolveSecurityContext, a7 as buildSecurityContextFromFlags, a8 as mergeSecurityContexts, c as connectToHypha, a9 as buildSessionShareUrl, aa as computeOutboundHop, i as shortId, ab as registerAwaitingReply, ac as buildMachineShareUrl, ad as parseHandle, ae as handleMatchesMetadata } from './run-BtVKqoF4.mjs';
5
+ import { a4 as formatHandle, a5 as normalizeAllowedUser, a6 as loadSecurityContextConfig, a7 as resolveSecurityContext, a8 as buildSecurityContextFromFlags, a9 as mergeSecurityContexts, c as connectToHypha, aa as buildSessionShareUrl, ab as computeOutboundHop, i as shortId, ac as registerAwaitingReply, ad as buildMachineShareUrl, ae as parseHandle, af as handleMatchesMetadata } from './run-Bd57zohL.mjs';
6
6
  import 'os';
7
7
  import 'fs/promises';
8
8
  import 'fs';
@@ -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--WPYI2sm.mjs';
3
+ import { connectAndGetMachine, resolveSessionId, createWorktree, connectAndResolveSession } from './commands-CvwLQ3MM.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-BtVKqoF4.mjs';
5
+ import { u as updateIssue, m as addComment, n as addIssue, i as shortId } from './run-Bd57zohL.mjs';
6
6
  import 'node:os';
7
7
  import 'os';
8
8
  import 'fs/promises';
@@ -1,9 +1,9 @@
1
- import { connectAndResolveSession } from './commands--WPYI2sm.mjs';
1
+ import { connectAndResolveSession } from './commands-CvwLQ3MM.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-BtVKqoF4.mjs';
6
+ import './run-Bd57zohL.mjs';
7
7
  import 'os';
8
8
  import 'fs/promises';
9
9
  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 { Q as parseFrontmatter, T as getSkillsServer, U as getSkillsWorkspaceName, V as getSkillsCollectionName, W as fetchWithTimeout, X as searchSkills, Y as SKILLS_DIR, Z as getSkillInfo, _ as downloadSkillFile, $ as listSkillFiles } from './run-BtVKqoF4.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-Bd57zohL.mjs';
5
5
  import 'fs/promises';
6
6
  import 'url';
7
7
  import 'child_process';
@@ -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-BtVKqoF4.mjs';
4
+ import { c as connectToHypha } from './run-Bd57zohL.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-BtVKqoF4.mjs';
7
+ import { e as getFrpsSubdomainHost, f as getFrpsServerPort, h as getFrpsServerAddr } from './run-Bd57zohL.mjs';
8
8
  import 'fs/promises';
9
9
  import 'url';
10
10
  import 'node:crypto';
@@ -282,6 +282,10 @@ class FrpcTunnel {
282
282
  // #0583: pending reconnect timer (cancelled on destroy)
283
283
  // End-to-end probe state (set when options.probeUrl is provided).
284
284
  _probeTimer = null;
285
+ _burstTimer = null;
286
+ // #0622: probe burst timer (cancelled on stopProbeLoop/destroy)
287
+ _connectTimeoutTimer = null;
288
+ // #0622: connect() 30s fallback (unref'd + cleared)
285
289
  _lastProbeOkAt = 0;
286
290
  _lastProbeFailAt = 0;
287
291
  _probeOk = false;
@@ -462,13 +466,19 @@ class FrpcTunnel {
462
466
  } else if (this.options.adminStatus && this._adminPort) {
463
467
  this.startAdminStatusLoop();
464
468
  }
465
- setTimeout(() => {
469
+ if (this._connectTimeoutTimer) {
470
+ clearTimeout(this._connectTimeoutTimer);
471
+ this._connectTimeoutTimer = null;
472
+ }
473
+ this._connectTimeoutTimer = setTimeout(() => {
474
+ this._connectTimeoutTimer = null;
466
475
  if (!resolved) {
467
476
  resolved = true;
468
477
  this.log("frpc connection timeout \u2014 continuing (may still connect)");
469
478
  resolve();
470
479
  }
471
480
  }, 3e4);
481
+ this._connectTimeoutTimer.unref?.();
472
482
  });
473
483
  }
474
484
  /** Resolve the effective probe URL, honoring probeUrl > probePath. */
@@ -540,9 +550,13 @@ class FrpcTunnel {
540
550
  };
541
551
  const initialDelays = [500, 2e3, 5e3, 1e4];
542
552
  let burstIdx = 0;
543
- const burstTimer = setInterval(() => {
553
+ if (this._burstTimer) clearInterval(this._burstTimer);
554
+ this._burstTimer = setInterval(() => {
544
555
  if (this._destroyed || firstOkFired || burstIdx >= initialDelays.length) {
545
- clearInterval(burstTimer);
556
+ if (this._burstTimer) {
557
+ clearInterval(this._burstTimer);
558
+ this._burstTimer = null;
559
+ }
546
560
  return;
547
561
  }
548
562
  burstIdx++;
@@ -558,6 +572,10 @@ class FrpcTunnel {
558
572
  clearInterval(this._probeTimer);
559
573
  this._probeTimer = null;
560
574
  }
575
+ if (this._burstTimer) {
576
+ clearInterval(this._burstTimer);
577
+ this._burstTimer = null;
578
+ }
561
579
  }
562
580
  /**
563
581
  * Poll frpc's loopback admin API (`/api/status`) to track whether this
@@ -643,15 +661,21 @@ class FrpcTunnel {
643
661
  clearTimeout(this._restartTimer);
644
662
  this._restartTimer = null;
645
663
  }
664
+ if (this._connectTimeoutTimer) {
665
+ clearTimeout(this._connectTimeoutTimer);
666
+ this._connectTimeoutTimer = null;
667
+ }
646
668
  if (this.process) {
647
669
  this.process.kill("SIGTERM");
648
670
  const p = this.process;
649
- setTimeout(() => {
671
+ const killTimer = setTimeout(() => {
650
672
  try {
651
- p.kill("SIGKILL");
673
+ if (p.exitCode === null && p.signalCode === null) p.kill("SIGKILL");
652
674
  } catch {
653
675
  }
654
676
  }, 5e3);
677
+ killTimer.unref?.();
678
+ p.once("exit", () => clearTimeout(killTimer));
655
679
  this.process = null;
656
680
  }
657
681
  try {
@@ -1,5 +1,5 @@
1
- import { a0 as resolveModel, af as describeMisconfiguration, ag as buildMachineDeps } from './run-BtVKqoF4.mjs';
2
- import { handleRealtimeEvent, initMachineVoiceSession } from './sideband-CSwHDjzp.mjs';
1
+ import { a1 as resolveModel, ag as describeMisconfiguration, ah as buildMachineDeps } from './run-Bd57zohL.mjs';
2
+ import { handleRealtimeEvent, initMachineVoiceSession } from './sideband-DM1-IAV7.mjs';
3
3
  import { WebSocket } from 'ws';
4
4
  import { execSync, spawn } from 'child_process';
5
5
  import 'os';
@@ -127,9 +127,22 @@ data: ${JSON.stringify({ error: out.error })}
127
127
  `);
128
128
  break;
129
129
  }
130
- for (const reply of out.replies || []) res.write(`data: ${JSON.stringify(reply)}
130
+ for (const reply of out.replies || []) {
131
+ if (!res.write(`data: ${JSON.stringify(reply)}
131
132
 
132
- `);
133
+ `) && !closed) {
134
+ await new Promise((resolve) => {
135
+ const done = () => {
136
+ res.off("drain", done);
137
+ res.off("close", done);
138
+ resolve();
139
+ };
140
+ res.once("drain", done);
141
+ res.once("close", done);
142
+ });
143
+ }
144
+ if (closed) break;
145
+ }
133
146
  cursor = out.cursor ?? cursor;
134
147
  if (!(out.replies || []).length) {
135
148
  res.write(": keepalive\n\n");
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-BtVKqoF4.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-Bd57zohL.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, J as parseJwtEmail } from './run-BtVKqoF4.mjs';
1
+ import { c as connectToHypha, S as SharingNotificationSync, K as parseJwtEmail } from './run-Bd57zohL.mjs';
2
2
  import { randomUUID } from 'node:crypto';
3
3
  import { existsSync, readFileSync } from 'node:fs';
4
4
  import { join } from 'node:path';
@@ -1,5 +1,5 @@
1
1
  var name = "svamp-cli";
2
- var version = "0.2.304";
2
+ var version = "0.2.306";
3
3
  var description = "Svamp CLI — AI workspace daemon on Hypha Cloud";
4
4
  var author = "Amun AI AB";
5
5
  var license = "SEE LICENSE IN LICENSE";
@@ -19,7 +19,7 @@ var exports$1 = {
19
19
  var scripts = {
20
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
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-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-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-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",
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-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
23
  "test:hypha": "node --no-warnings test/test-hypha-service.mjs",
24
24
  dev: "tsx src/cli.ts",
25
25
  "dev:daemon": "tsx src/cli.ts daemon start-sync",
@@ -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-BtVKqoF4.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-Bd57zohL.mjs';
2
2
  import 'os';
3
3
  import 'fs/promises';
4
4
  import 'fs';
@@ -38,6 +38,7 @@ async function workflowRpc(cwd, params) {
38
38
  if (params.dispatch || params.workflow_dispatch) on.workflow_dispatch = true;
39
39
  const runs = Array.isArray(params.runs) ? params.runs.map(String).filter(Boolean) : [];
40
40
  if (!params.name || !runs.length) throw new Error("workflow add: name and at least one run step required");
41
+ validateWorkflowName(String(params.name));
41
42
  const wf = {
42
43
  name: String(params.name),
43
44
  on: Object.keys(on).length ? on : void 0,
@@ -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-BtVKqoF4.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-Bd57zohL.mjs';
2
2
  import 'os';
3
3
  import 'fs/promises';
4
4
  import 'fs';