agent-recorder 2.0.12 → 2.0.14

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 (188) hide show
  1. package/dist/bundle.js +4 -0
  2. package/dist/bundle.js.map +1 -1
  3. package/dist/embed.d.ts +21 -0
  4. package/dist/embed.d.ts.map +1 -0
  5. package/dist/embed.js +22 -0
  6. package/dist/embed.js.map +1 -0
  7. package/package.json +8 -1
  8. package/vendor/node_modules/@agent-recorder/cli/analytics/session-analytics.test.js +3 -0
  9. package/vendor/node_modules/@agent-recorder/cli/analytics/session-analytics.test.js.map +1 -1
  10. package/vendor/node_modules/@agent-recorder/cli/commands/mcp-server.d.ts +11 -0
  11. package/vendor/node_modules/@agent-recorder/cli/commands/mcp-server.d.ts.map +1 -0
  12. package/vendor/node_modules/@agent-recorder/cli/commands/mcp-server.js +442 -0
  13. package/vendor/node_modules/@agent-recorder/cli/commands/mcp-server.js.map +1 -0
  14. package/vendor/node_modules/@agent-recorder/cli/commands/sessions.d.ts.map +1 -1
  15. package/vendor/node_modules/@agent-recorder/cli/commands/sessions.js +8 -5
  16. package/vendor/node_modules/@agent-recorder/cli/commands/sessions.js.map +1 -1
  17. package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.d.ts +2 -51
  18. package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.d.ts.map +1 -1
  19. package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.js +2 -113
  20. package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.js.map +1 -1
  21. package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.test.js +1 -1
  22. package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.test.js.map +1 -1
  23. package/vendor/node_modules/@agent-recorder/cli/index.js +10 -0
  24. package/vendor/node_modules/@agent-recorder/cli/index.js.map +1 -1
  25. package/vendor/node_modules/@agent-recorder/cli/package.json +1 -1
  26. package/vendor/node_modules/@agent-recorder/cli/tui/components/EventInspectPanel.d.ts.map +1 -1
  27. package/vendor/node_modules/@agent-recorder/cli/tui/components/EventInspectPanel.js +1 -1
  28. package/vendor/node_modules/@agent-recorder/cli/tui/components/EventInspectPanel.js.map +1 -1
  29. package/vendor/node_modules/@agent-recorder/core/claude-config.d.ts +23 -0
  30. package/vendor/node_modules/@agent-recorder/core/claude-config.d.ts.map +1 -1
  31. package/vendor/node_modules/@agent-recorder/core/claude-config.js +50 -0
  32. package/vendor/node_modules/@agent-recorder/core/claude-config.js.map +1 -1
  33. package/vendor/node_modules/@agent-recorder/core/config.d.ts +10 -1
  34. package/vendor/node_modules/@agent-recorder/core/config.d.ts.map +1 -1
  35. package/vendor/node_modules/@agent-recorder/core/config.js +11 -1
  36. package/vendor/node_modules/@agent-recorder/core/config.js.map +1 -1
  37. package/vendor/node_modules/@agent-recorder/core/db/events-complete.test.d.ts +5 -0
  38. package/vendor/node_modules/@agent-recorder/core/db/events-complete.test.d.ts.map +1 -0
  39. package/vendor/node_modules/@agent-recorder/core/db/events-complete.test.js +133 -0
  40. package/vendor/node_modules/@agent-recorder/core/db/events-complete.test.js.map +1 -0
  41. package/vendor/node_modules/@agent-recorder/core/db/events.d.ts +23 -36
  42. package/vendor/node_modules/@agent-recorder/core/db/events.d.ts.map +1 -1
  43. package/vendor/node_modules/@agent-recorder/core/db/events.js +74 -3
  44. package/vendor/node_modules/@agent-recorder/core/db/events.js.map +1 -1
  45. package/vendor/node_modules/@agent-recorder/core/db/events.test.js +62 -1
  46. package/vendor/node_modules/@agent-recorder/core/db/events.test.js.map +1 -1
  47. package/vendor/node_modules/@agent-recorder/core/db/index.d.ts +2 -1
  48. package/vendor/node_modules/@agent-recorder/core/db/index.d.ts.map +1 -1
  49. package/vendor/node_modules/@agent-recorder/core/db/index.js +2 -1
  50. package/vendor/node_modules/@agent-recorder/core/db/index.js.map +1 -1
  51. package/vendor/node_modules/@agent-recorder/core/db/sessions.d.ts +2 -5
  52. package/vendor/node_modules/@agent-recorder/core/db/sessions.d.ts.map +1 -1
  53. package/vendor/node_modules/@agent-recorder/core/db/sessions.js.map +1 -1
  54. package/vendor/node_modules/@agent-recorder/core/db/token-metrics.d.ts +33 -0
  55. package/vendor/node_modules/@agent-recorder/core/db/token-metrics.d.ts.map +1 -0
  56. package/vendor/node_modules/@agent-recorder/core/db/token-metrics.js +88 -0
  57. package/vendor/node_modules/@agent-recorder/core/db/token-metrics.js.map +1 -0
  58. package/vendor/node_modules/@agent-recorder/core/db/token-metrics.test.d.ts +5 -0
  59. package/vendor/node_modules/@agent-recorder/core/db/token-metrics.test.d.ts.map +1 -0
  60. package/vendor/node_modules/@agent-recorder/core/db/token-metrics.test.js +167 -0
  61. package/vendor/node_modules/@agent-recorder/core/db/token-metrics.test.js.map +1 -0
  62. package/vendor/node_modules/@agent-recorder/core/index.d.ts +1 -1
  63. package/vendor/node_modules/@agent-recorder/core/index.d.ts.map +1 -1
  64. package/vendor/node_modules/@agent-recorder/core/index.js +1 -1
  65. package/vendor/node_modules/@agent-recorder/core/index.js.map +1 -1
  66. package/vendor/node_modules/@agent-recorder/core/migrations/007_add_correlation_id.sql +11 -0
  67. package/vendor/node_modules/@agent-recorder/core/migrations/007_add_token_columns.sql +19 -0
  68. package/vendor/node_modules/@agent-recorder/core/package.json +1 -1
  69. package/vendor/node_modules/@agent-recorder/core/types/index.d.ts +4 -2
  70. package/vendor/node_modules/@agent-recorder/core/types/index.d.ts.map +1 -1
  71. package/vendor/node_modules/@agent-recorder/core/types/index.js +3 -0
  72. package/vendor/node_modules/@agent-recorder/core/types/index.js.map +1 -1
  73. package/vendor/node_modules/@agent-recorder/core/utils/index.d.ts +1 -0
  74. package/vendor/node_modules/@agent-recorder/core/utils/index.d.ts.map +1 -1
  75. package/vendor/node_modules/@agent-recorder/core/utils/index.js +1 -0
  76. package/vendor/node_modules/@agent-recorder/core/utils/index.js.map +1 -1
  77. package/vendor/node_modules/@agent-recorder/core/utils/redact.d.ts.map +1 -1
  78. package/vendor/node_modules/@agent-recorder/core/utils/redact.js +6 -3
  79. package/vendor/node_modules/@agent-recorder/core/utils/redact.js.map +1 -1
  80. package/vendor/node_modules/@agent-recorder/core/utils/redact.test.d.ts +6 -0
  81. package/vendor/node_modules/@agent-recorder/core/utils/redact.test.d.ts.map +1 -0
  82. package/vendor/node_modules/@agent-recorder/core/utils/redact.test.js +82 -0
  83. package/vendor/node_modules/@agent-recorder/core/utils/redact.test.js.map +1 -0
  84. package/vendor/node_modules/@agent-recorder/core/utils/tokens.d.ts +24 -0
  85. package/vendor/node_modules/@agent-recorder/core/utils/tokens.d.ts.map +1 -0
  86. package/vendor/node_modules/@agent-recorder/core/utils/tokens.js +31 -0
  87. package/vendor/node_modules/@agent-recorder/core/utils/tokens.js.map +1 -0
  88. package/vendor/node_modules/@agent-recorder/core/utils/tokens.test.d.ts +5 -0
  89. package/vendor/node_modules/@agent-recorder/core/utils/tokens.test.d.ts.map +1 -0
  90. package/vendor/node_modules/@agent-recorder/core/utils/tokens.test.js +80 -0
  91. package/vendor/node_modules/@agent-recorder/core/utils/tokens.test.js.map +1 -0
  92. package/vendor/node_modules/@agent-recorder/hooks/package.json +1 -1
  93. package/vendor/node_modules/@agent-recorder/service/daemon-context.d.ts +14 -0
  94. package/vendor/node_modules/@agent-recorder/service/daemon-context.d.ts.map +1 -0
  95. package/vendor/node_modules/@agent-recorder/service/daemon-context.js +15 -0
  96. package/vendor/node_modules/@agent-recorder/service/daemon-context.js.map +1 -0
  97. package/vendor/node_modules/@agent-recorder/service/index.d.ts +1 -8
  98. package/vendor/node_modules/@agent-recorder/service/index.d.ts.map +1 -1
  99. package/vendor/node_modules/@agent-recorder/service/index.js +15 -22
  100. package/vendor/node_modules/@agent-recorder/service/index.js.map +1 -1
  101. package/vendor/node_modules/@agent-recorder/service/mcp/proxy.d.ts +27 -0
  102. package/vendor/node_modules/@agent-recorder/service/mcp/proxy.d.ts.map +1 -1
  103. package/vendor/node_modules/@agent-recorder/service/mcp/proxy.js +141 -35
  104. package/vendor/node_modules/@agent-recorder/service/mcp/proxy.js.map +1 -1
  105. package/vendor/node_modules/@agent-recorder/service/mcp/recorder.d.ts +4 -0
  106. package/vendor/node_modules/@agent-recorder/service/mcp/recorder.d.ts.map +1 -1
  107. package/vendor/node_modules/@agent-recorder/service/mcp/recorder.js +56 -14
  108. package/vendor/node_modules/@agent-recorder/service/mcp/recorder.js.map +1 -1
  109. package/vendor/node_modules/@agent-recorder/service/mcp/recorder.test.d.ts +5 -0
  110. package/vendor/node_modules/@agent-recorder/service/mcp/recorder.test.d.ts.map +1 -0
  111. package/vendor/node_modules/@agent-recorder/service/mcp/recorder.test.js +143 -0
  112. package/vendor/node_modules/@agent-recorder/service/mcp/recorder.test.js.map +1 -0
  113. package/vendor/node_modules/@agent-recorder/service/mcp/types.d.ts +5 -31
  114. package/vendor/node_modules/@agent-recorder/service/mcp/types.d.ts.map +1 -1
  115. package/vendor/node_modules/@agent-recorder/service/mcp/types.js +3 -1
  116. package/vendor/node_modules/@agent-recorder/service/mcp/types.js.map +1 -1
  117. package/vendor/node_modules/@agent-recorder/service/mcp/upstreams-cache.test.d.ts +5 -0
  118. package/vendor/node_modules/@agent-recorder/service/mcp/upstreams-cache.test.d.ts.map +1 -0
  119. package/vendor/node_modules/@agent-recorder/service/mcp/upstreams-cache.test.js +66 -0
  120. package/vendor/node_modules/@agent-recorder/service/mcp/upstreams-cache.test.js.map +1 -0
  121. package/vendor/node_modules/@agent-recorder/service/package.json +1 -1
  122. package/vendor/node_modules/@agent-recorder/service/routes/events.d.ts.map +1 -1
  123. package/vendor/node_modules/@agent-recorder/service/routes/events.js +42 -1
  124. package/vendor/node_modules/@agent-recorder/service/routes/events.js.map +1 -1
  125. package/vendor/node_modules/@agent-recorder/service/routes/health.d.ts +6 -1
  126. package/vendor/node_modules/@agent-recorder/service/routes/health.d.ts.map +1 -1
  127. package/vendor/node_modules/@agent-recorder/service/routes/health.js +5 -6
  128. package/vendor/node_modules/@agent-recorder/service/routes/health.js.map +1 -1
  129. package/vendor/node_modules/@agent-recorder/service/routes/hooks.d.ts +20 -0
  130. package/vendor/node_modules/@agent-recorder/service/routes/hooks.d.ts.map +1 -1
  131. package/vendor/node_modules/@agent-recorder/service/routes/hooks.js +403 -49
  132. package/vendor/node_modules/@agent-recorder/service/routes/hooks.js.map +1 -1
  133. package/vendor/node_modules/@agent-recorder/service/routes/hooks.test.d.ts +9 -0
  134. package/vendor/node_modules/@agent-recorder/service/routes/hooks.test.d.ts.map +1 -0
  135. package/vendor/node_modules/@agent-recorder/service/routes/hooks.test.js +406 -0
  136. package/vendor/node_modules/@agent-recorder/service/routes/hooks.test.js.map +1 -0
  137. package/vendor/node_modules/@agent-recorder/service/routes/isToolResponseError.test.d.ts +8 -0
  138. package/vendor/node_modules/@agent-recorder/service/routes/isToolResponseError.test.d.ts.map +1 -0
  139. package/vendor/node_modules/@agent-recorder/service/routes/isToolResponseError.test.js +65 -0
  140. package/vendor/node_modules/@agent-recorder/service/routes/isToolResponseError.test.js.map +1 -0
  141. package/vendor/node_modules/@agent-recorder/service/routes/sessions.d.ts.map +1 -1
  142. package/vendor/node_modules/@agent-recorder/service/routes/sessions.js +19 -1
  143. package/vendor/node_modules/@agent-recorder/service/routes/sessions.js.map +1 -1
  144. package/vendor/node_modules/@agent-recorder/service/routes/stdio.d.ts.map +1 -1
  145. package/vendor/node_modules/@agent-recorder/service/routes/stdio.js +20 -1
  146. package/vendor/node_modules/@agent-recorder/service/routes/stdio.js.map +1 -1
  147. package/vendor/node_modules/@agent-recorder/service/routes/tokens.d.ts +12 -0
  148. package/vendor/node_modules/@agent-recorder/service/routes/tokens.d.ts.map +1 -0
  149. package/vendor/node_modules/@agent-recorder/service/routes/tokens.js +18 -0
  150. package/vendor/node_modules/@agent-recorder/service/routes/tokens.js.map +1 -0
  151. package/vendor/node_modules/@agent-recorder/service/routes/tokens.test.d.ts +5 -0
  152. package/vendor/node_modules/@agent-recorder/service/routes/tokens.test.d.ts.map +1 -0
  153. package/vendor/node_modules/@agent-recorder/service/routes/tokens.test.js +88 -0
  154. package/vendor/node_modules/@agent-recorder/service/routes/tokens.test.js.map +1 -0
  155. package/vendor/node_modules/@agent-recorder/service/server.d.ts +4 -0
  156. package/vendor/node_modules/@agent-recorder/service/server.d.ts.map +1 -1
  157. package/vendor/node_modules/@agent-recorder/service/server.js +33 -3
  158. package/vendor/node_modules/@agent-recorder/service/server.js.map +1 -1
  159. package/vendor/node_modules/@agent-recorder/stdio-proxy/package.json +1 -1
  160. package/vendor/node_modules/@agent-recorder/stdio-proxy/types.d.ts +3 -19
  161. package/vendor/node_modules/@agent-recorder/stdio-proxy/types.d.ts.map +1 -1
  162. package/vendor/node_modules/@agent-recorder/stdio-proxy/types.js +2 -1
  163. package/vendor/node_modules/@agent-recorder/stdio-proxy/types.js.map +1 -1
  164. package/vendor/node_modules/@agent-recorder/{core/types → types}/events.d.ts +9 -0
  165. package/vendor/node_modules/@agent-recorder/types/events.d.ts.map +1 -0
  166. package/vendor/node_modules/@agent-recorder/types/events.js +9 -0
  167. package/vendor/node_modules/@agent-recorder/types/events.js.map +1 -0
  168. package/vendor/node_modules/@agent-recorder/types/index.d.ts +12 -0
  169. package/vendor/node_modules/@agent-recorder/types/index.d.ts.map +1 -0
  170. package/vendor/node_modules/@agent-recorder/types/index.js +9 -0
  171. package/vendor/node_modules/@agent-recorder/types/index.js.map +1 -0
  172. package/vendor/node_modules/@agent-recorder/types/jsonrpc.d.ts +35 -0
  173. package/vendor/node_modules/@agent-recorder/types/jsonrpc.d.ts.map +1 -0
  174. package/vendor/node_modules/@agent-recorder/types/jsonrpc.js +6 -0
  175. package/vendor/node_modules/@agent-recorder/types/jsonrpc.js.map +1 -0
  176. package/vendor/node_modules/@agent-recorder/types/package.json +12 -0
  177. package/vendor/node_modules/@agent-recorder/{core/types → types}/session.d.ts +6 -0
  178. package/vendor/node_modules/@agent-recorder/types/session.d.ts.map +1 -0
  179. package/vendor/node_modules/@agent-recorder/{core/types → types}/session.js.map +1 -1
  180. package/vendor/node_modules/@agent-recorder/types/storage.d.ts +80 -0
  181. package/vendor/node_modules/@agent-recorder/types/storage.d.ts.map +1 -0
  182. package/vendor/node_modules/@agent-recorder/types/storage.js +9 -0
  183. package/vendor/node_modules/@agent-recorder/types/storage.js.map +1 -0
  184. package/vendor/node_modules/@agent-recorder/core/types/events.d.ts.map +0 -1
  185. package/vendor/node_modules/@agent-recorder/core/types/events.js +0 -6
  186. package/vendor/node_modules/@agent-recorder/core/types/events.js.map +0 -1
  187. package/vendor/node_modules/@agent-recorder/core/types/session.d.ts.map +0 -1
  188. /package/vendor/node_modules/@agent-recorder/{core/types → types}/session.js +0 -0
@@ -5,25 +5,98 @@
5
5
  * Supports hub mode: aggregates multiple HTTP providers.
6
6
  */
7
7
  import Fastify, {} from "fastify";
8
- import { readProvidersFile, getDefaultProvidersPath, } from "@agent-recorder/core";
9
- import { readFileSync } from "node:fs";
8
+ import { readProvidersFile, getDefaultProvidersPath, upsertToolSchemaMetric, estimateTokens, } from "@agent-recorder/core";
9
+ import { readFileSync, watch, existsSync } from "node:fs";
10
+ import { dirname, basename } from "node:path";
10
11
  import { isToolsCallRequest, isErrorResponse, } from "./types.js";
11
12
  import { recordToolCall } from "./recorder.js";
12
13
  /** Default request timeout in milliseconds */
13
14
  const DEFAULT_TIMEOUT_MS = 60_000;
14
15
  /**
15
- * Load upstreams registry from file.
16
- * Returns empty object if file doesn't exist or is invalid.
16
+ * Cached upstreams registry.
17
+ * Loads from file once and watches for changes via fs.watch.
18
+ * Avoids readFileSync + JSON.parse on every incoming request.
17
19
  */
18
- function loadUpstreamsRegistry(upstreamsPath) {
19
- try {
20
- const content = readFileSync(upstreamsPath, "utf-8");
21
- const registry = JSON.parse(content);
22
- return registry ?? {};
20
+ /** @internal Exported for unit testing only */
21
+ export class UpstreamsCache {
22
+ path;
23
+ registry = {};
24
+ watcher = null;
25
+ fileName;
26
+ reloadTimer = null;
27
+ constructor(path) {
28
+ this.path = path;
29
+ this.fileName = basename(path);
30
+ this.reload();
31
+ this.setupWatcher();
32
+ }
33
+ setupWatcher() {
34
+ // Try watching the file directly first
35
+ if (existsSync(this.path)) {
36
+ try {
37
+ this.watcher = watch(this.path, () => this.scheduleReload());
38
+ return;
39
+ }
40
+ catch {
41
+ // Fall through to parent dir watcher
42
+ }
43
+ }
44
+ // File doesn't exist yet — watch parent directory for creation
45
+ const dir = dirname(this.path);
46
+ try {
47
+ this.watcher = watch(dir, (_, filename) => {
48
+ if (filename === this.fileName) {
49
+ this.scheduleReload();
50
+ // Upgrade to direct file watcher now that the file exists.
51
+ // Note: there is a small TOCTOU window between close() and the
52
+ // new watch() where a file change could be missed. The extra
53
+ // scheduleReload() after the swap mitigates this, but it is not atomic.
54
+ // Acceptable because this is a local config file that changes rarely.
55
+ this.watcher?.close();
56
+ try {
57
+ this.watcher = watch(this.path, () => this.scheduleReload());
58
+ this.scheduleReload();
59
+ }
60
+ catch {
61
+ // Keep parent dir watcher if upgrade fails — registry may be stale
62
+ // until the next change event triggers a reload from the directory watcher.
63
+ console.warn("[upstreams] Failed to upgrade to file watcher; falling back to directory watcher (registry may be stale)");
64
+ this.watcher = watch(dir, (_, fn) => {
65
+ if (fn === this.fileName)
66
+ this.scheduleReload();
67
+ });
68
+ }
69
+ }
70
+ });
71
+ }
72
+ catch {
73
+ // Parent dir doesn't exist — watcher is best-effort
74
+ }
75
+ }
76
+ /** Debounce reload to avoid redundant reads from rapid fs.watch events */
77
+ scheduleReload() {
78
+ if (this.reloadTimer)
79
+ clearTimeout(this.reloadTimer);
80
+ this.reloadTimer = setTimeout(() => this.reload(), 50);
81
+ }
82
+ reload() {
83
+ try {
84
+ const content = readFileSync(this.path, "utf-8");
85
+ this.registry = JSON.parse(content) ?? {};
86
+ }
87
+ catch {
88
+ // Keep previous value on error (file missing or invalid JSON)
89
+ }
90
+ }
91
+ get(key) {
92
+ return this.registry[key];
23
93
  }
24
- catch {
25
- // File doesn't exist or invalid JSON - return empty registry
26
- return {};
94
+ close() {
95
+ if (this.reloadTimer)
96
+ clearTimeout(this.reloadTimer);
97
+ this.reloadTimer = null;
98
+ this.watcher?.close();
99
+ this.watcher = null;
27
100
  }
28
101
  }
29
102
  /** Hop-by-hop headers that should not be forwarded */
@@ -226,6 +299,8 @@ function parseNamespacedTool(name) {
226
299
  export async function createMcpProxy(options) {
227
300
  const { db, config, sessionId, timeoutMs = DEFAULT_TIMEOUT_MS } = options;
228
301
  const { downstreamMcpUrl, upstreamsPath, redactKeys, mcpProxyPort, debugProxy, } = config;
302
+ // Initialize upstreams cache (replaces per-request readFileSync)
303
+ const upstreamsCache = new UpstreamsCache(upstreamsPath);
229
304
  // Load HTTP providers for hub mode
230
305
  const providersPath = getDefaultProvidersPath();
231
306
  const httpProviders = loadHttpProviders(providersPath, downstreamMcpUrl);
@@ -260,6 +335,33 @@ export async function createMcpProxy(options) {
260
335
  // Hub mode: Handle tools/list by aggregating from all providers
261
336
  if (body.method === "tools/list" && httpProviders.length > 0) {
262
337
  const response = await aggregateToolsList(httpProviders, body.id, timeoutMs, debugProxy);
338
+ // Record schema token metrics for each tool — fail-open
339
+ if (sessionId && !isErrorResponse(response)) {
340
+ const result = response.result;
341
+ if (result && typeof result === "object" && "tools" in result) {
342
+ const tools = result.tools;
343
+ for (const tool of tools) {
344
+ if (!tool || typeof tool !== "object" || !("name" in tool))
345
+ continue;
346
+ const toolName = tool.name;
347
+ // Tools are namespaced as "<providerId>.<toolName>" by aggregateToolsList above,
348
+ // so splitting on the first dot safely recovers the upstream key.
349
+ const dotIdx = toolName.indexOf(".");
350
+ const upstreamKey = dotIdx > 0 ? toolName.slice(0, dotIdx) : null;
351
+ try {
352
+ upsertToolSchemaMetric(db, {
353
+ sessionId,
354
+ upstreamKey,
355
+ toolName,
356
+ schemaTokens: estimateTokens(tool),
357
+ });
358
+ }
359
+ catch {
360
+ // Fail-open
361
+ }
362
+ }
363
+ }
364
+ }
263
365
  return reply.code(200).send(response);
264
366
  }
265
367
  // Declare variables for tool call tracking
@@ -273,7 +375,7 @@ export async function createMcpProxy(options) {
273
375
  toolInput = params.arguments ?? {};
274
376
  }
275
377
  // Determine downstream URL based on router/hub mode logic
276
- let finalDownstreamUrl = null;
378
+ let targetUrl = null;
277
379
  let finalUpstreamKey = upstreamKeyStr;
278
380
  // Hub mode: Parse namespaced tool name for tools/call
279
381
  if (isToolCall && toolName && httpProviders.length > 0) {
@@ -301,6 +403,7 @@ export async function createMcpProxy(options) {
301
403
  endedAt: new Date().toISOString(),
302
404
  redactKeys,
303
405
  debugProxy,
406
+ contextBudgetTokens: config.contextBudgetTokens,
304
407
  });
305
408
  }
306
409
  return reply.code(404).send({
@@ -314,18 +417,17 @@ export async function createMcpProxy(options) {
314
417
  });
315
418
  }
316
419
  // Route to provider URL
317
- finalDownstreamUrl = provider.url;
420
+ targetUrl = provider.url;
318
421
  finalUpstreamKey = parsed.providerId;
319
422
  // Rewrite tool name without namespace prefix
320
423
  toolName = parsed.toolName;
321
424
  body.params.name = parsed.toolName;
322
425
  }
323
426
  }
324
- // Router mode: lookup upstream in registry
427
+ // Router mode: lookup upstream in cached registry
325
428
  let upstreamHeaders;
326
- if (!finalDownstreamUrl && upstreamKeyStr) {
327
- const registry = loadUpstreamsRegistry(upstreamsPath);
328
- const upstream = registry[upstreamKeyStr];
429
+ if (!targetUrl && upstreamKeyStr) {
430
+ const upstream = upstreamsCache.get(upstreamKeyStr);
329
431
  if (!upstream) {
330
432
  return reply.code(404).send({
331
433
  jsonrpc: "2.0",
@@ -336,15 +438,15 @@ export async function createMcpProxy(options) {
336
438
  id: null,
337
439
  });
338
440
  }
339
- finalDownstreamUrl = upstream.url;
441
+ targetUrl = upstream.url;
340
442
  upstreamHeaders = upstream.headers;
341
443
  }
342
444
  // Legacy mode: use configured downstream URL
343
- if (!finalDownstreamUrl && downstreamMcpUrl) {
344
- finalDownstreamUrl = downstreamMcpUrl;
445
+ if (!targetUrl && downstreamMcpUrl) {
446
+ targetUrl = downstreamMcpUrl;
345
447
  }
346
448
  // No downstream configured
347
- if (!finalDownstreamUrl) {
449
+ if (!targetUrl) {
348
450
  return reply.code(503).send({
349
451
  jsonrpc: "2.0",
350
452
  error: {
@@ -364,15 +466,15 @@ export async function createMcpProxy(options) {
364
466
  }
365
467
  // Log routing decision if debug enabled
366
468
  if (debugProxy) {
367
- console.log(`[PROXY] Routing ${body.method} to ${finalDownstreamUrl} (upstream: ${finalUpstreamKey ?? "legacy"})`);
469
+ console.log(`[PROXY] Routing ${body.method} to ${targetUrl} (upstream: ${finalUpstreamKey ?? "legacy"})`);
368
470
  }
369
471
  // Create abort controller for timeout
370
472
  const controller = new AbortController();
371
473
  const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
372
474
  // Forward request to downstream
373
- let downstreamResponse;
475
+ let upstreamResponse;
374
476
  try {
375
- downstreamResponse = await fetch(finalDownstreamUrl, {
477
+ upstreamResponse = await fetch(targetUrl, {
376
478
  method: "POST",
377
479
  headers: forwardHeaders,
378
480
  body: JSON.stringify(body),
@@ -399,6 +501,7 @@ export async function createMcpProxy(options) {
399
501
  endedAt,
400
502
  redactKeys,
401
503
  debugProxy,
504
+ contextBudgetTokens: config.contextBudgetTokens,
402
505
  });
403
506
  }
404
507
  return reply.code(504).send({
@@ -415,7 +518,7 @@ export async function createMcpProxy(options) {
415
518
  const errorMessage = error instanceof Error ? error.message : "Unknown error";
416
519
  const errorName = error instanceof Error ? error.name : "Error";
417
520
  console.error(`Failed to forward request to downstream: ${errorName}: ${errorMessage}`);
418
- console.error(` Target URL: ${finalDownstreamUrl}`);
521
+ console.error(` Target URL: ${targetUrl}`);
419
522
  console.error(` Upstream key: ${finalUpstreamKey ?? "(legacy mode)"}`);
420
523
  return reply.code(502).send({
421
524
  jsonrpc: "2.0",
@@ -428,20 +531,20 @@ export async function createMcpProxy(options) {
428
531
  }
429
532
  clearTimeout(timeoutId);
430
533
  // Check for HTTP-level errors before parsing response body
431
- if (!downstreamResponse.ok) {
432
- const statusCode = downstreamResponse.status;
433
- const statusText = downstreamResponse.statusText;
534
+ if (!upstreamResponse.ok) {
535
+ const statusCode = upstreamResponse.status;
536
+ const statusText = upstreamResponse.statusText;
434
537
  // Try to read response body for more details
435
538
  let errorBody = "";
436
539
  try {
437
- errorBody = await downstreamResponse.text();
540
+ errorBody = await upstreamResponse.text();
438
541
  }
439
542
  catch {
440
543
  // Ignore if we can't read body
441
544
  }
442
545
  // Log detailed error
443
546
  console.error(`Downstream returned HTTP ${statusCode} ${statusText}`);
444
- console.error(` Target URL: ${finalDownstreamUrl}`);
547
+ console.error(` Target URL: ${targetUrl}`);
445
548
  console.error(` Upstream key: ${finalUpstreamKey ?? "(legacy mode)"}`);
446
549
  if (debugProxy && errorBody) {
447
550
  console.error(` Response body: ${errorBody.slice(0, 200)}`);
@@ -483,6 +586,7 @@ export async function createMcpProxy(options) {
483
586
  endedAt,
484
587
  redactKeys,
485
588
  debugProxy,
589
+ contextBudgetTokens: config.contextBudgetTokens,
486
590
  });
487
591
  }
488
592
  return reply.code(502).send({
@@ -496,14 +600,14 @@ export async function createMcpProxy(options) {
496
600
  });
497
601
  }
498
602
  // Check response content type to handle SSE vs JSON
499
- const contentType = downstreamResponse.headers.get("content-type") ?? "";
603
+ const contentType = upstreamResponse.headers.get("content-type") ?? "";
500
604
  const isSSE = contentType.includes("text/event-stream");
501
605
  // Parse downstream response
502
606
  let responseBody;
503
607
  try {
504
608
  if (isSSE) {
505
609
  // Handle SSE response - extract JSON from the stream
506
- const text = await downstreamResponse.text();
610
+ const text = await upstreamResponse.text();
507
611
  // SSE format: "event: message\ndata: {...}\n\n"
508
612
  // Extract the last complete JSON object from the data lines
509
613
  const dataLines = text
@@ -518,7 +622,7 @@ export async function createMcpProxy(options) {
518
622
  responseBody = JSON.parse(lastData);
519
623
  }
520
624
  else {
521
- responseBody = (await downstreamResponse.json());
625
+ responseBody = (await upstreamResponse.json());
522
626
  }
523
627
  }
524
628
  catch (parseError) {
@@ -556,10 +660,11 @@ export async function createMcpProxy(options) {
556
660
  endedAt,
557
661
  redactKeys,
558
662
  debugProxy,
663
+ contextBudgetTokens: config.contextBudgetTokens,
559
664
  });
560
665
  }
561
666
  // Preserve downstream HTTP status code and return response unchanged
562
- reply.code(downstreamResponse.status);
667
+ reply.code(upstreamResponse.status);
563
668
  reply.header("Content-Type", "application/json");
564
669
  return reply.send(responseBody);
565
670
  });
@@ -568,6 +673,7 @@ export async function createMcpProxy(options) {
568
673
  console.log(`MCP proxy listening on http://127.0.0.1:${mcpProxyPort}`);
569
674
  };
570
675
  const close = async () => {
676
+ upstreamsCache.close();
571
677
  await app.close();
572
678
  };
573
679
  return { app, start, close };
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/mcp/proxy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/mcp/proxy.ts"],"names":[],"mappings":"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"}
@@ -20,7 +20,11 @@ export interface RecordToolCallOptions {
20
20
  redactKeys: string[];
21
21
  /** Enable debug logging (metadata only, no payloads) */
22
22
  debugProxy?: boolean;
23
+ /** Context budget in tokens; warn when session exceeds this */
24
+ contextBudgetTokens?: number;
23
25
  }
26
+ /** Reset the warned-sessions set. Exposed for test isolation only. */
27
+ export declare function resetBudgetWarnedSessions(): void;
24
28
  /**
25
29
  * Record a tool call event to the database.
26
30
  * Uses atomic sequence allocation from session_sequences table.
@@ -1 +1 @@
1
- {"version":3,"file":"recorder.d.ts","sourceRoot":"","sources":["../../src/mcp/recorder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,wDAAwD;IACxD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,GAAG,IAAI,CAwE5E"}
1
+ {"version":3,"file":"recorder.d.ts","sourceRoot":"","sources":["../../src/mcp/recorder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAOL,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,wDAAwD;IACxD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+DAA+D;IAC/D,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAYD,sEAAsE;AACtE,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,GAAG,IAAI,CA6G5E"}
@@ -4,7 +4,20 @@
4
4
  * Implements fail-open pattern: errors are logged but don't block proxy forwarding.
5
5
  */
6
6
  import { randomUUID } from "node:crypto";
7
- import { allocateSequence, deriveErrorCategory, insertEvent, redactAndTruncate, } from "@agent-recorder/core";
7
+ import { allocateSequence, deriveErrorCategory, insertEvent, redactAndTruncate, getTokenSummary, estimateSerializedTokens, } from "@agent-recorder/core";
8
+ /**
9
+ * Track sessions where a budget warning has already been emitted.
10
+ * Prevents log spam on every tool call after the threshold is crossed.
11
+ * Capped at 10k entries to avoid unbounded memory growth in long-running daemons.
12
+ */
13
+ const budgetWarnedSessions = new Set();
14
+ // Safety cap: stop tracking new sessions beyond this limit rather than clearing
15
+ // (clearing would cause re-flooding for all previously warned sessions).
16
+ const MAX_BUDGET_WARNED_SESSIONS = 10_000;
17
+ /** Reset the warned-sessions set. Exposed for test isolation only. */
18
+ export function resetBudgetWarnedSessions() {
19
+ budgetWarnedSessions.clear();
20
+ }
8
21
  /**
9
22
  * Record a tool call event to the database.
10
23
  * Uses atomic sequence allocation from session_sequences table.
@@ -13,22 +26,16 @@ import { allocateSequence, deriveErrorCategory, insertEvent, redactAndTruncate,
13
26
  * @returns The event ID if successful, null if recording failed
14
27
  */
15
28
  export function recordToolCall(options) {
16
- const { db, sessionId, parentEventId, toolName, mcpMethod, upstreamKey, input, output, status, startedAt, endedAt, redactKeys, debugProxy, } = options;
29
+ const { db, sessionId, parentEventId, toolName, mcpMethod, upstreamKey, input, output, status, startedAt, endedAt, redactKeys, debugProxy, contextBudgetTokens, } = options;
17
30
  try {
18
- // Allocate sequence atomically
19
31
  const sequence = allocateSequence(db, sessionId);
20
- // Redact and truncate input/output
21
32
  const inputJson = redactAndTruncate(input, redactKeys);
22
33
  const outputJson = redactAndTruncate(output, redactKeys);
23
- // Derive error category from status and redacted output (no content logging)
24
34
  const errorCategory = deriveErrorCategory(status, outputJson);
25
- // Generate event ID
35
+ // Estimate tokens from already-serialized strings using byte-accurate counting
36
+ const inputTokens = estimateSerializedTokens(inputJson);
37
+ const outputTokens = estimateSerializedTokens(outputJson);
26
38
  const eventId = randomUUID();
27
- // Insert event with proper column mapping:
28
- // - agentName = "claude-code" (stable identifier for the agent)
29
- // - toolName = actual tool name from params.name
30
- // - mcpMethod = "tools/call" (or whatever MCP method was invoked)
31
- // - upstreamKey = server key from router mode (null for legacy single-upstream)
32
39
  insertEvent(db, {
33
40
  id: eventId,
34
41
  sessionId,
@@ -47,17 +54,52 @@ export function recordToolCall(options) {
47
54
  inputJson,
48
55
  outputJson,
49
56
  errorCategory,
57
+ inputTokens,
58
+ outputTokens,
50
59
  });
51
- // Debug logging: metadata only, no payloads
60
+ // Budget check fail-open, never throws.
61
+ // Fast-path: single SUM query to check if budget is exceeded before running the
62
+ // full 3-query getTokenSummary (which is only needed when emitting the warning).
63
+ if (contextBudgetTokens && !budgetWarnedSessions.has(sessionId)) {
64
+ try {
65
+ const { callTotal } = db
66
+ .prepare(`SELECT COALESCE(SUM(input_tokens), 0) + COALESCE(SUM(output_tokens), 0) AS callTotal
67
+ FROM events WHERE session_id = ? AND event_type = 'tool_call'`)
68
+ .get(sessionId);
69
+ const { schemaTotal } = db
70
+ .prepare(`SELECT COALESCE(SUM(schema_tokens), 0) AS schemaTotal
71
+ FROM tool_schema_metrics WHERE session_id = ?`)
72
+ .get(sessionId);
73
+ if (callTotal + schemaTotal > contextBudgetTokens) {
74
+ // Budget exceeded — fetch full summary for the warning payload
75
+ const summary = getTokenSummary(db, sessionId, contextBudgetTokens);
76
+ // Cap the set to avoid unbounded memory growth in very long-running daemons.
77
+ // Warn and track only if below the cap; sessions above the cap are
78
+ // silently skipped rather than re-warned on every call.
79
+ if (budgetWarnedSessions.size < MAX_BUDGET_WARNED_SESSIONS) {
80
+ budgetWarnedSessions.add(sessionId);
81
+ console.warn(JSON.stringify({
82
+ type: "context_budget_warning",
83
+ sessionId,
84
+ estimatedTokens: summary.estimatedTotalTokens,
85
+ budgetTokens: contextBudgetTokens,
86
+ percentUsed: summary.percentUsed,
87
+ }));
88
+ }
89
+ }
90
+ }
91
+ catch {
92
+ // Fail-open
93
+ }
94
+ }
52
95
  if (debugProxy) {
53
96
  const durationMs = new Date(endedAt).getTime() - new Date(startedAt).getTime();
54
97
  const upstreamInfo = upstreamKey ? ` upstream=${upstreamKey}` : "";
55
- console.log(`[DEBUG] tool_call: session=${sessionId} seq=${sequence} tool=${toolName}${upstreamInfo} status=${status} duration=${durationMs}ms`);
98
+ console.log(`[DEBUG] tool_call: session=${sessionId} seq=${sequence} tool=${toolName}${upstreamInfo} status=${status} duration=${durationMs}ms tokens=${inputTokens}+${outputTokens}`);
56
99
  }
57
100
  return eventId;
58
101
  }
59
102
  catch (error) {
60
- // Fail-open: log error but don't throw
61
103
  console.error("Failed to record tool call:", error);
62
104
  return null;
63
105
  }
@@ -1 +1 @@
1
- {"version":3,"file":"recorder.js","sourceRoot":"","sources":["../../src/mcp/recorder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,WAAW,EACX,iBAAiB,GAElB,MAAM,sBAAsB,CAAC;AAmB9B;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,OAA8B;IAC3D,MAAM,EACJ,EAAE,EACF,SAAS,EACT,aAAa,EACb,QAAQ,EACR,SAAS,EACT,WAAW,EACX,KAAK,EACL,MAAM,EACN,MAAM,EACN,SAAS,EACT,OAAO,EACP,UAAU,EACV,UAAU,GACX,GAAG,OAAO,CAAC;IAEZ,IAAI,CAAC;QACH,+BAA+B;QAC/B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAEjD,mCAAmC;QACnC,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAEzD,6EAA6E;QAC7E,MAAM,aAAa,GAAG,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAE9D,oBAAoB;QACpB,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAE7B,2CAA2C;QAC3C,gEAAgE;QAChE,iDAAiD;QACjD,kEAAkE;QAClE,gFAAgF;QAChF,WAAW,CAAC,EAAE,EAAE;YACd,EAAE,EAAE,OAAO;YACX,SAAS;YACT,aAAa,EAAE,aAAa,IAAI,IAAI;YACpC,QAAQ;YACR,SAAS,EAAE,WAAW;YACtB,SAAS,EAAE,WAAW;YACtB,SAAS,EAAE,aAAa;YACxB,SAAS,EAAE,IAAI;YACf,QAAQ;YACR,SAAS,EAAE,SAAS,IAAI,YAAY;YACpC,WAAW,EAAE,WAAW,IAAI,IAAI;YAChC,SAAS;YACT,OAAO;YACP,MAAM;YACN,SAAS;YACT,UAAU;YACV,aAAa;SACd,CAAC,CAAC;QAEH,4CAA4C;QAC5C,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,UAAU,GACd,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;YAC9D,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,aAAa,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,OAAO,CAAC,GAAG,CACT,8BAA8B,SAAS,QAAQ,QAAQ,SAAS,QAAQ,GAAG,YAAY,WAAW,MAAM,aAAa,UAAU,IAAI,CACpI,CAAC;QACJ,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,uCAAuC;QACvC,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"recorder.js","sourceRoot":"","sources":["../../src/mcp/recorder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for recordToolCall — budget alerting and token recording.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=recorder.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recorder.test.d.ts","sourceRoot":"","sources":["../../src/mcp/recorder.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}