@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.
Files changed (166) hide show
  1. package/LICENSE +21 -0
  2. package/dist/__tests__/benchmark.test.d.ts +5 -0
  3. package/dist/__tests__/benchmark.test.js +1 -1
  4. package/dist/__tests__/capabilities.test.d.ts +5 -0
  5. package/dist/__tests__/capabilities.test.d.ts.map +1 -0
  6. package/dist/__tests__/capabilities.test.js +127 -0
  7. package/dist/__tests__/capabilities.test.js.map +1 -0
  8. package/dist/__tests__/context.test.d.ts +5 -0
  9. package/dist/__tests__/context.test.d.ts.map +1 -0
  10. package/dist/__tests__/context.test.js +203 -0
  11. package/dist/__tests__/context.test.js.map +1 -0
  12. package/dist/__tests__/guardrail-middleware.test.d.ts +2 -0
  13. package/dist/__tests__/guardrail-middleware.test.d.ts.map +1 -0
  14. package/dist/__tests__/guardrail-middleware.test.js +107 -0
  15. package/dist/__tests__/guardrail-middleware.test.js.map +1 -0
  16. package/dist/__tests__/health.test.d.ts +5 -0
  17. package/dist/__tests__/health.test.js +1 -1
  18. package/dist/__tests__/llm-call.test.d.ts +2 -0
  19. package/dist/__tests__/llm-call.test.js +1 -1
  20. package/dist/__tests__/optimize.test.d.ts +5 -0
  21. package/dist/__tests__/optimize.test.js +1 -1
  22. package/dist/__tests__/recall.test.d.ts +2 -0
  23. package/dist/__tests__/recall.test.js +4 -4
  24. package/dist/__tests__/recall.test.js.map +1 -1
  25. package/dist/__tests__/reflect.test.d.ts +5 -0
  26. package/dist/__tests__/reflect.test.d.ts.map +1 -0
  27. package/dist/__tests__/reflect.test.js +165 -0
  28. package/dist/__tests__/reflect.test.js.map +1 -0
  29. package/dist/__tests__/replay.test.d.ts +5 -0
  30. package/dist/__tests__/replay.test.d.ts.map +1 -0
  31. package/dist/__tests__/replay.test.js +245 -0
  32. package/dist/__tests__/replay.test.js.map +1 -0
  33. package/dist/capabilities.d.ts +28 -0
  34. package/dist/capabilities.d.ts.map +1 -0
  35. package/dist/capabilities.js +68 -0
  36. package/dist/capabilities.js.map +1 -0
  37. package/dist/guardrail-middleware.d.ts +36 -0
  38. package/dist/guardrail-middleware.d.ts.map +1 -0
  39. package/dist/guardrail-middleware.js +70 -0
  40. package/dist/guardrail-middleware.js.map +1 -0
  41. package/dist/index.d.ts +19 -5
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +42 -8
  44. package/dist/index.js.map +1 -1
  45. package/dist/server.test.d.ts +2 -0
  46. package/dist/server.test.js +12 -5
  47. package/dist/server.test.js.map +1 -1
  48. package/dist/tools/__tests__/agents.test.d.ts +5 -0
  49. package/dist/tools/__tests__/agents.test.d.ts.map +1 -0
  50. package/dist/tools/__tests__/agents.test.js +56 -0
  51. package/dist/tools/__tests__/agents.test.js.map +1 -0
  52. package/dist/tools/__tests__/alerts.test.d.ts +5 -0
  53. package/dist/tools/__tests__/alerts.test.d.ts.map +1 -0
  54. package/dist/tools/__tests__/alerts.test.js +83 -0
  55. package/dist/tools/__tests__/alerts.test.js.map +1 -0
  56. package/dist/tools/__tests__/analytics.test.d.ts +5 -0
  57. package/dist/tools/__tests__/analytics.test.d.ts.map +1 -0
  58. package/dist/tools/__tests__/analytics.test.js +53 -0
  59. package/dist/tools/__tests__/analytics.test.js.map +1 -0
  60. package/dist/tools/__tests__/cost-budgets.test.d.ts +5 -0
  61. package/dist/tools/__tests__/cost-budgets.test.d.ts.map +1 -0
  62. package/dist/tools/__tests__/cost-budgets.test.js +86 -0
  63. package/dist/tools/__tests__/cost-budgets.test.js.map +1 -0
  64. package/dist/tools/__tests__/error-helpers.test.d.ts +5 -0
  65. package/dist/tools/__tests__/error-helpers.test.d.ts.map +1 -0
  66. package/dist/tools/__tests__/error-helpers.test.js +38 -0
  67. package/dist/tools/__tests__/error-helpers.test.js.map +1 -0
  68. package/dist/tools/__tests__/lessons.test.d.ts +5 -0
  69. package/dist/tools/__tests__/lessons.test.d.ts.map +1 -0
  70. package/dist/tools/__tests__/lessons.test.js +64 -0
  71. package/dist/tools/__tests__/lessons.test.js.map +1 -0
  72. package/dist/tools/__tests__/prompts.test.d.ts +5 -0
  73. package/dist/tools/__tests__/prompts.test.d.ts.map +1 -0
  74. package/dist/tools/__tests__/prompts.test.js +112 -0
  75. package/dist/tools/__tests__/prompts.test.js.map +1 -0
  76. package/dist/tools/__tests__/sessions.test.d.ts +5 -0
  77. package/dist/tools/__tests__/sessions.test.d.ts.map +1 -0
  78. package/dist/tools/__tests__/sessions.test.js +62 -0
  79. package/dist/tools/__tests__/sessions.test.js.map +1 -0
  80. package/dist/tools/__tests__/stats.test.d.ts +5 -0
  81. package/dist/tools/__tests__/stats.test.d.ts.map +1 -0
  82. package/dist/tools/__tests__/stats.test.js +41 -0
  83. package/dist/tools/__tests__/stats.test.js.map +1 -0
  84. package/dist/tools/__tests__/trust.test.d.ts +5 -0
  85. package/dist/tools/__tests__/trust.test.d.ts.map +1 -0
  86. package/dist/tools/__tests__/trust.test.js +46 -0
  87. package/dist/tools/__tests__/trust.test.js.map +1 -0
  88. package/dist/tools/agents.d.ts +9 -0
  89. package/dist/tools/agents.d.ts.map +1 -0
  90. package/dist/tools/agents.js +67 -0
  91. package/dist/tools/agents.js.map +1 -0
  92. package/dist/tools/alerts.d.ts +9 -0
  93. package/dist/tools/alerts.d.ts.map +1 -0
  94. package/dist/tools/alerts.js +126 -0
  95. package/dist/tools/alerts.js.map +1 -0
  96. package/dist/tools/analytics.d.ts +9 -0
  97. package/dist/tools/analytics.d.ts.map +1 -0
  98. package/dist/tools/analytics.js +67 -0
  99. package/dist/tools/analytics.js.map +1 -0
  100. package/dist/tools/cost-budgets.d.ts +9 -0
  101. package/dist/tools/cost-budgets.d.ts.map +1 -0
  102. package/dist/tools/cost-budgets.js +144 -0
  103. package/dist/tools/cost-budgets.js.map +1 -0
  104. package/dist/tools/error-helpers.d.ts +14 -0
  105. package/dist/tools/error-helpers.d.ts.map +1 -0
  106. package/dist/tools/error-helpers.js +17 -0
  107. package/dist/tools/error-helpers.js.map +1 -0
  108. package/dist/tools/lessons.d.ts +9 -0
  109. package/dist/tools/lessons.d.ts.map +1 -0
  110. package/dist/tools/lessons.js +107 -0
  111. package/dist/tools/lessons.js.map +1 -0
  112. package/dist/tools/prompts.d.ts +9 -0
  113. package/dist/tools/prompts.d.ts.map +1 -0
  114. package/dist/tools/prompts.js +117 -0
  115. package/dist/tools/prompts.js.map +1 -0
  116. package/dist/tools/recall.js +3 -3
  117. package/dist/tools/recall.js.map +1 -1
  118. package/dist/tools/reflect.js +1 -1
  119. package/dist/tools/reflect.js.map +1 -1
  120. package/dist/tools/sessions.d.ts +9 -0
  121. package/dist/tools/sessions.d.ts.map +1 -0
  122. package/dist/tools/sessions.js +88 -0
  123. package/dist/tools/sessions.js.map +1 -0
  124. package/dist/tools/stats.d.ts +9 -0
  125. package/dist/tools/stats.d.ts.map +1 -0
  126. package/dist/tools/stats.js +43 -0
  127. package/dist/tools/stats.js.map +1 -0
  128. package/dist/tools/trust.d.ts +9 -0
  129. package/dist/tools/trust.d.ts.map +1 -0
  130. package/dist/tools/trust.js +42 -0
  131. package/dist/tools/trust.js.map +1 -0
  132. package/dist/tools.d.ts +11 -2
  133. package/dist/tools.d.ts.map +1 -1
  134. package/dist/tools.js +70 -47
  135. package/dist/tools.js.map +1 -1
  136. package/dist/tools.test.d.ts +2 -0
  137. package/dist/tools.test.js +10 -3
  138. package/dist/tools.test.js.map +1 -1
  139. package/dist/transport.d.ts +59 -0
  140. package/dist/transport.d.ts.map +1 -1
  141. package/dist/transport.js +245 -0
  142. package/dist/transport.js.map +1 -1
  143. package/dist/transport.test.d.ts +2 -0
  144. package/dist/transport.test.d.ts.map +1 -0
  145. package/dist/transport.test.js +170 -0
  146. package/dist/transport.test.js.map +1 -0
  147. package/package.json +10 -10
  148. package/dist/__tests__/learn.test.d.ts.map +0 -1
  149. package/dist/__tests__/learn.test.js +0 -381
  150. package/dist/__tests__/learn.test.js.map +0 -1
  151. package/dist/tools/__tests__/community.test.d.ts +0 -5
  152. package/dist/tools/__tests__/community.test.d.ts.map +0 -1
  153. package/dist/tools/__tests__/community.test.js +0 -172
  154. package/dist/tools/__tests__/community.test.js.map +0 -1
  155. package/dist/tools/__tests__/transport-community.test.d.ts +0 -5
  156. package/dist/tools/__tests__/transport-community.test.d.ts.map +0 -1
  157. package/dist/tools/__tests__/transport-community.test.js +0 -99
  158. package/dist/tools/__tests__/transport-community.test.js.map +0 -1
  159. package/dist/tools/community.d.ts +0 -10
  160. package/dist/tools/community.d.ts.map +0 -1
  161. package/dist/tools/community.js +0 -167
  162. package/dist/tools/community.js.map +0 -1
  163. package/dist/tools/learn.d.ts +0 -10
  164. package/dist/tools/learn.d.ts.map +0 -1
  165. package/dist/tools/learn.js +0 -277
  166. 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.
@@ -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
@@ -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(17);
146
+ expect(result.tools).toHaveLength(24);
147
147
  });
148
148
  // ─── Create ───────────────────────────────────────────────
149
149
  it('creates a benchmark successfully', async () => {
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for auto-discovery capabilities module (Feature 10, Story 10.2)
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=capabilities.test.d.ts.map
@@ -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,5 @@
1
+ /**
2
+ * Tests for agentlens_context MCP tool (Story 5.3)
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=context.test.d.ts.map
@@ -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":"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;AAErD,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,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,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,aAAa,GAAG;YACpB,KAAK,EAAE,YAAY;YACnB,QAAQ,EAAE;gBACR;oBACE,SAAS,EAAE,OAAO;oBAClB,OAAO,EAAE,SAAS;oBAClB,OAAO,EAAE,8BAA8B;oBACvC,cAAc,EAAE,IAAI;oBACpB,SAAS,EAAE,sBAAsB;oBACjC,OAAO,EAAE,sBAAsB;oBAC/B,SAAS,EAAE;wBACT,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,sBAAsB,EAAE;qBAC1G;iBACF;aACF;YACD,OAAO,EAAE;gBACP;oBACE,EAAE,EAAE,OAAO;oBACX,KAAK,EAAE,sBAAsB;oBAC7B,OAAO,EAAE,uCAAuC;oBAChD,QAAQ,EAAE,YAAY;oBACtB,UAAU,EAAE,MAAM;oBAClB,cAAc,EAAE,IAAI;iBACrB;aACF;YACD,aAAa,EAAE,CAAC;SACjB,CAAC;QAEF,SAAS,CAAC,qBAAqB,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;QAE3D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QAE3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,mBAAmB;YACzB,SAAS,EAAE;gBACT,KAAK,EAAE,YAAY;gBACnB,OAAO,EAAE,UAAU;gBACnB,KAAK,EAAE,CAAC;aACT;SACF,CAAC,CAAC;QAEH,iDAAiD;QACjD,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACpC,MAAM,CAAC,gBAAgB,CAAC,eAAe,CAAC,EACxC,MAAM,CAAC,gBAAgB,CAAC;YACtB,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC;gBAC/B,aAAa,EAAE,iBAAiB;aACjC,CAAC;SACH,CAAC,CACH,CAAC;QAEF,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAW,CAAC;QACvD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC/C,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC/C,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAEtC,4CAA4C;QAC5C,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,OAAO,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QAC7D,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,SAAS,CAAC,qBAAqB,CAC7B,UAAU,CAAC;YACT,KAAK,EAAE,aAAa;YACpB,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,EAAE;YACX,aAAa,EAAE,CAAC;SACjB,CAAC,CACH,CAAC;QAEF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QAE3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,mBAAmB;YACzB,SAAS,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE;SACpC,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,2BAA2B,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,SAAS,CAAC,qBAAqB,CAC7B,aAAa,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAC5C,CAAC;QAEF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QAE3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,mBAAmB;YACzB,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;SAC7B,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,0BAA0B,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,SAAS,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAEjE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QAE3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,mBAAmB;YACzB,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;SAC7B,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;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,SAAS,CAAC,qBAAqB,CAC7B,UAAU,CAAC;YACT,KAAK,EAAE,iBAAiB;YACxB,QAAQ,EAAE;gBACR;oBACE,SAAS,EAAE,OAAO;oBAClB,OAAO,EAAE,SAAS;oBAClB,OAAO,EAAE,2BAA2B;oBACpC,cAAc,EAAE,GAAG;oBACnB,SAAS,EAAE,sBAAsB;oBACjC,SAAS,EAAE,EAAE;iBACd;aACF;YACD,OAAO,EAAE,EAAE;YACX,aAAa,EAAE,CAAC;SACjB,CAAC,CACH,CAAC;QAEF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QAE3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,mBAAmB;YACzB,SAAS,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE;SACxC,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,sBAAsB,CAAC,CAAC;QAC3D,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,SAAS,CAAC,qBAAqB,CAC7B,UAAU,CAAC;YACT,KAAK,EAAE,UAAU;YACjB,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE;gBACP;oBACE,EAAE,EAAE,OAAO;oBACX,KAAK,EAAE,eAAe;oBACtB,OAAO,EAAE,2BAA2B;oBACpC,QAAQ,EAAE,aAAa;oBACvB,UAAU,EAAE,QAAQ;oBACpB,cAAc,EAAE,IAAI;iBACrB;aACF;YACD,aAAa,EAAE,CAAC;SACjB,CAAC,CACH,CAAC;QAEF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QAE3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,mBAAmB;YACzB,SAAS,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE;SACjC,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,eAAe,CAAC,CAAC;QACpD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,SAAS,CAAC,qBAAqB,CAC7B,UAAU,CAAC;YACT,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,EAAE;YACX,aAAa,EAAE,CAAC;SACjB,CAAC,CACH,CAAC;QAEF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QAE3C,MAAM,MAAM,CAAC,QAAQ,CAAC;YACpB,IAAI,EAAE,mBAAmB;YACzB,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,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,iBAAiB,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=guardrail-middleware.test.d.ts.map
@@ -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":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for agentlens_health MCP tool (Story 1.5)
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=health.test.d.ts.map
@@ -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(17);
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));
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=llm-call.test.d.ts.map
@@ -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(17);
64
+ expect(result.tools).toHaveLength(24);
65
65
  });
66
66
  it('has a description', async () => {
67
67
  const { client } = await createTestSetup();
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for agentlens_optimize MCP tool (Story 2.5)
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=optimize.test.d.ts.map
@@ -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(17);
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
  });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=recall.test.d.ts.map
@@ -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 14 tools total', async () => {
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(17);
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: 'lessons', limit: 5 });
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=lessons');
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');