@agentlensai/mcp 0.8.0 → 0.10.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 (70) hide show
  1. package/dist/__tests__/benchmark.test.js +1 -1
  2. package/dist/__tests__/health.test.js +1 -1
  3. package/dist/__tests__/learn.test.js +1 -1
  4. package/dist/__tests__/llm-call.test.js +1 -1
  5. package/dist/__tests__/optimize.test.js +1 -1
  6. package/dist/__tests__/recall.test.js +1 -1
  7. package/dist/server.test.js +5 -2
  8. package/dist/server.test.js.map +1 -1
  9. package/dist/tools/__tests__/community.test.d.ts +5 -0
  10. package/dist/tools/__tests__/community.test.d.ts.map +1 -0
  11. package/dist/tools/__tests__/community.test.js +172 -0
  12. package/dist/tools/__tests__/community.test.js.map +1 -0
  13. package/dist/tools/__tests__/delegate.test.d.ts +5 -0
  14. package/dist/tools/__tests__/delegate.test.d.ts.map +1 -0
  15. package/dist/tools/__tests__/delegate.test.js +158 -0
  16. package/dist/tools/__tests__/delegate.test.js.map +1 -0
  17. package/dist/tools/__tests__/discover.test.d.ts +5 -0
  18. package/dist/tools/__tests__/discover.test.d.ts.map +1 -0
  19. package/dist/tools/__tests__/discover.test.js +112 -0
  20. package/dist/tools/__tests__/discover.test.js.map +1 -0
  21. package/dist/tools/__tests__/transport-community.test.d.ts +5 -0
  22. package/dist/tools/__tests__/transport-community.test.d.ts.map +1 -0
  23. package/dist/tools/__tests__/transport-community.test.js +99 -0
  24. package/dist/tools/__tests__/transport-community.test.js.map +1 -0
  25. package/dist/tools/community.d.ts +10 -0
  26. package/dist/tools/community.d.ts.map +1 -0
  27. package/dist/tools/community.js +167 -0
  28. package/dist/tools/community.js.map +1 -0
  29. package/dist/tools/delegate.d.ts +10 -0
  30. package/dist/tools/delegate.d.ts.map +1 -0
  31. package/dist/tools/delegate.js +106 -0
  32. package/dist/tools/delegate.js.map +1 -0
  33. package/dist/tools/discover.d.ts +10 -0
  34. package/dist/tools/discover.d.ts.map +1 -0
  35. package/dist/tools/discover.js +98 -0
  36. package/dist/tools/discover.js.map +1 -0
  37. package/dist/tools.d.ts.map +1 -1
  38. package/dist/tools.js +6 -0
  39. package/dist/tools.js.map +1 -1
  40. package/dist/tools.test.js +4 -1
  41. package/dist/tools.test.js.map +1 -1
  42. package/dist/transport.d.ts +8 -0
  43. package/dist/transport.d.ts.map +1 -1
  44. package/dist/transport.js +43 -0
  45. package/dist/transport.js.map +1 -1
  46. package/package.json +1 -1
  47. package/dist/__tests__/benchmark.test.d.ts +0 -5
  48. package/dist/__tests__/context.test.d.ts +0 -5
  49. package/dist/__tests__/context.test.d.ts.map +0 -1
  50. package/dist/__tests__/context.test.js +0 -203
  51. package/dist/__tests__/context.test.js.map +0 -1
  52. package/dist/__tests__/health.test.d.ts +0 -5
  53. package/dist/__tests__/learn.test.d.ts +0 -2
  54. package/dist/__tests__/llm-call.test.d.ts +0 -2
  55. package/dist/__tests__/optimize.test.d.ts +0 -5
  56. package/dist/__tests__/recall.test.d.ts +0 -2
  57. package/dist/__tests__/reflect.test.d.ts +0 -5
  58. package/dist/__tests__/reflect.test.d.ts.map +0 -1
  59. package/dist/__tests__/reflect.test.js +0 -165
  60. package/dist/__tests__/reflect.test.js.map +0 -1
  61. package/dist/__tests__/replay.test.d.ts +0 -5
  62. package/dist/__tests__/replay.test.d.ts.map +0 -1
  63. package/dist/__tests__/replay.test.js +0 -245
  64. package/dist/__tests__/replay.test.js.map +0 -1
  65. package/dist/server.test.d.ts +0 -2
  66. package/dist/tools.test.d.ts +0 -2
  67. package/dist/transport.test.d.ts +0 -2
  68. package/dist/transport.test.d.ts.map +0 -1
  69. package/dist/transport.test.js +0 -170
  70. package/dist/transport.test.js.map +0 -1
@@ -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(14);
146
+ expect(result.tools).toHaveLength(17);
147
147
  });
148
148
  // ─── Create ───────────────────────────────────────────────
149
149
  it('creates a benchmark successfully', async () => {
@@ -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(14);
71
+ expect(result.tools).toHaveLength(17);
72
72
  });
73
73
  it('returns formatted output with score, trend, and dimensions', async () => {
74
74
  mockFetch.mockResolvedValueOnce(okResponse(MOCK_HEALTH_SCORE));
@@ -54,7 +54,7 @@ describe('agentlens_learn registration', () => {
54
54
  it('registers 14 tools total', async () => {
55
55
  const { client } = await createTestSetup();
56
56
  const result = await client.listTools();
57
- expect(result.tools).toHaveLength(14);
57
+ expect(result.tools).toHaveLength(17);
58
58
  });
59
59
  it('has a description', async () => {
60
60
  const { client } = await createTestSetup();
@@ -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(14);
64
+ expect(result.tools).toHaveLength(17);
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(14);
53
+ expect(result.tools).toHaveLength(17);
54
54
  const toolNames = result.tools.map((t) => t.name);
55
55
  expect(toolNames).toContain('agentlens_optimize');
56
56
  });
@@ -48,7 +48,7 @@ describe('agentlens_recall registration', () => {
48
48
  it('registers 14 tools total', async () => {
49
49
  const { client } = await createTestSetup();
50
50
  const result = await client.listTools();
51
- expect(result.tools).toHaveLength(14);
51
+ expect(result.tools).toHaveLength(17);
52
52
  });
53
53
  it('has a description mentioning semantic search', async () => {
54
54
  const { client } = await createTestSetup();
@@ -24,18 +24,21 @@ describe('MCP Server Entrypoint (Story 5.1)', () => {
24
24
  const { transport } = createServer();
25
25
  expect(transport).toBeDefined();
26
26
  });
27
- it('lists all 14 tools via MCP protocol', async () => {
27
+ it('lists all 17 tools via MCP protocol', async () => {
28
28
  const { mcpServer } = createServer();
29
29
  const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
30
30
  const client = new Client({ name: 'test-client', version: '1.0.0' });
31
31
  await mcpServer.connect(serverTransport);
32
32
  await client.connect(clientTransport);
33
33
  const result = await client.listTools();
34
- expect(result.tools).toHaveLength(14);
34
+ expect(result.tools).toHaveLength(17);
35
35
  const names = result.tools.map((t) => t.name).sort();
36
36
  expect(names).toEqual([
37
37
  'agentlens_benchmark',
38
+ 'agentlens_community',
38
39
  'agentlens_context',
40
+ 'agentlens_delegate',
41
+ 'agentlens_discover',
39
42
  'agentlens_guardrails',
40
43
  'agentlens_health',
41
44
  'agentlens_learn',
@@ -1 +1 @@
1
- {"version":3,"file":"server.test.js","sourceRoot":"","sources":["../src/server.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.test.js","sourceRoot":"","sources":["../src/server.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for agentlens_community MCP Tool (Story 7.1)
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=community.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"community.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/community.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Tests for agentlens_community MCP Tool (Story 7.1)
3
+ */
4
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
5
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
+ import { AgentLensTransport } from '../../transport.js';
7
+ import { registerCommunityTool } from '../community.js';
8
+ // Helper to create a mock transport
9
+ function createMockTransport() {
10
+ const transport = new AgentLensTransport({ baseUrl: 'http://localhost:3400' });
11
+ return transport;
12
+ }
13
+ // Helper to create a mock Response
14
+ function mockResponse(data, ok = true, status = 200) {
15
+ return {
16
+ ok,
17
+ status,
18
+ json: () => Promise.resolve(data),
19
+ text: () => Promise.resolve(JSON.stringify(data)),
20
+ };
21
+ }
22
+ // We test the tool registration and handler logic by extracting the handler
23
+ describe('agentlens_community MCP Tool', () => {
24
+ let server;
25
+ let transport;
26
+ let toolHandler;
27
+ beforeEach(() => {
28
+ server = new McpServer({ name: 'test', version: '0.0.0' }, { capabilities: { tools: {} } });
29
+ transport = createMockTransport();
30
+ // Capture the handler when tool() is called
31
+ const origTool = server.tool.bind(server);
32
+ vi.spyOn(server, 'tool').mockImplementation((...args) => {
33
+ // The handler is the last argument
34
+ const handler = args[args.length - 1];
35
+ toolHandler = handler;
36
+ return origTool(...args);
37
+ });
38
+ registerCommunityTool(server, transport);
39
+ });
40
+ // ─── Share Action ─────────────────────────────────────
41
+ describe('share action', () => {
42
+ it('should require lessonId', async () => {
43
+ const result = await toolHandler({ action: 'share' });
44
+ expect(result.isError).toBe(true);
45
+ expect(result.content[0].text).toContain('lessonId is required');
46
+ });
47
+ it('should share a lesson successfully', async () => {
48
+ vi.spyOn(transport, 'communityShare').mockResolvedValue(mockResponse({ status: 'shared', anonymousLessonId: 'anon-123' }));
49
+ const result = await toolHandler({ action: 'share', lessonId: 'lesson-1' });
50
+ expect(result.isError).toBeUndefined();
51
+ expect(result.content[0].text).toContain('shared successfully');
52
+ expect(result.content[0].text).toContain('anon-123');
53
+ });
54
+ it('should pass category when provided', async () => {
55
+ const spy = vi.spyOn(transport, 'communityShare').mockResolvedValue(mockResponse({ status: 'shared', anonymousLessonId: 'anon-456' }));
56
+ await toolHandler({ action: 'share', lessonId: 'lesson-1', category: 'error-patterns' });
57
+ expect(spy).toHaveBeenCalledWith({ lessonId: 'lesson-1', category: 'error-patterns' });
58
+ });
59
+ it('should handle disabled status', async () => {
60
+ vi.spyOn(transport, 'communityShare').mockResolvedValue(mockResponse({ status: 'disabled', reason: 'Tenant sharing is disabled' }));
61
+ const result = await toolHandler({ action: 'share', lessonId: 'lesson-1' });
62
+ expect(result.content[0].text).toContain('disabled');
63
+ expect(result.content[0].text).toContain('Tenant sharing is disabled');
64
+ });
65
+ it('should handle API errors', async () => {
66
+ vi.spyOn(transport, 'communityShare').mockResolvedValue(mockResponse('Server error', false, 500));
67
+ const result = await toolHandler({ action: 'share', lessonId: 'lesson-1' });
68
+ expect(result.isError).toBe(true);
69
+ expect(result.content[0].text).toContain('Error sharing lesson');
70
+ });
71
+ it('should handle network errors', async () => {
72
+ vi.spyOn(transport, 'communityShare').mockRejectedValue(new Error('Network error'));
73
+ const result = await toolHandler({ action: 'share', lessonId: 'lesson-1' });
74
+ expect(result.isError).toBe(true);
75
+ expect(result.content[0].text).toContain('Network error');
76
+ });
77
+ });
78
+ // ─── Search Action ────────────────────────────────────
79
+ describe('search action', () => {
80
+ it('should require query', async () => {
81
+ const result = await toolHandler({ action: 'search' });
82
+ expect(result.isError).toBe(true);
83
+ expect(result.content[0].text).toContain('query is required');
84
+ });
85
+ it('should search and return results', async () => {
86
+ vi.spyOn(transport, 'communitySearch').mockResolvedValue(mockResponse({
87
+ lessons: [
88
+ { id: 'l1', title: 'Rate Limiting', category: 'error-patterns', reputationScore: 85, content: 'Use exponential backoff' },
89
+ ],
90
+ total: 1,
91
+ }));
92
+ const result = await toolHandler({ action: 'search', query: 'rate limiting' });
93
+ expect(result.isError).toBeUndefined();
94
+ expect(result.content[0].text).toContain('Found 1');
95
+ expect(result.content[0].text).toContain('Rate Limiting');
96
+ expect(result.content[0].text).toContain('rep: 85');
97
+ });
98
+ it('should handle empty results', async () => {
99
+ vi.spyOn(transport, 'communitySearch').mockResolvedValue(mockResponse({ lessons: [], total: 0 }));
100
+ const result = await toolHandler({ action: 'search', query: 'nonexistent' });
101
+ expect(result.content[0].text).toContain('No community lessons found');
102
+ });
103
+ it('should pass all search params', async () => {
104
+ const spy = vi.spyOn(transport, 'communitySearch').mockResolvedValue(mockResponse({ lessons: [], total: 0 }));
105
+ await toolHandler({ action: 'search', query: 'test', category: 'general', minReputation: 50, limit: 5 });
106
+ expect(spy).toHaveBeenCalledWith({
107
+ query: 'test',
108
+ category: 'general',
109
+ minReputation: '50',
110
+ limit: '5',
111
+ });
112
+ });
113
+ it('should handle API errors on search', async () => {
114
+ vi.spyOn(transport, 'communitySearch').mockResolvedValue(mockResponse('error', false, 500));
115
+ const result = await toolHandler({ action: 'search', query: 'test' });
116
+ expect(result.isError).toBe(true);
117
+ });
118
+ it('should truncate long content in results', async () => {
119
+ vi.spyOn(transport, 'communitySearch').mockResolvedValue(mockResponse({
120
+ lessons: [
121
+ { id: 'l1', title: 'Long', category: 'general', reputationScore: 50, content: 'x'.repeat(200) },
122
+ ],
123
+ total: 1,
124
+ }));
125
+ const result = await toolHandler({ action: 'search', query: 'test' });
126
+ expect(result.content[0].text).toContain('...');
127
+ });
128
+ });
129
+ // ─── Rate Action ──────────────────────────────────────
130
+ describe('rate action', () => {
131
+ it('should require lessonId', async () => {
132
+ const result = await toolHandler({ action: 'rate', delta: 1 });
133
+ expect(result.isError).toBe(true);
134
+ expect(result.content[0].text).toContain('lessonId is required');
135
+ });
136
+ it('should require delta', async () => {
137
+ const result = await toolHandler({ action: 'rate', lessonId: 'l1' });
138
+ expect(result.isError).toBe(true);
139
+ expect(result.content[0].text).toContain('delta is required');
140
+ });
141
+ it('should reject invalid delta', async () => {
142
+ const result = await toolHandler({ action: 'rate', lessonId: 'l1', delta: 5 });
143
+ expect(result.isError).toBe(true);
144
+ expect(result.content[0].text).toContain('must be +1 or -1');
145
+ });
146
+ it('should upvote successfully', async () => {
147
+ vi.spyOn(transport, 'communityRate').mockResolvedValue(mockResponse({ status: 'rated', reputationScore: 55 }));
148
+ const result = await toolHandler({ action: 'rate', lessonId: 'l1', delta: 1 });
149
+ expect(result.isError).toBeUndefined();
150
+ expect(result.content[0].text).toContain('👍');
151
+ expect(result.content[0].text).toContain('55');
152
+ });
153
+ it('should downvote successfully', async () => {
154
+ vi.spyOn(transport, 'communityRate').mockResolvedValue(mockResponse({ status: 'rated', reputationScore: 45 }));
155
+ const result = await toolHandler({ action: 'rate', lessonId: 'l1', delta: -1 });
156
+ expect(result.content[0].text).toContain('👎');
157
+ expect(result.content[0].text).toContain('45');
158
+ });
159
+ it('should handle rate API errors', async () => {
160
+ vi.spyOn(transport, 'communityRate').mockResolvedValue(mockResponse('error', false, 429));
161
+ const result = await toolHandler({ action: 'rate', lessonId: 'l1', delta: 1 });
162
+ expect(result.isError).toBe(true);
163
+ });
164
+ });
165
+ // ─── Unknown Action ───────────────────────────────────
166
+ it('should handle unknown action', async () => {
167
+ const result = await toolHandler({ action: 'unknown' });
168
+ expect(result.isError).toBe(true);
169
+ expect(result.content[0].text).toContain('Unknown action');
170
+ });
171
+ });
172
+ //# sourceMappingURL=community.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"community.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/community.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for agentlens_delegate MCP Tool (Story 7.1)
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=delegate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegate.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/delegate.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Tests for agentlens_delegate MCP Tool (Story 7.1)
3
+ */
4
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
5
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
+ import { AgentLensTransport } from '../../transport.js';
7
+ import { registerDelegateTool } from '../delegate.js';
8
+ function mockResponse(data, ok = true, status = 200) {
9
+ return {
10
+ ok,
11
+ status,
12
+ json: () => Promise.resolve(data),
13
+ text: () => Promise.resolve(JSON.stringify(data)),
14
+ };
15
+ }
16
+ describe('agentlens_delegate MCP Tool', () => {
17
+ let server;
18
+ let transport;
19
+ let toolHandler;
20
+ beforeEach(() => {
21
+ server = new McpServer({ name: 'test', version: '0.0.0' }, { capabilities: { tools: {} } });
22
+ transport = new AgentLensTransport({ baseUrl: 'http://localhost:3400' });
23
+ const origTool = server.tool.bind(server);
24
+ vi.spyOn(server, 'tool').mockImplementation((...args) => {
25
+ const handler = args[args.length - 1];
26
+ toolHandler = handler;
27
+ return origTool(...args);
28
+ });
29
+ registerDelegateTool(server, transport);
30
+ });
31
+ it('should require targetAgentId', async () => {
32
+ const result = await toolHandler({ action: 'delegate', taskType: 'translation', input: {} });
33
+ expect(result.isError).toBe(true);
34
+ expect(result.content[0].text).toContain('targetAgentId is required');
35
+ });
36
+ it('should require taskType', async () => {
37
+ const result = await toolHandler({ action: 'delegate', targetAgentId: 'anon-1', input: {} });
38
+ expect(result.isError).toBe(true);
39
+ expect(result.content[0].text).toContain('taskType is required');
40
+ });
41
+ it('should require input', async () => {
42
+ const result = await toolHandler({ action: 'delegate', targetAgentId: 'anon-1', taskType: 'translation' });
43
+ expect(result.isError).toBe(true);
44
+ expect(result.content[0].text).toContain('input is required');
45
+ });
46
+ it('should delegate successfully', async () => {
47
+ vi.spyOn(transport, 'delegate').mockResolvedValue(mockResponse({
48
+ requestId: 'req-123',
49
+ status: 'success',
50
+ output: { translated: 'Hola' },
51
+ executionTimeMs: 1500,
52
+ }));
53
+ const result = await toolHandler({
54
+ action: 'delegate',
55
+ targetAgentId: 'anon-abc',
56
+ taskType: 'translation',
57
+ input: { text: 'Hello', targetLang: 'es' },
58
+ });
59
+ expect(result.isError).toBeUndefined();
60
+ expect(result.content[0].text).toContain('Delegation successful');
61
+ expect(result.content[0].text).toContain('req-123');
62
+ expect(result.content[0].text).toContain('1500ms');
63
+ expect(result.content[0].text).toContain('Hola');
64
+ });
65
+ it('should show retries used', async () => {
66
+ vi.spyOn(transport, 'delegate').mockResolvedValue(mockResponse({
67
+ requestId: 'req-456',
68
+ status: 'success',
69
+ output: 'result',
70
+ executionTimeMs: 3000,
71
+ retriesUsed: 2,
72
+ }));
73
+ const result = await toolHandler({
74
+ action: 'delegate',
75
+ targetAgentId: 'anon-1',
76
+ taskType: 'analysis',
77
+ input: { data: [1, 2, 3] },
78
+ });
79
+ expect(result.content[0].text).toContain('Retries used: 2');
80
+ });
81
+ it('should handle rejected delegation', async () => {
82
+ vi.spyOn(transport, 'delegate').mockResolvedValue(mockResponse({ requestId: 'req-789', status: 'rejected' }));
83
+ const result = await toolHandler({
84
+ action: 'delegate',
85
+ targetAgentId: 'anon-1',
86
+ taskType: 'code-review',
87
+ input: { code: 'console.log("hi")' },
88
+ });
89
+ expect(result.content[0].text).toContain('rejected');
90
+ });
91
+ it('should handle timeout', async () => {
92
+ vi.spyOn(transport, 'delegate').mockResolvedValue(mockResponse({ requestId: 'req-t', status: 'timeout' }));
93
+ const result = await toolHandler({
94
+ action: 'delegate',
95
+ targetAgentId: 'anon-1',
96
+ taskType: 'generation',
97
+ input: {},
98
+ });
99
+ expect(result.content[0].text).toContain('timeout');
100
+ });
101
+ it('should pass optional params', async () => {
102
+ const spy = vi.spyOn(transport, 'delegate').mockResolvedValue(mockResponse({ requestId: 'req-1', status: 'success', output: null }));
103
+ await toolHandler({
104
+ action: 'delegate',
105
+ targetAgentId: 'anon-1',
106
+ taskType: 'analysis',
107
+ input: {},
108
+ fallbackEnabled: true,
109
+ maxRetries: 5,
110
+ timeoutMs: 60000,
111
+ });
112
+ expect(spy).toHaveBeenCalledWith({
113
+ targetAnonymousId: 'anon-1',
114
+ taskType: 'analysis',
115
+ input: {},
116
+ fallbackEnabled: true,
117
+ maxRetries: 5,
118
+ timeoutMs: 60000,
119
+ });
120
+ });
121
+ it('should handle API errors', async () => {
122
+ vi.spyOn(transport, 'delegate').mockResolvedValue(mockResponse('error', false, 500));
123
+ const result = await toolHandler({
124
+ action: 'delegate',
125
+ targetAgentId: 'anon-1',
126
+ taskType: 'code-review',
127
+ input: {},
128
+ });
129
+ expect(result.isError).toBe(true);
130
+ });
131
+ it('should handle network errors', async () => {
132
+ vi.spyOn(transport, 'delegate').mockRejectedValue(new Error('Timeout'));
133
+ const result = await toolHandler({
134
+ action: 'delegate',
135
+ targetAgentId: 'anon-1',
136
+ taskType: 'code-review',
137
+ input: {},
138
+ });
139
+ expect(result.isError).toBe(true);
140
+ expect(result.content[0].text).toContain('Timeout');
141
+ });
142
+ it('should handle error status with details', async () => {
143
+ vi.spyOn(transport, 'delegate').mockResolvedValue(mockResponse({ requestId: 'req-e', status: 'error', output: 'Agent unreachable' }));
144
+ const result = await toolHandler({
145
+ action: 'delegate',
146
+ targetAgentId: 'anon-1',
147
+ taskType: 'analysis',
148
+ input: {},
149
+ });
150
+ expect(result.content[0].text).toContain('error');
151
+ expect(result.content[0].text).toContain('Agent unreachable');
152
+ });
153
+ it('should handle unknown action', async () => {
154
+ const result = await toolHandler({ action: 'unknown' });
155
+ expect(result.isError).toBe(true);
156
+ });
157
+ });
158
+ //# sourceMappingURL=delegate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegate.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/delegate.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for agentlens_discover MCP Tool (Story 7.1)
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=discover.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/discover.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Tests for agentlens_discover MCP Tool (Story 7.1)
3
+ */
4
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
5
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
+ import { AgentLensTransport } from '../../transport.js';
7
+ import { registerDiscoverTool } from '../discover.js';
8
+ function mockResponse(data, ok = true, status = 200) {
9
+ return {
10
+ ok,
11
+ status,
12
+ json: () => Promise.resolve(data),
13
+ text: () => Promise.resolve(JSON.stringify(data)),
14
+ };
15
+ }
16
+ describe('agentlens_discover MCP Tool', () => {
17
+ let server;
18
+ let transport;
19
+ let toolHandler;
20
+ beforeEach(() => {
21
+ server = new McpServer({ name: 'test', version: '0.0.0' }, { capabilities: { tools: {} } });
22
+ transport = new AgentLensTransport({ baseUrl: 'http://localhost:3400' });
23
+ const origTool = server.tool.bind(server);
24
+ vi.spyOn(server, 'tool').mockImplementation((...args) => {
25
+ const handler = args[args.length - 1];
26
+ toolHandler = handler;
27
+ return origTool(...args);
28
+ });
29
+ registerDiscoverTool(server, transport);
30
+ });
31
+ it('should require taskType', async () => {
32
+ const result = await toolHandler({ action: 'discover' });
33
+ expect(result.isError).toBe(true);
34
+ expect(result.content[0].text).toContain('taskType is required');
35
+ });
36
+ it('should discover agents successfully', async () => {
37
+ vi.spyOn(transport, 'discover').mockResolvedValue(mockResponse({
38
+ results: [
39
+ {
40
+ anonymousAgentId: 'anon-abc',
41
+ taskType: 'code-review',
42
+ trustScorePercentile: 85,
43
+ provisional: false,
44
+ estimatedCostUsd: 0.05,
45
+ estimatedLatencyMs: 2000,
46
+ qualityMetrics: { successRate: 0.95, completedTasks: 100 },
47
+ },
48
+ ],
49
+ }));
50
+ const result = await toolHandler({ action: 'discover', taskType: 'code-review' });
51
+ expect(result.isError).toBeUndefined();
52
+ expect(result.content[0].text).toContain('Found 1 agent');
53
+ expect(result.content[0].text).toContain('anon-abc');
54
+ expect(result.content[0].text).toContain('Trust: 85%');
55
+ expect(result.content[0].text).toContain('$0.0500');
56
+ expect(result.content[0].text).toContain('2000ms');
57
+ expect(result.content[0].text).toContain('95.0%');
58
+ });
59
+ it('should handle empty results', async () => {
60
+ vi.spyOn(transport, 'discover').mockResolvedValue(mockResponse({ results: [] }));
61
+ const result = await toolHandler({ action: 'discover', taskType: 'custom' });
62
+ expect(result.content[0].text).toContain('No agents found');
63
+ });
64
+ it('should show provisional badge', async () => {
65
+ vi.spyOn(transport, 'discover').mockResolvedValue(mockResponse({
66
+ results: [
67
+ { anonymousAgentId: 'anon-1', taskType: 'translation', trustScorePercentile: 60, provisional: true, qualityMetrics: {} },
68
+ ],
69
+ }));
70
+ const result = await toolHandler({ action: 'discover', taskType: 'translation' });
71
+ expect(result.content[0].text).toContain('provisional');
72
+ });
73
+ it('should pass all query params', async () => {
74
+ const spy = vi.spyOn(transport, 'discover').mockResolvedValue(mockResponse({ results: [] }));
75
+ await toolHandler({ action: 'discover', taskType: 'analysis', minTrustScore: 70, maxCost: 0.1, maxLatency: 5000, limit: 5 });
76
+ expect(spy).toHaveBeenCalledWith({
77
+ taskType: 'analysis',
78
+ minTrustScore: '70',
79
+ maxCostUsd: '0.1',
80
+ maxLatencyMs: '5000',
81
+ limit: '5',
82
+ });
83
+ });
84
+ it('should handle API errors', async () => {
85
+ vi.spyOn(transport, 'discover').mockResolvedValue(mockResponse('Internal error', false, 500));
86
+ const result = await toolHandler({ action: 'discover', taskType: 'code-review' });
87
+ expect(result.isError).toBe(true);
88
+ });
89
+ it('should handle network errors', async () => {
90
+ vi.spyOn(transport, 'discover').mockRejectedValue(new Error('Connection refused'));
91
+ const result = await toolHandler({ action: 'discover', taskType: 'code-review' });
92
+ expect(result.isError).toBe(true);
93
+ expect(result.content[0].text).toContain('Connection refused');
94
+ });
95
+ it('should handle unknown action', async () => {
96
+ const result = await toolHandler({ action: 'unknown' });
97
+ expect(result.isError).toBe(true);
98
+ });
99
+ it('should handle multiple results', async () => {
100
+ vi.spyOn(transport, 'discover').mockResolvedValue(mockResponse({
101
+ results: [
102
+ { anonymousAgentId: 'a1', taskType: 'summarization', trustScorePercentile: 90, provisional: false, qualityMetrics: {} },
103
+ { anonymousAgentId: 'a2', taskType: 'summarization', trustScorePercentile: 75, provisional: true, qualityMetrics: {} },
104
+ ],
105
+ }));
106
+ const result = await toolHandler({ action: 'discover', taskType: 'summarization' });
107
+ expect(result.content[0].text).toContain('Found 2 agent');
108
+ expect(result.content[0].text).toContain('a1');
109
+ expect(result.content[0].text).toContain('a2');
110
+ });
111
+ });
112
+ //# sourceMappingURL=discover.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/discover.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for community/discovery/delegation transport methods (Story 7.1)
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=transport-community.test.d.ts.map