agent-dir 0.2.0 → 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.
Files changed (56) hide show
  1. package/README.md +82 -5
  2. package/dist/bin/agent-dir.js +261 -10
  3. package/dist/bin/agent-dir.js.map +1 -1
  4. package/dist/src/auth.d.ts.map +1 -1
  5. package/dist/src/auth.js +10 -2
  6. package/dist/src/auth.js.map +1 -1
  7. package/dist/src/config.d.ts.map +1 -1
  8. package/dist/src/config.js +14 -0
  9. package/dist/src/config.js.map +1 -1
  10. package/dist/src/logging.d.ts +2 -0
  11. package/dist/src/logging.d.ts.map +1 -1
  12. package/dist/src/logging.js +29 -10
  13. package/dist/src/logging.js.map +1 -1
  14. package/dist/src/mcp.d.ts +4 -1
  15. package/dist/src/mcp.d.ts.map +1 -1
  16. package/dist/src/mcp.js +348 -39
  17. package/dist/src/mcp.js.map +1 -1
  18. package/dist/src/server.d.ts +1 -1
  19. package/dist/src/server.d.ts.map +1 -1
  20. package/dist/src/server.js +7 -10
  21. package/dist/src/server.js.map +1 -1
  22. package/dist/src/setup.d.ts +9 -0
  23. package/dist/src/setup.d.ts.map +1 -0
  24. package/dist/src/setup.js +215 -0
  25. package/dist/src/setup.js.map +1 -0
  26. package/dist/src/telemetry/aggregate.d.ts +58 -0
  27. package/dist/src/telemetry/aggregate.d.ts.map +1 -0
  28. package/dist/src/telemetry/aggregate.js +184 -0
  29. package/dist/src/telemetry/aggregate.js.map +1 -0
  30. package/dist/src/telemetry/config.d.ts +5 -0
  31. package/dist/src/telemetry/config.d.ts.map +1 -0
  32. package/dist/src/telemetry/config.js +16 -0
  33. package/dist/src/telemetry/config.js.map +1 -0
  34. package/dist/src/telemetry/format.d.ts +3 -0
  35. package/dist/src/telemetry/format.d.ts.map +1 -0
  36. package/dist/src/telemetry/format.js +87 -0
  37. package/dist/src/telemetry/format.js.map +1 -0
  38. package/dist/src/telemetry/privacy.d.ts +4 -0
  39. package/dist/src/telemetry/privacy.d.ts.map +1 -0
  40. package/dist/src/telemetry/privacy.js +145 -0
  41. package/dist/src/telemetry/privacy.js.map +1 -0
  42. package/dist/src/telemetry/recorder.d.ts +30 -0
  43. package/dist/src/telemetry/recorder.d.ts.map +1 -0
  44. package/dist/src/telemetry/recorder.js +98 -0
  45. package/dist/src/telemetry/recorder.js.map +1 -0
  46. package/dist/src/telemetry/types.d.ts +74 -0
  47. package/dist/src/telemetry/types.d.ts.map +1 -0
  48. package/dist/src/telemetry/types.js +2 -0
  49. package/dist/src/telemetry/types.js.map +1 -0
  50. package/dist/src/tools/commands.d.ts +2 -1
  51. package/dist/src/tools/commands.d.ts.map +1 -1
  52. package/dist/src/tools/commands.js +10 -1
  53. package/dist/src/tools/commands.js.map +1 -1
  54. package/dist/src/types.d.ts +7 -0
  55. package/dist/src/types.d.ts.map +1 -1
  56. package/package.json +1 -1
@@ -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,3 @@
1
+ import type { TelemetrySummary } from "./aggregate.js";
2
+ export declare function formatTelemetrySummary(summary: TelemetrySummary, level: string): string;
3
+ //# sourceMappingURL=format.d.ts.map
@@ -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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"}