agent-dir 0.1.4 → 0.3.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 +107 -5
- package/dist/bin/agent-dir.js +262 -12
- package/dist/bin/agent-dir.js.map +1 -1
- package/dist/src/auth.d.ts.map +1 -1
- package/dist/src/auth.js +10 -2
- package/dist/src/auth.js.map +1 -1
- package/dist/src/codegraph.d.ts +33 -0
- package/dist/src/codegraph.d.ts.map +1 -0
- package/dist/src/codegraph.js +265 -0
- package/dist/src/codegraph.js.map +1 -0
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +14 -0
- package/dist/src/config.js.map +1 -1
- package/dist/src/logging.d.ts +2 -0
- package/dist/src/logging.d.ts.map +1 -1
- package/dist/src/logging.js +36 -10
- package/dist/src/logging.js.map +1 -1
- package/dist/src/mcp.d.ts +4 -1
- package/dist/src/mcp.d.ts.map +1 -1
- package/dist/src/mcp.js +1021 -98
- package/dist/src/mcp.js.map +1 -1
- package/dist/src/server.d.ts +1 -1
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +7 -10
- package/dist/src/server.js.map +1 -1
- package/dist/src/setup.d.ts +9 -0
- package/dist/src/setup.d.ts.map +1 -0
- package/dist/src/setup.js +215 -0
- package/dist/src/setup.js.map +1 -0
- package/dist/src/telemetry/aggregate.d.ts +58 -0
- package/dist/src/telemetry/aggregate.d.ts.map +1 -0
- package/dist/src/telemetry/aggregate.js +184 -0
- package/dist/src/telemetry/aggregate.js.map +1 -0
- package/dist/src/telemetry/config.d.ts +5 -0
- package/dist/src/telemetry/config.d.ts.map +1 -0
- package/dist/src/telemetry/config.js +16 -0
- package/dist/src/telemetry/config.js.map +1 -0
- package/dist/src/telemetry/format.d.ts +3 -0
- package/dist/src/telemetry/format.d.ts.map +1 -0
- package/dist/src/telemetry/format.js +87 -0
- package/dist/src/telemetry/format.js.map +1 -0
- package/dist/src/telemetry/privacy.d.ts +4 -0
- package/dist/src/telemetry/privacy.d.ts.map +1 -0
- package/dist/src/telemetry/privacy.js +145 -0
- package/dist/src/telemetry/privacy.js.map +1 -0
- package/dist/src/telemetry/recorder.d.ts +30 -0
- package/dist/src/telemetry/recorder.d.ts.map +1 -0
- package/dist/src/telemetry/recorder.js +98 -0
- package/dist/src/telemetry/recorder.js.map +1 -0
- package/dist/src/telemetry/types.d.ts +74 -0
- package/dist/src/telemetry/types.d.ts.map +1 -0
- package/dist/src/telemetry/types.js +2 -0
- package/dist/src/telemetry/types.js.map +1 -0
- package/dist/src/tools/code.d.ts +7 -7
- package/dist/src/tools/code.d.ts.map +1 -1
- package/dist/src/tools/code.js +49 -16
- package/dist/src/tools/code.js.map +1 -1
- package/dist/src/tools/commands.d.ts +2 -1
- package/dist/src/tools/commands.d.ts.map +1 -1
- package/dist/src/tools/commands.js +10 -1
- package/dist/src/tools/commands.js.map +1 -1
- package/dist/src/tools/files.d.ts +19 -0
- package/dist/src/tools/files.d.ts.map +1 -1
- package/dist/src/tools/files.js +119 -0
- package/dist/src/tools/files.js.map +1 -1
- package/dist/src/types.d.ts +7 -0
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +5 -3
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { constants } from "node:fs";
|
|
3
|
+
import { access } from "node:fs/promises";
|
|
4
|
+
import { resolve } from "node:path";
|
|
5
|
+
import { stdin as input, stdout as output } from "node:process";
|
|
6
|
+
import { createInterface } from "node:readline/promises";
|
|
7
|
+
import { configPath, saveConfig } from "./config.js";
|
|
8
|
+
export async function hasConfigFile() {
|
|
9
|
+
try {
|
|
10
|
+
await access(configPath(), constants.F_OK);
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function shouldOfferSetup(configExists, options) {
|
|
18
|
+
return !configExists && !options.random && !options.noTunnel && options.tunnel === undefined;
|
|
19
|
+
}
|
|
20
|
+
const ANSI = {
|
|
21
|
+
reset: "\x1b[0m",
|
|
22
|
+
bold: "\x1b[1m",
|
|
23
|
+
dim: "\x1b[2m",
|
|
24
|
+
cyan: "\x1b[36m",
|
|
25
|
+
blue: "\x1b[34m",
|
|
26
|
+
green: "\x1b[32m",
|
|
27
|
+
yellow: "\x1b[33m",
|
|
28
|
+
red: "\x1b[31m",
|
|
29
|
+
white: "\x1b[37m",
|
|
30
|
+
};
|
|
31
|
+
const useColor = process.stdout.isTTY;
|
|
32
|
+
const color = (code, value) => useColor ? `${code}${value}${ANSI.reset}` : value;
|
|
33
|
+
const bold = (value) => color(ANSI.bold, value);
|
|
34
|
+
const dim = (value) => color(ANSI.dim, value);
|
|
35
|
+
const title = (value) => color(ANSI.cyan, value);
|
|
36
|
+
const section = (value) => color(ANSI.blue, value);
|
|
37
|
+
const success = (value) => color(ANSI.green, value);
|
|
38
|
+
const warning = (value) => color(ANSI.yellow, value);
|
|
39
|
+
const error = (value) => color(ANSI.red, value);
|
|
40
|
+
const white = (value) => color(ANSI.white, value);
|
|
41
|
+
const cyan = (value) => color(ANSI.cyan, value);
|
|
42
|
+
const green = (value) => color(ANSI.green, value);
|
|
43
|
+
const rule = (char = "─", width = 62) => dim(char.repeat(width));
|
|
44
|
+
const ansiCodes = Object.values(ANSI);
|
|
45
|
+
const visibleLength = (value) => ansiCodes.reduce((result, code) => result.replaceAll(code, ""), value).length;
|
|
46
|
+
const wrapBoxLine = (line, maxLength) => {
|
|
47
|
+
if (visibleLength(line) <= maxLength)
|
|
48
|
+
return [line];
|
|
49
|
+
const style = ansiCodes.find((code) => line.startsWith(code)) ?? "";
|
|
50
|
+
const plain = ansiCodes.reduce((result, code) => result.replaceAll(code, ""), line);
|
|
51
|
+
const words = plain.split(" ").filter(Boolean);
|
|
52
|
+
const chunks = [];
|
|
53
|
+
let current = "";
|
|
54
|
+
for (const word of words) {
|
|
55
|
+
if (!current)
|
|
56
|
+
current = word;
|
|
57
|
+
else if (current.length + word.length + 1 <= maxLength)
|
|
58
|
+
current += ` ${word}`;
|
|
59
|
+
else {
|
|
60
|
+
chunks.push(current);
|
|
61
|
+
current = word;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (current)
|
|
65
|
+
chunks.push(current);
|
|
66
|
+
return chunks.map((chunk) => (style ? `${style}${chunk}${ANSI.reset}` : chunk));
|
|
67
|
+
};
|
|
68
|
+
const box = (lines, width = 62) => {
|
|
69
|
+
const innerWidth = width - 2;
|
|
70
|
+
const wrappedLines = lines.flatMap((line) => wrapBoxLine(line, innerWidth - 1));
|
|
71
|
+
return [
|
|
72
|
+
dim(`╭${"─".repeat(innerWidth)}╮`),
|
|
73
|
+
...wrappedLines.map((line) => {
|
|
74
|
+
const length = visibleLength(line);
|
|
75
|
+
return `${dim("│")} ${line}${" ".repeat(Math.max(0, innerWidth - length - 1))}${dim("│")}`;
|
|
76
|
+
}),
|
|
77
|
+
dim(`╰${"─".repeat(innerWidth)}╯`),
|
|
78
|
+
];
|
|
79
|
+
};
|
|
80
|
+
const printBox = (lines, width = 62) => {
|
|
81
|
+
for (const line of box(lines, width))
|
|
82
|
+
console.log(line);
|
|
83
|
+
};
|
|
84
|
+
export async function runFirstTimeSetup(config, defaultDirectory = ".") {
|
|
85
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY)
|
|
86
|
+
return null;
|
|
87
|
+
const rl = createInterface({ input, output });
|
|
88
|
+
try {
|
|
89
|
+
console.log("");
|
|
90
|
+
printBox([
|
|
91
|
+
`${title(bold("AGENT-DIR"))} ${white(bold("first-time setup"))}`,
|
|
92
|
+
"",
|
|
93
|
+
dim("Create a saved profile or start a temporary random Wormhole link."),
|
|
94
|
+
`${dim("Config")} ${white(configPath())}`,
|
|
95
|
+
]);
|
|
96
|
+
if (!(await confirm(rl, "Set up a saved profile now?", true))) {
|
|
97
|
+
console.log("");
|
|
98
|
+
printBox([warning(bold("Setup skipped")), dim("Starting a temporary random Wormhole link.")]);
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
console.log("");
|
|
102
|
+
console.log(`${section("◆")} ${section(bold("Profile"))}`);
|
|
103
|
+
console.log(rule());
|
|
104
|
+
const name = await requiredText(rl, "Profile name", "default");
|
|
105
|
+
const directory = resolve(await requiredText(rl, "Directory to expose", defaultDirectory));
|
|
106
|
+
const port = await requiredPort(rl, 3002);
|
|
107
|
+
const tunnel = await choose(rl, "Tunnel", ["wormhole", "none"], "wormhole");
|
|
108
|
+
let subdomain;
|
|
109
|
+
if (tunnel === "wormhole" &&
|
|
110
|
+
(await confirm(rl, "Use a custom Wormhole subdomain? (No uses a random URL.)", false))) {
|
|
111
|
+
subdomain = await requiredText(rl, "Wormhole subdomain");
|
|
112
|
+
}
|
|
113
|
+
const npm = await optionalList(rl, "Allowed npm scripts (comma-separated, blank for none)");
|
|
114
|
+
const commands = await optionalList(rl, "Allowed commands (comma-separated, blank for none)");
|
|
115
|
+
console.log("");
|
|
116
|
+
console.log(`${section("◆")} ${section(bold("Telemetry"))}`);
|
|
117
|
+
console.log(rule());
|
|
118
|
+
printBox([
|
|
119
|
+
bold("Privacy first"),
|
|
120
|
+
dim("Telemetry is optional and stays local on this machine."),
|
|
121
|
+
dim("It helps us understand usage, failures, and reliability improvements."),
|
|
122
|
+
dim("Never records file contents, command arguments, tokens,"),
|
|
123
|
+
dim("environment variables, or project paths."),
|
|
124
|
+
]);
|
|
125
|
+
console.log("");
|
|
126
|
+
console.log(` ${green("●")} ${white("none")} ${dim("disabled")}`);
|
|
127
|
+
console.log(` ${cyan("●")} ${white("anonymous")} ${dim("usage/tool metrics, success, duration, sizes, safe errors")}`);
|
|
128
|
+
console.log(` ${cyan("●")} ${white("basic")} ${dim("anonymous + Agent Dir, Node, platform, MCP client version")}`);
|
|
129
|
+
console.log(` ${cyan("●")} ${white("detailed")} ${dim("basic + coarse language, package manager, Git, CodeGraph, project size")}`);
|
|
130
|
+
console.log("");
|
|
131
|
+
const telemetry = await choose(rl, "Telemetry level", ["none", "anonymous", "basic", "detailed"], "none");
|
|
132
|
+
const profile = { directory, port, tunnel, token: randomBytes(24).toString("hex") };
|
|
133
|
+
if (subdomain)
|
|
134
|
+
profile.subdomain = subdomain;
|
|
135
|
+
if (npm.length)
|
|
136
|
+
profile.npm = { allowedScripts: npm };
|
|
137
|
+
if (commands.length)
|
|
138
|
+
profile.commands = commands;
|
|
139
|
+
config.profiles[name] = profile;
|
|
140
|
+
config.telemetry = { level: telemetry };
|
|
141
|
+
await saveConfig(config);
|
|
142
|
+
console.log("");
|
|
143
|
+
printBox([
|
|
144
|
+
success(bold("✓ Setup complete")),
|
|
145
|
+
"",
|
|
146
|
+
`${dim("Profile")} ${bold(name)}`,
|
|
147
|
+
`${dim("Directory")} ${directory}`,
|
|
148
|
+
`${dim("Tunnel")} ${tunnel}`,
|
|
149
|
+
`${dim("Telemetry")} ${telemetry}`,
|
|
150
|
+
]);
|
|
151
|
+
console.log("");
|
|
152
|
+
console.log(` ${dim("Config")} ${white(configPath())}`);
|
|
153
|
+
console.log(` ${dim("Next")} ${cyan(`agent-dir ${name}`)}`);
|
|
154
|
+
return name;
|
|
155
|
+
}
|
|
156
|
+
finally {
|
|
157
|
+
rl.close();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
async function requiredText(rl, label, defaultValue) {
|
|
161
|
+
while (true) {
|
|
162
|
+
const suffix = defaultValue ? ` ${dim(`[${defaultValue}]`)}` : "";
|
|
163
|
+
const value = (await rl.question(` ${bold(label)}${suffix}: `)).trim() || defaultValue;
|
|
164
|
+
if (value)
|
|
165
|
+
return value;
|
|
166
|
+
console.log(` ${error("✕")} ${dim("A value is required.")}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
async function requiredPort(rl, defaultValue) {
|
|
170
|
+
while (true) {
|
|
171
|
+
const value = (await rl.question(` ${bold("Port")} ${dim(`[${defaultValue}]`)}: `)).trim() ||
|
|
172
|
+
String(defaultValue);
|
|
173
|
+
const port = Number(value);
|
|
174
|
+
if (Number.isInteger(port) && port >= 1 && port <= 65535)
|
|
175
|
+
return port;
|
|
176
|
+
console.log(` ${error("✕")} ${dim("Port must be an integer between 1 and 65535.")}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
async function optionalList(rl, label) {
|
|
180
|
+
return (await rl.question(` ${bold(label)}: `))
|
|
181
|
+
.split(",")
|
|
182
|
+
.map((item) => item.trim())
|
|
183
|
+
.filter(Boolean);
|
|
184
|
+
}
|
|
185
|
+
async function confirm(rl, label, defaultValue) {
|
|
186
|
+
while (true) {
|
|
187
|
+
const value = (await rl.question(` ${bold(label)} ${dim(`[${defaultValue ? "Y/n" : "y/N"}]`)}: `))
|
|
188
|
+
.trim()
|
|
189
|
+
.toLowerCase();
|
|
190
|
+
if (!value)
|
|
191
|
+
return defaultValue;
|
|
192
|
+
if (value === "y" || value === "yes")
|
|
193
|
+
return true;
|
|
194
|
+
if (value === "n" || value === "no")
|
|
195
|
+
return false;
|
|
196
|
+
console.log(` ${error("✕")} ${dim("Please answer yes or no.")}`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
async function choose(rl, label, choices, defaultValue) {
|
|
200
|
+
console.log(` ${bold(label)}:`);
|
|
201
|
+
choices.forEach((choice, index) => {
|
|
202
|
+
const marker = choice === defaultValue ? green(" • default") : "";
|
|
203
|
+
console.log(` ${color(ANSI.cyan, `${index + 1})`)} ${choice}${marker}`);
|
|
204
|
+
});
|
|
205
|
+
while (true) {
|
|
206
|
+
const value = (await rl.question(` ${bold("Choose")} ${dim(`[${choices.indexOf(defaultValue) + 1}]`)}: `)).trim();
|
|
207
|
+
if (!value)
|
|
208
|
+
return defaultValue;
|
|
209
|
+
const selected = choices[Number(value) - 1];
|
|
210
|
+
if (selected)
|
|
211
|
+
return selected;
|
|
212
|
+
console.log(` ${error("✕")} ${dim(`Choose a number from 1 to ${choices.length}.`)}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { TelemetryEnvelope } from "./types.js";
|
|
2
|
+
export interface TelemetrySummary {
|
|
3
|
+
configCount: number;
|
|
4
|
+
totalEvents: number;
|
|
5
|
+
configs: Record<string, {
|
|
6
|
+
eventCount: number;
|
|
7
|
+
mcpRequests: number;
|
|
8
|
+
toolCalls: number;
|
|
9
|
+
commandCalls: number;
|
|
10
|
+
mcpSuccessRate: number | null;
|
|
11
|
+
toolSuccessRate: number | null;
|
|
12
|
+
commandSuccessRate: number | null;
|
|
13
|
+
failuresByCategory: {
|
|
14
|
+
mcp: Record<string, number>;
|
|
15
|
+
tool: Record<string, number>;
|
|
16
|
+
command: Record<string, number>;
|
|
17
|
+
};
|
|
18
|
+
tools: Record<string, {
|
|
19
|
+
calls: number;
|
|
20
|
+
successes: number;
|
|
21
|
+
failures: number;
|
|
22
|
+
successRate: number;
|
|
23
|
+
avgDurationMs: number;
|
|
24
|
+
p95DurationMs: number;
|
|
25
|
+
}>;
|
|
26
|
+
commands: Record<string, {
|
|
27
|
+
calls: number;
|
|
28
|
+
successes: number;
|
|
29
|
+
failures: number;
|
|
30
|
+
successRate: number;
|
|
31
|
+
avgDurationMs: number;
|
|
32
|
+
p95DurationMs: number;
|
|
33
|
+
}>;
|
|
34
|
+
legacySessionEvents: number;
|
|
35
|
+
sessions: Record<string, {
|
|
36
|
+
eventCount: number;
|
|
37
|
+
mcpRequests: number;
|
|
38
|
+
toolCalls: number;
|
|
39
|
+
commandCalls: number;
|
|
40
|
+
mcpSuccessRate: number | null;
|
|
41
|
+
toolSuccessRate: number | null;
|
|
42
|
+
commandSuccessRate: number | null;
|
|
43
|
+
failuresByCategory: {
|
|
44
|
+
mcp: Record<string, number>;
|
|
45
|
+
tool: Record<string, number>;
|
|
46
|
+
command: Record<string, number>;
|
|
47
|
+
};
|
|
48
|
+
wallClockDurationMs?: number;
|
|
49
|
+
activeRequestDurationMs?: number;
|
|
50
|
+
idleGapDurationMs?: number;
|
|
51
|
+
requestCount?: number;
|
|
52
|
+
toolCallCount?: number;
|
|
53
|
+
commandCallCount?: number;
|
|
54
|
+
}>;
|
|
55
|
+
}>;
|
|
56
|
+
}
|
|
57
|
+
export declare function summarizeTelemetry(events: TelemetryEnvelope[]): TelemetrySummary;
|
|
58
|
+
//# sourceMappingURL=aggregate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregate.d.ts","sourceRoot":"","sources":["../../../src/telemetry/aggregate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CACb,MAAM,EACN;QACE,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;QAC/B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,kBAAkB,EAAE;YAClB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SACjC,CAAC;QACF,KAAK,EAAE,MAAM,CACX,MAAM,EACN;YACE,KAAK,EAAE,MAAM,CAAC;YACd,SAAS,EAAE,MAAM,CAAC;YAClB,QAAQ,EAAE,MAAM,CAAC;YACjB,WAAW,EAAE,MAAM,CAAC;YACpB,aAAa,EAAE,MAAM,CAAC;YACtB,aAAa,EAAE,MAAM,CAAC;SACvB,CACF,CAAC;QACF,QAAQ,EAAE,MAAM,CACd,MAAM,EACN;YACE,KAAK,EAAE,MAAM,CAAC;YACd,SAAS,EAAE,MAAM,CAAC;YAClB,QAAQ,EAAE,MAAM,CAAC;YACjB,WAAW,EAAE,MAAM,CAAC;YACpB,aAAa,EAAE,MAAM,CAAC;YACtB,aAAa,EAAE,MAAM,CAAC;SACvB,CACF,CAAC;QACF,mBAAmB,EAAE,MAAM,CAAC;QAC5B,QAAQ,EAAE,MAAM,CACd,MAAM,EACN;YACE,UAAU,EAAE,MAAM,CAAC;YACnB,WAAW,EAAE,MAAM,CAAC;YACpB,SAAS,EAAE,MAAM,CAAC;YAClB,YAAY,EAAE,MAAM,CAAC;YACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;YAC9B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;YAC/B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;YAClC,kBAAkB,EAAE;gBAClB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;aACjC,CAAC;YACF,mBAAmB,CAAC,EAAE,MAAM,CAAC;YAC7B,uBAAuB,CAAC,EAAE,MAAM,CAAC;YACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;YAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,aAAa,CAAC,EAAE,MAAM,CAAC;YACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;SAC3B,CACF,CAAC;KACH,CACF,CAAC;CACH;AAsDD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,gBAAgB,CAkMhF"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
function bucket() {
|
|
2
|
+
return { eventCount: 0, successes: 0, failures: 0, durations: [], failuresByCategory: {} };
|
|
3
|
+
}
|
|
4
|
+
function p95(values) {
|
|
5
|
+
if (values.length === 0)
|
|
6
|
+
return 0;
|
|
7
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
8
|
+
return sorted[Math.min(sorted.length - 1, Math.ceil(sorted.length * 0.95) - 1)] ?? 0;
|
|
9
|
+
}
|
|
10
|
+
function rate(successes, total) {
|
|
11
|
+
return total === 0 ? 0 : Math.round((successes / total) * 1000) / 10;
|
|
12
|
+
}
|
|
13
|
+
function rateForEvents(events, kind) {
|
|
14
|
+
const matching = events.filter((item) => item.event.event === kind);
|
|
15
|
+
return matching.length === 0
|
|
16
|
+
? null
|
|
17
|
+
: rate(matching.filter((item) => item.event.event !== "session" && item.event.success).length, matching.length);
|
|
18
|
+
}
|
|
19
|
+
function collectFailures(events, kind) {
|
|
20
|
+
const failures = {};
|
|
21
|
+
for (const envelope of events) {
|
|
22
|
+
if (envelope.event.event !== kind || envelope.event.success || !envelope.event.errorCategory)
|
|
23
|
+
continue;
|
|
24
|
+
failures[envelope.event.errorCategory] = (failures[envelope.event.errorCategory] ?? 0) + 1;
|
|
25
|
+
}
|
|
26
|
+
return failures;
|
|
27
|
+
}
|
|
28
|
+
function round(value) {
|
|
29
|
+
return Math.round(value * 10) / 10;
|
|
30
|
+
}
|
|
31
|
+
export function summarizeTelemetry(events) {
|
|
32
|
+
const groups = new Map();
|
|
33
|
+
for (const event of events) {
|
|
34
|
+
const configId = event.configId || "unknown";
|
|
35
|
+
const group = groups.get(configId) ?? [];
|
|
36
|
+
group.push(event);
|
|
37
|
+
groups.set(configId, group);
|
|
38
|
+
}
|
|
39
|
+
const configs = {};
|
|
40
|
+
for (const [configId, group] of groups) {
|
|
41
|
+
const tools = new Map();
|
|
42
|
+
const commands = new Map();
|
|
43
|
+
const sessions = new Map();
|
|
44
|
+
let legacySessionEvents = 0;
|
|
45
|
+
let mcpRequests = 0;
|
|
46
|
+
let toolCalls = 0;
|
|
47
|
+
let commandCalls = 0;
|
|
48
|
+
for (const envelope of group) {
|
|
49
|
+
const event = envelope.event;
|
|
50
|
+
const session = sessions.get(envelope.sessionId) ?? {
|
|
51
|
+
eventCount: 0,
|
|
52
|
+
mcpRequests: 0,
|
|
53
|
+
toolCalls: 0,
|
|
54
|
+
commandCalls: 0,
|
|
55
|
+
successes: 0,
|
|
56
|
+
failures: 0,
|
|
57
|
+
failuresByCategory: { mcp: {}, tool: {}, command: {} },
|
|
58
|
+
};
|
|
59
|
+
session.eventCount += 1;
|
|
60
|
+
if (event.event === "session") {
|
|
61
|
+
if (Number.isFinite(event.wallClockDurationMs) &&
|
|
62
|
+
Number.isFinite(event.activeRequestDurationMs) &&
|
|
63
|
+
Number.isFinite(event.idleGapDurationMs)) {
|
|
64
|
+
session.wallClockDurationMs = event.wallClockDurationMs;
|
|
65
|
+
session.activeRequestDurationMs = event.activeRequestDurationMs;
|
|
66
|
+
session.idleGapDurationMs = event.idleGapDurationMs;
|
|
67
|
+
session.requestCount = event.requestCount;
|
|
68
|
+
session.toolCallCount = event.toolCallCount;
|
|
69
|
+
session.commandCallCount = event.commandCallCount;
|
|
70
|
+
}
|
|
71
|
+
else
|
|
72
|
+
legacySessionEvents += 1;
|
|
73
|
+
sessions.set(envelope.sessionId, session);
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
session.successes += event.success ? 1 : 0;
|
|
77
|
+
session.failures += event.success ? 0 : 1;
|
|
78
|
+
if (!event.success && event.errorCategory) {
|
|
79
|
+
const kind = event.event === "mcp_request" ? "mcp" : event.event === "tool_call" ? "tool" : "command";
|
|
80
|
+
session.failuresByCategory[kind][event.errorCategory] =
|
|
81
|
+
(session.failuresByCategory[kind][event.errorCategory] ?? 0) + 1;
|
|
82
|
+
}
|
|
83
|
+
if (event.event === "mcp_request")
|
|
84
|
+
session.mcpRequests += 1;
|
|
85
|
+
if (event.event === "tool_call")
|
|
86
|
+
session.toolCalls += 1;
|
|
87
|
+
if (event.event === "command_call")
|
|
88
|
+
session.commandCalls += 1;
|
|
89
|
+
sessions.set(envelope.sessionId, session);
|
|
90
|
+
if (event.event === "mcp_request") {
|
|
91
|
+
mcpRequests += 1;
|
|
92
|
+
}
|
|
93
|
+
else if (event.event === "tool_call") {
|
|
94
|
+
toolCalls += 1;
|
|
95
|
+
const item = tools.get(event.tool) ?? bucket();
|
|
96
|
+
item.eventCount += 1;
|
|
97
|
+
item.successes += event.success ? 1 : 0;
|
|
98
|
+
item.failures += event.success ? 0 : 1;
|
|
99
|
+
item.durations.push(event.durationMs);
|
|
100
|
+
if (!event.success && event.errorCategory) {
|
|
101
|
+
item.failuresByCategory[event.errorCategory] =
|
|
102
|
+
(item.failuresByCategory[event.errorCategory] ?? 0) + 1;
|
|
103
|
+
}
|
|
104
|
+
tools.set(event.tool, item);
|
|
105
|
+
}
|
|
106
|
+
else if (event.event === "command_call") {
|
|
107
|
+
commandCalls += 1;
|
|
108
|
+
const key = event.operation
|
|
109
|
+
? `${event.commandFamily}:${event.operation}`
|
|
110
|
+
: event.commandFamily;
|
|
111
|
+
const item = commands.get(key) ?? bucket();
|
|
112
|
+
item.eventCount += 1;
|
|
113
|
+
item.successes += event.success ? 1 : 0;
|
|
114
|
+
item.failures += event.success ? 0 : 1;
|
|
115
|
+
item.durations.push(event.durationMs);
|
|
116
|
+
if (!event.success && event.errorCategory) {
|
|
117
|
+
item.failuresByCategory[event.errorCategory] =
|
|
118
|
+
(item.failuresByCategory[event.errorCategory] ?? 0) + 1;
|
|
119
|
+
}
|
|
120
|
+
commands.set(key, item);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const mapBucket = (item) => ({
|
|
124
|
+
calls: item.eventCount,
|
|
125
|
+
successes: item.successes,
|
|
126
|
+
failures: item.failures,
|
|
127
|
+
successRate: rate(item.successes, item.eventCount),
|
|
128
|
+
avgDurationMs: round(item.durations.reduce((sum, value) => sum + value, 0) / (item.durations.length || 1)),
|
|
129
|
+
p95DurationMs: round(p95(item.durations)),
|
|
130
|
+
});
|
|
131
|
+
configs[configId] = {
|
|
132
|
+
eventCount: group.length,
|
|
133
|
+
mcpRequests,
|
|
134
|
+
toolCalls,
|
|
135
|
+
commandCalls,
|
|
136
|
+
mcpSuccessRate: rateForEvents(group, "mcp_request"),
|
|
137
|
+
toolSuccessRate: rateForEvents(group, "tool_call"),
|
|
138
|
+
commandSuccessRate: rateForEvents(group, "command_call"),
|
|
139
|
+
failuresByCategory: {
|
|
140
|
+
mcp: collectFailures(group, "mcp_request"),
|
|
141
|
+
tool: collectFailures(group, "tool_call"),
|
|
142
|
+
command: collectFailures(group, "command_call"),
|
|
143
|
+
},
|
|
144
|
+
tools: Object.fromEntries([...tools.entries()].map(([name, item]) => [name, mapBucket(item)])),
|
|
145
|
+
commands: Object.fromEntries([...commands.entries()].map(([name, item]) => [name, mapBucket(item)])),
|
|
146
|
+
legacySessionEvents,
|
|
147
|
+
sessions: Object.fromEntries([...sessions.entries()].map(([sessionId, session]) => [
|
|
148
|
+
sessionId,
|
|
149
|
+
{
|
|
150
|
+
eventCount: session.eventCount,
|
|
151
|
+
mcpRequests: session.mcpRequests,
|
|
152
|
+
toolCalls: session.toolCalls,
|
|
153
|
+
commandCalls: session.commandCalls,
|
|
154
|
+
mcpSuccessRate: rateForEvents(group.filter((item) => item.sessionId === sessionId), "mcp_request"),
|
|
155
|
+
toolSuccessRate: rateForEvents(group.filter((item) => item.sessionId === sessionId), "tool_call"),
|
|
156
|
+
commandSuccessRate: rateForEvents(group.filter((item) => item.sessionId === sessionId), "command_call"),
|
|
157
|
+
failuresByCategory: session.failuresByCategory,
|
|
158
|
+
...(session.wallClockDurationMs === undefined
|
|
159
|
+
? {}
|
|
160
|
+
: { wallClockDurationMs: session.wallClockDurationMs }),
|
|
161
|
+
...(session.activeRequestDurationMs === undefined
|
|
162
|
+
? {}
|
|
163
|
+
: { activeRequestDurationMs: session.activeRequestDurationMs }),
|
|
164
|
+
...(session.idleGapDurationMs === undefined
|
|
165
|
+
? {}
|
|
166
|
+
: { idleGapDurationMs: session.idleGapDurationMs }),
|
|
167
|
+
...(session.requestCount === undefined ? {} : { requestCount: session.requestCount }),
|
|
168
|
+
...(session.toolCallCount === undefined
|
|
169
|
+
? {}
|
|
170
|
+
: { toolCallCount: session.toolCallCount }),
|
|
171
|
+
...(session.commandCallCount === undefined
|
|
172
|
+
? {}
|
|
173
|
+
: { commandCallCount: session.commandCallCount }),
|
|
174
|
+
},
|
|
175
|
+
])),
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
configCount: groups.size,
|
|
180
|
+
totalEvents: events.length,
|
|
181
|
+
configs,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=aggregate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../../../src/telemetry/aggregate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type TelemetryConfig, type TelemetryLevel } from "./types.js";
|
|
2
|
+
export declare const DEFAULT_TELEMETRY_CONFIG: TelemetryConfig;
|
|
3
|
+
export declare function isTelemetryLevel(value: unknown): value is TelemetryLevel;
|
|
4
|
+
export declare function parseTelemetryConfig(value: unknown): TelemetryConfig | undefined;
|
|
5
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/telemetry/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAEzF,eAAO,MAAM,wBAAwB,EAAE,eAAmC,CAAC;AAE3E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAExE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,GAAG,SAAS,CAMhF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { TELEMETRY_LEVELS } from "./types.js";
|
|
2
|
+
export const DEFAULT_TELEMETRY_CONFIG = { level: "none" };
|
|
3
|
+
export function isTelemetryLevel(value) {
|
|
4
|
+
return typeof value === "string" && TELEMETRY_LEVELS.includes(value);
|
|
5
|
+
}
|
|
6
|
+
export function parseTelemetryConfig(value) {
|
|
7
|
+
if (value === undefined)
|
|
8
|
+
return undefined;
|
|
9
|
+
if (!value || typeof value !== "object")
|
|
10
|
+
return undefined;
|
|
11
|
+
const level = value.level;
|
|
12
|
+
if (!isTelemetryLevel(level))
|
|
13
|
+
return undefined;
|
|
14
|
+
return { level };
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/telemetry/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAA6C,MAAM,YAAY,CAAC;AAEzF,MAAM,CAAC,MAAM,wBAAwB,GAAoB,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAE3E,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,gBAAgB,CAAC,QAAQ,CAAC,KAAuB,CAAC,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC1D,MAAM,KAAK,GAAI,KAAiC,CAAC,KAAK,CAAC;IACvD,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/telemetry/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAkDvD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAsGvF"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
function duration(ms) {
|
|
2
|
+
if (!Number.isFinite(ms))
|
|
3
|
+
return "—";
|
|
4
|
+
if (ms < 1000)
|
|
5
|
+
return `${Math.round(ms)}ms`;
|
|
6
|
+
const seconds = ms / 1000;
|
|
7
|
+
if (seconds < 60)
|
|
8
|
+
return `${seconds.toFixed(seconds < 10 ? 1 : 0)}s`;
|
|
9
|
+
const minutes = Math.floor(seconds / 60);
|
|
10
|
+
const remainingSeconds = Math.round(seconds % 60);
|
|
11
|
+
if (minutes < 60)
|
|
12
|
+
return `${minutes}m ${remainingSeconds}s`;
|
|
13
|
+
const hours = Math.floor(minutes / 60);
|
|
14
|
+
return `${hours}h ${minutes % 60}m`;
|
|
15
|
+
}
|
|
16
|
+
function rate(value) {
|
|
17
|
+
return value === null ? "—" : `${value.toFixed(1)}%`;
|
|
18
|
+
}
|
|
19
|
+
function line(char = "─", width = 66) {
|
|
20
|
+
return char.repeat(width);
|
|
21
|
+
}
|
|
22
|
+
function metric(label, value) {
|
|
23
|
+
return ` ${label.padEnd(24)}${value}`;
|
|
24
|
+
}
|
|
25
|
+
function formatTable(entries) {
|
|
26
|
+
if (entries.length === 0)
|
|
27
|
+
return [" None recorded."];
|
|
28
|
+
const sorted = [...entries].sort((a, b) => b.calls - a.calls || a.name.localeCompare(b.name));
|
|
29
|
+
const nameWidth = Math.min(28, Math.max(4, ...sorted.map((entry) => entry.name.length)));
|
|
30
|
+
return [
|
|
31
|
+
` ${"Name".padEnd(nameWidth)} Calls Success Avg P95`,
|
|
32
|
+
` ${"─".repeat(nameWidth)} ───── ─────── ─────── ───────`,
|
|
33
|
+
...sorted.map((entry) => ` ${entry.name.padEnd(nameWidth)} ${String(entry.calls).padStart(5)} ${rate(entry.successRate).padStart(7)} ${duration(entry.avgDurationMs).padStart(7)} ${duration(entry.p95DurationMs).padStart(7)}`),
|
|
34
|
+
];
|
|
35
|
+
}
|
|
36
|
+
export function formatTelemetrySummary(summary, level) {
|
|
37
|
+
const output = [
|
|
38
|
+
"",
|
|
39
|
+
" AGENT-DIR TELEMETRY SUMMARY",
|
|
40
|
+
` ${line()}`,
|
|
41
|
+
metric("Telemetry level", level),
|
|
42
|
+
metric("Configurations", summary.configCount),
|
|
43
|
+
metric("Recorded events", summary.totalEvents),
|
|
44
|
+
];
|
|
45
|
+
if (summary.configCount === 0) {
|
|
46
|
+
output.push("", " No telemetry events recorded.", "");
|
|
47
|
+
return output.join("\n");
|
|
48
|
+
}
|
|
49
|
+
for (const [configId, config] of Object.entries(summary.configs)) {
|
|
50
|
+
output.push("", ` CONFIGURATION ${configId}`, ` ${line("─", 66)}`, metric("Events", config.eventCount), metric("MCP requests", config.mcpRequests), metric("Tool calls", config.toolCalls), metric("Command calls", config.commandCalls), metric("MCP success", rate(config.mcpSuccessRate)), metric("Tool success", rate(config.toolSuccessRate)), metric("Command success", rate(config.commandSuccessRate)), "", " SESSIONS", metric("Sessions", Object.keys(config.sessions).length));
|
|
51
|
+
if (config.legacySessionEvents > 0) {
|
|
52
|
+
output.push(metric("Legacy sessions", config.legacySessionEvents), " Legacy session records are excluded from session averages.");
|
|
53
|
+
}
|
|
54
|
+
const sessionEntries = Object.entries(config.sessions);
|
|
55
|
+
if (sessionEntries.length > 0) {
|
|
56
|
+
output.push("", " SESSION DETAILS");
|
|
57
|
+
for (const [sessionId, session] of sessionEntries) {
|
|
58
|
+
output.push(` ${sessionId}`);
|
|
59
|
+
output.push(metric("Events", session.eventCount), metric("MCP requests", session.mcpRequests), metric("Tool calls", session.toolCalls), metric("Command calls", session.commandCalls), metric("MCP success", rate(session.mcpSuccessRate)), metric("Tool success", rate(session.toolSuccessRate)), metric("Command success", rate(session.commandSuccessRate)));
|
|
60
|
+
if (session.wallClockDurationMs !== undefined)
|
|
61
|
+
output.push(metric("Wall-clock", duration(session.wallClockDurationMs)), metric("Active requests", duration(session.activeRequestDurationMs ?? 0)), metric("Idle gaps", duration(session.idleGapDurationMs ?? 0)), metric("Requests/session", session.requestCount ?? 0), metric("Tools/session", session.toolCallCount ?? 0), metric("Commands/session", session.commandCallCount ?? 0));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
output.push("", " SUCCESS RATES", " MCP requests, tool calls, and command calls are measured separately.", " Do not combine them into one overall success rate.", "", " TOOL USAGE", ...formatTable(Object.entries(config.tools).map(([name, item]) => ({ name, ...item }))), "", " COMMAND USAGE", ...formatTable(Object.entries(config.commands).map(([name, item]) => ({ name, ...item }))));
|
|
65
|
+
output.push("", " FAILURES");
|
|
66
|
+
const failureGroups = [
|
|
67
|
+
["MCP", config.failuresByCategory.mcp],
|
|
68
|
+
["TOOLS", config.failuresByCategory.tool],
|
|
69
|
+
["COMMANDS", config.failuresByCategory.command],
|
|
70
|
+
];
|
|
71
|
+
let hasFailures = false;
|
|
72
|
+
for (const [label, failures] of failureGroups) {
|
|
73
|
+
const entries = Object.entries(failures).sort(([, a], [, b]) => b - a);
|
|
74
|
+
if (entries.length === 0)
|
|
75
|
+
continue;
|
|
76
|
+
hasFailures = true;
|
|
77
|
+
output.push(` ${label}`);
|
|
78
|
+
for (const [category, count] of entries)
|
|
79
|
+
output.push(` ${category.padEnd(28)}${count}`);
|
|
80
|
+
}
|
|
81
|
+
if (!hasFailures)
|
|
82
|
+
output.push(" None recorded.");
|
|
83
|
+
}
|
|
84
|
+
output.push("", ` ${line()}`, " Success rates are per event type; MCP and tool events are related but distinct.", " Use 'telemetry show' for the raw event stream.", "");
|
|
85
|
+
return output.join("\n");
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/telemetry/format.ts"],"names":[],"mappings":"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"}
|