@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,238 @@
1
+ /**
2
+ * OCP Headers - HTTP header management for Open Context Protocol.
3
+ *
4
+ * Handles encoding/decoding agent context into HTTP headers and validation.
5
+ */
6
+ import { gzipSync, gunzipSync } from 'zlib';
7
+ import { AgentContext } from './context.js';
8
+ // OCP Header names
9
+ export const OCP_CONTEXT_ID = 'OCP-Context-ID';
10
+ export const OCP_SESSION = 'OCP-Session';
11
+ export const OCP_CURRENT_GOAL = 'OCP-Current-Goal';
12
+ export const OCP_AGENT_TYPE = 'OCP-Agent-Type';
13
+ export const OCP_USER = 'OCP-User';
14
+ export const OCP_WORKSPACE = 'OCP-Workspace';
15
+ export const OCP_VERSION = 'OCP-Version';
16
+ // Current OCP specification version
17
+ export const OCP_SPEC_VERSION = '1.0';
18
+ /**
19
+ * Manages OCP HTTP headers for agent context transmission.
20
+ *
21
+ * Handles encoding agent context into HTTP headers and decoding
22
+ * received headers back into context objects.
23
+ */
24
+ export class OCPHeaders {
25
+ /**
26
+ * Encode AgentContext into OCP HTTP headers
27
+ */
28
+ static encodeContext(context, compress = true) {
29
+ const headers = {
30
+ [OCP_CONTEXT_ID]: context.context_id,
31
+ [OCP_AGENT_TYPE]: context.agent_type,
32
+ [OCP_VERSION]: OCP_SPEC_VERSION,
33
+ };
34
+ // Add optional headers if present
35
+ if (context.current_goal) {
36
+ headers[OCP_CURRENT_GOAL] = context.current_goal;
37
+ }
38
+ if (context.user) {
39
+ headers[OCP_USER] = context.user;
40
+ }
41
+ if (context.workspace) {
42
+ headers[OCP_WORKSPACE] = context.workspace;
43
+ }
44
+ // Encode session data
45
+ const sessionData = context.toDict();
46
+ const sessionJson = JSON.stringify(sessionData);
47
+ if (compress && sessionJson.length > 1000) {
48
+ // Compress large session data
49
+ const compressed = gzipSync(Buffer.from(sessionJson, 'utf-8'));
50
+ const encoded = compressed.toString('base64');
51
+ headers[OCP_SESSION] = `gzip:${encoded}`;
52
+ }
53
+ else {
54
+ // Base64 encode without compression
55
+ const encoded = Buffer.from(sessionJson, 'utf-8').toString('base64');
56
+ headers[OCP_SESSION] = encoded;
57
+ }
58
+ return headers;
59
+ }
60
+ /**
61
+ * Decode OCP headers back into an AgentContext object
62
+ */
63
+ static decodeContext(headers) {
64
+ // Normalize header names (case-insensitive lookup)
65
+ const normalizedHeaders = {};
66
+ for (const [key, value] of Object.entries(headers)) {
67
+ normalizedHeaders[key.toLowerCase()] = value;
68
+ }
69
+ const contextId = normalizedHeaders[OCP_CONTEXT_ID.toLowerCase()];
70
+ const sessionData = normalizedHeaders[OCP_SESSION.toLowerCase()];
71
+ if (!contextId || !sessionData) {
72
+ return null;
73
+ }
74
+ try {
75
+ let sessionJson;
76
+ // Decode session data
77
+ if (sessionData.startsWith('gzip:')) {
78
+ // Decompress gzipped data
79
+ const encodedData = sessionData.slice(5); // Remove "gzip:" prefix
80
+ const compressed = Buffer.from(encodedData, 'base64');
81
+ sessionJson = gunzipSync(compressed).toString('utf-8');
82
+ }
83
+ else {
84
+ // Base64 decode
85
+ sessionJson = Buffer.from(sessionData, 'base64').toString('utf-8');
86
+ }
87
+ // Parse context data
88
+ const contextData = JSON.parse(sessionJson);
89
+ return AgentContext.fromDict(contextData);
90
+ }
91
+ catch (e) {
92
+ return null;
93
+ }
94
+ }
95
+ /**
96
+ * Validate that headers contain valid OCP context
97
+ */
98
+ static validateHeaders(headers) {
99
+ const normalizedHeaders = {};
100
+ for (const [key, value] of Object.entries(headers)) {
101
+ normalizedHeaders[key.toLowerCase()] = value;
102
+ }
103
+ // Check required headers
104
+ const required = [OCP_CONTEXT_ID.toLowerCase(), OCP_SESSION.toLowerCase()];
105
+ if (!required.every(header => header in normalizedHeaders)) {
106
+ return false;
107
+ }
108
+ // Validate context can be decoded
109
+ const context = OCPHeaders.decodeContext(headers);
110
+ return context !== null;
111
+ }
112
+ /**
113
+ * Get a human-readable summary of the OCP context from headers
114
+ */
115
+ static getContextSummary(headers) {
116
+ const normalizedHeaders = {};
117
+ for (const [key, value] of Object.entries(headers)) {
118
+ normalizedHeaders[key.toLowerCase()] = value;
119
+ }
120
+ const contextId = normalizedHeaders[OCP_CONTEXT_ID.toLowerCase()] || 'unknown';
121
+ const agentType = normalizedHeaders[OCP_AGENT_TYPE.toLowerCase()] || 'unknown';
122
+ const goal = normalizedHeaders[OCP_CURRENT_GOAL.toLowerCase()] || 'none';
123
+ const user = normalizedHeaders[OCP_USER.toLowerCase()] || 'unknown';
124
+ const workspace = normalizedHeaders[OCP_WORKSPACE.toLowerCase()] || 'unknown';
125
+ return `OCP Context: ${contextId} | Agent: ${agentType} | Goal: ${goal} | Workspace: ${workspace}`;
126
+ }
127
+ /**
128
+ * Merge OCP headers with existing HTTP headers
129
+ */
130
+ static mergeHeaders(baseHeaders, ocpHeaders) {
131
+ return { ...baseHeaders, ...ocpHeaders };
132
+ }
133
+ /**
134
+ * Remove OCP headers from a headers dictionary
135
+ */
136
+ static stripOCPHeaders(headers) {
137
+ const ocpHeaderNames = new Set([
138
+ OCP_CONTEXT_ID.toLowerCase(),
139
+ OCP_SESSION.toLowerCase(),
140
+ OCP_CURRENT_GOAL.toLowerCase(),
141
+ OCP_AGENT_TYPE.toLowerCase(),
142
+ OCP_USER.toLowerCase(),
143
+ OCP_WORKSPACE.toLowerCase(),
144
+ OCP_VERSION.toLowerCase(),
145
+ ]);
146
+ const result = {};
147
+ for (const [key, value] of Object.entries(headers)) {
148
+ if (!ocpHeaderNames.has(key.toLowerCase())) {
149
+ result[key] = value;
150
+ }
151
+ }
152
+ return result;
153
+ }
154
+ }
155
+ /**
156
+ * Convenience function to create OCP headers from context
157
+ */
158
+ export function createOCPHeaders(context, baseHeaders, compress = true) {
159
+ const ocpHeaders = OCPHeaders.encodeContext(context, compress);
160
+ if (baseHeaders) {
161
+ return OCPHeaders.mergeHeaders(baseHeaders, ocpHeaders);
162
+ }
163
+ return ocpHeaders;
164
+ }
165
+ /**
166
+ * Extract OCP context from an HTTP response object
167
+ */
168
+ export function extractContextFromResponse(response) {
169
+ if (!response || !response.headers) {
170
+ return null;
171
+ }
172
+ // Convert headers to dict (handle different response types)
173
+ let headersDict;
174
+ if (typeof response.headers.entries === 'function') {
175
+ headersDict = {};
176
+ for (const [key, value] of response.headers.entries()) {
177
+ headersDict[key] = value;
178
+ }
179
+ }
180
+ else if (typeof response.headers.items === 'function') {
181
+ headersDict = Object.fromEntries(response.headers.items());
182
+ }
183
+ else {
184
+ headersDict = response.headers;
185
+ }
186
+ return OCPHeaders.decodeContext(headersDict);
187
+ }
188
+ /**
189
+ * Convenience function to parse OCP context from HTTP headers
190
+ */
191
+ export function parseContext(headers) {
192
+ // Convert headers to dict (handle different header types)
193
+ let headersDict;
194
+ if (headers instanceof Headers) {
195
+ headersDict = {};
196
+ headers.forEach((value, key) => {
197
+ headersDict[key] = value;
198
+ });
199
+ }
200
+ else if (typeof headers.entries === 'function') {
201
+ headersDict = Object.fromEntries(headers.entries());
202
+ }
203
+ else if (typeof headers.items === 'function') {
204
+ headersDict = Object.fromEntries(headers.items());
205
+ }
206
+ else {
207
+ headersDict = headers;
208
+ }
209
+ return OCPHeaders.decodeContext(headersDict);
210
+ }
211
+ /**
212
+ * Convenience function to add OCP headers to HTTP response objects
213
+ */
214
+ export function addContextHeaders(response, context, compress = true) {
215
+ const ocpHeaders = createOCPHeaders(context, undefined, compress);
216
+ // Handle different response types
217
+ if (response.headers && typeof response.headers.set === 'function') {
218
+ // Headers object (fetch API)
219
+ for (const [key, value] of Object.entries(ocpHeaders)) {
220
+ response.headers.set(key, value);
221
+ }
222
+ }
223
+ else if (response.headers && typeof response.headers === 'object') {
224
+ // Plain object
225
+ Object.assign(response.headers, ocpHeaders);
226
+ }
227
+ else if (typeof response.setHeader === 'function') {
228
+ // Node.js response
229
+ for (const [key, value] of Object.entries(ocpHeaders)) {
230
+ response.setHeader(key, value);
231
+ }
232
+ }
233
+ else {
234
+ throw new TypeError(`Unsupported response type: ${typeof response}. ` +
235
+ `Response must have a 'headers' attribute that supports item assignment.`);
236
+ }
237
+ }
238
+ //# sourceMappingURL=headers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headers.js","sourceRoot":"","sources":["../../src/headers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * OCP HTTP Client
3
+ *
4
+ * HTTP client wrapper that automatically injects OCP context headers.
5
+ */
6
+ import { AgentContext } from './context.js';
7
+ /**
8
+ * HTTP request options
9
+ */
10
+ interface RequestOptions {
11
+ params?: Record<string, string | number | boolean>;
12
+ json?: any;
13
+ headers?: Record<string, string>;
14
+ timeout?: number;
15
+ }
16
+ /**
17
+ * HTTP response wrapper
18
+ */
19
+ export interface OCPResponse {
20
+ status: number;
21
+ statusText: string;
22
+ ok: boolean;
23
+ headers: Headers;
24
+ data: any;
25
+ text: string;
26
+ json: () => Promise<any>;
27
+ }
28
+ /**
29
+ * OCP HTTP Client
30
+ *
31
+ * Wraps HTTP requests to automatically inject OCP context headers
32
+ * and log interactions.
33
+ */
34
+ export declare class OCPHTTPClient {
35
+ private context;
36
+ private autoUpdateContext;
37
+ private baseUrl?;
38
+ constructor(context: AgentContext, autoUpdateContext?: boolean, baseUrl?: string);
39
+ /**
40
+ * Prepare headers with OCP context.
41
+ */
42
+ private _prepareHeaders;
43
+ /**
44
+ * Log API interaction to context.
45
+ */
46
+ private _logInteraction;
47
+ /**
48
+ * Make HTTP request.
49
+ */
50
+ request(method: string, url: string, options?: RequestOptions): Promise<OCPResponse>;
51
+ /**
52
+ * GET request.
53
+ */
54
+ get(url: string, options?: RequestOptions): Promise<OCPResponse>;
55
+ /**
56
+ * POST request.
57
+ */
58
+ post(url: string, options?: RequestOptions): Promise<OCPResponse>;
59
+ /**
60
+ * PUT request.
61
+ */
62
+ put(url: string, options?: RequestOptions): Promise<OCPResponse>;
63
+ /**
64
+ * DELETE request.
65
+ */
66
+ delete(url: string, options?: RequestOptions): Promise<OCPResponse>;
67
+ /**
68
+ * PATCH request.
69
+ */
70
+ patch(url: string, options?: RequestOptions): Promise<OCPResponse>;
71
+ }
72
+ /**
73
+ * Create API-specific HTTP client (internal use only).
74
+ *
75
+ * @param baseUrl - API base URL
76
+ * @param context - Agent context
77
+ * @param headers - Optional headers to include in all requests
78
+ * @returns Configured HTTP client
79
+ */
80
+ export declare function _wrapApi(baseUrl: string, context: AgentContext, headers?: Record<string, string>): OCPHTTPClient;
81
+ export {};
82
+ //# sourceMappingURL=http_client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http_client.d.ts","sourceRoot":"","sources":["../../src/http_client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C;;GAEG;AACH,UAAU,cAAc;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,GAAG,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;CAC5B;AAED;;;;;GAKG;AACH,qBAAa,aAAa;IACtB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,iBAAiB,CAAU;IACnC,OAAO,CAAC,OAAO,CAAC,CAAS;gBAEb,OAAO,EAAE,YAAY,EAAE,iBAAiB,GAAE,OAAc,EAAE,OAAO,CAAC,EAAE,MAAM;IAMtF;;OAEG;IACH,OAAO,CAAC,eAAe;IASvB;;OAEG;IACH,OAAO,CAAC,eAAe;IA4CvB;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,WAAW,CAAC;IA2E9F;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,WAAW,CAAC;IAI1E;;OAEG;IACG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,WAAW,CAAC;IAI3E;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,WAAW,CAAC;IAI1E;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,WAAW,CAAC;IAI7E;;OAEG;IACG,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,WAAW,CAAC;CAG/E;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,aAAa,CAchH"}
@@ -0,0 +1,181 @@
1
+ /**
2
+ * OCP HTTP Client
3
+ *
4
+ * HTTP client wrapper that automatically injects OCP context headers.
5
+ */
6
+ import { createOCPHeaders } from './headers.js';
7
+ /**
8
+ * OCP HTTP Client
9
+ *
10
+ * Wraps HTTP requests to automatically inject OCP context headers
11
+ * and log interactions.
12
+ */
13
+ export class OCPHTTPClient {
14
+ constructor(context, autoUpdateContext = true, baseUrl) {
15
+ this.context = context;
16
+ this.autoUpdateContext = autoUpdateContext;
17
+ this.baseUrl = baseUrl?.replace(/\/$/, ''); // Remove trailing slash
18
+ }
19
+ /**
20
+ * Prepare headers with OCP context.
21
+ */
22
+ _prepareHeaders(additionalHeaders) {
23
+ const ocpHeaders = createOCPHeaders(this.context);
24
+ return {
25
+ ...ocpHeaders,
26
+ ...additionalHeaders
27
+ };
28
+ }
29
+ /**
30
+ * Log API interaction to context.
31
+ */
32
+ _logInteraction(method, url, response, error) {
33
+ if (!this.autoUpdateContext) {
34
+ return;
35
+ }
36
+ // Parse API endpoint
37
+ const parsedUrl = new URL(url);
38
+ const endpoint = `${method.toUpperCase()} ${parsedUrl.pathname}`;
39
+ // Get status code from response
40
+ const statusCode = response?.status;
41
+ // Determine result string
42
+ let result;
43
+ if (error) {
44
+ result = `Error: ${error.message}`;
45
+ }
46
+ else if (statusCode !== undefined) {
47
+ result = `HTTP ${statusCode}`;
48
+ }
49
+ // Build interaction metadata
50
+ const metadata = {
51
+ method: method.toUpperCase(),
52
+ url: url,
53
+ domain: parsedUrl.hostname,
54
+ success: !error && statusCode ? statusCode >= 200 && statusCode < 300 : false,
55
+ };
56
+ if (statusCode !== undefined) {
57
+ metadata.status_code = statusCode;
58
+ }
59
+ if (error) {
60
+ metadata.error = error.message;
61
+ }
62
+ this.context.addInteraction(`api_call_${method.toLowerCase()}`, endpoint, result, metadata);
63
+ }
64
+ /**
65
+ * Make HTTP request.
66
+ */
67
+ async request(method, url, options = {}) {
68
+ const { params, json, headers, timeout = 30000 } = options;
69
+ // Handle base URL for relative URLs
70
+ let finalUrl;
71
+ if (this.baseUrl && !url.startsWith('http://') && !url.startsWith('https://')) {
72
+ finalUrl = new URL(`${this.baseUrl}${url}`);
73
+ }
74
+ else {
75
+ finalUrl = new URL(url);
76
+ }
77
+ // Add query parameters
78
+ if (params) {
79
+ for (const [key, value] of Object.entries(params)) {
80
+ finalUrl.searchParams.append(key, String(value));
81
+ }
82
+ }
83
+ // Prepare headers
84
+ const finalHeaders = this._prepareHeaders(headers);
85
+ // Add content-type for JSON
86
+ if (json !== undefined) {
87
+ finalHeaders['Content-Type'] = 'application/json';
88
+ }
89
+ // Create abort controller for timeout
90
+ const controller = new AbortController();
91
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
92
+ try {
93
+ const response = await fetch(finalUrl.toString(), {
94
+ method: method.toUpperCase(),
95
+ headers: finalHeaders,
96
+ body: json !== undefined ? JSON.stringify(json) : undefined,
97
+ signal: controller.signal
98
+ });
99
+ clearTimeout(timeoutId);
100
+ // Read response text
101
+ const text = await response.text();
102
+ // Parse JSON if possible
103
+ let data;
104
+ try {
105
+ data = JSON.parse(text);
106
+ }
107
+ catch {
108
+ data = text;
109
+ }
110
+ const ocpResponse = {
111
+ status: response.status,
112
+ statusText: response.statusText,
113
+ ok: response.ok,
114
+ headers: response.headers,
115
+ data,
116
+ text,
117
+ json: async () => JSON.parse(text)
118
+ };
119
+ this._logInteraction(method, finalUrl.toString(), ocpResponse);
120
+ return ocpResponse;
121
+ }
122
+ catch (error) {
123
+ clearTimeout(timeoutId);
124
+ const err = error instanceof Error ? error : new Error(String(error));
125
+ this._logInteraction(method, finalUrl.toString(), undefined, err);
126
+ throw err;
127
+ }
128
+ }
129
+ /**
130
+ * GET request.
131
+ */
132
+ async get(url, options = {}) {
133
+ return this.request('GET', url, options);
134
+ }
135
+ /**
136
+ * POST request.
137
+ */
138
+ async post(url, options = {}) {
139
+ return this.request('POST', url, options);
140
+ }
141
+ /**
142
+ * PUT request.
143
+ */
144
+ async put(url, options = {}) {
145
+ return this.request('PUT', url, options);
146
+ }
147
+ /**
148
+ * DELETE request.
149
+ */
150
+ async delete(url, options = {}) {
151
+ return this.request('DELETE', url, options);
152
+ }
153
+ /**
154
+ * PATCH request.
155
+ */
156
+ async patch(url, options = {}) {
157
+ return this.request('PATCH', url, options);
158
+ }
159
+ }
160
+ /**
161
+ * Create API-specific HTTP client (internal use only).
162
+ *
163
+ * @param baseUrl - API base URL
164
+ * @param context - Agent context
165
+ * @param headers - Optional headers to include in all requests
166
+ * @returns Configured HTTP client
167
+ */
168
+ export function _wrapApi(baseUrl, context, headers) {
169
+ const client = new OCPHTTPClient(context, true, baseUrl);
170
+ // Override request method to add additional headers if provided
171
+ if (headers) {
172
+ const originalRequest = client.request.bind(client);
173
+ client.request = (method, url, options = {}) => {
174
+ const opts = { ...options };
175
+ opts.headers = { ...headers, ...opts.headers };
176
+ return originalRequest(method, url, opts);
177
+ };
178
+ }
179
+ return client;
180
+ }
181
+ //# sourceMappingURL=http_client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http_client.js","sourceRoot":"","sources":["../../src/http_client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Open Context Protocol (OCP) - JavaScript/TypeScript Library
3
+ *
4
+ * A zero-infrastructure protocol that provides conversational context
5
+ * and automatic API discovery to enhance AI agent interactions.
6
+ *
7
+ * Enables persistent context sharing across HTTP API calls using standard headers,
8
+ * requiring no servers or infrastructure setup.
9
+ */
10
+ /**
11
+ * Open Context Protocol (OCP) - JavaScript/TypeScript Implementation
12
+ *
13
+ * Core library for implementing OCP context management in AI agents.
14
+ */
15
+ export { AgentContext, OCPContextDict } from './context.js';
16
+ export { OCPHeaders, OCP_CONTEXT_ID, OCP_SESSION, OCP_CURRENT_GOAL, OCP_AGENT_TYPE, OCP_USER, OCP_WORKSPACE, OCP_VERSION, OCP_SPEC_VERSION, createOCPHeaders, extractContextFromResponse, parseContext, addContextHeaders } from './headers.js';
17
+ export { ValidationResult, validateContext, validateContextDict, getSchema, validateAndFixContext } from './validation.js';
18
+ export { OCPError, RegistryUnavailable, APINotFound, SchemaDiscoveryError, ValidationError } from './errors.js';
19
+ export { OCPSchemaDiscovery, type OCPTool, type OCPAPISpec } from './schema_discovery.js';
20
+ export { OCPRegistry } from './registry.js';
21
+ export { OCPHTTPClient, type OCPResponse } from './http_client.js';
22
+ export { OCPAgent } from './agent.js';
23
+ export { OCPStorage } from './storage.js';
24
+ export declare const VERSION = "0.1.0";
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;GAIG;AAGH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG5D,OAAO,EACH,UAAU,EACV,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,0BAA0B,EAC1B,YAAY,EACZ,iBAAiB,EACpB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACH,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,SAAS,EACT,qBAAqB,EACxB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACH,QAAQ,EACR,mBAAmB,EACnB,WAAW,EACX,oBAAoB,EACpB,eAAe,EAClB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACH,kBAAkB,EAClB,KAAK,OAAO,EACZ,KAAK,UAAU,EAClB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,OAAO,EACH,aAAa,EACb,KAAK,WAAW,EACnB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,eAAO,MAAM,OAAO,UAAU,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Open Context Protocol (OCP) - JavaScript/TypeScript Library
3
+ *
4
+ * A zero-infrastructure protocol that provides conversational context
5
+ * and automatic API discovery to enhance AI agent interactions.
6
+ *
7
+ * Enables persistent context sharing across HTTP API calls using standard headers,
8
+ * requiring no servers or infrastructure setup.
9
+ */
10
+ /**
11
+ * Open Context Protocol (OCP) - JavaScript/TypeScript Implementation
12
+ *
13
+ * Core library for implementing OCP context management in AI agents.
14
+ */
15
+ // Core exports
16
+ export { AgentContext } from './context.js';
17
+ // Headers
18
+ export { OCPHeaders, OCP_CONTEXT_ID, OCP_SESSION, OCP_CURRENT_GOAL, OCP_AGENT_TYPE, OCP_USER, OCP_WORKSPACE, OCP_VERSION, OCP_SPEC_VERSION, createOCPHeaders, extractContextFromResponse, parseContext, addContextHeaders } from './headers.js';
19
+ // Validation
20
+ export { ValidationResult, validateContext, validateContextDict, getSchema, validateAndFixContext } from './validation.js';
21
+ // Errors
22
+ export { OCPError, RegistryUnavailable, APINotFound, SchemaDiscoveryError, ValidationError } from './errors.js';
23
+ // Schema Discovery
24
+ export { OCPSchemaDiscovery } from './schema_discovery.js';
25
+ // Registry
26
+ export { OCPRegistry } from './registry.js';
27
+ // HTTP Client
28
+ export { OCPHTTPClient } from './http_client.js';
29
+ // Agent
30
+ export { OCPAgent } from './agent.js';
31
+ // Storage
32
+ export { OCPStorage } from './storage.js';
33
+ // Version
34
+ export const VERSION = '0.1.0';
35
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;GAIG;AAEH,eAAe;AACf,OAAO,EAAE,YAAY,EAAkB,MAAM,cAAc,CAAC;AAE5D,UAAU;AACV,OAAO,EACH,UAAU,EACV,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,0BAA0B,EAC1B,YAAY,EACZ,iBAAiB,EACpB,MAAM,cAAc,CAAC;AAEtB,aAAa;AACb,OAAO,EACH,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,SAAS,EACT,qBAAqB,EACxB,MAAM,iBAAiB,CAAC;AAEzB,SAAS;AACT,OAAO,EACH,QAAQ,EACR,mBAAmB,EACnB,WAAW,EACX,oBAAoB,EACpB,eAAe,EAClB,MAAM,aAAa,CAAC;AAErB,mBAAmB;AACnB,OAAO,EACH,kBAAkB,EAGrB,MAAM,uBAAuB,CAAC;AAE/B,WAAW;AACX,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,cAAc;AACd,OAAO,EACH,aAAa,EAEhB,MAAM,kBAAkB,CAAC;AAE1B,QAAQ;AACR,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,UAAU;AACV,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,UAAU;AACV,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * OCP Registry Client
3
+ *
4
+ * Client for accessing pre-discovered API specifications from the OCP registry.
5
+ */
6
+ import { OCPAPISpec } from './schema_discovery.js';
7
+ /**
8
+ * OCP Registry Client
9
+ *
10
+ * Access pre-discovered API specifications from the OCP community registry.
11
+ */
12
+ export declare class OCPRegistry {
13
+ private registryUrl;
14
+ /**
15
+ * Initialize registry client.
16
+ *
17
+ * @param registryUrl - Registry URL (defaults to OCP_REGISTRY_URL env var or registry.ocp.dev)
18
+ */
19
+ constructor(registryUrl?: string);
20
+ /**
21
+ * Get API specification from registry.
22
+ *
23
+ * @param name - API name in registry
24
+ * @param baseUrl - Optional override for API base URL
25
+ * @returns API specification with tools
26
+ * @throws RegistryUnavailable if registry is unreachable
27
+ * @throws APINotFound if API is not found in registry
28
+ */
29
+ getApiSpec(name: string, baseUrl?: string): Promise<OCPAPISpec>;
30
+ /**
31
+ * Search for APIs in the registry.
32
+ *
33
+ * @param query - Search query string
34
+ * @returns List of API names matching query
35
+ */
36
+ searchApis(query: string): Promise<string[]>;
37
+ /**
38
+ * List all APIs in the registry.
39
+ *
40
+ * @returns List of API names
41
+ */
42
+ listApis(): Promise<string[]>;
43
+ /**
44
+ * Convert registry entry to API spec.
45
+ */
46
+ private _entryToSpec;
47
+ /**
48
+ * Get API name suggestions for error messages.
49
+ */
50
+ private _getSuggestions;
51
+ }
52
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAW,MAAM,uBAAuB,CAAC;AA8B5D;;;;GAIG;AACH,qBAAa,WAAW;IACpB,OAAO,CAAC,WAAW,CAAS;IAE5B;;;;OAIG;gBACS,WAAW,CAAC,EAAE,MAAM;IAShC;;;;;;;;OAQG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAwCrE;;;;;OAKG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAyBlD;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAmBnC;;OAEG;YACW,YAAY;IAiC1B;;OAEG;YACW,eAAe;CAgBhC"}