@opencontextprotocol/agent 0.1.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/README.md +198 -0
- package/dist/src/agent.d.ts +112 -0
- package/dist/src/agent.d.ts.map +1 -0
- package/dist/src/agent.js +358 -0
- package/dist/src/agent.js.map +1 -0
- package/dist/src/context.d.ts +108 -0
- package/dist/src/context.d.ts.map +1 -0
- package/dist/src/context.js +196 -0
- package/dist/src/context.js.map +1 -0
- package/dist/src/errors.d.ts +40 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/errors.js +63 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/headers.d.ts +63 -0
- package/dist/src/headers.d.ts.map +1 -0
- package/dist/src/headers.js +238 -0
- package/dist/src/headers.js.map +1 -0
- package/dist/src/http_client.d.ts +82 -0
- package/dist/src/http_client.d.ts.map +1 -0
- package/dist/src/http_client.js +181 -0
- package/dist/src/http_client.js.map +1 -0
- package/dist/src/index.d.ts +25 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +35 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/registry.d.ts +52 -0
- package/dist/src/registry.d.ts.map +1 -0
- package/dist/src/registry.js +164 -0
- package/dist/src/registry.js.map +1 -0
- package/dist/src/schema_discovery.d.ts +149 -0
- package/dist/src/schema_discovery.d.ts.map +1 -0
- package/dist/src/schema_discovery.js +707 -0
- package/dist/src/schema_discovery.js.map +1 -0
- package/dist/src/schemas/ocp-context.json +138 -0
- package/dist/src/storage.d.ts +110 -0
- package/dist/src/storage.d.ts.map +1 -0
- package/dist/src/storage.js +399 -0
- package/dist/src/storage.js.map +1 -0
- package/dist/src/validation.d.ts +169 -0
- package/dist/src/validation.d.ts.map +1 -0
- package/dist/src/validation.js +92 -0
- package/dist/src/validation.js.map +1 -0
- package/dist/tests/agent.test.d.ts +5 -0
- package/dist/tests/agent.test.d.ts.map +1 -0
- package/dist/tests/agent.test.js +536 -0
- package/dist/tests/agent.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 +285 -0
- package/dist/tests/context.test.js.map +1 -0
- package/dist/tests/headers.test.d.ts +5 -0
- package/dist/tests/headers.test.d.ts.map +1 -0
- package/dist/tests/headers.test.js +356 -0
- package/dist/tests/headers.test.js.map +1 -0
- package/dist/tests/http_client.test.d.ts +5 -0
- package/dist/tests/http_client.test.d.ts.map +1 -0
- package/dist/tests/http_client.test.js +373 -0
- package/dist/tests/http_client.test.js.map +1 -0
- package/dist/tests/registry.test.d.ts +5 -0
- package/dist/tests/registry.test.d.ts.map +1 -0
- package/dist/tests/registry.test.js +232 -0
- package/dist/tests/registry.test.js.map +1 -0
- package/dist/tests/schema_discovery.test.d.ts +5 -0
- package/dist/tests/schema_discovery.test.d.ts.map +1 -0
- package/dist/tests/schema_discovery.test.js +1074 -0
- package/dist/tests/schema_discovery.test.js.map +1 -0
- package/dist/tests/storage.test.d.ts +5 -0
- package/dist/tests/storage.test.d.ts.map +1 -0
- package/dist/tests/storage.test.js +414 -0
- package/dist/tests/storage.test.js.map +1 -0
- package/dist/tests/validation.test.d.ts +5 -0
- package/dist/tests/validation.test.d.ts.map +1 -0
- package/dist/tests/validation.test.js +254 -0
- package/dist/tests/validation.test.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.test.d.ts","sourceRoot":"","sources":["../../tests/agent.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,536 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for OCP Agent functionality.
|
|
3
|
+
*/
|
|
4
|
+
import { describe, test, expect, beforeEach, jest } from '@jest/globals';
|
|
5
|
+
import { OCPAgent } from '../src/agent.js';
|
|
6
|
+
// Mock fetch globally
|
|
7
|
+
global.fetch = jest.fn();
|
|
8
|
+
describe('OCP Agent', () => {
|
|
9
|
+
let agent;
|
|
10
|
+
const sampleApiSpec = {
|
|
11
|
+
title: 'Test API',
|
|
12
|
+
version: '1.0.0',
|
|
13
|
+
base_url: 'https://api.test.com',
|
|
14
|
+
description: 'A test API for testing purposes',
|
|
15
|
+
tools: [
|
|
16
|
+
{
|
|
17
|
+
name: 'get_items',
|
|
18
|
+
description: 'List all items',
|
|
19
|
+
method: 'GET',
|
|
20
|
+
path: '/items',
|
|
21
|
+
parameters: {
|
|
22
|
+
limit: {
|
|
23
|
+
type: 'integer',
|
|
24
|
+
required: false,
|
|
25
|
+
location: 'query',
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
response_schema: {},
|
|
29
|
+
operation_id: undefined,
|
|
30
|
+
tags: [],
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: 'post_items',
|
|
34
|
+
description: 'Create a new item',
|
|
35
|
+
method: 'POST',
|
|
36
|
+
path: '/items',
|
|
37
|
+
parameters: {
|
|
38
|
+
name: {
|
|
39
|
+
type: 'string',
|
|
40
|
+
required: true,
|
|
41
|
+
location: 'body',
|
|
42
|
+
},
|
|
43
|
+
description: {
|
|
44
|
+
type: 'string',
|
|
45
|
+
required: false,
|
|
46
|
+
location: 'body',
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
response_schema: {},
|
|
50
|
+
operation_id: undefined,
|
|
51
|
+
tags: [],
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: 'get_items_id',
|
|
55
|
+
description: 'Get a specific item',
|
|
56
|
+
method: 'GET',
|
|
57
|
+
path: '/items/{id}',
|
|
58
|
+
parameters: {
|
|
59
|
+
id: {
|
|
60
|
+
type: 'string',
|
|
61
|
+
required: true,
|
|
62
|
+
location: 'path',
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
response_schema: {},
|
|
66
|
+
operation_id: undefined,
|
|
67
|
+
tags: [],
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
raw_spec: {},
|
|
71
|
+
};
|
|
72
|
+
beforeEach(() => {
|
|
73
|
+
jest.clearAllMocks();
|
|
74
|
+
agent = new OCPAgent('test_agent', 'test_user', 'test_workspace', 'test goal', undefined, false);
|
|
75
|
+
});
|
|
76
|
+
describe('Agent Creation', () => {
|
|
77
|
+
test('agent creation', () => {
|
|
78
|
+
expect(agent.context.agent_type).toBe('test_agent');
|
|
79
|
+
expect(agent.context.user).toBe('test_user');
|
|
80
|
+
expect(agent.context.workspace).toBe('test_workspace');
|
|
81
|
+
expect(agent.context.current_goal).toBe('test goal');
|
|
82
|
+
expect(agent.knownApis.size).toBe(0);
|
|
83
|
+
expect(agent['discovery']).toBeDefined();
|
|
84
|
+
expect(agent['httpClient']).toBeDefined();
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
describe('Register API', () => {
|
|
88
|
+
test('register api', async () => {
|
|
89
|
+
// Mock discovery
|
|
90
|
+
const mockDiscoverApi = jest.fn().mockResolvedValue(sampleApiSpec);
|
|
91
|
+
agent['discovery'].discoverApi = mockDiscoverApi;
|
|
92
|
+
const result = await agent.registerApi('test_api', 'https://api.test.com/openapi.json');
|
|
93
|
+
expect(result).toEqual(sampleApiSpec);
|
|
94
|
+
expect(agent.knownApis.get('test_api')).toEqual(sampleApiSpec);
|
|
95
|
+
expect(agent.context.api_specs['test_api']).toBeDefined();
|
|
96
|
+
expect(agent.context.history.length).toBeGreaterThanOrEqual(1);
|
|
97
|
+
expect(agent.context.history[0].action).toBe('api_registered');
|
|
98
|
+
expect(mockDiscoverApi).toHaveBeenCalledWith('https://api.test.com/openapi.json', undefined);
|
|
99
|
+
});
|
|
100
|
+
test('register api with base url', async () => {
|
|
101
|
+
const mockDiscoverApi = jest.fn().mockResolvedValue(sampleApiSpec);
|
|
102
|
+
agent['discovery'].discoverApi = mockDiscoverApi;
|
|
103
|
+
await agent.registerApi('test_api', 'https://api.test.com/openapi.json', 'https://custom.test.com');
|
|
104
|
+
expect(mockDiscoverApi).toHaveBeenCalledWith('https://api.test.com/openapi.json', 'https://custom.test.com');
|
|
105
|
+
});
|
|
106
|
+
test('register api normalizes names', async () => {
|
|
107
|
+
const mockGetApiSpec = jest.spyOn(agent['registry'], 'getApiSpec');
|
|
108
|
+
mockGetApiSpec.mockResolvedValue(sampleApiSpec);
|
|
109
|
+
// Register with mixed case
|
|
110
|
+
const apiSpec = await agent.registerApi('GitHuB');
|
|
111
|
+
expect(agent.knownApis.has('github')).toBe(true);
|
|
112
|
+
expect(apiSpec.name).toBe('github');
|
|
113
|
+
// Can retrieve with any casing
|
|
114
|
+
expect(agent.listTools('GITHUB')).toEqual(agent.listTools('github'));
|
|
115
|
+
expect(agent.getTool('get_items', 'GitHub')).toBeDefined();
|
|
116
|
+
expect(agent.searchTools('items', 'gitHUB').length).toBeGreaterThan(0);
|
|
117
|
+
// Whitespace is stripped
|
|
118
|
+
await agent.registerApi(' stripe ');
|
|
119
|
+
expect(agent.knownApis.has('stripe')).toBe(true);
|
|
120
|
+
expect(agent.knownApis.has(' stripe ')).toBe(false);
|
|
121
|
+
mockGetApiSpec.mockRestore();
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe('List Tools', () => {
|
|
125
|
+
test('list tools no apis', () => {
|
|
126
|
+
const tools = agent.listTools();
|
|
127
|
+
expect(tools).toEqual([]);
|
|
128
|
+
});
|
|
129
|
+
test('list tools with api', () => {
|
|
130
|
+
agent.knownApis.set('test_api', sampleApiSpec);
|
|
131
|
+
// List all tools
|
|
132
|
+
const allTools = agent.listTools();
|
|
133
|
+
expect(allTools.length).toBe(3);
|
|
134
|
+
expect(allTools.every((tool) => ['get_items', 'post_items', 'get_items_id'].includes(tool.name))).toBe(true);
|
|
135
|
+
// List tools for specific API
|
|
136
|
+
const apiTools = agent.listTools('test_api');
|
|
137
|
+
expect(apiTools.length).toBe(3);
|
|
138
|
+
expect(apiTools).toEqual(sampleApiSpec.tools);
|
|
139
|
+
});
|
|
140
|
+
test('list tools unknown api', () => {
|
|
141
|
+
expect(() => agent.listTools('unknown_api')).toThrow('Unknown API: unknown_api');
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
describe('Get Tool', () => {
|
|
145
|
+
test('get tool', () => {
|
|
146
|
+
agent.knownApis.set('test_api', sampleApiSpec);
|
|
147
|
+
// Get existing tool
|
|
148
|
+
const tool = agent.getTool('get_items');
|
|
149
|
+
expect(tool).toBeDefined();
|
|
150
|
+
expect(tool.name).toBe('get_items');
|
|
151
|
+
expect(tool.method).toBe('GET');
|
|
152
|
+
// Get tool from specific API
|
|
153
|
+
const tool2 = agent.getTool('post_items', 'test_api');
|
|
154
|
+
expect(tool2).toBeDefined();
|
|
155
|
+
expect(tool2.name).toBe('post_items');
|
|
156
|
+
// Get non-existent tool
|
|
157
|
+
const tool3 = agent.getTool('nonexistent');
|
|
158
|
+
expect(tool3).toBeUndefined();
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
describe('Search Tools', () => {
|
|
162
|
+
test('search tools', () => {
|
|
163
|
+
agent.knownApis.set('test_api', sampleApiSpec);
|
|
164
|
+
// Mock search implementation
|
|
165
|
+
const mockSearch = jest.fn().mockReturnValue([sampleApiSpec.tools[0]]);
|
|
166
|
+
agent['discovery'].searchTools = mockSearch;
|
|
167
|
+
// Search all APIs
|
|
168
|
+
const results = agent.searchTools('list');
|
|
169
|
+
expect(results.length).toBe(1);
|
|
170
|
+
expect(mockSearch).toHaveBeenCalledWith(sampleApiSpec, 'list');
|
|
171
|
+
// Search specific API
|
|
172
|
+
mockSearch.mockClear();
|
|
173
|
+
const results2 = agent.searchTools('list', 'test_api');
|
|
174
|
+
expect(results2.length).toBe(1);
|
|
175
|
+
expect(mockSearch).toHaveBeenCalledWith(sampleApiSpec, 'list');
|
|
176
|
+
// Search unknown API
|
|
177
|
+
const results3 = agent.searchTools('list', 'unknown_api');
|
|
178
|
+
expect(results3).toEqual([]);
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
describe('Parameter Validation', () => {
|
|
182
|
+
test('validate parameters', () => {
|
|
183
|
+
const postTool = sampleApiSpec.tools[1]; // post_items tool
|
|
184
|
+
// Valid parameters
|
|
185
|
+
const errors1 = agent._validateParameters(postTool, { name: 'test' });
|
|
186
|
+
expect(errors1).toEqual([]);
|
|
187
|
+
// Missing required parameter
|
|
188
|
+
const errors2 = agent._validateParameters(postTool, {});
|
|
189
|
+
expect(errors2.length).toBe(1);
|
|
190
|
+
expect(errors2[0]).toContain('Missing required parameter: name');
|
|
191
|
+
// Wrong parameter type (basic validation doesn't catch this)
|
|
192
|
+
const errors3 = agent._validateParameters(postTool, { name: 123 });
|
|
193
|
+
expect(errors3).toEqual([]);
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
describe('Build Request', () => {
|
|
197
|
+
test('build request', () => {
|
|
198
|
+
// Test query parameters
|
|
199
|
+
const getTool = sampleApiSpec.tools[0]; // get_items tool
|
|
200
|
+
const [url1, params1] = agent._buildRequest(sampleApiSpec, getTool, { limit: 10 });
|
|
201
|
+
expect(url1).toBe('https://api.test.com/items');
|
|
202
|
+
expect(params1.params.limit).toBe(10);
|
|
203
|
+
expect(params1.timeout).toBe(30000);
|
|
204
|
+
// Test path parameters
|
|
205
|
+
const getTool2 = sampleApiSpec.tools[2]; // get_items_id tool
|
|
206
|
+
const [url2, params2] = agent._buildRequest(sampleApiSpec, getTool2, { id: '123' });
|
|
207
|
+
expect(url2).toBe('https://api.test.com/items/123');
|
|
208
|
+
expect(!params2.params || Object.keys(params2.params).length === 0).toBe(true);
|
|
209
|
+
// Test body parameters
|
|
210
|
+
const postTool = sampleApiSpec.tools[1]; // post_items tool
|
|
211
|
+
const [url3, params3] = agent._buildRequest(sampleApiSpec, postTool, {
|
|
212
|
+
name: 'test item',
|
|
213
|
+
description: 'test desc',
|
|
214
|
+
});
|
|
215
|
+
expect(url3).toBe('https://api.test.com/items');
|
|
216
|
+
expect(params3.json.name).toBe('test item');
|
|
217
|
+
expect(params3.json.description).toBe('test desc');
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
describe('Call Tool', () => {
|
|
221
|
+
test('call tool success', async () => {
|
|
222
|
+
agent.knownApis.set('test_api', sampleApiSpec);
|
|
223
|
+
// Mock successful response
|
|
224
|
+
const mockResponse = {
|
|
225
|
+
status: 200,
|
|
226
|
+
statusText: 'OK',
|
|
227
|
+
ok: true,
|
|
228
|
+
data: { success: true },
|
|
229
|
+
text: '{"success": true}',
|
|
230
|
+
headers: new Headers(),
|
|
231
|
+
json: async () => ({ success: true }),
|
|
232
|
+
};
|
|
233
|
+
const mockRequest = jest.fn().mockResolvedValue(mockResponse);
|
|
234
|
+
agent['httpClient'].request = mockRequest;
|
|
235
|
+
const response = await agent.callTool('get_items', { limit: 5 });
|
|
236
|
+
expect(response).toEqual(mockResponse);
|
|
237
|
+
expect(agent.context.history.length).toBeGreaterThanOrEqual(2);
|
|
238
|
+
// Check that the request was made correctly
|
|
239
|
+
expect(mockRequest).toHaveBeenCalledTimes(1);
|
|
240
|
+
const callArgs = mockRequest.mock.calls[0];
|
|
241
|
+
expect(callArgs[0]).toBe('GET'); // method
|
|
242
|
+
expect(callArgs[1]).toBe('https://api.test.com/items'); // url
|
|
243
|
+
expect(callArgs[2].params.limit).toBe(5);
|
|
244
|
+
});
|
|
245
|
+
test('call tool not found', async () => {
|
|
246
|
+
agent.knownApis.set('test_api', sampleApiSpec);
|
|
247
|
+
await expect(agent.callTool('nonexistent')).rejects.toThrow("Tool 'nonexistent' not found");
|
|
248
|
+
});
|
|
249
|
+
test('call tool validation error', async () => {
|
|
250
|
+
agent.knownApis.set('test_api', sampleApiSpec);
|
|
251
|
+
await expect(agent.callTool('post_items', {})).rejects.toThrow('Parameter validation failed');
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
describe('Tool Documentation', () => {
|
|
255
|
+
test('get tool documentation', () => {
|
|
256
|
+
agent.knownApis.set('test_api', sampleApiSpec);
|
|
257
|
+
const mockGenerateDoc = jest.fn().mockReturnValue('Tool documentation');
|
|
258
|
+
agent['discovery'].generateToolDocumentation = mockGenerateDoc;
|
|
259
|
+
const doc = agent.getToolDocumentation('get_items');
|
|
260
|
+
expect(doc).toBe('Tool documentation');
|
|
261
|
+
expect(mockGenerateDoc).toHaveBeenCalledWith(sampleApiSpec.tools[0]);
|
|
262
|
+
// Test non-existent tool
|
|
263
|
+
const doc2 = agent.getToolDocumentation('nonexistent');
|
|
264
|
+
expect(doc2.toLowerCase()).toContain('not found');
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
describe('Update Goal', () => {
|
|
268
|
+
test('update goal', () => {
|
|
269
|
+
const initialInteractions = agent.context.history.length;
|
|
270
|
+
agent.updateGoal('new goal', 'goal summary');
|
|
271
|
+
expect(agent.context.current_goal).toBe('new goal');
|
|
272
|
+
expect(agent.context.context_summary).toBe('goal summary');
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
describe('Registry Integration', () => {
|
|
276
|
+
test('register api from registry', async () => {
|
|
277
|
+
// Mock registry
|
|
278
|
+
const mockGetApiSpec = jest.fn().mockResolvedValue(sampleApiSpec);
|
|
279
|
+
const mockRegistry = {
|
|
280
|
+
getApiSpec: mockGetApiSpec,
|
|
281
|
+
registryUrl: 'https://test-registry.com',
|
|
282
|
+
};
|
|
283
|
+
// Create agent with custom registry
|
|
284
|
+
const agentWithRegistry = new OCPAgent('test_agent', undefined, undefined, undefined, 'https://test-registry.com', false);
|
|
285
|
+
agentWithRegistry['registry'] = mockRegistry;
|
|
286
|
+
// Register API from registry
|
|
287
|
+
const result = await agentWithRegistry.registerApi('test_api');
|
|
288
|
+
// Verify registry was called correctly
|
|
289
|
+
expect(mockGetApiSpec).toHaveBeenCalledWith('test_api', undefined);
|
|
290
|
+
// Verify API was registered
|
|
291
|
+
expect(result).toEqual(sampleApiSpec);
|
|
292
|
+
expect(agentWithRegistry.knownApis.get('test_api')).toEqual(sampleApiSpec);
|
|
293
|
+
// Verify context tracking
|
|
294
|
+
expect(agentWithRegistry.context.api_specs['test_api']).toBe('registry:test_api');
|
|
295
|
+
// Verify interaction logging
|
|
296
|
+
expect(agentWithRegistry.context.history.length).toBeGreaterThanOrEqual(1);
|
|
297
|
+
const interaction = agentWithRegistry.context.history[0];
|
|
298
|
+
expect(interaction.action).toBe('api_registered');
|
|
299
|
+
expect(interaction.api_endpoint).toBe('registry:test_api');
|
|
300
|
+
expect(interaction.metadata.source).toBe('registry');
|
|
301
|
+
});
|
|
302
|
+
test('register api from openapi url', async () => {
|
|
303
|
+
const mockDiscoverApi = jest.fn().mockResolvedValue(sampleApiSpec);
|
|
304
|
+
agent['discovery'].discoverApi = mockDiscoverApi;
|
|
305
|
+
// Register API with URL
|
|
306
|
+
const result = await agent.registerApi('test_api', 'https://api.test.com/openapi.json');
|
|
307
|
+
// Verify discovery was called
|
|
308
|
+
expect(mockDiscoverApi).toHaveBeenCalled();
|
|
309
|
+
// Verify API was registered
|
|
310
|
+
expect(result).toEqual(sampleApiSpec);
|
|
311
|
+
expect(agent.knownApis.get('test_api')).toBeDefined();
|
|
312
|
+
// Verify context tracking
|
|
313
|
+
expect(agent.context.api_specs['test_api']).toBe('https://api.test.com/openapi.json');
|
|
314
|
+
// Verify metadata indicates OpenAPI source
|
|
315
|
+
const interaction = agent.context.history[0];
|
|
316
|
+
expect(interaction.metadata.source).toBe('openapi');
|
|
317
|
+
});
|
|
318
|
+
test('register api with base url override', async () => {
|
|
319
|
+
const mockGetApiSpec = jest.fn().mockResolvedValue(sampleApiSpec);
|
|
320
|
+
const mockRegistry = {
|
|
321
|
+
getApiSpec: mockGetApiSpec,
|
|
322
|
+
registryUrl: 'https://registry.ocp.dev',
|
|
323
|
+
};
|
|
324
|
+
const agentWithRegistry = new OCPAgent('test_agent', undefined, undefined, undefined, undefined, false);
|
|
325
|
+
agentWithRegistry['registry'] = mockRegistry;
|
|
326
|
+
// Register with base URL override
|
|
327
|
+
await agentWithRegistry.registerApi('test_api', undefined, 'https://custom.test.com');
|
|
328
|
+
// Verify base_url was passed to registry
|
|
329
|
+
expect(mockGetApiSpec).toHaveBeenCalled();
|
|
330
|
+
});
|
|
331
|
+
test('agent initialization with registry url', () => {
|
|
332
|
+
const agentWithRegistry = new OCPAgent('test_agent', undefined, undefined, undefined, 'https://custom-registry.com', false);
|
|
333
|
+
expect(agentWithRegistry['registry'].registryUrl).toBe('https://custom-registry.com');
|
|
334
|
+
});
|
|
335
|
+
});
|
|
336
|
+
describe('Agent Authentication', () => {
|
|
337
|
+
// Helper to create fresh API spec for each test
|
|
338
|
+
const createAuthApiSpec = () => ({
|
|
339
|
+
title: 'Auth API',
|
|
340
|
+
version: '1.0.0',
|
|
341
|
+
base_url: 'https://api.auth-test.com',
|
|
342
|
+
description: 'API requiring authentication',
|
|
343
|
+
tools: [
|
|
344
|
+
{
|
|
345
|
+
name: 'get_user',
|
|
346
|
+
description: 'Get user info',
|
|
347
|
+
method: 'GET',
|
|
348
|
+
path: '/user',
|
|
349
|
+
parameters: {},
|
|
350
|
+
response_schema: {},
|
|
351
|
+
},
|
|
352
|
+
],
|
|
353
|
+
raw_spec: {},
|
|
354
|
+
});
|
|
355
|
+
const mockFetchResponse = () => {
|
|
356
|
+
const mockResponse = {
|
|
357
|
+
status: 200,
|
|
358
|
+
statusText: 'OK',
|
|
359
|
+
ok: true,
|
|
360
|
+
headers: new Headers(),
|
|
361
|
+
text: async () => '{}',
|
|
362
|
+
};
|
|
363
|
+
global.fetch.mockResolvedValue(mockResponse);
|
|
364
|
+
};
|
|
365
|
+
test('register api with headers', async () => {
|
|
366
|
+
const sampleApiSpec = createAuthApiSpec();
|
|
367
|
+
const mockGetApiSpec = jest.fn().mockResolvedValue(sampleApiSpec);
|
|
368
|
+
const mockRegistry = { getApiSpec: mockGetApiSpec };
|
|
369
|
+
agent['registry'] = mockRegistry;
|
|
370
|
+
// Register API with headers
|
|
371
|
+
const headers = { Authorization: 'Bearer token123' };
|
|
372
|
+
const result = await agent.registerApi('auth_api', undefined, undefined, headers);
|
|
373
|
+
// Verify wrapped client was stored
|
|
374
|
+
expect(agent.apiClients.has('auth_api')).toBe(true);
|
|
375
|
+
// Verify API spec was registered
|
|
376
|
+
expect(result).toEqual(sampleApiSpec);
|
|
377
|
+
expect(agent.knownApis.has('auth_api')).toBe(true);
|
|
378
|
+
// Verify name was set on spec
|
|
379
|
+
expect(result.name).toBe('auth_api');
|
|
380
|
+
});
|
|
381
|
+
test('register api without headers', async () => {
|
|
382
|
+
const sampleApiSpec = createAuthApiSpec();
|
|
383
|
+
const mockGetApiSpec = jest.fn().mockResolvedValue(sampleApiSpec);
|
|
384
|
+
const mockRegistry = { getApiSpec: mockGetApiSpec };
|
|
385
|
+
agent['registry'] = mockRegistry;
|
|
386
|
+
// Register API without headers
|
|
387
|
+
const result = await agent.registerApi('public_api');
|
|
388
|
+
// Verify no wrapped client was created
|
|
389
|
+
expect(agent.apiClients.has('public_api')).toBe(false);
|
|
390
|
+
expect(agent.apiClients.size).toBe(0);
|
|
391
|
+
// Verify API was still registered
|
|
392
|
+
expect(result).toEqual(sampleApiSpec);
|
|
393
|
+
expect(agent.knownApis.has('public_api')).toBe(true);
|
|
394
|
+
});
|
|
395
|
+
test('call tool with registered headers', async () => {
|
|
396
|
+
const sampleApiSpec = createAuthApiSpec();
|
|
397
|
+
const specWithName = { ...sampleApiSpec, name: 'auth_api' };
|
|
398
|
+
agent.knownApis.set('auth_api', specWithName);
|
|
399
|
+
// Create mock wrapped client
|
|
400
|
+
const mockWrappedClient = {
|
|
401
|
+
request: jest.fn().mockResolvedValue({
|
|
402
|
+
status: 200,
|
|
403
|
+
statusText: 'OK',
|
|
404
|
+
ok: true,
|
|
405
|
+
text: '{"user":"test"}',
|
|
406
|
+
json: async () => ({ user: 'test' }),
|
|
407
|
+
}),
|
|
408
|
+
};
|
|
409
|
+
agent.apiClients.set('auth_api', mockWrappedClient);
|
|
410
|
+
// Spy on default http client
|
|
411
|
+
const defaultRequestSpy = jest.spyOn(agent['httpClient'], 'request');
|
|
412
|
+
// Call tool
|
|
413
|
+
const response = await agent.callTool('get_user');
|
|
414
|
+
// Verify wrapped client was used (not default http_client)
|
|
415
|
+
expect(mockWrappedClient.request).toHaveBeenCalled();
|
|
416
|
+
expect(defaultRequestSpy).not.toHaveBeenCalled();
|
|
417
|
+
expect(response.status).toBe(200);
|
|
418
|
+
});
|
|
419
|
+
test('call tool without registered headers', async () => {
|
|
420
|
+
const sampleApiSpec = createAuthApiSpec();
|
|
421
|
+
const specWithName = { ...sampleApiSpec, name: 'public_api' };
|
|
422
|
+
agent.knownApis.set('public_api', specWithName);
|
|
423
|
+
// Mock default http client
|
|
424
|
+
const mockResponse = {
|
|
425
|
+
status: 200,
|
|
426
|
+
statusText: 'OK',
|
|
427
|
+
ok: true,
|
|
428
|
+
text: '{"data":"test"}',
|
|
429
|
+
json: async () => ({ data: 'test' }),
|
|
430
|
+
};
|
|
431
|
+
const defaultRequestSpy = jest.spyOn(agent['httpClient'], 'request').mockResolvedValue(mockResponse);
|
|
432
|
+
// Call tool
|
|
433
|
+
const response = await agent.callTool('get_user');
|
|
434
|
+
// Verify default http_client was used
|
|
435
|
+
expect(defaultRequestSpy).toHaveBeenCalled();
|
|
436
|
+
expect(response.status).toBe(200);
|
|
437
|
+
});
|
|
438
|
+
test('call tool with headers parameter', async () => {
|
|
439
|
+
const sampleApiSpec = createAuthApiSpec();
|
|
440
|
+
const specWithName = { ...sampleApiSpec, name: 'api' };
|
|
441
|
+
agent.knownApis.set('api', specWithName);
|
|
442
|
+
// Setup registered client
|
|
443
|
+
const registeredClient = {
|
|
444
|
+
request: jest.fn().mockResolvedValue({
|
|
445
|
+
status: 200,
|
|
446
|
+
statusText: 'OK',
|
|
447
|
+
ok: true,
|
|
448
|
+
text: async () => '{}',
|
|
449
|
+
}),
|
|
450
|
+
};
|
|
451
|
+
agent.apiClients.set('api', registeredClient);
|
|
452
|
+
// Mock fetch for per-call headers
|
|
453
|
+
mockFetchResponse();
|
|
454
|
+
// Call tool with per-call headers
|
|
455
|
+
const callHeaders = { Authorization: 'Bearer different_token' };
|
|
456
|
+
const response = await agent.callTool('get_user', {}, undefined, callHeaders);
|
|
457
|
+
// Verify registered client was NOT used (per-call headers take priority)
|
|
458
|
+
expect(registeredClient.request).not.toHaveBeenCalled();
|
|
459
|
+
expect(response.status).toBe(200);
|
|
460
|
+
});
|
|
461
|
+
test('call tool client priority', async () => {
|
|
462
|
+
const sampleApiSpec = createAuthApiSpec();
|
|
463
|
+
const specWithName = { ...sampleApiSpec, name: 'api' };
|
|
464
|
+
agent.knownApis.set('api', specWithName);
|
|
465
|
+
// Setup registered client
|
|
466
|
+
const registeredClient = {
|
|
467
|
+
request: jest.fn().mockResolvedValue({
|
|
468
|
+
status: 200,
|
|
469
|
+
statusText: 'OK',
|
|
470
|
+
ok: true,
|
|
471
|
+
text: async () => '{}',
|
|
472
|
+
}),
|
|
473
|
+
};
|
|
474
|
+
agent.apiClients.set('api', registeredClient);
|
|
475
|
+
const defaultRequestSpy = jest.spyOn(agent['httpClient'], 'request').mockResolvedValue({
|
|
476
|
+
status: 200,
|
|
477
|
+
statusText: 'OK',
|
|
478
|
+
ok: true,
|
|
479
|
+
text: async () => '{}',
|
|
480
|
+
});
|
|
481
|
+
// Mock fetch for per-call headers
|
|
482
|
+
mockFetchResponse();
|
|
483
|
+
// Test 1: With call_tool headers (highest priority)
|
|
484
|
+
await agent.callTool('get_user', {}, undefined, { Authorization: 'Bearer call' });
|
|
485
|
+
expect(registeredClient.request).not.toHaveBeenCalled();
|
|
486
|
+
expect(defaultRequestSpy).not.toHaveBeenCalled();
|
|
487
|
+
// Test 2: Without call_tool headers, with registered headers (medium priority)
|
|
488
|
+
await agent.callTool('get_user');
|
|
489
|
+
expect(registeredClient.request).toHaveBeenCalled();
|
|
490
|
+
expect(defaultRequestSpy).not.toHaveBeenCalled();
|
|
491
|
+
registeredClient.request.mockClear();
|
|
492
|
+
defaultRequestSpy.mockClear();
|
|
493
|
+
// Test 3: Without any headers (default client, lowest priority)
|
|
494
|
+
agent.apiClients.delete('api');
|
|
495
|
+
await agent.callTool('get_user');
|
|
496
|
+
expect(registeredClient.request).not.toHaveBeenCalled();
|
|
497
|
+
expect(defaultRequestSpy).toHaveBeenCalled();
|
|
498
|
+
});
|
|
499
|
+
test('api spec name field set', async () => {
|
|
500
|
+
const sampleApiSpec = createAuthApiSpec();
|
|
501
|
+
const mockGetApiSpec = jest.fn().mockResolvedValue(sampleApiSpec);
|
|
502
|
+
const mockRegistry = { getApiSpec: mockGetApiSpec };
|
|
503
|
+
agent['registry'] = mockRegistry;
|
|
504
|
+
// Initially spec has no name
|
|
505
|
+
expect(sampleApiSpec.name).toBeUndefined();
|
|
506
|
+
// Register API
|
|
507
|
+
const result = await agent.registerApi('my_api');
|
|
508
|
+
// Verify name was set
|
|
509
|
+
expect(result.name).toBe('my_api');
|
|
510
|
+
expect(agent.knownApis.get('my_api')?.name).toBe('my_api');
|
|
511
|
+
});
|
|
512
|
+
test('register api with different auth types', async () => {
|
|
513
|
+
const mockGetApiSpec = jest.fn()
|
|
514
|
+
.mockImplementation(() => Promise.resolve(createAuthApiSpec()));
|
|
515
|
+
const mockRegistry = { getApiSpec: mockGetApiSpec };
|
|
516
|
+
agent['registry'] = mockRegistry;
|
|
517
|
+
// Test Bearer token
|
|
518
|
+
await agent.registerApi('api1', undefined, undefined, { Authorization: 'Bearer jwt_token' });
|
|
519
|
+
expect(agent.apiClients.has('api1')).toBe(true);
|
|
520
|
+
// Test API key
|
|
521
|
+
await agent.registerApi('api2', undefined, undefined, { 'X-API-Key': 'secret_key' });
|
|
522
|
+
expect(agent.apiClients.has('api2')).toBe(true);
|
|
523
|
+
// Test Basic auth
|
|
524
|
+
await agent.registerApi('api3', undefined, undefined, { Authorization: 'Basic dXNlcjpwYXNz' });
|
|
525
|
+
expect(agent.apiClients.has('api3')).toBe(true);
|
|
526
|
+
// Test multiple headers
|
|
527
|
+
const multiHeaders = {
|
|
528
|
+
Authorization: 'Bearer token',
|
|
529
|
+
'X-Custom-Header': 'value',
|
|
530
|
+
};
|
|
531
|
+
await agent.registerApi('api4', undefined, undefined, multiHeaders);
|
|
532
|
+
expect(agent.apiClients.has('api4')).toBe(true);
|
|
533
|
+
});
|
|
534
|
+
});
|
|
535
|
+
});
|
|
536
|
+
//# sourceMappingURL=agent.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.test.js","sourceRoot":"","sources":["../../tests/agent.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.test.d.ts","sourceRoot":"","sources":["../../tests/context.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|