@agentvault/agentvault 0.14.30 → 0.15.0
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/README.md +3 -1
- package/dist/account-config.js +60 -0
- package/dist/account-config.js.map +1 -0
- package/dist/channel.d.ts +5 -0
- package/dist/channel.d.ts.map +1 -1
- package/dist/channel.js +3411 -0
- package/dist/channel.js.map +1 -0
- package/dist/cli.js +253 -72006
- package/dist/cli.js.map +1 -7
- package/dist/create-agent.js +314 -0
- package/dist/create-agent.js.map +1 -0
- package/dist/crypto-helpers.js +4 -0
- package/dist/crypto-helpers.js.map +1 -0
- package/dist/doctor.js +415 -0
- package/dist/doctor.js.map +1 -0
- package/dist/fetch-interceptor.js +213 -0
- package/dist/fetch-interceptor.js.map +1 -0
- package/dist/gateway-send.js +114 -0
- package/dist/gateway-send.js.map +1 -0
- package/dist/http-handlers.js +131 -0
- package/dist/http-handlers.js.map +1 -0
- package/dist/index.js +24 -76340
- package/dist/index.js.map +1 -7
- package/dist/mcp-handlers.js +48 -0
- package/dist/mcp-handlers.js.map +1 -0
- package/dist/mcp-server.js +192 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/openclaw-compat.js +94 -0
- package/dist/openclaw-compat.js.map +1 -0
- package/dist/openclaw-entry.d.ts.map +1 -1
- package/dist/openclaw-entry.js +1204 -1414
- package/dist/openclaw-entry.js.map +1 -7
- package/dist/openclaw-plugin.js +297 -0
- package/dist/openclaw-plugin.js.map +1 -0
- package/dist/openclaw-types.js +13 -0
- package/dist/openclaw-types.js.map +1 -0
- package/dist/setup.js +460 -0
- package/dist/setup.js.map +1 -0
- package/dist/skill-invoker.js +100 -0
- package/dist/skill-invoker.js.map +1 -0
- package/dist/skill-manifest.js +249 -0
- package/dist/skill-manifest.js.map +1 -0
- package/dist/skill-telemetry.js +146 -0
- package/dist/skill-telemetry.js.map +1 -0
- package/dist/skills-publish.js +133 -0
- package/dist/skills-publish.js.map +1 -0
- package/dist/state.js +178 -0
- package/dist/state.js.map +1 -0
- package/dist/transport.js +43 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/workspace-handlers.js +177 -0
- package/dist/workspace-handlers.js.map +1 -0
- package/package.json +1 -1
package/dist/doctor.js
ADDED
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentVault "doctor" command — diagnostic checks and plist fixer.
|
|
3
|
+
*
|
|
4
|
+
* Detects stale macOS LaunchAgent plist paths (common after pnpm updates)
|
|
5
|
+
* and offers to install a stable wrapper script so future updates don't
|
|
6
|
+
* break the gateway.
|
|
7
|
+
*
|
|
8
|
+
* Usage: npx @agentvault/agentvault doctor [--fix]
|
|
9
|
+
*/
|
|
10
|
+
import { execSync } from "node:child_process";
|
|
11
|
+
import { existsSync, readFileSync, writeFileSync, chmodSync } from "node:fs";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
import { createInterface } from "node:readline";
|
|
14
|
+
import { openclawHome, readOpenClawConfig } from "./create-agent.js";
|
|
15
|
+
const PLIST_FILENAME = "ai.openclaw.gateway.plist";
|
|
16
|
+
const WRAPPER_SCRIPT_NAME = "start-gateway.sh";
|
|
17
|
+
/* ── Individual check functions ────────────────────────────────────────── */
|
|
18
|
+
export function checkOpenClawInstalled() {
|
|
19
|
+
try {
|
|
20
|
+
const out = execSync("openclaw --version", { stdio: "pipe", timeout: 10000 });
|
|
21
|
+
const version = out.toString().trim();
|
|
22
|
+
return { name: "OpenClaw installed", status: "pass", message: version };
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return {
|
|
26
|
+
name: "OpenClaw installed",
|
|
27
|
+
status: "fail",
|
|
28
|
+
message: "'openclaw' not found in PATH",
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function checkConfigExists(home) {
|
|
33
|
+
const configPath = join(home, "openclaw.json");
|
|
34
|
+
if (!existsSync(configPath)) {
|
|
35
|
+
return {
|
|
36
|
+
name: "Config exists",
|
|
37
|
+
status: "fail",
|
|
38
|
+
message: `Not found: ${configPath}`,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
JSON.parse(readFileSync(configPath, "utf-8"));
|
|
43
|
+
return { name: "Config exists", status: "pass", message: configPath };
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return {
|
|
47
|
+
name: "Config exists",
|
|
48
|
+
status: "fail",
|
|
49
|
+
message: `Invalid JSON: ${configPath}`,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export function checkAgentVaultChannel(config) {
|
|
54
|
+
if (!config) {
|
|
55
|
+
return {
|
|
56
|
+
name: "AgentVault channel",
|
|
57
|
+
status: "fail",
|
|
58
|
+
message: "Config is null",
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
if (config.channels?.agentvault) {
|
|
62
|
+
return { name: "AgentVault channel", status: "pass", message: "channels.agentvault present" };
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
name: "AgentVault channel",
|
|
66
|
+
status: "fail",
|
|
67
|
+
message: "channels.agentvault not found in config",
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export function checkPluginsAllow(config) {
|
|
71
|
+
if (!config) {
|
|
72
|
+
return { name: "Plugin allow-listed", status: "warn", message: "Config is null" };
|
|
73
|
+
}
|
|
74
|
+
const allow = config.plugins?.allow;
|
|
75
|
+
if (!Array.isArray(allow)) {
|
|
76
|
+
return {
|
|
77
|
+
name: "Plugin allow-listed",
|
|
78
|
+
status: "warn",
|
|
79
|
+
message: "plugins.allow not defined",
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
if (allow.includes("agentvault")) {
|
|
83
|
+
return { name: "Plugin allow-listed", status: "pass", message: "agentvault in plugins.allow" };
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
name: "Plugin allow-listed",
|
|
87
|
+
status: "warn",
|
|
88
|
+
message: "'agentvault' not in plugins.allow list",
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
export function checkPlist() {
|
|
92
|
+
if (process.platform !== "darwin") {
|
|
93
|
+
return { name: "macOS LaunchAgent plist", status: "skip", message: "Not macOS" };
|
|
94
|
+
}
|
|
95
|
+
const result = validatePlist();
|
|
96
|
+
switch (result.status) {
|
|
97
|
+
case "ok":
|
|
98
|
+
return { name: "macOS LaunchAgent plist", status: "pass", message: "Plist paths valid" };
|
|
99
|
+
case "already-fixed":
|
|
100
|
+
return { name: "macOS LaunchAgent plist", status: "pass", message: "Wrapper script already configured" };
|
|
101
|
+
case "stale":
|
|
102
|
+
return {
|
|
103
|
+
name: "macOS LaunchAgent plist",
|
|
104
|
+
status: "fail",
|
|
105
|
+
message: `Stale path: ${result.stalePaths?.[0] ?? "unknown"}`,
|
|
106
|
+
};
|
|
107
|
+
case "missing":
|
|
108
|
+
return {
|
|
109
|
+
name: "macOS LaunchAgent plist",
|
|
110
|
+
status: "warn",
|
|
111
|
+
message: `Plist not found: ${result.plistPath ?? PLIST_FILENAME}`,
|
|
112
|
+
};
|
|
113
|
+
default:
|
|
114
|
+
return { name: "macOS LaunchAgent plist", status: "skip", message: "Skipped" };
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
export function checkGatewayPort() {
|
|
118
|
+
try {
|
|
119
|
+
execSync("curl -sf --max-time 3 http://127.0.0.1:18789/", { stdio: "pipe" });
|
|
120
|
+
return { name: "Gateway port (18789)", status: "pass", message: "Responding" };
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return {
|
|
124
|
+
name: "Gateway port (18789)",
|
|
125
|
+
status: "fail",
|
|
126
|
+
message: "No response on 127.0.0.1:18789",
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
export function checkAgentDataDirs(config) {
|
|
131
|
+
if (!config) {
|
|
132
|
+
return { name: "Agent data dirs", status: "warn", message: "Config is null" };
|
|
133
|
+
}
|
|
134
|
+
const home = process.env.HOME ?? "";
|
|
135
|
+
const warnings = [];
|
|
136
|
+
// Single-account mode
|
|
137
|
+
const av = config.channels?.agentvault;
|
|
138
|
+
if (!av) {
|
|
139
|
+
return { name: "Agent data dirs", status: "warn", message: "No agentvault channel" };
|
|
140
|
+
}
|
|
141
|
+
const checkDir = (label, dataDir) => {
|
|
142
|
+
const resolved = dataDir.replace(/^~/, home);
|
|
143
|
+
if (!existsSync(resolved)) {
|
|
144
|
+
warnings.push(`${label}: dir missing (${resolved})`);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const statePath = join(resolved, "agentvault.json");
|
|
148
|
+
if (!existsSync(statePath)) {
|
|
149
|
+
warnings.push(`${label}: no agentvault.json`);
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
if (av.accounts && typeof av.accounts === "object") {
|
|
153
|
+
for (const [id, acct] of Object.entries(av.accounts)) {
|
|
154
|
+
if (acct.dataDir)
|
|
155
|
+
checkDir(id, acct.dataDir);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else if (av.dataDir) {
|
|
159
|
+
checkDir("default", av.dataDir);
|
|
160
|
+
}
|
|
161
|
+
if (warnings.length > 0) {
|
|
162
|
+
return { name: "Agent data dirs", status: "warn", message: warnings.join("; ") };
|
|
163
|
+
}
|
|
164
|
+
return { name: "Agent data dirs", status: "pass", message: "All data dirs valid" };
|
|
165
|
+
}
|
|
166
|
+
export function checkPm2Status() {
|
|
167
|
+
try {
|
|
168
|
+
execSync("pm2 --version", { stdio: "pipe", timeout: 5000 });
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return { name: "pm2 status", status: "skip", message: "pm2 not installed" };
|
|
172
|
+
}
|
|
173
|
+
try {
|
|
174
|
+
const info = execSync("pm2 describe openclaw-gateway", { stdio: "pipe", timeout: 5000 });
|
|
175
|
+
const out = info.toString();
|
|
176
|
+
if (out.includes("online")) {
|
|
177
|
+
return { name: "pm2 status", status: "pass", message: "openclaw-gateway: online" };
|
|
178
|
+
}
|
|
179
|
+
if (out.includes("stopped")) {
|
|
180
|
+
return { name: "pm2 status", status: "warn", message: "openclaw-gateway: stopped" };
|
|
181
|
+
}
|
|
182
|
+
return { name: "pm2 status", status: "warn", message: "openclaw-gateway: unknown state" };
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
return { name: "pm2 status", status: "warn", message: "openclaw-gateway not registered in pm2" };
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/* ── Plist parsing / validation ────────────────────────────────────────── */
|
|
189
|
+
export function plistPath() {
|
|
190
|
+
const home = process.env.HOME ?? "";
|
|
191
|
+
return join(home, "Library", "LaunchAgents", PLIST_FILENAME);
|
|
192
|
+
}
|
|
193
|
+
export function parsePlist(plistFile) {
|
|
194
|
+
if (!existsSync(plistFile))
|
|
195
|
+
return null;
|
|
196
|
+
try {
|
|
197
|
+
const json = execSync(`plutil -convert json -o - "${plistFile}"`, {
|
|
198
|
+
stdio: "pipe",
|
|
199
|
+
timeout: 5000,
|
|
200
|
+
}).toString();
|
|
201
|
+
const parsed = JSON.parse(json);
|
|
202
|
+
const programArgs = parsed.ProgramArguments ?? [];
|
|
203
|
+
const stalePaths = [];
|
|
204
|
+
const wrapperPath = join(process.env.HOME ?? "", ".openclaw", WRAPPER_SCRIPT_NAME);
|
|
205
|
+
for (const arg of programArgs) {
|
|
206
|
+
// Check absolute paths (skip flags and relative args)
|
|
207
|
+
if (arg.startsWith("/") && arg !== "/bin/bash" && arg !== wrapperPath) {
|
|
208
|
+
if (!existsSync(arg)) {
|
|
209
|
+
stalePaths.push(arg);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return { plistPath: plistFile, programArgs, stalePaths };
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
export function validatePlist() {
|
|
220
|
+
if (process.platform !== "darwin") {
|
|
221
|
+
return { status: "skip" };
|
|
222
|
+
}
|
|
223
|
+
const path = plistPath();
|
|
224
|
+
if (!existsSync(path)) {
|
|
225
|
+
return { status: "missing", plistPath: path };
|
|
226
|
+
}
|
|
227
|
+
const info = parsePlist(path);
|
|
228
|
+
if (!info) {
|
|
229
|
+
return { status: "missing", plistPath: path };
|
|
230
|
+
}
|
|
231
|
+
// Check if already using our wrapper script
|
|
232
|
+
const home = process.env.HOME ?? "";
|
|
233
|
+
const wrapperPath = join(home, ".openclaw", WRAPPER_SCRIPT_NAME);
|
|
234
|
+
if (info.programArgs.includes(wrapperPath)) {
|
|
235
|
+
return { status: "already-fixed", plistPath: path };
|
|
236
|
+
}
|
|
237
|
+
if (info.stalePaths.length > 0) {
|
|
238
|
+
return { status: "stale", plistPath: path, stalePaths: info.stalePaths };
|
|
239
|
+
}
|
|
240
|
+
return { status: "ok", plistPath: path };
|
|
241
|
+
}
|
|
242
|
+
/* ── Plist fix ─────────────────────────────────────────────────────────── */
|
|
243
|
+
export function applyPlistFix(info) {
|
|
244
|
+
const home = process.env.HOME ?? "";
|
|
245
|
+
const openclawDir = join(home, ".openclaw");
|
|
246
|
+
const wrapperPath = join(openclawDir, WRAPPER_SCRIPT_NAME);
|
|
247
|
+
// 1. Create wrapper script (PATH needed for launchd's minimal environment)
|
|
248
|
+
const wrapperContent = `#!/bin/bash
|
|
249
|
+
export PATH="$HOME/.local/bin:$HOME/.pnpm/bin:$HOME/Library/pnpm/bin:$HOME/Library/pnpm:/opt/homebrew/bin:/usr/local/bin:$PATH"
|
|
250
|
+
exec "$(which openclaw)" gateway start "$@"
|
|
251
|
+
`;
|
|
252
|
+
try {
|
|
253
|
+
writeFileSync(wrapperPath, wrapperContent, "utf-8");
|
|
254
|
+
chmodSync(wrapperPath, 0o755);
|
|
255
|
+
console.log(` Created wrapper: ${wrapperPath}`);
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
console.error(` Failed to create wrapper script: ${err.message}`);
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
// 2. Update plist via PlistBuddy
|
|
262
|
+
const plistBuddy = "/usr/libexec/PlistBuddy";
|
|
263
|
+
const plist = info.plistPath;
|
|
264
|
+
try {
|
|
265
|
+
// Set ProgramArguments:0 = /bin/bash
|
|
266
|
+
execSync(`${plistBuddy} -c "Set :ProgramArguments:0 /bin/bash" "${plist}"`, { stdio: "pipe" });
|
|
267
|
+
// Set ProgramArguments:1 = wrapper path
|
|
268
|
+
try {
|
|
269
|
+
execSync(`${plistBuddy} -c "Set :ProgramArguments:1 ${wrapperPath}" "${plist}"`, { stdio: "pipe" });
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
// Index 1 might not exist — add it
|
|
273
|
+
execSync(`${plistBuddy} -c "Add :ProgramArguments:1 string ${wrapperPath}" "${plist}"`, { stdio: "pipe" });
|
|
274
|
+
}
|
|
275
|
+
// Delete extra args (index 2+) — loop in reverse to avoid index shifts
|
|
276
|
+
// First, count how many args there are
|
|
277
|
+
let argCount = info.programArgs.length;
|
|
278
|
+
for (let i = argCount - 1; i >= 2; i--) {
|
|
279
|
+
try {
|
|
280
|
+
execSync(`${plistBuddy} -c "Delete :ProgramArguments:${i}" "${plist}"`, { stdio: "pipe" });
|
|
281
|
+
}
|
|
282
|
+
catch {
|
|
283
|
+
// Already gone
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
console.log(" Updated plist ProgramArguments.");
|
|
287
|
+
}
|
|
288
|
+
catch (err) {
|
|
289
|
+
console.error(` Failed to update plist: ${err.message}`);
|
|
290
|
+
return false;
|
|
291
|
+
}
|
|
292
|
+
// 3. Reload launchd
|
|
293
|
+
try {
|
|
294
|
+
execSync(`launchctl unload "${plist}"`, { stdio: "pipe" });
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
// May not be loaded — that's fine
|
|
298
|
+
}
|
|
299
|
+
try {
|
|
300
|
+
execSync(`launchctl load "${plist}"`, { stdio: "pipe" });
|
|
301
|
+
console.log(" Reloaded LaunchAgent.");
|
|
302
|
+
}
|
|
303
|
+
catch (err) {
|
|
304
|
+
console.error(` Failed to reload LaunchAgent: ${err.message}`);
|
|
305
|
+
console.log(` Try manually: launchctl load "${plist}"`);
|
|
306
|
+
return false;
|
|
307
|
+
}
|
|
308
|
+
return true;
|
|
309
|
+
}
|
|
310
|
+
/* ── Main doctor command ───────────────────────────────────────────────── */
|
|
311
|
+
export async function runDoctorCommand(options) {
|
|
312
|
+
const home = openclawHome();
|
|
313
|
+
console.log(`
|
|
314
|
+
╔══════════════════════════════════════════════╗
|
|
315
|
+
║ AgentVault — Doctor Diagnostics ║
|
|
316
|
+
╚══════════════════════════════════════════════╝
|
|
317
|
+
`);
|
|
318
|
+
const results = [];
|
|
319
|
+
// 1. OpenClaw installed
|
|
320
|
+
results.push(checkOpenClawInstalled());
|
|
321
|
+
// 2. Config exists
|
|
322
|
+
results.push(checkConfigExists(home));
|
|
323
|
+
// 3-4. Parse config for channel/plugin checks
|
|
324
|
+
let config = null;
|
|
325
|
+
try {
|
|
326
|
+
config = readOpenClawConfig(home);
|
|
327
|
+
}
|
|
328
|
+
catch {
|
|
329
|
+
// Config unreadable — already captured by check #2
|
|
330
|
+
}
|
|
331
|
+
results.push(checkAgentVaultChannel(config));
|
|
332
|
+
results.push(checkPluginsAllow(config));
|
|
333
|
+
// 5. Plist (macOS only)
|
|
334
|
+
results.push(checkPlist());
|
|
335
|
+
// 6. Gateway port
|
|
336
|
+
results.push(checkGatewayPort());
|
|
337
|
+
// 7. Agent data dirs
|
|
338
|
+
results.push(checkAgentDataDirs(config));
|
|
339
|
+
// 8. pm2 status
|
|
340
|
+
results.push(checkPm2Status());
|
|
341
|
+
// Print results
|
|
342
|
+
const statusLabels = {
|
|
343
|
+
pass: "pass",
|
|
344
|
+
warn: "WARN",
|
|
345
|
+
fail: "FAIL",
|
|
346
|
+
skip: "skip",
|
|
347
|
+
};
|
|
348
|
+
for (const r of results) {
|
|
349
|
+
const label = `[${statusLabels[r.status]}]`;
|
|
350
|
+
console.log(` ${label.padEnd(6)} ${r.name} — ${r.message}`);
|
|
351
|
+
}
|
|
352
|
+
const passed = results.filter((r) => r.status === "pass").length;
|
|
353
|
+
const warnings = results.filter((r) => r.status === "warn").length;
|
|
354
|
+
const failed = results.filter((r) => r.status === "fail").length;
|
|
355
|
+
console.log(`
|
|
356
|
+
─────────────────────────────────────────────
|
|
357
|
+
${passed} passed ${warnings} warnings ${failed} failed
|
|
358
|
+
─────────────────────────────────────────────
|
|
359
|
+
`);
|
|
360
|
+
if (failed > 0) {
|
|
361
|
+
process.exitCode = 1;
|
|
362
|
+
}
|
|
363
|
+
// Offer plist fix if stale
|
|
364
|
+
const plistResult = validatePlist();
|
|
365
|
+
if (plistResult.status === "stale") {
|
|
366
|
+
const plistInfo = parsePlist(plistResult.plistPath);
|
|
367
|
+
if (!plistInfo)
|
|
368
|
+
return;
|
|
369
|
+
if (options?.fix) {
|
|
370
|
+
console.log(" Applying plist fix (--fix)...\n");
|
|
371
|
+
const ok = applyPlistFix(plistInfo);
|
|
372
|
+
if (ok) {
|
|
373
|
+
console.log("\n ✅ Plist fixed. Gateway should start cleanly now.\n");
|
|
374
|
+
}
|
|
375
|
+
else {
|
|
376
|
+
console.log("\n ❌ Plist fix failed. See errors above.\n");
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
else {
|
|
380
|
+
// Interactive prompt
|
|
381
|
+
const answer = await ask(" Stale plist detected. Apply wrapper script fix? [y/N] ");
|
|
382
|
+
if (answer.trim().toLowerCase() === "y") {
|
|
383
|
+
console.log("");
|
|
384
|
+
const ok = applyPlistFix(plistInfo);
|
|
385
|
+
if (ok) {
|
|
386
|
+
console.log("\n ✅ Plist fixed. Gateway should start cleanly now.\n");
|
|
387
|
+
}
|
|
388
|
+
else {
|
|
389
|
+
console.log("\n ❌ Plist fix failed. See errors above.\n");
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
else {
|
|
393
|
+
console.log(`
|
|
394
|
+
To fix later, run:
|
|
395
|
+
npx @agentvault/agentvault doctor --fix
|
|
396
|
+
`);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
/* ── Helpers ───────────────────────────────────────────────────────────── */
|
|
402
|
+
function ask(question) {
|
|
403
|
+
return new Promise((resolve) => {
|
|
404
|
+
const rl = createInterface({
|
|
405
|
+
input: process.stdin,
|
|
406
|
+
output: process.stdout,
|
|
407
|
+
terminal: true,
|
|
408
|
+
});
|
|
409
|
+
rl.question(question, (answer) => {
|
|
410
|
+
rl.close();
|
|
411
|
+
resolve(answer);
|
|
412
|
+
});
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP interceptor for capturing outbound HTTP calls during message handling.
|
|
3
|
+
*
|
|
4
|
+
* Uses Node.js diagnostics_channel to subscribe to undici request events,
|
|
5
|
+
* capturing ALL outbound HTTP from the process (including LLM SDKs, Playwright
|
|
6
|
+
* navigations, and any library that uses undici under the hood).
|
|
7
|
+
*
|
|
8
|
+
* Also monkey-patches globalThis.fetch as a fallback for non-undici HTTP.
|
|
9
|
+
*
|
|
10
|
+
* Uses AsyncLocalStorage to associate intercepted calls with the active
|
|
11
|
+
* message's traceId/parentSpanId.
|
|
12
|
+
*
|
|
13
|
+
* Built-in skip patterns prevent capturing internal infrastructure requests
|
|
14
|
+
* (localhost, AgentVault API, Clerk auth).
|
|
15
|
+
*/
|
|
16
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
17
|
+
import diagnosticsChannel from "node:diagnostics_channel";
|
|
18
|
+
// ── Internal state ────────────────────────────────────────────────────
|
|
19
|
+
const traceStore = new AsyncLocalStorage();
|
|
20
|
+
const DEFAULT_SKIP_PATTERNS = [
|
|
21
|
+
/^https?:\/\/localhost(:\d+)?/,
|
|
22
|
+
/^https?:\/\/127\.0\.0\.1(:\d+)?/,
|
|
23
|
+
/\.agentvault\.chat/,
|
|
24
|
+
/\.agentvault\.dev/,
|
|
25
|
+
/\.clerk\./,
|
|
26
|
+
];
|
|
27
|
+
let installed = false;
|
|
28
|
+
let originalFetch;
|
|
29
|
+
// Track in-flight undici requests: request → { url, method, startTime }
|
|
30
|
+
const inflightRequests = new WeakMap();
|
|
31
|
+
// Diagnostics channel subscriptions
|
|
32
|
+
let unsubCreate;
|
|
33
|
+
let unsubHeaders;
|
|
34
|
+
let unsubError;
|
|
35
|
+
// ── Helpers ───────────────────────────────────────────────────────────
|
|
36
|
+
function shouldSkip(url, extraPatterns) {
|
|
37
|
+
const allPatterns = [...DEFAULT_SKIP_PATTERNS, ...extraPatterns];
|
|
38
|
+
return allPatterns.some((p) => p.test(url));
|
|
39
|
+
}
|
|
40
|
+
function extractUrl(origin, path) {
|
|
41
|
+
// undici gives us origin (e.g., "https://api.openai.com") and path (e.g., "/v1/chat/completions")
|
|
42
|
+
return `${origin}${path}`;
|
|
43
|
+
}
|
|
44
|
+
// ── Public API ────────────────────────────────────────────────────────
|
|
45
|
+
/**
|
|
46
|
+
* Install HTTP interceptor using both undici diagnostics channels and
|
|
47
|
+
* globalThis.fetch monkey-patching. Idempotent.
|
|
48
|
+
*/
|
|
49
|
+
export function installFetchInterceptor(opts) {
|
|
50
|
+
if (installed)
|
|
51
|
+
return;
|
|
52
|
+
installed = true;
|
|
53
|
+
const skipPatterns = [
|
|
54
|
+
...DEFAULT_SKIP_PATTERNS,
|
|
55
|
+
...(opts.skipPatterns ?? []),
|
|
56
|
+
];
|
|
57
|
+
// ── 1. Undici diagnostics channel ──────────────────────────────────
|
|
58
|
+
// undici publishes events for every HTTP request it makes.
|
|
59
|
+
// This captures LLM SDK calls, playwright navigations, etc.
|
|
60
|
+
try {
|
|
61
|
+
const createChannel = diagnosticsChannel.channel("undici:request:create");
|
|
62
|
+
const headersChannel = diagnosticsChannel.channel("undici:request:headers");
|
|
63
|
+
const errorChannel = diagnosticsChannel.channel("undici:request:error");
|
|
64
|
+
const onRequestCreate = (message) => {
|
|
65
|
+
try {
|
|
66
|
+
const msg = message;
|
|
67
|
+
const req = msg.request;
|
|
68
|
+
if (!req)
|
|
69
|
+
return;
|
|
70
|
+
const origin = String(req.origin ?? "");
|
|
71
|
+
const path = String(req.path ?? "/");
|
|
72
|
+
const url = extractUrl(origin, path);
|
|
73
|
+
if (shouldSkip(url, skipPatterns))
|
|
74
|
+
return;
|
|
75
|
+
inflightRequests.set(req, {
|
|
76
|
+
url,
|
|
77
|
+
method: String(req.method ?? "GET").toUpperCase(),
|
|
78
|
+
startTime: Date.now(),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
catch { /* best-effort */ }
|
|
82
|
+
};
|
|
83
|
+
const onRequestHeaders = (message) => {
|
|
84
|
+
try {
|
|
85
|
+
const msg = message;
|
|
86
|
+
const tracked = inflightRequests.get(msg.request);
|
|
87
|
+
if (!tracked)
|
|
88
|
+
return;
|
|
89
|
+
inflightRequests.delete(msg.request);
|
|
90
|
+
const latencyMs = Date.now() - tracked.startTime;
|
|
91
|
+
const ctx = traceStore.getStore();
|
|
92
|
+
opts.onHttpCall({
|
|
93
|
+
method: tracked.method,
|
|
94
|
+
url: tracked.url,
|
|
95
|
+
statusCode: msg.response?.statusCode ?? 0,
|
|
96
|
+
latencyMs,
|
|
97
|
+
traceId: ctx?.traceId,
|
|
98
|
+
parentSpanId: ctx?.parentSpanId,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
catch { /* best-effort */ }
|
|
102
|
+
};
|
|
103
|
+
const onRequestError = (message) => {
|
|
104
|
+
try {
|
|
105
|
+
const msg = message;
|
|
106
|
+
const tracked = inflightRequests.get(msg.request);
|
|
107
|
+
if (!tracked)
|
|
108
|
+
return;
|
|
109
|
+
inflightRequests.delete(msg.request);
|
|
110
|
+
const latencyMs = Date.now() - tracked.startTime;
|
|
111
|
+
const ctx = traceStore.getStore();
|
|
112
|
+
opts.onHttpCall({
|
|
113
|
+
method: tracked.method,
|
|
114
|
+
url: tracked.url,
|
|
115
|
+
statusCode: 0,
|
|
116
|
+
latencyMs,
|
|
117
|
+
traceId: ctx?.traceId,
|
|
118
|
+
parentSpanId: ctx?.parentSpanId,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
catch { /* best-effort */ }
|
|
122
|
+
};
|
|
123
|
+
createChannel.subscribe(onRequestCreate);
|
|
124
|
+
headersChannel.subscribe(onRequestHeaders);
|
|
125
|
+
errorChannel.subscribe(onRequestError);
|
|
126
|
+
unsubCreate = () => createChannel.unsubscribe(onRequestCreate);
|
|
127
|
+
unsubHeaders = () => headersChannel.unsubscribe(onRequestHeaders);
|
|
128
|
+
unsubError = () => errorChannel.unsubscribe(onRequestError);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// diagnostics_channel not available or undici not loaded — fall through to fetch-only
|
|
132
|
+
}
|
|
133
|
+
// ── 2. globalThis.fetch monkey-patch (fallback) ────────────────────
|
|
134
|
+
// Catches any HTTP that doesn't go through undici (e.g., native fetch
|
|
135
|
+
// in newer Node.js, or custom HTTP implementations).
|
|
136
|
+
originalFetch = globalThis.fetch;
|
|
137
|
+
const savedOriginal = originalFetch;
|
|
138
|
+
globalThis.fetch = async (input, init) => {
|
|
139
|
+
const url = input instanceof Request
|
|
140
|
+
? input.url
|
|
141
|
+
: input instanceof URL
|
|
142
|
+
? input.href
|
|
143
|
+
: String(input);
|
|
144
|
+
if (shouldSkip(url, skipPatterns)) {
|
|
145
|
+
return savedOriginal(input, init);
|
|
146
|
+
}
|
|
147
|
+
const method = input instanceof Request
|
|
148
|
+
? input.method
|
|
149
|
+
: init?.method ?? "GET";
|
|
150
|
+
const ctx = traceStore.getStore();
|
|
151
|
+
const start = Date.now();
|
|
152
|
+
try {
|
|
153
|
+
const response = await savedOriginal(input, init);
|
|
154
|
+
const latencyMs = Date.now() - start;
|
|
155
|
+
try {
|
|
156
|
+
opts.onHttpCall({
|
|
157
|
+
method,
|
|
158
|
+
url,
|
|
159
|
+
statusCode: response.status,
|
|
160
|
+
latencyMs,
|
|
161
|
+
traceId: ctx?.traceId,
|
|
162
|
+
parentSpanId: ctx?.parentSpanId,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
catch { /* best-effort */ }
|
|
166
|
+
return response;
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
const latencyMs = Date.now() - start;
|
|
170
|
+
try {
|
|
171
|
+
opts.onHttpCall({
|
|
172
|
+
method,
|
|
173
|
+
url,
|
|
174
|
+
statusCode: 0,
|
|
175
|
+
latencyMs,
|
|
176
|
+
traceId: ctx?.traceId,
|
|
177
|
+
parentSpanId: ctx?.parentSpanId,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
catch { /* best-effort */ }
|
|
181
|
+
throw err;
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Uninstall all interceptors. Safe to call even if not installed.
|
|
187
|
+
*/
|
|
188
|
+
export function uninstallFetchInterceptor() {
|
|
189
|
+
if (!installed)
|
|
190
|
+
return;
|
|
191
|
+
// Restore fetch
|
|
192
|
+
if (originalFetch) {
|
|
193
|
+
globalThis.fetch = originalFetch;
|
|
194
|
+
originalFetch = undefined;
|
|
195
|
+
}
|
|
196
|
+
// Unsubscribe from diagnostics channels
|
|
197
|
+
unsubCreate?.();
|
|
198
|
+
unsubHeaders?.();
|
|
199
|
+
unsubError?.();
|
|
200
|
+
unsubCreate = undefined;
|
|
201
|
+
unsubHeaders = undefined;
|
|
202
|
+
unsubError = undefined;
|
|
203
|
+
installed = false;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Run an async function with trace context attached via AsyncLocalStorage.
|
|
207
|
+
* Any HTTP calls made within `fn` (via undici or fetch) will include
|
|
208
|
+
* traceId/parentSpanId in their HttpCallReport.
|
|
209
|
+
*/
|
|
210
|
+
export function runWithTraceContext(ctx, fn) {
|
|
211
|
+
return traceStore.run(ctx, fn);
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=fetch-interceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-interceptor.js","sourceRoot":"","sources":["../src/fetch-interceptor.ts"],"names":[],"mappings":"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"}
|