@agentlensai/mcp 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/benchmark.test.d.ts +5 -0
- package/dist/__tests__/benchmark.test.d.ts.map +1 -0
- package/dist/__tests__/benchmark.test.js +387 -0
- package/dist/__tests__/benchmark.test.js.map +1 -0
- package/dist/__tests__/health.test.d.ts +5 -0
- package/dist/__tests__/health.test.js +2 -2
- package/dist/__tests__/learn.test.js +2 -2
- package/dist/__tests__/llm-call.test.js +2 -2
- package/dist/__tests__/optimize.test.js +2 -2
- package/dist/__tests__/optimize.test.js.map +1 -1
- package/dist/__tests__/recall.test.js +2 -2
- package/dist/__tests__/replay.test.d.ts +5 -0
- package/dist/__tests__/replay.test.d.ts.map +1 -0
- package/dist/__tests__/replay.test.js +245 -0
- package/dist/__tests__/replay.test.js.map +1 -0
- package/dist/server.test.d.ts +2 -0
- package/dist/server.test.js +5 -2
- package/dist/server.test.js.map +1 -1
- package/dist/tools/__tests__/guardrails.test.d.ts +5 -0
- package/dist/tools/__tests__/guardrails.test.d.ts.map +1 -0
- package/dist/tools/__tests__/guardrails.test.js +63 -0
- package/dist/tools/__tests__/guardrails.test.js.map +1 -0
- package/dist/tools/benchmark.d.ts +69 -0
- package/dist/tools/benchmark.d.ts.map +1 -0
- package/dist/tools/benchmark.js +378 -0
- package/dist/tools/benchmark.js.map +1 -0
- package/dist/tools/guardrails-format.d.ts +30 -0
- package/dist/tools/guardrails-format.d.ts.map +1 -0
- package/dist/tools/guardrails-format.js +30 -0
- package/dist/tools/guardrails-format.js.map +1 -0
- package/dist/tools/guardrails.d.ts +10 -0
- package/dist/tools/guardrails.d.ts.map +1 -0
- package/dist/tools/guardrails.js +87 -0
- package/dist/tools/guardrails.js.map +1 -0
- package/dist/tools/replay.d.ts +45 -0
- package/dist/tools/replay.d.ts.map +1 -0
- package/dist/tools/replay.js +183 -0
- package/dist/tools/replay.js.map +1 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +6 -0
- package/dist/tools.js.map +1 -1
- package/dist/tools.test.d.ts +2 -0
- package/dist/tools.test.js +4 -1
- package/dist/tools.test.js.map +1 -1
- package/dist/transport.d.ts +30 -0
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +135 -0
- package/dist/transport.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for agentlens_replay MCP tool (Story 4.1)
|
|
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 { formatReplay, formatReplayHeader, formatReplayStep, } from '../tools/replay.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_REPLAY = {
|
|
29
|
+
sessionId: 'ses_abc123',
|
|
30
|
+
agentId: 'test-agent',
|
|
31
|
+
status: 'completed',
|
|
32
|
+
startedAt: '2026-02-08T10:00:00.000Z',
|
|
33
|
+
endedAt: '2026-02-08T10:05:30.000Z',
|
|
34
|
+
durationMs: 330000,
|
|
35
|
+
totalCostUsd: 0.0452,
|
|
36
|
+
eventCounts: {
|
|
37
|
+
llm_call: 3,
|
|
38
|
+
tool_call: 2,
|
|
39
|
+
llm_response: 3,
|
|
40
|
+
tool_response: 2,
|
|
41
|
+
},
|
|
42
|
+
steps: [
|
|
43
|
+
{
|
|
44
|
+
index: 1,
|
|
45
|
+
timestamp: '2026-02-08T10:00:01.000Z',
|
|
46
|
+
eventType: 'llm_call',
|
|
47
|
+
severity: 'info',
|
|
48
|
+
summary: 'Called claude-3.5-sonnet with 3 messages',
|
|
49
|
+
durationMs: 1200,
|
|
50
|
+
costUsd: 0.012,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
index: 2,
|
|
54
|
+
timestamp: '2026-02-08T10:00:02.200Z',
|
|
55
|
+
eventType: 'llm_response',
|
|
56
|
+
severity: 'info',
|
|
57
|
+
summary: 'Response: 245 tokens, finish_reason: tool_use',
|
|
58
|
+
paired: true,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
index: 3,
|
|
62
|
+
timestamp: '2026-02-08T10:00:03.000Z',
|
|
63
|
+
eventType: 'tool_call',
|
|
64
|
+
severity: 'info',
|
|
65
|
+
summary: 'search_files({ query: "error handler" })',
|
|
66
|
+
durationMs: 800,
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
index: 4,
|
|
70
|
+
timestamp: '2026-02-08T10:00:03.800Z',
|
|
71
|
+
eventType: 'tool_response',
|
|
72
|
+
severity: 'info',
|
|
73
|
+
summary: 'Returned 5 results',
|
|
74
|
+
paired: true,
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
index: 5,
|
|
78
|
+
timestamp: '2026-02-08T10:05:00.000Z',
|
|
79
|
+
eventType: 'llm_call',
|
|
80
|
+
severity: 'error',
|
|
81
|
+
summary: 'Called gpt-4o with 8 messages',
|
|
82
|
+
error: 'Rate limit exceeded',
|
|
83
|
+
costUsd: 0.033,
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
};
|
|
87
|
+
async function createTestSetup() {
|
|
88
|
+
const transport = new AgentLensTransport({
|
|
89
|
+
baseUrl: 'http://localhost:3400',
|
|
90
|
+
apiKey: 'test-key',
|
|
91
|
+
});
|
|
92
|
+
const server = new McpServer({ name: 'agentlens-test', version: '0.0.0' }, { capabilities: { tools: {} } });
|
|
93
|
+
registerTools(server, transport);
|
|
94
|
+
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
95
|
+
const client = new Client({ name: 'test-client', version: '1.0.0' });
|
|
96
|
+
await server.connect(serverTransport);
|
|
97
|
+
await client.connect(clientTransport);
|
|
98
|
+
return { server, client, transport };
|
|
99
|
+
}
|
|
100
|
+
describe('agentlens_replay', () => {
|
|
101
|
+
it('tool is registered with correct schema', async () => {
|
|
102
|
+
const { client } = await createTestSetup();
|
|
103
|
+
const result = await client.listTools();
|
|
104
|
+
const tool = result.tools.find((t) => t.name === 'agentlens_replay');
|
|
105
|
+
expect(tool).toBeDefined();
|
|
106
|
+
expect(tool.description).toContain('Replay');
|
|
107
|
+
const schema = tool.inputSchema;
|
|
108
|
+
expect(schema.properties).toHaveProperty('sessionId');
|
|
109
|
+
expect(schema.properties).toHaveProperty('fromStep');
|
|
110
|
+
expect(schema.properties).toHaveProperty('toStep');
|
|
111
|
+
expect(schema.properties).toHaveProperty('eventTypes');
|
|
112
|
+
expect(schema.properties).toHaveProperty('summaryOnly');
|
|
113
|
+
expect(schema.required).toContain('sessionId');
|
|
114
|
+
});
|
|
115
|
+
it('returns formatted replay with steps', async () => {
|
|
116
|
+
mockFetch.mockResolvedValueOnce(okResponse(MOCK_REPLAY));
|
|
117
|
+
const { client } = await createTestSetup();
|
|
118
|
+
const result = await client.callTool({
|
|
119
|
+
name: 'agentlens_replay',
|
|
120
|
+
arguments: { sessionId: 'ses_abc123' },
|
|
121
|
+
});
|
|
122
|
+
expect(result.isError).toBeUndefined();
|
|
123
|
+
const content = result.content;
|
|
124
|
+
const text = content[0].text;
|
|
125
|
+
// Header checks
|
|
126
|
+
expect(text).toContain('📼 Session Replay: ses_abc123');
|
|
127
|
+
expect(text).toContain('Agent: test-agent');
|
|
128
|
+
expect(text).toContain('Status: completed');
|
|
129
|
+
expect(text).toContain('Duration: 5m 30s');
|
|
130
|
+
expect(text).toContain('Total Cost: $0.0452');
|
|
131
|
+
// Step checks
|
|
132
|
+
expect(text).toContain('🤖 llm_call');
|
|
133
|
+
expect(text).toContain('🔧 tool_call');
|
|
134
|
+
expect(text).toContain('⚠️ Error: Rate limit exceeded');
|
|
135
|
+
});
|
|
136
|
+
it('returns summary only when summaryOnly=true', async () => {
|
|
137
|
+
mockFetch.mockResolvedValueOnce(okResponse(MOCK_REPLAY));
|
|
138
|
+
const { client } = await createTestSetup();
|
|
139
|
+
const result = await client.callTool({
|
|
140
|
+
name: 'agentlens_replay',
|
|
141
|
+
arguments: { sessionId: 'ses_abc123', summaryOnly: true },
|
|
142
|
+
});
|
|
143
|
+
expect(result.isError).toBeUndefined();
|
|
144
|
+
const content = result.content;
|
|
145
|
+
const text = content[0].text;
|
|
146
|
+
// Header present
|
|
147
|
+
expect(text).toContain('📼 Session Replay: ses_abc123');
|
|
148
|
+
expect(text).toContain('Agent: test-agent');
|
|
149
|
+
// Steps absent
|
|
150
|
+
expect(text).not.toContain('🤖 llm_call');
|
|
151
|
+
expect(text).not.toContain('search_files');
|
|
152
|
+
});
|
|
153
|
+
it('passes step range as offset/limit', async () => {
|
|
154
|
+
mockFetch.mockResolvedValueOnce(okResponse(MOCK_REPLAY));
|
|
155
|
+
const { client } = await createTestSetup();
|
|
156
|
+
await client.callTool({
|
|
157
|
+
name: 'agentlens_replay',
|
|
158
|
+
arguments: { sessionId: 'ses_abc123', fromStep: 2, toStep: 4 },
|
|
159
|
+
});
|
|
160
|
+
const fetchUrl = mockFetch.mock.calls[0][0];
|
|
161
|
+
expect(fetchUrl).toContain('offset=2');
|
|
162
|
+
expect(fetchUrl).toContain('limit=3');
|
|
163
|
+
});
|
|
164
|
+
it('passes eventTypes filter', async () => {
|
|
165
|
+
mockFetch.mockResolvedValueOnce(okResponse(MOCK_REPLAY));
|
|
166
|
+
const { client } = await createTestSetup();
|
|
167
|
+
await client.callTool({
|
|
168
|
+
name: 'agentlens_replay',
|
|
169
|
+
arguments: { sessionId: 'ses_abc123', eventTypes: 'llm_call,tool_call' },
|
|
170
|
+
});
|
|
171
|
+
const fetchUrl = mockFetch.mock.calls[0][0];
|
|
172
|
+
expect(fetchUrl).toContain('eventTypes=llm_call%2Ctool_call');
|
|
173
|
+
});
|
|
174
|
+
it('returns error for invalid session (404)', async () => {
|
|
175
|
+
mockFetch.mockResolvedValueOnce(errorResponse(404, '{"error":"Not found"}'));
|
|
176
|
+
const { client } = await createTestSetup();
|
|
177
|
+
const result = await client.callTool({
|
|
178
|
+
name: 'agentlens_replay',
|
|
179
|
+
arguments: { sessionId: 'nonexistent' },
|
|
180
|
+
});
|
|
181
|
+
expect(result.isError).toBe(true);
|
|
182
|
+
const content = result.content;
|
|
183
|
+
expect(content[0].text).toContain('Session not found: nonexistent');
|
|
184
|
+
});
|
|
185
|
+
it('handles network errors', async () => {
|
|
186
|
+
mockFetch.mockRejectedValueOnce(new Error('Connection refused'));
|
|
187
|
+
const { client } = await createTestSetup();
|
|
188
|
+
const result = await client.callTool({
|
|
189
|
+
name: 'agentlens_replay',
|
|
190
|
+
arguments: { sessionId: 'ses_abc123' },
|
|
191
|
+
});
|
|
192
|
+
expect(result.isError).toBe(true);
|
|
193
|
+
const content = result.content;
|
|
194
|
+
expect(content[0].text).toContain('Connection refused');
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
describe('formatReplay', () => {
|
|
198
|
+
it('formats header correctly', () => {
|
|
199
|
+
const header = formatReplayHeader(MOCK_REPLAY);
|
|
200
|
+
expect(header).toContain('📼 Session Replay: ses_abc123');
|
|
201
|
+
expect(header).toContain('Agent: test-agent');
|
|
202
|
+
expect(header).toContain('Status: completed');
|
|
203
|
+
expect(header).toContain('Duration: 5m 30s');
|
|
204
|
+
expect(header).toContain('Total Cost: $0.0452');
|
|
205
|
+
expect(header).toContain('llm_call: 3');
|
|
206
|
+
});
|
|
207
|
+
it('formats step with icon and summary', () => {
|
|
208
|
+
const step = formatReplayStep(MOCK_REPLAY.steps[0]);
|
|
209
|
+
expect(step).toContain('🤖 llm_call');
|
|
210
|
+
expect(step).toContain('Called claude-3.5-sonnet with 3 messages');
|
|
211
|
+
expect(step).toContain('1.2s');
|
|
212
|
+
expect(step).toContain('$0.0120');
|
|
213
|
+
});
|
|
214
|
+
it('formats error step with warning icon', () => {
|
|
215
|
+
const step = formatReplayStep(MOCK_REPLAY.steps[4]);
|
|
216
|
+
expect(step).toContain('⚠️');
|
|
217
|
+
expect(step).toContain('Rate limit exceeded');
|
|
218
|
+
});
|
|
219
|
+
it('includes context annotations (cost-so-far, error count)', () => {
|
|
220
|
+
const step = formatReplayStep(MOCK_REPLAY.steps[4], 0.045, 1);
|
|
221
|
+
expect(step).toContain('cost-so-far: $0.0450');
|
|
222
|
+
expect(step).toContain('errors: 1');
|
|
223
|
+
});
|
|
224
|
+
it('summary only returns just the header', () => {
|
|
225
|
+
const text = formatReplay(MOCK_REPLAY, true);
|
|
226
|
+
expect(text).toContain('📼 Session Replay');
|
|
227
|
+
expect(text).not.toContain('🤖');
|
|
228
|
+
});
|
|
229
|
+
it('full replay includes header and steps', () => {
|
|
230
|
+
const text = formatReplay(MOCK_REPLAY, false);
|
|
231
|
+
expect(text).toContain('📼 Session Replay');
|
|
232
|
+
expect(text).toContain('🤖 llm_call');
|
|
233
|
+
expect(text).toContain('🔧 tool_call');
|
|
234
|
+
expect(text).toContain('⚠️');
|
|
235
|
+
});
|
|
236
|
+
it('shows "(No steps to display)" for empty steps', () => {
|
|
237
|
+
const empty = {
|
|
238
|
+
...MOCK_REPLAY,
|
|
239
|
+
steps: [],
|
|
240
|
+
};
|
|
241
|
+
const text = formatReplay(empty, false);
|
|
242
|
+
expect(text).toContain('(No steps to display)');
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
//# sourceMappingURL=replay.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.test.js","sourceRoot":"","sources":["../../src/__tests__/replay.test.ts"],"names":[],"mappings":"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"}
|
package/dist/server.test.js
CHANGED
|
@@ -24,17 +24,19 @@ describe('MCP Server Entrypoint (Story 5.1)', () => {
|
|
|
24
24
|
const { transport } = createServer();
|
|
25
25
|
expect(transport).toBeDefined();
|
|
26
26
|
});
|
|
27
|
-
it('lists all
|
|
27
|
+
it('lists all 14 tools via MCP protocol', async () => {
|
|
28
28
|
const { mcpServer } = createServer();
|
|
29
29
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
30
30
|
const client = new Client({ name: 'test-client', version: '1.0.0' });
|
|
31
31
|
await mcpServer.connect(serverTransport);
|
|
32
32
|
await client.connect(clientTransport);
|
|
33
33
|
const result = await client.listTools();
|
|
34
|
-
expect(result.tools).toHaveLength(
|
|
34
|
+
expect(result.tools).toHaveLength(14);
|
|
35
35
|
const names = result.tools.map((t) => t.name).sort();
|
|
36
36
|
expect(names).toEqual([
|
|
37
|
+
'agentlens_benchmark',
|
|
37
38
|
'agentlens_context',
|
|
39
|
+
'agentlens_guardrails',
|
|
38
40
|
'agentlens_health',
|
|
39
41
|
'agentlens_learn',
|
|
40
42
|
'agentlens_log_event',
|
|
@@ -43,6 +45,7 @@ describe('MCP Server Entrypoint (Story 5.1)', () => {
|
|
|
43
45
|
'agentlens_query_events',
|
|
44
46
|
'agentlens_recall',
|
|
45
47
|
'agentlens_reflect',
|
|
48
|
+
'agentlens_replay',
|
|
46
49
|
'agentlens_session_end',
|
|
47
50
|
'agentlens_session_start',
|
|
48
51
|
]);
|
package/dist/server.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.test.js","sourceRoot":"","sources":["../src/server.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.test.js","sourceRoot":"","sources":["../src/server.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardrails.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/guardrails.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for agentlens_guardrails MCP Tool (v0.8.0 — Story 3.1)
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
5
|
+
import { formatGuardrailStatus } from '../guardrails-format.js';
|
|
6
|
+
// Since the MCP tool requires a full server setup, we test the formatting logic
|
|
7
|
+
describe('Guardrail MCP Tool Formatting', () => {
|
|
8
|
+
it('should format empty rules list', () => {
|
|
9
|
+
const result = formatGuardrailStatus([], []);
|
|
10
|
+
expect(result).toContain('No guardrail rules configured');
|
|
11
|
+
});
|
|
12
|
+
it('should format active rules', () => {
|
|
13
|
+
const rules = [
|
|
14
|
+
{ id: 'r1', name: 'Error Guard', enabled: true, conditionType: 'error_rate_threshold', actionType: 'pause_agent', cooldownMinutes: 15, dryRun: false },
|
|
15
|
+
];
|
|
16
|
+
const statuses = [
|
|
17
|
+
{ rule: rules[0], state: { triggerCount: 3, lastTriggeredAt: '2026-01-01T00:00:00Z' }, recentTriggers: [] },
|
|
18
|
+
];
|
|
19
|
+
const result = formatGuardrailStatus(rules, statuses);
|
|
20
|
+
expect(result).toContain('Error Guard');
|
|
21
|
+
expect(result).toContain('Enabled');
|
|
22
|
+
expect(result).toContain('Triggers: 3');
|
|
23
|
+
});
|
|
24
|
+
it('should show dry run badge', () => {
|
|
25
|
+
const rules = [
|
|
26
|
+
{ id: 'r1', name: 'Test Guard', enabled: true, conditionType: 'cost_limit', actionType: 'notify_webhook', cooldownMinutes: 15, dryRun: true },
|
|
27
|
+
];
|
|
28
|
+
const statuses = [
|
|
29
|
+
{ rule: rules[0], state: null, recentTriggers: [] },
|
|
30
|
+
];
|
|
31
|
+
const result = formatGuardrailStatus(rules, statuses);
|
|
32
|
+
expect(result).toContain('DRY RUN');
|
|
33
|
+
});
|
|
34
|
+
it('should show disabled rules', () => {
|
|
35
|
+
const rules = [
|
|
36
|
+
{ id: 'r1', name: 'Disabled Guard', enabled: false, conditionType: 'error_rate_threshold', actionType: 'pause_agent', cooldownMinutes: 15, dryRun: false },
|
|
37
|
+
];
|
|
38
|
+
const statuses = [
|
|
39
|
+
{ rule: rules[0], state: null, recentTriggers: [] },
|
|
40
|
+
];
|
|
41
|
+
const result = formatGuardrailStatus(rules, statuses);
|
|
42
|
+
expect(result).toContain('Disabled');
|
|
43
|
+
});
|
|
44
|
+
it('should show recent triggers', () => {
|
|
45
|
+
const rules = [
|
|
46
|
+
{ id: 'r1', name: 'Test', enabled: true, conditionType: 'error_rate_threshold', actionType: 'pause_agent', cooldownMinutes: 15, dryRun: false },
|
|
47
|
+
];
|
|
48
|
+
const statuses = [
|
|
49
|
+
{
|
|
50
|
+
rule: rules[0],
|
|
51
|
+
state: { triggerCount: 1 },
|
|
52
|
+
recentTriggers: [
|
|
53
|
+
{ triggeredAt: '2026-01-01T12:00:00Z', conditionValue: 45, conditionThreshold: 30, actionResult: 'success' },
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
];
|
|
57
|
+
const result = formatGuardrailStatus(rules, statuses);
|
|
58
|
+
expect(result).toContain('Recent:');
|
|
59
|
+
expect(result).toContain('value=45');
|
|
60
|
+
expect(result).toContain('success');
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
//# sourceMappingURL=guardrails.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardrails.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/guardrails.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agentlens_benchmark MCP Tool (Stories 4.2, 4.3)
|
|
3
|
+
*
|
|
4
|
+
* Create, list, manage, and analyze A/B benchmarks.
|
|
5
|
+
* Actions: create, list, status, results, start, complete.
|
|
6
|
+
*/
|
|
7
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
import type { AgentLensTransport } from '../transport.js';
|
|
9
|
+
export interface BenchmarkVariant {
|
|
10
|
+
name: string;
|
|
11
|
+
tag: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
sessionCount?: number;
|
|
14
|
+
}
|
|
15
|
+
export interface BenchmarkSummary {
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
status: string;
|
|
19
|
+
variants: BenchmarkVariant[];
|
|
20
|
+
createdAt: string;
|
|
21
|
+
description?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface BenchmarkDetail extends BenchmarkSummary {
|
|
24
|
+
metrics: string[];
|
|
25
|
+
minSessions: number;
|
|
26
|
+
agentId?: string;
|
|
27
|
+
startedAt?: string;
|
|
28
|
+
completedAt?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface MetricResult {
|
|
31
|
+
metric: string;
|
|
32
|
+
variants: Array<{
|
|
33
|
+
name: string;
|
|
34
|
+
mean: number;
|
|
35
|
+
stddev: number;
|
|
36
|
+
n: number;
|
|
37
|
+
}>;
|
|
38
|
+
pValue?: number;
|
|
39
|
+
significant: boolean;
|
|
40
|
+
winner?: string;
|
|
41
|
+
difference?: number;
|
|
42
|
+
differencePercent?: number;
|
|
43
|
+
confidence?: string;
|
|
44
|
+
}
|
|
45
|
+
export interface BenchmarkResults {
|
|
46
|
+
benchmarkId: string;
|
|
47
|
+
name: string;
|
|
48
|
+
status: string;
|
|
49
|
+
metrics: MetricResult[];
|
|
50
|
+
summary: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Format a benchmark list.
|
|
54
|
+
*/
|
|
55
|
+
export declare function formatBenchmarkList(benchmarks: BenchmarkSummary[]): string;
|
|
56
|
+
/**
|
|
57
|
+
* Format a created benchmark confirmation.
|
|
58
|
+
*/
|
|
59
|
+
export declare function formatBenchmarkCreated(benchmark: BenchmarkDetail): string;
|
|
60
|
+
/**
|
|
61
|
+
* Format benchmark status/detail.
|
|
62
|
+
*/
|
|
63
|
+
export declare function formatBenchmarkStatus(benchmark: BenchmarkDetail): string;
|
|
64
|
+
/**
|
|
65
|
+
* Format benchmark results as an ASCII table.
|
|
66
|
+
*/
|
|
67
|
+
export declare function formatBenchmarkResults(results: BenchmarkResults): string;
|
|
68
|
+
export declare function registerBenchmarkTool(server: McpServer, transport: AgentLensTransport): void;
|
|
69
|
+
//# sourceMappingURL=benchmark.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark.d.ts","sourceRoot":"","sources":["../../src/tools/benchmark.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAI1D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAgB,SAAQ,gBAAgB;IACvD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,CAAC,EAAE,MAAM,CAAC;KACX,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAkCD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAsB1E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,eAAe,GAAG,MAAM,CAsBzE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,eAAe,GAAG,MAAM,CAkCxE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAqExE;AAUD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,GAAG,IAAI,CAuG5F"}
|