@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.
Files changed (76) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +198 -0
  3. package/dist/src/agent.d.ts +112 -0
  4. package/dist/src/agent.d.ts.map +1 -0
  5. package/dist/src/agent.js +358 -0
  6. package/dist/src/agent.js.map +1 -0
  7. package/dist/src/context.d.ts +108 -0
  8. package/dist/src/context.d.ts.map +1 -0
  9. package/dist/src/context.js +196 -0
  10. package/dist/src/context.js.map +1 -0
  11. package/dist/src/errors.d.ts +40 -0
  12. package/dist/src/errors.d.ts.map +1 -0
  13. package/dist/src/errors.js +63 -0
  14. package/dist/src/errors.js.map +1 -0
  15. package/dist/src/headers.d.ts +63 -0
  16. package/dist/src/headers.d.ts.map +1 -0
  17. package/dist/src/headers.js +238 -0
  18. package/dist/src/headers.js.map +1 -0
  19. package/dist/src/http_client.d.ts +82 -0
  20. package/dist/src/http_client.d.ts.map +1 -0
  21. package/dist/src/http_client.js +181 -0
  22. package/dist/src/http_client.js.map +1 -0
  23. package/dist/src/index.d.ts +25 -0
  24. package/dist/src/index.d.ts.map +1 -0
  25. package/dist/src/index.js +35 -0
  26. package/dist/src/index.js.map +1 -0
  27. package/dist/src/registry.d.ts +52 -0
  28. package/dist/src/registry.d.ts.map +1 -0
  29. package/dist/src/registry.js +164 -0
  30. package/dist/src/registry.js.map +1 -0
  31. package/dist/src/schema_discovery.d.ts +149 -0
  32. package/dist/src/schema_discovery.d.ts.map +1 -0
  33. package/dist/src/schema_discovery.js +707 -0
  34. package/dist/src/schema_discovery.js.map +1 -0
  35. package/dist/src/schemas/ocp-context.json +138 -0
  36. package/dist/src/storage.d.ts +110 -0
  37. package/dist/src/storage.d.ts.map +1 -0
  38. package/dist/src/storage.js +399 -0
  39. package/dist/src/storage.js.map +1 -0
  40. package/dist/src/validation.d.ts +169 -0
  41. package/dist/src/validation.d.ts.map +1 -0
  42. package/dist/src/validation.js +92 -0
  43. package/dist/src/validation.js.map +1 -0
  44. package/dist/tests/agent.test.d.ts +5 -0
  45. package/dist/tests/agent.test.d.ts.map +1 -0
  46. package/dist/tests/agent.test.js +536 -0
  47. package/dist/tests/agent.test.js.map +1 -0
  48. package/dist/tests/context.test.d.ts +5 -0
  49. package/dist/tests/context.test.d.ts.map +1 -0
  50. package/dist/tests/context.test.js +285 -0
  51. package/dist/tests/context.test.js.map +1 -0
  52. package/dist/tests/headers.test.d.ts +5 -0
  53. package/dist/tests/headers.test.d.ts.map +1 -0
  54. package/dist/tests/headers.test.js +356 -0
  55. package/dist/tests/headers.test.js.map +1 -0
  56. package/dist/tests/http_client.test.d.ts +5 -0
  57. package/dist/tests/http_client.test.d.ts.map +1 -0
  58. package/dist/tests/http_client.test.js +373 -0
  59. package/dist/tests/http_client.test.js.map +1 -0
  60. package/dist/tests/registry.test.d.ts +5 -0
  61. package/dist/tests/registry.test.d.ts.map +1 -0
  62. package/dist/tests/registry.test.js +232 -0
  63. package/dist/tests/registry.test.js.map +1 -0
  64. package/dist/tests/schema_discovery.test.d.ts +5 -0
  65. package/dist/tests/schema_discovery.test.d.ts.map +1 -0
  66. package/dist/tests/schema_discovery.test.js +1074 -0
  67. package/dist/tests/schema_discovery.test.js.map +1 -0
  68. package/dist/tests/storage.test.d.ts +5 -0
  69. package/dist/tests/storage.test.d.ts.map +1 -0
  70. package/dist/tests/storage.test.js +414 -0
  71. package/dist/tests/storage.test.js.map +1 -0
  72. package/dist/tests/validation.test.d.ts +5 -0
  73. package/dist/tests/validation.test.d.ts.map +1 -0
  74. package/dist/tests/validation.test.js +254 -0
  75. package/dist/tests/validation.test.js.map +1 -0
  76. package/package.json +51 -0
@@ -0,0 +1,399 @@
1
+ /**
2
+ * OCPStorage - Local storage for API caching and session persistence.
3
+ *
4
+ * Provides optional local storage for OCP agents to cache API specifications
5
+ * and persist session contexts across application restarts.
6
+ */
7
+ import * as fs from 'fs/promises';
8
+ import * as fsSync from 'fs';
9
+ import * as path from 'path';
10
+ import * as os from 'os';
11
+ import { AgentContext } from './context.js';
12
+ /**
13
+ * Local storage manager for OCP API cache and session persistence.
14
+ *
15
+ * Storage directory structure:
16
+ * ~/.ocp/
17
+ * ├── cache/
18
+ * │ └── apis/
19
+ * │ ├── github.json
20
+ * │ ├── stripe.json
21
+ * │ └── ...
22
+ * └── sessions/
23
+ * ├── vscode-chat-abc123.json
24
+ * ├── cli-session-xyz789.json
25
+ * └── ...
26
+ *
27
+ * Design principles:
28
+ * - Per-file storage for surgical reads/writes
29
+ * - Fail-safe: storage errors don't break functionality
30
+ * - Consumer-agnostic: doesn't manage consumer config
31
+ */
32
+ export class OCPStorage {
33
+ /**
34
+ * Initialize storage with base directory.
35
+ *
36
+ * @param basePath - Base storage directory (defaults to ~/.ocp/)
37
+ */
38
+ constructor(basePath) {
39
+ this.basePath = basePath ?? path.join(os.homedir(), '.ocp');
40
+ this.cacheDir = path.join(this.basePath, 'cache', 'apis');
41
+ this.sessionsDir = path.join(this.basePath, 'sessions');
42
+ // Create directories synchronously in constructor
43
+ this.ensureDirsSync();
44
+ }
45
+ /**
46
+ * Create storage directories if they don't exist (synchronous).
47
+ */
48
+ ensureDirsSync() {
49
+ try {
50
+ fsSync.mkdirSync(this.cacheDir, { recursive: true });
51
+ fsSync.mkdirSync(this.sessionsDir, { recursive: true });
52
+ }
53
+ catch (err) {
54
+ // Non-fatal: log but don't throw
55
+ console.warn(`Warning: Failed to create storage directories: ${err}`);
56
+ }
57
+ }
58
+ // ==================== API Caching ====================
59
+ /**
60
+ * Cache an API specification locally.
61
+ *
62
+ * @param name - API name (used as filename)
63
+ * @param spec - API specification to cache
64
+ * @param metadata - Optional metadata (source, cached_at, etc.)
65
+ * @returns True if cached successfully, false on error
66
+ */
67
+ async cacheApi(name, spec, metadata) {
68
+ try {
69
+ const cacheFile = path.join(this.cacheDir, `${name}.json`);
70
+ const cacheData = {
71
+ api_name: name,
72
+ title: spec.title,
73
+ version: spec.version,
74
+ base_url: spec.base_url,
75
+ cached_at: new Date().toISOString(),
76
+ source: metadata?.source ?? 'unknown',
77
+ raw_spec: spec.raw_spec,
78
+ tools: spec.tools.map((tool) => ({
79
+ name: tool.name,
80
+ method: tool.method,
81
+ path: tool.path,
82
+ description: tool.description,
83
+ parameters: tool.parameters,
84
+ response_schema: tool.response_schema,
85
+ operation_id: tool.operation_id,
86
+ tags: tool.tags
87
+ }))
88
+ };
89
+ // Add description if present
90
+ if (spec.description) {
91
+ cacheData.description = spec.description;
92
+ }
93
+ // Merge all metadata into cache data
94
+ if (metadata) {
95
+ Object.assign(cacheData, metadata);
96
+ }
97
+ await fs.writeFile(cacheFile, JSON.stringify(cacheData, null, 2), 'utf-8');
98
+ return true;
99
+ }
100
+ catch (err) {
101
+ console.warn(`Warning: Failed to cache API '${name}': ${err}`);
102
+ return false;
103
+ }
104
+ }
105
+ /**
106
+ * Retrieve cached API specification.
107
+ *
108
+ * @param name - API name to retrieve
109
+ * @param maxAgeDays - Maximum age in days (null/undefined = no expiration check)
110
+ * @returns Cached API spec or null if not found/expired
111
+ */
112
+ async getCachedApi(name, maxAgeDays) {
113
+ try {
114
+ const cacheFile = path.join(this.cacheDir, `${name}.json`);
115
+ const content = await fs.readFile(cacheFile, 'utf-8');
116
+ const data = JSON.parse(content);
117
+ // Check expiration if maxAgeDays is set
118
+ if (maxAgeDays !== null && maxAgeDays !== undefined && data.cached_at) {
119
+ const cachedAt = new Date(data.cached_at);
120
+ const now = new Date();
121
+ const ageMs = now.getTime() - cachedAt.getTime();
122
+ const ageDays = ageMs / (1000 * 60 * 60 * 24);
123
+ if (ageDays > maxAgeDays) {
124
+ return null; // Expired
125
+ }
126
+ }
127
+ // Reconstruct OCPAPISpec
128
+ const spec = {
129
+ title: data.title,
130
+ version: data.version,
131
+ base_url: data.base_url,
132
+ description: data.description || '',
133
+ raw_spec: data.raw_spec,
134
+ tools: data.tools.map((tool) => ({
135
+ name: tool.name,
136
+ method: tool.method,
137
+ path: tool.path,
138
+ description: tool.description,
139
+ parameters: tool.parameters,
140
+ response_schema: tool.response_schema,
141
+ operation_id: tool.operation_id,
142
+ tags: tool.tags
143
+ }))
144
+ };
145
+ return spec;
146
+ }
147
+ catch (err) {
148
+ // File not found or parse error
149
+ return null;
150
+ }
151
+ }
152
+ /**
153
+ * Search cached APIs by name or description.
154
+ *
155
+ * @param query - Search query (case-insensitive)
156
+ * @returns List of matching API metadata
157
+ */
158
+ async searchCache(query) {
159
+ try {
160
+ const files = await fs.readdir(this.cacheDir);
161
+ const results = [];
162
+ const lowerQuery = query.toLowerCase();
163
+ for (const file of files) {
164
+ if (!file.endsWith('.json'))
165
+ continue;
166
+ try {
167
+ const filePath = path.join(this.cacheDir, file);
168
+ const content = await fs.readFile(filePath, 'utf-8');
169
+ const data = JSON.parse(content);
170
+ // Search in name, title, description, and tool descriptions
171
+ const searchText = [
172
+ data.api_name || '',
173
+ data.title || '',
174
+ data.description || '',
175
+ ...(data.tools || []).map((t) => t.description || '')
176
+ ].join(' ').toLowerCase();
177
+ if (searchText.includes(lowerQuery)) {
178
+ results.push({
179
+ name: data.api_name,
180
+ title: data.title,
181
+ version: data.version,
182
+ base_url: data.base_url,
183
+ cached_at: data.cached_at,
184
+ tool_count: data.tools?.length || 0
185
+ });
186
+ }
187
+ }
188
+ catch {
189
+ // Skip files that can't be parsed
190
+ continue;
191
+ }
192
+ }
193
+ return results;
194
+ }
195
+ catch (err) {
196
+ console.warn(`Warning: Failed to search cache: ${err}`);
197
+ return [];
198
+ }
199
+ }
200
+ /**
201
+ * List all cached API names.
202
+ *
203
+ * @returns List of cached API names
204
+ */
205
+ async listCachedApis() {
206
+ try {
207
+ const files = await fs.readdir(this.cacheDir);
208
+ return files
209
+ .filter(f => f.endsWith('.json'))
210
+ .map(f => f.replace('.json', ''));
211
+ }
212
+ catch (err) {
213
+ console.warn(`Warning: Failed to list cached APIs: ${err}`);
214
+ return [];
215
+ }
216
+ }
217
+ /**
218
+ * Clear cached API(s).
219
+ *
220
+ * @param name - API name to clear, or null to clear all
221
+ * @returns True if cleared successfully
222
+ */
223
+ async clearCache(name) {
224
+ try {
225
+ if (name) {
226
+ // Clear specific API
227
+ const cacheFile = path.join(this.cacheDir, `${name}.json`);
228
+ await fs.unlink(cacheFile);
229
+ }
230
+ else {
231
+ // Clear all APIs
232
+ const files = await fs.readdir(this.cacheDir);
233
+ for (const file of files) {
234
+ if (file.endsWith('.json')) {
235
+ await fs.unlink(path.join(this.cacheDir, file));
236
+ }
237
+ }
238
+ }
239
+ return true;
240
+ }
241
+ catch (err) {
242
+ console.warn(`Warning: Failed to clear cache: ${err}`);
243
+ return false;
244
+ }
245
+ }
246
+ // ==================== Session Persistence ====================
247
+ /**
248
+ * Save session context to disk.
249
+ *
250
+ * @param sessionId - Unique session identifier
251
+ * @param context - AgentContext to save
252
+ * @returns True if saved successfully
253
+ */
254
+ async saveSession(sessionId, context) {
255
+ try {
256
+ const sessionFile = path.join(this.sessionsDir, `${sessionId}.json`);
257
+ // Add session_id to the context data for storage
258
+ const sessionData = context.toDict();
259
+ sessionData.session_id = sessionId;
260
+ await fs.writeFile(sessionFile, JSON.stringify(sessionData, null, 2), 'utf-8');
261
+ return true;
262
+ }
263
+ catch (err) {
264
+ console.warn(`Warning: Failed to save session '${sessionId}': ${err}`);
265
+ return false;
266
+ }
267
+ }
268
+ /**
269
+ * Load session context from disk.
270
+ *
271
+ * @param sessionId - Session identifier
272
+ * @returns AgentContext or null if not found
273
+ */
274
+ async loadSession(sessionId) {
275
+ try {
276
+ const sessionFile = path.join(this.sessionsDir, `${sessionId}.json`);
277
+ const content = await fs.readFile(sessionFile, 'utf-8');
278
+ const data = JSON.parse(content);
279
+ // Remove session_id before reconstructing context
280
+ delete data.session_id;
281
+ return AgentContext.fromDict(data);
282
+ }
283
+ catch (err) {
284
+ // File not found or parse error
285
+ return null;
286
+ }
287
+ }
288
+ /**
289
+ * List all session metadata.
290
+ *
291
+ * @param limit - Maximum number of sessions to return (null/undefined = all)
292
+ * @returns List of session metadata, sorted by most recent first
293
+ */
294
+ async listSessions(limit) {
295
+ try {
296
+ const files = await fs.readdir(this.sessionsDir);
297
+ // Get file stats for sorting by modification time
298
+ const fileStats = [];
299
+ for (const file of files) {
300
+ if (!file.endsWith('.json'))
301
+ continue;
302
+ try {
303
+ const filePath = path.join(this.sessionsDir, file);
304
+ const stats = await fs.stat(filePath);
305
+ fileStats.push({
306
+ file,
307
+ mtime: stats.mtimeMs
308
+ });
309
+ }
310
+ catch {
311
+ continue;
312
+ }
313
+ }
314
+ // Sort by modification time (most recent first)
315
+ fileStats.sort((a, b) => b.mtime - a.mtime);
316
+ // Apply limit if specified
317
+ const limitedFiles = (limit && limit > 0)
318
+ ? fileStats.slice(0, limit)
319
+ : fileStats;
320
+ const sessions = [];
321
+ for (const { file } of limitedFiles) {
322
+ try {
323
+ const filePath = path.join(this.sessionsDir, file);
324
+ const content = await fs.readFile(filePath, 'utf-8');
325
+ const data = JSON.parse(content);
326
+ sessions.push({
327
+ id: data.session_id || file.replace('.json', ''),
328
+ context_id: data.context_id,
329
+ agent_type: data.agent_type,
330
+ user: data.user,
331
+ workspace: data.workspace,
332
+ created_at: data.created_at,
333
+ last_updated: data.last_updated,
334
+ interaction_count: data.session?.interaction_count || 0
335
+ });
336
+ }
337
+ catch {
338
+ // Skip files that can't be parsed
339
+ continue;
340
+ }
341
+ }
342
+ return sessions;
343
+ }
344
+ catch (err) {
345
+ console.warn(`Warning: Failed to list sessions: ${err}`);
346
+ return [];
347
+ }
348
+ }
349
+ /**
350
+ * Clean up old sessions, keeping only the most recent N.
351
+ *
352
+ * @param keepRecent - Number of recent sessions to keep (default: 50)
353
+ * @returns Number of sessions deleted
354
+ */
355
+ async cleanupSessions(keepRecent = 50) {
356
+ try {
357
+ const files = await fs.readdir(this.sessionsDir);
358
+ // Get all session files with modification times
359
+ const fileStats = [];
360
+ for (const file of files) {
361
+ if (!file.endsWith('.json'))
362
+ continue;
363
+ try {
364
+ const filePath = path.join(this.sessionsDir, file);
365
+ const stats = await fs.stat(filePath);
366
+ fileStats.push({
367
+ file,
368
+ mtime: stats.mtimeMs
369
+ });
370
+ }
371
+ catch {
372
+ continue;
373
+ }
374
+ }
375
+ // Sort by modification time (most recent first)
376
+ fileStats.sort((a, b) => b.mtime - a.mtime);
377
+ // Remove sessions beyond keepRecent
378
+ let deletedCount = 0;
379
+ const toDelete = fileStats.slice(keepRecent);
380
+ for (const { file } of toDelete) {
381
+ try {
382
+ const sessionFile = path.join(this.sessionsDir, file);
383
+ await fs.unlink(sessionFile);
384
+ deletedCount++;
385
+ }
386
+ catch {
387
+ // Continue even if deletion fails
388
+ continue;
389
+ }
390
+ }
391
+ return deletedCount;
392
+ }
393
+ catch (err) {
394
+ console.warn(`Warning: Failed to cleanup sessions: ${err}`);
395
+ return 0;
396
+ }
397
+ }
398
+ }
399
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Schema Validation - JSON schema validation for OCP context objects.
3
+ *
4
+ * Validates agent contexts against the OCP specification schemas.
5
+ */
6
+ import { AgentContext } from './context.js';
7
+ export declare const OCP_CONTEXT_SCHEMA: {
8
+ $schema: string;
9
+ $id: string;
10
+ title: string;
11
+ description: string;
12
+ type: string;
13
+ required: string[];
14
+ properties: {
15
+ context_id: {
16
+ type: string;
17
+ pattern: string;
18
+ description: string;
19
+ };
20
+ agent_type: {
21
+ type: string;
22
+ description: string;
23
+ };
24
+ user: {
25
+ type: string[];
26
+ description: string;
27
+ };
28
+ workspace: {
29
+ type: string[];
30
+ description: string;
31
+ };
32
+ current_file: {
33
+ type: string[];
34
+ description: string;
35
+ };
36
+ current_goal: {
37
+ type: string[];
38
+ description: string;
39
+ };
40
+ context_summary: {
41
+ type: string[];
42
+ description: string;
43
+ };
44
+ error_context: {
45
+ type: string[];
46
+ description: string;
47
+ };
48
+ recent_changes: {
49
+ type: string;
50
+ items: {
51
+ type: string;
52
+ };
53
+ maxItems: number;
54
+ description: string;
55
+ default: never[];
56
+ };
57
+ session: {
58
+ type: string;
59
+ description: string;
60
+ properties: {
61
+ start_time: {
62
+ type: string;
63
+ format: string;
64
+ description: string;
65
+ };
66
+ interaction_count: {
67
+ type: string;
68
+ minimum: number;
69
+ default: number;
70
+ description: string;
71
+ };
72
+ agent_type: {
73
+ type: string;
74
+ description: string;
75
+ };
76
+ };
77
+ required: string[];
78
+ additionalProperties: boolean;
79
+ default: {};
80
+ };
81
+ history: {
82
+ type: string;
83
+ description: string;
84
+ items: {
85
+ type: string;
86
+ properties: {
87
+ timestamp: {
88
+ type: string;
89
+ format: string;
90
+ description: string;
91
+ };
92
+ action: {
93
+ type: string;
94
+ description: string;
95
+ };
96
+ api_endpoint: {
97
+ type: string[];
98
+ description: string;
99
+ };
100
+ result: {
101
+ type: string[];
102
+ description: string;
103
+ };
104
+ metadata: {
105
+ type: string;
106
+ default: {};
107
+ description: string;
108
+ };
109
+ };
110
+ required: string[];
111
+ additionalProperties: boolean;
112
+ };
113
+ default: never[];
114
+ };
115
+ api_specs: {
116
+ type: string;
117
+ patternProperties: {
118
+ "^[a-zA-Z0-9_-]+$": {
119
+ type: string;
120
+ format: string;
121
+ };
122
+ };
123
+ description: string;
124
+ default: {};
125
+ additionalProperties: boolean;
126
+ };
127
+ created_at: {
128
+ type: string;
129
+ format: string;
130
+ description: string;
131
+ };
132
+ last_updated: {
133
+ type: string;
134
+ format: string;
135
+ description: string;
136
+ };
137
+ };
138
+ additionalProperties: boolean;
139
+ };
140
+ /**
141
+ * Result of schema validation.
142
+ *
143
+ * Provides validation status and error details for OCP context validation.
144
+ * Supports boolean conversion for simple valid/invalid checks.
145
+ */
146
+ export declare class ValidationResult {
147
+ valid: boolean;
148
+ errors: string[];
149
+ constructor(valid: boolean, errors?: string[]);
150
+ valueOf(): boolean;
151
+ toString(): string;
152
+ }
153
+ /**
154
+ * Validate an AgentContext against the OCP schema
155
+ */
156
+ export declare function validateContext(context: AgentContext): ValidationResult;
157
+ /**
158
+ * Validate a context dictionary against the OCP schema
159
+ */
160
+ export declare function validateContextDict(contextDict: Record<string, any>): ValidationResult;
161
+ /**
162
+ * Get the OCP context JSON schema
163
+ */
164
+ export declare function getSchema(): Record<string, any>;
165
+ /**
166
+ * Validate and attempt to fix a context object
167
+ */
168
+ export declare function validateAndFixContext(context: AgentContext): [AgentContext, ValidationResult];
169
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/validation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAI5C,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAmB,CAAC;AAKnD;;;;;GAKG;AACH,qBAAa,gBAAgB;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;gBAEZ,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE;IAK7C,OAAO,IAAI,OAAO;IAIlB,QAAQ,IAAI,MAAM;CAMnB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,gBAAgB,CAOvE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,gBAAgB,CAatF;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAE/C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,GAAG,CAAC,YAAY,EAAE,gBAAgB,CAAC,CA0B7F"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Schema Validation - JSON schema validation for OCP context objects.
3
+ *
4
+ * Validates agent contexts against the OCP specification schemas.
5
+ */
6
+ import { Validator } from 'jsonschema';
7
+ import { AgentContext } from './context.js';
8
+ import ocpContextSchema from './schemas/ocp-context.json' with { type: 'json' };
9
+ // Load schema from braided specification file
10
+ export const OCP_CONTEXT_SCHEMA = ocpContextSchema;
11
+ // Create validator instance
12
+ const validator = new Validator();
13
+ /**
14
+ * Result of schema validation.
15
+ *
16
+ * Provides validation status and error details for OCP context validation.
17
+ * Supports boolean conversion for simple valid/invalid checks.
18
+ */
19
+ export class ValidationResult {
20
+ constructor(valid, errors) {
21
+ this.valid = valid;
22
+ this.errors = errors || [];
23
+ }
24
+ valueOf() {
25
+ return this.valid;
26
+ }
27
+ toString() {
28
+ if (this.valid) {
29
+ return 'Valid OCP context';
30
+ }
31
+ return `Invalid OCP context: ${this.errors.join('; ')}`;
32
+ }
33
+ }
34
+ /**
35
+ * Validate an AgentContext against the OCP schema
36
+ */
37
+ export function validateContext(context) {
38
+ try {
39
+ const contextDict = context.toDict();
40
+ return validateContextDict(contextDict);
41
+ }
42
+ catch (e) {
43
+ return new ValidationResult(false, [`Validation error: ${e}`]);
44
+ }
45
+ }
46
+ /**
47
+ * Validate a context dictionary against the OCP schema
48
+ */
49
+ export function validateContextDict(contextDict) {
50
+ try {
51
+ const result = validator.validate(contextDict, OCP_CONTEXT_SCHEMA);
52
+ if (result.valid) {
53
+ return new ValidationResult(true);
54
+ }
55
+ const errors = result.errors.map(err => err.toString());
56
+ return new ValidationResult(false, errors);
57
+ }
58
+ catch (e) {
59
+ return new ValidationResult(false, [`Validation error: ${e}`]);
60
+ }
61
+ }
62
+ /**
63
+ * Get the OCP context JSON schema
64
+ */
65
+ export function getSchema() {
66
+ return { ...OCP_CONTEXT_SCHEMA };
67
+ }
68
+ /**
69
+ * Validate and attempt to fix a context object
70
+ */
71
+ export function validateAndFixContext(context) {
72
+ // Make a copy to avoid modifying original
73
+ const fixed = AgentContext.fromDict(context.toDict());
74
+ // Fix common issues
75
+ if (!fixed.context_id.startsWith('ocp-')) {
76
+ fixed.context_id = `ocp-${fixed.context_id}`;
77
+ }
78
+ // Ensure required collections exist
79
+ if (typeof fixed.session !== 'object' || fixed.session === null) {
80
+ fixed.session = {};
81
+ }
82
+ if (!Array.isArray(fixed.history)) {
83
+ fixed.history = [];
84
+ }
85
+ if (typeof fixed.api_specs !== 'object' || fixed.api_specs === null) {
86
+ fixed.api_specs = {};
87
+ }
88
+ // Validate the fixed context
89
+ const result = validateContext(fixed);
90
+ return [fixed, result];
91
+ }
92
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/validation.ts"],"names":[],"mappings":"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"}