@agentlensai/mcp 0.5.0 → 0.7.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 (51) hide show
  1. package/dist/__tests__/benchmark.test.d.ts +5 -0
  2. package/dist/__tests__/benchmark.test.d.ts.map +1 -0
  3. package/dist/__tests__/benchmark.test.js +387 -0
  4. package/dist/__tests__/benchmark.test.js.map +1 -0
  5. package/dist/__tests__/health.test.d.ts.map +1 -0
  6. package/dist/__tests__/health.test.js +176 -0
  7. package/dist/__tests__/health.test.js.map +1 -0
  8. package/dist/__tests__/learn.test.js +2 -2
  9. package/dist/__tests__/learn.test.js.map +1 -1
  10. package/dist/__tests__/llm-call.test.js +2 -2
  11. package/dist/__tests__/llm-call.test.js.map +1 -1
  12. package/dist/__tests__/optimize.test.d.ts +5 -0
  13. package/dist/__tests__/optimize.test.d.ts.map +1 -0
  14. package/dist/__tests__/optimize.test.js +218 -0
  15. package/dist/__tests__/optimize.test.js.map +1 -0
  16. package/dist/__tests__/recall.test.js +2 -2
  17. package/dist/__tests__/recall.test.js.map +1 -1
  18. package/dist/__tests__/replay.test.d.ts +5 -0
  19. package/dist/__tests__/replay.test.d.ts.map +1 -0
  20. package/dist/__tests__/replay.test.js +245 -0
  21. package/dist/__tests__/replay.test.js.map +1 -0
  22. package/dist/server.test.js +6 -2
  23. package/dist/server.test.js.map +1 -1
  24. package/dist/tools/benchmark.d.ts +69 -0
  25. package/dist/tools/benchmark.d.ts.map +1 -0
  26. package/dist/tools/benchmark.js +378 -0
  27. package/dist/tools/benchmark.js.map +1 -0
  28. package/dist/tools/health.d.ts +32 -0
  29. package/dist/tools/health.d.ts.map +1 -0
  30. package/dist/tools/health.js +102 -0
  31. package/dist/tools/health.js.map +1 -0
  32. package/dist/tools/optimize.d.ts +10 -0
  33. package/dist/tools/optimize.d.ts.map +1 -0
  34. package/dist/tools/optimize.js +70 -0
  35. package/dist/tools/optimize.js.map +1 -0
  36. package/dist/tools/replay.d.ts +45 -0
  37. package/dist/tools/replay.d.ts.map +1 -0
  38. package/dist/tools/replay.js +183 -0
  39. package/dist/tools/replay.js.map +1 -0
  40. package/dist/tools.d.ts.map +1 -1
  41. package/dist/tools.js +8 -0
  42. package/dist/tools.js.map +1 -1
  43. package/dist/tools.test.js +5 -1
  44. package/dist/tools.test.js.map +1 -1
  45. package/dist/transport.d.ts +45 -0
  46. package/dist/transport.d.ts.map +1 -1
  47. package/dist/transport.js +164 -0
  48. package/dist/transport.js.map +1 -1
  49. package/package.json +2 -2
  50. package/dist/server.test.d.ts +0 -2
  51. package/dist/tools.test.d.ts +0 -2
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for agentlens_benchmark MCP tool (Stories 4.2, 4.3)
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=benchmark.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/benchmark.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,387 @@
1
+ /**
2
+ * Tests for agentlens_benchmark MCP tool (Stories 4.2, 4.3)
3
+ */
4
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
5
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
7
+ import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
8
+ import { registerTools } from '../tools.js';
9
+ import { AgentLensTransport } from '../transport.js';
10
+ import { formatBenchmarkList, formatBenchmarkCreated, formatBenchmarkStatus, formatBenchmarkResults, } from '../tools/benchmark.js';
11
+ const mockFetch = vi.fn();
12
+ beforeEach(() => {
13
+ vi.stubGlobal('fetch', mockFetch);
14
+ mockFetch.mockReset();
15
+ });
16
+ afterEach(() => {
17
+ vi.unstubAllGlobals();
18
+ });
19
+ function okResponse(data = {}) {
20
+ return new Response(JSON.stringify(data), {
21
+ status: 200,
22
+ headers: { 'Content-Type': 'application/json' },
23
+ });
24
+ }
25
+ function errorResponse(status, body) {
26
+ return new Response(body, { status });
27
+ }
28
+ const MOCK_BENCHMARK_DETAIL = {
29
+ id: 'bench_001',
30
+ name: 'GPT-4o vs Claude',
31
+ status: 'draft',
32
+ description: 'Compare models on coding tasks',
33
+ variants: [
34
+ { name: 'gpt-4o', tag: 'v-gpt4o', description: 'OpenAI GPT-4o', sessionCount: 0 },
35
+ { name: 'claude-3.5', tag: 'v-claude', description: 'Anthropic Claude 3.5', sessionCount: 0 },
36
+ ],
37
+ metrics: ['cost', 'latency', 'success_rate'],
38
+ minSessions: 20,
39
+ agentId: 'test-agent',
40
+ createdAt: '2026-02-08T10:00:00.000Z',
41
+ };
42
+ const MOCK_BENCHMARK_RUNNING = {
43
+ ...MOCK_BENCHMARK_DETAIL,
44
+ status: 'running',
45
+ startedAt: '2026-02-08T11:00:00.000Z',
46
+ variants: [
47
+ { name: 'gpt-4o', tag: 'v-gpt4o', sessionCount: 15 },
48
+ { name: 'claude-3.5', tag: 'v-claude', sessionCount: 18 },
49
+ ],
50
+ };
51
+ const MOCK_BENCHMARK_LIST = [
52
+ {
53
+ id: 'bench_001',
54
+ name: 'GPT-4o vs Claude',
55
+ status: 'running',
56
+ variants: [
57
+ { name: 'gpt-4o', tag: 'v-gpt4o' },
58
+ { name: 'claude-3.5', tag: 'v-claude' },
59
+ ],
60
+ createdAt: '2026-02-08T10:00:00.000Z',
61
+ },
62
+ {
63
+ id: 'bench_002',
64
+ name: 'Temperature Sweep',
65
+ status: 'completed',
66
+ variants: [
67
+ { name: 'temp-0.0', tag: 'v-t0' },
68
+ { name: 'temp-0.7', tag: 'v-t7' },
69
+ { name: 'temp-1.0', tag: 'v-t10' },
70
+ ],
71
+ createdAt: '2026-02-07T10:00:00.000Z',
72
+ description: 'Comparing temperature settings',
73
+ },
74
+ ];
75
+ const MOCK_RESULTS = {
76
+ benchmarkId: 'bench_001',
77
+ name: 'GPT-4o vs Claude',
78
+ status: 'completed',
79
+ metrics: [
80
+ {
81
+ metric: 'cost',
82
+ variants: [
83
+ { name: 'gpt-4o', mean: 0.0045, stddev: 0.001, n: 20 },
84
+ { name: 'claude-3.5', mean: 0.0032, stddev: 0.0008, n: 20 },
85
+ ],
86
+ pValue: 0.003,
87
+ significant: true,
88
+ winner: 'claude-3.5',
89
+ difference: -0.0013,
90
+ differencePercent: -28.9,
91
+ },
92
+ {
93
+ metric: 'latency',
94
+ variants: [
95
+ { name: 'gpt-4o', mean: 1200, stddev: 300, n: 20 },
96
+ { name: 'claude-3.5', mean: 1150, stddev: 280, n: 20 },
97
+ ],
98
+ pValue: 0.42,
99
+ significant: false,
100
+ },
101
+ {
102
+ metric: 'success_rate',
103
+ variants: [
104
+ { name: 'gpt-4o', mean: 0.92, stddev: 0.05, n: 20 },
105
+ { name: 'claude-3.5', mean: 0.95, stddev: 0.03, n: 20 },
106
+ ],
107
+ pValue: 0.02,
108
+ significant: true,
109
+ winner: 'claude-3.5',
110
+ difference: 0.03,
111
+ differencePercent: 3.3,
112
+ },
113
+ ],
114
+ summary: 'Claude 3.5 wins on cost (p<0.01) and success rate (p<0.05). No significant difference in latency.',
115
+ };
116
+ async function createTestSetup() {
117
+ const transport = new AgentLensTransport({
118
+ baseUrl: 'http://localhost:3400',
119
+ apiKey: 'test-key',
120
+ });
121
+ const server = new McpServer({ name: 'agentlens-test', version: '0.0.0' }, { capabilities: { tools: {} } });
122
+ registerTools(server, transport);
123
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
124
+ const client = new Client({ name: 'test-client', version: '1.0.0' });
125
+ await server.connect(serverTransport);
126
+ await client.connect(clientTransport);
127
+ return { server, client, transport };
128
+ }
129
+ describe('agentlens_benchmark', () => {
130
+ it('tool is registered with correct schema', async () => {
131
+ const { client } = await createTestSetup();
132
+ const result = await client.listTools();
133
+ const tool = result.tools.find((t) => t.name === 'agentlens_benchmark');
134
+ expect(tool).toBeDefined();
135
+ expect(tool.description).toContain('benchmark');
136
+ const schema = tool.inputSchema;
137
+ expect(schema.properties).toHaveProperty('action');
138
+ expect(schema.properties).toHaveProperty('name');
139
+ expect(schema.properties).toHaveProperty('variants');
140
+ expect(schema.properties).toHaveProperty('benchmarkId');
141
+ expect(schema.required).toContain('action');
142
+ });
143
+ it('total tool count is 13', async () => {
144
+ const { client } = await createTestSetup();
145
+ const result = await client.listTools();
146
+ expect(result.tools).toHaveLength(13);
147
+ });
148
+ // ─── Create ───────────────────────────────────────────────
149
+ it('creates a benchmark successfully', async () => {
150
+ mockFetch.mockResolvedValueOnce(okResponse(MOCK_BENCHMARK_DETAIL));
151
+ const { client } = await createTestSetup();
152
+ const result = await client.callTool({
153
+ name: 'agentlens_benchmark',
154
+ arguments: {
155
+ action: 'create',
156
+ name: 'GPT-4o vs Claude',
157
+ description: 'Compare models on coding tasks',
158
+ variants: [
159
+ { name: 'gpt-4o', tag: 'v-gpt4o' },
160
+ { name: 'claude-3.5', tag: 'v-claude' },
161
+ ],
162
+ metrics: ['cost', 'latency', 'success_rate'],
163
+ minSessions: 20,
164
+ },
165
+ });
166
+ expect(result.isError).toBeUndefined();
167
+ const content = result.content;
168
+ const text = content[0].text;
169
+ expect(text).toContain('✅ Benchmark created');
170
+ expect(text).toContain('GPT-4o vs Claude');
171
+ expect(text).toContain('bench_001');
172
+ expect(text).toContain('Next steps');
173
+ });
174
+ it('validates: name required for create', async () => {
175
+ const { client } = await createTestSetup();
176
+ const result = await client.callTool({
177
+ name: 'agentlens_benchmark',
178
+ arguments: {
179
+ action: 'create',
180
+ variants: [
181
+ { name: 'a', tag: 'ta' },
182
+ { name: 'b', tag: 'tb' },
183
+ ],
184
+ },
185
+ });
186
+ expect(result.isError).toBe(true);
187
+ const content = result.content;
188
+ expect(content[0].text).toContain('name');
189
+ });
190
+ it('validates: at least 2 variants required', async () => {
191
+ const { client } = await createTestSetup();
192
+ const result = await client.callTool({
193
+ name: 'agentlens_benchmark',
194
+ arguments: {
195
+ action: 'create',
196
+ name: 'Test',
197
+ variants: [{ name: 'only-one', tag: 'v1' }],
198
+ },
199
+ });
200
+ expect(result.isError).toBe(true);
201
+ const content = result.content;
202
+ expect(content[0].text).toContain('2 variants');
203
+ });
204
+ // ─── List ─────────────────────────────────────────────────
205
+ it('lists benchmarks', async () => {
206
+ mockFetch.mockResolvedValueOnce(okResponse({ benchmarks: MOCK_BENCHMARK_LIST }));
207
+ const { client } = await createTestSetup();
208
+ const result = await client.callTool({
209
+ name: 'agentlens_benchmark',
210
+ arguments: { action: 'list' },
211
+ });
212
+ expect(result.isError).toBeUndefined();
213
+ const content = result.content;
214
+ const text = content[0].text;
215
+ expect(text).toContain('Benchmarks (2)');
216
+ expect(text).toContain('GPT-4o vs Claude');
217
+ expect(text).toContain('Temperature Sweep');
218
+ });
219
+ it('lists benchmarks with status filter', async () => {
220
+ mockFetch.mockResolvedValueOnce(okResponse({ benchmarks: [MOCK_BENCHMARK_LIST[0]] }));
221
+ const { client } = await createTestSetup();
222
+ await client.callTool({
223
+ name: 'agentlens_benchmark',
224
+ arguments: { action: 'list', status: 'running' },
225
+ });
226
+ const fetchUrl = mockFetch.mock.calls[0][0];
227
+ expect(fetchUrl).toContain('status=running');
228
+ });
229
+ // ─── Status ───────────────────────────────────────────────
230
+ it('gets benchmark status with session counts', async () => {
231
+ mockFetch.mockResolvedValueOnce(okResponse(MOCK_BENCHMARK_RUNNING));
232
+ const { client } = await createTestSetup();
233
+ const result = await client.callTool({
234
+ name: 'agentlens_benchmark',
235
+ arguments: { action: 'status', benchmarkId: 'bench_001' },
236
+ });
237
+ expect(result.isError).toBeUndefined();
238
+ const content = result.content;
239
+ const text = content[0].text;
240
+ expect(text).toContain('🏃 Benchmark: GPT-4o vs Claude [running]');
241
+ expect(text).toContain('15/20');
242
+ expect(text).toContain('18/20');
243
+ });
244
+ it('validates: benchmarkId required for status', async () => {
245
+ const { client } = await createTestSetup();
246
+ const result = await client.callTool({
247
+ name: 'agentlens_benchmark',
248
+ arguments: { action: 'status' },
249
+ });
250
+ expect(result.isError).toBe(true);
251
+ const content = result.content;
252
+ expect(content[0].text).toContain('benchmarkId');
253
+ });
254
+ // ─── Results ──────────────────────────────────────────────
255
+ it('gets benchmark results as formatted table', async () => {
256
+ mockFetch.mockResolvedValueOnce(okResponse(MOCK_RESULTS));
257
+ const { client } = await createTestSetup();
258
+ const result = await client.callTool({
259
+ name: 'agentlens_benchmark',
260
+ arguments: { action: 'results', benchmarkId: 'bench_001' },
261
+ });
262
+ expect(result.isError).toBeUndefined();
263
+ const content = result.content;
264
+ const text = content[0].text;
265
+ expect(text).toContain('Benchmark Results');
266
+ expect(text).toContain('cost');
267
+ expect(text).toContain('latency');
268
+ expect(text).toContain('success_rate');
269
+ expect(text).toContain('claude-3.5 wins');
270
+ expect(text).toContain('no sig. diff.');
271
+ expect(text).toContain('★★');
272
+ expect(text).toContain('p<0.05');
273
+ });
274
+ // ─── Start ────────────────────────────────────────────────
275
+ it('starts a benchmark', async () => {
276
+ mockFetch.mockResolvedValueOnce(okResponse({ ...MOCK_BENCHMARK_DETAIL, status: 'running', name: 'GPT-4o vs Claude' }));
277
+ const { client } = await createTestSetup();
278
+ const result = await client.callTool({
279
+ name: 'agentlens_benchmark',
280
+ arguments: { action: 'start', benchmarkId: 'bench_001' },
281
+ });
282
+ expect(result.isError).toBeUndefined();
283
+ const content = result.content;
284
+ expect(content[0].text).toContain('🏃 Benchmark "GPT-4o vs Claude" is now running');
285
+ // Verify correct API call
286
+ const fetchUrl = mockFetch.mock.calls[0][0];
287
+ expect(fetchUrl).toContain('/api/benchmarks/bench_001/status');
288
+ const fetchOpts = mockFetch.mock.calls[0][1];
289
+ expect(JSON.parse(fetchOpts.body)).toEqual({ status: 'running' });
290
+ });
291
+ // ─── Complete ─────────────────────────────────────────────
292
+ it('completes a benchmark', async () => {
293
+ mockFetch.mockResolvedValueOnce(okResponse({
294
+ ...MOCK_BENCHMARK_DETAIL,
295
+ status: 'completed',
296
+ name: 'GPT-4o vs Claude',
297
+ results: MOCK_RESULTS,
298
+ }));
299
+ const { client } = await createTestSetup();
300
+ const result = await client.callTool({
301
+ name: 'agentlens_benchmark',
302
+ arguments: { action: 'complete', benchmarkId: 'bench_001' },
303
+ });
304
+ expect(result.isError).toBeUndefined();
305
+ const content = result.content;
306
+ const text = content[0].text;
307
+ expect(text).toContain('✅ Benchmark "GPT-4o vs Claude" is now completed');
308
+ expect(text).toContain('Benchmark Results');
309
+ });
310
+ // ─── Error Handling ───────────────────────────────────────
311
+ it('handles 404 error for invalid benchmark', async () => {
312
+ mockFetch.mockResolvedValueOnce(errorResponse(404, '{"error":"Not found"}'));
313
+ const { client } = await createTestSetup();
314
+ const result = await client.callTool({
315
+ name: 'agentlens_benchmark',
316
+ arguments: { action: 'status', benchmarkId: 'nonexistent' },
317
+ });
318
+ expect(result.isError).toBe(true);
319
+ const content = result.content;
320
+ expect(content[0].text).toContain('Benchmark not found');
321
+ });
322
+ it('handles network errors', async () => {
323
+ mockFetch.mockRejectedValueOnce(new Error('Connection refused'));
324
+ const { client } = await createTestSetup();
325
+ const result = await client.callTool({
326
+ name: 'agentlens_benchmark',
327
+ arguments: { action: 'list' },
328
+ });
329
+ expect(result.isError).toBe(true);
330
+ const content = result.content;
331
+ expect(content[0].text).toContain('Connection refused');
332
+ });
333
+ });
334
+ describe('formatBenchmarkList', () => {
335
+ it('formats empty list', () => {
336
+ expect(formatBenchmarkList([])).toBe('No benchmarks found.');
337
+ });
338
+ it('formats list with status icons and variant names', () => {
339
+ const text = formatBenchmarkList(MOCK_BENCHMARK_LIST);
340
+ expect(text).toContain('📊 Benchmarks (2)');
341
+ expect(text).toContain('🏃 GPT-4o vs Claude [running]');
342
+ expect(text).toContain('✅ Temperature Sweep [completed]');
343
+ expect(text).toContain('gpt-4o vs claude-3.5');
344
+ expect(text).toContain('temp-0.0 vs temp-0.7 vs temp-1.0');
345
+ expect(text).toContain('Comparing temperature settings');
346
+ });
347
+ });
348
+ describe('formatBenchmarkResults', () => {
349
+ it('formats results as ASCII table with confidence stars', () => {
350
+ const text = formatBenchmarkResults(MOCK_RESULTS);
351
+ expect(text).toContain('Benchmark Results: GPT-4o vs Claude');
352
+ expect(text).toContain('cost');
353
+ expect(text).toContain('latency');
354
+ expect(text).toContain('success_rate');
355
+ expect(text).toContain('claude-3.5 wins');
356
+ expect(text).toContain('no sig. diff.');
357
+ // p=0.003 → ★★
358
+ expect(text).toContain('★★');
359
+ // p=0.02 → ★
360
+ expect(text).toContain('★');
361
+ expect(text).toContain('Confidence:');
362
+ expect(text).toContain('Summary:');
363
+ });
364
+ it('formats empty results', () => {
365
+ const empty = {
366
+ benchmarkId: 'bench_001',
367
+ name: 'Test',
368
+ status: 'running',
369
+ metrics: [],
370
+ summary: '',
371
+ };
372
+ const text = formatBenchmarkResults(empty);
373
+ expect(text).toContain('No results available yet');
374
+ });
375
+ });
376
+ describe('formatBenchmarkStatus', () => {
377
+ it('formats status with session progress', () => {
378
+ const text = formatBenchmarkStatus(MOCK_BENCHMARK_RUNNING);
379
+ expect(text).toContain('🏃 Benchmark: GPT-4o vs Claude [running]');
380
+ expect(text).toContain('gpt-4o [v-gpt4o]');
381
+ expect(text).toContain('15/20');
382
+ expect(text).toContain('claude-3.5 [v-claude]');
383
+ expect(text).toContain('18/20');
384
+ expect(text).toContain('Metrics: cost, latency, success_rate');
385
+ });
386
+ });
387
+ //# sourceMappingURL=benchmark.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark.test.js","sourceRoot":"","sources":["../../src/__tests__/benchmark.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,GAIvB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAE1B,UAAU,CAAC,GAAG,EAAE;IACd,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAClC,SAAS,CAAC,SAAS,EAAE,CAAC;AACxB,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,EAAE,CAAC,gBAAgB,EAAE,CAAC;AACxB,CAAC,CAAC,CAAC;AAEH,SAAS,UAAU,CAAC,OAAgB,EAAE;IACpC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QACxC,MAAM,EAAE,GAAG;QACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;KAChD,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,MAAc,EAAE,IAAY;IACjD,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,qBAAqB,GAAoB;IAC7C,EAAE,EAAE,WAAW;IACf,IAAI,EAAE,kBAAkB;IACxB,MAAM,EAAE,OAAO;IACf,WAAW,EAAE,gCAAgC;IAC7C,QAAQ,EAAE;QACR,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,CAAC,EAAE;QACjF,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,sBAAsB,EAAE,YAAY,EAAE,CAAC,EAAE;KAC9F;IACD,OAAO,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,cAAc,CAAC;IAC5C,WAAW,EAAE,EAAE;IACf,OAAO,EAAE,YAAY;IACrB,SAAS,EAAE,0BAA0B;CACtC,CAAC;AAEF,MAAM,sBAAsB,GAAoB;IAC9C,GAAG,qBAAqB;IACxB,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,0BAA0B;IACrC,QAAQ,EAAE;QACR,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,EAAE;QACpD,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE,EAAE;KAC1D;CACF,CAAC;AAEF,MAAM,mBAAmB,GAAuB;IAC9C;QACE,EAAE,EAAE,WAAW;QACf,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE;YACR,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE;YAClC,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE;SACxC;QACD,SAAS,EAAE,0BAA0B;KACtC;IACD;QACE,EAAE,EAAE,WAAW;QACf,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE,WAAW;QACnB,QAAQ,EAAE;YACR,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE;YACjC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE;YACjC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE;SACnC;QACD,SAAS,EAAE,0BAA0B;QACrC,WAAW,EAAE,gCAAgC;KAC9C;CACF,CAAC;AAEF,MAAM,YAAY,GAAqB;IACrC,WAAW,EAAE,WAAW;IACxB,IAAI,EAAE,kBAAkB;IACxB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE;QACP;YACE,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE;gBACtD,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE;aAC5D;YACD,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,YAAY;YACpB,UAAU,EAAE,CAAC,MAAM;YACnB,iBAAiB,EAAE,CAAC,IAAI;SACzB;QACD;YACE,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE;gBAClD,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE;aACvD;YACD,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,KAAK;SACnB;QACD;YACE,MAAM,EAAE,cAAc;YACtB,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE;gBACnD,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE;aACxD;YACD,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,YAAY;YACpB,UAAU,EAAE,IAAI;YAChB,iBAAiB,EAAE,GAAG;SACvB;KACF;IACD,OAAO,EAAE,mGAAmG;CAC7G,CAAC;AAEF,KAAK,UAAU,eAAe;IAC5B,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC;QACvC,OAAO,EAAE,uBAAuB;QAChC,MAAM,EAAE,UAAU;KACnB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,EAAE,EAC5C,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAC;IAEF,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEjC,MAAM,CAAC,eAAe,EAAE,eAAe,CAAC,GAAG,iBAAiB,CAAC,gBAAgB,EAAE,CAAC;IAChF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAErE,MAAM,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACtC,MAAM,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAEtC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AACvC,CAAC;AAED,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QAE3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,qBAAqB,CAAC,CAAC;QACxE,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAK,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAEjD,MAAM,MAAM,GAAG,IAAK,CAAC,WAA4E,CAAC;QAClG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,6DAA6D;IAE7D,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,SAAS,CAAC,qBAAqB,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAEnE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,qBAAqB;YAC3B,SAAS,EAAE;gBACT,MAAM,EAAE,QAAQ;gBAChB,IAAI,EAAE,kBAAkB;gBACxB,WAAW,EAAE,gCAAgC;gBAC7C,QAAQ,EAAE;oBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE;oBAClC,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE;iBACxC;gBACD,OAAO,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,cAAc,CAAC;gBAC5C,WAAW,EAAE,EAAE;aAChB;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAgD,CAAC;QACxE,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,qBAAqB;YAC3B,SAAS,EAAE;gBACT,MAAM,EAAE,QAAQ;gBAChB,QAAQ,EAAE;oBACR,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE;oBACxB,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE;iBACzB;aACF;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAgD,CAAC;QACxE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,qBAAqB;YAC3B,SAAS,EAAE;gBACT,MAAM,EAAE,QAAQ;gBAChB,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;aAC5C;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAgD,CAAC;QACxE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,6DAA6D;IAE7D,EAAE,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;QAChC,SAAS,CAAC,qBAAqB,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;QAEjF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,qBAAqB;YAC3B,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;SAC9B,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAgD,CAAC;QACxE,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,SAAS,CAAC,qBAAqB,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEtF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QAC3C,MAAM,MAAM,CAAC,QAAQ,CAAC;YACpB,IAAI,EAAE,qBAAqB;YAC3B,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE;SACjD,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAW,CAAC;QACvD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,6DAA6D;IAE7D,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,SAAS,CAAC,qBAAqB,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAEpE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,qBAAqB;YAC3B,SAAS,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE;SAC1D,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAgD,CAAC;QACxE,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,0CAA0C,CAAC,CAAC;QACnE,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,qBAAqB;YAC3B,SAAS,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;SAChC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAgD,CAAC;QACxE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,6DAA6D;IAE7D,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,SAAS,CAAC,qBAAqB,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;QAE1D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,qBAAqB;YAC3B,SAAS,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE;SAC3D,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAgD,CAAC;QACxE,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,6DAA6D;IAE7D,EAAE,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;QAClC,SAAS,CAAC,qBAAqB,CAC7B,UAAU,CAAC,EAAE,GAAG,qBAAqB,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CACtF,CAAC;QAEF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,qBAAqB;YAC3B,SAAS,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE;SACzD,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAgD,CAAC;QACxE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,gDAAgD,CAAC,CAAC;QAErF,0BAA0B;QAC1B,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAW,CAAC;QACvD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAgB,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAc,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,6DAA6D;IAE7D,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACrC,SAAS,CAAC,qBAAqB,CAC7B,UAAU,CAAC;YACT,GAAG,qBAAqB;YACxB,MAAM,EAAE,WAAW;YACnB,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,YAAY;SACtB,CAAC,CACH,CAAC;QAEF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,qBAAqB;YAC3B,SAAS,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE;SAC5D,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAgD,CAAC;QACxE,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iDAAiD,CAAC,CAAC;QAC1E,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,6DAA6D;IAE7D,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,SAAS,CAAC,qBAAqB,CAAC,aAAa,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC,CAAC;QAE7E,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,qBAAqB;YAC3B,SAAS,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE;SAC5D,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAgD,CAAC;QACxE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,SAAS,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAEjE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,qBAAqB;YAC3B,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;SAC9B,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAgD,CAAC;QACxE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,IAAI,GAAG,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,IAAI,GAAG,sBAAsB,CAAC,YAAY,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;QAC9D,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACxC,eAAe;QACf,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7B,aAAa;QACb,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,KAAK,GAAqB;YAC9B,WAAW,EAAE,WAAW;YACxB,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,EAAE;SACZ,CAAC;QACF,MAAM,IAAI,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,IAAI,GAAG,qBAAqB,CAAC,sBAAsB,CAAC,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,0CAA0C,CAAC,CAAC;QACnE,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,sCAAsC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/health.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Tests for agentlens_health MCP tool (Story 1.5)
3
+ */
4
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
5
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
7
+ import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
8
+ import { registerTools } from '../tools.js';
9
+ import { AgentLensTransport } from '../transport.js';
10
+ import { formatHealthScore } from '../tools/health.js';
11
+ const mockFetch = vi.fn();
12
+ beforeEach(() => {
13
+ vi.stubGlobal('fetch', mockFetch);
14
+ mockFetch.mockReset();
15
+ });
16
+ afterEach(() => {
17
+ vi.unstubAllGlobals();
18
+ });
19
+ function okResponse(data = {}) {
20
+ return new Response(JSON.stringify(data), {
21
+ status: 200,
22
+ headers: { 'Content-Type': 'application/json' },
23
+ });
24
+ }
25
+ function errorResponse(status, body) {
26
+ return new Response(body, { status });
27
+ }
28
+ const MOCK_HEALTH_SCORE = {
29
+ agentId: 'test-agent',
30
+ overallScore: 82,
31
+ trend: 'improving',
32
+ trendDelta: 7,
33
+ dimensions: [
34
+ { name: 'error_rate', score: 90, weight: 0.30, rawValue: 0.1, description: '1/10 sessions had errors' },
35
+ { name: 'cost_efficiency', score: 75, weight: 0.20, rawValue: 0.005, description: 'Avg cost per session: $0.0050' },
36
+ { name: 'tool_success', score: 85, weight: 0.20, rawValue: 0.85, description: '17/20 tool calls succeeded' },
37
+ { name: 'latency', score: 78, weight: 0.15, rawValue: 1200, description: 'Avg session duration: 1200ms' },
38
+ { name: 'completion_rate', score: 80, weight: 0.15, rawValue: 0.8, description: '8/10 sessions completed' },
39
+ ],
40
+ window: { from: '2026-02-01T00:00:00.000Z', to: '2026-02-08T00:00:00.000Z' },
41
+ sessionCount: 42,
42
+ computedAt: '2026-02-08T12:00:00.000Z',
43
+ };
44
+ async function createTestSetup() {
45
+ const transport = new AgentLensTransport({
46
+ baseUrl: 'http://localhost:3400',
47
+ apiKey: 'test-key',
48
+ });
49
+ const server = new McpServer({ name: 'agentlens-test', version: '0.0.0' }, { capabilities: { tools: {} } });
50
+ registerTools(server, transport);
51
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
52
+ const client = new Client({ name: 'test-client', version: '1.0.0' });
53
+ await server.connect(serverTransport);
54
+ await client.connect(clientTransport);
55
+ return { server, client, transport };
56
+ }
57
+ describe('agentlens_health', () => {
58
+ it('tool is registered with correct schema', async () => {
59
+ const { client } = await createTestSetup();
60
+ const result = await client.listTools();
61
+ const tool = result.tools.find((t) => t.name === 'agentlens_health');
62
+ expect(tool).toBeDefined();
63
+ expect(tool.description).toContain('health score');
64
+ // Check inputSchema has window property
65
+ const schema = tool.inputSchema;
66
+ expect(schema.properties).toHaveProperty('window');
67
+ });
68
+ it('total tool count is 11', async () => {
69
+ const { client } = await createTestSetup();
70
+ const result = await client.listTools();
71
+ expect(result.tools).toHaveLength(13);
72
+ });
73
+ it('returns formatted output with score, trend, and dimensions', async () => {
74
+ mockFetch.mockResolvedValueOnce(okResponse(MOCK_HEALTH_SCORE));
75
+ const { client, transport } = await createTestSetup();
76
+ // Set up an active session so the tool has an agentId
77
+ transport.setSessionAgent('ses_test', 'test-agent');
78
+ const result = await client.callTool({
79
+ name: 'agentlens_health',
80
+ arguments: { window: 7 },
81
+ });
82
+ expect(result.isError).toBeUndefined();
83
+ const content = result.content;
84
+ const text = content[0].text;
85
+ expect(text).toContain('Health Score: 82/100');
86
+ expect(text).toContain('improving');
87
+ expect(text).toContain('+7pts');
88
+ expect(text).toContain('Error Rate:');
89
+ expect(text).toContain('Cost Efficiency:');
90
+ expect(text).toContain('Tool Success:');
91
+ expect(text).toContain('Latency:');
92
+ expect(text).toContain('Completion Rate:');
93
+ expect(text).toContain('42 sessions');
94
+ });
95
+ it('handles no sessions (404 from API)', async () => {
96
+ mockFetch.mockResolvedValueOnce(errorResponse(404, JSON.stringify({ error: 'No sessions found for agent in window' })));
97
+ const { client, transport } = await createTestSetup();
98
+ transport.setSessionAgent('ses_test', 'test-agent');
99
+ const result = await client.callTool({
100
+ name: 'agentlens_health',
101
+ arguments: {},
102
+ });
103
+ // Should not be isError — just informational
104
+ expect(result.isError).toBeUndefined();
105
+ const content = result.content;
106
+ expect(content[0].text).toContain('No sessions found');
107
+ });
108
+ it('uses default window of 7', async () => {
109
+ mockFetch.mockResolvedValueOnce(okResponse(MOCK_HEALTH_SCORE));
110
+ const { client, transport } = await createTestSetup();
111
+ transport.setSessionAgent('ses_test', 'test-agent');
112
+ await client.callTool({
113
+ name: 'agentlens_health',
114
+ arguments: {},
115
+ });
116
+ // Verify fetch was called with window=7
117
+ const fetchUrl = mockFetch.mock.calls[0][0];
118
+ expect(fetchUrl).toContain('window=7');
119
+ });
120
+ it('passes custom window parameter', async () => {
121
+ mockFetch.mockResolvedValueOnce(okResponse(MOCK_HEALTH_SCORE));
122
+ const { client, transport } = await createTestSetup();
123
+ transport.setSessionAgent('ses_test', 'test-agent');
124
+ await client.callTool({
125
+ name: 'agentlens_health',
126
+ arguments: { window: 30 },
127
+ });
128
+ const fetchUrl = mockFetch.mock.calls[0][0];
129
+ expect(fetchUrl).toContain('window=30');
130
+ });
131
+ it('returns error when no active session', async () => {
132
+ const { client } = await createTestSetup();
133
+ const result = await client.callTool({
134
+ name: 'agentlens_health',
135
+ arguments: {},
136
+ });
137
+ expect(result.isError).toBe(true);
138
+ const content = result.content;
139
+ expect(content[0].text).toContain('No active session');
140
+ });
141
+ it('handles network errors', async () => {
142
+ mockFetch.mockRejectedValueOnce(new Error('Connection refused'));
143
+ const { client, transport } = await createTestSetup();
144
+ transport.setSessionAgent('ses_test', 'test-agent');
145
+ const result = await client.callTool({
146
+ name: 'agentlens_health',
147
+ arguments: {},
148
+ });
149
+ expect(result.isError).toBe(true);
150
+ const content = result.content;
151
+ expect(content[0].text).toContain('Connection refused');
152
+ });
153
+ });
154
+ describe('formatHealthScore', () => {
155
+ it('formats health score as readable text', () => {
156
+ const text = formatHealthScore(MOCK_HEALTH_SCORE);
157
+ expect(text).toContain('Health Score: 82/100');
158
+ expect(text).toContain('↑ improving');
159
+ expect(text).toContain('+7pts');
160
+ expect(text).toContain('Dimensions:');
161
+ expect(text).toContain('Error Rate:');
162
+ expect(text).toContain('90/100 (weight: 0.30)');
163
+ expect(text).toContain('Window: 2026-02-01 to 2026-02-08 (42 sessions)');
164
+ });
165
+ it('formats degrading trend correctly', () => {
166
+ const degrading = {
167
+ ...MOCK_HEALTH_SCORE,
168
+ trend: 'degrading',
169
+ trendDelta: -10,
170
+ };
171
+ const text = formatHealthScore(degrading);
172
+ expect(text).toContain('↓ degrading');
173
+ expect(text).toContain('-10pts');
174
+ });
175
+ });
176
+ //# sourceMappingURL=health.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.test.js","sourceRoot":"","sources":["../../src/__tests__/health.test.ts"],"names":[],"mappings":"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"}
@@ -51,10 +51,10 @@ describe('agentlens_learn registration', () => {
51
51
  const toolNames = result.tools.map((t) => t.name);
52
52
  expect(toolNames).toContain('agentlens_learn');
53
53
  });
54
- it('registers 9 tools total', async () => {
54
+ it('registers 13 tools total', async () => {
55
55
  const { client } = await createTestSetup();
56
56
  const result = await client.listTools();
57
- expect(result.tools).toHaveLength(9);
57
+ expect(result.tools).toHaveLength(13);
58
58
  });
59
59
  it('has a description', async () => {
60
60
  const { client } = await createTestSetup();