agent-recorder 2.0.13 → 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 (87) hide show
  1. package/package.json +1 -1
  2. package/vendor/node_modules/@agent-recorder/cli/analytics/session-analytics.test.js +2 -0
  3. package/vendor/node_modules/@agent-recorder/cli/analytics/session-analytics.test.js.map +1 -1
  4. package/vendor/node_modules/@agent-recorder/cli/commands/sessions.d.ts.map +1 -1
  5. package/vendor/node_modules/@agent-recorder/cli/commands/sessions.js +8 -5
  6. package/vendor/node_modules/@agent-recorder/cli/commands/sessions.js.map +1 -1
  7. package/vendor/node_modules/@agent-recorder/cli/package.json +1 -1
  8. package/vendor/node_modules/@agent-recorder/cli/tui/components/EventInspectPanel.d.ts.map +1 -1
  9. package/vendor/node_modules/@agent-recorder/cli/tui/components/EventInspectPanel.js +1 -1
  10. package/vendor/node_modules/@agent-recorder/cli/tui/components/EventInspectPanel.js.map +1 -1
  11. package/vendor/node_modules/@agent-recorder/core/config.d.ts +4 -0
  12. package/vendor/node_modules/@agent-recorder/core/config.d.ts.map +1 -1
  13. package/vendor/node_modules/@agent-recorder/core/config.js +7 -0
  14. package/vendor/node_modules/@agent-recorder/core/config.js.map +1 -1
  15. package/vendor/node_modules/@agent-recorder/core/db/events.d.ts +1 -1
  16. package/vendor/node_modules/@agent-recorder/core/db/events.d.ts.map +1 -1
  17. package/vendor/node_modules/@agent-recorder/core/db/events.js +11 -8
  18. package/vendor/node_modules/@agent-recorder/core/db/events.js.map +1 -1
  19. package/vendor/node_modules/@agent-recorder/core/db/index.d.ts +1 -0
  20. package/vendor/node_modules/@agent-recorder/core/db/index.d.ts.map +1 -1
  21. package/vendor/node_modules/@agent-recorder/core/db/index.js +1 -0
  22. package/vendor/node_modules/@agent-recorder/core/db/index.js.map +1 -1
  23. package/vendor/node_modules/@agent-recorder/core/db/token-metrics.d.ts +33 -0
  24. package/vendor/node_modules/@agent-recorder/core/db/token-metrics.d.ts.map +1 -0
  25. package/vendor/node_modules/@agent-recorder/core/db/token-metrics.js +88 -0
  26. package/vendor/node_modules/@agent-recorder/core/db/token-metrics.js.map +1 -0
  27. package/vendor/node_modules/@agent-recorder/core/db/token-metrics.test.d.ts +5 -0
  28. package/vendor/node_modules/@agent-recorder/core/db/token-metrics.test.d.ts.map +1 -0
  29. package/vendor/node_modules/@agent-recorder/core/db/token-metrics.test.js +167 -0
  30. package/vendor/node_modules/@agent-recorder/core/db/token-metrics.test.js.map +1 -0
  31. package/vendor/node_modules/@agent-recorder/core/index.d.ts +1 -1
  32. package/vendor/node_modules/@agent-recorder/core/index.d.ts.map +1 -1
  33. package/vendor/node_modules/@agent-recorder/core/index.js +1 -1
  34. package/vendor/node_modules/@agent-recorder/core/index.js.map +1 -1
  35. package/vendor/node_modules/@agent-recorder/core/migrations/007_add_token_columns.sql +19 -0
  36. package/vendor/node_modules/@agent-recorder/core/package.json +1 -1
  37. package/vendor/node_modules/@agent-recorder/core/utils/index.d.ts +1 -0
  38. package/vendor/node_modules/@agent-recorder/core/utils/index.d.ts.map +1 -1
  39. package/vendor/node_modules/@agent-recorder/core/utils/index.js +1 -0
  40. package/vendor/node_modules/@agent-recorder/core/utils/index.js.map +1 -1
  41. package/vendor/node_modules/@agent-recorder/core/utils/tokens.d.ts +24 -0
  42. package/vendor/node_modules/@agent-recorder/core/utils/tokens.d.ts.map +1 -0
  43. package/vendor/node_modules/@agent-recorder/core/utils/tokens.js +31 -0
  44. package/vendor/node_modules/@agent-recorder/core/utils/tokens.js.map +1 -0
  45. package/vendor/node_modules/@agent-recorder/core/utils/tokens.test.d.ts +5 -0
  46. package/vendor/node_modules/@agent-recorder/core/utils/tokens.test.d.ts.map +1 -0
  47. package/vendor/node_modules/@agent-recorder/core/utils/tokens.test.js +80 -0
  48. package/vendor/node_modules/@agent-recorder/core/utils/tokens.test.js.map +1 -0
  49. package/vendor/node_modules/@agent-recorder/hooks/package.json +1 -1
  50. package/vendor/node_modules/@agent-recorder/service/index.d.ts.map +1 -1
  51. package/vendor/node_modules/@agent-recorder/service/index.js +1 -0
  52. package/vendor/node_modules/@agent-recorder/service/index.js.map +1 -1
  53. package/vendor/node_modules/@agent-recorder/service/mcp/proxy.d.ts.map +1 -1
  54. package/vendor/node_modules/@agent-recorder/service/mcp/proxy.js +32 -1
  55. package/vendor/node_modules/@agent-recorder/service/mcp/proxy.js.map +1 -1
  56. package/vendor/node_modules/@agent-recorder/service/mcp/recorder.d.ts +4 -0
  57. package/vendor/node_modules/@agent-recorder/service/mcp/recorder.d.ts.map +1 -1
  58. package/vendor/node_modules/@agent-recorder/service/mcp/recorder.js +56 -14
  59. package/vendor/node_modules/@agent-recorder/service/mcp/recorder.js.map +1 -1
  60. package/vendor/node_modules/@agent-recorder/service/mcp/recorder.test.d.ts +5 -0
  61. package/vendor/node_modules/@agent-recorder/service/mcp/recorder.test.d.ts.map +1 -0
  62. package/vendor/node_modules/@agent-recorder/service/mcp/recorder.test.js +143 -0
  63. package/vendor/node_modules/@agent-recorder/service/mcp/recorder.test.js.map +1 -0
  64. package/vendor/node_modules/@agent-recorder/service/package.json +1 -1
  65. package/vendor/node_modules/@agent-recorder/service/routes/hooks.d.ts.map +1 -1
  66. package/vendor/node_modules/@agent-recorder/service/routes/hooks.js +18 -8
  67. package/vendor/node_modules/@agent-recorder/service/routes/hooks.js.map +1 -1
  68. package/vendor/node_modules/@agent-recorder/service/routes/hooks.test.js +66 -0
  69. package/vendor/node_modules/@agent-recorder/service/routes/hooks.test.js.map +1 -1
  70. package/vendor/node_modules/@agent-recorder/service/routes/tokens.d.ts +12 -0
  71. package/vendor/node_modules/@agent-recorder/service/routes/tokens.d.ts.map +1 -0
  72. package/vendor/node_modules/@agent-recorder/service/routes/tokens.js +18 -0
  73. package/vendor/node_modules/@agent-recorder/service/routes/tokens.js.map +1 -0
  74. package/vendor/node_modules/@agent-recorder/service/routes/tokens.test.d.ts +5 -0
  75. package/vendor/node_modules/@agent-recorder/service/routes/tokens.test.d.ts.map +1 -0
  76. package/vendor/node_modules/@agent-recorder/service/routes/tokens.test.js +88 -0
  77. package/vendor/node_modules/@agent-recorder/service/routes/tokens.test.js.map +1 -0
  78. package/vendor/node_modules/@agent-recorder/service/server.d.ts +1 -0
  79. package/vendor/node_modules/@agent-recorder/service/server.d.ts.map +1 -1
  80. package/vendor/node_modules/@agent-recorder/service/server.js +7 -1
  81. package/vendor/node_modules/@agent-recorder/service/server.js.map +1 -1
  82. package/vendor/node_modules/@agent-recorder/stdio-proxy/package.json +1 -1
  83. package/vendor/node_modules/@agent-recorder/types/events.d.ts +4 -0
  84. package/vendor/node_modules/@agent-recorder/types/events.d.ts.map +1 -1
  85. package/vendor/node_modules/@agent-recorder/types/package.json +1 -1
  86. package/vendor/node_modules/@agent-recorder/types/storage.d.ts +3 -1
  87. package/vendor/node_modules/@agent-recorder/types/storage.d.ts.map +1 -1
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Tests for token metrics DB operations.
3
+ */
4
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
5
+ import { randomUUID } from "node:crypto";
6
+ import { openMemoryDatabase, runMigrations, getDefaultMigrationsDir, createSession, insertEvent, upsertToolSchemaMetric, getTokenSummary, } from "../index.js";
7
+ describe("upsertToolSchemaMetric", () => {
8
+ let db;
9
+ let sessionId;
10
+ beforeEach(() => {
11
+ db = openMemoryDatabase();
12
+ runMigrations(db, getDefaultMigrationsDir());
13
+ sessionId = randomUUID();
14
+ createSession(db, sessionId, new Date().toISOString());
15
+ });
16
+ afterEach(() => {
17
+ db.close();
18
+ });
19
+ it("inserts a new row", () => {
20
+ upsertToolSchemaMetric(db, {
21
+ sessionId,
22
+ upstreamKey: "github",
23
+ toolName: "search_code",
24
+ schemaTokens: 120,
25
+ });
26
+ const rows = db
27
+ .prepare("SELECT * FROM tool_schema_metrics WHERE session_id = ?")
28
+ .all(sessionId);
29
+ expect(rows).toHaveLength(1);
30
+ expect(rows[0].tool_name).toBe("search_code");
31
+ expect(rows[0].schema_tokens).toBe(120);
32
+ });
33
+ it("updates schema_tokens on duplicate (session, upstream, tool)", () => {
34
+ upsertToolSchemaMetric(db, {
35
+ sessionId,
36
+ upstreamKey: "github",
37
+ toolName: "search_code",
38
+ schemaTokens: 120,
39
+ });
40
+ // Second call with updated count
41
+ upsertToolSchemaMetric(db, {
42
+ sessionId,
43
+ upstreamKey: "github",
44
+ toolName: "search_code",
45
+ schemaTokens: 200,
46
+ });
47
+ const rows = db
48
+ .prepare("SELECT * FROM tool_schema_metrics WHERE session_id = ?")
49
+ .all(sessionId);
50
+ // Must still be exactly one row, not two
51
+ expect(rows).toHaveLength(1);
52
+ expect(rows[0].schema_tokens).toBe(200);
53
+ });
54
+ it("treats null upstream_key correctly (no duplicate rows)", () => {
55
+ upsertToolSchemaMetric(db, {
56
+ sessionId,
57
+ upstreamKey: null,
58
+ toolName: "Glob",
59
+ schemaTokens: 50,
60
+ });
61
+ upsertToolSchemaMetric(db, {
62
+ sessionId,
63
+ upstreamKey: null,
64
+ toolName: "Glob",
65
+ schemaTokens: 60,
66
+ });
67
+ const rows = db
68
+ .prepare("SELECT * FROM tool_schema_metrics WHERE session_id = ? AND tool_name = 'Glob'")
69
+ .all(sessionId);
70
+ expect(rows).toHaveLength(1);
71
+ });
72
+ it("allows same tool name under different upstream keys", () => {
73
+ upsertToolSchemaMetric(db, {
74
+ sessionId,
75
+ upstreamKey: "github",
76
+ toolName: "search",
77
+ schemaTokens: 100,
78
+ });
79
+ upsertToolSchemaMetric(db, {
80
+ sessionId,
81
+ upstreamKey: "linear",
82
+ toolName: "search",
83
+ schemaTokens: 80,
84
+ });
85
+ const rows = db
86
+ .prepare("SELECT * FROM tool_schema_metrics WHERE session_id = ?")
87
+ .all(sessionId);
88
+ expect(rows).toHaveLength(2);
89
+ });
90
+ });
91
+ describe("getTokenSummary", () => {
92
+ let db;
93
+ let sessionId;
94
+ beforeEach(() => {
95
+ db = openMemoryDatabase();
96
+ runMigrations(db, getDefaultMigrationsDir());
97
+ sessionId = randomUUID();
98
+ createSession(db, sessionId, new Date().toISOString());
99
+ });
100
+ afterEach(() => {
101
+ db.close();
102
+ });
103
+ it("returns zero totals for empty session", () => {
104
+ const summary = getTokenSummary(db, sessionId, 150000);
105
+ expect(summary.estimatedTotalTokens).toBe(0);
106
+ expect(summary.percentUsed).toBe(0);
107
+ expect(summary.budgetExceeded).toBe(false);
108
+ expect(summary.byTool).toHaveLength(0);
109
+ });
110
+ it("does not divide by zero when budgetTokens is 0", () => {
111
+ const summary = getTokenSummary(db, sessionId, 0);
112
+ expect(summary.percentUsed).toBe(0);
113
+ expect(summary.budgetExceeded).toBe(false);
114
+ });
115
+ it("aggregates call tokens from events", () => {
116
+ insertEvent(db, {
117
+ id: randomUUID(),
118
+ sessionId,
119
+ sequence: 1,
120
+ eventType: "tool_call",
121
+ agentRole: "main",
122
+ agentName: "claude-code",
123
+ toolName: "execute_sql",
124
+ upstreamKey: "supabase",
125
+ startedAt: new Date().toISOString(),
126
+ status: "success",
127
+ inputTokens: 100,
128
+ outputTokens: 200,
129
+ });
130
+ const summary = getTokenSummary(db, sessionId, 150000);
131
+ expect(summary.estimatedTotalTokens).toBe(300);
132
+ expect(summary.byTool).toHaveLength(1);
133
+ expect(summary.byTool[0].toolName).toBe("execute_sql");
134
+ expect(summary.byTool[0].totalInputTokens).toBe(100);
135
+ expect(summary.byTool[0].totalOutputTokens).toBe(200);
136
+ });
137
+ it("includes schema tokens in total", () => {
138
+ upsertToolSchemaMetric(db, {
139
+ sessionId,
140
+ upstreamKey: "supabase",
141
+ toolName: "execute_sql",
142
+ schemaTokens: 50,
143
+ });
144
+ const summary = getTokenSummary(db, sessionId, 150000);
145
+ expect(summary.estimatedTotalTokens).toBe(50);
146
+ expect(summary.byUpstream["supabase"].schemaTokens).toBe(50);
147
+ });
148
+ it("flags budget exceeded when total exceeds budget", () => {
149
+ insertEvent(db, {
150
+ id: randomUUID(),
151
+ sessionId,
152
+ sequence: 1,
153
+ eventType: "tool_call",
154
+ agentRole: "main",
155
+ agentName: "claude-code",
156
+ toolName: "execute_sql",
157
+ startedAt: new Date().toISOString(),
158
+ status: "success",
159
+ inputTokens: 1000,
160
+ outputTokens: 500,
161
+ });
162
+ const summary = getTokenSummary(db, sessionId, 1000);
163
+ expect(summary.budgetExceeded).toBe(true);
164
+ expect(summary.percentUsed).toBeGreaterThan(100);
165
+ });
166
+ });
167
+ //# sourceMappingURL=token-metrics.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-metrics.test.js","sourceRoot":"","sources":["../../src/db/token-metrics.test.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@
7
7
  export * from "./types/index.js";
8
8
  export * from "./db/index.js";
9
9
  export * from "./utils/index.js";
10
- export { loadConfig, getActualListenPort, getDefaultUpstreamsPath, type Config, } from "./config.js";
10
+ export { loadConfig, getActualListenPort, getDefaultUpstreamsPath, DEFAULT_CONTEXT_BUDGET_TOKENS, type Config, } from "./config.js";
11
11
  export * from "./daemon-paths.js";
12
12
  export * from "./lockfile.js";
13
13
  export * from "./wrap-utils.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,uBAAuB,EACvB,KAAK,MAAM,GACZ,MAAM,aAAa,CAAC;AACrB,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,uBAAuB,EACvB,6BAA6B,EAC7B,KAAK,MAAM,GACZ,MAAM,aAAa,CAAC;AACrB,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC"}
@@ -7,7 +7,7 @@
7
7
  export * from "./types/index.js";
8
8
  export * from "./db/index.js";
9
9
  export * from "./utils/index.js";
10
- export { loadConfig, getActualListenPort, getDefaultUpstreamsPath, } from "./config.js";
10
+ export { loadConfig, getActualListenPort, getDefaultUpstreamsPath, DEFAULT_CONTEXT_BUDGET_TOKENS, } from "./config.js";
11
11
  export * from "./daemon-paths.js";
12
12
  export * from "./lockfile.js";
13
13
  export * from "./wrap-utils.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,uBAAuB,GAExB,MAAM,aAAa,CAAC;AACrB,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,uBAAuB,EACvB,6BAA6B,GAE9B,MAAM,aAAa,CAAC;AACrB,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC"}
@@ -0,0 +1,19 @@
1
+ -- Add token tracking columns to events table
2
+ ALTER TABLE events ADD COLUMN input_tokens INTEGER;
3
+ ALTER TABLE events ADD COLUMN output_tokens INTEGER;
4
+
5
+ -- Tool schema metrics: one row per (session, upstream, tool) from tools/list responses
6
+ CREATE TABLE IF NOT EXISTS tool_schema_metrics (
7
+ id TEXT PRIMARY KEY,
8
+ session_id TEXT NOT NULL,
9
+ upstream_key TEXT,
10
+ tool_name TEXT NOT NULL,
11
+ schema_tokens INTEGER NOT NULL,
12
+ recorded_at TEXT NOT NULL DEFAULT (datetime('now'))
13
+ );
14
+ CREATE INDEX IF NOT EXISTS idx_tsm_session ON tool_schema_metrics(session_id);
15
+ CREATE INDEX IF NOT EXISTS idx_tsm_upstream ON tool_schema_metrics(upstream_key);
16
+ -- Expression-based unique index to handle NULL upstream_key correctly.
17
+ -- ON CONFLICT targeting this index requires SQLite >= 3.37.0 (2021-11-27).
18
+ -- better-sqlite3 bundles its own SQLite, so the version is always recent enough.
19
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_tsm_unique ON tool_schema_metrics(session_id, COALESCE(upstream_key, ''), tool_name);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-recorder/core",
3
- "version": "2.0.13",
3
+ "version": "2.0.14",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -3,4 +3,5 @@
3
3
  */
4
4
  export { redactJson, truncateJson, redactAndTruncate } from "./redact.js";
5
5
  export { deriveErrorCategory } from "./error-category.js";
6
+ export { estimateTokens, estimateSerializedTokens } from "./tokens.js";
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC"}
@@ -3,4 +3,5 @@
3
3
  */
4
4
  export { redactJson, truncateJson, redactAndTruncate } from "./redact.js";
5
5
  export { deriveErrorCategory } from "./error-category.js";
6
+ export { estimateTokens, estimateSerializedTokens } from "./tokens.js";
6
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Token estimation utility.
3
+ * Uses UTF-8 byte length / 4 approximation — no external dependencies.
4
+ */
5
+ /**
6
+ * Estimate token count for any value.
7
+ * Rough approximation: ~4 UTF-8 bytes per token.
8
+ * Uses TextEncoder for byte-accurate counting (handles non-ASCII correctly).
9
+ * Accurate enough for context-budget alerting; not suitable for exact billing.
10
+ *
11
+ * Pass raw values/objects only. For pre-serialized strings use
12
+ * `estimateSerializedTokens` directly — passing a string here will
13
+ * double-serialize it (JSON.stringify wraps strings in quotes), inflating
14
+ * the estimate.
15
+ */
16
+ export declare function estimateTokens(value: unknown): number;
17
+ /**
18
+ * Estimate token count for an already-serialized JSON string.
19
+ * Uses byte-accurate UTF-8 counting, consistent with estimateTokens.
20
+ * Use this when the value has already been passed through redactAndTruncate
21
+ * (which returns a string) to avoid double-serialization.
22
+ */
23
+ export declare function estimateSerializedTokens(json: string): number;
24
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/utils/tokens.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGrD;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7D"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Token estimation utility.
3
+ * Uses UTF-8 byte length / 4 approximation — no external dependencies.
4
+ */
5
+ const _encoder = new TextEncoder();
6
+ /**
7
+ * Estimate token count for any value.
8
+ * Rough approximation: ~4 UTF-8 bytes per token.
9
+ * Uses TextEncoder for byte-accurate counting (handles non-ASCII correctly).
10
+ * Accurate enough for context-budget alerting; not suitable for exact billing.
11
+ *
12
+ * Pass raw values/objects only. For pre-serialized strings use
13
+ * `estimateSerializedTokens` directly — passing a string here will
14
+ * double-serialize it (JSON.stringify wraps strings in quotes), inflating
15
+ * the estimate.
16
+ */
17
+ export function estimateTokens(value) {
18
+ if (value == null)
19
+ return 0;
20
+ return Math.ceil(_encoder.encode(JSON.stringify(value)).length / 4);
21
+ }
22
+ /**
23
+ * Estimate token count for an already-serialized JSON string.
24
+ * Uses byte-accurate UTF-8 counting, consistent with estimateTokens.
25
+ * Use this when the value has already been passed through redactAndTruncate
26
+ * (which returns a string) to avoid double-serialization.
27
+ */
28
+ export function estimateSerializedTokens(json) {
29
+ return Math.ceil(_encoder.encode(json).length / 4);
30
+ }
31
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/utils/tokens.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,QAAQ,GAAG,IAAI,WAAW,EAAE,CAAC;AAEnC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,CAAC,CAAC;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACtE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAAY;IACnD,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for token estimation utility.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=tokens.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.test.d.ts","sourceRoot":"","sources":["../../src/utils/tokens.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Tests for token estimation utility.
3
+ */
4
+ import { describe, it, expect } from "vitest";
5
+ import { estimateTokens, estimateSerializedTokens } from "./tokens.js";
6
+ describe("estimateTokens", () => {
7
+ it("returns a positive integer for a simple object", () => {
8
+ const result = estimateTokens({ query: "SELECT 1" });
9
+ expect(result).toBeGreaterThan(0);
10
+ expect(Number.isInteger(result)).toBe(true);
11
+ });
12
+ it("returns the same value as estimateSerializedTokens on its JSON form", () => {
13
+ const value = { tool: "execute_sql", database: "prod" };
14
+ const json = JSON.stringify(value);
15
+ expect(estimateTokens(value)).toBe(estimateSerializedTokens(json));
16
+ });
17
+ it("returns 0 for null and undefined", () => {
18
+ expect(estimateTokens(null)).toBe(0);
19
+ expect(estimateTokens(undefined)).toBe(0);
20
+ });
21
+ it("does NOT double-serialize an already-serialized string", () => {
22
+ // estimateTokens on a raw object should equal estimateSerializedTokens
23
+ // on the same object's JSON form (no double-serialization).
24
+ const obj = { name: "test", value: 42 };
25
+ const serialized = JSON.stringify(obj);
26
+ const fromObject = estimateTokens(obj);
27
+ const fromSerialized = estimateSerializedTokens(serialized);
28
+ expect(fromObject).toBe(fromSerialized);
29
+ });
30
+ it("double-serializes when called with an already-serialized string (known behaviour)", () => {
31
+ // estimateTokens accepts `unknown` and always calls JSON.stringify internally.
32
+ // Callers with already-serialized strings should use estimateSerializedTokens()
33
+ // directly to avoid this.
34
+ const obj = { name: "test", value: 42 };
35
+ const serialized = JSON.stringify(obj); // '{"name":"test","value":42}'
36
+ const fromObject = estimateTokens(obj);
37
+ const fromString = estimateTokens(serialized); // double-stringifies
38
+ // Double-stringifying produces a larger (inflated) estimate
39
+ expect(fromString).toBeGreaterThan(fromObject);
40
+ // The correct approach for already-serialized strings
41
+ expect(estimateSerializedTokens(serialized)).toBe(fromObject);
42
+ });
43
+ it("handles non-ASCII content with byte-accurate counting", () => {
44
+ // Non-ASCII chars (e.g. emoji, CJK) encode to more than 1 byte in UTF-8.
45
+ // TextEncoder-based counting should reflect this; String.length would not.
46
+ const ascii = { text: "hello world" };
47
+ const nonAscii = { text: "こんにちは世界" }; // each char is 3 UTF-8 bytes
48
+ const asciiTokens = estimateTokens(ascii);
49
+ const nonAsciiTokens = estimateTokens(nonAscii);
50
+ // nonAscii has fewer visible chars but more bytes, so should have >= tokens
51
+ expect(nonAsciiTokens).toBeGreaterThanOrEqual(asciiTokens);
52
+ });
53
+ it("returns larger estimates for larger payloads", () => {
54
+ const small = { a: 1 };
55
+ const large = { data: "x".repeat(1000) };
56
+ expect(estimateTokens(large)).toBeGreaterThan(estimateTokens(small));
57
+ });
58
+ it("handles empty object", () => {
59
+ expect(estimateTokens({})).toBe(estimateSerializedTokens("{}"));
60
+ });
61
+ });
62
+ describe("estimateSerializedTokens", () => {
63
+ it("matches estimateTokens for ASCII JSON", () => {
64
+ const obj = { query: "SELECT 1" };
65
+ const serialized = JSON.stringify(obj);
66
+ expect(estimateSerializedTokens(serialized)).toBe(estimateTokens(obj));
67
+ });
68
+ it("uses byte-accurate counting for non-ASCII content", () => {
69
+ const json = JSON.stringify({ text: "こんにちは" });
70
+ const expected = Math.ceil(new TextEncoder().encode(json).length / 4);
71
+ expect(estimateSerializedTokens(json)).toBe(expected);
72
+ });
73
+ it("does not double-serialize strings", () => {
74
+ const obj = { name: "test" };
75
+ const serialized = JSON.stringify(obj);
76
+ // estimateSerializedTokens should give same result as estimateTokens on raw obj
77
+ expect(estimateSerializedTokens(serialized)).toBe(estimateTokens(obj));
78
+ });
79
+ });
80
+ //# sourceMappingURL=tokens.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.test.js","sourceRoot":"","sources":["../../src/utils/tokens.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAEvE,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,uEAAuE;QACvE,4DAA4D;QAC5D,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,cAAc,GAAG,wBAAwB,CAAC,UAAU,CAAC,CAAC;QAC5D,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mFAAmF,EAAE,GAAG,EAAE;QAC3F,+EAA+E;QAC/E,gFAAgF;QAChF,0BAA0B;QAC1B,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,+BAA+B;QACvE,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,qBAAqB;QACpE,4DAA4D;QAC5D,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAC/C,sDAAsD;QACtD,MAAM,CAAC,wBAAwB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,yEAAyE;QACzE,2EAA2E;QAC3E,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,6BAA6B;QACnE,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,cAAc,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QAChD,4EAA4E;QAC5E,MAAM,CAAC,cAAc,CAAC,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,CAAC,wBAAwB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACtE,MAAM,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACvC,gFAAgF;QAChF,MAAM,CAAC,wBAAwB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-recorder/hooks",
3
- "version": "2.0.13",
3
+ "version": "2.0.14",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAcL,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAO9B,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE9E,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,wEAAwE;IACxE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAkJvB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAcL,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAO9B,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE9E,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,wEAAwE;IACxE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAmJvB"}
@@ -64,6 +64,7 @@ export async function startDaemon(options = {}) {
64
64
  currentSessionId: sessionManager.sessionId,
65
65
  daemonContext,
66
66
  redactKeys: config.redactKeys,
67
+ contextBudgetTokens: config.contextBudgetTokens,
67
68
  });
68
69
  const actualListenPort = await startServer(app, config.listenPort);
69
70
  // Write actual port so CLI commands can find the daemon even if it fell back
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/mcp/proxy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAgB,MAAM,sBAAsB,CAAC;AAkBjE,+BAA+B;AAC/B,UAAU,aAAa;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAMD;;;;GAIG;AACH,+CAA+C;AAC/C,qBAAa,cAAc;IAMb,OAAO,CAAC,IAAI;IALxB,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAA8C;gBAE7C,IAAI,EAAE,MAAM;IAMhC,OAAO,CAAC,YAAY;IA2CpB,0EAA0E;IAC1E,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,MAAM;IASd,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAI3C,KAAK,IAAI,IAAI;CAMd;AAiBD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,eAAe,CAAC;IACrB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAoPD;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,oBAAoB,CAAC,CAoa/B"}
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/mcp/proxy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAgB,MAAM,sBAAsB,CAAC;AAoBjE,+BAA+B;AAC/B,UAAU,aAAa;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAMD;;;;GAIG;AACH,+CAA+C;AAC/C,qBAAa,cAAc;IAMb,OAAO,CAAC,IAAI;IALxB,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAA8C;gBAE7C,IAAI,EAAE,MAAM;IAMhC,OAAO,CAAC,YAAY;IA2CpB,0EAA0E;IAC1E,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,MAAM;IASd,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAI3C,KAAK,IAAI,IAAI;CAMd;AAiBD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,eAAe,CAAC;IACrB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAoPD;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,oBAAoB,CAAC,CAoc/B"}
@@ -5,7 +5,7 @@
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";
8
+ import { readProvidersFile, getDefaultProvidersPath, upsertToolSchemaMetric, estimateTokens, } from "@agent-recorder/core";
9
9
  import { readFileSync, watch, existsSync } from "node:fs";
10
10
  import { dirname, basename } from "node:path";
11
11
  import { isToolsCallRequest, isErrorResponse, } from "./types.js";
@@ -335,6 +335,33 @@ export async function createMcpProxy(options) {
335
335
  // Hub mode: Handle tools/list by aggregating from all providers
336
336
  if (body.method === "tools/list" && httpProviders.length > 0) {
337
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
+ }
338
365
  return reply.code(200).send(response);
339
366
  }
340
367
  // Declare variables for tool call tracking
@@ -376,6 +403,7 @@ export async function createMcpProxy(options) {
376
403
  endedAt: new Date().toISOString(),
377
404
  redactKeys,
378
405
  debugProxy,
406
+ contextBudgetTokens: config.contextBudgetTokens,
379
407
  });
380
408
  }
381
409
  return reply.code(404).send({
@@ -473,6 +501,7 @@ export async function createMcpProxy(options) {
473
501
  endedAt,
474
502
  redactKeys,
475
503
  debugProxy,
504
+ contextBudgetTokens: config.contextBudgetTokens,
476
505
  });
477
506
  }
478
507
  return reply.code(504).send({
@@ -557,6 +586,7 @@ export async function createMcpProxy(options) {
557
586
  endedAt,
558
587
  redactKeys,
559
588
  debugProxy,
589
+ contextBudgetTokens: config.contextBudgetTokens,
560
590
  });
561
591
  }
562
592
  return reply.code(502).send({
@@ -630,6 +660,7 @@ export async function createMcpProxy(options) {
630
660
  endedAt,
631
661
  redactKeys,
632
662
  debugProxy,
663
+ contextBudgetTokens: config.contextBudgetTokens,
633
664
  });
634
665
  }
635
666
  // Preserve downstream HTTP status code and return response unchanged