@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,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"}
|