@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,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":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,IAAI,CAAC;AAC7B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,UAAU;IAKnB;;;;OAIG;IACH,YAAY,QAAiB;QACzB,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;QAC5D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAExD,kDAAkD;QAClD,IAAI,CAAC,cAAc,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACK,cAAc;QAClB,IAAI,CAAC;YACD,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,iCAAiC;YACjC,OAAO,CAAC,IAAI,CAAC,kDAAkD,GAAG,EAAE,CAAC,CAAC;QAC1E,CAAC;IACL,CAAC;IAED,wDAAwD;IAExD;;;;;;;OAOG;IACH,KAAK,CAAC,QAAQ,CACV,IAAY,EACZ,IAAgB,EAChB,QAA8B;QAE9B,IAAI,CAAC;YACD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;YAE3D,MAAM,SAAS,GAAwB;gBACnC,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,SAAS;gBACrC,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAa,EAAE,EAAE,CAAC,CAAC;oBACtC,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,eAAe,EAAE,IAAI,CAAC,eAAe;oBACrC,YAAY,EAAE,IAAI,CAAC,YAAY;oBAC/B,IAAI,EAAE,IAAI,CAAC,IAAI;iBAClB,CAAC,CAAC;aACN,CAAC;YAEF,6BAA6B;YAC7B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACnB,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;YAC7C,CAAC;YAED,qCAAqC;YACrC,IAAI,QAAQ,EAAE,CAAC;gBACX,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YACvC,CAAC;YAED,MAAM,EAAE,CAAC,SAAS,CACd,SAAS,EACT,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,EAClC,OAAO,CACV,CAAC;YAEF,OAAO,IAAI,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,iCAAiC,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC;YAC/D,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,YAAY,CACd,IAAY,EACZ,UAA0B;QAE1B,IAAI,CAAC;YACD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;YAC3D,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEjC,wCAAwC;YACxC,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACpE,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC1C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACjD,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;gBAE9C,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;oBACvB,OAAO,IAAI,CAAC,CAAC,UAAU;gBAC3B,CAAC;YACL,CAAC;YAED,yBAAyB;YACzB,MAAM,IAAI,GAAe;gBACrB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;gBACnC,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,CAAC;oBAClC,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,eAAe,EAAE,IAAI,CAAC,eAAe;oBACrC,YAAY,EAAE,IAAI,CAAC,YAAY;oBAC/B,IAAI,EAAE,IAAI,CAAC,IAAI;iBAClB,CAAC,CAAC;aACN,CAAC;YAEF,OAAO,IAAI,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,gCAAgC;YAChC,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,WAAW,CAAC,KAAa;QAC3B,IAAI,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,OAAO,GAA+B,EAAE,CAAC;YAC/C,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;oBAAE,SAAS;gBAEtC,IAAI,CAAC;oBACD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;oBAChD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBACrD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAEjC,4DAA4D;oBAC5D,MAAM,UAAU,GAAG;wBACf,IAAI,CAAC,QAAQ,IAAI,EAAE;wBACnB,IAAI,CAAC,KAAK,IAAI,EAAE;wBAChB,IAAI,CAAC,WAAW,IAAI,EAAE;wBACtB,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC;qBAC7D,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;oBAE1B,IAAI,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;wBAClC,OAAO,CAAC,IAAI,CAAC;4BACT,IAAI,EAAE,IAAI,CAAC,QAAQ;4BACnB,KAAK,EAAE,IAAI,CAAC,KAAK;4BACjB,OAAO,EAAE,IAAI,CAAC,OAAO;4BACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;4BACvB,SAAS,EAAE,IAAI,CAAC,SAAS;4BACzB,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;yBACtC,CAAC,CAAC;oBACP,CAAC;gBACL,CAAC;gBAAC,MAAM,CAAC;oBACL,kCAAkC;oBAClC,SAAS;gBACb,CAAC;YACL,CAAC;YAED,OAAO,OAAO,CAAC;QACnB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,oCAAoC,GAAG,EAAE,CAAC,CAAC;YACxD,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,cAAc;QAChB,IAAI,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC9C,OAAO,KAAK;iBACP,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;iBAChC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,wCAAwC,GAAG,EAAE,CAAC,CAAC;YAC5D,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,UAAU,CAAC,IAAa;QAC1B,IAAI,CAAC;YACD,IAAI,IAAI,EAAE,CAAC;gBACP,qBAAqB;gBACrB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;gBAC3D,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACJ,iBAAiB;gBACjB,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACvB,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;wBACzB,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;oBACpD,CAAC;gBACL,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,mCAAmC,GAAG,EAAE,CAAC,CAAC;YACvD,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED,gEAAgE;IAEhE;;;;;;OAMG;IACH,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,OAAqB;QACtD,IAAI,CAAC;YACD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,SAAS,OAAO,CAAC,CAAC;YAErE,iDAAiD;YACjD,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACpC,WAAmB,CAAC,UAAU,GAAG,SAAS,CAAC;YAE5C,MAAM,EAAE,CAAC,SAAS,CACd,WAAW,EACX,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EACpC,OAAO,CACV,CAAC;YAEF,OAAO,IAAI,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,oCAAoC,SAAS,MAAM,GAAG,EAAE,CAAC,CAAC;YACvE,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,WAAW,CAAC,SAAiB;QAC/B,IAAI,CAAC;YACD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,SAAS,OAAO,CAAC,CAAC;YACrE,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACxD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEjC,kDAAkD;YAClD,OAAO,IAAI,CAAC,UAAU,CAAC;YAEvB,OAAO,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,gCAAgC;YAChC,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAAC,KAAqB;QACpC,IAAI,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAEjD,kDAAkD;YAClD,MAAM,SAAS,GAA2C,EAAE,CAAC;YAE7D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;oBAAE,SAAS;gBAEtC,IAAI,CAAC;oBACD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;oBACnD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACtC,SAAS,CAAC,IAAI,CAAC;wBACX,IAAI;wBACJ,KAAK,EAAE,KAAK,CAAC,OAAO;qBACvB,CAAC,CAAC;gBACP,CAAC;gBAAC,MAAM,CAAC;oBACL,SAAS;gBACb,CAAC;YACL,CAAC;YAED,gDAAgD;YAChD,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YAE5C,2BAA2B;YAC3B,MAAM,YAAY,GAAG,CAAC,KAAK,IAAI,KAAK,GAAG,CAAC,CAAC;gBACrC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;gBAC3B,CAAC,CAAC,SAAS,CAAC;YAEhB,MAAM,QAAQ,GAA+B,EAAE,CAAC;YAEhD,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,YAAY,EAAE,CAAC;gBAClC,IAAI,CAAC;oBACD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;oBACnD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBACrD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAEjC,QAAQ,CAAC,IAAI,CAAC;wBACV,EAAE,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;wBAChD,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,SAAS,EAAE,IAAI,CAAC,SAAS;wBACzB,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;wBAC/B,iBAAiB,EAAE,IAAI,CAAC,OAAO,EAAE,iBAAiB,IAAI,CAAC;qBAC1D,CAAC,CAAC;gBACP,CAAC;gBAAC,MAAM,CAAC;oBACL,kCAAkC;oBAClC,SAAS;gBACb,CAAC;YACL,CAAC;YAED,OAAO,QAAQ,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,qCAAqC,GAAG,EAAE,CAAC,CAAC;YACzD,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,eAAe,CAAC,aAAqB,EAAE;QACzC,IAAI,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAEjD,gDAAgD;YAChD,MAAM,SAAS,GAA2C,EAAE,CAAC;YAE7D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;oBAAE,SAAS;gBAEtC,IAAI,CAAC;oBACD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;oBACnD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACtC,SAAS,CAAC,IAAI,CAAC;wBACX,IAAI;wBACJ,KAAK,EAAE,KAAK,CAAC,OAAO;qBACvB,CAAC,CAAC;gBACP,CAAC;gBAAC,MAAM,CAAC;oBACL,SAAS;gBACb,CAAC;YACL,CAAC;YAED,gDAAgD;YAChD,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YAE5C,oCAAoC;YACpC,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAE7C,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC9B,IAAI,CAAC;oBACD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;oBACtD,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;oBAC7B,YAAY,EAAE,CAAC;gBACnB,CAAC;gBAAC,MAAM,CAAC;oBACL,kCAAkC;oBAClC,SAAS;gBACb,CAAC;YACL,CAAC;YAED,OAAO,YAAY,CAAC;QACxB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,wCAAwC,GAAG,EAAE,CAAC,CAAC;YAC5D,OAAO,CAAC,CAAC;QACb,CAAC;IACL,CAAC;CACJ"}
|
|
@@ -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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"}
|