@zhin.js/a2a 3.0.13 → 3.0.15
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/CHANGELOG.md +60 -0
- package/README.md +72 -0
- package/lib/agent-executor.js +1 -0
- package/lib/agent-executor.js.map +1 -1
- package/lib/index.d.ts +4 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -0
- package/lib/index.js.map +1 -1
- package/lib/runtime.d.ts +21 -0
- package/lib/runtime.d.ts.map +1 -1
- package/lib/runtime.js +3 -0
- package/lib/runtime.js.map +1 -1
- package/lib/workroom-auth-registry.d.ts +66 -0
- package/lib/workroom-auth-registry.d.ts.map +1 -0
- package/lib/workroom-auth-registry.js +210 -0
- package/lib/workroom-auth-registry.js.map +1 -0
- package/lib/workroom-callback-runtime.d.ts +43 -0
- package/lib/workroom-callback-runtime.d.ts.map +1 -0
- package/lib/workroom-callback-runtime.js +216 -0
- package/lib/workroom-callback-runtime.js.map +1 -0
- package/lib/workroom-remote-transport.d.ts +58 -0
- package/lib/workroom-remote-transport.d.ts.map +1 -0
- package/lib/workroom-remote-transport.js +429 -0
- package/lib/workroom-remote-transport.js.map +1 -0
- package/package.json +7 -7
- package/src/agent-executor.ts +1 -0
- package/src/index.ts +5 -0
- package/src/runtime.ts +42 -0
- package/src/workroom-auth-registry.ts +279 -0
- package/src/workroom-callback-runtime.ts +294 -0
- package/src/workroom-remote-transport.ts +555 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workroom-callback-runtime.d.ts","sourceRoot":"","sources":["../src/workroom-callback-runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EACV,gCAAgC,EAChC,yBAAyB,EACzB,4BAA4B,EAC5B,mCAAmC,EACnC,6BAA6B,EAC9B,MAAM,gBAAgB,CAAC;AAGxB,MAAM,WAAW,mCAAmC;IAClD,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,4BAA4B,EAAE,cAAc,CAAC,CAAC;IAC1E,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;QACzB,MAAM,CACJ,OAAO,EAAE,6BAA6B,EACtC,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,mCAAmC,CAAC,CAAC;KACjD,CAAC,CAAC;IACH,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;QAC9B,cAAc,IAAI,OAAO,CAAC,SAAS,IAAI,CAAC,yBAAyB,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;KAC7E,CAAC,CAAC;IACH,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC;QAC7B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,gCAAgC,CAAC,CAAC;KACzF,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,sCAAsC;IACrD,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,iEAAiE;IACjE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,YAAY,EAAE,mCAAmC,CAAC;IAC3D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,gFAAgF;IAChF,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACrE;AAED,MAAM,WAAW,sCAAsC;IACrD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mCAAmC;IAClD,QAAQ,CAAC,QAAQ,EAAE,sCAAsC,GAAG,SAAS,CAAC;IACtE,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,sCAAsC,CAAC,CAAC;IAC/E,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAsB,+BAA+B,CACnD,OAAO,EAAE,sCAAsC,GAC9C,OAAO,CAAC,mCAAmC,CAAC,CAyF9C"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { WorkroomA2aAuthenticationError } from './workroom-auth-registry.js';
|
|
2
|
+
/**
|
|
3
|
+
* Installs the authority-isolated Workroom callback ingress. This route never
|
|
4
|
+
* invokes the ordinary A2A Agent executor; accepted observations can reach
|
|
5
|
+
* Workroom state only through the injected Callback Application.
|
|
6
|
+
*/
|
|
7
|
+
export async function installRuntimeWorkroomCallbacks(options) {
|
|
8
|
+
const path = normalizeExactPath(options.path ?? '/workroom-a2a/callback');
|
|
9
|
+
const ordinaryA2aBasePath = normalizeBasePath(options.ordinaryA2aBasePath ?? '/a2a');
|
|
10
|
+
if (ordinaryA2aBasePath === '/'
|
|
11
|
+
|| path === ordinaryA2aBasePath
|
|
12
|
+
|| path.startsWith(`${ordinaryA2aBasePath}/`)) {
|
|
13
|
+
throw new Error('Workroom callback path must be outside ordinary A2A inbound');
|
|
14
|
+
}
|
|
15
|
+
const maxBodyBytes = positiveInteger(options.maxBodyBytes, 'maxBodyBytes');
|
|
16
|
+
const controller = new AbortController();
|
|
17
|
+
const signal = options.signal
|
|
18
|
+
? AbortSignal.any([options.signal, controller.signal])
|
|
19
|
+
: controller.signal;
|
|
20
|
+
let recovery = options.deferRecovery === true
|
|
21
|
+
? undefined
|
|
22
|
+
: await recoverRegisteredLinks(options.dependencies, signal, options.onRecoveryError);
|
|
23
|
+
signal.throwIfAborted();
|
|
24
|
+
const unregister = options.http.route('POST', path, async (request, response) => {
|
|
25
|
+
const credential = bearerCredential(request);
|
|
26
|
+
if (!credential) {
|
|
27
|
+
writeJson(response, 401, { error: 'Unauthorized' });
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// Authenticate before consuming attacker-controlled request bytes. The
|
|
31
|
+
// Gateway authenticates again while deriving the immutable authority.
|
|
32
|
+
try {
|
|
33
|
+
options.dependencies.authRegistry.authenticate(credential);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
writeJson(response, 401, { error: 'Unauthorized' });
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const requestController = new AbortController();
|
|
40
|
+
const abortRequest = () => requestController.abort(new Error('Callback request aborted'));
|
|
41
|
+
request.once('aborted', abortRequest);
|
|
42
|
+
const requestSignal = AbortSignal.any([signal, requestController.signal]);
|
|
43
|
+
try {
|
|
44
|
+
const body = await readRawBody(request, maxBodyBytes);
|
|
45
|
+
const result = await options.dependencies.gateway.handle({ credential, body }, requestSignal);
|
|
46
|
+
writeJson(response, 202, {
|
|
47
|
+
accepted: true,
|
|
48
|
+
duplicate: result.duplicate,
|
|
49
|
+
applicationStatus: result.application.status,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
if (error instanceof WorkroomA2aAuthenticationError) {
|
|
54
|
+
writeJson(response, 401, { error: 'Unauthorized' });
|
|
55
|
+
}
|
|
56
|
+
else if (error instanceof RuntimeWorkroomCallbackBodyError) {
|
|
57
|
+
writeJson(response, error.statusCode, { error: error.message }, error.closeConnection ? () => request.destroy() : undefined);
|
|
58
|
+
}
|
|
59
|
+
else if (!response.headersSent && signal.aborted && !requestController.signal.aborted) {
|
|
60
|
+
writeJson(response, 503, { error: 'Callback Host unavailable' });
|
|
61
|
+
}
|
|
62
|
+
else if (!response.headersSent && !requestSignal.aborted) {
|
|
63
|
+
writeJson(response, 400, { error: 'Callback rejected' });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
request.off('aborted', abortRequest);
|
|
68
|
+
}
|
|
69
|
+
}, {
|
|
70
|
+
summary: 'Authenticated Workroom remote execution callback',
|
|
71
|
+
tags: ['workroom', 'a2a-callback'],
|
|
72
|
+
});
|
|
73
|
+
let disposed = false;
|
|
74
|
+
return Object.freeze({
|
|
75
|
+
get recovery() { return recovery; },
|
|
76
|
+
async recover(recoverySignal) {
|
|
77
|
+
const activeSignal = recoverySignal
|
|
78
|
+
? AbortSignal.any([signal, recoverySignal])
|
|
79
|
+
: signal;
|
|
80
|
+
recovery = await recoverRegisteredLinks(options.dependencies, activeSignal, options.onRecoveryError);
|
|
81
|
+
return recovery;
|
|
82
|
+
},
|
|
83
|
+
dispose() {
|
|
84
|
+
if (disposed)
|
|
85
|
+
return;
|
|
86
|
+
disposed = true;
|
|
87
|
+
controller.abort(new Error('Workroom callback Host retired'));
|
|
88
|
+
unregister();
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
async function recoverRegisteredLinks(dependencies, signal, onRecoveryError) {
|
|
93
|
+
signal.throwIfAborted();
|
|
94
|
+
const records = [...await dependencies.linkRegistry.listRegistered()]
|
|
95
|
+
.sort((left, right) => left.id.localeCompare(right.id));
|
|
96
|
+
let recovered = 0;
|
|
97
|
+
let failed = 0;
|
|
98
|
+
for (const record of records) {
|
|
99
|
+
signal.throwIfAborted();
|
|
100
|
+
try {
|
|
101
|
+
await dependencies.application.runOnce(record.id, signal);
|
|
102
|
+
recovered += 1;
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
failed += 1;
|
|
106
|
+
onRecoveryError?.(record.id, error);
|
|
107
|
+
}
|
|
108
|
+
signal.throwIfAborted();
|
|
109
|
+
}
|
|
110
|
+
signal.throwIfAborted();
|
|
111
|
+
return Object.freeze({ registered: records.length, recovered, failed });
|
|
112
|
+
}
|
|
113
|
+
class RuntimeWorkroomCallbackBodyError extends Error {
|
|
114
|
+
statusCode;
|
|
115
|
+
closeConnection;
|
|
116
|
+
constructor(message, statusCode, closeConnection = false) {
|
|
117
|
+
super(message);
|
|
118
|
+
this.statusCode = statusCode;
|
|
119
|
+
this.closeConnection = closeConnection;
|
|
120
|
+
this.name = 'RuntimeWorkroomCallbackBodyError';
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
async function readRawBody(request, limit) {
|
|
124
|
+
const declaredLength = declaredContentLength(request);
|
|
125
|
+
if (declaredLength !== undefined && declaredLength > limit) {
|
|
126
|
+
request.pause();
|
|
127
|
+
throw new RuntimeWorkroomCallbackBodyError(`Callback body exceeds ${limit} bytes`, 413, true);
|
|
128
|
+
}
|
|
129
|
+
const chunks = await new Promise((resolve, reject) => {
|
|
130
|
+
const buffered = [];
|
|
131
|
+
let size = 0;
|
|
132
|
+
const cleanup = () => {
|
|
133
|
+
request.off('data', onData);
|
|
134
|
+
request.off('end', onEnd);
|
|
135
|
+
request.off('error', onError);
|
|
136
|
+
request.off('aborted', onAborted);
|
|
137
|
+
};
|
|
138
|
+
const onData = (chunk) => {
|
|
139
|
+
const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
140
|
+
size += buffer.length;
|
|
141
|
+
if (size > limit) {
|
|
142
|
+
request.pause();
|
|
143
|
+
cleanup();
|
|
144
|
+
reject(new RuntimeWorkroomCallbackBodyError(`Callback body exceeds ${limit} bytes`, 413, true));
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
buffered.push(buffer);
|
|
148
|
+
};
|
|
149
|
+
const onEnd = () => {
|
|
150
|
+
cleanup();
|
|
151
|
+
resolve(buffered);
|
|
152
|
+
};
|
|
153
|
+
const onError = (error) => {
|
|
154
|
+
cleanup();
|
|
155
|
+
reject(error);
|
|
156
|
+
};
|
|
157
|
+
const onAborted = () => {
|
|
158
|
+
cleanup();
|
|
159
|
+
reject(new Error('Callback request aborted'));
|
|
160
|
+
};
|
|
161
|
+
request.on('data', onData);
|
|
162
|
+
request.once('end', onEnd);
|
|
163
|
+
request.once('error', onError);
|
|
164
|
+
request.once('aborted', onAborted);
|
|
165
|
+
});
|
|
166
|
+
if (chunks.length === 0) {
|
|
167
|
+
throw new RuntimeWorkroomCallbackBodyError('Callback body is required', 400);
|
|
168
|
+
}
|
|
169
|
+
return Buffer.concat(chunks);
|
|
170
|
+
}
|
|
171
|
+
function declaredContentLength(request) {
|
|
172
|
+
const value = request.headers['content-length'];
|
|
173
|
+
if (typeof value !== 'string' || !/^\d+$/u.test(value))
|
|
174
|
+
return undefined;
|
|
175
|
+
const parsed = Number(value);
|
|
176
|
+
return Number.isSafeInteger(parsed) ? parsed : Number.POSITIVE_INFINITY;
|
|
177
|
+
}
|
|
178
|
+
function bearerCredential(request) {
|
|
179
|
+
const value = request.headers.authorization;
|
|
180
|
+
if (typeof value !== 'string')
|
|
181
|
+
return undefined;
|
|
182
|
+
const match = /^Bearer ([^\s]+)$/u.exec(value);
|
|
183
|
+
return match?.[1];
|
|
184
|
+
}
|
|
185
|
+
function normalizeExactPath(value) {
|
|
186
|
+
if (typeof value !== 'string' || !value.trim()) {
|
|
187
|
+
throw new Error('Workroom callback path is required');
|
|
188
|
+
}
|
|
189
|
+
const leading = value.startsWith('/') ? value : `/${value}`;
|
|
190
|
+
let end = leading.length;
|
|
191
|
+
while (end > 1 && leading.charCodeAt(end - 1) === 47)
|
|
192
|
+
end -= 1;
|
|
193
|
+
const normalized = leading.slice(0, end);
|
|
194
|
+
if (normalized.includes('*'))
|
|
195
|
+
throw new Error('Workroom callback path must be exact');
|
|
196
|
+
return normalized;
|
|
197
|
+
}
|
|
198
|
+
function normalizeBasePath(value) {
|
|
199
|
+
return normalizeExactPath(value);
|
|
200
|
+
}
|
|
201
|
+
function positiveInteger(value, field) {
|
|
202
|
+
if (!Number.isSafeInteger(value) || Number(value) < 1) {
|
|
203
|
+
throw new Error(`Workroom callback ${field} must be a positive safe integer`);
|
|
204
|
+
}
|
|
205
|
+
return Number(value);
|
|
206
|
+
}
|
|
207
|
+
function writeJson(response, status, value, afterSend) {
|
|
208
|
+
const body = JSON.stringify(value);
|
|
209
|
+
response.writeHead(status, {
|
|
210
|
+
'content-type': 'application/json; charset=utf-8',
|
|
211
|
+
'content-length': String(Buffer.byteLength(body)),
|
|
212
|
+
...(afterSend ? { connection: 'close' } : {}),
|
|
213
|
+
});
|
|
214
|
+
response.end(body, afterSend);
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=workroom-callback-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workroom-callback-runtime.js","sourceRoot":"","sources":["../src/workroom-callback-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { RemoteCallbackPollPort, RemoteCallbackPollRequest, RemoteCallbackPollSnapshot, WORKROOM_A2A_EXTENSION_URI, WorkroomRemoteDispatchOutboxItem } from '@zhin.js/agent';
|
|
2
|
+
import type { WorkroomRemoteEndpointAuthority, WorkroomRemoteEndpointAuthorityPort, WorkroomRemoteDispatchObservation, WorkroomRemoteExecutorPort } from '@zhin.js/agent/runtime';
|
|
3
|
+
import type { WorkroomA2aCredentialReference, WorkroomA2aSecureCredentialProvider } from './workroom-auth-registry.js';
|
|
4
|
+
import { WorkroomA2aAuthRegistry } from './workroom-auth-registry.js';
|
|
5
|
+
export interface WorkroomA2aRemoteTransportBindingInput {
|
|
6
|
+
readonly endpointId: string;
|
|
7
|
+
readonly cardDigest: string;
|
|
8
|
+
readonly authBindingId: string;
|
|
9
|
+
readonly dispatchUrl: string;
|
|
10
|
+
readonly pollUrl: string;
|
|
11
|
+
readonly credential: WorkroomA2aCredentialReference;
|
|
12
|
+
readonly authority?: Readonly<{
|
|
13
|
+
readonly workroomExtension: typeof WORKROOM_A2A_EXTENSION_URI;
|
|
14
|
+
readonly idempotentDispatch: boolean;
|
|
15
|
+
readonly typedCompletionEnvelope: boolean;
|
|
16
|
+
readonly workspaceProviders: readonly string[];
|
|
17
|
+
}>;
|
|
18
|
+
readonly enabled: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface WorkroomA2aHttpRemoteTransportOptions {
|
|
21
|
+
readonly authRegistry: WorkroomA2aAuthRegistry;
|
|
22
|
+
readonly callbackUrl: string;
|
|
23
|
+
readonly bindings: readonly WorkroomA2aRemoteTransportBindingInput[];
|
|
24
|
+
readonly secureCredentialProvider?: WorkroomA2aSecureCredentialProvider;
|
|
25
|
+
/** Trusted low-level seam. Production uses DNS validation plus a pinned Node socket. */
|
|
26
|
+
readonly network?: WorkroomA2aPinnedNetworkPort;
|
|
27
|
+
readonly maxResponseBytes?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface WorkroomA2aResolvedAddress {
|
|
30
|
+
readonly address: string;
|
|
31
|
+
readonly family: 4 | 6;
|
|
32
|
+
}
|
|
33
|
+
export interface WorkroomA2aPinnedRequest {
|
|
34
|
+
readonly url: URL;
|
|
35
|
+
readonly address: string;
|
|
36
|
+
readonly family: 4 | 6;
|
|
37
|
+
readonly headers: Readonly<Record<string, string>>;
|
|
38
|
+
readonly body: string;
|
|
39
|
+
readonly signal: AbortSignal;
|
|
40
|
+
readonly maxResponseBytes: number;
|
|
41
|
+
}
|
|
42
|
+
export interface WorkroomA2aPinnedNetworkPort {
|
|
43
|
+
resolve(hostname: string): Promise<readonly WorkroomA2aResolvedAddress[]>;
|
|
44
|
+
request(input: WorkroomA2aPinnedRequest): Promise<Response>;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Fixed-generation HTTP implementation of the Workroom A2A extension. It
|
|
48
|
+
* transports immutable envelopes and typed poll snapshots only; Task state
|
|
49
|
+
* remains owned by the local Workroom Kernel.
|
|
50
|
+
*/
|
|
51
|
+
export declare class WorkroomA2aHttpRemoteTransport implements WorkroomRemoteExecutorPort, RemoteCallbackPollPort, WorkroomRemoteEndpointAuthorityPort {
|
|
52
|
+
#private;
|
|
53
|
+
constructor(options: WorkroomA2aHttpRemoteTransportOptions);
|
|
54
|
+
resolve(endpointId: string): WorkroomRemoteEndpointAuthority | undefined;
|
|
55
|
+
dispatch(item: WorkroomRemoteDispatchOutboxItem, signal: AbortSignal, governedBody?: Uint8Array): Promise<WorkroomRemoteDispatchObservation>;
|
|
56
|
+
poll(request: RemoteCallbackPollRequest, signal: AbortSignal): Promise<RemoteCallbackPollSnapshot>;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=workroom-remote-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workroom-remote-transport.d.ts","sourceRoot":"","sources":["../src/workroom-remote-transport.ts"],"names":[],"mappings":"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"}
|