svamp-cli 0.2.121 → 0.2.122

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.
@@ -2,7 +2,7 @@ import { existsSync, readFileSync, mkdirSync, writeFileSync, renameSync } from '
2
2
  import { join, dirname } from 'node:path';
3
3
  import os from 'node:os';
4
4
  import { requireNotSandboxed } from './sandboxDetect-DNTcbgWD.mjs';
5
- import { n as shortId } from './run-CCjAePDZ.mjs';
5
+ import { m as shortId } from './run-PlINWUZp.mjs';
6
6
  import 'os';
7
7
  import 'fs/promises';
8
8
  import 'fs';
@@ -96,7 +96,7 @@ async function sessionSetTitle(title) {
96
96
  }
97
97
  async function sessionSetProjectDescription(description) {
98
98
  const dir = process.cwd();
99
- const { projectName, writeProjectInfo, sanitizeDescription, projectInfoPath } = await import('./run-CCjAePDZ.mjs').then(function (n) { return n.W; });
99
+ const { projectName, writeProjectInfo, sanitizeDescription, projectInfoPath } = await import('./run-PlINWUZp.mjs').then(function (n) { return n.Y; });
100
100
  const desc = sanitizeDescription(description, 240);
101
101
  if (!desc) {
102
102
  console.error("Project description is empty.");
@@ -180,7 +180,7 @@ async function sessionBroadcast(action, args) {
180
180
  console.log(`Broadcast sent: ${action}`);
181
181
  }
182
182
  async function connectToMachineService() {
183
- const { connectAndGetMachine } = await import('./commands-DgrVRMPf.mjs');
183
+ const { connectAndGetMachine } = await import('./commands-BKrGv74d.mjs');
184
184
  return connectAndGetMachine();
185
185
  }
186
186
  async function inboxSend(targetSessionId, opts) {
@@ -197,7 +197,7 @@ async function inboxSend(targetSessionId, opts) {
197
197
  }
198
198
  const { server, machine } = await connectToMachineService();
199
199
  try {
200
- const { resolveSessionId } = await import('./commands-DgrVRMPf.mjs');
200
+ const { resolveSessionId } = await import('./commands-BKrGv74d.mjs');
201
201
  const sessions = await machine.listSessions();
202
202
  const match = resolveSessionId(sessions, targetSessionId);
203
203
  const fullTargetId = match.sessionId;
@@ -1,4 +1,4 @@
1
- import { F as resolveModel } from './run-CCjAePDZ.mjs';
1
+ import { D as resolveModel } from './run-PlINWUZp.mjs';
2
2
  import 'os';
3
3
  import 'fs/promises';
4
4
  import 'fs';
package/dist/cli.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { e as clearStopMarker, f as stopMarkerExists, s as startDaemon, b as stopDaemon, d as daemonStatus } from './run-CCjAePDZ.mjs';
1
+ import { e as clearStopMarker, f as stopMarkerExists, s as startDaemon, b as stopDaemon, d as daemonStatus } from './run-PlINWUZp.mjs';
2
2
  import { ensureSupervisorViaServiceManager, LAUNCHD_LABEL } from './serviceManager-hlOVxkhW.mjs';
3
3
  import 'os';
4
4
  import 'fs/promises';
@@ -34,7 +34,7 @@ const subcommand = args[0];
34
34
  let daemonSubcommand = args[1];
35
35
  async function main() {
36
36
  try {
37
- const { getLoadedConfig } = await import('./run-CCjAePDZ.mjs').then(function (n) { return n.a1; });
37
+ const { getLoadedConfig } = await import('./run-PlINWUZp.mjs').then(function (n) { return n.a3; });
38
38
  getLoadedConfig();
39
39
  } catch {
40
40
  }
@@ -51,7 +51,7 @@ async function main() {
51
51
  console.error(`svamp daemon restart: ${err.message || err}`);
52
52
  process.exit(1);
53
53
  }
54
- const { restartDaemon } = await import('./run-CCjAePDZ.mjs').then(function (n) { return n.a3; });
54
+ const { restartDaemon } = await import('./run-PlINWUZp.mjs').then(function (n) { return n.a5; });
55
55
  await restartDaemon();
56
56
  process.exit(0);
57
57
  }
@@ -344,7 +344,7 @@ async function main() {
344
344
  console.error("svamp service: Service commands are not available in sandboxed sessions.");
345
345
  process.exit(1);
346
346
  }
347
- const { handleServiceCommand } = await import('./commands-QyvD7F1z.mjs');
347
+ const { handleServiceCommand } = await import('./commands-D7O-bNzm.mjs');
348
348
  await handleServiceCommand();
349
349
  } else if (subcommand === "serve") {
350
350
  const { isSandboxed: isSandboxedServe } = await import('./sandboxDetect-DNTcbgWD.mjs');
@@ -352,7 +352,7 @@ async function main() {
352
352
  console.error("svamp serve: Serve commands are not available in sandboxed sessions.");
353
353
  process.exit(1);
354
354
  }
355
- const { handleServeCommand } = await import('./serveCommands-DetQEHPQ.mjs');
355
+ const { handleServeCommand } = await import('./serveCommands-DkgE7eM3.mjs');
356
356
  await handleServeCommand();
357
357
  process.exit(0);
358
358
  } else if (subcommand === "process" || subcommand === "proc") {
@@ -361,7 +361,7 @@ async function main() {
361
361
  console.error("svamp process: Process commands are not available in sandboxed sessions.");
362
362
  process.exit(1);
363
363
  }
364
- const { processCommand } = await import('./commands-B9sqOiBc.mjs');
364
+ const { processCommand } = await import('./commands-CHbiOivA.mjs');
365
365
  let machineId;
366
366
  const processArgs = args.slice(1);
367
367
  const mIdx = processArgs.findIndex((a) => a === "--machine" || a === "-m");
@@ -375,14 +375,14 @@ async function main() {
375
375
  }), machineId);
376
376
  process.exit(0);
377
377
  } else if (subcommand === "trigger" || subcommand === "triggers" || subcommand === "routine" || subcommand === "routines") {
378
- const { routineCommand } = await import('./commands-DZq4EX41.mjs');
378
+ const { routineCommand } = await import('./commands-c88PiQcd.mjs');
379
379
  await routineCommand(args.slice(1));
380
380
  process.exit(0);
381
381
  } else if (subcommand === "wise-agent" || subcommand === "wise") {
382
382
  await handleWiseAgentCommand(args.slice(1));
383
383
  process.exit(0);
384
384
  } else if (subcommand === "feature" || subcommand === "crew") {
385
- const { crewCommand } = await import('./commands-B6R-tDtR.mjs');
385
+ const { crewCommand } = await import('./commands-B4bi9RGG.mjs');
386
386
  await crewCommand(args.slice(1));
387
387
  process.exit(0);
388
388
  } else if (subcommand === "--help" || subcommand === "-h") {
@@ -390,7 +390,7 @@ async function main() {
390
390
  } else if (!subcommand || subcommand === "start") {
391
391
  await handleInteractiveCommand();
392
392
  } else if (subcommand === "--version" || subcommand === "-v") {
393
- const pkg = await import('./package-ClAJGLEQ.mjs').catch(() => ({ default: { version: "unknown" } }));
393
+ const pkg = await import('./package-D6yiDaV4.mjs').catch(() => ({ default: { version: "unknown" } }));
394
394
  console.log(`svamp version: ${pkg.default.version}`);
395
395
  } else {
396
396
  console.error(`Unknown command: ${subcommand}`);
@@ -399,7 +399,7 @@ async function main() {
399
399
  }
400
400
  }
401
401
  async function handleInteractiveCommand() {
402
- const { runInteractive } = await import('./run-D_sV2sA7.mjs');
402
+ const { runInteractive } = await import('./run-yxK4M2Ni.mjs');
403
403
  const interactiveArgs = subcommand === "start" ? args.slice(1) : args;
404
404
  let directory = process.cwd();
405
405
  let resumeSessionId;
@@ -444,7 +444,7 @@ async function handleAgentCommand() {
444
444
  return;
445
445
  }
446
446
  if (agentArgs[0] === "list") {
447
- const { KNOWN_ACP_AGENTS, KNOWN_MCP_AGENTS: KNOWN_MCP_AGENTS2 } = await import('./run-CCjAePDZ.mjs').then(function (n) { return n.Z; });
447
+ const { KNOWN_ACP_AGENTS, KNOWN_MCP_AGENTS: KNOWN_MCP_AGENTS2 } = await import('./run-PlINWUZp.mjs').then(function (n) { return n.$; });
448
448
  console.log("Known agents:");
449
449
  for (const [name, config2] of Object.entries(KNOWN_ACP_AGENTS)) {
450
450
  console.log(` ${name.padEnd(12)} ${config2.command} ${config2.args.join(" ")} (ACP)`);
@@ -456,7 +456,7 @@ async function handleAgentCommand() {
456
456
  console.log('Use "svamp agent -- <command> [args]" for a custom ACP agent.');
457
457
  return;
458
458
  }
459
- const { resolveAcpAgentConfig, KNOWN_MCP_AGENTS } = await import('./run-CCjAePDZ.mjs').then(function (n) { return n.Z; });
459
+ const { resolveAcpAgentConfig, KNOWN_MCP_AGENTS } = await import('./run-PlINWUZp.mjs').then(function (n) { return n.$; });
460
460
  let cwd = process.cwd();
461
461
  const filteredArgs = [];
462
462
  for (let i = 0; i < agentArgs.length; i++) {
@@ -480,12 +480,12 @@ async function handleAgentCommand() {
480
480
  console.log(`Starting ${config.agentName} agent in ${cwd}...`);
481
481
  let backend;
482
482
  if (KNOWN_MCP_AGENTS[config.agentName]) {
483
- const { CodexMcpBackend } = await import('./run-CCjAePDZ.mjs').then(function (n) { return n._; });
483
+ const { CodexMcpBackend } = await import('./run-PlINWUZp.mjs').then(function (n) { return n.a0; });
484
484
  backend = new CodexMcpBackend({ cwd, log: logFn });
485
485
  } else {
486
- const { AcpBackend } = await import('./run-CCjAePDZ.mjs').then(function (n) { return n.Y; });
487
- const { GeminiTransport } = await import('./run-CCjAePDZ.mjs').then(function (n) { return n.$; });
488
- const { DefaultTransport } = await import('./run-CCjAePDZ.mjs').then(function (n) { return n.X; });
486
+ const { AcpBackend } = await import('./run-PlINWUZp.mjs').then(function (n) { return n._; });
487
+ const { GeminiTransport } = await import('./run-PlINWUZp.mjs').then(function (n) { return n.a1; });
488
+ const { DefaultTransport } = await import('./run-PlINWUZp.mjs').then(function (n) { return n.Z; });
489
489
  const transportHandler = config.agentName === "gemini" ? new GeminiTransport() : new DefaultTransport(config.agentName);
490
490
  backend = new AcpBackend({
491
491
  agentName: config.agentName,
@@ -612,7 +612,7 @@ async function handleSessionCommand() {
612
612
  process.exit(1);
613
613
  }
614
614
  }
615
- const { sessionList, sessionWhoami, sessionSpawn, sessionArchive, sessionResume, sessionDelete, sessionInfo, sessionMessages, sessionAttach, sessionMachines, sessionSend, sessionWait, sessionShare, sessionLoopStart, sessionLoopCancel, sessionLoopStatus, sessionInboxSend, sessionInboxList, sessionInboxRead, sessionInboxReply, sessionInboxClear } = await import('./commands-DgrVRMPf.mjs');
615
+ const { sessionList, sessionWhoami, sessionSpawn, sessionArchive, sessionResume, sessionDelete, sessionInfo, sessionMessages, sessionAttach, sessionMachines, sessionSend, sessionWait, sessionShare, sessionLoopStart, sessionLoopCancel, sessionLoopStatus, sessionInboxSend, sessionInboxList, sessionInboxRead, sessionInboxReply, sessionInboxClear } = await import('./commands-BKrGv74d.mjs');
616
616
  const parseFlagStr = (flag, shortFlag) => {
617
617
  for (let i = 1; i < sessionArgs.length; i++) {
618
618
  if ((sessionArgs[i] === flag || shortFlag) && i + 1 < sessionArgs.length) {
@@ -680,7 +680,7 @@ async function handleSessionCommand() {
680
680
  allowDomain.push(sessionArgs[++i]);
681
681
  }
682
682
  }
683
- const { parseShareArg } = await import('./commands-DgrVRMPf.mjs');
683
+ const { parseShareArg } = await import('./commands-BKrGv74d.mjs');
684
684
  const shareEntries = share.map((s) => parseShareArg(s));
685
685
  await sessionSpawn(agent, dir, targetMachineId, {
686
686
  message,
@@ -765,7 +765,7 @@ async function handleSessionCommand() {
765
765
  console.error(" Rewinds history: rewrites the message + drops everything after it, then restarts Claude.");
766
766
  process.exit(1);
767
767
  }
768
- const { sessionEditMessage } = await import('./commands-DgrVRMPf.mjs');
768
+ const { sessionEditMessage } = await import('./commands-BKrGv74d.mjs');
769
769
  await sessionEditMessage(sessionArgs[1], sessionArgs[2], sessionArgs[3], targetMachineId);
770
770
  } else if (sessionSubcommand === "refine") {
771
771
  if (!sessionArgs[1] || !sessionArgs[2]) {
@@ -773,7 +773,7 @@ async function handleSessionCommand() {
773
773
  console.error(" Asks the agent to revise its latest reply in place (no extra round).");
774
774
  process.exit(1);
775
775
  }
776
- const { sessionRefineLastReply } = await import('./commands-DgrVRMPf.mjs');
776
+ const { sessionRefineLastReply } = await import('./commands-BKrGv74d.mjs');
777
777
  await sessionRefineLastReply(sessionArgs[1], sessionArgs[2], targetMachineId);
778
778
  } else if (sessionSubcommand === "undo-edit" || sessionSubcommand === "undo") {
779
779
  if (!sessionArgs[1]) {
@@ -781,7 +781,7 @@ async function handleSessionCommand() {
781
781
  console.error(" Reverts the most recent edit/refine, restoring the pre-edit history.");
782
782
  process.exit(1);
783
783
  }
784
- const { sessionUndoEdit } = await import('./commands-DgrVRMPf.mjs');
784
+ const { sessionUndoEdit } = await import('./commands-BKrGv74d.mjs');
785
785
  await sessionUndoEdit(sessionArgs[1], targetMachineId);
786
786
  } else if (sessionSubcommand === "query") {
787
787
  const dir = sessionArgs[1];
@@ -791,7 +791,7 @@ async function handleSessionCommand() {
791
791
  console.error(" Spawns a stateless Claude session in <directory>, sends <prompt>, prints the answer, then deletes the session.");
792
792
  process.exit(1);
793
793
  }
794
- const { sessionQuery } = await import('./commands-DgrVRMPf.mjs');
794
+ const { sessionQuery } = await import('./commands-BKrGv74d.mjs');
795
795
  await sessionQuery(dir, prompt, targetMachineId, {
796
796
  timeout: parseFlagInt("--timeout"),
797
797
  json: hasFlag("--json"),
@@ -824,7 +824,7 @@ async function handleSessionCommand() {
824
824
  console.error("Usage: svamp session approve <session-id> [request-id] [--json]");
825
825
  process.exit(1);
826
826
  }
827
- const { sessionApprove } = await import('./commands-DgrVRMPf.mjs');
827
+ const { sessionApprove } = await import('./commands-BKrGv74d.mjs');
828
828
  const approveReqId = sessionArgs[2] && !sessionArgs[2].startsWith("--") ? sessionArgs[2] : void 0;
829
829
  await sessionApprove(sessionArgs[1], approveReqId, targetMachineId, {
830
830
  json: hasFlag("--json")
@@ -834,7 +834,7 @@ async function handleSessionCommand() {
834
834
  console.error("Usage: svamp session deny <session-id> [request-id] [--json]");
835
835
  process.exit(1);
836
836
  }
837
- const { sessionDeny } = await import('./commands-DgrVRMPf.mjs');
837
+ const { sessionDeny } = await import('./commands-BKrGv74d.mjs');
838
838
  const denyReqId = sessionArgs[2] && !sessionArgs[2].startsWith("--") ? sessionArgs[2] : void 0;
839
839
  await sessionDeny(sessionArgs[1], denyReqId, targetMachineId, {
840
840
  json: hasFlag("--json")
@@ -868,7 +868,7 @@ async function handleSessionCommand() {
868
868
  console.error('Usage: svamp session supervise <session-id> "<criteria>" [--oracle "cmd"] [--agent] [--parent <id>] [--action nudge|block] [--max N]');
869
869
  process.exit(1);
870
870
  }
871
- const { sessionSupervise } = await import('./commands-DgrVRMPf.mjs');
871
+ const { sessionSupervise } = await import('./commands-BKrGv74d.mjs');
872
872
  const actionStr = parseFlagStr("--action");
873
873
  await sessionSupervise(sessionArgs[1], sessionArgs[2], targetMachineId, {
874
874
  oracle: parseFlagStr("--oracle"),
@@ -882,7 +882,7 @@ async function handleSessionCommand() {
882
882
  console.error("Usage: svamp session unsupervise <session-id>");
883
883
  process.exit(1);
884
884
  }
885
- const { sessionUnsupervise } = await import('./commands-DgrVRMPf.mjs');
885
+ const { sessionUnsupervise } = await import('./commands-BKrGv74d.mjs');
886
886
  await sessionUnsupervise(sessionArgs[1], targetMachineId);
887
887
  } else if (sessionSubcommand === "set-title") {
888
888
  const title = sessionArgs[1];
@@ -890,7 +890,7 @@ async function handleSessionCommand() {
890
890
  console.error("Usage: svamp session set-title <title>");
891
891
  process.exit(1);
892
892
  }
893
- const { sessionSetTitle } = await import('./agentCommands-yXsSYfmO.mjs');
893
+ const { sessionSetTitle } = await import('./agentCommands-GTgpCbU_.mjs');
894
894
  await sessionSetTitle(title);
895
895
  } else if (sessionSubcommand === "set-project-description" || sessionSubcommand === "set-project") {
896
896
  const desc = sessionArgs.slice(1).filter((a) => !a.startsWith("--")).join(" ");
@@ -898,7 +898,7 @@ async function handleSessionCommand() {
898
898
  console.error("Usage: svamp session set-project-description <text>");
899
899
  process.exit(1);
900
900
  }
901
- const { sessionSetProjectDescription } = await import('./agentCommands-yXsSYfmO.mjs');
901
+ const { sessionSetProjectDescription } = await import('./agentCommands-GTgpCbU_.mjs');
902
902
  await sessionSetProjectDescription(desc);
903
903
  } else if (sessionSubcommand === "set-link") {
904
904
  const url = sessionArgs[1];
@@ -907,7 +907,7 @@ async function handleSessionCommand() {
907
907
  process.exit(1);
908
908
  }
909
909
  const label = sessionArgs[2] && !sessionArgs[2].startsWith("--") ? sessionArgs[2] : void 0;
910
- const { sessionSetLink } = await import('./agentCommands-yXsSYfmO.mjs');
910
+ const { sessionSetLink } = await import('./agentCommands-GTgpCbU_.mjs');
911
911
  await sessionSetLink(url, label);
912
912
  } else if (sessionSubcommand === "notify") {
913
913
  const message = sessionArgs[1];
@@ -916,7 +916,7 @@ async function handleSessionCommand() {
916
916
  process.exit(1);
917
917
  }
918
918
  const level = parseFlagStr("--level") || "info";
919
- const { sessionNotify } = await import('./agentCommands-yXsSYfmO.mjs');
919
+ const { sessionNotify } = await import('./agentCommands-GTgpCbU_.mjs');
920
920
  await sessionNotify(message, level);
921
921
  } else if (sessionSubcommand === "broadcast") {
922
922
  const action = sessionArgs[1];
@@ -924,7 +924,7 @@ async function handleSessionCommand() {
924
924
  console.error("Usage: svamp session broadcast <action> [args...]\nActions: open-canvas <url> [label], close-canvas, toast <message>");
925
925
  process.exit(1);
926
926
  }
927
- const { sessionBroadcast } = await import('./agentCommands-yXsSYfmO.mjs');
927
+ const { sessionBroadcast } = await import('./agentCommands-GTgpCbU_.mjs');
928
928
  await sessionBroadcast(action, sessionArgs.slice(2).filter((a) => !a.startsWith("--")));
929
929
  } else if (sessionSubcommand === "inbox") {
930
930
  const inboxSubcmd = sessionArgs[1];
@@ -935,7 +935,7 @@ async function handleSessionCommand() {
935
935
  process.exit(1);
936
936
  }
937
937
  if (agentSessionId) {
938
- const { inboxSend } = await import('./agentCommands-yXsSYfmO.mjs');
938
+ const { inboxSend } = await import('./agentCommands-GTgpCbU_.mjs');
939
939
  await inboxSend(sessionArgs[2], {
940
940
  body: sessionArgs[3],
941
941
  subject: parseFlagStr("--subject"),
@@ -950,7 +950,7 @@ async function handleSessionCommand() {
950
950
  }
951
951
  } else if (inboxSubcmd === "list" || inboxSubcmd === "ls") {
952
952
  if (agentSessionId && !sessionArgs[2]) {
953
- const { inboxList } = await import('./agentCommands-yXsSYfmO.mjs');
953
+ const { inboxList } = await import('./agentCommands-GTgpCbU_.mjs');
954
954
  await inboxList({
955
955
  unread: hasFlag("--unread"),
956
956
  limit: parseFlagInt("--limit"),
@@ -972,7 +972,7 @@ async function handleSessionCommand() {
972
972
  process.exit(1);
973
973
  }
974
974
  if (agentSessionId && !sessionArgs[3]) {
975
- const { inboxList } = await import('./agentCommands-yXsSYfmO.mjs');
975
+ const { inboxList } = await import('./agentCommands-GTgpCbU_.mjs');
976
976
  await sessionInboxRead(agentSessionId, sessionArgs[2], targetMachineId);
977
977
  } else if (sessionArgs[3]) {
978
978
  await sessionInboxRead(sessionArgs[2], sessionArgs[3], targetMachineId);
@@ -982,7 +982,7 @@ async function handleSessionCommand() {
982
982
  }
983
983
  } else if (inboxSubcmd === "reply") {
984
984
  if (agentSessionId && sessionArgs[2] && sessionArgs[3] && !sessionArgs[4]) {
985
- const { inboxReply } = await import('./agentCommands-yXsSYfmO.mjs');
985
+ const { inboxReply } = await import('./agentCommands-GTgpCbU_.mjs');
986
986
  await inboxReply(sessionArgs[2], sessionArgs[3]);
987
987
  } else if (sessionArgs[2] && sessionArgs[3] && sessionArgs[4]) {
988
988
  await sessionInboxReply(sessionArgs[2], sessionArgs[3], sessionArgs[4], targetMachineId);
@@ -1018,7 +1018,7 @@ async function handleMachineCommand() {
1018
1018
  return;
1019
1019
  }
1020
1020
  if (machineSubcommand === "share") {
1021
- const { machineShare } = await import('./commands-DgrVRMPf.mjs');
1021
+ const { machineShare } = await import('./commands-BKrGv74d.mjs');
1022
1022
  let machineId;
1023
1023
  const shareArgs = [];
1024
1024
  for (let i = 1; i < machineArgs.length; i++) {
@@ -1048,7 +1048,7 @@ async function handleMachineCommand() {
1048
1048
  }
1049
1049
  await machineShare(machineId, { add, remove, list, configPath, showConfig });
1050
1050
  } else if (machineSubcommand === "exec") {
1051
- const { machineExec } = await import('./commands-DgrVRMPf.mjs');
1051
+ const { machineExec } = await import('./commands-BKrGv74d.mjs');
1052
1052
  let machineId;
1053
1053
  let cwd;
1054
1054
  const cmdParts = [];
@@ -1068,7 +1068,7 @@ async function handleMachineCommand() {
1068
1068
  }
1069
1069
  await machineExec(machineId, command, cwd);
1070
1070
  } else if (machineSubcommand === "info") {
1071
- const { machineInfo } = await import('./commands-DgrVRMPf.mjs');
1071
+ const { machineInfo } = await import('./commands-BKrGv74d.mjs');
1072
1072
  let machineId;
1073
1073
  for (let i = 1; i < machineArgs.length; i++) {
1074
1074
  if ((machineArgs[i] === "--machine" || machineArgs[i] === "-m") && i + 1 < machineArgs.length) {
@@ -1088,10 +1088,10 @@ async function handleMachineCommand() {
1088
1088
  level = machineArgs[++i];
1089
1089
  }
1090
1090
  }
1091
- const { machineNotify } = await import('./agentCommands-yXsSYfmO.mjs');
1091
+ const { machineNotify } = await import('./agentCommands-GTgpCbU_.mjs');
1092
1092
  await machineNotify(message, level);
1093
1093
  } else if (machineSubcommand === "ls") {
1094
- const { machineLs } = await import('./commands-DgrVRMPf.mjs');
1094
+ const { machineLs } = await import('./commands-BKrGv74d.mjs');
1095
1095
  let machineId;
1096
1096
  let showHidden = false;
1097
1097
  let path;
@@ -1149,24 +1149,24 @@ Examples:
1149
1149
  };
1150
1150
  const hasFlag = (name) => fleetArgs.includes(`--${name}`);
1151
1151
  if (sub === "status") {
1152
- const { fleetStatus } = await import('./fleet-DxDQfnD5.mjs');
1152
+ const { fleetStatus } = await import('./fleet-Cul9jrbU.mjs');
1153
1153
  await fleetStatus();
1154
1154
  } else if (sub === "exec") {
1155
1155
  const command = fleetArgs.slice(1).filter((a) => !a.startsWith("--")).join(" ");
1156
- const { fleetExec } = await import('./fleet-DxDQfnD5.mjs');
1156
+ const { fleetExec } = await import('./fleet-Cul9jrbU.mjs');
1157
1157
  await fleetExec(command, { cwd: flag("cwd") });
1158
1158
  } else if (sub === "upgrade-claude") {
1159
- const { fleetUpgradeClaude } = await import('./fleet-DxDQfnD5.mjs');
1159
+ const { fleetUpgradeClaude } = await import('./fleet-Cul9jrbU.mjs');
1160
1160
  await fleetUpgradeClaude({ version: flag("version", "-v") });
1161
1161
  } else if (sub === "upgrade-svamp") {
1162
- const { fleetUpgradeSvamp } = await import('./fleet-DxDQfnD5.mjs');
1162
+ const { fleetUpgradeSvamp } = await import('./fleet-Cul9jrbU.mjs');
1163
1163
  await fleetUpgradeSvamp({ version: flag("version", "-v"), excludeSelf: hasFlag("exclude-self") });
1164
1164
  } else if (sub === "daemon-restart") {
1165
- const { fleetDaemonRestart } = await import('./fleet-DxDQfnD5.mjs');
1165
+ const { fleetDaemonRestart } = await import('./fleet-Cul9jrbU.mjs');
1166
1166
  await fleetDaemonRestart({ graceful: !hasFlag("cleanup") });
1167
1167
  } else if (sub === "push-skill") {
1168
1168
  const name = fleetArgs[1];
1169
- const { fleetPushSkill } = await import('./fleet-DxDQfnD5.mjs');
1169
+ const { fleetPushSkill } = await import('./fleet-Cul9jrbU.mjs');
1170
1170
  await fleetPushSkill(name);
1171
1171
  } else {
1172
1172
  console.error(`Unknown fleet subcommand: ${sub}`);
@@ -1182,7 +1182,7 @@ async function handleSkillsCommand() {
1182
1182
  await printSkillsHelp();
1183
1183
  return;
1184
1184
  }
1185
- const { skillsFind, skillsInstall, skillsList, skillsRemove, skillsPublish } = await import('./commands-BDJR0VrZ.mjs');
1185
+ const { skillsFind, skillsInstall, skillsList, skillsRemove, skillsPublish } = await import('./commands-C2xWOFNo.mjs');
1186
1186
  if (skillsSubcommand === "find" || skillsSubcommand === "search") {
1187
1187
  const query = skillsArgs.slice(1).filter((a) => !a.startsWith("--")).join(" ");
1188
1188
  if (!query) {
@@ -1229,7 +1229,7 @@ async function loginToHypha() {
1229
1229
  process.exit(1);
1230
1230
  }
1231
1231
  const anchor = anchorArg.replace(/\/+$/, "");
1232
- const { loadInstanceConfig } = await import('./run-CCjAePDZ.mjs').then(function (n) { return n.a1; });
1232
+ const { loadInstanceConfig } = await import('./run-PlINWUZp.mjs').then(function (n) { return n.a3; });
1233
1233
  let cfg = null;
1234
1234
  try {
1235
1235
  cfg = await loadInstanceConfig({ anchor, force: true });
@@ -1340,7 +1340,7 @@ async function logoutFromHypha() {
1340
1340
  } catch {
1341
1341
  }
1342
1342
  try {
1343
- const { clearInstanceConfigCache } = await import('./run-CCjAePDZ.mjs').then(function (n) { return n.a1; });
1343
+ const { clearInstanceConfigCache } = await import('./run-PlINWUZp.mjs').then(function (n) { return n.a3; });
1344
1344
  clearInstanceConfigCache();
1345
1345
  } catch {
1346
1346
  }
@@ -1678,7 +1678,7 @@ async function applyClaudeAuthFlags(argv) {
1678
1678
  "--use-hypha-proxy, --use-claude-login, and --anthropic-base-url/--anthropic-api-key are mutually exclusive"
1679
1679
  );
1680
1680
  }
1681
- const mod = await import('./run-CCjAePDZ.mjs').then(function (n) { return n.a0; });
1681
+ const mod = await import('./run-PlINWUZp.mjs').then(function (n) { return n.a2; });
1682
1682
  if (hasHypha) {
1683
1683
  let url;
1684
1684
  const hyphaIdx = argv.indexOf("--use-hypha-proxy");
@@ -1732,7 +1732,7 @@ async function applyDaemonShareFlag(argv) {
1732
1732
  }
1733
1733
  }
1734
1734
  if (collected.length === 0) return;
1735
- const { updateEnvFile } = await import('./run-CCjAePDZ.mjs').then(function (n) { return n.a0; });
1735
+ const { updateEnvFile } = await import('./run-PlINWUZp.mjs').then(function (n) { return n.a2; });
1736
1736
  const seen = /* @__PURE__ */ new Set();
1737
1737
  const deduped = collected.filter((e) => {
1738
1738
  const k = e.toLowerCase();
@@ -1765,7 +1765,7 @@ async function handleWiseAgentCommand(rest) {
1765
1765
  }
1766
1766
  });
1767
1767
  const message = rest.slice(1).map((a, idx) => ({ a, idx: idx + 1 })).filter(({ a, idx }) => !a.startsWith("-") && !consumed.has(String(idx))).map(({ a }) => a).join(" ");
1768
- const { wiseAskCli } = await import('./commands-DgrVRMPf.mjs');
1768
+ const { wiseAskCli } = await import('./commands-BKrGv74d.mjs');
1769
1769
  await wiseAskCli(machineId, message, sessionId, { json });
1770
1770
  return;
1771
1771
  }
@@ -1777,7 +1777,7 @@ async function handleWiseAgentCommand(rest) {
1777
1777
  }
1778
1778
  return void 0;
1779
1779
  };
1780
- const { runWiseVoiceCli } = await import('./headlessCli-yq6RWSPK.mjs');
1780
+ const { runWiseVoiceCli } = await import('./headlessCli-CQZIDygq.mjs');
1781
1781
  await runWiseVoiceCli({ voice: valueOf(["--voice"]), wakeKeywordPath: valueOf(["--wake"]), model: valueOf(["--model"]) });
1782
1782
  return;
1783
1783
  }
@@ -1819,7 +1819,7 @@ If none is set, hitting a WISE Agent channel returns a clear "not configured" er
1819
1819
  return;
1820
1820
  }
1821
1821
  const authArgs = rest.slice(1);
1822
- const mod = await import('./auth-DN7R9F_k.mjs');
1822
+ const mod = await import('./auth-DDCwHCWg.mjs');
1823
1823
  let action;
1824
1824
  try {
1825
1825
  action = mod.parseWiseAgentAuthArgs(authArgs);
@@ -1829,7 +1829,7 @@ If none is set, hitting a WISE Agent channel returns a clear "not configured" er
1829
1829
  return;
1830
1830
  }
1831
1831
  if (action) {
1832
- const { updateEnvFile } = await import('./run-CCjAePDZ.mjs').then(function (n) { return n.a0; });
1832
+ const { updateEnvFile } = await import('./run-PlINWUZp.mjs').then(function (n) { return n.a2; });
1833
1833
  const updates = mod.buildWiseAgentEnvUpdates(action);
1834
1834
  updateEnvFile(updates);
1835
1835
  for (const [k, v] of Object.entries(updates)) {
@@ -1843,7 +1843,7 @@ If none is set, hitting a WISE Agent channel returns a clear "not configured" er
1843
1843
  }
1844
1844
  async function handleDaemonAuthCommand(argv) {
1845
1845
  const sub = (argv[0] || "status").toLowerCase();
1846
- const mod = await import('./run-CCjAePDZ.mjs').then(function (n) { return n.a0; });
1846
+ const mod = await import('./run-PlINWUZp.mjs').then(function (n) { return n.a2; });
1847
1847
  if (sub === "--help" || sub === "-h" || sub === "help") {
1848
1848
  console.log(`
1849
1849
  svamp daemon auth \u2014 Configure how Claude subprocesses authenticate
@@ -2150,7 +2150,7 @@ Examples:
2150
2150
  async function printSkillsHelp() {
2151
2151
  let browseUrl = "<HYPHA_SERVER_URL>/<workspace>/artifacts/marketplace (set HYPHA_SERVER_URL)";
2152
2152
  try {
2153
- const { getArtifactBaseUrl, getSkillsCollectionName } = await import('./run-CCjAePDZ.mjs').then(function (n) { return n.a2; });
2153
+ const { getArtifactBaseUrl, getSkillsCollectionName } = await import('./run-PlINWUZp.mjs').then(function (n) { return n.a4; });
2154
2154
  browseUrl = `${getArtifactBaseUrl()}/${getSkillsCollectionName()}`;
2155
2155
  } catch {
2156
2156
  }
@@ -1,7 +1,7 @@
1
1
  import { existsSync } from 'node:fs';
2
- import { connectAndGetMachine, resolveSessionId, createWorktree, connectAndResolveSession } from './commands-DgrVRMPf.mjs';
2
+ import { connectAndGetMachine, resolveSessionId, createWorktree, connectAndResolveSession } from './commands-BKrGv74d.mjs';
3
3
  import { execSync } from 'node:child_process';
4
- import { n as shortId } from './run-CCjAePDZ.mjs';
4
+ import { m as shortId } from './run-PlINWUZp.mjs';
5
5
  import 'node:path';
6
6
  import 'node:os';
7
7
  import 'os';
@@ -2,7 +2,7 @@ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
2
2
  import { execSync } from 'node:child_process';
3
3
  import { basename, resolve, join, isAbsolute } from 'node:path';
4
4
  import os from 'node:os';
5
- import { G as formatHandle, H as normalizeAllowedUser, I as loadSecurityContextConfig, J as resolveSecurityContext, K as buildSecurityContextFromFlags, L as mergeSecurityContexts, c as connectToHypha, M as buildSessionShareUrl, N as computeOutboundHop, n as shortId, O as buildMachineShareUrl, P as parseHandle, Q as handleMatchesMetadata } from './run-CCjAePDZ.mjs';
5
+ import { I as formatHandle, J as normalizeAllowedUser, K as loadSecurityContextConfig, L as resolveSecurityContext, M as buildSecurityContextFromFlags, N as mergeSecurityContexts, c as connectToHypha, O as buildSessionShareUrl, P as computeOutboundHop, m as shortId, Q as buildMachineShareUrl, T as parseHandle, U as handleMatchesMetadata } from './run-PlINWUZp.mjs';
6
6
  import 'os';
7
7
  import 'fs/promises';
8
8
  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 { p as parseFrontmatter, o as getSkillsServer, q as getSkillsWorkspaceName, t as getSkillsCollectionName, u as fetchWithTimeout, v as searchSkills, w as SKILLS_DIR, x as getSkillInfo, y as downloadSkillFile, z as listSkillFiles } from './run-CCjAePDZ.mjs';
4
+ import { p as parseFrontmatter, n as getSkillsServer, o as getSkillsWorkspaceName, q as getSkillsCollectionName, t as fetchWithTimeout, u as searchSkills, v as SKILLS_DIR, w as getSkillInfo, x as downloadSkillFile, y as listSkillFiles } from './run-PlINWUZp.mjs';
5
5
  import 'fs/promises';
6
6
  import 'url';
7
7
  import 'child_process';
@@ -1,11 +1,11 @@
1
1
  import { writeFileSync, readFileSync } from 'fs';
2
2
  import { resolve } from 'path';
3
- import { connectAndGetMachine } from './commands-DgrVRMPf.mjs';
3
+ import { connectAndGetMachine } from './commands-BKrGv74d.mjs';
4
4
  import 'node:fs';
5
5
  import 'node:child_process';
6
6
  import 'node:path';
7
7
  import 'node:os';
8
- import './run-CCjAePDZ.mjs';
8
+ import './run-PlINWUZp.mjs';
9
9
  import 'os';
10
10
  import 'fs/promises';
11
11
  import 'url';
@@ -58,7 +58,7 @@ async function serviceExpose(args) {
58
58
  process.exit(1);
59
59
  }
60
60
  if (foreground) {
61
- const { runFrpcTunnel } = await import('./frpc-DRWpAeZW.mjs');
61
+ const { runFrpcTunnel } = await import('./frpc-1YwDchv1.mjs');
62
62
  await runFrpcTunnel(name, ports, void 0, {
63
63
  group,
64
64
  groupKey,
@@ -68,7 +68,7 @@ async function serviceExpose(args) {
68
68
  });
69
69
  return;
70
70
  }
71
- const { connectAndGetMachine } = await import('./commands-DgrVRMPf.mjs');
71
+ const { connectAndGetMachine } = await import('./commands-BKrGv74d.mjs');
72
72
  const { server, machine } = await connectAndGetMachine();
73
73
  try {
74
74
  const status = await machine.tunnelStart({
@@ -123,7 +123,7 @@ async function serviceServe(args) {
123
123
  };
124
124
  process.on("SIGINT", cleanup);
125
125
  process.on("SIGTERM", cleanup);
126
- const { runFrpcTunnel } = await import('./frpc-DRWpAeZW.mjs');
126
+ const { runFrpcTunnel } = await import('./frpc-1YwDchv1.mjs');
127
127
  await runFrpcTunnel(name, [caddyPort]);
128
128
  } catch (err) {
129
129
  console.error(`Error serving directory: ${err.message}`);
@@ -132,7 +132,7 @@ async function serviceServe(args) {
132
132
  }
133
133
  async function serviceList(_args) {
134
134
  try {
135
- const { connectAndGetMachine } = await import('./commands-DgrVRMPf.mjs');
135
+ const { connectAndGetMachine } = await import('./commands-BKrGv74d.mjs');
136
136
  const { server, machine } = await connectAndGetMachine();
137
137
  try {
138
138
  const tunnels = await machine.tunnelList({});
@@ -161,7 +161,7 @@ async function serviceDelete(args) {
161
161
  process.exit(1);
162
162
  }
163
163
  try {
164
- const { connectAndGetMachine } = await import('./commands-DgrVRMPf.mjs');
164
+ const { connectAndGetMachine } = await import('./commands-BKrGv74d.mjs');
165
165
  const { server, machine } = await connectAndGetMachine();
166
166
  try {
167
167
  await machine.tunnelStop({ name });
@@ -1,6 +1,7 @@
1
- import { execFileSync } from 'node:child_process';
1
+ import { execSync, execFileSync } from 'node:child_process';
2
+ import { randomUUID } from 'node:crypto';
2
3
  import { createServer } from 'node:http';
3
- import { R as RoutineStore, m as RoutineRunner } from './run-CCjAePDZ.mjs';
4
+ import { E as readChecklist, F as compileChecklist, G as RoutineStore, H as RoutineRunner } from './run-PlINWUZp.mjs';
4
5
  import 'os';
5
6
  import 'fs/promises';
6
7
  import 'fs';
@@ -8,7 +9,6 @@ import 'path';
8
9
  import 'url';
9
10
  import 'child_process';
10
11
  import 'crypto';
11
- import 'node:crypto';
12
12
  import 'node:fs';
13
13
  import 'util';
14
14
  import 'node:path';
@@ -22,6 +22,41 @@ import 'zod';
22
22
  import 'node:fs/promises';
23
23
  import 'node:util';
24
24
 
25
+ function runOracle(cmd, cwd, timeoutSec = 600) {
26
+ try {
27
+ execSync(cmd, { cwd, stdio: "pipe", maxBuffer: 16 * 1024 * 1024, timeout: timeoutSec * 1e3 });
28
+ return true;
29
+ } catch {
30
+ return false;
31
+ }
32
+ }
33
+ function itemOracle(item) {
34
+ if (item.eval?.type === "oracle" && item.eval.cmd?.trim()) return item.eval.cmd;
35
+ const legacy = item.oracle;
36
+ return typeof legacy === "string" && legacy.trim() ? legacy : void 0;
37
+ }
38
+ function verifyChecklistOracles(projectRoot, sessionId, timeoutSec = 600) {
39
+ const items = readChecklist(projectRoot, sessionId).filter((i) => i.disposition !== "delegated" && i.status !== "done");
40
+ const criteria = compileChecklist(items).criteria;
41
+ const failing = [];
42
+ let oracleTotal = 0, oraclePass = 0, agentSkipped = 0;
43
+ for (const it of items) {
44
+ const cmd = itemOracle(it);
45
+ if (cmd) {
46
+ oracleTotal++;
47
+ if (runOracle(cmd, projectRoot, timeoutSec)) oraclePass++;
48
+ else failing.push({ id: it.id, text: it.text });
49
+ } else if (it.eval?.type === "agent") {
50
+ agentSkipped++;
51
+ }
52
+ }
53
+ const verdict = failing.length === 0 ? "approved" : "rework";
54
+ const parts = [`Watchdog: ${oraclePass}/${oracleTotal} oracle check${oracleTotal === 1 ? "" : "s"} pass.`];
55
+ if (failing.length) parts.push(`Failing: ${failing.map((f) => f.text).join("; ")}.`);
56
+ if (agentSkipped) parts.push(`${agentSkipped} agent-judged item(s) need a live session (not checked).`);
57
+ return { verdict, criteria, guidance: parts.join(" "), oracleTotal, oraclePass, failing, agentSkipped, itemCount: items.length };
58
+ }
59
+
25
60
  function parseArgs(argv) {
26
61
  const a = { _: [] };
27
62
  for (let i = 0; i < argv.length; i++) {
@@ -41,6 +76,43 @@ function isSessionLive(sid) {
41
76
  }
42
77
  }
43
78
  async function cliDeliver({ routine, resolved }) {
79
+ if (resolved.kind === "verify") {
80
+ const dir = routine.dir;
81
+ if (!dir) {
82
+ console.error(`[trigger] skip ${routine.id || routine.name}: verify action has no dir`);
83
+ return { skipped: "verify: no dir" };
84
+ }
85
+ const target = routine.action.verify?.target_session || routine.session_id;
86
+ const reportTo = routine.action.verify?.report_to || routine.session_id;
87
+ if (!isSessionLive(reportTo)) {
88
+ console.error(`[trigger] skip ${routine.id || routine.name}: report session ${reportTo} not live (inbox is in-memory)`);
89
+ return { skipped: "verify: report session not live" };
90
+ }
91
+ const res = verifyChecklistOracles(dir, target);
92
+ const message = {
93
+ messageId: randomUUID(),
94
+ from: `watchdog:${routine.name || routine.id}`,
95
+ fromSession: target,
96
+ to: reportTo,
97
+ subject: `watchdog: ${res.verdict} \u2014 ${routine.name || routine.id}`,
98
+ body: `<supervision-verdict source="watchdog" session="${target}" verdict="${res.verdict}" judge="oracle" round="0">
99
+ ${res.guidance}
100
+ Criteria: ${res.criteria || "(none)"}
101
+ </supervision-verdict>`,
102
+ timestamp: Date.now(),
103
+ read: false,
104
+ urgency: "normal",
105
+ hopCount: 1
106
+ };
107
+ const { connectAndGetMachine } = await import('./commands-BKrGv74d.mjs');
108
+ const { server, machine } = await connectAndGetMachine();
109
+ try {
110
+ await machine.sessionRPC(reportTo, "sendInboxMessage", { message });
111
+ } finally {
112
+ await server.disconnect();
113
+ }
114
+ return;
115
+ }
44
116
  if (routine.bind === "stateless") {
45
117
  const dir = routine.dir;
46
118
  if (!dir) {
@@ -71,7 +143,8 @@ function buildRoutineFromArgs(a) {
71
143
  if (a.schedule) r.trigger = { type: "schedule", cron: a.schedule, missed: a.missed || "skip", tz: a.tz };
72
144
  else if (a.webhook || a.api) r.trigger = { type: a.api ? "api" : "webhook", methods: a.get ? ["GET"] : ["GET", "POST"], public: !!a.public };
73
145
  else r.trigger = { type: "manual" };
74
- if (a.loop) r.action = { kind: "loop", task_template: a.task || "", loop: { dir: a.dir, oracle: a.oracle, evaluator: a.evaluator || "off" } };
146
+ if (a.verify) r.action = { kind: "verify", verify: { target_session: a["target-session"], report_to: a["report-to"] } };
147
+ else if (a.loop) r.action = { kind: "loop", task_template: a.task || "", loop: { dir: a.dir, oracle: a.oracle, evaluator: a.evaluator || "off" } };
75
148
  else r.action = { kind: "message", template: a.message || a.task || "run" };
76
149
  if (a.dir) r.dir = a.dir;
77
150
  if (a.stateless) r.bind = "stateless";
@@ -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-CCjAePDZ.mjs';
4
+ import { c as connectToHypha } from './run-PlINWUZp.mjs';
5
5
  import { PINNED_CLAUDE_CODE_VERSION } from './pinnedClaudeCode-HydRNEt7.mjs';
6
6
  import 'os';
7
7
  import 'fs/promises';
@@ -3,7 +3,7 @@ import { mkdirSync, writeFileSync, unlinkSync, existsSync, chmodSync, readFileSy
3
3
  import { join } from 'path';
4
4
  import { homedir, platform, arch } from 'os';
5
5
  import { createHash, randomUUID } from 'crypto';
6
- import { h as getFrpsSubdomainHost, i as getFrpsServerPort, j as getFrpsServerAddr } from './run-CCjAePDZ.mjs';
6
+ import { h as getFrpsSubdomainHost, i as getFrpsServerPort, j as getFrpsServerAddr } from './run-PlINWUZp.mjs';
7
7
  import 'fs/promises';
8
8
  import 'url';
9
9
  import 'node:crypto';
@@ -1,5 +1,5 @@
1
- import { F as resolveModel, T as describeMisconfiguration, U as buildMachineDeps } from './run-CCjAePDZ.mjs';
2
- import { handleRealtimeEvent, initMachineVoiceSession } from './sideband-DDiW5TJU.mjs';
1
+ import { D as resolveModel, V as describeMisconfiguration, W as buildMachineDeps } from './run-PlINWUZp.mjs';
2
+ import { handleRealtimeEvent, initMachineVoiceSession } from './sideband-DF2mZOOx.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-CCjAePDZ.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-PlINWUZp.mjs';
2
2
  import 'os';
3
3
  import 'fs/promises';
4
4
  import 'fs';
@@ -19,7 +19,7 @@ var exports$1 = {
19
19
  var scripts = {
20
20
  build: "rm -rf dist bin/skills && mkdir -p bin/skills && cp -r ../../skills/artifact bin/skills/artifact && cp -r ../../skills/loop bin/skills/loop && cp -r ../../skills/crew bin/skills/crew && tsc --noEmit && pkgroll",
21
21
  typecheck: "tsc --noEmit",
22
- test: "npx tsx test/test-context-window.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-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-loop-activation.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-output-formatters.mjs && npx tsx test/test-inbox-guard.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-machine-service-logic.mjs && npx tsx test/test-interactive-helpers.mjs && npx tsx test/test-codex-backend.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-session-consolidation.mjs && npx tsx test/test-inbox.mjs && npx tsx test/test-checklist.mjs && npx tsx test/test-short-id.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-stability.mjs && npx tsx test/test-frpc-e2e.mjs --unit-only && node test/pinnedClaudeCode.test.mjs && node test/fleet.test.mjs && npx tsx test/test-routine.mjs && npx tsx test/test-routine-rpc.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-channel-async-reply.mjs && npx tsx test/test-channel-binding.mjs && npx tsx test/test-channel-identity.mjs && npx tsx test/test-wise-agent-auth.mjs && npx tsx test/test-channel-http.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",
22
+ test: "npx tsx test/test-context-window.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-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-loop-activation.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-output-formatters.mjs && npx tsx test/test-inbox-guard.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-machine-service-logic.mjs && npx tsx test/test-interactive-helpers.mjs && npx tsx test/test-codex-backend.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-session-consolidation.mjs && npx tsx test/test-inbox.mjs && npx tsx test/test-checklist.mjs && npx tsx test/test-short-id.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-stability.mjs && npx tsx test/test-frpc-e2e.mjs --unit-only && node test/pinnedClaudeCode.test.mjs && node test/fleet.test.mjs && npx tsx test/test-routine.mjs && npx tsx test/test-routine-rpc.mjs && npx tsx test/test-checklist-watchdog.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-channel-async-reply.mjs && npx tsx test/test-channel-binding.mjs && npx tsx test/test-channel-identity.mjs && npx tsx test/test-wise-agent-auth.mjs && npx tsx test/test-channel-http.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",
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",
@@ -1199,7 +1199,7 @@ function renderTemplate(template, ctx) {
1199
1199
  });
1200
1200
  }
1201
1201
  const TRIGGER_TYPES = ["manual", "schedule", "webhook", "api"];
1202
- const ACTION_KINDS = ["message", "loop"];
1202
+ const ACTION_KINDS = ["message", "loop", "verify"];
1203
1203
  const OVERLAP = ["queue", "skip", "replace"];
1204
1204
  function validateRoutine(r) {
1205
1205
  const errs = [];
@@ -1220,6 +1220,7 @@ function validateRoutine(r) {
1220
1220
  if (!a || !ACTION_KINDS.includes(a.kind)) errs.push(`action.kind must be one of ${ACTION_KINDS.join("|")}`);
1221
1221
  if (a?.kind === "message" && !a.template) errs.push("action.template required for message action");
1222
1222
  if (a?.kind === "loop" && !a.loop && !a.task_template) errs.push("action.loop or action.task_template required for loop action");
1223
+ if (a?.kind === "verify" && !r.dir) errs.push("a verify (checklist watchdog) action requires a dir (the project root holding .svamp/<sid>/loop/checklist.json)");
1223
1224
  if (r.overlap && !OVERLAP.includes(r.overlap)) errs.push(`overlap must be one of ${OVERLAP.join("|")}`);
1224
1225
  if (r.bind && r.bind !== "stateful" && r.bind !== "stateless") errs.push('bind must be "stateful" or "stateless"');
1225
1226
  if (r.bind === "stateless") {
@@ -2676,7 +2677,7 @@ async function registerMachineService(server, machineId, metadata, daemonState,
2676
2677
  const tunnels = handlers.tunnels;
2677
2678
  if (!tunnels) throw new Error("Tunnel management not available");
2678
2679
  if (tunnels.has(params.name)) throw new Error(`Tunnel '${params.name}' already running`);
2679
- const { FrpcTunnel } = await import('./frpc-DRWpAeZW.mjs');
2680
+ const { FrpcTunnel } = await import('./frpc-1YwDchv1.mjs');
2680
2681
  const tunnel = new FrpcTunnel({
2681
2682
  name: params.name,
2682
2683
  ports: params.ports,
@@ -2937,7 +2938,7 @@ QUESTION: ${params.question || "Summarize this concisely."}` }
2937
2938
  }
2938
2939
  const deps = buildSessionDeps(rpc, { cwd, ownerEmail: owner });
2939
2940
  const sender = { name: context?.user?.email || context?.user?.id || "user", kind: "user", verified: true };
2940
- const { toolsForRole } = await import('./sideband-DDiW5TJU.mjs');
2941
+ const { toolsForRole } = await import('./sideband-DF2mZOOx.mjs');
2941
2942
  const r2 = await runWiseAgent({ message: params.message, sender, config: { tools: toolsForRole(role2) }, deps, transport, model: resolved.model });
2942
2943
  return fmt(r2);
2943
2944
  }
@@ -3036,7 +3037,7 @@ QUESTION: ${params.question || "Summarize this concisely."}` }
3036
3037
  if (r.error || !r.sender) return { error: r.error || "unauthorized" };
3037
3038
  const callId = "call_" + Math.random().toString(16).slice(2, 12);
3038
3039
  const rendered = renderMessage(c, { sender: r.sender, body: { message: kwargs.message }, callId });
3039
- const { queryCore } = await import('./commands-DgrVRMPf.mjs');
3040
+ const { queryCore } = await import('./commands-BKrGv74d.mjs');
3040
3041
  const timeout = c.reply?.timeout_sec || 120;
3041
3042
  let result;
3042
3043
  try {
@@ -3261,6 +3262,7 @@ class RoutineRunner {
3261
3262
  const ctx = { ...payload, now: this.now().toISOString(), routine: { id: routine.id, name: routine.name } };
3262
3263
  const a = routine.action;
3263
3264
  if (a.kind === "message") return { kind: "message", text: renderTemplate(a.template || "", ctx) };
3265
+ if (a.kind === "verify") return { kind: "verify" };
3264
3266
  const task = renderTemplate(a.task_template || a.loop?.task || "", ctx);
3265
3267
  return { kind: "loop", task, loop: a.loop };
3266
3268
  }
@@ -9763,10 +9765,17 @@ function summarize(items) {
9763
9765
  function checklistPath(projectRoot, sessionId) {
9764
9766
  return join(projectRoot, ".svamp", sessionId, "loop", "checklist.json");
9765
9767
  }
9768
+ function legacyChecklistPath(projectRoot, sessionId) {
9769
+ return join(projectRoot, ".svamp", sessionId, "checklist.json");
9770
+ }
9766
9771
 
9767
9772
  function readChecklist(projectRoot, sessionId) {
9768
- const p = checklistPath(projectRoot, sessionId);
9769
- if (!existsSync(p)) return [];
9773
+ let p = checklistPath(projectRoot, sessionId);
9774
+ if (!existsSync(p)) {
9775
+ const legacy = legacyChecklistPath(projectRoot, sessionId);
9776
+ if (!existsSync(legacy)) return [];
9777
+ p = legacy;
9778
+ }
9770
9779
  try {
9771
9780
  const parsed = JSON.parse(readFileSync(p, "utf8"));
9772
9781
  return Array.isArray(parsed?.items) ? parsed.items : [];
@@ -11346,7 +11355,7 @@ async function startDaemon(options) {
11346
11355
  const list = loadExposedTunnels().filter((t) => t.name !== name);
11347
11356
  saveExposedTunnels(list);
11348
11357
  }
11349
- const { ServeManager } = await import('./serveManager-BSwiPu1O.mjs');
11358
+ const { ServeManager } = await import('./serveManager-DymHllAS.mjs');
11350
11359
  const serveManager = new ServeManager(SVAMP_HOME, (msg) => logger.log(`[SERVE] ${msg}`), hyphaServerUrl);
11351
11360
  ensureAutoInstalledSkills(logger).catch(() => {
11352
11361
  });
@@ -14022,7 +14031,7 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
14022
14031
  const specs = loadExposedTunnels();
14023
14032
  if (specs.length === 0) return;
14024
14033
  logger.log(`[exposed-tunnels] Restoring ${specs.length} tunnel(s) from ${EXPOSED_TUNNELS_FILE}`);
14025
- const { FrpcTunnel } = await import('./frpc-DRWpAeZW.mjs');
14034
+ const { FrpcTunnel } = await import('./frpc-1YwDchv1.mjs');
14026
14035
  for (const spec of specs) {
14027
14036
  if (tunnels.has(spec.name)) continue;
14028
14037
  try {
@@ -14798,4 +14807,4 @@ var run = /*#__PURE__*/Object.freeze({
14798
14807
  writeStopMarker: writeStopMarker
14799
14808
  });
14800
14809
 
14801
- export { GeminiTransport$1 as $, READ_ONLY_TOOLS as A, loadMachineContext as B, buildMachineInstructions as C, machineToolsForRole as D, buildMachineTools as E, resolveModel as F, formatHandle as G, normalizeAllowedUser as H, loadSecurityContextConfig as I, resolveSecurityContext as J, buildSecurityContextFromFlags as K, mergeSecurityContexts as L, buildSessionShareUrl as M, computeOutboundHop as N, buildMachineShareUrl as O, parseHandle as P, handleMatchesMetadata as Q, RoutineStore as R, ServeAuth as S, describeMisconfiguration as T, buildMachineDeps as U, generateHookSettings as V, projectInfo as W, DefaultTransport$1 as X, acpBackend as Y, acpAgentConfig as Z, codexMcpBackend as _, createSessionStore as a, claudeAuth as a0, instanceConfig as a1, api as a2, run as a3, stopDaemon as b, connectToHypha as c, daemonStatus as d, clearStopMarker as e, stopMarkerExists as f, getHyphaServerUrl$1 as g, getFrpsSubdomainHost as h, getFrpsServerPort as i, getFrpsServerAddr as j, getHyphaServerUrl as k, hasCookieToken as l, RoutineRunner as m, shortId as n, getSkillsServer as o, parseFrontmatter as p, getSkillsWorkspaceName as q, registerMachineService as r, startDaemon as s, getSkillsCollectionName as t, fetchWithTimeout as u, searchSkills as v, SKILLS_DIR as w, getSkillInfo as x, downloadSkillFile as y, listSkillFiles as z };
14810
+ export { acpAgentConfig as $, buildMachineInstructions as A, machineToolsForRole as B, buildMachineTools as C, resolveModel as D, readChecklist as E, compileChecklist as F, RoutineStore as G, RoutineRunner as H, formatHandle as I, normalizeAllowedUser as J, loadSecurityContextConfig as K, resolveSecurityContext as L, buildSecurityContextFromFlags as M, mergeSecurityContexts as N, buildSessionShareUrl as O, computeOutboundHop as P, buildMachineShareUrl as Q, READ_ONLY_TOOLS as R, ServeAuth as S, parseHandle as T, handleMatchesMetadata as U, describeMisconfiguration as V, buildMachineDeps as W, generateHookSettings as X, projectInfo as Y, DefaultTransport$1 as Z, acpBackend as _, createSessionStore as a, codexMcpBackend as a0, GeminiTransport$1 as a1, claudeAuth as a2, instanceConfig as a3, api as a4, run as a5, stopDaemon as b, connectToHypha as c, daemonStatus as d, clearStopMarker as e, stopMarkerExists as f, getHyphaServerUrl$1 as g, getFrpsSubdomainHost as h, getFrpsServerPort as i, getFrpsServerAddr as j, getHyphaServerUrl as k, hasCookieToken as l, shortId as m, getSkillsServer as n, getSkillsWorkspaceName as o, parseFrontmatter as p, getSkillsCollectionName as q, registerMachineService as r, startDaemon as s, fetchWithTimeout as t, searchSkills as u, SKILLS_DIR as v, getSkillInfo as w, downloadSkillFile as x, listSkillFiles as y, loadMachineContext as z };
@@ -1,4 +1,4 @@
1
- import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(import.meta.url);import { n as shortId, c as connectToHypha, a as createSessionStore, r as registerMachineService, V as generateHookSettings } from './run-CCjAePDZ.mjs';
1
+ import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(import.meta.url);import { m as shortId, c as connectToHypha, a as createSessionStore, r as registerMachineService, X as generateHookSettings } from './run-PlINWUZp.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';
@@ -54,7 +54,7 @@ async function handleServeCommand() {
54
54
  }
55
55
  }
56
56
  async function serveAdd(args, machineId) {
57
- const { connectAndGetMachine } = await import('./commands-DgrVRMPf.mjs');
57
+ const { connectAndGetMachine } = await import('./commands-BKrGv74d.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-DgrVRMPf.mjs');
96
+ const { connectAndGetMachine } = await import('./commands-BKrGv74d.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-DgrVRMPf.mjs');
185
+ const { connectAndGetMachine } = await import('./commands-BKrGv74d.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-DgrVRMPf.mjs');
205
+ const { connectAndGetMachine } = await import('./commands-BKrGv74d.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-DgrVRMPf.mjs');
238
+ const { connectAndGetMachine } = await import('./commands-BKrGv74d.mjs');
239
239
  const { machine, server } = await connectAndGetMachine(machineId);
240
240
  try {
241
241
  const info = await machine.serveInfo();
@@ -4,7 +4,7 @@ import * as fs from 'fs';
4
4
  import * as http from 'http';
5
5
  import * as net from 'net';
6
6
  import * as path from 'path';
7
- import { k as getHyphaServerUrl, S as ServeAuth, l as hasCookieToken } from './run-CCjAePDZ.mjs';
7
+ import { k as getHyphaServerUrl, S as ServeAuth, l as hasCookieToken } from './run-PlINWUZp.mjs';
8
8
  import 'os';
9
9
  import 'fs/promises';
10
10
  import 'url';
@@ -713,7 +713,7 @@ class ServeManager {
713
713
  const mount = this.mounts.get(mountName);
714
714
  const subdomainOverride = mount?.access === "link" && mount.linkToken ? /* @__PURE__ */ new Map([[this.port, `static-${subdomainSafe}-${mount.linkToken}`]]) : void 0;
715
715
  try {
716
- const { FrpcTunnel } = await import('./frpc-DRWpAeZW.mjs');
716
+ const { FrpcTunnel } = await import('./frpc-1YwDchv1.mjs');
717
717
  let tunnel;
718
718
  tunnel = new FrpcTunnel({
719
719
  name: tunnelName,
@@ -1,4 +1,4 @@
1
- import { A as READ_ONLY_TOOLS, B as loadMachineContext, C as buildMachineInstructions, D as machineToolsForRole, E as buildMachineTools } from './run-CCjAePDZ.mjs';
1
+ import { R as READ_ONLY_TOOLS, z as loadMachineContext, A as buildMachineInstructions, B as machineToolsForRole, C as buildMachineTools } from './run-PlINWUZp.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.121",
3
+ "version": "0.2.122",
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 && mkdir -p bin/skills && cp -r ../../skills/artifact bin/skills/artifact && cp -r ../../skills/loop bin/skills/loop && cp -r ../../skills/crew bin/skills/crew && tsc --noEmit && pkgroll",
22
22
  "typecheck": "tsc --noEmit",
23
- "test": "npx tsx test/test-context-window.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-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-loop-activation.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-output-formatters.mjs && npx tsx test/test-inbox-guard.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-machine-service-logic.mjs && npx tsx test/test-interactive-helpers.mjs && npx tsx test/test-codex-backend.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-session-consolidation.mjs && npx tsx test/test-inbox.mjs && npx tsx test/test-checklist.mjs && npx tsx test/test-short-id.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-stability.mjs && npx tsx test/test-frpc-e2e.mjs --unit-only && node test/pinnedClaudeCode.test.mjs && node test/fleet.test.mjs && npx tsx test/test-routine.mjs && npx tsx test/test-routine-rpc.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-channel-async-reply.mjs && npx tsx test/test-channel-binding.mjs && npx tsx test/test-channel-identity.mjs && npx tsx test/test-wise-agent-auth.mjs && npx tsx test/test-channel-http.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",
23
+ "test": "npx tsx test/test-context-window.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-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-loop-activation.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-output-formatters.mjs && npx tsx test/test-inbox-guard.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-machine-service-logic.mjs && npx tsx test/test-interactive-helpers.mjs && npx tsx test/test-codex-backend.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-session-consolidation.mjs && npx tsx test/test-inbox.mjs && npx tsx test/test-checklist.mjs && npx tsx test/test-short-id.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-stability.mjs && npx tsx test/test-frpc-e2e.mjs --unit-only && node test/pinnedClaudeCode.test.mjs && node test/fleet.test.mjs && npx tsx test/test-routine.mjs && npx tsx test/test-routine-rpc.mjs && npx tsx test/test-checklist-watchdog.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-channel-async-reply.mjs && npx tsx test/test-channel-binding.mjs && npx tsx test/test-channel-identity.mjs && npx tsx test/test-wise-agent-auth.mjs && npx tsx test/test-channel-http.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",
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",