@agentlensai/mcp 0.3.0 → 0.6.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__/context.test.d.ts +5 -0
- package/dist/__tests__/context.test.d.ts.map +1 -0
- package/dist/__tests__/context.test.js +203 -0
- package/dist/__tests__/context.test.js.map +1 -0
- package/dist/__tests__/health.test.d.ts.map +1 -0
- package/dist/__tests__/health.test.js +176 -0
- package/dist/__tests__/health.test.js.map +1 -0
- package/dist/__tests__/learn.test.d.ts +2 -0
- package/dist/__tests__/learn.test.d.ts.map +1 -0
- package/dist/__tests__/learn.test.js +381 -0
- package/dist/__tests__/learn.test.js.map +1 -0
- package/dist/__tests__/llm-call.test.js +2 -2
- package/dist/__tests__/llm-call.test.js.map +1 -1
- package/dist/__tests__/optimize.test.d.ts +5 -0
- package/dist/__tests__/optimize.test.d.ts.map +1 -0
- package/dist/__tests__/optimize.test.js +218 -0
- package/dist/__tests__/optimize.test.js.map +1 -0
- package/dist/__tests__/recall.test.d.ts +2 -0
- package/dist/__tests__/recall.test.d.ts.map +1 -0
- package/dist/__tests__/recall.test.js +193 -0
- package/dist/__tests__/recall.test.js.map +1 -0
- package/dist/__tests__/reflect.test.d.ts +5 -0
- package/dist/__tests__/reflect.test.d.ts.map +1 -0
- package/dist/__tests__/reflect.test.js +165 -0
- package/dist/__tests__/reflect.test.js.map +1 -0
- package/dist/index.js +0 -0
- package/dist/server.test.js +8 -2
- package/dist/server.test.js.map +1 -1
- package/dist/tools/context.d.ts +10 -0
- package/dist/tools/context.d.ts.map +1 -0
- package/dist/tools/context.js +93 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/health.d.ts +32 -0
- package/dist/tools/health.d.ts.map +1 -0
- package/dist/tools/health.js +102 -0
- package/dist/tools/health.js.map +1 -0
- package/dist/tools/learn.d.ts +10 -0
- package/dist/tools/learn.d.ts.map +1 -0
- package/dist/tools/learn.js +277 -0
- package/dist/tools/learn.js.map +1 -0
- package/dist/tools/optimize.d.ts +10 -0
- package/dist/tools/optimize.d.ts.map +1 -0
- package/dist/tools/optimize.js +70 -0
- package/dist/tools/optimize.js.map +1 -0
- package/dist/tools/recall.d.ts +10 -0
- package/dist/tools/recall.d.ts.map +1 -0
- package/dist/tools/recall.js +90 -0
- package/dist/tools/recall.js.map +1 -0
- package/dist/tools/reflect.d.ts +10 -0
- package/dist/tools/reflect.d.ts.map +1 -0
- package/dist/tools/reflect.js +61 -0
- package/dist/tools/reflect.js.map +1 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +12 -0
- package/dist/tools.js.map +1 -1
- package/dist/tools.test.js +7 -1
- package/dist/tools.test.js.map +1 -1
- package/dist/transport.d.ts +71 -0
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +187 -0
- package/dist/transport.js.map +1 -1
- package/package.json +7 -7
- package/LICENSE +0 -21
- package/dist/server.test.d.ts +0 -2
- package/dist/tools.test.d.ts +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/context.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for agentlens_context MCP tool (Story 5.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
|
+
const mockFetch = vi.fn();
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
vi.stubGlobal('fetch', mockFetch);
|
|
13
|
+
mockFetch.mockReset();
|
|
14
|
+
});
|
|
15
|
+
afterEach(() => {
|
|
16
|
+
vi.unstubAllGlobals();
|
|
17
|
+
});
|
|
18
|
+
function okResponse(data = {}) {
|
|
19
|
+
return new Response(JSON.stringify(data), {
|
|
20
|
+
status: 200,
|
|
21
|
+
headers: { 'Content-Type': 'application/json' },
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function errorResponse(status, body) {
|
|
25
|
+
return new Response(body, { status });
|
|
26
|
+
}
|
|
27
|
+
async function createTestSetup() {
|
|
28
|
+
const transport = new AgentLensTransport({
|
|
29
|
+
baseUrl: 'http://localhost:3400',
|
|
30
|
+
apiKey: 'test-key',
|
|
31
|
+
});
|
|
32
|
+
const server = new McpServer({ name: 'agentlens-test', version: '0.0.0' }, { capabilities: { tools: {} } });
|
|
33
|
+
registerTools(server, transport);
|
|
34
|
+
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
35
|
+
const client = new Client({ name: 'test-client', version: '1.0.0' });
|
|
36
|
+
await server.connect(serverTransport);
|
|
37
|
+
await client.connect(clientTransport);
|
|
38
|
+
return { server, client, transport };
|
|
39
|
+
}
|
|
40
|
+
describe('agentlens_context', () => {
|
|
41
|
+
it('calls the context API with correct parameters', async () => {
|
|
42
|
+
const contextResult = {
|
|
43
|
+
topic: 'deployment',
|
|
44
|
+
sessions: [
|
|
45
|
+
{
|
|
46
|
+
sessionId: 'ses-1',
|
|
47
|
+
agentId: 'agent-1',
|
|
48
|
+
summary: 'Agent deployed to production',
|
|
49
|
+
relevanceScore: 0.85,
|
|
50
|
+
startedAt: '2024-01-01T00:00:00Z',
|
|
51
|
+
endedAt: '2024-01-01T01:00:00Z',
|
|
52
|
+
keyEvents: [
|
|
53
|
+
{ id: 'ev-1', eventType: 'tool_call', summary: 'tool_call: deploy()', timestamp: '2024-01-01T00:30:00Z' },
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
lessons: [
|
|
58
|
+
{
|
|
59
|
+
id: 'les-1',
|
|
60
|
+
title: 'Always verify deploy',
|
|
61
|
+
content: 'Check health endpoint after deploying',
|
|
62
|
+
category: 'operations',
|
|
63
|
+
importance: 'high',
|
|
64
|
+
relevanceScore: 0.78,
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
totalSessions: 1,
|
|
68
|
+
};
|
|
69
|
+
mockFetch.mockResolvedValueOnce(okResponse(contextResult));
|
|
70
|
+
const { client } = await createTestSetup();
|
|
71
|
+
const result = await client.callTool({
|
|
72
|
+
name: 'agentlens_context',
|
|
73
|
+
arguments: {
|
|
74
|
+
topic: 'deployment',
|
|
75
|
+
agentId: 'my-agent',
|
|
76
|
+
limit: 5,
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
// Verify the fetch was called with the right URL
|
|
80
|
+
expect(mockFetch).toHaveBeenCalledWith(expect.stringContaining('/api/context?'), expect.objectContaining({
|
|
81
|
+
method: 'GET',
|
|
82
|
+
headers: expect.objectContaining({
|
|
83
|
+
Authorization: 'Bearer test-key',
|
|
84
|
+
}),
|
|
85
|
+
}));
|
|
86
|
+
const fetchUrl = mockFetch.mock.calls[0][0];
|
|
87
|
+
expect(fetchUrl).toContain('topic=deployment');
|
|
88
|
+
expect(fetchUrl).toContain('agentId=my-agent');
|
|
89
|
+
expect(fetchUrl).toContain('limit=5');
|
|
90
|
+
// Verify the result contains formatted data
|
|
91
|
+
expect(result.isError).toBeUndefined();
|
|
92
|
+
const content = result.content;
|
|
93
|
+
expect(content[0].text).toContain('ses-1');
|
|
94
|
+
expect(content[0].text).toContain('deployed to production');
|
|
95
|
+
expect(content[0].text).toContain('Always verify deploy');
|
|
96
|
+
});
|
|
97
|
+
it('handles empty results gracefully', async () => {
|
|
98
|
+
mockFetch.mockResolvedValueOnce(okResponse({
|
|
99
|
+
topic: 'nonexistent',
|
|
100
|
+
sessions: [],
|
|
101
|
+
lessons: [],
|
|
102
|
+
totalSessions: 0,
|
|
103
|
+
}));
|
|
104
|
+
const { client } = await createTestSetup();
|
|
105
|
+
const result = await client.callTool({
|
|
106
|
+
name: 'agentlens_context',
|
|
107
|
+
arguments: { topic: 'nonexistent' },
|
|
108
|
+
});
|
|
109
|
+
expect(result.isError).toBeUndefined();
|
|
110
|
+
const content = result.content;
|
|
111
|
+
expect(content[0].text).toContain('No relevant context found');
|
|
112
|
+
});
|
|
113
|
+
it('returns error on API failure', async () => {
|
|
114
|
+
mockFetch.mockResolvedValueOnce(errorResponse(500, 'Internal Server Error'));
|
|
115
|
+
const { client } = await createTestSetup();
|
|
116
|
+
const result = await client.callTool({
|
|
117
|
+
name: 'agentlens_context',
|
|
118
|
+
arguments: { topic: 'test' },
|
|
119
|
+
});
|
|
120
|
+
expect(result.isError).toBe(true);
|
|
121
|
+
const content = result.content;
|
|
122
|
+
expect(content[0].text).toContain('Error retrieving context');
|
|
123
|
+
});
|
|
124
|
+
it('returns error on network failure', async () => {
|
|
125
|
+
mockFetch.mockRejectedValueOnce(new Error('Connection refused'));
|
|
126
|
+
const { client } = await createTestSetup();
|
|
127
|
+
const result = await client.callTool({
|
|
128
|
+
name: 'agentlens_context',
|
|
129
|
+
arguments: { topic: 'test' },
|
|
130
|
+
});
|
|
131
|
+
expect(result.isError).toBe(true);
|
|
132
|
+
const content = result.content;
|
|
133
|
+
expect(content[0].text).toContain('Connection refused');
|
|
134
|
+
});
|
|
135
|
+
it('handles sessions-only results (no lessons)', async () => {
|
|
136
|
+
mockFetch.mockResolvedValueOnce(okResponse({
|
|
137
|
+
topic: 'file operations',
|
|
138
|
+
sessions: [
|
|
139
|
+
{
|
|
140
|
+
sessionId: 'ses-1',
|
|
141
|
+
agentId: 'agent-1',
|
|
142
|
+
summary: 'Agent ran file operations',
|
|
143
|
+
relevanceScore: 0.9,
|
|
144
|
+
startedAt: '2024-01-01T00:00:00Z',
|
|
145
|
+
keyEvents: [],
|
|
146
|
+
},
|
|
147
|
+
],
|
|
148
|
+
lessons: [],
|
|
149
|
+
totalSessions: 1,
|
|
150
|
+
}));
|
|
151
|
+
const { client } = await createTestSetup();
|
|
152
|
+
const result = await client.callTool({
|
|
153
|
+
name: 'agentlens_context',
|
|
154
|
+
arguments: { topic: 'file operations' },
|
|
155
|
+
});
|
|
156
|
+
expect(result.isError).toBeUndefined();
|
|
157
|
+
const content = result.content;
|
|
158
|
+
expect(content[0].text).toContain('Related Sessions (1)');
|
|
159
|
+
expect(content[0].text).toContain('file operations');
|
|
160
|
+
});
|
|
161
|
+
it('handles lessons-only results (no sessions)', async () => {
|
|
162
|
+
mockFetch.mockResolvedValueOnce(okResponse({
|
|
163
|
+
topic: 'database',
|
|
164
|
+
sessions: [],
|
|
165
|
+
lessons: [
|
|
166
|
+
{
|
|
167
|
+
id: 'les-1',
|
|
168
|
+
title: 'Database tips',
|
|
169
|
+
content: 'Always index your queries',
|
|
170
|
+
category: 'performance',
|
|
171
|
+
importance: 'normal',
|
|
172
|
+
relevanceScore: 0.75,
|
|
173
|
+
},
|
|
174
|
+
],
|
|
175
|
+
totalSessions: 0,
|
|
176
|
+
}));
|
|
177
|
+
const { client } = await createTestSetup();
|
|
178
|
+
const result = await client.callTool({
|
|
179
|
+
name: 'agentlens_context',
|
|
180
|
+
arguments: { topic: 'database' },
|
|
181
|
+
});
|
|
182
|
+
expect(result.isError).toBeUndefined();
|
|
183
|
+
const content = result.content;
|
|
184
|
+
expect(content[0].text).toContain('Database tips');
|
|
185
|
+
expect(content[0].text).toContain('Related Lessons (1)');
|
|
186
|
+
});
|
|
187
|
+
it('sends optional userId parameter', async () => {
|
|
188
|
+
mockFetch.mockResolvedValueOnce(okResponse({
|
|
189
|
+
topic: 'test',
|
|
190
|
+
sessions: [],
|
|
191
|
+
lessons: [],
|
|
192
|
+
totalSessions: 0,
|
|
193
|
+
}));
|
|
194
|
+
const { client } = await createTestSetup();
|
|
195
|
+
await client.callTool({
|
|
196
|
+
name: 'agentlens_context',
|
|
197
|
+
arguments: { topic: 'test', userId: 'user-123' },
|
|
198
|
+
});
|
|
199
|
+
const fetchUrl = mockFetch.mock.calls[0][0];
|
|
200
|
+
expect(fetchUrl).toContain('userId=user-123');
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
//# sourceMappingURL=context.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.test.js","sourceRoot":"","sources":["../../src/__tests__/context.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -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(11);
|
|
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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learn.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/learn.test.ts"],"names":[],"mappings":""}
|