@agents24/client 0.1.0 → 0.2.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # `@agents24/client`
2
2
 
3
- Last Updated: 2026-07-16
3
+ Last Updated: 2026-07-19
4
4
 
5
5
  Framework-neutral end-user runtime client for one deployment-scoped Agents24 Agent. It supports public client sessions, authenticated streaming, durable reconnect, threads, attachments, HITL, and MCP without accepting organization API keys.
6
6
 
@@ -30,6 +30,10 @@ Use `createManagedSessionProvider` when a trusted backend mints a session after
30
30
 
31
31
  The client also exposes threads, thread-summary events, run attach/cancel, attachments, HITL resume, MCP authorization, refresh, and revoke. Aborting a stream detaches locally; call `client.runs.cancel` for durable cancellation.
32
32
 
33
+ ## Same-origin BFF
34
+
35
+ `@agents24/client/bff` exposes `createBffAgentClient({ basePath })`, an `AgentClient` implementation for a customer-owned same-origin BFF. It covers the complete chat lifecycle, uses same-origin credentials, and accepts only an absolute path such as `/api/agents24`. Pair it with `createAgents24BffHandler` from `@agents24/node/bff`; use `npm create agents24-app@latest` for the complete React/Vite setup.
36
+
33
37
  `compatibility.json` contains the exact generated contract hash, protocol versions, peers, and target operation counts. Do not infer compatibility from semver alone.
34
38
 
35
39
  ## Runtime status
@@ -1,5 +1,5 @@
1
1
  {
2
- "contractHash": "de2b507f5d56de2bf7c4d6739c03617c4b4feef6ae827aaaac5f1d6150ec678e",
2
+ "contractHash": "90a64d2df2facc3c4510edc7a0762cb86a336578667d3bc6cfeb7ae035133e00",
3
3
  "contractVersion": "0.2.0",
4
4
  "corpus": "conformance/v1/corpus.json",
5
5
  "generatedBy": "@agents24/sdk-contract",
@@ -15,11 +15,11 @@
15
15
  "reactDom": ">=19 <20"
16
16
  },
17
17
  "@agents24/client": {
18
- "contract": "de2b507f5d56de2bf7c4d6739c03617c4b4feef6ae827aaaac5f1d6150ec678e",
18
+ "contract": "90a64d2df2facc3c4510edc7a0762cb86a336578667d3bc6cfeb7ae035133e00",
19
19
  "runtime": "run-stream.v2"
20
20
  },
21
21
  "@agents24/node": {
22
- "contract": "de2b507f5d56de2bf7c4d6739c03617c4b4feef6ae827aaaac5f1d6150ec678e",
22
+ "contract": "90a64d2df2facc3c4510edc7a0762cb86a336578667d3bc6cfeb7ae035133e00",
23
23
  "node": "^22.0.0 || ^24.0.0"
24
24
  },
25
25
  "@agents24/react": {
@@ -27,11 +27,11 @@
27
27
  "react": ">=19 <20"
28
28
  },
29
29
  "@talmudpedia/runtime-sdk": {
30
- "contract": "de2b507f5d56de2bf7c4d6739c03617c4b4feef6ae827aaaac5f1d6150ec678e",
30
+ "contract": "90a64d2df2facc3c4510edc7a0762cb86a336578667d3bc6cfeb7ae035133e00",
31
31
  "protocolOwner": "@agents24/client"
32
32
  },
33
33
  "agents24": {
34
- "contract": "de2b507f5d56de2bf7c4d6739c03617c4b4feef6ae827aaaac5f1d6150ec678e",
34
+ "contract": "90a64d2df2facc3c4510edc7a0762cb86a336578667d3bc6cfeb7ae035133e00",
35
35
  "python": ">=3.10"
36
36
  }
37
37
  },
@@ -48,7 +48,7 @@
48
48
  "schemaVersion": "agents24.compatibility.v1",
49
49
  "targetOperationCounts": {
50
50
  "client": 19,
51
- "node": 55,
51
+ "node": 60,
52
52
  "python": 55
53
53
  }
54
54
  }
@@ -1,5 +1,6 @@
1
- import { createAgents24Client } from '../chunk-45ITVMX3.js';
2
- import '../chunk-VVLMMNXI.js';
1
+ import { createAgents24Client } from '../chunk-QAIOKNUK.js';
2
+ import '../chunk-SCZMUBXD.js';
3
+ import '../chunk-NGZUJ3YT.js';
3
4
 
4
5
  // src/adapters/browser.ts
5
6
  var runtimeAdapter = "browser";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/adapters/browser.ts"],"names":[],"mappings":";;;;AAGO,IAAM,cAAA,GAAiB;AAEvB,SAAS,yBAAyB,OAAA,EAA6C;AACpF,EAAA,OAAO,qBAAqB,OAAO,CAAA;AACrC","file":"browser.js","sourcesContent":["import { createAgents24Client } from \"../client.js\";\nimport type { AgentClient, Agents24ClientOptions } from \"../types.js\";\n\nexport const runtimeAdapter = \"browser\" as const;\n\nexport function createBrowserAgentClient(options: Agents24ClientOptions): AgentClient {\n return createAgents24Client(options);\n}\n"]}
1
+ {"version":3,"sources":["../../src/adapters/browser.ts"],"names":[],"mappings":";;;;;AAGO,IAAM,cAAA,GAAiB;AAEvB,SAAS,yBAAyB,OAAA,EAA6C;AACpF,EAAA,OAAO,qBAAqB,OAAO,CAAA;AACrC","file":"browser.js","sourcesContent":["import { createAgents24Client } from \"../client.js\";\nimport type { AgentClient, Agents24ClientOptions } from \"../types.js\";\n\nexport const runtimeAdapter = \"browser\" as const;\n\nexport function createBrowserAgentClient(options: Agents24ClientOptions): AgentClient {\n return createAgents24Client(options);\n}\n"]}
@@ -1,5 +1,6 @@
1
- import { createAgents24Client } from '../chunk-45ITVMX3.js';
2
- import '../chunk-VVLMMNXI.js';
1
+ import { createAgents24Client } from '../chunk-QAIOKNUK.js';
2
+ import '../chunk-SCZMUBXD.js';
3
+ import '../chunk-NGZUJ3YT.js';
3
4
 
4
5
  // src/adapters/cloudflare.ts
5
6
  var runtimeAdapter = "cloudflare";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/adapters/cloudflare.ts"],"names":[],"mappings":";;;;AAGO,IAAM,cAAA,GAAiB;AAEvB,SAAS,4BAA4B,OAAA,EAA6C;AACvF,EAAA,OAAO,qBAAqB,OAAO,CAAA;AACrC","file":"cloudflare.js","sourcesContent":["import { createAgents24Client } from \"../client.js\";\nimport type { AgentClient, Agents24ClientOptions } from \"../types.js\";\n\nexport const runtimeAdapter = \"cloudflare\" as const;\n\nexport function createCloudflareAgentClient(options: Agents24ClientOptions): AgentClient {\n return createAgents24Client(options);\n}\n"]}
1
+ {"version":3,"sources":["../../src/adapters/cloudflare.ts"],"names":[],"mappings":";;;;;AAGO,IAAM,cAAA,GAAiB;AAEvB,SAAS,4BAA4B,OAAA,EAA6C;AACvF,EAAA,OAAO,qBAAqB,OAAO,CAAA;AACrC","file":"cloudflare.js","sourcesContent":["import { createAgents24Client } from \"../client.js\";\nimport type { AgentClient, Agents24ClientOptions } from \"../types.js\";\n\nexport const runtimeAdapter = \"cloudflare\" as const;\n\nexport function createCloudflareAgentClient(options: Agents24ClientOptions): AgentClient {\n return createAgents24Client(options);\n}\n"]}
@@ -1,5 +1,6 @@
1
- import { createAgents24Client } from '../chunk-45ITVMX3.js';
2
- import '../chunk-VVLMMNXI.js';
1
+ import { createAgents24Client } from '../chunk-QAIOKNUK.js';
2
+ import '../chunk-SCZMUBXD.js';
3
+ import '../chunk-NGZUJ3YT.js';
3
4
 
4
5
  // src/adapters/node.ts
5
6
  var runtimeAdapter = "node";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/adapters/node.ts"],"names":[],"mappings":";;;;AAGO,IAAM,cAAA,GAAiB;AAEvB,SAAS,sBAAsB,OAAA,EAA6C;AACjF,EAAA,OAAO,qBAAqB,OAAO,CAAA;AACrC","file":"node.js","sourcesContent":["import { createAgents24Client } from \"../client.js\";\nimport type { AgentClient, Agents24ClientOptions } from \"../types.js\";\n\nexport const runtimeAdapter = \"node\" as const;\n\nexport function createNodeAgentClient(options: Agents24ClientOptions): AgentClient {\n return createAgents24Client(options);\n}\n"]}
1
+ {"version":3,"sources":["../../src/adapters/node.ts"],"names":[],"mappings":";;;;;AAGO,IAAM,cAAA,GAAiB;AAEvB,SAAS,sBAAsB,OAAA,EAA6C;AACjF,EAAA,OAAO,qBAAqB,OAAO,CAAA;AACrC","file":"node.js","sourcesContent":["import { createAgents24Client } from \"../client.js\";\nimport type { AgentClient, Agents24ClientOptions } from \"../types.js\";\n\nexport const runtimeAdapter = \"node\" as const;\n\nexport function createNodeAgentClient(options: Agents24ClientOptions): AgentClient {\n return createAgents24Client(options);\n}\n"]}
@@ -1,5 +1,6 @@
1
- import { createAgents24Client } from '../chunk-45ITVMX3.js';
2
- import '../chunk-VVLMMNXI.js';
1
+ import { createAgents24Client } from '../chunk-QAIOKNUK.js';
2
+ import '../chunk-SCZMUBXD.js';
3
+ import '../chunk-NGZUJ3YT.js';
3
4
 
4
5
  // src/adapters/worker.ts
5
6
  var runtimeAdapter = "worker";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/adapters/worker.ts"],"names":[],"mappings":";;;;AAGO,IAAM,cAAA,GAAiB;AAEvB,SAAS,wBAAwB,OAAA,EAA6C;AACnF,EAAA,OAAO,qBAAqB,OAAO,CAAA;AACrC","file":"worker.js","sourcesContent":["import { createAgents24Client } from \"../client.js\";\nimport type { AgentClient, Agents24ClientOptions } from \"../types.js\";\n\nexport const runtimeAdapter = \"worker\" as const;\n\nexport function createWorkerAgentClient(options: Agents24ClientOptions): AgentClient {\n return createAgents24Client(options);\n}\n"]}
1
+ {"version":3,"sources":["../../src/adapters/worker.ts"],"names":[],"mappings":";;;;;AAGO,IAAM,cAAA,GAAiB;AAEvB,SAAS,wBAAwB,OAAA,EAA6C;AACnF,EAAA,OAAO,qBAAqB,OAAO,CAAA;AACrC","file":"worker.js","sourcesContent":["import { createAgents24Client } from \"../client.js\";\nimport type { AgentClient, Agents24ClientOptions } from \"../types.js\";\n\nexport const runtimeAdapter = \"worker\" as const;\n\nexport function createWorkerAgentClient(options: Agents24ClientOptions): AgentClient {\n return createAgents24Client(options);\n}\n"]}
package/dist/bff.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ import type { AgentClient, FetchLike, MultipartEncoder, TextDecoderLike, TextEncoderLike } from "./types.js";
2
+ export interface Agents24BffClientOptions {
3
+ basePath?: string;
4
+ fetch?: FetchLike;
5
+ decoder?: () => TextDecoderLike;
6
+ encoder?: TextEncoderLike;
7
+ multipart?: MultipartEncoder;
8
+ maxReconnectAttempts?: number;
9
+ }
10
+ export declare function createBffAgentClient(options?: Agents24BffClientOptions): AgentClient;
package/dist/bff.js ADDED
@@ -0,0 +1,253 @@
1
+ import { resolveFetch, resolveDecoderFactory, resolveEncoder, defaultIds, encodePath, createByteMultipartEncoder, appendQuery, consumeThreadSummaryStream, Agents24ClientError, responseError, responseJson, consumeRuntimeStream } from './chunk-SCZMUBXD.js';
2
+ import './chunk-NGZUJ3YT.js';
3
+
4
+ // src/bff.ts
5
+ function normalizeBasePath(value) {
6
+ const path = String(value || "/api/agents24").trim();
7
+ if (!path.startsWith("/") || /[\r\n\0?#]/.test(path)) {
8
+ throw new Agents24ClientError("basePath must be a same-origin absolute path.", {
9
+ kind: "configuration",
10
+ code: "INVALID_BFF_BASE_PATH"
11
+ });
12
+ }
13
+ return path.replace(/\/+$/, "");
14
+ }
15
+ function objectResult(value, operation) {
16
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
17
+ throw new Agents24ClientError(`${operation} returned an invalid response.`, {
18
+ kind: "protocol",
19
+ code: "INVALID_JSON_RESPONSE"
20
+ });
21
+ }
22
+ return value;
23
+ }
24
+ function shouldReconnect(error) {
25
+ return error instanceof Agents24ClientError && error.kind === "network" && error.retryable;
26
+ }
27
+ function createBffAgentClient(options = {}) {
28
+ const basePath = normalizeBasePath(options.basePath);
29
+ const fetch = resolveFetch(options.fetch);
30
+ const decoder = resolveDecoderFactory(options.decoder);
31
+ const encoder = resolveEncoder(options.encoder);
32
+ const ids = defaultIds();
33
+ const maxReconnectAttempts = Math.max(0, Math.min(options.maxReconnectAttempts ?? 3, 10));
34
+ const request = async (method, path, init = {}) => {
35
+ let response;
36
+ try {
37
+ response = await fetch(`${basePath}${path}`, {
38
+ method,
39
+ headers: {
40
+ Accept: init.accept || "application/json",
41
+ ...init.contentType ? { "Content-Type": init.contentType } : {},
42
+ ...init.idempotencyKey ? { "Idempotency-Key": init.idempotencyKey } : {}
43
+ },
44
+ ...init.body === void 0 ? {} : { body: init.body },
45
+ ...init.signal ? { signal: init.signal } : {},
46
+ credentials: "same-origin",
47
+ redirect: "error",
48
+ cache: "no-store"
49
+ });
50
+ } catch (cause) {
51
+ throw new Agents24ClientError("The Agents24 BFF could not be reached.", {
52
+ kind: init.signal?.aborted ? "aborted" : "network",
53
+ code: init.signal?.aborted ? "ABORTED" : "NETWORK_ERROR",
54
+ retryable: !init.signal?.aborted,
55
+ cause
56
+ });
57
+ }
58
+ if (!response.ok) throw await responseError(response);
59
+ return response;
60
+ };
61
+ const json = async (method, path, init = {}) => {
62
+ const body = init.body === void 0 || init.contentType ? init.body : JSON.stringify(init.body);
63
+ const response = await request(method, path, {
64
+ ...init,
65
+ ...body === void 0 ? {} : { body },
66
+ ...init.body === void 0 || init.contentType ? {} : { contentType: "application/json" }
67
+ });
68
+ return objectResult(await responseJson(response), path);
69
+ };
70
+ const attachOnce = async (runId, cursor, signal, onEvent) => {
71
+ const response = await request("POST", `/runs/${encodePath(runId)}/attach`, {
72
+ accept: "text/event-stream",
73
+ body: JSON.stringify(cursor === void 0 ? {} : { cursor }),
74
+ contentType: "application/json",
75
+ ...signal ? { signal } : {}
76
+ });
77
+ return consumeRuntimeStream({
78
+ response,
79
+ decoder: decoder(),
80
+ onEvent,
81
+ ...signal ? { signal } : {},
82
+ ...cursor === void 0 ? {} : { afterCursor: cursor }
83
+ });
84
+ };
85
+ const withReconnect = async (initial, signal, onEvent) => {
86
+ let state;
87
+ let attempts = 0;
88
+ while (true) {
89
+ try {
90
+ state = state?.runId ? await attachOnce(state.runId, state.cursor ?? void 0, signal, onEvent) : await initial();
91
+ } catch (error) {
92
+ if (signal?.aborted || !shouldReconnect(error) || attempts >= maxReconnectAttempts) throw error;
93
+ attempts += 1;
94
+ continue;
95
+ }
96
+ if (!state.detached || signal?.aborted || attempts >= maxReconnectAttempts) return state;
97
+ attempts += 1;
98
+ }
99
+ };
100
+ return {
101
+ async bootstrap(input) {
102
+ return json("GET", "/bootstrap", input?.signal ? { signal: input.signal } : {});
103
+ },
104
+ chat: {
105
+ async stream(input, onEvent) {
106
+ const initial = async () => consumeRuntimeStream({
107
+ response: await request("POST", "/chat/stream", {
108
+ accept: "text/event-stream",
109
+ body: JSON.stringify({
110
+ input: input.input,
111
+ attachmentIds: [...input.attachmentIds ?? []],
112
+ ...input.threadId ? { threadId: input.threadId } : {},
113
+ ...input.requestedModelId ? { requestedModelId: input.requestedModelId } : {},
114
+ toolInputs: input.toolInputs ?? {},
115
+ metadata: input.metadata ?? {},
116
+ client: input.client ?? { sdk_name: "@agents24/client/bff", sdk_version: "0.2.0" }
117
+ }),
118
+ contentType: "application/json",
119
+ idempotencyKey: input.idempotencyKey,
120
+ ...input.signal ? { signal: input.signal } : {}
121
+ }),
122
+ decoder: decoder(),
123
+ onEvent,
124
+ ...input.signal ? { signal: input.signal } : {}
125
+ });
126
+ return withReconnect(initial, input.signal, onEvent);
127
+ }
128
+ },
129
+ runs: {
130
+ attach(input, onEvent) {
131
+ return withReconnect(
132
+ () => attachOnce(input.runId, input.cursor, input.signal, onEvent),
133
+ input.signal,
134
+ onEvent
135
+ );
136
+ },
137
+ cancel(input) {
138
+ return json("POST", `/runs/${encodePath(input.runId)}/cancel`, {
139
+ body: {},
140
+ idempotencyKey: input.idempotencyKey,
141
+ ...input.signal ? { signal: input.signal } : {}
142
+ });
143
+ }
144
+ },
145
+ threads: {
146
+ list(input) {
147
+ return json("GET", appendQuery("/threads", {
148
+ skip: input?.skip,
149
+ limit: input?.limit
150
+ }), input?.signal ? { signal: input.signal } : {});
151
+ },
152
+ get(input) {
153
+ return json("GET", appendQuery(`/threads/${encodePath(input.threadId)}`, {
154
+ limit: input.limit,
155
+ before_turn_index: input.beforeTurnIndex,
156
+ include_run_events: input.includeRunEvents
157
+ }), input.signal ? { signal: input.signal } : {});
158
+ },
159
+ async events(input, onEvent) {
160
+ let cursor = input.cursor;
161
+ let attempts = 0;
162
+ while (!input.signal?.aborted) {
163
+ try {
164
+ const response = await request("GET", appendQuery("/threads/events", { cursor }), {
165
+ accept: "text/event-stream",
166
+ ...input.signal ? { signal: input.signal } : {}
167
+ });
168
+ cursor = await consumeThreadSummaryStream({
169
+ response,
170
+ decoder: decoder(),
171
+ onEvent,
172
+ ...input.signal ? { signal: input.signal } : {},
173
+ ...cursor === void 0 ? {} : { afterCursor: cursor }
174
+ }) ?? void 0;
175
+ return;
176
+ } catch (error) {
177
+ if (input.signal?.aborted || !shouldReconnect(error) || attempts >= maxReconnectAttempts) throw error;
178
+ attempts += 1;
179
+ }
180
+ }
181
+ },
182
+ delete(input) {
183
+ return json("DELETE", `/threads/${encodePath(input.threadId)}`, {
184
+ idempotencyKey: input.idempotencyKey,
185
+ ...input.signal ? { signal: input.signal } : {}
186
+ });
187
+ }
188
+ },
189
+ attachments: {
190
+ async upload(input) {
191
+ const multipart = options.multipart ?? createByteMultipartEncoder(encoder);
192
+ const encoded = await multipart.encode([
193
+ ...input.threadId ? [{ field: "thread_id", value: input.threadId }] : [],
194
+ { field: "files", value: input.upload }
195
+ ]);
196
+ const body = await json("POST", "/attachments/upload", {
197
+ body: encoded.body,
198
+ contentType: encoded.contentType,
199
+ idempotencyKey: input.idempotencyKey,
200
+ ...input.signal ? { signal: input.signal } : {}
201
+ });
202
+ const item = Array.isArray(body.items) ? body.items[0] : body;
203
+ return objectResult(item, "Attachment upload");
204
+ }
205
+ },
206
+ hitl: {
207
+ resume(input) {
208
+ return json("POST", `/runs/${encodePath(input.runId)}/hitl/${encodePath(input.interruptId)}/resume`, {
209
+ body: {
210
+ interruptId: input.interruptId,
211
+ action: input.action,
212
+ ...input.comment ? { comment: input.comment } : {}
213
+ },
214
+ idempotencyKey: input.idempotencyKey,
215
+ ...input.signal ? { signal: input.signal } : {}
216
+ });
217
+ }
218
+ },
219
+ mcp: {
220
+ startAuthorization(input) {
221
+ return json("POST", `/runs/${encodePath(input.runId)}/mcp/servers/${encodePath(input.serverId)}/auth/start`, {
222
+ body: {
223
+ interruptId: input.interruptId,
224
+ redirectUri: input.redirectUri,
225
+ popupNonce: input.popupNonce,
226
+ codeChallenge: input.codeChallenge
227
+ },
228
+ idempotencyKey: input.idempotencyKey,
229
+ ...input.signal ? { signal: input.signal } : {}
230
+ });
231
+ },
232
+ redeemCallback(input) {
233
+ return json("POST", "/mcp/callback/redeem", {
234
+ body: { code: input.code, codeVerifier: input.codeVerifier },
235
+ idempotencyKey: input.idempotencyKey,
236
+ ...input.signal ? { signal: input.signal } : {}
237
+ });
238
+ }
239
+ },
240
+ sessions: {
241
+ async revoke(input) {
242
+ await request("POST", "/session/revoke", {
243
+ idempotencyKey: input?.idempotencyKey ?? ids.createId(),
244
+ ...input?.signal ? { signal: input.signal } : {}
245
+ });
246
+ }
247
+ }
248
+ };
249
+ }
250
+
251
+ export { createBffAgentClient };
252
+ //# sourceMappingURL=bff.js.map
253
+ //# sourceMappingURL=bff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bff.ts"],"names":[],"mappings":"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","file":"bff.js","sourcesContent":["import { defaultIds, resolveDecoderFactory, resolveEncoder, resolveFetch } from \"./capabilities.js\";\nimport { Agents24ClientError } from \"./errors.js\";\nimport { responseError, responseJson } from \"./http.js\";\nimport { createByteMultipartEncoder } from \"./multipart.js\";\nimport { consumeRuntimeStream, consumeThreadSummaryStream, type RuntimeStreamState } from \"./stream.js\";\nimport { appendQuery, encodePath } from \"./url.js\";\nimport type {\n AgentClient,\n AbortSignalLike,\n AttachmentResult,\n FetchLike,\n MultipartEncoder,\n RuntimeEventHandler,\n StreamResult,\n TextDecoderLike,\n TextEncoderLike,\n ThreadDetail,\n ThreadListResult,\n ThreadSummaryEventHandler,\n} from \"./types.js\";\n\nexport interface Agents24BffClientOptions {\n basePath?: string;\n fetch?: FetchLike;\n decoder?: () => TextDecoderLike;\n encoder?: TextEncoderLike;\n multipart?: MultipartEncoder;\n maxReconnectAttempts?: number;\n}\n\nfunction normalizeBasePath(value: string | undefined): string {\n const path = String(value || \"/api/agents24\").trim();\n if (!path.startsWith(\"/\") || /[\\r\\n\\0?#]/.test(path)) {\n throw new Agents24ClientError(\"basePath must be a same-origin absolute path.\", {\n kind: \"configuration\",\n code: \"INVALID_BFF_BASE_PATH\",\n });\n }\n return path.replace(/\\/+$/, \"\");\n}\n\nfunction objectResult<T extends object>(value: unknown, operation: string): T {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Agents24ClientError(`${operation} returned an invalid response.`, {\n kind: \"protocol\",\n code: \"INVALID_JSON_RESPONSE\",\n });\n }\n return value as T;\n}\n\nfunction shouldReconnect(error: unknown): boolean {\n return error instanceof Agents24ClientError && error.kind === \"network\" && error.retryable;\n}\n\nexport function createBffAgentClient(options: Agents24BffClientOptions = {}): AgentClient {\n const basePath = normalizeBasePath(options.basePath);\n const fetch = resolveFetch(options.fetch);\n const decoder = resolveDecoderFactory(options.decoder);\n const encoder = resolveEncoder(options.encoder);\n const ids = defaultIds();\n const maxReconnectAttempts = Math.max(0, Math.min(options.maxReconnectAttempts ?? 3, 10));\n\n const request = async (method: string, path: string, init: {\n accept?: string;\n body?: unknown;\n contentType?: string;\n idempotencyKey?: string;\n signal?: AbortSignalLike;\n } = {}) => {\n let response;\n try {\n response = await fetch(`${basePath}${path}`, {\n method,\n headers: {\n Accept: init.accept || \"application/json\",\n ...(init.contentType ? { \"Content-Type\": init.contentType } : {}),\n ...(init.idempotencyKey ? { \"Idempotency-Key\": init.idempotencyKey } : {}),\n },\n ...(init.body === undefined ? {} : { body: init.body }),\n ...(init.signal ? { signal: init.signal } : {}),\n credentials: \"same-origin\",\n redirect: \"error\",\n cache: \"no-store\",\n });\n } catch (cause) {\n throw new Agents24ClientError(\"The Agents24 BFF could not be reached.\", {\n kind: init.signal?.aborted ? \"aborted\" : \"network\",\n code: init.signal?.aborted ? \"ABORTED\" : \"NETWORK_ERROR\",\n retryable: !init.signal?.aborted,\n cause,\n });\n }\n if (!response.ok) throw await responseError(response);\n return response;\n };\n\n const json = async <T extends object>(method: string, path: string, init: Parameters<typeof request>[2] = {}): Promise<T> => {\n const body = init.body === undefined || init.contentType\n ? init.body\n : JSON.stringify(init.body);\n const response = await request(method, path, {\n ...init,\n ...(body === undefined ? {} : { body }),\n ...(init.body === undefined || init.contentType ? {} : { contentType: \"application/json\" }),\n });\n return objectResult<T>(await responseJson(response), path);\n };\n\n const attachOnce = async (\n runId: string,\n cursor: number | undefined,\n signal: Parameters<AgentClient[\"runs\"][\"attach\"]>[0][\"signal\"],\n onEvent: RuntimeEventHandler,\n ): Promise<RuntimeStreamState> => {\n const response = await request(\"POST\", `/runs/${encodePath(runId)}/attach`, {\n accept: \"text/event-stream\",\n body: JSON.stringify(cursor === undefined ? {} : { cursor }),\n contentType: \"application/json\",\n ...(signal ? { signal } : {}),\n });\n return consumeRuntimeStream({\n response,\n decoder: decoder(),\n onEvent,\n ...(signal ? { signal } : {}),\n ...(cursor === undefined ? {} : { afterCursor: cursor }),\n });\n };\n\n const withReconnect = async (\n initial: () => Promise<RuntimeStreamState>,\n signal: Parameters<AgentClient[\"runs\"][\"attach\"]>[0][\"signal\"],\n onEvent: RuntimeEventHandler,\n ): Promise<StreamResult> => {\n let state: RuntimeStreamState | undefined;\n let attempts = 0;\n while (true) {\n try {\n state = state?.runId\n ? await attachOnce(state.runId, state.cursor ?? undefined, signal, onEvent)\n : await initial();\n } catch (error) {\n if (signal?.aborted || !shouldReconnect(error) || attempts >= maxReconnectAttempts) throw error;\n attempts += 1;\n continue;\n }\n if (!state.detached || signal?.aborted || attempts >= maxReconnectAttempts) return state;\n attempts += 1;\n }\n };\n\n return {\n async bootstrap(input) {\n return json(\"GET\", \"/bootstrap\", input?.signal ? { signal: input.signal } : {});\n },\n chat: {\n async stream(input, onEvent) {\n const initial = async () => consumeRuntimeStream({\n response: await request(\"POST\", \"/chat/stream\", {\n accept: \"text/event-stream\",\n body: JSON.stringify({\n input: input.input,\n attachmentIds: [...(input.attachmentIds ?? [])],\n ...(input.threadId ? { threadId: input.threadId } : {}),\n ...(input.requestedModelId ? { requestedModelId: input.requestedModelId } : {}),\n toolInputs: input.toolInputs ?? {},\n metadata: input.metadata ?? {},\n client: input.client ?? { sdk_name: \"@agents24/client/bff\", sdk_version: \"0.2.0\" },\n }),\n contentType: \"application/json\",\n idempotencyKey: input.idempotencyKey,\n ...(input.signal ? { signal: input.signal } : {}),\n }),\n decoder: decoder(),\n onEvent,\n ...(input.signal ? { signal: input.signal } : {}),\n });\n return withReconnect(initial, input.signal, onEvent);\n },\n },\n runs: {\n attach(input, onEvent) {\n return withReconnect(\n () => attachOnce(input.runId, input.cursor, input.signal, onEvent),\n input.signal,\n onEvent,\n );\n },\n cancel(input) {\n return json(\"POST\", `/runs/${encodePath(input.runId)}/cancel`, {\n body: {},\n idempotencyKey: input.idempotencyKey,\n ...(input.signal ? { signal: input.signal } : {}),\n });\n },\n },\n threads: {\n list(input) {\n return json<ThreadListResult>(\"GET\", appendQuery(\"/threads\", {\n skip: input?.skip,\n limit: input?.limit,\n }), input?.signal ? { signal: input.signal } : {});\n },\n get(input) {\n return json<ThreadDetail>(\"GET\", appendQuery(`/threads/${encodePath(input.threadId)}`, {\n limit: input.limit,\n before_turn_index: input.beforeTurnIndex,\n include_run_events: input.includeRunEvents,\n }), input.signal ? { signal: input.signal } : {});\n },\n async events(input, onEvent: ThreadSummaryEventHandler) {\n let cursor = input.cursor;\n let attempts = 0;\n while (!input.signal?.aborted) {\n try {\n const response = await request(\"GET\", appendQuery(\"/threads/events\", { cursor }), {\n accept: \"text/event-stream\",\n ...(input.signal ? { signal: input.signal } : {}),\n });\n cursor = (await consumeThreadSummaryStream({\n response,\n decoder: decoder(),\n onEvent,\n ...(input.signal ? { signal: input.signal } : {}),\n ...(cursor === undefined ? {} : { afterCursor: cursor }),\n })) ?? undefined;\n return;\n } catch (error) {\n if (input.signal?.aborted || !shouldReconnect(error) || attempts >= maxReconnectAttempts) throw error;\n attempts += 1;\n }\n }\n },\n delete(input) {\n return json(\"DELETE\", `/threads/${encodePath(input.threadId)}`, {\n idempotencyKey: input.idempotencyKey,\n ...(input.signal ? { signal: input.signal } : {}),\n });\n },\n },\n attachments: {\n async upload(input) {\n const multipart = options.multipart ?? createByteMultipartEncoder(encoder);\n const encoded = await multipart.encode([\n ...(input.threadId ? [{ field: \"thread_id\", value: input.threadId }] : []),\n { field: \"files\", value: input.upload },\n ]);\n const body = await json<Record<string, unknown>>(\"POST\", \"/attachments/upload\", {\n body: encoded.body,\n contentType: encoded.contentType,\n idempotencyKey: input.idempotencyKey,\n ...(input.signal ? { signal: input.signal } : {}),\n });\n const item = Array.isArray(body.items) ? body.items[0] : body;\n return objectResult<AttachmentResult>(item, \"Attachment upload\");\n },\n },\n hitl: {\n resume(input) {\n return json(\"POST\", `/runs/${encodePath(input.runId)}/hitl/${encodePath(input.interruptId)}/resume`, {\n body: {\n interruptId: input.interruptId,\n action: input.action,\n ...(input.comment ? { comment: input.comment } : {}),\n },\n idempotencyKey: input.idempotencyKey,\n ...(input.signal ? { signal: input.signal } : {}),\n });\n },\n },\n mcp: {\n startAuthorization(input) {\n return json(\"POST\", `/runs/${encodePath(input.runId)}/mcp/servers/${encodePath(input.serverId)}/auth/start`, {\n body: {\n interruptId: input.interruptId,\n redirectUri: input.redirectUri,\n popupNonce: input.popupNonce,\n codeChallenge: input.codeChallenge,\n },\n idempotencyKey: input.idempotencyKey,\n ...(input.signal ? { signal: input.signal } : {}),\n });\n },\n redeemCallback(input) {\n return json(\"POST\", \"/mcp/callback/redeem\", {\n body: { code: input.code, codeVerifier: input.codeVerifier },\n idempotencyKey: input.idempotencyKey,\n ...(input.signal ? { signal: input.signal } : {}),\n });\n },\n },\n sessions: {\n async revoke(input) {\n await request(\"POST\", \"/session/revoke\", {\n idempotencyKey: input?.idempotencyKey ?? ids.createId(),\n ...(input?.signal ? { signal: input.signal } : {}),\n });\n },\n },\n };\n}\n"]}
@@ -4,7 +4,7 @@ var RUNTIME_STAGES = /* @__PURE__ */ new Set(["run", "assistant", "reasoning", "
4
4
  var RESPONSE_BLOCK_KINDS = /* @__PURE__ */ new Set(["assistant_text", "reasoning_note", "tool_call", "ui_blocks", "hitl_request", "error", "source", "citation", "attachment", "mcp_authorization", "user_message"]);
5
5
  var THREAD_EVENTS = /* @__PURE__ */ new Set(["thread.summary.updated", "thread.deleted", "snapshot_required"]);
6
6
  var UTC_TIMESTAMP = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z$/;
7
- var CONTRACT_HASH = "de2b507f5d56de2bf7c4d6739c03617c4b4feef6ae827aaaac5f1d6150ec678e";
7
+ var CONTRACT_HASH = "90a64d2df2facc3c4510edc7a0762cb86a336578667d3bc6cfeb7ae035133e00";
8
8
  var RUNTIME_PROTOCOL_VERSION = "run-stream.v2";
9
9
  var THREAD_SUMMARY_PROTOCOL_VERSION = "agents24.thread_summary_event.v1";
10
10
  var Agents24ProtocolError = class extends Error {
@@ -24,6 +24,9 @@ function nonEmptyString(value) {
24
24
  function protocolError(category, message, details) {
25
25
  throw new Agents24ProtocolError(category, message, details);
26
26
  }
27
+ function includesProtocolName(values, value) {
28
+ return Array.isArray(values) && values.includes(value);
29
+ }
27
30
  function parseProtocolJson(payload) {
28
31
  try {
29
32
  return JSON.parse(payload);
@@ -49,24 +52,24 @@ function validateBlocks(value) {
49
52
  }
50
53
  for (const block of blocks) validateResponseBlock(block);
51
54
  }
52
- function validateRuntimeEvent(value) {
55
+ function validateRuntimeEvent(value, options = {}) {
53
56
  if (!record(value)) {
54
57
  return protocolError("invalid_envelope", "Runtime event must be an object.", value);
55
58
  }
56
59
  if (value.version !== RUNTIME_PROTOCOL_VERSION) {
57
60
  return protocolError("unsupported_version", "Runtime event version is unsupported.", value.version);
58
61
  }
59
- if (!RUNTIME_EVENTS.has(value.event)) {
62
+ if (!RUNTIME_EVENTS.has(value.event) && !includesProtocolName(options.additionalEventNames, value.event)) {
60
63
  return protocolError("unknown_event", "Runtime event name is not in the public protocol.", value.event);
61
64
  }
62
- if (!Number.isInteger(value.seq) || value.seq < 0 || !UTC_TIMESTAMP.test(value.ts || "") || !nonEmptyString(value.run_id) || !RUNTIME_STAGES.has(value.stage) || !record(value.payload)) {
65
+ if (!Number.isInteger(value.seq) || value.seq < 0 || !UTC_TIMESTAMP.test(value.ts || "") || !nonEmptyString(value.run_id) || !RUNTIME_STAGES.has(value.stage) && !includesProtocolName(options.additionalStages, value.stage) || !record(value.payload)) {
63
66
  return protocolError("invalid_envelope", "Runtime event is missing a required public field.", value);
64
67
  }
65
68
  validateBlocks(value.payload);
66
69
  return value;
67
70
  }
68
- function parseRuntimeEvent(payload) {
69
- return validateRuntimeEvent(parseProtocolJson(payload));
71
+ function parseRuntimeEvent(payload, options) {
72
+ return validateRuntimeEvent(parseProtocolJson(payload), options);
70
73
  }
71
74
  function validateThreadSummaryEvent(value) {
72
75
  if (!record(value) || value.schema_version !== THREAD_SUMMARY_PROTOCOL_VERSION || !THREAD_EVENTS.has(value.event) || !Number.isInteger(value.cursor) || value.cursor < 0) {
@@ -151,13 +154,13 @@ async function parseSseBytes(chunks, options) {
151
154
  await parser.finish();
152
155
  return payloads;
153
156
  }
154
- function parseRuntimeSsePayload(payload) {
155
- return parseRuntimeEvent(payload);
157
+ function parseRuntimeSsePayload(payload, options) {
158
+ return parseRuntimeEvent(payload, options);
156
159
  }
157
160
  function parseThreadSummarySsePayload(payload) {
158
161
  return validateThreadSummaryEvent(parseProtocolJson(payload));
159
162
  }
160
163
 
161
164
  export { Agents24ProtocolError, CONTRACT_HASH, RUNTIME_PROTOCOL_VERSION, THREAD_SUMMARY_PROTOCOL_VERSION, createSseParser, parseProtocolJson, parseRuntimeEvent, parseRuntimeSsePayload, parseSseBytes, parseThreadSummarySsePayload, validateResponseBlock, validateRuntimeEvent, validateThreadSummaryEvent };
162
- //# sourceMappingURL=chunk-VVLMMNXI.js.map
163
- //# sourceMappingURL=chunk-VVLMMNXI.js.map
165
+ //# sourceMappingURL=chunk-NGZUJ3YT.js.map
166
+ //# sourceMappingURL=chunk-NGZUJ3YT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/generated/protocol.js"],"names":[],"mappings":";AAEA,IAAM,iCAAiB,IAAI,GAAA,CAAI,CAAC,cAAA,EAAe,gBAAe,eAAA,EAAgB,eAAA,EAAgB,YAAA,EAAa,YAAA,EAAa,gBAAe,iBAAA,EAAkB,kBAAA,EAAmB,gBAAe,gBAAA,EAAiB,aAAA,EAAc,kBAAiB,wBAAA,EAAyB,yBAAA,EAA0B,yBAAA,EAA0B,2BAAA,EAA4B,0BAAyB,2BAAA,EAA4B,wBAAA,EAAyB,+BAA8B,mBAAA,EAAoB,gBAAA,EAAiB,iBAAgB,4BAAA,EAA6B,6BAAA,EAA8B,0BAAA,EAA2B,oBAAA,EAAqB,sBAAqB,kBAAA,EAAmB,mBAAA,EAAoB,gBAAe,gBAAA,EAAiB,mBAAA,EAAoB,eAAe,CAAC,CAAA;AAChuB,IAAM,cAAA,mBAAiB,IAAI,GAAA,CAAI,CAAC,KAAA,EAAM,WAAA,EAAY,WAAA,EAAY,MAAA,EAAO,SAAA,EAAU,OAAA,EAAQ,YAAA,EAAa,QAAA,EAAS,QAAQ,CAAC,CAAA;AACtH,IAAM,oBAAA,mBAAuB,IAAI,GAAA,CAAI,CAAC,kBAAiB,gBAAA,EAAiB,WAAA,EAAY,WAAA,EAAY,cAAA,EAAe,SAAQ,QAAA,EAAS,UAAA,EAAW,YAAA,EAAa,mBAAA,EAAoB,cAAc,CAAC,CAAA;AAC3L,IAAM,gCAAgB,IAAI,GAAA,CAAI,CAAC,wBAAA,EAAyB,gBAAA,EAAiB,mBAAmB,CAAC,CAAA;AAC7F,IAAM,aAAA,GAAgB,kDAAA;AAEf,IAAM,aAAA,GAAgB;AACtB,IAAM,wBAAA,GAA2B;AACjC,IAAM,+BAAA,GAAkC;AAExC,IAAM,qBAAA,GAAN,cAAoC,KAAA,CAAM;AAAA,EAC/C,WAAA,CAAY,QAAA,EAAU,OAAA,EAAS,OAAA,EAAS;AACtC,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AACZ,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AACF;AAEA,SAAS,OAAO,KAAA,EAAO;AACrB,EAAA,OAAO,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,YAAY,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAEA,SAAS,eAAe,KAAA,EAAO;AAC7B,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,MAAA,GAAS,CAAA;AACrD;AAEA,SAAS,aAAA,CAAc,QAAA,EAAU,OAAA,EAAS,OAAA,EAAS;AACjD,EAAA,MAAM,IAAI,qBAAA,CAAsB,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAC5D;AAEA,SAAS,oBAAA,CAAqB,QAAQ,KAAA,EAAO;AAC3C,EAAA,OAAO,MAAM,OAAA,CAAQ,MAAM,CAAA,IAAK,MAAA,CAAO,SAAS,KAAK,CAAA;AACvD;AAEO,SAAS,kBAAkB,OAAA,EAAS;AACzC,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B,SAAS,KAAA,EAAO;AACd,IAAA,OAAO,aAAA,CAAc,cAAA,EAAgB,qCAAA,EAAuC,KAAK,CAAA;AAAA,EACnF;AACF;AAEO,SAAS,sBAAsB,KAAA,EAAO;AAC3C,EAAA,IAAI,CAAC,MAAA,CAAO,KAAK,CAAA,IAAK,CAAC,cAAA,CAAe,KAAA,CAAM,EAAE,CAAA,IAAK,CAAC,oBAAA,CAAqB,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AACxF,IAAA,OAAO,aAAA,CAAc,wBAAA,EAA0B,6CAAA,EAA+C,KAAK,CAAA;AAAA,EACrG;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA,IAAK,KAAA,CAAM,GAAA,GAAM,CAAA,IAAK,CAAC,cAAA,CAAe,KAAA,CAAM,MAAM,CAAA,EAAG;AAClF,IAAA,OAAO,aAAA,CAAc,wBAAA,EAA0B,+CAAA,EAAiD,KAAK,CAAA;AAAA,EACvG;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAe,KAAA,EAAO;AAC7B,EAAA,IAAI,CAAC,MAAA,CAAO,KAAK,CAAA,EAAG;AACpB,EAAA,MAAM,SAAS,KAAA,CAAM,eAAA;AACrB,EAAA,IAAI,WAAW,MAAA,EAAW;AAC1B,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC1B,IAAA,aAAA,CAAc,wBAAA,EAA0B,qCAAqC,MAAM,CAAA;AAAA,EACrF;AACA,EAAA,KAAA,MAAW,KAAA,IAAS,MAAA,EAAQ,qBAAA,CAAsB,KAAK,CAAA;AACzD;AAEO,SAAS,oBAAA,CAAqB,KAAA,EAAO,OAAA,GAAU,EAAC,EAAG;AACxD,EAAA,IAAI,CAAC,MAAA,CAAO,KAAK,CAAA,EAAG;AAClB,IAAA,OAAO,aAAA,CAAc,kBAAA,EAAoB,kCAAA,EAAoC,KAAK,CAAA;AAAA,EACpF;AACA,EAAA,IAAI,KAAA,CAAM,YAAY,wBAAA,EAA0B;AAC9C,IAAA,OAAO,aAAA,CAAc,qBAAA,EAAuB,uCAAA,EAAyC,KAAA,CAAM,OAAO,CAAA;AAAA,EACpG;AACA,EAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA,IAAK,CAAC,oBAAA,CAAqB,OAAA,CAAQ,oBAAA,EAAsB,KAAA,CAAM,KAAK,CAAA,EAAG;AACxG,IAAA,OAAO,aAAA,CAAc,eAAA,EAAiB,mDAAA,EAAqD,KAAA,CAAM,KAAK,CAAA;AAAA,EACxG;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,KAAA,CAAM,GAAG,KAAK,KAAA,CAAM,GAAA,GAAM,CAAA,IAAK,CAAC,cAAc,IAAA,CAAK,KAAA,CAAM,MAAM,EAAE,CAAA,IACnF,CAAC,cAAA,CAAe,KAAA,CAAM,MAAM,CAAA,IAC3B,CAAC,cAAA,CAAe,GAAA,CAAI,KAAA,CAAM,KAAK,KAAK,CAAC,oBAAA,CAAqB,OAAA,CAAQ,gBAAA,EAAkB,MAAM,KAAK,CAAA,IAChG,CAAC,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,EAAG;AAC1B,IAAA,OAAO,aAAA,CAAc,kBAAA,EAAoB,mDAAA,EAAqD,KAAK,CAAA;AAAA,EACrG;AACA,EAAA,cAAA,CAAe,MAAM,OAAO,CAAA;AAC5B,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,iBAAA,CAAkB,SAAS,OAAA,EAAS;AAClD,EAAA,OAAO,oBAAA,CAAqB,iBAAA,CAAkB,OAAO,CAAA,EAAG,OAAO,CAAA;AACjE;AAEO,SAAS,2BAA2B,KAAA,EAAO;AAChD,EAAA,IAAI,CAAC,OAAO,KAAK,CAAA,IAAK,MAAM,cAAA,KAAmB,+BAAA,IAC3C,CAAC,aAAA,CAAc,GAAA,CAAI,MAAM,KAAK,CAAA,IAAK,CAAC,MAAA,CAAO,SAAA,CAAU,MAAM,MAAM,CAAA,IAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC1F,IAAA,OAAO,aAAA,CAAc,wBAAA,EAA0B,2CAAA,EAA6C,KAAK,CAAA;AAAA,EACnG;AACA,EAAA,IAAI,MAAM,KAAA,KAAU,wBAAA,IAA4B,CAAC,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AACrE,IAAA,OAAO,aAAA,CAAc,wBAAA,EAA0B,+CAAA,EAAiD,KAAK,CAAA;AAAA,EACvG;AACA,EAAA,IAAI,MAAM,KAAA,KAAU,gBAAA,IAAoB,CAAC,cAAA,CAAe,KAAA,CAAM,SAAS,CAAA,EAAG;AACxE,IAAA,OAAO,aAAA,CAAc,wBAAA,EAA0B,kDAAA,EAAoD,KAAK,CAAA;AAAA,EAC1G;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,cAAc,KAAA,EAAO;AAC5B,EAAA,MAAM,OAAO,EAAC;AACd,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,YAAY,CAAA,EAAG;AAC5C,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACnC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAClC,IAAA,MAAM,QAAQ,SAAA,GAAY,CAAA,GAAI,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,SAAS,CAAA;AAC5D,IAAA,IAAI,QAAQ,SAAA,GAAY,CAAA,GAAI,KAAK,IAAA,CAAK,KAAA,CAAM,YAAY,CAAC,CAAA;AACzD,IAAA,IAAI,MAAM,UAAA,CAAW,GAAG,GAAG,KAAA,GAAQ,KAAA,CAAM,MAAM,CAAC,CAAA;AAChD,IAAA,IAAI,KAAA,KAAU,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AACzC;AAEA,SAAS,gBAAgB,MAAA,EAAQ;AAC/B,EAAA,MAAM,KAAA,GAAQ,oBAAA,CAAqB,IAAA,CAAK,MAAM,CAAA;AAC9C,EAAA,OAAO,KAAA,GAAQ,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,QAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,EAAO,GAAI,IAAA;AACnE;AAEO,SAAS,gBAAgB,OAAA,EAAS;AACvC,EAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,MAAA,EAAO,GAAI,OAAA;AACvC,EAAA,IAAI,CAAC,WAAW,OAAO,OAAA,CAAQ,WAAW,UAAA,IAAc,OAAO,cAAc,UAAA,EAAY;AACvF,IAAA,aAAA,CAAc,oBAAoB,yDAAyD,CAAA;AAAA,EAC7F;AACA,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,IAAI,QAAA,GAAW,KAAA;AAEf,EAAA,eAAe,MAAM,aAAA,EAAe;AAClC,IAAA,IAAI,QAAA,GAAW,gBAAgB,MAAM,CAAA;AACrC,IAAA,OAAO,QAAA,EAAU;AACf,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,SAAS,KAAK,CAAA;AAC5C,MAAA,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,KAAA,GAAQ,SAAS,MAAM,CAAA;AACtD,MAAA,MAAM,OAAA,GAAU,cAAc,KAAK,CAAA;AACnC,MAAA,IAAI,OAAA,KAAY,IAAA,EAAM,MAAM,SAAA,CAAU,OAAO,CAAA;AAC7C,MAAA,IAAI,QAAQ,OAAA,EAAS;AACrB,MAAA,QAAA,GAAW,gBAAgB,MAAM,CAAA;AAAA,IACnC;AACA,IAAA,IAAI,aAAA,IAAiB,MAAA,CAAO,IAAA,EAAK,EAAG;AAClC,MAAA,MAAM,OAAA,GAAU,cAAc,MAAM,CAAA;AACpC,MAAA,MAAA,GAAS,EAAA;AACT,MAAA,IAAI,OAAA,KAAY,IAAA,EAAM,MAAM,SAAA,CAAU,OAAO,CAAA;AAAA,IAC/C;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,KAAK,KAAA,EAAO;AAChB,MAAA,IAAI,QAAA,EAAU,aAAA,CAAc,kBAAA,EAAoB,sCAAsC,CAAA;AACtF,MAAA,IAAI,QAAQ,OAAA,EAAS;AACrB,MAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAChD,MAAA,MAAM,MAAM,KAAK,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,MAAM,MAAA,GAAS;AACb,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,IAAI,QAAQ,OAAA,EAAS;AACrB,MAAA,MAAA,IAAU,QAAQ,MAAA,EAAO;AACzB,MAAA,MAAM,MAAM,IAAI,CAAA;AAAA,IAClB;AAAA,GACF;AACF;AAEA,eAAsB,aAAA,CAAc,QAAQ,OAAA,EAAS;AACnD,EAAA,MAAM,WAAW,EAAC;AAClB,EAAA,MAAM,SAAS,eAAA,CAAgB;AAAA,IAC7B,GAAG,OAAA;AAAA,IACH,SAAA,EAAW,OAAO,OAAA,KAAY;AAC5B,MAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AACrB,MAAA,IAAI,OAAA,CAAQ,SAAA,EAAW,MAAM,OAAA,CAAQ,UAAU,OAAO,CAAA;AAAA,IACxD;AAAA,GACD,CAAA;AACD,EAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,IAAA,IAAI,OAAA,CAAQ,QAAQ,OAAA,EAAS;AAC7B,IAAA,MAAM,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,EACzB;AACA,EAAA,MAAM,OAAO,MAAA,EAAO;AACpB,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,sBAAA,CAAuB,SAAS,OAAA,EAAS;AACvD,EAAA,OAAO,iBAAA,CAAkB,SAAS,OAAO,CAAA;AAC3C;AAEO,SAAS,6BAA6B,OAAA,EAAS;AACpD,EAAA,OAAO,0BAAA,CAA2B,iBAAA,CAAkB,OAAO,CAAC,CAAA;AAC9D","file":"chunk-NGZUJ3YT.js","sourcesContent":["// @generated by @agents24/sdk-contract; DO NOT EDIT.\n// contract-sha256: 90a64d2df2facc3c4510edc7a0762cb86a336578667d3bc6cfeb7ae035133e00\nconst RUNTIME_EVENTS = new Set([\"run.accepted\",\"run.snapshot\",\"run.completed\",\"run.cancelled\",\"run.paused\",\"run.failed\",\"run.detached\",\"assistant.delta\",\"reasoning.update\",\"tool.started\",\"tool.completed\",\"tool.failed\",\"tool.cancelled\",\"tool.child_run_started\",\"tool.child_run_finished\",\"tool.child_tool_started\",\"tool.child_tool_completed\",\"tool.child_tool_failed\",\"tool.child_tool_cancelled\",\"context_window.updated\",\"context.compression.updated\",\"run_usage.updated\",\"hitl.requested\",\"hitl.resolved\",\"mcp.authorization.required\",\"mcp.authorization.completed\",\"mcp.authorization.failed\",\"attachment.created\",\"attachment.updated\",\"attachment.ready\",\"attachment.failed\",\"source.added\",\"citation.added\",\"ui_blocks.updated\",\"runtime.error\"]);\nconst RUNTIME_STAGES = new Set([\"run\",\"assistant\",\"reasoning\",\"tool\",\"context\",\"usage\",\"attachment\",\"source\",\"system\"]);\nconst RESPONSE_BLOCK_KINDS = new Set([\"assistant_text\",\"reasoning_note\",\"tool_call\",\"ui_blocks\",\"hitl_request\",\"error\",\"source\",\"citation\",\"attachment\",\"mcp_authorization\",\"user_message\"]);\nconst THREAD_EVENTS = new Set([\"thread.summary.updated\",\"thread.deleted\",\"snapshot_required\"]);\nconst UTC_TIMESTAMP = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z$/;\n\nexport const CONTRACT_HASH = \"90a64d2df2facc3c4510edc7a0762cb86a336578667d3bc6cfeb7ae035133e00\";\nexport const RUNTIME_PROTOCOL_VERSION = \"run-stream.v2\";\nexport const THREAD_SUMMARY_PROTOCOL_VERSION = \"agents24.thread_summary_event.v1\";\n\nexport class Agents24ProtocolError extends Error {\n constructor(category, message, details) {\n super(message);\n this.name = \"Agents24ProtocolError\";\n this.category = category;\n this.details = details;\n }\n}\n\nfunction record(value) {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction nonEmptyString(value) {\n return typeof value === \"string\" && value.length > 0;\n}\n\nfunction protocolError(category, message, details) {\n throw new Agents24ProtocolError(category, message, details);\n}\n\nfunction includesProtocolName(values, value) {\n return Array.isArray(values) && values.includes(value);\n}\n\nexport function parseProtocolJson(payload) {\n try {\n return JSON.parse(payload);\n } catch (cause) {\n return protocolError(\"invalid_json\", \"Protocol payload is not valid JSON.\", cause);\n }\n}\n\nexport function validateResponseBlock(value) {\n if (!record(value) || !nonEmptyString(value.id) || !RESPONSE_BLOCK_KINDS.has(value.kind)) {\n return protocolError(\"invalid_response_block\", \"Response block identity or kind is invalid.\", value);\n }\n if (!Number.isInteger(value.seq) || value.seq < 0 || !nonEmptyString(value.status)) {\n return protocolError(\"invalid_response_block\", \"Response block sequence or status is invalid.\", value);\n }\n return value;\n}\n\nfunction validateBlocks(value) {\n if (!record(value)) return;\n const blocks = value.response_blocks;\n if (blocks === undefined) return;\n if (!Array.isArray(blocks)) {\n protocolError(\"invalid_response_block\", \"response_blocks must be an array.\", blocks);\n }\n for (const block of blocks) validateResponseBlock(block);\n}\n\nexport function validateRuntimeEvent(value, options = {}) {\n if (!record(value)) {\n return protocolError(\"invalid_envelope\", \"Runtime event must be an object.\", value);\n }\n if (value.version !== RUNTIME_PROTOCOL_VERSION) {\n return protocolError(\"unsupported_version\", \"Runtime event version is unsupported.\", value.version);\n }\n if (!RUNTIME_EVENTS.has(value.event) && !includesProtocolName(options.additionalEventNames, value.event)) {\n return protocolError(\"unknown_event\", \"Runtime event name is not in the public protocol.\", value.event);\n }\n if (!Number.isInteger(value.seq) || value.seq < 0 || !UTC_TIMESTAMP.test(value.ts || \"\") ||\n !nonEmptyString(value.run_id) ||\n (!RUNTIME_STAGES.has(value.stage) && !includesProtocolName(options.additionalStages, value.stage)) ||\n !record(value.payload)) {\n return protocolError(\"invalid_envelope\", \"Runtime event is missing a required public field.\", value);\n }\n validateBlocks(value.payload);\n return value;\n}\n\nexport function parseRuntimeEvent(payload, options) {\n return validateRuntimeEvent(parseProtocolJson(payload), options);\n}\n\nexport function validateThreadSummaryEvent(value) {\n if (!record(value) || value.schema_version !== THREAD_SUMMARY_PROTOCOL_VERSION ||\n !THREAD_EVENTS.has(value.event) || !Number.isInteger(value.cursor) || value.cursor < 0) {\n return protocolError(\"invalid_thread_summary\", \"Thread-summary event envelope is invalid.\", value);\n }\n if (value.event === \"thread.summary.updated\" && !record(value.thread)) {\n return protocolError(\"invalid_thread_summary\", \"Updated thread-summary event requires thread.\", value);\n }\n if (value.event === \"thread.deleted\" && !nonEmptyString(value.thread_id)) {\n return protocolError(\"invalid_thread_summary\", \"Deleted thread-summary event requires thread_id.\", value);\n }\n return value;\n}\n\nfunction parseSseBlock(block) {\n const data = [];\n for (const line of block.split(/\\r\\n|\\r|\\n/)) {\n if (!line || line.startsWith(\":\")) continue;\n const separator = line.indexOf(\":\");\n const field = separator < 0 ? line : line.slice(0, separator);\n let value = separator < 0 ? \"\" : line.slice(separator + 1);\n if (value.startsWith(\" \")) value = value.slice(1);\n if (field === \"data\") data.push(value);\n }\n return data.length ? data.join(\"\\n\") : null;\n}\n\nfunction nextSseBoundary(buffer) {\n const match = /\\r\\n\\r\\n|\\n\\n|\\r\\r/.exec(buffer);\n return match ? { index: match.index, length: match[0].length } : null;\n}\n\nexport function createSseParser(options) {\n const { decoder, onPayload, signal } = options;\n if (!decoder || typeof decoder.decode !== \"function\" || typeof onPayload !== \"function\") {\n protocolError(\"invalid_envelope\", \"SSE parser requires decoder and onPayload capabilities.\");\n }\n let buffer = \"\";\n let finished = false;\n\n async function drain(allowTrailing) {\n let boundary = nextSseBoundary(buffer);\n while (boundary) {\n const block = buffer.slice(0, boundary.index);\n buffer = buffer.slice(boundary.index + boundary.length);\n const payload = parseSseBlock(block);\n if (payload !== null) await onPayload(payload);\n if (signal?.aborted) return;\n boundary = nextSseBoundary(buffer);\n }\n if (allowTrailing && buffer.trim()) {\n const payload = parseSseBlock(buffer);\n buffer = \"\";\n if (payload !== null) await onPayload(payload);\n }\n }\n\n return {\n async push(chunk) {\n if (finished) protocolError(\"invalid_envelope\", \"Cannot push after SSE parser finish.\");\n if (signal?.aborted) return;\n buffer += decoder.decode(chunk, { stream: true });\n await drain(false);\n },\n async finish() {\n if (finished) return;\n finished = true;\n if (signal?.aborted) return;\n buffer += decoder.decode();\n await drain(true);\n },\n };\n}\n\nexport async function parseSseBytes(chunks, options) {\n const payloads = [];\n const parser = createSseParser({\n ...options,\n onPayload: async (payload) => {\n payloads.push(payload);\n if (options.onPayload) await options.onPayload(payload);\n },\n });\n for await (const chunk of chunks) {\n if (options.signal?.aborted) break;\n await parser.push(chunk);\n }\n await parser.finish();\n return payloads;\n}\n\nexport function parseRuntimeSsePayload(payload, options) {\n return parseRuntimeEvent(payload, options);\n}\n\nexport function parseThreadSummarySsePayload(payload) {\n return validateThreadSummaryEvent(parseProtocolJson(payload));\n}\n"]}