@heddleagent/execution-host-client 6.2.0 → 6.4.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/README.md +75 -20
- package/dist/authority/index.d.ts +1 -1
- package/dist/authority/index.d.ts.map +1 -1
- package/dist/authority/index.js.map +1 -1
- package/dist/authority/types.d.ts +3 -1
- package/dist/authority/types.d.ts.map +1 -1
- package/dist/authority/types.js.map +1 -1
- package/dist/conversation/types.d.ts +2 -2
- package/dist/conversation/types.d.ts.map +1 -1
- package/dist/conversation/types.js.map +1 -1
- package/dist/coordinator/contracts.d.ts +130 -0
- package/dist/coordinator/contracts.d.ts.map +1 -0
- package/dist/coordinator/contracts.js +112 -0
- package/dist/coordinator/contracts.js.map +1 -0
- package/dist/coordinator/hosted-heartbeat-coordinator-client.d.ts +20 -0
- package/dist/coordinator/hosted-heartbeat-coordinator-client.d.ts.map +1 -0
- package/dist/coordinator/hosted-heartbeat-coordinator-client.js +77 -0
- package/dist/coordinator/hosted-heartbeat-coordinator-client.js.map +1 -0
- package/dist/coordinator/hosted-heartbeat-delegation-client.d.ts +21 -0
- package/dist/coordinator/hosted-heartbeat-delegation-client.d.ts.map +1 -0
- package/dist/coordinator/hosted-heartbeat-delegation-client.js +117 -0
- package/dist/coordinator/hosted-heartbeat-delegation-client.js.map +1 -0
- package/dist/coordinator/hosted-heartbeat-delegation-service.d.ts +15 -0
- package/dist/coordinator/hosted-heartbeat-delegation-service.d.ts.map +1 -0
- package/dist/coordinator/hosted-heartbeat-delegation-service.js +81 -0
- package/dist/coordinator/hosted-heartbeat-delegation-service.js.map +1 -0
- package/dist/coordinator/hosted-heartbeat-task-reconciler.d.ts +11 -0
- package/dist/coordinator/hosted-heartbeat-task-reconciler.d.ts.map +1 -0
- package/dist/coordinator/hosted-heartbeat-task-reconciler.js +38 -0
- package/dist/coordinator/hosted-heartbeat-task-reconciler.js.map +1 -0
- package/dist/coordinator/index.d.ts +9 -0
- package/dist/coordinator/index.d.ts.map +1 -0
- package/dist/coordinator/index.js +7 -0
- package/dist/coordinator/index.js.map +1 -0
- package/dist/coordinator/node/delegation-http-service.d.ts +11 -0
- package/dist/coordinator/node/delegation-http-service.d.ts.map +1 -0
- package/dist/coordinator/node/delegation-http-service.js +131 -0
- package/dist/coordinator/node/delegation-http-service.js.map +1 -0
- package/dist/coordinator/node/environment.d.ts +3 -0
- package/dist/coordinator/node/environment.d.ts.map +1 -0
- package/dist/coordinator/node/environment.js +13 -0
- package/dist/coordinator/node/environment.js.map +1 -0
- package/dist/coordinator/node/index.d.ts +4 -0
- package/dist/coordinator/node/index.d.ts.map +1 -0
- package/dist/coordinator/node/index.js +3 -0
- package/dist/coordinator/node/index.js.map +1 -0
- package/dist/coordinator/node/types.d.ts +20 -0
- package/dist/coordinator/node/types.d.ts.map +1 -0
- package/dist/coordinator/node/types.js +2 -0
- package/dist/coordinator/node/types.js.map +1 -0
- package/dist/coordinator/runtime-session.d.ts +13 -0
- package/dist/coordinator/runtime-session.d.ts.map +1 -0
- package/dist/coordinator/runtime-session.js +23 -0
- package/dist/coordinator/runtime-session.js.map +1 -0
- package/dist/coordinator/service-token.d.ts +3 -0
- package/dist/coordinator/service-token.d.ts.map +1 -0
- package/dist/coordinator/service-token.js +7 -0
- package/dist/coordinator/service-token.js.map +1 -0
- package/dist/coordinator/types.d.ts +63 -0
- package/dist/coordinator/types.d.ts.map +1 -0
- package/dist/coordinator/types.js +2 -0
- package/dist/coordinator/types.js.map +1 -0
- package/dist/heartbeat/types.d.ts +2 -2
- package/dist/heartbeat/types.d.ts.map +1 -1
- package/dist/heartbeat/types.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/node/http-service.d.ts.map +1 -1
- package/dist/node/http-service.js +5 -108
- package/dist/node/http-service.js.map +1 -1
- package/dist/node/http-utils.d.ts +15 -0
- package/dist/node/http-utils.d.ts.map +1 -0
- package/dist/node/http-utils.js +109 -0
- package/dist/node/http-utils.js.map +1 -0
- package/package.json +9 -1
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
const REDACTED_HEADER_VALUE = '[REDACTED]';
|
|
3
|
+
const MAX_AUTHORIZATION_CHARACTERS = 8_192;
|
|
4
|
+
export const NodeHttpPathSchema = z.string().min(1).max(256).regex(/^\/(?:[^?#\s]*)$/, 'must be an absolute path without query, fragment, or whitespace');
|
|
5
|
+
export class NodeHttpRequestError extends Error {
|
|
6
|
+
statusCode;
|
|
7
|
+
name = 'NodeHttpRequestError';
|
|
8
|
+
constructor(statusCode) {
|
|
9
|
+
super('Invalid Node HTTP request.');
|
|
10
|
+
this.statusCode = statusCode;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export function readPathname(rawUrl) {
|
|
14
|
+
try {
|
|
15
|
+
return new URL(rawUrl ?? '/', 'http://localhost').pathname;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function takeAuthorization(request) {
|
|
22
|
+
const occurrences = request.rawHeaders.reduce((count, headerName, index) => count
|
|
23
|
+
+ (index % 2 === 0 && headerName.toLowerCase() === 'authorization'
|
|
24
|
+
? 1
|
|
25
|
+
: 0), 0);
|
|
26
|
+
const raw = request.headers.authorization;
|
|
27
|
+
request.headers.authorization = raw === undefined
|
|
28
|
+
? undefined
|
|
29
|
+
: REDACTED_HEADER_VALUE;
|
|
30
|
+
for (let index = 0; index < request.rawHeaders.length; index += 2) {
|
|
31
|
+
if (request.rawHeaders[index]?.toLowerCase() === 'authorization') {
|
|
32
|
+
request.rawHeaders[index + 1] = REDACTED_HEADER_VALUE;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (occurrences > 1 || Array.isArray(raw)) {
|
|
36
|
+
throw new NodeHttpRequestError(400);
|
|
37
|
+
}
|
|
38
|
+
if (raw && raw.length > MAX_AUTHORIZATION_CHARACTERS) {
|
|
39
|
+
throw new NodeHttpRequestError(400);
|
|
40
|
+
}
|
|
41
|
+
return raw;
|
|
42
|
+
}
|
|
43
|
+
export async function readJsonBody(request, maxBodyBytes, signal) {
|
|
44
|
+
const contentType = request.headers['content-type']
|
|
45
|
+
?.split(';', 1)[0]
|
|
46
|
+
?.trim()
|
|
47
|
+
.toLowerCase();
|
|
48
|
+
if (contentType !== 'application/json') {
|
|
49
|
+
request.resume();
|
|
50
|
+
throw new NodeHttpRequestError(415);
|
|
51
|
+
}
|
|
52
|
+
const contentLength = request.headers['content-length'];
|
|
53
|
+
if (contentLength !== undefined) {
|
|
54
|
+
const declaredLength = Number(contentLength);
|
|
55
|
+
if (!Number.isSafeInteger(declaredLength) || declaredLength < 0) {
|
|
56
|
+
request.resume();
|
|
57
|
+
throw new NodeHttpRequestError(400);
|
|
58
|
+
}
|
|
59
|
+
if (declaredLength > maxBodyBytes) {
|
|
60
|
+
request.resume();
|
|
61
|
+
throw new NodeHttpRequestError(413);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const chunks = [];
|
|
65
|
+
let receivedBytes = 0;
|
|
66
|
+
for await (const chunk of request) {
|
|
67
|
+
signal.throwIfAborted();
|
|
68
|
+
const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
69
|
+
receivedBytes += buffer.byteLength;
|
|
70
|
+
if (receivedBytes > maxBodyBytes) {
|
|
71
|
+
request.resume();
|
|
72
|
+
throw new NodeHttpRequestError(413);
|
|
73
|
+
}
|
|
74
|
+
chunks.push(buffer);
|
|
75
|
+
}
|
|
76
|
+
if (!request.complete || receivedBytes === 0) {
|
|
77
|
+
throw new NodeHttpRequestError(400);
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
return JSON.parse(Buffer.concat(chunks, receivedBytes).toString('utf8'));
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
throw new NodeHttpRequestError(400);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
export function writeJsonError(response, statusCode, message, headers = {}) {
|
|
87
|
+
writeJson(response, statusCode, { error: { message } }, {
|
|
88
|
+
'Cache-Control': 'no-store',
|
|
89
|
+
...headers,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
export function writeJson(response, statusCode, value, headers = {}) {
|
|
93
|
+
if (response.headersSent || response.destroyed) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const body = JSON.stringify(value);
|
|
97
|
+
response.writeHead(statusCode, {
|
|
98
|
+
'Cache-Control': 'no-store',
|
|
99
|
+
'Content-Length': Buffer.byteLength(body),
|
|
100
|
+
'Content-Type': 'application/json; charset=utf-8',
|
|
101
|
+
'X-Content-Type-Options': 'nosniff',
|
|
102
|
+
...headers,
|
|
103
|
+
});
|
|
104
|
+
response.end(body);
|
|
105
|
+
}
|
|
106
|
+
export function errorType(error) {
|
|
107
|
+
return error instanceof Error ? error.name : 'unknown';
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=http-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-utils.js","sourceRoot":"","sources":["../../src/node/http-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingMessage, ServerResponse } from 'node:http';\nimport { z } from 'zod';\n\nconst REDACTED_HEADER_VALUE = '[REDACTED]';\nconst MAX_AUTHORIZATION_CHARACTERS = 8_192;\n\nexport const NodeHttpPathSchema = z.string().min(1).max(256).regex(\n /^\\/(?:[^?#\\s]*)$/,\n 'must be an absolute path without query, fragment, or whitespace',\n);\n\nexport class NodeHttpRequestError extends Error {\n readonly name = 'NodeHttpRequestError';\n\n constructor(readonly statusCode: 400 | 413 | 415) {\n super('Invalid Node HTTP request.');\n }\n}\n\nexport function readPathname(rawUrl: string | undefined): string | undefined {\n try {\n return new URL(rawUrl ?? '/', 'http://localhost').pathname;\n } catch {\n return undefined;\n }\n}\n\nexport function takeAuthorization(\n request: IncomingMessage,\n): string | undefined {\n const occurrences = request.rawHeaders.reduce(\n (count, headerName, index) => count\n + (index % 2 === 0 && headerName.toLowerCase() === 'authorization'\n ? 1\n : 0),\n 0,\n );\n const raw = request.headers.authorization;\n request.headers.authorization = raw === undefined\n ? undefined\n : REDACTED_HEADER_VALUE;\n for (let index = 0; index < request.rawHeaders.length; index += 2) {\n if (request.rawHeaders[index]?.toLowerCase() === 'authorization') {\n request.rawHeaders[index + 1] = REDACTED_HEADER_VALUE;\n }\n }\n if (occurrences > 1 || Array.isArray(raw)) {\n throw new NodeHttpRequestError(400);\n }\n if (raw && raw.length > MAX_AUTHORIZATION_CHARACTERS) {\n throw new NodeHttpRequestError(400);\n }\n return raw;\n}\n\nexport async function readJsonBody(\n request: IncomingMessage,\n maxBodyBytes: number,\n signal: AbortSignal,\n): Promise<unknown> {\n const contentType = request.headers['content-type']\n ?.split(';', 1)[0]\n ?.trim()\n .toLowerCase();\n if (contentType !== 'application/json') {\n request.resume();\n throw new NodeHttpRequestError(415);\n }\n const contentLength = request.headers['content-length'];\n if (contentLength !== undefined) {\n const declaredLength = Number(contentLength);\n if (!Number.isSafeInteger(declaredLength) || declaredLength < 0) {\n request.resume();\n throw new NodeHttpRequestError(400);\n }\n if (declaredLength > maxBodyBytes) {\n request.resume();\n throw new NodeHttpRequestError(413);\n }\n }\n\n const chunks: Buffer[] = [];\n let receivedBytes = 0;\n for await (const chunk of request) {\n signal.throwIfAborted();\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n receivedBytes += buffer.byteLength;\n if (receivedBytes > maxBodyBytes) {\n request.resume();\n throw new NodeHttpRequestError(413);\n }\n chunks.push(buffer);\n }\n if (!request.complete || receivedBytes === 0) {\n throw new NodeHttpRequestError(400);\n }\n try {\n return JSON.parse(\n Buffer.concat(chunks, receivedBytes).toString('utf8'),\n ) as unknown;\n } catch {\n throw new NodeHttpRequestError(400);\n }\n}\n\nexport function writeJsonError(\n response: ServerResponse,\n statusCode: number,\n message: string,\n headers: Record<string, string> = {},\n): void {\n writeJson(response, statusCode, { error: { message } }, {\n 'Cache-Control': 'no-store',\n ...headers,\n });\n}\n\nexport function writeJson(\n response: ServerResponse,\n statusCode: number,\n value: unknown,\n headers: Record<string, string> = {},\n): void {\n if (response.headersSent || response.destroyed) {\n return;\n }\n const body = JSON.stringify(value);\n response.writeHead(statusCode, {\n 'Cache-Control': 'no-store',\n 'Content-Length': Buffer.byteLength(body),\n 'Content-Type': 'application/json; charset=utf-8',\n 'X-Content-Type-Options': 'nosniff',\n ...headers,\n });\n response.end(body);\n}\n\nexport function errorType(error: unknown): string {\n return error instanceof Error ? error.name : 'unknown';\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@heddleagent/execution-host-client",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.4.0",
|
|
4
4
|
"description": "Backend contracts, execution authority, lifecycle services, and clients for compatible Heddle Execution Hosts",
|
|
5
5
|
"author": "Jay / Fienna Liang <roackb2@gmail.com>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -46,6 +46,14 @@
|
|
|
46
46
|
"types": "./dist/heartbeat/index.d.ts",
|
|
47
47
|
"import": "./dist/heartbeat/index.js"
|
|
48
48
|
},
|
|
49
|
+
"./coordinator": {
|
|
50
|
+
"types": "./dist/coordinator/index.d.ts",
|
|
51
|
+
"import": "./dist/coordinator/index.js"
|
|
52
|
+
},
|
|
53
|
+
"./coordinator/node": {
|
|
54
|
+
"types": "./dist/coordinator/node/index.d.ts",
|
|
55
|
+
"import": "./dist/coordinator/node/index.js"
|
|
56
|
+
},
|
|
49
57
|
"./mcp": {
|
|
50
58
|
"types": "./dist/mcp/index.d.ts",
|
|
51
59
|
"import": "./dist/mcp/index.js"
|