svamp-cli 0.2.144 → 0.2.146

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.
@@ -482,6 +482,39 @@ function buildTools(deps, skills) {
482
482
  return `Started a loop: "${str$1(a?.task).slice(0, 80)}".`;
483
483
  }
484
484
  },
485
+ {
486
+ name: "set_checklist",
487
+ readOnly: false,
488
+ description: "Create or replace the bound session's checklist (the loop's success criteria) and start the self-verifying loop. Each item is a concrete, checkable requirement. ONLY after the caller confirmed the proposal.",
489
+ parameters: { type: "object", properties: {
490
+ items: { type: "array", description: "The checklist items (success criteria).", items: { type: "object", properties: {
491
+ text: { type: "string", description: "A concrete, checkable requirement." },
492
+ oracle: { type: "string", description: "Optional pass/fail command verifying this item." }
493
+ }, required: ["text"], additionalProperties: false } },
494
+ prompt: { type: "string", description: "Optional overall goal/instruction for the loop." },
495
+ max_iterations: { type: "number", description: "Iteration ceiling (default 20)." }
496
+ }, required: ["items"], additionalProperties: false },
497
+ run: async (a) => {
498
+ const rawItems = Array.isArray(a?.items) ? a.items : [];
499
+ const items = rawItems.map((i) => ({ text: str$1(i?.text), oracle: i?.oracle ? str$1(i.oracle) : void 0 })).filter((i) => i.text.trim());
500
+ if (!items.length) return "No checklist items were provided.";
501
+ const r = await deps.applyChecklist(items, {
502
+ prompt: a?.prompt ? str$1(a.prompt) : void 0,
503
+ maxIterations: typeof a?.max_iterations === "number" ? a.max_iterations : void 0
504
+ });
505
+ return r.ok ? `Set a ${items.length}-item checklist and started the loop.` : `Could not set the checklist: ${r.error || "unknown error"}.`;
506
+ }
507
+ },
508
+ {
509
+ name: "stop_loop",
510
+ readOnly: false,
511
+ description: "Stop/cancel the running loop in the bound session. ONLY after the caller asked to stop.",
512
+ parameters: { type: "object", properties: {}, additionalProperties: false },
513
+ run: async () => {
514
+ await deps.stopLoop();
515
+ return "Stopped the loop.";
516
+ }
517
+ },
485
518
  {
486
519
  name: "create_channel",
487
520
  readOnly: false,
@@ -631,11 +664,12 @@ You are WISE Agent, a fast, text-mode companion to the deep coding agent (Claude
631
664
  - run_bash \u2014 run a shell command on the session's machine (when granted).
632
665
  - send_to_session \u2014 hand a clear, reformulated instruction to the deep coding agent (when granted); pass wait=true to block for its reply.
633
666
  - create_routine / create_loop / create_channel \u2014 set up a scheduled/triggered routine, a self-verifying loop, or an inbound channel for this session (when granted). ALWAYS propose first and confirm before calling these (see below).
667
+ - set_checklist / stop_loop \u2014 turn the caller's goals into a tracked checklist (the loop's success criteria) and start the self-verifying loop, or stop a running loop (when granted). Each item is one concrete, checkable requirement (optional per-item oracle command). ALWAYS propose the items first and confirm before calling.
634
668
 
635
669
  # Instructions
636
670
  - Answer general questions and questions about yourself directly. Use tools only to act on the machine/session.
637
671
  - Take the cheap path: read state directly; delegate anything LONG to summarize_session \u2014 keep your own context small.
638
- - To create a routine, loop, or channel: first restate the resolved config in one line and ask the caller to reply "confirm" to proceed. Only call create_routine / create_loop / create_channel after they confirm in a follow-up message. Never create without confirmation.
672
+ - To create a routine, loop, channel, or checklist: first restate the resolved config (for set_checklist, list the items) in one line and ask the caller to reply "confirm" to proceed. Only call create_routine / create_loop / create_channel / set_checklist / stop_loop after they confirm in a follow-up message. Never create or stop without confirmation.
639
673
  - For destructive actions (deleting, stopping, killing), require a verified caller and confirm intent; for safe reads, just do it.
640
674
  - If a tool fails or returns nothing useful, say so plainly \u2014 never fabricate a result.
641
675
  - Report the outcome in one line.`;
@@ -1023,6 +1057,28 @@ function buildSessionDeps(rpc, opts = {}) {
1023
1057
  }
1024
1058
  }, ctx);
1025
1059
  },
1060
+ async applyChecklist(items, opts2) {
1061
+ const built = (items || []).filter((i) => i?.text && i.text.trim()).map((i, idx) => ({
1062
+ id: `wise-${Date.now().toString(36)}-${idx}`,
1063
+ text: i.text.trim(),
1064
+ status: "todo",
1065
+ disposition: "inline",
1066
+ scope: "session",
1067
+ ...i.oracle && i.oracle.trim() ? { verify: { type: "command", text: i.oracle.trim() }, oracle: i.oracle.trim() } : {}
1068
+ }));
1069
+ await rpc.updateConfig({
1070
+ checklist: built,
1071
+ checklistConfig: {
1072
+ ...opts2?.prompt ? { prompt: opts2.prompt } : {},
1073
+ maxIterations: opts2?.maxIterations ?? 20,
1074
+ evaluator: true
1075
+ }
1076
+ }, ctx);
1077
+ return { ok: true };
1078
+ },
1079
+ async stopLoop() {
1080
+ await rpc.updateConfig({ loop: null }, ctx);
1081
+ },
1026
1082
  async saveChannel(channel) {
1027
1083
  return await rpc.saveChannel(channel, ctx);
1028
1084
  }
@@ -2715,7 +2771,7 @@ async function registerMachineService(server, machineId, metadata, daemonState,
2715
2771
  const tunnels = handlers.tunnels;
2716
2772
  if (!tunnels) throw new Error("Tunnel management not available");
2717
2773
  if (tunnels.has(params.name)) throw new Error(`Tunnel '${params.name}' already running`);
2718
- const { FrpcTunnel } = await import('./frpc-DQZjSc7h.mjs');
2774
+ const { FrpcTunnel } = await import('./frpc-Ckp8c1o5.mjs');
2719
2775
  const tunnel = new FrpcTunnel({
2720
2776
  name: params.name,
2721
2777
  ports: params.ports,
@@ -2921,19 +2977,34 @@ async function registerMachineService(server, machineId, metadata, daemonState,
2921
2977
  const base = (process.env.SVAMP_VEXA_API_URL || "").replace(/\/$/, "");
2922
2978
  const key = process.env.SVAMP_VEXA_API_KEY || "";
2923
2979
  if (!base || !key) return { success: false, error: "Meeting agent not configured: set SVAMP_VEXA_API_URL + SVAMP_VEXA_API_KEY in ~/.svamp/.env, then `svamp daemon restart`." };
2980
+ const WISE_URL = process.env.SVAMP_WISE_CHANNEL_URL || "";
2981
+ const WISE_KEY = process.env.SVAMP_WISE_CHANNEL_KEY || "";
2982
+ const sid = params.sessionId;
2983
+ const target = sid ? `session:${sid}` : "global";
2984
+ const rt = sid ? {
2985
+ target,
2986
+ instructions: `You are WISE, an AI participant in a live meeting, joined on behalf of the user's work session "${sid}". Speak naturally and concisely \u2014 1 to 3 sentences, since replies are heard aloud. For anything about that session's project, files, status, decisions, or tasks, call consult_wise (it reaches that session's WISE agent, which has its skills and can act via the deep agent). Only speak when addressed or asked a question; otherwise stay quiet.`
2987
+ } : {
2988
+ target,
2989
+ instructions: `You are WISE, a helpful AI assistant participating in this live meeting. Speak naturally and concisely \u2014 1 to 3 sentences, since replies are heard aloud. Help the participants and answer questions. Only speak when addressed or asked; otherwise stay quiet.`
2990
+ };
2991
+ if (WISE_URL) {
2992
+ rt.wiseUrl = WISE_URL;
2993
+ rt.wiseKey = WISE_KEY;
2994
+ }
2924
2995
  try {
2925
2996
  const res = await fetch(`${base}/bots`, {
2926
2997
  method: "POST",
2927
2998
  headers: { "X-API-Key": key, "Content-Type": "application/json" },
2928
- body: JSON.stringify({ platform: parsed.platform, native_meeting_id: parsed.nativeId, bot_name: "WISE Agent" })
2999
+ body: JSON.stringify({ platform: parsed.platform, native_meeting_id: parsed.nativeId, bot_name: "WISE Agent", rt })
2929
3000
  });
2930
3001
  const data = await res.json().catch(() => ({}));
2931
3002
  if (!res.ok) return { success: false, error: `meeting-api ${res.status}: ${data?.detail || data?.message || "launch failed"}` };
2932
- const rec = { meetingUrl: params.meetingUrl, platform: parsed.platform, nativeId: parsed.nativeId, target: params.sessionId ? `session:${params.sessionId}` : "global", sessionId: params.sessionId, botId: data?.bot_container_id, meetingId: data?.id, startedAt: Date.now() };
3003
+ const rec = { meetingUrl: params.meetingUrl, platform: parsed.platform, nativeId: parsed.nativeId, target, sessionId: params.sessionId, botId: data?.bot_container_id, meetingId: data?.id, startedAt: Date.now() };
2933
3004
  activeMeetingAgents.set(params.sessionId || `global:${parsed.nativeId}`, rec);
2934
3005
  return { success: true, ...rec, status: data?.status };
2935
3006
  } catch (e) {
2936
- return { success: false, error: e instanceof Error ? e.message : "join failed" };
3007
+ return { success: false, error: `meeting-api unreachable: ${e instanceof Error ? e.message : String(e)}` };
2937
3008
  }
2938
3009
  },
2939
3010
  wiseLeaveMeeting: async (params, context) => {
@@ -3065,7 +3136,7 @@ QUESTION: ${params.question || "Summarize this concisely."}` }
3065
3136
  }
3066
3137
  const deps = buildSessionDeps(rpc, { cwd, ownerEmail: owner });
3067
3138
  const sender = { name: context?.user?.email || context?.user?.id || "user", kind: "user", verified: true };
3068
- const { toolsForRole } = await import('./sideband-C9zoh2QP.mjs');
3139
+ const { toolsForRole } = await import('./sideband-COwBePyZ.mjs');
3069
3140
  const r2 = await runWiseAgent({ message: params.message, sender, config: { tools: toolsForRole(role2) }, deps, transport, model: resolved.model });
3070
3141
  return fmt(r2);
3071
3142
  }
@@ -3164,7 +3235,7 @@ QUESTION: ${params.question || "Summarize this concisely."}` }
3164
3235
  if (r.error || !r.sender) return { error: r.error || "unauthorized" };
3165
3236
  const callId = "call_" + Math.random().toString(16).slice(2, 12);
3166
3237
  const rendered = renderMessage(c, { sender: r.sender, body: { message: kwargs.message }, callId });
3167
- const { queryCore } = await import('./commands-Fpw-qO_m.mjs');
3238
+ const { queryCore } = await import('./commands-C-g9lywx.mjs');
3168
3239
  const timeout = c.reply?.timeout_sec || 120;
3169
3240
  let result;
3170
3241
  try {
@@ -11625,7 +11696,7 @@ async function startDaemon(options) {
11625
11696
  saveExposedTunnels(list);
11626
11697
  }
11627
11698
  async function createExposedTunnel(spec) {
11628
- const { FrpcTunnel } = await import('./frpc-DQZjSc7h.mjs');
11699
+ const { FrpcTunnel } = await import('./frpc-Ckp8c1o5.mjs');
11629
11700
  const tunnel = new FrpcTunnel({
11630
11701
  name: spec.name,
11631
11702
  ports: spec.ports,
@@ -11645,7 +11716,7 @@ async function startDaemon(options) {
11645
11716
  return tunnel;
11646
11717
  }
11647
11718
  const tunnelRecreateState = /* @__PURE__ */ new Map();
11648
- const { ServeManager } = await import('./serveManager-DHTgwal8.mjs');
11719
+ const { ServeManager } = await import('./serveManager-BUBFrei1.mjs');
11649
11720
  const serveManager = new ServeManager(SVAMP_HOME, (msg) => logger.log(`[SERVE] ${msg}`), hyphaServerUrl);
11650
11721
  ensureAutoInstalledSkills(logger).catch(() => {
11651
11722
  });
@@ -54,7 +54,7 @@ async function handleServeCommand() {
54
54
  }
55
55
  }
56
56
  async function serveAdd(args, machineId) {
57
- const { connectAndGetMachine } = await import('./commands-Fpw-qO_m.mjs');
57
+ const { connectAndGetMachine } = await import('./commands-C-g9lywx.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-Fpw-qO_m.mjs');
96
+ const { connectAndGetMachine } = await import('./commands-C-g9lywx.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-Fpw-qO_m.mjs');
185
+ const { connectAndGetMachine } = await import('./commands-C-g9lywx.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-Fpw-qO_m.mjs');
205
+ const { connectAndGetMachine } = await import('./commands-C-g9lywx.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-Fpw-qO_m.mjs');
238
+ const { connectAndGetMachine } = await import('./commands-C-g9lywx.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-4FVCBRiz.mjs';
7
+ import { k as getHyphaServerUrl, S as ServeAuth, l as hasCookieToken } from './run-EWIn-Drp.mjs';
8
8
  import 'os';
9
9
  import 'fs/promises';
10
10
  import 'url';
@@ -733,7 +733,7 @@ class ServeManager {
733
733
  const mount = this.mounts.get(mountName);
734
734
  const subdomainOverride = mount?.access === "link" && mount.linkToken ? /* @__PURE__ */ new Map([[this.port, buildLinkSubdomain(subdomainSafe, mount.linkToken)]]) : void 0;
735
735
  try {
736
- const { FrpcTunnel } = await import('./frpc-DQZjSc7h.mjs');
736
+ const { FrpcTunnel } = await import('./frpc-Ckp8c1o5.mjs');
737
737
  let tunnel;
738
738
  tunnel = new FrpcTunnel({
739
739
  name: tunnelName,
@@ -1,4 +1,4 @@
1
- import { R as READ_ONLY_TOOLS, z as loadMachineContext, A as buildMachineInstructions, B as machineToolsForRole, C as buildMachineTools } from './run-4FVCBRiz.mjs';
1
+ import { R as READ_ONLY_TOOLS, z as loadMachineContext, A as buildMachineInstructions, B as machineToolsForRole, C as buildMachineTools } from './run-EWIn-Drp.mjs';
2
2
  import 'node:child_process';
3
3
  import 'os';
4
4
  import 'fs/promises';
package/package.json CHANGED
@@ -1,47 +1,47 @@
1
1
  {
2
- "name": "svamp-cli",
3
- "version": "0.2.144",
4
- "description": "Svamp CLI — AI workspace daemon on Hypha Cloud",
5
- "author": "Amun AI AB",
6
- "license": "SEE LICENSE IN LICENSE",
7
- "type": "module",
8
- "bin": {
9
- "svamp": "./bin/svamp.mjs"
10
- },
11
- "files": [
12
- "dist",
13
- "bin"
14
- ],
15
- "main": "./dist/index.mjs",
16
- "exports": {
17
- ".": "./dist/index.mjs",
18
- "./cli": "./dist/cli.mjs"
19
- },
20
- "scripts": {
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
- "typecheck": "tsc --noEmit",
23
- "test": "npx tsx test/test-context-window.mjs && npx tsx test/test-ratelimit-retry.mjs && npx tsx test/test-instance-config.mjs && npx tsx test/test-authorize.mjs && npx tsx test/test-normalize-allowed-user.mjs && npx tsx test/test-share-url.mjs && npx tsx test/test-update-sharing-normalization.mjs && npx tsx test/test-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-inbox-cross-machine.mjs && npx tsx test/test-checklist.mjs && npx tsx test/test-checklist-cli.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-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-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-shared-session-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
- "test:hypha": "node --no-warnings test/test-hypha-service.mjs",
25
- "dev": "tsx src/cli.ts",
26
- "dev:daemon": "tsx src/cli.ts daemon start-sync",
27
- "test:e2e": "node --no-warnings test/e2e-session-tests.mjs",
28
- "test:frpc": "npx tsx test/test-frpc-e2e.mjs"
29
- },
30
- "dependencies": {
31
- "@agentclientprotocol/sdk": "^0.14.1",
32
- "@modelcontextprotocol/sdk": "^1.25.3",
33
- "hypha-rpc": "0.21.42",
34
- "node-pty": "1.2.0-beta.11",
35
- "ws": "^8.18.0",
36
- "yaml": "^2.8.2",
37
- "zod": "^3.24.4"
38
- },
39
- "devDependencies": {
40
- "@types/node": ">=20",
41
- "@types/ws": "^8.5.14",
42
- "pkgroll": "^2.14.2",
43
- "tsx": "^4.20.6",
44
- "typescript": "5.9.3"
45
- },
46
- "packageManager": "yarn@1.22.22"
2
+ "name": "svamp-cli",
3
+ "version": "0.2.146",
4
+ "description": "Svamp CLI — AI workspace daemon on Hypha Cloud",
5
+ "author": "Amun AI AB",
6
+ "license": "SEE LICENSE IN LICENSE",
7
+ "type": "module",
8
+ "bin": {
9
+ "svamp": "./bin/svamp.mjs"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "bin"
14
+ ],
15
+ "main": "./dist/index.mjs",
16
+ "exports": {
17
+ ".": "./dist/index.mjs",
18
+ "./cli": "./dist/cli.mjs"
19
+ },
20
+ "scripts": {
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
+ "typecheck": "tsc --noEmit",
23
+ "test": "npx tsx test/test-context-window.mjs && npx tsx test/test-ratelimit-retry.mjs && npx tsx test/test-instance-config.mjs && npx tsx test/test-authorize.mjs && npx tsx test/test-normalize-allowed-user.mjs && npx tsx test/test-share-url.mjs && npx tsx test/test-update-sharing-normalization.mjs && npx tsx test/test-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-inbox-cross-machine.mjs && npx tsx test/test-checklist.mjs && npx tsx test/test-checklist-cli.mjs && npx tsx test/test-issue-store.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-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-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-shared-session-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
+ "test:hypha": "node --no-warnings test/test-hypha-service.mjs",
25
+ "dev": "tsx src/cli.ts",
26
+ "dev:daemon": "tsx src/cli.ts daemon start-sync",
27
+ "test:e2e": "node --no-warnings test/e2e-session-tests.mjs",
28
+ "test:frpc": "npx tsx test/test-frpc-e2e.mjs"
29
+ },
30
+ "dependencies": {
31
+ "@agentclientprotocol/sdk": "^0.14.1",
32
+ "@modelcontextprotocol/sdk": "^1.25.3",
33
+ "hypha-rpc": "0.21.42",
34
+ "node-pty": "1.2.0-beta.11",
35
+ "ws": "^8.18.0",
36
+ "yaml": "^2.8.2",
37
+ "zod": "^3.24.4"
38
+ },
39
+ "devDependencies": {
40
+ "@types/node": ">=20",
41
+ "@types/ws": "^8.5.14",
42
+ "pkgroll": "^2.14.2",
43
+ "tsx": "^4.20.6",
44
+ "typescript": "5.9.3"
45
+ },
46
+ "packageManager": "yarn@1.22.22"
47
47
  }