very-happy-cli 0.2.151 → 0.2.152
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.
- package/dist/{AcpBackend-BjTA5gUB.mjs → AcpBackend-Bs3wwYbt.mjs} +2 -2
- package/dist/{AcpBackend-blE9IEod.cjs → AcpBackend-CogiKCng.cjs} +2 -2
- package/dist/{AcpSessionManager-D-9mrp40.mjs → AcpSessionManager-BT8PJMEm.mjs} +1 -1
- package/dist/{AcpSessionManager-bF8PYu_B.cjs → AcpSessionManager-BazkBuFo.cjs} +9 -9
- package/dist/agentGuidance-CqBn77AI.cjs +553 -0
- package/dist/agentGuidance-Daxn5Nvj.mjs +529 -0
- package/dist/{agentHome-CeFDNzvq.mjs → agentHome-CCYfs8Ec.mjs} +3 -3
- package/dist/{agentHome-D6MSfwnp.cjs → agentHome-CpJjrQZc.cjs} +3 -3
- package/dist/auto-DV5emt1-.mjs +466 -0
- package/dist/auto-DncmTDvw.cjs +472 -0
- package/dist/codex/happyMcpStdioBridge.cjs +4 -2
- package/dist/codex/happyMcpStdioBridge.mjs +4 -2
- package/dist/{config-C-A1XF62.mjs → config-DbKpQpdL.mjs} +5 -5
- package/dist/{config-Cadw1sAk.cjs → config-DeJgSMh-.cjs} +5 -5
- package/dist/{index-CIyjJy8D.mjs → index-BauTv2jB.mjs} +712 -39
- package/dist/{index-DYQgcgL2.mjs → index-CN7OF2cU.mjs} +5 -5
- package/dist/{index-vyRqLjDv.cjs → index-CRaJ9k2p.cjs} +5 -5
- package/dist/{index-DEp6CmmS.mjs → index-DahaLbu4.mjs} +19 -19
- package/dist/{index-CqtfRzug.cjs → index-ZIW1jrYm.cjs} +750 -71
- package/dist/{index-BKGspSWk.cjs → index-imt4mC41.cjs} +19 -19
- package/dist/index.cjs +4 -4
- package/dist/index.mjs +4 -4
- package/dist/install-C1K3nrxF.mjs +114 -0
- package/dist/install-CDR3qBhs.cjs +118 -0
- package/dist/{installTerminalHooks-Bf_adbl3.cjs → installTerminalHooks-BoDxpaBO.cjs} +5 -5
- package/dist/{installTerminalHooks-Ch_yTtEA.mjs → installTerminalHooks-VvmlO6Ue.mjs} +5 -5
- package/dist/lib.cjs +3 -3
- package/dist/lib.mjs +3 -3
- package/dist/limits-BNTWyUaZ.cjs +2175 -0
- package/dist/limits-CKR_HJnO.mjs +2080 -0
- package/dist/{mcp-CMxEZ6-0.cjs → mcp-CCKCKL6l.cjs} +5 -5
- package/dist/{mcp-zu8n8TkR.mjs → mcp-D4dAo5BQ.mjs} +5 -5
- package/dist/{piRuntime-D3ny0mVg.cjs → piRuntime-Bn5ypbjH.cjs} +2 -2
- package/dist/{piRuntime-Cu6cXZ6N.mjs → piRuntime-CW-XA4rz.mjs} +2 -2
- package/dist/{piTerminal-kDSd_r9X.cjs → piTerminal-B7K75aXB.cjs} +6 -6
- package/dist/{piTerminal-M677UP7y.mjs → piTerminal-BLSXK1u2.mjs} +6 -6
- package/dist/{runGemini-DuwdVV1O.cjs → runGemini-Bgg1BzDK.cjs} +7 -7
- package/dist/{runGemini-DvJwQVGp.mjs → runGemini-D5N11LxO.mjs} +7 -7
- package/dist/{runOpenClaw-BsvtCE_H.cjs → runOpenClaw-B9qWHybc.cjs} +6 -6
- package/dist/{runOpenClaw-BG82bF18.mjs → runOpenClaw-CCpyKbrn.mjs} +6 -6
- package/dist/{send-o6WM-1G8.mjs → send-C44kcXz5.mjs} +5 -5
- package/dist/{send-aUkjhey7.cjs → send-wl9ei8yG.cjs} +5 -5
- package/dist/{sessions-DlU3foY_.mjs → sessions-DXJEcUg6.mjs} +5 -5
- package/dist/{sessions-B3vP18kz.cjs → sessions-Tad8elmy.cjs} +5 -5
- package/dist/{spawn-DxHIIqhi.mjs → spawn-BOlb5y1_.mjs} +6 -31
- package/dist/{spawn-DH6_p4-f.cjs → spawn-DA8WAFmm.cjs} +7 -32
- package/dist/{teams-DoAA_CcN.mjs → teams-Bs8lI887.mjs} +15 -72
- package/dist/{teams-BW8D1n3o.cjs → teams-qVLrFcdd.cjs} +13 -70
- package/dist/{todo-Bcc2XxGh.cjs → todo-mCMoGjJk.cjs} +4 -23
- package/dist/{todo-BhJbG5eq.mjs → todo-nzsqGZqp.mjs} +2 -21
- package/dist/{types-CPubg05Z.cjs → types-CN28qJl7.cjs} +31 -856
- package/dist/{types-BN3eiipi.mjs → types-xKrxbCRv.mjs} +204 -1017
- package/package.json +7 -7
- package/dist/agentGuidance-BXa9ikrZ.cjs +0 -267
- package/dist/agentGuidance-Dvo3cZMW.mjs +0 -251
- package/dist/limits-DS-bnYYp.mjs +0 -1165
- package/dist/limits-DwcY3kyi.cjs +0 -1236
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chalk = require('chalk');
|
|
4
|
+
var os = require('node:os');
|
|
5
|
+
var node_fs = require('node:fs');
|
|
6
|
+
var path = require('node:path');
|
|
7
|
+
var persistence = require('./limits-BNTWyUaZ.cjs');
|
|
8
|
+
var agentGuidance = require('./agentGuidance-CqBn77AI.cjs');
|
|
9
|
+
var index = require('./index-ZIW1jrYm.cjs');
|
|
10
|
+
var install = require('./install-CDR3qBhs.cjs');
|
|
11
|
+
var spawn = require('./spawn-DA8WAFmm.cjs');
|
|
12
|
+
var index$1 = require('./types-CN28qJl7.cjs');
|
|
13
|
+
require('node:fs/promises');
|
|
14
|
+
require('zod');
|
|
15
|
+
require('node:crypto');
|
|
16
|
+
require('tweetnacl');
|
|
17
|
+
require('node:util');
|
|
18
|
+
require('@paralleldrive/cuid2');
|
|
19
|
+
require('cross-spawn');
|
|
20
|
+
require('node:readline');
|
|
21
|
+
require('./projectPath-ChLhdOyt.cjs');
|
|
22
|
+
require('path');
|
|
23
|
+
require('url');
|
|
24
|
+
require('fs/promises');
|
|
25
|
+
require('ink');
|
|
26
|
+
require('react');
|
|
27
|
+
require('@anthropic-ai/claude-agent-sdk');
|
|
28
|
+
require('axios');
|
|
29
|
+
require('node:events');
|
|
30
|
+
require('socket.io-client');
|
|
31
|
+
require('os');
|
|
32
|
+
require('child_process');
|
|
33
|
+
require('node:child_process');
|
|
34
|
+
require('fs');
|
|
35
|
+
require('@anthropic-ai/sandbox-runtime');
|
|
36
|
+
require('expo-server-sdk');
|
|
37
|
+
require('crypto');
|
|
38
|
+
require('ps-list');
|
|
39
|
+
require('tmp');
|
|
40
|
+
require('open');
|
|
41
|
+
require('fastify');
|
|
42
|
+
require('fastify-type-provider-zod');
|
|
43
|
+
require('node:module');
|
|
44
|
+
require('@modelcontextprotocol/sdk/server/mcp.js');
|
|
45
|
+
require('node:http');
|
|
46
|
+
require('@modelcontextprotocol/sdk/server/streamableHttp.js');
|
|
47
|
+
require('http');
|
|
48
|
+
require('util');
|
|
49
|
+
require('inquirer');
|
|
50
|
+
require('node:url');
|
|
51
|
+
require('node:readline/promises');
|
|
52
|
+
require('node-pty');
|
|
53
|
+
|
|
54
|
+
const AUTO_ACTIONS = ["list", "show", "create", "edit", "pause", "resume", "rm", "run", "fire", "runs", "cancel", "ack", "report", "skill", "install", "uninstall", "help"];
|
|
55
|
+
const VALUE_FLAGS = ["--name", "--rename", "--description", "--machine", "--cron", "--tz", "--every", "--at", "--spawn-dir", "--prompt", "--prompt-file", "--agent", "--model", "--permission-mode", "--sticky-key", "--send-session", "--cwd", "--env", "--timeout", "--concurrency", "--max-runtime", "--payload", "--payload-json", "--payload-file", "--dedupe-key", "--status", "--limit", "--run", "--summary", "--error", "--attention", "--host", "--home"];
|
|
56
|
+
const BOOL_FLAGS = ["--manual", "--script", "--worktree", "--paused", "--wait", "--json", "--apply", "--all-machines", "--attention", "--help", "-h"];
|
|
57
|
+
function parseAutoArgs(args) {
|
|
58
|
+
const command = { action: "help", flags: {}, env: [], bools: /* @__PURE__ */ new Set(), argv: [] };
|
|
59
|
+
if (args.length === 0) return command;
|
|
60
|
+
const separator = args.indexOf("--");
|
|
61
|
+
const head = separator === -1 ? args : args.slice(0, separator);
|
|
62
|
+
command.argv = separator === -1 ? [] : args.slice(separator + 1);
|
|
63
|
+
const action = head[0];
|
|
64
|
+
if (action === "--help" || action === "-h") return command;
|
|
65
|
+
if (!AUTO_ACTIONS.includes(action)) throw new Error(`Unknown auto command: ${action} (see auto --help)`);
|
|
66
|
+
command.action = action;
|
|
67
|
+
for (let i = 1; i < head.length; i++) {
|
|
68
|
+
const arg = head[i];
|
|
69
|
+
if (BOOL_FLAGS.includes(arg) && !(arg === "--attention" && command.action === "report")) {
|
|
70
|
+
command.bools.add(arg);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (arg.startsWith("--")) {
|
|
74
|
+
const eq = arg.indexOf("=");
|
|
75
|
+
const flag = eq === -1 ? arg : arg.slice(0, eq);
|
|
76
|
+
if (!VALUE_FLAGS.includes(flag)) throw new Error(`Unknown option: ${arg}`);
|
|
77
|
+
const value = eq === -1 ? head[++i] : arg.slice(eq + 1);
|
|
78
|
+
if (value === void 0) throw new Error(`${flag} requires a value`);
|
|
79
|
+
if (flag === "--env") {
|
|
80
|
+
command.env.push(value);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (command.flags[flag] !== void 0) throw new Error(`Duplicate option: ${flag}`);
|
|
84
|
+
command.flags[flag] = value;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (command.target !== void 0) throw new Error(`Unexpected argument: ${arg}`);
|
|
88
|
+
command.target = arg;
|
|
89
|
+
}
|
|
90
|
+
if (command.bools.has("--help") || command.bools.has("-h")) command.action = "help";
|
|
91
|
+
if (command.argv.length > 0 && !command.bools.has("--script")) throw new Error("Arguments after -- need --script");
|
|
92
|
+
return command;
|
|
93
|
+
}
|
|
94
|
+
function readPrompt(flags) {
|
|
95
|
+
if (flags["--prompt"] !== void 0 && flags["--prompt-file"] !== void 0) throw new Error("--prompt and --prompt-file are mutually exclusive");
|
|
96
|
+
if (flags["--prompt-file"] !== void 0) return node_fs.readFileSync(path.resolve(flags["--prompt-file"]), "utf8");
|
|
97
|
+
return flags["--prompt"];
|
|
98
|
+
}
|
|
99
|
+
function readPayload(flags) {
|
|
100
|
+
const given = ["--payload", "--payload-json", "--payload-file"].filter((flag) => flags[flag] !== void 0);
|
|
101
|
+
if (given.length > 1) throw new Error("Use only one of --payload, --payload-json, --payload-file");
|
|
102
|
+
if (flags["--payload-json"] !== void 0) {
|
|
103
|
+
try {
|
|
104
|
+
JSON.parse(flags["--payload-json"]);
|
|
105
|
+
} catch {
|
|
106
|
+
throw new Error("--payload-json is not valid JSON");
|
|
107
|
+
}
|
|
108
|
+
return flags["--payload-json"];
|
|
109
|
+
}
|
|
110
|
+
if (flags["--payload-file"] !== void 0) return node_fs.readFileSync(path.resolve(flags["--payload-file"]), "utf8");
|
|
111
|
+
return flags["--payload"];
|
|
112
|
+
}
|
|
113
|
+
function actionFromCommand(command, current) {
|
|
114
|
+
const { flags, bools } = command;
|
|
115
|
+
const kinds = [flags["--spawn-dir"] !== void 0, flags["--send-session"] !== void 0, bools.has("--script")].filter(Boolean).length;
|
|
116
|
+
if (kinds > 1) throw new Error("Use only one of --spawn-dir, --send-session, --script");
|
|
117
|
+
const prompt = readPrompt(flags);
|
|
118
|
+
const spawnOnly = ["--agent", "--model", "--permission-mode", "--sticky-key"].filter((flag) => flags[flag] !== void 0).concat(bools.has("--worktree") ? ["--worktree"] : []);
|
|
119
|
+
const scriptOnly = ["--cwd", "--timeout"].filter((flag) => flags[flag] !== void 0).concat(command.env.length ? ["--env"] : []);
|
|
120
|
+
if (kinds === 0) {
|
|
121
|
+
if (!current) {
|
|
122
|
+
if (prompt !== void 0 || spawnOnly.length || scriptOnly.length) throw new Error("Give an action: --spawn-dir <dir>, --send-session <id>, or --script -- <argv\u2026>");
|
|
123
|
+
return void 0;
|
|
124
|
+
}
|
|
125
|
+
if (prompt === void 0 && spawnOnly.length === 0 && scriptOnly.length === 0) return void 0;
|
|
126
|
+
if (current.kind === "script") {
|
|
127
|
+
if (prompt !== void 0 || spawnOnly.length) throw new Error(`${current.kind} actions do not take ${[...prompt !== void 0 ? ["--prompt"] : [], ...spawnOnly].join(", ")}`);
|
|
128
|
+
return { ...current, ...flags["--cwd"] !== void 0 ? { cwd: flags["--cwd"] } : {}, ...flags["--timeout"] !== void 0 ? { timeoutMs: index.parseDuration(flags["--timeout"]) } : {}, ...command.env.length ? { env: Object.fromEntries(command.env.map(spawn.parseEnvAssignment)) } : {} };
|
|
129
|
+
}
|
|
130
|
+
if (scriptOnly.length) throw new Error(`${current.kind} actions do not take ${scriptOnly.join(", ")}`);
|
|
131
|
+
if (current.kind === "send") {
|
|
132
|
+
if (spawnOnly.length) throw new Error(`send actions do not take ${spawnOnly.join(", ")}`);
|
|
133
|
+
return { ...current, ...prompt !== void 0 ? { prompt } : {} };
|
|
134
|
+
}
|
|
135
|
+
return { ...current, ...prompt !== void 0 ? { prompt } : {}, ...spawnDetails(command) };
|
|
136
|
+
}
|
|
137
|
+
if (bools.has("--script")) {
|
|
138
|
+
if (command.argv.length === 0) throw new Error("--script needs the command after --, e.g. --script -- /usr/bin/env python3 job.py");
|
|
139
|
+
if (prompt !== void 0 || spawnOnly.length) throw new Error(`script actions do not take ${[...prompt !== void 0 ? ["--prompt"] : [], ...spawnOnly].join(", ")}`);
|
|
140
|
+
return { kind: "script", command: command.argv, ...flags["--cwd"] !== void 0 ? { cwd: flags["--cwd"] } : {}, ...flags["--timeout"] !== void 0 ? { timeoutMs: index.parseDuration(flags["--timeout"]) } : {}, ...command.env.length ? { env: Object.fromEntries(command.env.map(spawn.parseEnvAssignment)) } : {} };
|
|
141
|
+
}
|
|
142
|
+
if (scriptOnly.length) throw new Error(`${flags["--send-session"] !== void 0 ? "send" : "spawn"} actions do not take ${scriptOnly.join(", ")}`);
|
|
143
|
+
if (prompt === void 0) throw new Error("--prompt or --prompt-file is required");
|
|
144
|
+
if (prompt.trim().length === 0) throw new Error("Prompt is empty");
|
|
145
|
+
if (flags["--send-session"] !== void 0) {
|
|
146
|
+
if (spawnOnly.length) throw new Error(`send actions do not take ${spawnOnly.join(", ")}`);
|
|
147
|
+
return { kind: "send", sessionId: flags["--send-session"], prompt };
|
|
148
|
+
}
|
|
149
|
+
return { kind: "spawn", agent: flags["--agent"] ?? "claude", directory: path.resolve(flags["--spawn-dir"]), prompt, ...spawnDetails(command) };
|
|
150
|
+
}
|
|
151
|
+
function spawnDetails(command) {
|
|
152
|
+
const { flags, bools } = command;
|
|
153
|
+
if (flags["--agent"] !== void 0 && !index.SPAWN_AGENTS.includes(flags["--agent"])) throw new Error(`--agent must be one of: ${index.SPAWN_AGENTS.join(", ")}`);
|
|
154
|
+
if (flags["--permission-mode"] !== void 0 && index.sanitizeSpawnPermissionMode(flags["--permission-mode"]) === null) throw new Error(`--permission-mode must be one of: ${index.ALLOWED_SPAWN_PERMISSION_MODES.join(", ")}`);
|
|
155
|
+
return {
|
|
156
|
+
...flags["--agent"] !== void 0 ? { agent: flags["--agent"] } : {},
|
|
157
|
+
...flags["--model"] !== void 0 ? { model: flags["--model"] } : {},
|
|
158
|
+
...flags["--permission-mode"] !== void 0 ? { permissionMode: flags["--permission-mode"] } : {},
|
|
159
|
+
...bools.has("--worktree") ? { worktree: true } : {},
|
|
160
|
+
...flags["--sticky-key"] !== void 0 ? { sticky: { key: flags["--sticky-key"] } } : {}
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
const AUTO_HELP = `${chalk.bold("very-happy auto")} - account-level automations: cron / interval / one-shot / manual triggers that spawn a session, continue a sticky session, or run a script on a machine
|
|
164
|
+
|
|
165
|
+
${chalk.bold("Usage:")}
|
|
166
|
+
very-happy auto list [--all-machines] [--json]
|
|
167
|
+
very-happy auto show <name> [--json]
|
|
168
|
+
very-happy auto create --name <name> <trigger> <action> [options]
|
|
169
|
+
very-happy auto edit <name> [<trigger>] [<action changes>] [--rename <new>] [options]
|
|
170
|
+
very-happy auto pause|resume|rm <name>
|
|
171
|
+
very-happy auto run <name> [--payload\u2026 ] [--wait [--timeout <dur>]]
|
|
172
|
+
very-happy auto fire <name> [--payload\u2026] [--dedupe-key <key>] [--wait [--timeout <dur>]]
|
|
173
|
+
very-happy auto runs [--name <name>] [--status <s>] [--attention] [--limit <n>] [--json]
|
|
174
|
+
very-happy auto runs <runId> [--json]
|
|
175
|
+
very-happy auto cancel <runId> | ack <runId>
|
|
176
|
+
very-happy auto report [--run <id>] --status done|failed [--summary <text>] [--error <text>] [--attention <reason>]
|
|
177
|
+
very-happy auto skill | install|uninstall --host claude|codex|pi [--home <path>] [--apply]
|
|
178
|
+
|
|
179
|
+
${chalk.bold("Trigger (one):")}
|
|
180
|
+
--cron '<5 fields>' --tz <IANA zone> e.g. --cron '0 9 * * 1-5' --tz Asia/Singapore
|
|
181
|
+
--every <dur> e.g. 5m, 1h30m (minimum 1m)
|
|
182
|
+
--at <ISO timestamp> one time
|
|
183
|
+
--manual only \`run\` / \`fire\`
|
|
184
|
+
|
|
185
|
+
${chalk.bold("Action (one):")}
|
|
186
|
+
--spawn-dir <dir> --prompt <text>|--prompt-file <file>
|
|
187
|
+
[--agent claude|codex|pi|gemini|openclaw] [--model <id>] [--permission-mode <m>]
|
|
188
|
+
[--worktree] [--sticky-key <template>]
|
|
189
|
+
--send-session <id> --prompt <text>|--prompt-file <file>
|
|
190
|
+
--script -- <argv\u2026> [--cwd <dir>] [--env K=V]... [--timeout <dur>]
|
|
191
|
+
|
|
192
|
+
${chalk.bold("Options:")}
|
|
193
|
+
--machine <id>|this Executing machine (default: this machine)
|
|
194
|
+
--description <text>
|
|
195
|
+
--concurrency skip|queue skip (default) records a run as skipped while one is active
|
|
196
|
+
--max-runtime <dur> Bound per run (default 6h; scripts 30m)
|
|
197
|
+
--paused Create paused
|
|
198
|
+
--payload <text> | --payload-json <json> | --payload-file <file>
|
|
199
|
+
--wait run/fire: wait for the run to finish (--timeout, default 10m)
|
|
200
|
+
Inside a continued (sticky) session pass --run <id> from the latest prompt header;
|
|
201
|
+
$VH_AUTOMATION_RUN_ID is the run that started the session.
|
|
202
|
+
--json Machine-readable output
|
|
203
|
+
|
|
204
|
+
${chalk.bold("Templates")} in prompts, argv and sticky keys: {{payload}}, {{payload.a.b}}, {{run.id}}, {{automation.name}}, {{now}}.
|
|
205
|
+
Inside an automation-started session \`report\` defaults --run to $VH_AUTOMATION_RUN_ID.
|
|
206
|
+
|
|
207
|
+
${chalk.bold("Exit codes:")} 0 ok \xB7 1 error \xB7 2 --wait timed out \xB7 3 run ended (or was created) failed/expired/cancelled/skipped`;
|
|
208
|
+
function fmtTime(value) {
|
|
209
|
+
return typeof value === "number" ? new Date(value).toISOString().replace("T", " ").slice(0, 19) : "-";
|
|
210
|
+
}
|
|
211
|
+
function printAutomation(a) {
|
|
212
|
+
console.log(`${chalk.bold(a.name)} ${a.status === "paused" ? chalk.yellow("paused") : chalk.green("active")} v${a.version} ${chalk.dim(a.id)}`);
|
|
213
|
+
if (a.description) console.log(` ${a.description}`);
|
|
214
|
+
console.log(` trigger: ${index.describeTrigger(a.trigger)} next: ${fmtTime(a.nextRunAt)}`);
|
|
215
|
+
console.log(` action: ${index.describeAction(a.action)}`);
|
|
216
|
+
console.log(` machine: ${a.machineId} concurrency: ${a.concurrency} max runtime: ${Math.round(a.maxRuntimeMs / 6e4)}m`);
|
|
217
|
+
console.log(` last run: ${fmtTime(a.lastRunAt)} ${a.lastRunStatus ?? ""}`);
|
|
218
|
+
}
|
|
219
|
+
function runLine(run) {
|
|
220
|
+
const status = run.status === "done" ? chalk.green(run.status) : ["failed", "expired"].includes(run.status) ? chalk.red(run.status) : run.status === "running" ? chalk.cyan(run.status) : run.status;
|
|
221
|
+
return `${fmtTime(run.createdAt)} ${status.padEnd(9)} ${run.automationName.padEnd(20)} ${run.source.padEnd(8)} ${run.id}${run.needsAttention ? chalk.yellow(` ! ${run.attentionReason ?? "attention"}`) : ""}`;
|
|
222
|
+
}
|
|
223
|
+
function printRun(run) {
|
|
224
|
+
console.log(runLine(run));
|
|
225
|
+
if (run.sessionId) console.log(` session: ${index.sessionWebUrl(run.sessionId)}`);
|
|
226
|
+
if (run.stickyKey) console.log(` sticky: ${run.stickyKey}`);
|
|
227
|
+
if (run.error) console.log(` error: ${run.error}`);
|
|
228
|
+
if (run.summary) console.log(` summary: ${run.summary.split("\n").join("\n ")}`);
|
|
229
|
+
if (run.exitCode !== null && run.exitCode !== void 0) console.log(` exit: ${run.exitCode}`);
|
|
230
|
+
}
|
|
231
|
+
async function waitForRun(client, runId, timeoutMs) {
|
|
232
|
+
const deadline = Date.now() + timeoutMs;
|
|
233
|
+
while (true) {
|
|
234
|
+
const run = await client.getRun(runId);
|
|
235
|
+
if (persistence.isAutomationRunTerminal(run.status)) return run;
|
|
236
|
+
if (Date.now() + 3e3 > deadline) return null;
|
|
237
|
+
await index$1.delay(3e3);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
async function handleAutoCommand(args) {
|
|
241
|
+
let command;
|
|
242
|
+
try {
|
|
243
|
+
command = parseAutoArgs(args);
|
|
244
|
+
} catch (error) {
|
|
245
|
+
console.error(chalk.red("Error:"), error instanceof Error ? error.message : String(error));
|
|
246
|
+
console.error(`Run ${chalk.cyan("very-happy auto --help")} for usage.`);
|
|
247
|
+
process.exitCode = 1;
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
const json = command.bools.has("--json");
|
|
251
|
+
if (command.action === "help") {
|
|
252
|
+
console.log(AUTO_HELP);
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
if (command.action === "skill") {
|
|
256
|
+
console.log(install.AUTOMATION_SKILL);
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
if (command.action === "install" || command.action === "uninstall") {
|
|
260
|
+
const host = command.flags["--host"];
|
|
261
|
+
if (!host || !["claude", "codex", "pi"].includes(host)) throw new Error("--host must be claude, codex, or pi");
|
|
262
|
+
console.log(JSON.stringify(await install.installAutomationSkill({ host, home: command.flags["--home"] ?? os.homedir(), apply: command.bools.has("--apply"), uninstall: command.action === "uninstall" })));
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
const needsName = ["show", "edit", "pause", "resume", "rm", "run", "fire"];
|
|
266
|
+
const needsRunId = ["cancel", "ack"];
|
|
267
|
+
if (needsName.includes(command.action) && !command.target) throw new Error(`${command.action} needs an automation name`);
|
|
268
|
+
if (needsRunId.includes(command.action) && !command.target) throw new Error(`${command.action} needs a run id`);
|
|
269
|
+
if (command.action === "create" && !command.flags["--name"]) throw new Error("create needs --name <name>");
|
|
270
|
+
for (const name of [command.flags["--name"], command.flags["--rename"], needsName.includes(command.action) ? command.target : void 0]) {
|
|
271
|
+
if (name !== void 0 && !persistence.AUTOMATION_NAME_PATTERN.test(name)) throw new Error(`Invalid automation name "${name}": use [a-z0-9][a-z0-9-_.]{0,63}`);
|
|
272
|
+
}
|
|
273
|
+
const { client, machineId } = await agentGuidance.authenticatedAutomationsClient();
|
|
274
|
+
const machine = (requested) => {
|
|
275
|
+
if (requested && requested !== "this") return requested;
|
|
276
|
+
if (!machineId) throw new Error("This machine is not registered with Very Happy; pass --machine <id>");
|
|
277
|
+
return machineId;
|
|
278
|
+
};
|
|
279
|
+
try {
|
|
280
|
+
switch (command.action) {
|
|
281
|
+
case "list": {
|
|
282
|
+
const automations = await client.list(command.bools.has("--all-machines") ? void 0 : machine(command.flags["--machine"]));
|
|
283
|
+
if (json) {
|
|
284
|
+
console.log(JSON.stringify({ serverUrl: persistence.configuration.serverUrl, automations }));
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
if (automations.length === 0) {
|
|
288
|
+
console.log("No automations" + (command.bools.has("--all-machines") ? "." : " on this machine (try --all-machines)."));
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
for (const a of automations) console.log(`${(a.status === "paused" ? chalk.yellow("paused") : chalk.green("active")).padEnd(6)} ${a.name.padEnd(24)} ${index.describeTrigger(a.trigger).padEnd(32)} next ${fmtTime(a.nextRunAt)} ${index.describeAction(a.action)}`);
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
case "show": {
|
|
295
|
+
const automation = await client.getByName(command.target);
|
|
296
|
+
const runs = await client.runs({ automationId: automation.id, limit: 5 });
|
|
297
|
+
if (json) {
|
|
298
|
+
console.log(JSON.stringify({ automation, runs }));
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
printAutomation(automation);
|
|
302
|
+
if (runs.length) {
|
|
303
|
+
console.log(" recent runs:");
|
|
304
|
+
for (const run of runs) console.log(` ${runLine(run)}`);
|
|
305
|
+
}
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
case "create": {
|
|
309
|
+
const trigger = index.triggerFromFlags({ cron: command.flags["--cron"], tz: command.flags["--tz"], every: command.flags["--every"], at: command.flags["--at"], manual: command.bools.has("--manual") });
|
|
310
|
+
if (!trigger) throw new Error("Give a trigger: --cron <expr> --tz <zone>, --every <dur>, --at <iso>, or --manual");
|
|
311
|
+
const action = actionFromCommand(command);
|
|
312
|
+
if (!action) throw new Error("Give an action: --spawn-dir <dir>, --send-session <id>, or --script -- <argv\u2026>");
|
|
313
|
+
const input = {
|
|
314
|
+
name: command.flags["--name"],
|
|
315
|
+
machineId: machine(command.flags["--machine"]),
|
|
316
|
+
trigger,
|
|
317
|
+
action,
|
|
318
|
+
...command.flags["--description"] !== void 0 ? { description: command.flags["--description"] } : {},
|
|
319
|
+
...command.flags["--concurrency"] !== void 0 ? { concurrency: concurrency(command.flags["--concurrency"]) } : {},
|
|
320
|
+
...command.flags["--max-runtime"] !== void 0 ? { maxRuntimeMs: index.parseDuration(command.flags["--max-runtime"]) } : {},
|
|
321
|
+
...command.bools.has("--paused") ? { status: "paused" } : {}
|
|
322
|
+
};
|
|
323
|
+
const automation = await client.create(input);
|
|
324
|
+
if (json) {
|
|
325
|
+
console.log(JSON.stringify({ automation }));
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
console.log(chalk.green("Created."));
|
|
329
|
+
printAutomation(automation);
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
case "edit": {
|
|
333
|
+
const current = await client.getByName(command.target);
|
|
334
|
+
const trigger = index.triggerFromFlags({ cron: command.flags["--cron"], tz: command.flags["--tz"], every: command.flags["--every"], at: command.flags["--at"], manual: command.bools.has("--manual") });
|
|
335
|
+
const action = actionFromCommand(command, current.action);
|
|
336
|
+
const input = {
|
|
337
|
+
version: current.version,
|
|
338
|
+
...command.flags["--rename"] !== void 0 ? { name: command.flags["--rename"] } : {},
|
|
339
|
+
...command.flags["--description"] !== void 0 ? { description: command.flags["--description"] } : {},
|
|
340
|
+
...command.flags["--machine"] !== void 0 ? { machineId: machine(command.flags["--machine"]) } : {},
|
|
341
|
+
...trigger ? { trigger } : {},
|
|
342
|
+
...action ? { action } : {},
|
|
343
|
+
...command.flags["--concurrency"] !== void 0 ? { concurrency: concurrency(command.flags["--concurrency"]) } : {},
|
|
344
|
+
...command.flags["--max-runtime"] !== void 0 ? { maxRuntimeMs: index.parseDuration(command.flags["--max-runtime"]) } : {}
|
|
345
|
+
};
|
|
346
|
+
if (Object.keys(input).length === 1) throw new Error("Nothing to change");
|
|
347
|
+
const automation = await client.update(current.id, input);
|
|
348
|
+
if (json) {
|
|
349
|
+
console.log(JSON.stringify({ automation }));
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
console.log(chalk.green("Updated."));
|
|
353
|
+
printAutomation(automation);
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
case "pause":
|
|
357
|
+
case "resume": {
|
|
358
|
+
const current = await client.getByName(command.target);
|
|
359
|
+
const automation = command.action === "pause" ? await client.pause(current.id) : await client.resume(current.id);
|
|
360
|
+
if (json) {
|
|
361
|
+
console.log(JSON.stringify({ automation }));
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
console.log(`${automation.name}: ${automation.status}${automation.nextRunAt ? `, next ${fmtTime(automation.nextRunAt)}` : ""}`);
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
case "rm": {
|
|
368
|
+
const current = await client.getByName(command.target);
|
|
369
|
+
await client.remove(current.id);
|
|
370
|
+
if (json) {
|
|
371
|
+
console.log(JSON.stringify({ deleted: true, id: current.id, name: current.name }));
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
console.log(`Deleted ${current.name} and its runs.`);
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
case "run":
|
|
378
|
+
case "fire": {
|
|
379
|
+
const payload = readPayload(command.flags);
|
|
380
|
+
let run;
|
|
381
|
+
let deduplicated = false;
|
|
382
|
+
if (command.action === "fire") {
|
|
383
|
+
const fired = await client.fire(command.target, { ...payload !== void 0 ? { payload } : {}, ...command.flags["--dedupe-key"] !== void 0 ? { dedupeKey: command.flags["--dedupe-key"] } : {} });
|
|
384
|
+
run = fired.run;
|
|
385
|
+
deduplicated = fired.deduplicated;
|
|
386
|
+
} else {
|
|
387
|
+
if (command.flags["--dedupe-key"] !== void 0) throw new Error("--dedupe-key only applies to fire");
|
|
388
|
+
run = await client.run((await client.getByName(command.target)).id, payload !== void 0 ? { payload } : {});
|
|
389
|
+
}
|
|
390
|
+
if (!json) {
|
|
391
|
+
console.log(`${deduplicated ? "Existing run" : "Run"} ${run.id}: ${run.status}`);
|
|
392
|
+
}
|
|
393
|
+
if (command.bools.has("--wait") && !persistence.isAutomationRunTerminal(run.status)) {
|
|
394
|
+
const timeoutMs = command.flags["--timeout"] !== void 0 ? index.parseDuration(command.flags["--timeout"]) : 6e5;
|
|
395
|
+
const final = await waitForRun(client, run.id, timeoutMs);
|
|
396
|
+
if (!final) {
|
|
397
|
+
if (json) console.log(JSON.stringify({ run, deduplicated, timedOut: true }));
|
|
398
|
+
else console.error(chalk.yellow(`Run ${run.id} did not finish within ${Math.round(timeoutMs / 1e3)}s (it may still complete).`));
|
|
399
|
+
process.exitCode = 2;
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
run = final;
|
|
403
|
+
}
|
|
404
|
+
if (json) {
|
|
405
|
+
console.log(JSON.stringify({ run, deduplicated }));
|
|
406
|
+
} else if (command.bools.has("--wait") || persistence.isAutomationRunTerminal(run.status)) printRun(run);
|
|
407
|
+
else if (run.sessionId) console.log(` session: ${index.sessionWebUrl(run.sessionId)}`);
|
|
408
|
+
if (persistence.isAutomationRunTerminal(run.status) && run.status !== "done") process.exitCode = 3;
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
case "runs": {
|
|
412
|
+
if (command.target) {
|
|
413
|
+
const run = await client.getRun(command.target);
|
|
414
|
+
if (json) console.log(JSON.stringify({ run }));
|
|
415
|
+
else printRun(run);
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
const limit = command.flags["--limit"] !== void 0 ? Number(command.flags["--limit"]) : void 0;
|
|
419
|
+
if (limit !== void 0 && !(Number.isInteger(limit) && limit > 0)) throw new Error("--limit must be a positive integer");
|
|
420
|
+
const runs = await client.runs({ name: command.flags["--name"], status: command.flags["--status"], attention: command.bools.has("--attention"), limit });
|
|
421
|
+
if (json) {
|
|
422
|
+
console.log(JSON.stringify({ runs }));
|
|
423
|
+
return;
|
|
424
|
+
}
|
|
425
|
+
if (runs.length === 0) {
|
|
426
|
+
console.log("No runs.");
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
for (const run of runs) console.log(runLine(run));
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
case "cancel":
|
|
433
|
+
case "ack": {
|
|
434
|
+
const run = command.action === "cancel" ? await client.cancel(command.target) : await client.ack(command.target);
|
|
435
|
+
if (json) console.log(JSON.stringify({ run }));
|
|
436
|
+
else printRun(run);
|
|
437
|
+
return;
|
|
438
|
+
}
|
|
439
|
+
case "report": {
|
|
440
|
+
const runId = command.flags["--run"] ?? agentGuidance.automationRunIdFromEnv();
|
|
441
|
+
if (!runId) throw new Error("--run <id> is required outside an automation-started session (VH_AUTOMATION_RUN_ID is not set)");
|
|
442
|
+
const status = command.flags["--status"];
|
|
443
|
+
if (status !== "done" && status !== "failed") throw new Error("--status must be done or failed");
|
|
444
|
+
const report = {
|
|
445
|
+
status,
|
|
446
|
+
...command.flags["--summary"] !== void 0 ? { summary: command.flags["--summary"] } : {},
|
|
447
|
+
...command.flags["--error"] !== void 0 ? { error: command.flags["--error"] } : {},
|
|
448
|
+
...command.flags["--attention"] !== void 0 ? { needsAttention: true, attentionReason: command.flags["--attention"] } : {}
|
|
449
|
+
};
|
|
450
|
+
const run = await client.report(runId, report);
|
|
451
|
+
if (json) console.log(JSON.stringify({ run }));
|
|
452
|
+
else printRun(run);
|
|
453
|
+
return;
|
|
454
|
+
}
|
|
455
|
+
default:
|
|
456
|
+
throw new Error(`Unhandled auto command: ${command.action}`);
|
|
457
|
+
}
|
|
458
|
+
} catch (error) {
|
|
459
|
+
if (agentGuidance.isAutomationsUnavailable(error)) throw new Error(agentGuidance.AUTOMATIONS_UNAVAILABLE_MESSAGE);
|
|
460
|
+
throw error;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
function concurrency(value) {
|
|
464
|
+
if (value !== "skip" && value !== "queue") throw new Error("--concurrency must be skip or queue");
|
|
465
|
+
return value;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
exports.AUTO_ACTIONS = AUTO_ACTIONS;
|
|
469
|
+
exports.AUTO_HELP = AUTO_HELP;
|
|
470
|
+
exports.actionFromCommand = actionFromCommand;
|
|
471
|
+
exports.handleAutoCommand = handleAutoCommand;
|
|
472
|
+
exports.parseAutoArgs = parseAutoArgs;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var agentGuidance = require('../agentGuidance-
|
|
3
|
+
var agentGuidance = require('../agentGuidance-CqBn77AI.cjs');
|
|
4
4
|
var mcp_js = require('@modelcontextprotocol/sdk/server/mcp.js');
|
|
5
5
|
var stdio_js = require('@modelcontextprotocol/sdk/server/stdio.js');
|
|
6
6
|
var index_js = require('@modelcontextprotocol/sdk/client/index.js');
|
|
7
7
|
var streamableHttp_js = require('@modelcontextprotocol/sdk/client/streamableHttp.js');
|
|
8
8
|
var z = require('zod');
|
|
9
|
-
var persistence = require('../limits-
|
|
9
|
+
var persistence = require('../limits-BNTWyUaZ.cjs');
|
|
10
10
|
require('node:crypto');
|
|
11
11
|
require('node:fs/promises');
|
|
12
12
|
require('node:fs');
|
|
@@ -15,6 +15,7 @@ require('node:os');
|
|
|
15
15
|
require('tweetnacl');
|
|
16
16
|
require('chalk');
|
|
17
17
|
require('node:util');
|
|
18
|
+
require('@paralleldrive/cuid2');
|
|
18
19
|
|
|
19
20
|
function parseArgs(argv) {
|
|
20
21
|
let url = null;
|
|
@@ -140,6 +141,7 @@ async function main() {
|
|
|
140
141
|
return forwardTeam(`team_${String(type).replaceAll("-", "_")}`, { ...args, requestId });
|
|
141
142
|
}
|
|
142
143
|
});
|
|
144
|
+
agentGuidance.registerAutomationTools(server, (name, args) => forwardTeam(name, args));
|
|
143
145
|
const stdio = new stdio_js.StdioServerTransport();
|
|
144
146
|
await server.connect(stdio);
|
|
145
147
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { P as PREVIEW_TOOL_NAME, a as PREVIEW_TOOL_TITLE, b as PREVIEW_TOOL_DESCRIPTION, r as registerTeamsTools } from '../agentGuidance-
|
|
1
|
+
import { P as PREVIEW_TOOL_NAME, a as PREVIEW_TOOL_TITLE, b as PREVIEW_TOOL_DESCRIPTION, r as registerTeamsTools, c as registerAutomationTools } from '../agentGuidance-Daxn5Nvj.mjs';
|
|
2
2
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
3
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
4
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
5
5
|
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
6
6
|
import { z } from 'zod';
|
|
7
|
-
import { C as CLIPBOARD_TOOL_NAME, a as CLIPBOARD_TOOL_TITLE, b as CLIPBOARD_TOOL_DESCRIPTION } from '../limits-
|
|
7
|
+
import { C as CLIPBOARD_TOOL_NAME, a as CLIPBOARD_TOOL_TITLE, b as CLIPBOARD_TOOL_DESCRIPTION } from '../limits-CKR_HJnO.mjs';
|
|
8
8
|
import 'node:crypto';
|
|
9
9
|
import 'node:fs/promises';
|
|
10
10
|
import 'node:fs';
|
|
@@ -13,6 +13,7 @@ import 'node:os';
|
|
|
13
13
|
import 'tweetnacl';
|
|
14
14
|
import 'chalk';
|
|
15
15
|
import 'node:util';
|
|
16
|
+
import '@paralleldrive/cuid2';
|
|
16
17
|
|
|
17
18
|
function parseArgs(argv) {
|
|
18
19
|
let url = null;
|
|
@@ -138,6 +139,7 @@ async function main() {
|
|
|
138
139
|
return forwardTeam(`team_${String(type).replaceAll("-", "_")}`, { ...args, requestId });
|
|
139
140
|
}
|
|
140
141
|
});
|
|
142
|
+
registerAutomationTools(server, (name, args) => forwardTeam(name, args));
|
|
141
143
|
const stdio = new StdioServerTransport();
|
|
142
144
|
await server.connect(stdio);
|
|
143
145
|
}
|
|
@@ -2,8 +2,8 @@ import { existsSync, readFileSync, mkdirSync, writeFileSync } from 'fs';
|
|
|
2
2
|
import { join } from 'path';
|
|
3
3
|
import { homedir } from 'os';
|
|
4
4
|
import { execSync } from 'child_process';
|
|
5
|
-
import { l as logger } from './limits-
|
|
6
|
-
import { f as DEFAULT_GEMINI_MODEL, G as GEMINI_MODEL_ENV } from './index-
|
|
5
|
+
import { l as logger } from './limits-CKR_HJnO.mjs';
|
|
6
|
+
import { f as DEFAULT_GEMINI_MODEL, G as GEMINI_MODEL_ENV } from './index-BauTv2jB.mjs';
|
|
7
7
|
import 'node:fs/promises';
|
|
8
8
|
import 'node:fs';
|
|
9
9
|
import 'node:os';
|
|
@@ -13,11 +13,11 @@ import 'node:crypto';
|
|
|
13
13
|
import 'tweetnacl';
|
|
14
14
|
import 'chalk';
|
|
15
15
|
import 'node:util';
|
|
16
|
-
import '
|
|
16
|
+
import '@paralleldrive/cuid2';
|
|
17
|
+
import './types-xKrxbCRv.mjs';
|
|
17
18
|
import 'axios';
|
|
18
19
|
import 'node:events';
|
|
19
20
|
import 'socket.io-client';
|
|
20
|
-
import '@paralleldrive/cuid2';
|
|
21
21
|
import 'util';
|
|
22
22
|
import 'fs/promises';
|
|
23
23
|
import 'crypto';
|
|
@@ -29,7 +29,7 @@ import 'node-pty';
|
|
|
29
29
|
import 'node:readline';
|
|
30
30
|
import '@anthropic-ai/sandbox-runtime';
|
|
31
31
|
import 'expo-server-sdk';
|
|
32
|
-
import './agentGuidance-
|
|
32
|
+
import './agentGuidance-Daxn5Nvj.mjs';
|
|
33
33
|
import 'ink';
|
|
34
34
|
import 'react';
|
|
35
35
|
import '@anthropic-ai/claude-agent-sdk';
|
|
@@ -4,8 +4,8 @@ var fs = require('fs');
|
|
|
4
4
|
var path = require('path');
|
|
5
5
|
var os = require('os');
|
|
6
6
|
var child_process = require('child_process');
|
|
7
|
-
var persistence = require('./limits-
|
|
8
|
-
var index = require('./index-
|
|
7
|
+
var persistence = require('./limits-BNTWyUaZ.cjs');
|
|
8
|
+
var index = require('./index-ZIW1jrYm.cjs');
|
|
9
9
|
require('node:fs/promises');
|
|
10
10
|
require('node:fs');
|
|
11
11
|
require('node:os');
|
|
@@ -15,11 +15,11 @@ require('node:crypto');
|
|
|
15
15
|
require('tweetnacl');
|
|
16
16
|
require('chalk');
|
|
17
17
|
require('node:util');
|
|
18
|
-
require('
|
|
18
|
+
require('@paralleldrive/cuid2');
|
|
19
|
+
require('./types-CN28qJl7.cjs');
|
|
19
20
|
require('axios');
|
|
20
21
|
require('node:events');
|
|
21
22
|
require('socket.io-client');
|
|
22
|
-
require('@paralleldrive/cuid2');
|
|
23
23
|
require('util');
|
|
24
24
|
require('fs/promises');
|
|
25
25
|
require('crypto');
|
|
@@ -31,7 +31,7 @@ require('node-pty');
|
|
|
31
31
|
require('node:readline');
|
|
32
32
|
require('@anthropic-ai/sandbox-runtime');
|
|
33
33
|
require('expo-server-sdk');
|
|
34
|
-
require('./agentGuidance-
|
|
34
|
+
require('./agentGuidance-CqBn77AI.cjs');
|
|
35
35
|
require('ink');
|
|
36
36
|
require('react');
|
|
37
37
|
require('@anthropic-ai/claude-agent-sdk');
|