@agentlensai/mcp 0.10.0 → 0.13.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/LICENSE +21 -0
- package/dist/__tests__/benchmark.test.d.ts +5 -0
- package/dist/__tests__/benchmark.test.js +1 -1
- package/dist/__tests__/capabilities.test.d.ts +5 -0
- package/dist/__tests__/capabilities.test.d.ts.map +1 -0
- package/dist/__tests__/capabilities.test.js +127 -0
- package/dist/__tests__/capabilities.test.js.map +1 -0
- 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__/guardrail-middleware.test.d.ts +2 -0
- package/dist/__tests__/guardrail-middleware.test.d.ts.map +1 -0
- package/dist/__tests__/guardrail-middleware.test.js +107 -0
- package/dist/__tests__/guardrail-middleware.test.js.map +1 -0
- package/dist/__tests__/health.test.d.ts +5 -0
- package/dist/__tests__/health.test.js +1 -1
- package/dist/__tests__/llm-call.test.d.ts +2 -0
- package/dist/__tests__/llm-call.test.js +1 -1
- package/dist/__tests__/optimize.test.d.ts +5 -0
- package/dist/__tests__/optimize.test.js +1 -1
- package/dist/__tests__/recall.test.d.ts +2 -0
- package/dist/__tests__/recall.test.js +4 -4
- package/dist/__tests__/recall.test.js.map +1 -1
- 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/__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/capabilities.d.ts +28 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +68 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/guardrail-middleware.d.ts +36 -0
- package/dist/guardrail-middleware.d.ts.map +1 -0
- package/dist/guardrail-middleware.js +70 -0
- package/dist/guardrail-middleware.js.map +1 -0
- package/dist/index.d.ts +19 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +42 -8
- package/dist/index.js.map +1 -1
- package/dist/server.test.d.ts +2 -0
- package/dist/server.test.js +12 -5
- package/dist/server.test.js.map +1 -1
- package/dist/tools/__tests__/agents.test.d.ts +5 -0
- package/dist/tools/__tests__/agents.test.d.ts.map +1 -0
- package/dist/tools/__tests__/agents.test.js +56 -0
- package/dist/tools/__tests__/agents.test.js.map +1 -0
- package/dist/tools/__tests__/alerts.test.d.ts +5 -0
- package/dist/tools/__tests__/alerts.test.d.ts.map +1 -0
- package/dist/tools/__tests__/alerts.test.js +83 -0
- package/dist/tools/__tests__/alerts.test.js.map +1 -0
- package/dist/tools/__tests__/analytics.test.d.ts +5 -0
- package/dist/tools/__tests__/analytics.test.d.ts.map +1 -0
- package/dist/tools/__tests__/analytics.test.js +53 -0
- package/dist/tools/__tests__/analytics.test.js.map +1 -0
- package/dist/tools/__tests__/cost-budgets.test.d.ts +5 -0
- package/dist/tools/__tests__/cost-budgets.test.d.ts.map +1 -0
- package/dist/tools/__tests__/cost-budgets.test.js +86 -0
- package/dist/tools/__tests__/cost-budgets.test.js.map +1 -0
- package/dist/tools/__tests__/error-helpers.test.d.ts +5 -0
- package/dist/tools/__tests__/error-helpers.test.d.ts.map +1 -0
- package/dist/tools/__tests__/error-helpers.test.js +38 -0
- package/dist/tools/__tests__/error-helpers.test.js.map +1 -0
- package/dist/tools/__tests__/lessons.test.d.ts +5 -0
- package/dist/tools/__tests__/lessons.test.d.ts.map +1 -0
- package/dist/tools/__tests__/lessons.test.js +64 -0
- package/dist/tools/__tests__/lessons.test.js.map +1 -0
- package/dist/tools/__tests__/prompts.test.d.ts +5 -0
- package/dist/tools/__tests__/prompts.test.d.ts.map +1 -0
- package/dist/tools/__tests__/prompts.test.js +112 -0
- package/dist/tools/__tests__/prompts.test.js.map +1 -0
- package/dist/tools/__tests__/sessions.test.d.ts +5 -0
- package/dist/tools/__tests__/sessions.test.d.ts.map +1 -0
- package/dist/tools/__tests__/sessions.test.js +62 -0
- package/dist/tools/__tests__/sessions.test.js.map +1 -0
- package/dist/tools/__tests__/stats.test.d.ts +5 -0
- package/dist/tools/__tests__/stats.test.d.ts.map +1 -0
- package/dist/tools/__tests__/stats.test.js +41 -0
- package/dist/tools/__tests__/stats.test.js.map +1 -0
- package/dist/tools/__tests__/trust.test.d.ts +5 -0
- package/dist/tools/__tests__/trust.test.d.ts.map +1 -0
- package/dist/tools/__tests__/trust.test.js +46 -0
- package/dist/tools/__tests__/trust.test.js.map +1 -0
- package/dist/tools/agents.d.ts +9 -0
- package/dist/tools/agents.d.ts.map +1 -0
- package/dist/tools/agents.js +67 -0
- package/dist/tools/agents.js.map +1 -0
- package/dist/tools/alerts.d.ts +9 -0
- package/dist/tools/alerts.d.ts.map +1 -0
- package/dist/tools/alerts.js +126 -0
- package/dist/tools/alerts.js.map +1 -0
- package/dist/tools/analytics.d.ts +9 -0
- package/dist/tools/analytics.d.ts.map +1 -0
- package/dist/tools/analytics.js +67 -0
- package/dist/tools/analytics.js.map +1 -0
- package/dist/tools/cost-budgets.d.ts +9 -0
- package/dist/tools/cost-budgets.d.ts.map +1 -0
- package/dist/tools/cost-budgets.js +144 -0
- package/dist/tools/cost-budgets.js.map +1 -0
- package/dist/tools/error-helpers.d.ts +14 -0
- package/dist/tools/error-helpers.d.ts.map +1 -0
- package/dist/tools/error-helpers.js +17 -0
- package/dist/tools/error-helpers.js.map +1 -0
- package/dist/tools/lessons.d.ts +9 -0
- package/dist/tools/lessons.d.ts.map +1 -0
- package/dist/tools/lessons.js +107 -0
- package/dist/tools/lessons.js.map +1 -0
- package/dist/tools/prompts.d.ts +9 -0
- package/dist/tools/prompts.d.ts.map +1 -0
- package/dist/tools/prompts.js +117 -0
- package/dist/tools/prompts.js.map +1 -0
- package/dist/tools/recall.js +3 -3
- package/dist/tools/recall.js.map +1 -1
- package/dist/tools/reflect.js +1 -1
- package/dist/tools/reflect.js.map +1 -1
- package/dist/tools/sessions.d.ts +9 -0
- package/dist/tools/sessions.d.ts.map +1 -0
- package/dist/tools/sessions.js +88 -0
- package/dist/tools/sessions.js.map +1 -0
- package/dist/tools/stats.d.ts +9 -0
- package/dist/tools/stats.d.ts.map +1 -0
- package/dist/tools/stats.js +43 -0
- package/dist/tools/stats.js.map +1 -0
- package/dist/tools/trust.d.ts +9 -0
- package/dist/tools/trust.d.ts.map +1 -0
- package/dist/tools/trust.js +42 -0
- package/dist/tools/trust.js.map +1 -0
- package/dist/tools.d.ts +11 -2
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +70 -47
- package/dist/tools.js.map +1 -1
- package/dist/tools.test.d.ts +2 -0
- package/dist/tools.test.js +10 -3
- package/dist/tools.test.js.map +1 -1
- package/dist/transport.d.ts +59 -0
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +245 -0
- package/dist/transport.js.map +1 -1
- package/dist/transport.test.d.ts +2 -0
- package/dist/transport.test.d.ts.map +1 -0
- package/dist/transport.test.js +170 -0
- package/dist/transport.test.js.map +1 -0
- package/package.json +10 -10
- package/dist/__tests__/learn.test.d.ts.map +0 -1
- package/dist/__tests__/learn.test.js +0 -381
- package/dist/__tests__/learn.test.js.map +0 -1
- package/dist/tools/__tests__/community.test.d.ts +0 -5
- package/dist/tools/__tests__/community.test.d.ts.map +0 -1
- package/dist/tools/__tests__/community.test.js +0 -172
- package/dist/tools/__tests__/community.test.js.map +0 -1
- package/dist/tools/__tests__/transport-community.test.d.ts +0 -5
- package/dist/tools/__tests__/transport-community.test.d.ts.map +0 -1
- package/dist/tools/__tests__/transport-community.test.js +0 -99
- package/dist/tools/__tests__/transport-community.test.js.map +0 -1
- package/dist/tools/community.d.ts +0 -10
- package/dist/tools/community.d.ts.map +0 -1
- package/dist/tools/community.js +0 -167
- package/dist/tools/community.js.map +0 -1
- package/dist/tools/learn.d.ts +0 -10
- package/dist/tools/learn.d.ts.map +0 -1
- package/dist/tools/learn.js +0 -277
- package/dist/tools/learn.js.map +0 -1
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Amit Paz
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -143,7 +143,7 @@ describe('agentlens_benchmark', () => {
|
|
|
143
143
|
it('total tool count is 14', async () => {
|
|
144
144
|
const { client } = await createTestSetup();
|
|
145
145
|
const result = await client.listTools();
|
|
146
|
-
expect(result.tools).toHaveLength(
|
|
146
|
+
expect(result.tools).toHaveLength(24);
|
|
147
147
|
});
|
|
148
148
|
// ─── Create ───────────────────────────────────────────────
|
|
149
149
|
it('creates a benchmark successfully', async () => {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/capabilities.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for auto-discovery capabilities module (Feature 10, Story 10.2)
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect } from 'vitest';
|
|
5
|
+
import { shouldRegisterTool, TOOL_FEATURE_MAP } from '../capabilities.js';
|
|
6
|
+
const ALL_FEATURES = [
|
|
7
|
+
'sessions', 'agents', 'alerts', 'analytics', 'stats',
|
|
8
|
+
'recall', 'reflect', 'optimize', 'context', 'health',
|
|
9
|
+
'replay', 'benchmarks', 'guardrails', 'discovery', 'delegation',
|
|
10
|
+
'cost-budgets', 'trust', 'lessons', 'prompts',
|
|
11
|
+
];
|
|
12
|
+
function opts(overrides = {}) {
|
|
13
|
+
return {
|
|
14
|
+
serverInfo: { version: '0.12.1', features: ALL_FEATURES },
|
|
15
|
+
allowlist: null,
|
|
16
|
+
denylist: null,
|
|
17
|
+
...overrides,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
describe('TOOL_FEATURE_MAP', () => {
|
|
21
|
+
it('covers 25 tools (15 existing + 10 new)', () => {
|
|
22
|
+
expect(Object.keys(TOOL_FEATURE_MAP)).toHaveLength(24);
|
|
23
|
+
});
|
|
24
|
+
it('core ingest tools have empty feature requirements', () => {
|
|
25
|
+
expect(TOOL_FEATURE_MAP.agentlens_session_start).toEqual([]);
|
|
26
|
+
expect(TOOL_FEATURE_MAP.agentlens_log_event).toEqual([]);
|
|
27
|
+
expect(TOOL_FEATURE_MAP.agentlens_session_end).toEqual([]);
|
|
28
|
+
expect(TOOL_FEATURE_MAP.agentlens_query_events).toEqual([]);
|
|
29
|
+
expect(TOOL_FEATURE_MAP.agentlens_log_llm_call).toEqual([]);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
describe('shouldRegisterTool', () => {
|
|
33
|
+
// All features available
|
|
34
|
+
it('registers all tools when all features available', () => {
|
|
35
|
+
for (const toolName of Object.keys(TOOL_FEATURE_MAP)) {
|
|
36
|
+
const result = shouldRegisterTool(toolName, opts());
|
|
37
|
+
expect(result.register).toBe(true);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
// Partial features
|
|
41
|
+
it('skips tools when required features are missing', () => {
|
|
42
|
+
const result = shouldRegisterTool('agentlens_analytics', opts({
|
|
43
|
+
serverInfo: { version: '0.12.1', features: ['sessions', 'agents'] },
|
|
44
|
+
}));
|
|
45
|
+
expect(result.register).toBe(false);
|
|
46
|
+
expect(result.reason).toBe('server missing features: analytics');
|
|
47
|
+
});
|
|
48
|
+
it('registers core tools even when features are limited', () => {
|
|
49
|
+
const result = shouldRegisterTool('agentlens_session_start', opts({
|
|
50
|
+
serverInfo: { version: '0.12.1', features: [] },
|
|
51
|
+
}));
|
|
52
|
+
expect(result.register).toBe(true);
|
|
53
|
+
});
|
|
54
|
+
// Null serverInfo (graceful fallback)
|
|
55
|
+
it('registers all tools when serverInfo is null', () => {
|
|
56
|
+
for (const toolName of Object.keys(TOOL_FEATURE_MAP)) {
|
|
57
|
+
const result = shouldRegisterTool(toolName, opts({ serverInfo: null }));
|
|
58
|
+
expect(result.register).toBe(true);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
// Allowlist
|
|
62
|
+
it('blocks tools not in allowlist', () => {
|
|
63
|
+
const result = shouldRegisterTool('agentlens_analytics', opts({
|
|
64
|
+
allowlist: ['session_start', 'recall'],
|
|
65
|
+
}));
|
|
66
|
+
expect(result.register).toBe(false);
|
|
67
|
+
expect(result.reason).toBe('not in allowlist');
|
|
68
|
+
});
|
|
69
|
+
it('allows tools in allowlist by full name', () => {
|
|
70
|
+
const result = shouldRegisterTool('agentlens_recall', opts({
|
|
71
|
+
allowlist: ['agentlens_recall'],
|
|
72
|
+
}));
|
|
73
|
+
expect(result.register).toBe(true);
|
|
74
|
+
});
|
|
75
|
+
it('allows tools in allowlist by short name', () => {
|
|
76
|
+
const result = shouldRegisterTool('agentlens_recall', opts({
|
|
77
|
+
allowlist: ['recall'],
|
|
78
|
+
}));
|
|
79
|
+
expect(result.register).toBe(true);
|
|
80
|
+
});
|
|
81
|
+
// Denylist
|
|
82
|
+
it('blocks tools in denylist', () => {
|
|
83
|
+
const result = shouldRegisterTool('agentlens_benchmark', opts({
|
|
84
|
+
denylist: ['benchmark'],
|
|
85
|
+
}));
|
|
86
|
+
expect(result.register).toBe(false);
|
|
87
|
+
expect(result.reason).toBe('in denylist');
|
|
88
|
+
});
|
|
89
|
+
it('blocks tools in denylist by full name', () => {
|
|
90
|
+
const result = shouldRegisterTool('agentlens_benchmark', opts({
|
|
91
|
+
denylist: ['agentlens_benchmark'],
|
|
92
|
+
}));
|
|
93
|
+
expect(result.register).toBe(false);
|
|
94
|
+
expect(result.reason).toBe('in denylist');
|
|
95
|
+
});
|
|
96
|
+
it('allows tools not in denylist', () => {
|
|
97
|
+
const result = shouldRegisterTool('agentlens_recall', opts({
|
|
98
|
+
denylist: ['benchmark'],
|
|
99
|
+
}));
|
|
100
|
+
expect(result.register).toBe(true);
|
|
101
|
+
});
|
|
102
|
+
// Allowlist + denylist combo
|
|
103
|
+
it('allowlist takes priority over denylist', () => {
|
|
104
|
+
// Tool in allowlist but also in denylist
|
|
105
|
+
const result = shouldRegisterTool('agentlens_recall', opts({
|
|
106
|
+
allowlist: ['recall'],
|
|
107
|
+
denylist: ['recall'],
|
|
108
|
+
}));
|
|
109
|
+
// Allowlist check passes, then denylist blocks it
|
|
110
|
+
expect(result.register).toBe(false);
|
|
111
|
+
expect(result.reason).toBe('in denylist');
|
|
112
|
+
});
|
|
113
|
+
it('tool not in allowlist is blocked even if not in denylist', () => {
|
|
114
|
+
const result = shouldRegisterTool('agentlens_analytics', opts({
|
|
115
|
+
allowlist: ['recall'],
|
|
116
|
+
denylist: ['benchmark'],
|
|
117
|
+
}));
|
|
118
|
+
expect(result.register).toBe(false);
|
|
119
|
+
expect(result.reason).toBe('not in allowlist');
|
|
120
|
+
});
|
|
121
|
+
// Unknown tool name
|
|
122
|
+
it('registers unknown tools when no allowlist and serverInfo is null', () => {
|
|
123
|
+
const result = shouldRegisterTool('agentlens_unknown', opts({ serverInfo: null }));
|
|
124
|
+
expect(result.register).toBe(true);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
//# sourceMappingURL=capabilities.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.test.js","sourceRoot":"","sources":["../../src/__tests__/capabilities.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"guardrail-middleware.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/guardrail-middleware.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for MCP Guardrail Middleware (Feature 8 — Story 10) [F8-S10]
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
5
|
+
import { guardrailWrap } from '../guardrail-middleware.js';
|
|
6
|
+
function mockEvaluator(result) {
|
|
7
|
+
return { evaluateContent: vi.fn().mockResolvedValue(result) };
|
|
8
|
+
}
|
|
9
|
+
const allowResult = {
|
|
10
|
+
decision: 'allow', matches: [], evaluationMs: 1, rulesEvaluated: 0,
|
|
11
|
+
};
|
|
12
|
+
const blockResult = {
|
|
13
|
+
decision: 'block', matches: [{ conditionType: 'pii_detection', patternName: 'ssn', offset: { start: 0, end: 11 }, confidence: 0.95, redactionToken: '[SSN]' }],
|
|
14
|
+
blockingRuleId: 'r1', evaluationMs: 1, rulesEvaluated: 1,
|
|
15
|
+
};
|
|
16
|
+
const redactResult = {
|
|
17
|
+
decision: 'redact', matches: [], redactedContent: '{"text":"[REDACTED]"}', evaluationMs: 1, rulesEvaluated: 1,
|
|
18
|
+
};
|
|
19
|
+
const mockHandler = vi.fn().mockResolvedValue({
|
|
20
|
+
content: [{ type: 'text', text: 'Hello world' }],
|
|
21
|
+
});
|
|
22
|
+
describe('guardrailWrap', () => {
|
|
23
|
+
it('passes through when no agentId', async () => {
|
|
24
|
+
const evaluator = mockEvaluator(allowResult);
|
|
25
|
+
const wrapped = guardrailWrap(mockHandler, {
|
|
26
|
+
toolName: 'test', getAgentId: () => undefined, getTenantId: () => 'default', evaluator,
|
|
27
|
+
});
|
|
28
|
+
await wrapped({ text: 'hello' });
|
|
29
|
+
expect(mockHandler).toHaveBeenCalled();
|
|
30
|
+
expect(evaluator.evaluateContent).not.toHaveBeenCalled();
|
|
31
|
+
});
|
|
32
|
+
it('allows when evaluator returns allow', async () => {
|
|
33
|
+
const evaluator = mockEvaluator(allowResult);
|
|
34
|
+
const handler = vi.fn().mockResolvedValue({ content: [{ type: 'text', text: 'ok' }] });
|
|
35
|
+
const wrapped = guardrailWrap(handler, {
|
|
36
|
+
toolName: 'test', getAgentId: () => 'a1', getTenantId: () => 'default', evaluator,
|
|
37
|
+
});
|
|
38
|
+
const result = await wrapped({ text: 'hello' });
|
|
39
|
+
expect(handler).toHaveBeenCalled();
|
|
40
|
+
expect(result.isError).toBeUndefined();
|
|
41
|
+
});
|
|
42
|
+
it('blocks on input when evaluator returns block', async () => {
|
|
43
|
+
const evaluator = mockEvaluator(blockResult);
|
|
44
|
+
const handler = vi.fn().mockResolvedValue({ content: [{ type: 'text', text: 'ok' }] });
|
|
45
|
+
const wrapped = guardrailWrap(handler, {
|
|
46
|
+
toolName: 'test', getAgentId: () => 'a1', getTenantId: () => 'default', evaluator,
|
|
47
|
+
});
|
|
48
|
+
const result = await wrapped({ text: '123-45-6789' });
|
|
49
|
+
expect(handler).not.toHaveBeenCalled();
|
|
50
|
+
expect(result.isError).toBe(true);
|
|
51
|
+
expect(result.content[0].text).toContain('blocked');
|
|
52
|
+
});
|
|
53
|
+
it('redacts input when evaluator returns redact', async () => {
|
|
54
|
+
const evaluator = mockEvaluator(redactResult);
|
|
55
|
+
const handler = vi.fn().mockResolvedValue({ content: [{ type: 'text', text: 'ok' }] });
|
|
56
|
+
const wrapped = guardrailWrap(handler, {
|
|
57
|
+
toolName: 'test', getAgentId: () => 'a1', getTenantId: () => 'default', evaluator,
|
|
58
|
+
});
|
|
59
|
+
await wrapped({ text: '123-45-6789' });
|
|
60
|
+
// Handler should be called with redacted args
|
|
61
|
+
expect(handler).toHaveBeenCalledWith({ text: '[REDACTED]' });
|
|
62
|
+
});
|
|
63
|
+
it('blocks output when evaluator returns block', async () => {
|
|
64
|
+
// Allow input, block output
|
|
65
|
+
const evaluator = {
|
|
66
|
+
evaluateContent: vi.fn()
|
|
67
|
+
.mockResolvedValueOnce(allowResult) // input scan
|
|
68
|
+
.mockResolvedValueOnce(blockResult), // output scan
|
|
69
|
+
};
|
|
70
|
+
const handler = vi.fn().mockResolvedValue({ content: [{ type: 'text', text: 'sensitive output' }] });
|
|
71
|
+
const wrapped = guardrailWrap(handler, {
|
|
72
|
+
toolName: 'test', getAgentId: () => 'a1', getTenantId: () => 'default', evaluator,
|
|
73
|
+
});
|
|
74
|
+
const result = await wrapped({ text: 'hello' });
|
|
75
|
+
expect(result.isError).toBe(true);
|
|
76
|
+
expect(result.content[0].text).toContain('response blocked');
|
|
77
|
+
});
|
|
78
|
+
it('redacts output when evaluator returns redact', async () => {
|
|
79
|
+
const outputRedact = {
|
|
80
|
+
decision: 'redact', matches: [], redactedContent: 'Safe output', evaluationMs: 1, rulesEvaluated: 1,
|
|
81
|
+
};
|
|
82
|
+
const evaluator = {
|
|
83
|
+
evaluateContent: vi.fn()
|
|
84
|
+
.mockResolvedValueOnce(allowResult)
|
|
85
|
+
.mockResolvedValueOnce(outputRedact),
|
|
86
|
+
};
|
|
87
|
+
const handler = vi.fn().mockResolvedValue({ content: [{ type: 'text', text: 'sensitive' }] });
|
|
88
|
+
const wrapped = guardrailWrap(handler, {
|
|
89
|
+
toolName: 'test', getAgentId: () => 'a1', getTenantId: () => 'default', evaluator,
|
|
90
|
+
});
|
|
91
|
+
const result = await wrapped({});
|
|
92
|
+
expect(result.content[0].text).toBe('Safe output');
|
|
93
|
+
});
|
|
94
|
+
it('fails open on evaluator error', async () => {
|
|
95
|
+
const evaluator = {
|
|
96
|
+
evaluateContent: vi.fn().mockRejectedValue(new Error('timeout')),
|
|
97
|
+
};
|
|
98
|
+
const handler = vi.fn().mockResolvedValue({ content: [{ type: 'text', text: 'ok' }] });
|
|
99
|
+
const wrapped = guardrailWrap(handler, {
|
|
100
|
+
toolName: 'test', getAgentId: () => 'a1', getTenantId: () => 'default', evaluator,
|
|
101
|
+
});
|
|
102
|
+
const result = await wrapped({});
|
|
103
|
+
expect(handler).toHaveBeenCalled();
|
|
104
|
+
expect(result.content[0].text).toBe('ok');
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
//# sourceMappingURL=guardrail-middleware.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardrail-middleware.test.js","sourceRoot":"","sources":["../../src/__tests__/guardrail-middleware.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,aAAa,EAA+D,MAAM,4BAA4B,CAAC;AAExH,SAAS,aAAa,CAAC,MAA8B;IACnD,OAAO,EAAE,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,WAAW,GAA2B;IAC1C,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC;CACnE,CAAC;AACF,MAAM,WAAW,GAA2B;IAC1C,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC;IAC9J,cAAc,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC;CACzD,CAAC;AACF,MAAM,YAAY,GAA2B;IAC3C,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,eAAe,EAAE,uBAAuB,EAAE,YAAY,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC;CAC9G,CAAC;AAEF,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;IAC5C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;CACjD,CAAC,CAAC;AAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,SAAS,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,EAAE;YACzC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,SAAS;SACvF,CAAC,CAAC;QACH,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACjC,MAAM,CAAC,WAAW,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACvC,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,SAAS,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACvF,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE;YACrC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,SAAS;SAClF,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,SAAS,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACvF,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE;YACrC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,SAAS;SAClF,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;QACtD,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,SAAS,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACvF,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE;YACrC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,SAAS;SAClF,CAAC,CAAC;QACH,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;QACvC,8CAA8C;QAC9C,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,4BAA4B;QAC5B,MAAM,SAAS,GAA8B;YAC3C,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE;iBACrB,qBAAqB,CAAC,WAAW,CAAC,CAAE,aAAa;iBACjD,qBAAqB,CAAC,WAAW,CAAC,EAAE,cAAc;SACtD,CAAC;QACF,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,EAAE,CAAC,CAAC;QACrG,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE;YACrC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,SAAS;SAClF,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,YAAY,GAA2B;YAC3C,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC;SACpG,CAAC;QACF,MAAM,SAAS,GAA8B;YAC3C,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE;iBACrB,qBAAqB,CAAC,WAAW,CAAC;iBAClC,qBAAqB,CAAC,YAAY,CAAC;SACvC,CAAC;QACF,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9F,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE;YACrC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,SAAS;SAClF,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,SAAS,GAA8B;YAC3C,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;SACjE,CAAC;QACF,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACvF,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE;YACrC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,SAAS;SAClF,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -68,7 +68,7 @@ describe('agentlens_health', () => {
|
|
|
68
68
|
it('total tool count is 14', async () => {
|
|
69
69
|
const { client } = await createTestSetup();
|
|
70
70
|
const result = await client.listTools();
|
|
71
|
-
expect(result.tools).toHaveLength(
|
|
71
|
+
expect(result.tools).toHaveLength(24);
|
|
72
72
|
});
|
|
73
73
|
it('returns formatted output with score, trend, and dimensions', async () => {
|
|
74
74
|
mockFetch.mockResolvedValueOnce(okResponse(MOCK_HEALTH_SCORE));
|
|
@@ -61,7 +61,7 @@ describe('agentlens_log_llm_call registration', () => {
|
|
|
61
61
|
it('now registers 14 tools total', async () => {
|
|
62
62
|
const { client } = await createTestSetup();
|
|
63
63
|
const result = await client.listTools();
|
|
64
|
-
expect(result.tools).toHaveLength(
|
|
64
|
+
expect(result.tools).toHaveLength(24);
|
|
65
65
|
});
|
|
66
66
|
it('has a description', async () => {
|
|
67
67
|
const { client } = await createTestSetup();
|
|
@@ -50,7 +50,7 @@ describe('agentlens_optimize', () => {
|
|
|
50
50
|
it('registers 14 tools total (11 existing + guardrails)', async () => {
|
|
51
51
|
const { client } = await createTestSetup();
|
|
52
52
|
const result = await client.listTools();
|
|
53
|
-
expect(result.tools).toHaveLength(
|
|
53
|
+
expect(result.tools).toHaveLength(24);
|
|
54
54
|
const toolNames = result.tools.map((t) => t.name);
|
|
55
55
|
expect(toolNames).toContain('agentlens_optimize');
|
|
56
56
|
});
|
|
@@ -45,10 +45,10 @@ describe('agentlens_recall registration', () => {
|
|
|
45
45
|
const toolNames = result.tools.map((t) => t.name);
|
|
46
46
|
expect(toolNames).toContain('agentlens_recall');
|
|
47
47
|
});
|
|
48
|
-
it('registers
|
|
48
|
+
it('registers 15 tools total', async () => {
|
|
49
49
|
const { client } = await createTestSetup();
|
|
50
50
|
const result = await client.listTools();
|
|
51
|
-
expect(result.tools).toHaveLength(
|
|
51
|
+
expect(result.tools).toHaveLength(24);
|
|
52
52
|
});
|
|
53
53
|
it('has a description mentioning semantic search', async () => {
|
|
54
54
|
const { client } = await createTestSetup();
|
|
@@ -167,11 +167,11 @@ describe('transport.recall', () => {
|
|
|
167
167
|
baseUrl: 'http://localhost:3400',
|
|
168
168
|
apiKey: 'test-key',
|
|
169
169
|
});
|
|
170
|
-
await transport.recall({ query: 'test query', scope: '
|
|
170
|
+
await transport.recall({ query: 'test query', scope: 'sessions', limit: 5 });
|
|
171
171
|
const url = mockFetch.mock.calls[0][0];
|
|
172
172
|
expect(url).toContain('http://localhost:3400/api/recall?');
|
|
173
173
|
expect(url).toContain('query=test+query');
|
|
174
|
-
expect(url).toContain('scope=
|
|
174
|
+
expect(url).toContain('scope=sessions');
|
|
175
175
|
expect(url).toContain('limit=5');
|
|
176
176
|
const opts = mockFetch.mock.calls[0][1];
|
|
177
177
|
expect(opts.method).toBe('GET');
|