@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,429 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { lookup } from 'node:dns/promises';
|
|
3
|
+
import * as http from 'node:http';
|
|
4
|
+
import * as https from 'node:https';
|
|
5
|
+
import { isIP } from 'node:net';
|
|
6
|
+
// Keep the Host runtime dependency-neutral while the literal type remains
|
|
7
|
+
// checked against the Agent-owned Workroom protocol contract at compile time.
|
|
8
|
+
const WORKROOM_A2A_EXTENSION_URI_VALUE = 'https://zhin.dev/extensions/workroom-executor/v1';
|
|
9
|
+
/**
|
|
10
|
+
* Fixed-generation HTTP implementation of the Workroom A2A extension. It
|
|
11
|
+
* transports immutable envelopes and typed poll snapshots only; Task state
|
|
12
|
+
* remains owned by the local Workroom Kernel.
|
|
13
|
+
*/
|
|
14
|
+
export class WorkroomA2aHttpRemoteTransport {
|
|
15
|
+
#authRegistry;
|
|
16
|
+
#callbackUrl;
|
|
17
|
+
#bindings;
|
|
18
|
+
#network;
|
|
19
|
+
#maxResponseBytes;
|
|
20
|
+
constructor(options) {
|
|
21
|
+
if (!options || typeof options !== 'object' || Array.isArray(options)) {
|
|
22
|
+
throw new Error('Workroom A2A remote transport options must be an object');
|
|
23
|
+
}
|
|
24
|
+
this.#authRegistry = options.authRegistry;
|
|
25
|
+
this.#callbackUrl = canonicalUrl(options.callbackUrl, 'callbackUrl');
|
|
26
|
+
this.#network = options.network ?? new NodeWorkroomA2aPinnedNetwork();
|
|
27
|
+
this.#maxResponseBytes = positiveInteger(options.maxResponseBytes ?? 1_048_576, 'maxResponseBytes');
|
|
28
|
+
if (!Array.isArray(options.bindings) || options.bindings.length === 0) {
|
|
29
|
+
throw new Error('Workroom A2A remote transport requires endpoint bindings');
|
|
30
|
+
}
|
|
31
|
+
const bindings = new Map();
|
|
32
|
+
for (const input of options.bindings) {
|
|
33
|
+
exactKeys(input, [
|
|
34
|
+
'endpointId', 'cardDigest', 'authBindingId', 'dispatchUrl', 'pollUrl',
|
|
35
|
+
'credential', 'authority', 'enabled',
|
|
36
|
+
], 'remote binding');
|
|
37
|
+
const endpointId = text(input.endpointId, 'endpointId');
|
|
38
|
+
if (bindings.has(endpointId))
|
|
39
|
+
throw new Error(`Duplicate Workroom A2A endpoint ${endpointId}`);
|
|
40
|
+
const callbackAuthority = options.authRegistry.snapshot.bindings.find(candidate => candidate.endpointId === endpointId);
|
|
41
|
+
if (!callbackAuthority
|
|
42
|
+
|| callbackAuthority.cardDigest !== input.cardDigest
|
|
43
|
+
|| callbackAuthority.authBindingId !== input.authBindingId) {
|
|
44
|
+
throw new Error(`Workroom A2A endpoint ${endpointId} has no exact callback authority`);
|
|
45
|
+
}
|
|
46
|
+
const dispatchUrl = trustedDestinationUrl(input.dispatchUrl, 'dispatchUrl', callbackAuthority.trustDomain);
|
|
47
|
+
const pollUrl = trustedDestinationUrl(input.pollUrl, 'pollUrl', callbackAuthority.trustDomain);
|
|
48
|
+
if (new URL(dispatchUrl).origin !== new URL(pollUrl).origin) {
|
|
49
|
+
throw new Error(`Workroom A2A endpoint ${endpointId} dispatch/poll origin drift`);
|
|
50
|
+
}
|
|
51
|
+
const credential = resolveCredential(input.credential, options.secureCredentialProvider);
|
|
52
|
+
const authority = input.authority === undefined
|
|
53
|
+
? undefined
|
|
54
|
+
: compileEndpointAuthority(input.authority, callbackAuthority, dispatchUrl, pollUrl);
|
|
55
|
+
bindings.set(endpointId, Object.freeze({
|
|
56
|
+
endpointId,
|
|
57
|
+
cardDigest: digest(input.cardDigest, 'cardDigest'),
|
|
58
|
+
authBindingId: text(input.authBindingId, 'authBindingId'),
|
|
59
|
+
dispatchUrl,
|
|
60
|
+
pollUrl,
|
|
61
|
+
authorization: `Bearer ${credential}`,
|
|
62
|
+
enabled: boolean(input.enabled, 'enabled'),
|
|
63
|
+
...(authority === undefined ? {} : { authority }),
|
|
64
|
+
}));
|
|
65
|
+
}
|
|
66
|
+
this.#bindings = bindings;
|
|
67
|
+
}
|
|
68
|
+
resolve(endpointId) {
|
|
69
|
+
const binding = this.#bindings.get(text(endpointId, 'endpointId'));
|
|
70
|
+
return binding?.enabled ? binding.authority : undefined;
|
|
71
|
+
}
|
|
72
|
+
async dispatch(item, signal, governedBody) {
|
|
73
|
+
signal.throwIfAborted();
|
|
74
|
+
if (!governedBody) {
|
|
75
|
+
throw new Error('Workroom A2A governed disclosure body is unavailable');
|
|
76
|
+
}
|
|
77
|
+
const binding = this.#binding(item.envelope.endpoint.id, item.envelope.endpoint.cardDigest, item.envelope.endpoint.authBindingId);
|
|
78
|
+
const response = await this.#request(binding.dispatchUrl, binding.authorization, {
|
|
79
|
+
version: 1,
|
|
80
|
+
callback: {
|
|
81
|
+
url: this.#callbackUrl,
|
|
82
|
+
authorization: this.#authRegistry.callbackAuthorization(binding.endpointId),
|
|
83
|
+
},
|
|
84
|
+
item,
|
|
85
|
+
governedPayload: {
|
|
86
|
+
version: 1,
|
|
87
|
+
manifestDigest: item.envelope.disclosureManifest.manifest.digest,
|
|
88
|
+
mediaType: 'application/octet-stream',
|
|
89
|
+
encoding: 'base64',
|
|
90
|
+
body: Buffer.from(governedBody).toString('base64'),
|
|
91
|
+
},
|
|
92
|
+
}, signal);
|
|
93
|
+
if (response.status >= 400 && response.status < 500) {
|
|
94
|
+
return Object.freeze({
|
|
95
|
+
outcome: 'failed',
|
|
96
|
+
receiptId: `workroom-http-rejected:v1:${encodeURIComponent(item.dispatchId)}:${response.status}`,
|
|
97
|
+
reason: `remote_http_${response.status}`,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
if (!response.ok)
|
|
101
|
+
throw new Error(`Workroom A2A dispatch HTTP ${response.status}`);
|
|
102
|
+
const value = await this.#json(response, 'dispatch receipt');
|
|
103
|
+
exactKeys(value, ['version', 'receiptId', 'remoteTaskId', 'remoteContextId'], 'dispatch receipt');
|
|
104
|
+
if (value.version !== 1)
|
|
105
|
+
throw new Error('Workroom A2A dispatch receipt version is unsupported');
|
|
106
|
+
return Object.freeze({
|
|
107
|
+
outcome: 'delivered',
|
|
108
|
+
receiptId: text(value.receiptId, 'receiptId'),
|
|
109
|
+
remoteTaskId: text(value.remoteTaskId, 'remoteTaskId'),
|
|
110
|
+
remoteContextId: text(value.remoteContextId, 'remoteContextId'),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
async poll(request, signal) {
|
|
114
|
+
signal.throwIfAborted();
|
|
115
|
+
const binding = this.#binding(request.endpointId, request.cardDigest, request.authBindingId);
|
|
116
|
+
const response = await this.#request(binding.pollUrl, binding.authorization, request, signal);
|
|
117
|
+
if (!response.ok)
|
|
118
|
+
throw new Error(`Workroom A2A poll HTTP ${response.status}`);
|
|
119
|
+
return await this.#json(response, 'poll snapshot');
|
|
120
|
+
}
|
|
121
|
+
#binding(endpointId, cardDigest, authBindingId) {
|
|
122
|
+
const binding = this.#bindings.get(endpointId);
|
|
123
|
+
if (!binding || !binding.enabled
|
|
124
|
+
|| binding.cardDigest !== cardDigest
|
|
125
|
+
|| binding.authBindingId !== authBindingId) {
|
|
126
|
+
throw new Error('Workroom A2A endpoint authority does not match the active transport generation');
|
|
127
|
+
}
|
|
128
|
+
return binding;
|
|
129
|
+
}
|
|
130
|
+
async #request(url, authorization, body, signal) {
|
|
131
|
+
signal.throwIfAborted();
|
|
132
|
+
const parsed = new URL(url);
|
|
133
|
+
const addresses = isIP(parsed.hostname)
|
|
134
|
+
? [{ address: parsed.hostname, family: isIP(parsed.hostname) }]
|
|
135
|
+
: await this.#network.resolve(parsed.hostname);
|
|
136
|
+
if (addresses.length === 0) {
|
|
137
|
+
throw new Error(`Workroom A2A DNS returned no address for ${parsed.hostname}`);
|
|
138
|
+
}
|
|
139
|
+
const loopbackDestination = isLoopbackHostname(parsed.hostname);
|
|
140
|
+
for (const entry of addresses) {
|
|
141
|
+
if ((entry.family !== 4 && entry.family !== 6) || isIP(entry.address) !== entry.family) {
|
|
142
|
+
throw new Error(`Workroom A2A DNS returned an invalid address for ${parsed.hostname}`);
|
|
143
|
+
}
|
|
144
|
+
if (isBlockedIpAddress(entry.address)
|
|
145
|
+
&& !(loopbackDestination && isLoopbackAddress(entry.address))) {
|
|
146
|
+
throw new Error(`Workroom A2A DNS target ${entry.address} is private or dangerous`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const selected = addresses[0];
|
|
150
|
+
return await this.#network.request({
|
|
151
|
+
url: parsed,
|
|
152
|
+
address: selected.address,
|
|
153
|
+
family: selected.family,
|
|
154
|
+
headers: Object.freeze({
|
|
155
|
+
authorization,
|
|
156
|
+
'content-type': 'application/json',
|
|
157
|
+
'x-zhin-workroom-extension': 'https://zhin.dev/extensions/workroom-executor/v1',
|
|
158
|
+
}),
|
|
159
|
+
body: JSON.stringify(body),
|
|
160
|
+
signal,
|
|
161
|
+
maxResponseBytes: this.#maxResponseBytes,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
async #json(response, label) {
|
|
165
|
+
const declared = response.headers.get('content-length');
|
|
166
|
+
if (declared !== null && Number(declared) > this.#maxResponseBytes) {
|
|
167
|
+
await response.body?.cancel();
|
|
168
|
+
throw new Error(`Workroom A2A ${label} exceeds ${this.#maxResponseBytes} bytes`);
|
|
169
|
+
}
|
|
170
|
+
if (!response.body)
|
|
171
|
+
throw new Error(`Workroom A2A ${label} has no response body`);
|
|
172
|
+
const reader = response.body.getReader();
|
|
173
|
+
const chunks = [];
|
|
174
|
+
let total = 0;
|
|
175
|
+
for (;;) {
|
|
176
|
+
const chunk = await reader.read();
|
|
177
|
+
if (chunk.done)
|
|
178
|
+
break;
|
|
179
|
+
total += chunk.value.byteLength;
|
|
180
|
+
if (total > this.#maxResponseBytes) {
|
|
181
|
+
await reader.cancel();
|
|
182
|
+
throw new Error(`Workroom A2A ${label} exceeds ${this.#maxResponseBytes} bytes`);
|
|
183
|
+
}
|
|
184
|
+
chunks.push(chunk.value);
|
|
185
|
+
}
|
|
186
|
+
const bytes = new Uint8Array(total);
|
|
187
|
+
let offset = 0;
|
|
188
|
+
for (const chunk of chunks) {
|
|
189
|
+
bytes.set(chunk, offset);
|
|
190
|
+
offset += chunk.byteLength;
|
|
191
|
+
}
|
|
192
|
+
let value;
|
|
193
|
+
try {
|
|
194
|
+
value = JSON.parse(new TextDecoder().decode(bytes));
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
throw new Error(`Workroom A2A ${label} is not valid JSON`, { cause: error });
|
|
198
|
+
}
|
|
199
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
200
|
+
throw new Error(`Workroom A2A ${label} must be an object`);
|
|
201
|
+
}
|
|
202
|
+
return value;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
class NodeWorkroomA2aPinnedNetwork {
|
|
206
|
+
async resolve(hostname) {
|
|
207
|
+
const addresses = await lookup(hostname, { all: true, verbatim: true });
|
|
208
|
+
return addresses.map(entry => Object.freeze({
|
|
209
|
+
address: entry.address,
|
|
210
|
+
family: entry.family,
|
|
211
|
+
}));
|
|
212
|
+
}
|
|
213
|
+
request(input) {
|
|
214
|
+
const requester = input.url.protocol === 'https:' ? https : http;
|
|
215
|
+
return new Promise((resolve, reject) => {
|
|
216
|
+
const request = requester.request({
|
|
217
|
+
protocol: input.url.protocol,
|
|
218
|
+
hostname: input.address,
|
|
219
|
+
family: input.family,
|
|
220
|
+
port: input.url.port || undefined,
|
|
221
|
+
path: `${input.url.pathname}${input.url.search}`,
|
|
222
|
+
method: 'POST',
|
|
223
|
+
headers: {
|
|
224
|
+
...input.headers,
|
|
225
|
+
Host: input.url.host,
|
|
226
|
+
'Accept-Encoding': 'identity',
|
|
227
|
+
'Content-Length': String(Buffer.byteLength(input.body)),
|
|
228
|
+
},
|
|
229
|
+
signal: input.signal,
|
|
230
|
+
...(input.url.protocol === 'https:' && !isIP(input.url.hostname)
|
|
231
|
+
? { servername: input.url.hostname }
|
|
232
|
+
: {}),
|
|
233
|
+
}, response => {
|
|
234
|
+
const chunks = [];
|
|
235
|
+
let size = 0;
|
|
236
|
+
response.on('data', (chunk) => {
|
|
237
|
+
const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
238
|
+
size += buffer.length;
|
|
239
|
+
if (size > input.maxResponseBytes) {
|
|
240
|
+
response.destroy(new Error(`Workroom A2A response exceeds ${input.maxResponseBytes} bytes`));
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
chunks.push(buffer);
|
|
244
|
+
});
|
|
245
|
+
response.once('error', reject);
|
|
246
|
+
response.once('end', () => resolve(new Response(Buffer.concat(chunks), {
|
|
247
|
+
status: response.statusCode ?? 500,
|
|
248
|
+
statusText: response.statusMessage,
|
|
249
|
+
headers: response.headers,
|
|
250
|
+
})));
|
|
251
|
+
});
|
|
252
|
+
request.once('error', reject);
|
|
253
|
+
request.end(input.body);
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
function compileEndpointAuthority(input, callback, dispatchUrl, pollUrl) {
|
|
258
|
+
exactKeys(input, [
|
|
259
|
+
'workroomExtension', 'idempotentDispatch', 'typedCompletionEnvelope',
|
|
260
|
+
'workspaceProviders',
|
|
261
|
+
], 'remote endpoint authority');
|
|
262
|
+
if (input.workroomExtension !== WORKROOM_A2A_EXTENSION_URI_VALUE
|
|
263
|
+
|| input.idempotentDispatch !== true
|
|
264
|
+
|| input.typedCompletionEnvelope !== true) {
|
|
265
|
+
throw new Error('Workroom A2A remote endpoint authority lacks the v1 execution contract');
|
|
266
|
+
}
|
|
267
|
+
const expectedExtensionDigest = `sha256:${createHash('sha256')
|
|
268
|
+
.update(WORKROOM_A2A_EXTENSION_URI_VALUE).digest('hex')}`;
|
|
269
|
+
if (callback.extensionDigest !== expectedExtensionDigest) {
|
|
270
|
+
throw new Error('Workroom A2A remote endpoint extension digest drift');
|
|
271
|
+
}
|
|
272
|
+
if (!Array.isArray(input.workspaceProviders) || input.workspaceProviders.length === 0) {
|
|
273
|
+
throw new Error('Workroom A2A remote endpoint requires Workspace providers');
|
|
274
|
+
}
|
|
275
|
+
const workspaceProviders = [...new Set(input.workspaceProviders.map(provider => text(provider, 'workspaceProvider')))].sort((left, right) => left.localeCompare(right));
|
|
276
|
+
if (workspaceProviders.length !== input.workspaceProviders.length) {
|
|
277
|
+
throw new Error('Workroom A2A remote endpoint Workspace providers contain duplicates');
|
|
278
|
+
}
|
|
279
|
+
const transportProjection = {
|
|
280
|
+
version: 1,
|
|
281
|
+
generation: callback.generation,
|
|
282
|
+
endpointId: callback.endpointId,
|
|
283
|
+
cardDigest: callback.cardDigest,
|
|
284
|
+
authBindingId: callback.authBindingId,
|
|
285
|
+
extensionDigest: callback.extensionDigest,
|
|
286
|
+
credentialIdDigest: callback.credentialIdDigest,
|
|
287
|
+
dispatchUrl,
|
|
288
|
+
pollUrl,
|
|
289
|
+
};
|
|
290
|
+
return Object.freeze({
|
|
291
|
+
generation: callback.generation,
|
|
292
|
+
transportBindingDigest: `sha256:${createHash('sha256')
|
|
293
|
+
.update(JSON.stringify(transportProjection)).digest('hex')}`,
|
|
294
|
+
endpoint: Object.freeze({
|
|
295
|
+
id: callback.endpointId,
|
|
296
|
+
owner: callback.tenantId,
|
|
297
|
+
cardDigest: callback.cardDigest,
|
|
298
|
+
authBindingId: callback.authBindingId,
|
|
299
|
+
workroomExtension: WORKROOM_A2A_EXTENSION_URI_VALUE,
|
|
300
|
+
idempotentDispatch: true,
|
|
301
|
+
typedCompletionEnvelope: true,
|
|
302
|
+
workspaceProviders: Object.freeze(workspaceProviders),
|
|
303
|
+
}),
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
function resolveCredential(reference, provider) {
|
|
307
|
+
if (!reference || typeof reference !== 'object' || Array.isArray(reference)) {
|
|
308
|
+
throw new Error('Workroom A2A remote credential reference must be an object');
|
|
309
|
+
}
|
|
310
|
+
if (reference.source === 'config') {
|
|
311
|
+
exactKeys(reference, ['source', 'value'], 'remote config credential');
|
|
312
|
+
return credential(reference.value);
|
|
313
|
+
}
|
|
314
|
+
if (reference.source === 'secure_provider') {
|
|
315
|
+
exactKeys(reference, ['source', 'secretRef'], 'remote secure credential');
|
|
316
|
+
const secretRef = text(reference.secretRef, 'secretRef');
|
|
317
|
+
if (!provider)
|
|
318
|
+
throw new Error('Workroom A2A remote secure credential provider is required');
|
|
319
|
+
return credential(provider.resolve(secretRef));
|
|
320
|
+
}
|
|
321
|
+
throw new Error('Workroom A2A remote credential source is unsupported');
|
|
322
|
+
}
|
|
323
|
+
function canonicalUrl(value, field) {
|
|
324
|
+
const raw = text(value, field);
|
|
325
|
+
let url;
|
|
326
|
+
try {
|
|
327
|
+
url = new URL(raw);
|
|
328
|
+
}
|
|
329
|
+
catch (error) {
|
|
330
|
+
throw new Error(`Workroom A2A ${field} is not a valid URL`, { cause: error });
|
|
331
|
+
}
|
|
332
|
+
const loopback = url.hostname === '127.0.0.1' || url.hostname === 'localhost' || url.hostname === '::1';
|
|
333
|
+
if (url.protocol !== 'https:' && !(url.protocol === 'http:' && loopback)) {
|
|
334
|
+
throw new Error(`Workroom A2A ${field} must use HTTPS or loopback HTTP`);
|
|
335
|
+
}
|
|
336
|
+
if (url.username || url.password || url.hash) {
|
|
337
|
+
throw new Error(`Workroom A2A ${field} must not embed credentials or fragments`);
|
|
338
|
+
}
|
|
339
|
+
return url.toString();
|
|
340
|
+
}
|
|
341
|
+
function trustedDestinationUrl(value, field, trustDomainValue) {
|
|
342
|
+
const canonical = canonicalUrl(value, field);
|
|
343
|
+
const url = new URL(canonical);
|
|
344
|
+
const trustDomain = text(trustDomainValue, 'trustDomain').toLowerCase();
|
|
345
|
+
if (url.hostname.toLowerCase() !== trustDomain) {
|
|
346
|
+
throw new Error(`Workroom A2A ${field} host is outside the trusted destination`);
|
|
347
|
+
}
|
|
348
|
+
const loopback = ['127.0.0.1', 'localhost', '::1'].includes(url.hostname);
|
|
349
|
+
if (url.protocol === 'https:' && url.port && url.port !== '443') {
|
|
350
|
+
throw new Error(`Workroom A2A ${field} uses an unapproved HTTPS port`);
|
|
351
|
+
}
|
|
352
|
+
if (url.protocol === 'http:' && !loopback) {
|
|
353
|
+
throw new Error(`Workroom A2A ${field} uses non-loopback HTTP`);
|
|
354
|
+
}
|
|
355
|
+
if (isIP(url.hostname) && isBlockedIpAddress(url.hostname) && !loopback) {
|
|
356
|
+
throw new Error(`Workroom A2A ${field} host is private or dangerous`);
|
|
357
|
+
}
|
|
358
|
+
return canonical;
|
|
359
|
+
}
|
|
360
|
+
function isLoopbackHostname(hostname) {
|
|
361
|
+
return ['127.0.0.1', 'localhost', '::1'].includes(hostname.toLowerCase());
|
|
362
|
+
}
|
|
363
|
+
function isLoopbackAddress(address) {
|
|
364
|
+
const normalized = address.toLowerCase();
|
|
365
|
+
return normalized === '::1' || normalized.startsWith('127.');
|
|
366
|
+
}
|
|
367
|
+
function isBlockedIpAddress(address) {
|
|
368
|
+
const normalized = address.toLowerCase().replace(/^\[|\]$/gu, '');
|
|
369
|
+
if (isIP(normalized) === 4) {
|
|
370
|
+
const [a, b] = normalized.split('.').map(Number);
|
|
371
|
+
return a === 0
|
|
372
|
+
|| a === 10
|
|
373
|
+
|| a === 127
|
|
374
|
+
|| (a === 100 && b >= 64 && b <= 127)
|
|
375
|
+
|| (a === 169 && b === 254)
|
|
376
|
+
|| (a === 172 && b >= 16 && b <= 31)
|
|
377
|
+
|| (a === 192 && b === 0)
|
|
378
|
+
|| (a === 192 && b === 168)
|
|
379
|
+
|| (a === 198 && (b === 18 || b === 19))
|
|
380
|
+
|| a >= 224;
|
|
381
|
+
}
|
|
382
|
+
if (isIP(normalized) === 6) {
|
|
383
|
+
if (normalized === '::' || normalized === '::1')
|
|
384
|
+
return true;
|
|
385
|
+
const mapped = /^::ffff:(\d+\.\d+\.\d+\.\d+)$/iu.exec(normalized)?.[1];
|
|
386
|
+
if (mapped)
|
|
387
|
+
return isBlockedIpAddress(mapped);
|
|
388
|
+
return /^(?:fc|fd)/iu.test(normalized)
|
|
389
|
+
|| /^fe[89ab]/iu.test(normalized)
|
|
390
|
+
|| /^ff/iu.test(normalized);
|
|
391
|
+
}
|
|
392
|
+
return true;
|
|
393
|
+
}
|
|
394
|
+
function exactKeys(value, keys, label) {
|
|
395
|
+
const unexpected = Object.keys(value).find(key => !keys.includes(key));
|
|
396
|
+
if (unexpected)
|
|
397
|
+
throw new Error(`Workroom A2A ${label} contains unsupported field ${unexpected}`);
|
|
398
|
+
}
|
|
399
|
+
function text(value, field) {
|
|
400
|
+
if (typeof value !== 'string' || !value.trim())
|
|
401
|
+
throw new Error(`Workroom A2A ${field} is required`);
|
|
402
|
+
if (/\r|\n/u.test(value))
|
|
403
|
+
throw new Error(`Workroom A2A ${field} contains control characters`);
|
|
404
|
+
return value.trim();
|
|
405
|
+
}
|
|
406
|
+
function credential(value) {
|
|
407
|
+
const result = text(value, 'credential');
|
|
408
|
+
if (result.length > 8_192)
|
|
409
|
+
throw new Error('Workroom A2A credential is too large');
|
|
410
|
+
return result;
|
|
411
|
+
}
|
|
412
|
+
function digest(value, field) {
|
|
413
|
+
const result = text(value, field);
|
|
414
|
+
if (!/^sha256:[a-f0-9]{64}$/u.test(result))
|
|
415
|
+
throw new Error(`Workroom A2A ${field} is invalid`);
|
|
416
|
+
return result;
|
|
417
|
+
}
|
|
418
|
+
function boolean(value, field) {
|
|
419
|
+
if (typeof value !== 'boolean')
|
|
420
|
+
throw new Error(`Workroom A2A ${field} must be boolean`);
|
|
421
|
+
return value;
|
|
422
|
+
}
|
|
423
|
+
function positiveInteger(value, field) {
|
|
424
|
+
if (!Number.isSafeInteger(value) || Number(value) < 1) {
|
|
425
|
+
throw new Error(`Workroom A2A ${field} must be a positive safe integer`);
|
|
426
|
+
}
|
|
427
|
+
return Number(value);
|
|
428
|
+
}
|
|
429
|
+
//# sourceMappingURL=workroom-remote-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workroom-remote-transport.js","sourceRoot":"","sources":["../src/workroom-remote-transport.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhin.js/a2a",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.15",
|
|
4
4
|
"description": "A2A Protocol server for Zhin.js — multi-agent Agent Cards and task delegation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -36,21 +36,21 @@
|
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@a2a-js/sdk": "1.0.0-beta.0",
|
|
39
|
-
"@zhin.js/core": "1.5.
|
|
39
|
+
"@zhin.js/core": "1.5.13",
|
|
40
40
|
"@zhin.js/host-http-contract": "1.0.1",
|
|
41
41
|
"@zhin.js/logger": "1.0.76"
|
|
42
42
|
},
|
|
43
43
|
"peerDependencies": {
|
|
44
|
-
"@zhin.js/agent": "1.1.
|
|
45
|
-
"zhin.js": "6.0.
|
|
44
|
+
"@zhin.js/agent": "1.1.15",
|
|
45
|
+
"zhin.js": "6.0.13"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@types/node": "^26.1.2",
|
|
49
49
|
"rimraf": "^6.1.3",
|
|
50
50
|
"typescript": "^6.0.3",
|
|
51
|
-
"@zhin.js/agent": "1.1.
|
|
52
|
-
"@zhin.js/host-http": "1.0.
|
|
53
|
-
"zhin.js": "6.0.
|
|
51
|
+
"@zhin.js/agent": "1.1.15",
|
|
52
|
+
"@zhin.js/host-http": "1.0.12",
|
|
53
|
+
"zhin.js": "6.0.13"
|
|
54
54
|
},
|
|
55
55
|
"files": [
|
|
56
56
|
"src",
|
package/src/agent-executor.ts
CHANGED
|
@@ -169,6 +169,7 @@ function createA2aTurnRequest(
|
|
|
169
169
|
return Object.freeze({
|
|
170
170
|
identity: Object.freeze({ traceId: context.taskId, turnId: randomUUID() }),
|
|
171
171
|
origin: Object.freeze({ kind: 'a2a' as const, taskId: context.taskId }),
|
|
172
|
+
intent: Object.freeze({ kind: 'new' as const }),
|
|
172
173
|
principal: Object.freeze({ subjectId: 'a2a-client', roles: Object.freeze(['user']) }),
|
|
173
174
|
input: Object.freeze({ text }),
|
|
174
175
|
session: Object.freeze({ key: `a2a:${context.contextId}` }),
|
package/src/index.ts
CHANGED
|
@@ -8,6 +8,11 @@ export {
|
|
|
8
8
|
installRuntimeA2a,
|
|
9
9
|
type InstallRuntimeA2aOptions,
|
|
10
10
|
type RuntimeA2aConfig,
|
|
11
|
+
type RuntimeWorkroomCallbackConfig,
|
|
12
|
+
type RuntimeWorkroomRemoteExecutorsConfig,
|
|
11
13
|
} from './runtime.js';
|
|
12
14
|
export type { RuntimeA2aConfig as A2aConfig } from './runtime.js';
|
|
13
15
|
export { verifyA2aBearer } from './auth.js';
|
|
16
|
+
export * from './workroom-auth-registry.js';
|
|
17
|
+
export * from './workroom-callback-runtime.js';
|
|
18
|
+
export * from './workroom-remote-transport.js';
|
package/src/runtime.ts
CHANGED
|
@@ -10,12 +10,32 @@ import { buildAgentCardForBinding } from './card-builder.js';
|
|
|
10
10
|
import { ZhinA2AExecutor } from './agent-executor.js';
|
|
11
11
|
import { handleAgentCard, handleJsonRpc, handleRest } from './http-handlers.js';
|
|
12
12
|
import { verifyA2aBearer } from './auth.js';
|
|
13
|
+
import type { WorkroomA2aAuthBindingInput } from './workroom-auth-registry.js';
|
|
14
|
+
import type { WorkroomA2aRemoteTransportBindingInput } from './workroom-remote-transport.js';
|
|
15
|
+
|
|
16
|
+
export interface RuntimeWorkroomCallbackConfig {
|
|
17
|
+
readonly enabled?: boolean;
|
|
18
|
+
/** Must remain outside the ordinary `/a2a/{agent}/*` route tree. */
|
|
19
|
+
readonly path?: string;
|
|
20
|
+
readonly maxBodyBytes?: number;
|
|
21
|
+
readonly maxSequenceGap?: number;
|
|
22
|
+
readonly bindings: readonly WorkroomA2aAuthBindingInput[];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface RuntimeWorkroomRemoteExecutorsConfig {
|
|
26
|
+
readonly enabled?: boolean;
|
|
27
|
+
readonly maxResponseBytes?: number;
|
|
28
|
+
readonly bindings: readonly WorkroomA2aRemoteTransportBindingInput[];
|
|
29
|
+
}
|
|
13
30
|
|
|
14
31
|
export interface RuntimeA2aConfig {
|
|
15
32
|
readonly enabled?: boolean;
|
|
16
33
|
readonly path?: string;
|
|
17
34
|
readonly token?: string;
|
|
18
35
|
readonly publicUrl?: string;
|
|
36
|
+
readonly workroomCallbacks?: RuntimeWorkroomCallbackConfig;
|
|
37
|
+
/** Transport endpoints only. Project/Workroom topology remains in the persistent Catalog. */
|
|
38
|
+
readonly workroomRemoteExecutors?: RuntimeWorkroomRemoteExecutorsConfig;
|
|
19
39
|
}
|
|
20
40
|
|
|
21
41
|
export interface InstallRuntimeA2aOptions {
|
|
@@ -139,3 +159,25 @@ function normalizePath(path: string): string {
|
|
|
139
159
|
const leading = path.startsWith('/') ? path : `/${path}`;
|
|
140
160
|
return trimTrailingSlashes(leading) || '/a2a';
|
|
141
161
|
}
|
|
162
|
+
|
|
163
|
+
export {
|
|
164
|
+
installRuntimeWorkroomCallbacks,
|
|
165
|
+
type InstallRuntimeWorkroomCallbacksOptions,
|
|
166
|
+
type RuntimeWorkroomCallbackDependencies,
|
|
167
|
+
type RuntimeWorkroomCallbackInstallation,
|
|
168
|
+
type RuntimeWorkroomCallbackRecoverySummary,
|
|
169
|
+
} from './workroom-callback-runtime.js';
|
|
170
|
+
export {
|
|
171
|
+
WorkroomA2aAuthRegistry,
|
|
172
|
+
WorkroomA2aAuthenticationError,
|
|
173
|
+
type WorkroomA2aAuthRegistryOptions,
|
|
174
|
+
type WorkroomA2aEndpointAuthoritySnapshot,
|
|
175
|
+
} from './workroom-auth-registry.js';
|
|
176
|
+
export {
|
|
177
|
+
WorkroomA2aHttpRemoteTransport,
|
|
178
|
+
type WorkroomA2aHttpRemoteTransportOptions,
|
|
179
|
+
type WorkroomA2aPinnedNetworkPort,
|
|
180
|
+
type WorkroomA2aPinnedRequest,
|
|
181
|
+
type WorkroomA2aResolvedAddress,
|
|
182
|
+
type WorkroomA2aRemoteTransportBindingInput,
|
|
183
|
+
} from './workroom-remote-transport.js';
|