@nifrajs/agent-protocol 3.3.0 → 3.5.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/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +176 -12
- package/dist/index.js.map +1 -1
- package/dist/transport-policy.d.ts +27 -0
- package/dist/transport-policy.d.ts.map +1 -0
- package/dist/transport-policy.js +81 -0
- package/dist/transport-policy.js.map +1 -0
- package/package.json +1 -1
- package/src/index.ts +214 -13
- package/src/transport-policy.ts +97 -0
package/dist/index.d.ts
CHANGED
|
@@ -217,5 +217,8 @@ export * from "./orchestration.js";
|
|
|
217
217
|
* feature negotiation, cursor resume). Additive to the session protocol; carries no payload content.
|
|
218
218
|
*/
|
|
219
219
|
export * from "./run-lifecycle.js";
|
|
220
|
+
/** Shared fail-closed byte-limit policy used by independent HTTP adapters. */
|
|
221
|
+
export * from "./transport-policy.js";
|
|
222
|
+
/** Validate the complete discriminated event union before a projection or UI consumer sees it. */
|
|
220
223
|
export declare function isAgentEvent(value: unknown): value is AgentEvent;
|
|
221
224
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -6,13 +6,16 @@
|
|
|
6
6
|
* framework, model provider, or UI code into an application.
|
|
7
7
|
*/
|
|
8
8
|
export const AGENT_PROTOCOL_VERSION = 1;
|
|
9
|
+
const MAX_AGENT_EVENT_QUEUE_SIZE = 65_536;
|
|
9
10
|
/**
|
|
10
11
|
* Small bounded event stream for RPC clients and UIs. The authoritative event history belongs to
|
|
11
12
|
* the backend/session store; this live view may drop old transient events if a consumer falls behind.
|
|
12
13
|
*/
|
|
13
14
|
export function createAgentEventStream(maxQueueSize = 256) {
|
|
14
|
-
if (!Number.isSafeInteger(maxQueueSize) ||
|
|
15
|
-
|
|
15
|
+
if (!Number.isSafeInteger(maxQueueSize) ||
|
|
16
|
+
maxQueueSize < 1 ||
|
|
17
|
+
maxQueueSize > MAX_AGENT_EVENT_QUEUE_SIZE)
|
|
18
|
+
throw new RangeError(`agent event stream: maxQueueSize must be between 1 and ${MAX_AGENT_EVENT_QUEUE_SIZE}`);
|
|
16
19
|
const queue = [];
|
|
17
20
|
const waiters = [];
|
|
18
21
|
let completed = false;
|
|
@@ -96,17 +99,178 @@ export * from "./orchestration.js";
|
|
|
96
99
|
* feature negotiation, cursor resume). Additive to the session protocol; carries no payload content.
|
|
97
100
|
*/
|
|
98
101
|
export * from "./run-lifecycle.js";
|
|
102
|
+
/** Shared fail-closed byte-limit policy used by independent HTTP adapters. */
|
|
103
|
+
export * from "./transport-policy.js";
|
|
104
|
+
const AGENT_TOKEN_RE = /^[A-Za-z0-9._:/-]{1,128}$/;
|
|
105
|
+
const AGENT_MAX_TEXT = 256 * 1024;
|
|
106
|
+
const AGENT_MAX_PAYLOAD_TEXT = 64 * 1024;
|
|
107
|
+
const AGENT_MAX_ARRAY = 256;
|
|
108
|
+
const AGENT_MAX_OBJECT_KEYS = 256;
|
|
109
|
+
const AGENT_MAX_PAYLOAD_DEPTH = 6;
|
|
110
|
+
const AGENT_STATUSES = new Set([
|
|
111
|
+
"idle",
|
|
112
|
+
"running",
|
|
113
|
+
"waiting",
|
|
114
|
+
"completed",
|
|
115
|
+
"failed",
|
|
116
|
+
"stopped",
|
|
117
|
+
]);
|
|
118
|
+
const AGENT_COMPACTION_REASONS = new Set([
|
|
119
|
+
"manual",
|
|
120
|
+
"threshold",
|
|
121
|
+
"overflow",
|
|
122
|
+
"workflow",
|
|
123
|
+
]);
|
|
124
|
+
function agentRecord(value) {
|
|
125
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
126
|
+
}
|
|
127
|
+
function agentToken(value) {
|
|
128
|
+
return typeof value === "string" && AGENT_TOKEN_RE.test(value);
|
|
129
|
+
}
|
|
130
|
+
function agentText(value, max = AGENT_MAX_TEXT, allowEmpty = true) {
|
|
131
|
+
return (typeof value === "string" &&
|
|
132
|
+
value.length <= max &&
|
|
133
|
+
(allowEmpty || value.length > 0) &&
|
|
134
|
+
!value.includes("\0"));
|
|
135
|
+
}
|
|
136
|
+
function agentCount(value) {
|
|
137
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
|
|
138
|
+
}
|
|
139
|
+
function boundedAgentValue(value, depth = 0, state = { remaining: 2_048 }) {
|
|
140
|
+
if (state.remaining-- <= 0 || depth > AGENT_MAX_PAYLOAD_DEPTH)
|
|
141
|
+
return false;
|
|
142
|
+
if (value === null || typeof value === "boolean")
|
|
143
|
+
return true;
|
|
144
|
+
if (typeof value === "string")
|
|
145
|
+
return agentText(value, AGENT_MAX_PAYLOAD_TEXT);
|
|
146
|
+
if (typeof value === "number")
|
|
147
|
+
return Number.isFinite(value) && Math.abs(value) <= Number.MAX_SAFE_INTEGER;
|
|
148
|
+
if (Array.isArray(value))
|
|
149
|
+
return (value.length <= AGENT_MAX_ARRAY &&
|
|
150
|
+
value.every((item) => boundedAgentValue(item, depth + 1, state)));
|
|
151
|
+
if (!agentRecord(value) || Object.keys(value).length > AGENT_MAX_OBJECT_KEYS)
|
|
152
|
+
return false;
|
|
153
|
+
return Object.entries(value).every(([key, child]) => agentText(key, 128, false) && boundedAgentValue(child, depth + 1, state));
|
|
154
|
+
}
|
|
155
|
+
function optionalBoundedAgentValue(record, key) {
|
|
156
|
+
return !Object.hasOwn(record, key) || boundedAgentValue(record[key]);
|
|
157
|
+
}
|
|
158
|
+
function validAgentError(value) {
|
|
159
|
+
if (!agentRecord(value))
|
|
160
|
+
return false;
|
|
161
|
+
return (agentToken(value.code) &&
|
|
162
|
+
agentText(value.message, AGENT_MAX_TEXT, false) &&
|
|
163
|
+
optionalBoundedAgentValue(value, "details"));
|
|
164
|
+
}
|
|
165
|
+
function validAgentSnapshot(value, sessionId) {
|
|
166
|
+
if (!agentRecord(value))
|
|
167
|
+
return false;
|
|
168
|
+
if (value.version !== AGENT_PROTOCOL_VERSION ||
|
|
169
|
+
!agentToken(value.id) ||
|
|
170
|
+
value.id !== sessionId ||
|
|
171
|
+
!agentToken(value.backend) ||
|
|
172
|
+
!agentText(value.cwd, 4_096, false) ||
|
|
173
|
+
typeof value.status !== "string" ||
|
|
174
|
+
!AGENT_STATUSES.has(value.status) ||
|
|
175
|
+
!agentCount(value.createdAt) ||
|
|
176
|
+
!agentCount(value.updatedAt) ||
|
|
177
|
+
!agentCount(value.lastSeq) ||
|
|
178
|
+
!Array.isArray(value.capabilities) ||
|
|
179
|
+
value.capabilities.length > AGENT_MAX_ARRAY ||
|
|
180
|
+
!value.capabilities.every(agentToken))
|
|
181
|
+
return false;
|
|
182
|
+
if (value.activeTurnId !== undefined && !agentToken(value.activeTurnId))
|
|
183
|
+
return false;
|
|
184
|
+
if (value.extensionRevision !== undefined && !agentToken(value.extensionRevision))
|
|
185
|
+
return false;
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
function validRepairTask(value) {
|
|
189
|
+
if (!agentRecord(value))
|
|
190
|
+
return false;
|
|
191
|
+
return (agentToken(value.id) &&
|
|
192
|
+
(value.verification === "check" ||
|
|
193
|
+
value.verification === "assure" ||
|
|
194
|
+
value.verification === "test") &&
|
|
195
|
+
agentText(value.cwd, 4_096, false) &&
|
|
196
|
+
agentText(value.reason, AGENT_MAX_TEXT, false) &&
|
|
197
|
+
Array.isArray(value.capabilities) &&
|
|
198
|
+
value.capabilities.length <= AGENT_MAX_ARRAY &&
|
|
199
|
+
value.capabilities.every(agentToken) &&
|
|
200
|
+
(value.output === undefined || agentText(value.output)) &&
|
|
201
|
+
optionalBoundedAgentValue(value, "report"));
|
|
202
|
+
}
|
|
203
|
+
/** Validate the complete discriminated event union before a projection or UI consumer sees it. */
|
|
99
204
|
export function isAgentEvent(value) {
|
|
100
|
-
if (
|
|
205
|
+
if (!agentRecord(value))
|
|
206
|
+
return false;
|
|
207
|
+
if (value.version !== AGENT_PROTOCOL_VERSION ||
|
|
208
|
+
!agentToken(value.sessionId) ||
|
|
209
|
+
!agentCount(value.seq) ||
|
|
210
|
+
!agentCount(value.at) ||
|
|
211
|
+
typeof value.type !== "string")
|
|
101
212
|
return false;
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
213
|
+
switch (value.type) {
|
|
214
|
+
case "session.started":
|
|
215
|
+
case "session.updated":
|
|
216
|
+
case "session.completed":
|
|
217
|
+
return validAgentSnapshot(value.snapshot, value.sessionId);
|
|
218
|
+
case "turn.started":
|
|
219
|
+
return agentToken(value.turnId) && agentText(value.prompt);
|
|
220
|
+
case "assistant.delta":
|
|
221
|
+
case "assistant.message":
|
|
222
|
+
return agentToken(value.turnId) && agentText(value.text);
|
|
223
|
+
case "tool.started":
|
|
224
|
+
return (agentToken(value.turnId) &&
|
|
225
|
+
agentToken(value.callId) &&
|
|
226
|
+
agentToken(value.name) &&
|
|
227
|
+
optionalBoundedAgentValue(value, "input"));
|
|
228
|
+
case "tool.delta":
|
|
229
|
+
return agentToken(value.turnId) && agentToken(value.callId) && agentText(value.text);
|
|
230
|
+
case "tool.completed":
|
|
231
|
+
return (agentToken(value.turnId) &&
|
|
232
|
+
agentToken(value.callId) &&
|
|
233
|
+
agentToken(value.name) &&
|
|
234
|
+
typeof value.ok === "boolean" &&
|
|
235
|
+
optionalBoundedAgentValue(value, "output") &&
|
|
236
|
+
(value.error === undefined || validAgentError(value.error)));
|
|
237
|
+
case "approval.required":
|
|
238
|
+
return (agentToken(value.turnId) &&
|
|
239
|
+
agentToken(value.approvalId) &&
|
|
240
|
+
agentText(value.action, AGENT_MAX_TEXT, false) &&
|
|
241
|
+
agentToken(value.capability) &&
|
|
242
|
+
(value.reason === undefined || agentText(value.reason)));
|
|
243
|
+
case "approval.resolved":
|
|
244
|
+
return ((value.turnId === undefined || agentToken(value.turnId)) &&
|
|
245
|
+
agentToken(value.approvalId) &&
|
|
246
|
+
typeof value.approved === "boolean" &&
|
|
247
|
+
(value.reason === undefined || agentText(value.reason)));
|
|
248
|
+
case "repair.required":
|
|
249
|
+
return (value.turnId === undefined || agentToken(value.turnId)) && validRepairTask(value.task);
|
|
250
|
+
case "verification.completed":
|
|
251
|
+
return ((value.name === "check" || value.name === "assure" || value.name === "test") &&
|
|
252
|
+
typeof value.ok === "boolean" &&
|
|
253
|
+
optionalBoundedAgentValue(value, "report"));
|
|
254
|
+
case "memory.compacted":
|
|
255
|
+
return (agentCount(value.before) &&
|
|
256
|
+
agentCount(value.after) &&
|
|
257
|
+
typeof value.reason === "string" &&
|
|
258
|
+
AGENT_COMPACTION_REASONS.has(value.reason));
|
|
259
|
+
case "extension.reloaded":
|
|
260
|
+
return (agentToken(value.revision) &&
|
|
261
|
+
Array.isArray(value.loaded) &&
|
|
262
|
+
value.loaded.length <= AGENT_MAX_ARRAY &&
|
|
263
|
+
value.loaded.every(agentToken) &&
|
|
264
|
+
Array.isArray(value.disabled) &&
|
|
265
|
+
value.disabled.length <= AGENT_MAX_ARRAY &&
|
|
266
|
+
value.disabled.every(agentToken) &&
|
|
267
|
+
typeof value.rolledBack === "boolean");
|
|
268
|
+
case "session.failed":
|
|
269
|
+
return validAgentError(value.error) && typeof value.recoverable === "boolean";
|
|
270
|
+
case "session.stopped":
|
|
271
|
+
return value.reason === undefined || agentText(value.reason);
|
|
272
|
+
default:
|
|
273
|
+
return false;
|
|
274
|
+
}
|
|
111
275
|
}
|
|
112
276
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAU,CAAA;AAgShD;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,YAAY,GAAG,GAAG;IACvD,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Protocol-neutral byte limits for HTTP adapters.
|
|
3
|
+
*
|
|
4
|
+
* MCP's HTTP server and the Agent App browser transport have different wire protocols, but both need
|
|
5
|
+
* the same fail-closed rules when reading an untrusted stream. Keeping this small policy here avoids
|
|
6
|
+
* coupling either adapter to the other while making the limit and cancellation semantics identical.
|
|
7
|
+
*/
|
|
8
|
+
export declare const MAX_TRANSPORT_BYTES: number;
|
|
9
|
+
export interface TransportByteLimitOptions {
|
|
10
|
+
readonly minimum?: number;
|
|
11
|
+
readonly maximum?: number;
|
|
12
|
+
readonly label?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function assertTransportByteLimit(value: number, options?: TransportByteLimitOptions): void;
|
|
15
|
+
/** Parse a decimal Content-Length without allowing malformed or unsafe values to pass as a size. */
|
|
16
|
+
export declare function parseTransportContentLength(value: string | null): number | undefined;
|
|
17
|
+
export type BoundedTransportRead = {
|
|
18
|
+
readonly ok: true;
|
|
19
|
+
readonly bytes: Uint8Array;
|
|
20
|
+
} | {
|
|
21
|
+
readonly ok: false;
|
|
22
|
+
readonly reason: "too-large" | "read-error";
|
|
23
|
+
readonly error?: unknown;
|
|
24
|
+
};
|
|
25
|
+
/** Read a Web stream under one byte cap, canceling the source as soon as the cap is exceeded. */
|
|
26
|
+
export declare function readBoundedTransportBytes(body: ReadableStream<Uint8Array>, maxBytes: number): Promise<BoundedTransportRead>;
|
|
27
|
+
//# sourceMappingURL=transport-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-policy.d.ts","sourceRoot":"","sources":["../src/transport-policy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,mBAAmB,QAAmB,CAAA;AAEnD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,yBAA8B,GACtC,IAAI,CAgBN;AAED,oGAAoG;AACpG,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAUpF;AAED,MAAM,MAAM,oBAAoB,GAC5B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GACjD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,YAAY,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAEjG,iGAAiG;AACjG,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,EAChC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,CAAC,CAsC/B"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Protocol-neutral byte limits for HTTP adapters.
|
|
3
|
+
*
|
|
4
|
+
* MCP's HTTP server and the Agent App browser transport have different wire protocols, but both need
|
|
5
|
+
* the same fail-closed rules when reading an untrusted stream. Keeping this small policy here avoids
|
|
6
|
+
* coupling either adapter to the other while making the limit and cancellation semantics identical.
|
|
7
|
+
*/
|
|
8
|
+
export const MAX_TRANSPORT_BYTES = 64 * 1024 * 1024;
|
|
9
|
+
export function assertTransportByteLimit(value, options = {}) {
|
|
10
|
+
const minimum = options.minimum ?? 0;
|
|
11
|
+
const maximum = options.maximum ?? MAX_TRANSPORT_BYTES;
|
|
12
|
+
if (!Number.isSafeInteger(value) ||
|
|
13
|
+
!Number.isSafeInteger(minimum) ||
|
|
14
|
+
!Number.isSafeInteger(maximum) ||
|
|
15
|
+
minimum < 0 ||
|
|
16
|
+
maximum < minimum ||
|
|
17
|
+
value < minimum ||
|
|
18
|
+
value > maximum) {
|
|
19
|
+
throw new RangeError(`${options.label ?? "transport byte limit"} must be between ${minimum} and ${maximum}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** Parse a decimal Content-Length without allowing malformed or unsafe values to pass as a size. */
|
|
23
|
+
export function parseTransportContentLength(value) {
|
|
24
|
+
if (value === null || value.length === 0)
|
|
25
|
+
return undefined;
|
|
26
|
+
let length = 0;
|
|
27
|
+
for (let index = 0; index < value.length; index++) {
|
|
28
|
+
const digit = value.charCodeAt(index) - 48;
|
|
29
|
+
if (digit < 0 || digit > 9)
|
|
30
|
+
return undefined;
|
|
31
|
+
length = length * 10 + digit;
|
|
32
|
+
if (!Number.isSafeInteger(length))
|
|
33
|
+
return Number.POSITIVE_INFINITY;
|
|
34
|
+
}
|
|
35
|
+
return length;
|
|
36
|
+
}
|
|
37
|
+
/** Read a Web stream under one byte cap, canceling the source as soon as the cap is exceeded. */
|
|
38
|
+
export async function readBoundedTransportBytes(body, maxBytes) {
|
|
39
|
+
assertTransportByteLimit(maxBytes);
|
|
40
|
+
const reader = body.getReader();
|
|
41
|
+
const chunks = [];
|
|
42
|
+
let total = 0;
|
|
43
|
+
try {
|
|
44
|
+
for (;;) {
|
|
45
|
+
const { done, value } = await reader.read();
|
|
46
|
+
if (done)
|
|
47
|
+
break;
|
|
48
|
+
if (value === undefined || value.byteLength > maxBytes - total) {
|
|
49
|
+
try {
|
|
50
|
+
await reader.cancel();
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Preserve the bounded-read result if the source has already closed.
|
|
54
|
+
}
|
|
55
|
+
return { ok: false, reason: "too-large" };
|
|
56
|
+
}
|
|
57
|
+
total += value.byteLength;
|
|
58
|
+
chunks.push(value);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
try {
|
|
63
|
+
await reader.cancel();
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Preserve the original stream error classification.
|
|
67
|
+
}
|
|
68
|
+
return { ok: false, reason: "read-error", error };
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
reader.releaseLock();
|
|
72
|
+
}
|
|
73
|
+
const bytes = new Uint8Array(total);
|
|
74
|
+
let offset = 0;
|
|
75
|
+
for (const chunk of chunks) {
|
|
76
|
+
bytes.set(chunk, offset);
|
|
77
|
+
offset += chunk.byteLength;
|
|
78
|
+
}
|
|
79
|
+
return { ok: true, bytes };
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=transport-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-policy.js","sourceRoot":"","sources":["../src/transport-policy.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -294,13 +294,21 @@ export interface AgentEventStream extends AgentEventSink, AsyncIterableIterator<
|
|
|
294
294
|
readonly dropped: number
|
|
295
295
|
}
|
|
296
296
|
|
|
297
|
+
const MAX_AGENT_EVENT_QUEUE_SIZE = 65_536
|
|
298
|
+
|
|
297
299
|
/**
|
|
298
300
|
* Small bounded event stream for RPC clients and UIs. The authoritative event history belongs to
|
|
299
301
|
* the backend/session store; this live view may drop old transient events if a consumer falls behind.
|
|
300
302
|
*/
|
|
301
303
|
export function createAgentEventStream(maxQueueSize = 256): AgentEventStream {
|
|
302
|
-
if (
|
|
303
|
-
|
|
304
|
+
if (
|
|
305
|
+
!Number.isSafeInteger(maxQueueSize) ||
|
|
306
|
+
maxQueueSize < 1 ||
|
|
307
|
+
maxQueueSize > MAX_AGENT_EVENT_QUEUE_SIZE
|
|
308
|
+
)
|
|
309
|
+
throw new RangeError(
|
|
310
|
+
`agent event stream: maxQueueSize must be between 1 and ${MAX_AGENT_EVENT_QUEUE_SIZE}`,
|
|
311
|
+
)
|
|
304
312
|
|
|
305
313
|
const queue: AgentEvent[] = []
|
|
306
314
|
const waiters: Array<{
|
|
@@ -389,17 +397,210 @@ export * from "./orchestration.ts"
|
|
|
389
397
|
*/
|
|
390
398
|
export * from "./run-lifecycle.ts"
|
|
391
399
|
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
400
|
+
/** Shared fail-closed byte-limit policy used by independent HTTP adapters. */
|
|
401
|
+
export * from "./transport-policy.ts"
|
|
402
|
+
|
|
403
|
+
const AGENT_TOKEN_RE = /^[A-Za-z0-9._:/-]{1,128}$/
|
|
404
|
+
const AGENT_MAX_TEXT = 256 * 1024
|
|
405
|
+
const AGENT_MAX_PAYLOAD_TEXT = 64 * 1024
|
|
406
|
+
const AGENT_MAX_ARRAY = 256
|
|
407
|
+
const AGENT_MAX_OBJECT_KEYS = 256
|
|
408
|
+
const AGENT_MAX_PAYLOAD_DEPTH = 6
|
|
409
|
+
const AGENT_STATUSES: ReadonlySet<string> = new Set([
|
|
410
|
+
"idle",
|
|
411
|
+
"running",
|
|
412
|
+
"waiting",
|
|
413
|
+
"completed",
|
|
414
|
+
"failed",
|
|
415
|
+
"stopped",
|
|
416
|
+
])
|
|
417
|
+
const AGENT_COMPACTION_REASONS: ReadonlySet<string> = new Set([
|
|
418
|
+
"manual",
|
|
419
|
+
"threshold",
|
|
420
|
+
"overflow",
|
|
421
|
+
"workflow",
|
|
422
|
+
])
|
|
423
|
+
|
|
424
|
+
function agentRecord(value: unknown): value is Record<string, unknown> {
|
|
425
|
+
return value !== null && typeof value === "object" && !Array.isArray(value)
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
function agentToken(value: unknown): value is string {
|
|
429
|
+
return typeof value === "string" && AGENT_TOKEN_RE.test(value)
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
function agentText(value: unknown, max = AGENT_MAX_TEXT, allowEmpty = true): value is string {
|
|
433
|
+
return (
|
|
434
|
+
typeof value === "string" &&
|
|
435
|
+
value.length <= max &&
|
|
436
|
+
(allowEmpty || value.length > 0) &&
|
|
437
|
+
!value.includes("\0")
|
|
438
|
+
)
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
function agentCount(value: unknown): value is number {
|
|
442
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
function boundedAgentValue(
|
|
446
|
+
value: unknown,
|
|
447
|
+
depth = 0,
|
|
448
|
+
state: { remaining: number } = { remaining: 2_048 },
|
|
449
|
+
): boolean {
|
|
450
|
+
if (state.remaining-- <= 0 || depth > AGENT_MAX_PAYLOAD_DEPTH) return false
|
|
451
|
+
if (value === null || typeof value === "boolean") return true
|
|
452
|
+
if (typeof value === "string") return agentText(value, AGENT_MAX_PAYLOAD_TEXT)
|
|
453
|
+
if (typeof value === "number")
|
|
454
|
+
return Number.isFinite(value) && Math.abs(value) <= Number.MAX_SAFE_INTEGER
|
|
455
|
+
if (Array.isArray(value))
|
|
456
|
+
return (
|
|
457
|
+
value.length <= AGENT_MAX_ARRAY &&
|
|
458
|
+
value.every((item) => boundedAgentValue(item, depth + 1, state))
|
|
459
|
+
)
|
|
460
|
+
if (!agentRecord(value) || Object.keys(value).length > AGENT_MAX_OBJECT_KEYS) return false
|
|
461
|
+
return Object.entries(value).every(
|
|
462
|
+
([key, child]) => agentText(key, 128, false) && boundedAgentValue(child, depth + 1, state),
|
|
463
|
+
)
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
function optionalBoundedAgentValue(record: Record<string, unknown>, key: string): boolean {
|
|
467
|
+
return !Object.hasOwn(record, key) || boundedAgentValue(record[key])
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
function validAgentError(value: unknown): boolean {
|
|
471
|
+
if (!agentRecord(value)) return false
|
|
395
472
|
return (
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
Number.isSafeInteger(record.seq) &&
|
|
400
|
-
typeof record.at === "number" &&
|
|
401
|
-
Number.isFinite(record.at) &&
|
|
402
|
-
typeof record.type === "string" &&
|
|
403
|
-
record.type.includes(".")
|
|
473
|
+
agentToken(value.code) &&
|
|
474
|
+
agentText(value.message, AGENT_MAX_TEXT, false) &&
|
|
475
|
+
optionalBoundedAgentValue(value, "details")
|
|
404
476
|
)
|
|
405
477
|
}
|
|
478
|
+
|
|
479
|
+
function validAgentSnapshot(value: unknown, sessionId: string): value is AgentSessionSnapshot {
|
|
480
|
+
if (!agentRecord(value)) return false
|
|
481
|
+
if (
|
|
482
|
+
value.version !== AGENT_PROTOCOL_VERSION ||
|
|
483
|
+
!agentToken(value.id) ||
|
|
484
|
+
value.id !== sessionId ||
|
|
485
|
+
!agentToken(value.backend) ||
|
|
486
|
+
!agentText(value.cwd, 4_096, false) ||
|
|
487
|
+
typeof value.status !== "string" ||
|
|
488
|
+
!AGENT_STATUSES.has(value.status) ||
|
|
489
|
+
!agentCount(value.createdAt) ||
|
|
490
|
+
!agentCount(value.updatedAt) ||
|
|
491
|
+
!agentCount(value.lastSeq) ||
|
|
492
|
+
!Array.isArray(value.capabilities) ||
|
|
493
|
+
value.capabilities.length > AGENT_MAX_ARRAY ||
|
|
494
|
+
!value.capabilities.every(agentToken)
|
|
495
|
+
)
|
|
496
|
+
return false
|
|
497
|
+
if (value.activeTurnId !== undefined && !agentToken(value.activeTurnId)) return false
|
|
498
|
+
if (value.extensionRevision !== undefined && !agentToken(value.extensionRevision)) return false
|
|
499
|
+
return true
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
function validRepairTask(value: unknown): boolean {
|
|
503
|
+
if (!agentRecord(value)) return false
|
|
504
|
+
return (
|
|
505
|
+
agentToken(value.id) &&
|
|
506
|
+
(value.verification === "check" ||
|
|
507
|
+
value.verification === "assure" ||
|
|
508
|
+
value.verification === "test") &&
|
|
509
|
+
agentText(value.cwd, 4_096, false) &&
|
|
510
|
+
agentText(value.reason, AGENT_MAX_TEXT, false) &&
|
|
511
|
+
Array.isArray(value.capabilities) &&
|
|
512
|
+
value.capabilities.length <= AGENT_MAX_ARRAY &&
|
|
513
|
+
value.capabilities.every(agentToken) &&
|
|
514
|
+
(value.output === undefined || agentText(value.output)) &&
|
|
515
|
+
optionalBoundedAgentValue(value, "report")
|
|
516
|
+
)
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
/** Validate the complete discriminated event union before a projection or UI consumer sees it. */
|
|
520
|
+
export function isAgentEvent(value: unknown): value is AgentEvent {
|
|
521
|
+
if (!agentRecord(value)) return false
|
|
522
|
+
if (
|
|
523
|
+
value.version !== AGENT_PROTOCOL_VERSION ||
|
|
524
|
+
!agentToken(value.sessionId) ||
|
|
525
|
+
!agentCount(value.seq) ||
|
|
526
|
+
!agentCount(value.at) ||
|
|
527
|
+
typeof value.type !== "string"
|
|
528
|
+
)
|
|
529
|
+
return false
|
|
530
|
+
switch (value.type) {
|
|
531
|
+
case "session.started":
|
|
532
|
+
case "session.updated":
|
|
533
|
+
case "session.completed":
|
|
534
|
+
return validAgentSnapshot(value.snapshot, value.sessionId)
|
|
535
|
+
case "turn.started":
|
|
536
|
+
return agentToken(value.turnId) && agentText(value.prompt)
|
|
537
|
+
case "assistant.delta":
|
|
538
|
+
case "assistant.message":
|
|
539
|
+
return agentToken(value.turnId) && agentText(value.text)
|
|
540
|
+
case "tool.started":
|
|
541
|
+
return (
|
|
542
|
+
agentToken(value.turnId) &&
|
|
543
|
+
agentToken(value.callId) &&
|
|
544
|
+
agentToken(value.name) &&
|
|
545
|
+
optionalBoundedAgentValue(value, "input")
|
|
546
|
+
)
|
|
547
|
+
case "tool.delta":
|
|
548
|
+
return agentToken(value.turnId) && agentToken(value.callId) && agentText(value.text)
|
|
549
|
+
case "tool.completed":
|
|
550
|
+
return (
|
|
551
|
+
agentToken(value.turnId) &&
|
|
552
|
+
agentToken(value.callId) &&
|
|
553
|
+
agentToken(value.name) &&
|
|
554
|
+
typeof value.ok === "boolean" &&
|
|
555
|
+
optionalBoundedAgentValue(value, "output") &&
|
|
556
|
+
(value.error === undefined || validAgentError(value.error))
|
|
557
|
+
)
|
|
558
|
+
case "approval.required":
|
|
559
|
+
return (
|
|
560
|
+
agentToken(value.turnId) &&
|
|
561
|
+
agentToken(value.approvalId) &&
|
|
562
|
+
agentText(value.action, AGENT_MAX_TEXT, false) &&
|
|
563
|
+
agentToken(value.capability) &&
|
|
564
|
+
(value.reason === undefined || agentText(value.reason))
|
|
565
|
+
)
|
|
566
|
+
case "approval.resolved":
|
|
567
|
+
return (
|
|
568
|
+
(value.turnId === undefined || agentToken(value.turnId)) &&
|
|
569
|
+
agentToken(value.approvalId) &&
|
|
570
|
+
typeof value.approved === "boolean" &&
|
|
571
|
+
(value.reason === undefined || agentText(value.reason))
|
|
572
|
+
)
|
|
573
|
+
case "repair.required":
|
|
574
|
+
return (value.turnId === undefined || agentToken(value.turnId)) && validRepairTask(value.task)
|
|
575
|
+
case "verification.completed":
|
|
576
|
+
return (
|
|
577
|
+
(value.name === "check" || value.name === "assure" || value.name === "test") &&
|
|
578
|
+
typeof value.ok === "boolean" &&
|
|
579
|
+
optionalBoundedAgentValue(value, "report")
|
|
580
|
+
)
|
|
581
|
+
case "memory.compacted":
|
|
582
|
+
return (
|
|
583
|
+
agentCount(value.before) &&
|
|
584
|
+
agentCount(value.after) &&
|
|
585
|
+
typeof value.reason === "string" &&
|
|
586
|
+
AGENT_COMPACTION_REASONS.has(value.reason)
|
|
587
|
+
)
|
|
588
|
+
case "extension.reloaded":
|
|
589
|
+
return (
|
|
590
|
+
agentToken(value.revision) &&
|
|
591
|
+
Array.isArray(value.loaded) &&
|
|
592
|
+
value.loaded.length <= AGENT_MAX_ARRAY &&
|
|
593
|
+
value.loaded.every(agentToken) &&
|
|
594
|
+
Array.isArray(value.disabled) &&
|
|
595
|
+
value.disabled.length <= AGENT_MAX_ARRAY &&
|
|
596
|
+
value.disabled.every(agentToken) &&
|
|
597
|
+
typeof value.rolledBack === "boolean"
|
|
598
|
+
)
|
|
599
|
+
case "session.failed":
|
|
600
|
+
return validAgentError(value.error) && typeof value.recoverable === "boolean"
|
|
601
|
+
case "session.stopped":
|
|
602
|
+
return value.reason === undefined || agentText(value.reason)
|
|
603
|
+
default:
|
|
604
|
+
return false
|
|
605
|
+
}
|
|
606
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Protocol-neutral byte limits for HTTP adapters.
|
|
3
|
+
*
|
|
4
|
+
* MCP's HTTP server and the Agent App browser transport have different wire protocols, but both need
|
|
5
|
+
* the same fail-closed rules when reading an untrusted stream. Keeping this small policy here avoids
|
|
6
|
+
* coupling either adapter to the other while making the limit and cancellation semantics identical.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export const MAX_TRANSPORT_BYTES = 64 * 1024 * 1024
|
|
10
|
+
|
|
11
|
+
export interface TransportByteLimitOptions {
|
|
12
|
+
readonly minimum?: number
|
|
13
|
+
readonly maximum?: number
|
|
14
|
+
readonly label?: string
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function assertTransportByteLimit(
|
|
18
|
+
value: number,
|
|
19
|
+
options: TransportByteLimitOptions = {},
|
|
20
|
+
): void {
|
|
21
|
+
const minimum = options.minimum ?? 0
|
|
22
|
+
const maximum = options.maximum ?? MAX_TRANSPORT_BYTES
|
|
23
|
+
if (
|
|
24
|
+
!Number.isSafeInteger(value) ||
|
|
25
|
+
!Number.isSafeInteger(minimum) ||
|
|
26
|
+
!Number.isSafeInteger(maximum) ||
|
|
27
|
+
minimum < 0 ||
|
|
28
|
+
maximum < minimum ||
|
|
29
|
+
value < minimum ||
|
|
30
|
+
value > maximum
|
|
31
|
+
) {
|
|
32
|
+
throw new RangeError(
|
|
33
|
+
`${options.label ?? "transport byte limit"} must be between ${minimum} and ${maximum}`,
|
|
34
|
+
)
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Parse a decimal Content-Length without allowing malformed or unsafe values to pass as a size. */
|
|
39
|
+
export function parseTransportContentLength(value: string | null): number | undefined {
|
|
40
|
+
if (value === null || value.length === 0) return undefined
|
|
41
|
+
let length = 0
|
|
42
|
+
for (let index = 0; index < value.length; index++) {
|
|
43
|
+
const digit = value.charCodeAt(index) - 48
|
|
44
|
+
if (digit < 0 || digit > 9) return undefined
|
|
45
|
+
length = length * 10 + digit
|
|
46
|
+
if (!Number.isSafeInteger(length)) return Number.POSITIVE_INFINITY
|
|
47
|
+
}
|
|
48
|
+
return length
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export type BoundedTransportRead =
|
|
52
|
+
| { readonly ok: true; readonly bytes: Uint8Array }
|
|
53
|
+
| { readonly ok: false; readonly reason: "too-large" | "read-error"; readonly error?: unknown }
|
|
54
|
+
|
|
55
|
+
/** Read a Web stream under one byte cap, canceling the source as soon as the cap is exceeded. */
|
|
56
|
+
export async function readBoundedTransportBytes(
|
|
57
|
+
body: ReadableStream<Uint8Array>,
|
|
58
|
+
maxBytes: number,
|
|
59
|
+
): Promise<BoundedTransportRead> {
|
|
60
|
+
assertTransportByteLimit(maxBytes)
|
|
61
|
+
const reader = body.getReader()
|
|
62
|
+
const chunks: Uint8Array[] = []
|
|
63
|
+
let total = 0
|
|
64
|
+
try {
|
|
65
|
+
for (;;) {
|
|
66
|
+
const { done, value } = await reader.read()
|
|
67
|
+
if (done) break
|
|
68
|
+
if (value === undefined || value.byteLength > maxBytes - total) {
|
|
69
|
+
try {
|
|
70
|
+
await reader.cancel()
|
|
71
|
+
} catch {
|
|
72
|
+
// Preserve the bounded-read result if the source has already closed.
|
|
73
|
+
}
|
|
74
|
+
return { ok: false, reason: "too-large" }
|
|
75
|
+
}
|
|
76
|
+
total += value.byteLength
|
|
77
|
+
chunks.push(value)
|
|
78
|
+
}
|
|
79
|
+
} catch (error) {
|
|
80
|
+
try {
|
|
81
|
+
await reader.cancel()
|
|
82
|
+
} catch {
|
|
83
|
+
// Preserve the original stream error classification.
|
|
84
|
+
}
|
|
85
|
+
return { ok: false, reason: "read-error", error }
|
|
86
|
+
} finally {
|
|
87
|
+
reader.releaseLock()
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const bytes = new Uint8Array(total)
|
|
91
|
+
let offset = 0
|
|
92
|
+
for (const chunk of chunks) {
|
|
93
|
+
bytes.set(chunk, offset)
|
|
94
|
+
offset += chunk.byteLength
|
|
95
|
+
}
|
|
96
|
+
return { ok: true, bytes }
|
|
97
|
+
}
|