@agents24/client 0.2.0 → 0.2.2

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.
@@ -1,23 +1,40 @@
1
- import { createSseParser, Agents24ProtocolError, parseRuntimeSsePayload, parseThreadSummarySsePayload } from './chunk-NGZUJ3YT.js';
1
+ import { createSseParser, Agents24ProtocolError, parseRuntimeSsePayload, parseThreadSummarySsePayload } from './chunk-FLTCOJZR.js';
2
2
 
3
3
  // src/errors.ts
4
4
  var Agents24ClientError = class extends Error {
5
5
  kind;
6
6
  code;
7
7
  status;
8
+ failure;
8
9
  requestId;
9
10
  retryable;
11
+ violations;
10
12
  cause;
11
13
  constructor(message, options) {
12
14
  super(message);
13
15
  this.name = "Agents24ClientError";
14
16
  this.kind = options.kind;
15
- this.code = options.code ?? "CLIENT_ERROR";
17
+ this.code = options.failure?.code ?? options.code ?? "CLIENT_ERROR";
16
18
  this.status = options.status;
17
- this.requestId = options.requestId;
18
- this.retryable = options.retryable ?? false;
19
+ this.failure = options.failure;
20
+ this.requestId = options.failure?.request_id ?? options.requestId;
21
+ this.retryable = options.failure?.retryable ?? options.retryable ?? false;
22
+ const violations = options.failure?.details.violations;
23
+ this.violations = Array.isArray(violations) ? violations : options.violations ?? [];
19
24
  this.cause = options.cause;
20
25
  }
26
+ get failureId() {
27
+ return this.failure?.failure_id;
28
+ }
29
+ get category() {
30
+ return this.failure?.category;
31
+ }
32
+ get retryAfterMs() {
33
+ return this.failure?.retry_after_ms ?? void 0;
34
+ }
35
+ get details() {
36
+ return this.failure?.details ?? {};
37
+ }
21
38
  };
22
39
  function missingCapability(name) {
23
40
  return new Agents24ClientError(`Required capability is unavailable: ${name}.`, {
@@ -115,6 +132,7 @@ function absoluteUrl(baseUrl, path) {
115
132
  }
116
133
  function canonicalHtu(input) {
117
134
  const parsed = new (urlConstructor())(input);
135
+ parsed.search = "";
118
136
  parsed.hash = "";
119
137
  return parsed.toString();
120
138
  }
@@ -164,7 +182,7 @@ function appendAdditionalHeaders(target, additional) {
164
182
  function isPublicError(value) {
165
183
  if (!value || typeof value !== "object" || Array.isArray(value)) return false;
166
184
  const candidate = value;
167
- return typeof candidate.code === "string" && typeof candidate.message === "string" && typeof candidate.request_id === "string" && typeof candidate.retryable === "boolean";
185
+ return candidate.schema_version === "agents24.failure.v1" && typeof candidate.failure_id === "string" && typeof candidate.code === "string" && typeof candidate.category === "string" && typeof candidate.message === "string" && typeof candidate.retryable === "boolean" && Boolean(candidate.details && typeof candidate.details === "object" && !Array.isArray(candidate.details));
168
186
  }
169
187
  async function responseError(response) {
170
188
  let body;
@@ -175,11 +193,10 @@ async function responseError(response) {
175
193
  }
176
194
  if (isPublicError(body)) {
177
195
  return new Agents24ClientError(body.message, {
178
- kind: errorKindForStatus(response.status),
196
+ kind: body.code === "RESOURCE_POLICY_QUOTA_EXCEEDED" ? "quota" : errorKindForStatus(response.status),
179
197
  code: body.code,
180
198
  status: response.status,
181
- requestId: body.request_id,
182
- retryable: body.retryable
199
+ failure: body
183
200
  });
184
201
  }
185
202
  return new Agents24ClientError("The Agents24 runtime request failed.", {
@@ -216,6 +233,7 @@ var AuthenticatedHttp = class {
216
233
  #clock;
217
234
  #telemetry;
218
235
  #nonces = /* @__PURE__ */ new Map();
236
+ #requestQueue = Promise.resolve();
219
237
  constructor(options) {
220
238
  this.#baseUrl = options.baseUrl;
221
239
  this.#provider = options.sessionProvider;
@@ -237,6 +255,19 @@ var AuthenticatedHttp = class {
237
255
  return access;
238
256
  }
239
257
  async request(method, path, options) {
258
+ let releaseQueue;
259
+ const previousRequest = this.#requestQueue;
260
+ this.#requestQueue = new Promise((resolve) => {
261
+ releaseQueue = resolve;
262
+ });
263
+ await previousRequest;
264
+ try {
265
+ return await this.#requestUnlocked(method, path, options);
266
+ } finally {
267
+ releaseQueue();
268
+ }
269
+ }
270
+ async #requestUnlocked(method, path, options) {
240
271
  const url = absoluteUrl(this.#baseUrl, path);
241
272
  const startedAt = this.#clock.now();
242
273
  let access = await this.#access(options.signal);
@@ -298,8 +329,10 @@ var AuthenticatedHttp = class {
298
329
  }
299
330
  assertPrivateResponse(response);
300
331
  const challengedNonce = response.headers.get("DPoP-Nonce");
301
- if (response.status === 401 && challengedNonce && access.dpopKeyProvider && !nonceRetried) {
332
+ if (challengedNonce && access.dpopKeyProvider) {
302
333
  this.#nonces.set(access.sessionId ?? "default", safeToken(challengedNonce, "DPoP nonce"));
334
+ }
335
+ if (response.status === 401 && challengedNonce && access.dpopKeyProvider && !nonceRetried) {
303
336
  nonceRetried = true;
304
337
  retryCount += 1;
305
338
  continue;
@@ -528,7 +561,7 @@ async function consumeRuntimeStream(input) {
528
561
  let runId = null;
529
562
  let resolvedThreadId = null;
530
563
  let detached = false;
531
- let terminal = false;
564
+ let streamComplete = false;
532
565
  let reason;
533
566
  await consumeBody({
534
567
  response: input.response,
@@ -537,18 +570,12 @@ async function consumeRuntimeStream(input) {
537
570
  async onPayload(payload) {
538
571
  const event = parseRuntimeSsePayload(payload);
539
572
  if (cursor !== null && event.seq <= cursor) return;
540
- if (cursor !== null && event.seq !== cursor + 1) {
541
- throw new Agents24ProtocolError("invalid_envelope", "Runtime stream sequence is not contiguous.", {
542
- expected: cursor + 1,
543
- received: event.seq
544
- });
545
- }
546
573
  cursor = event.seq;
547
574
  runId = event.run_id;
548
575
  resolvedThreadId = threadId(event) ?? resolvedThreadId;
549
576
  reason = detachReason(event);
550
577
  detached = reason !== void 0;
551
- terminal = event.event === "run.completed" || event.event === "run.failed" || event.event === "run.cancelled";
578
+ streamComplete = event.event === "run.completed" || event.event === "run.failed" || event.event === "run.cancelled" || event.event === "run.paused";
552
579
  await input.onEvent(event);
553
580
  input.onProgress?.({
554
581
  runId,
@@ -559,7 +586,7 @@ async function consumeRuntimeStream(input) {
559
586
  });
560
587
  }
561
588
  });
562
- if (runId && !terminal && !detached && !input.signal?.aborted) {
589
+ if (runId && !streamComplete && !detached && !input.signal?.aborted) {
563
590
  throw new Agents24ClientError("The runtime stream ended before a terminal or detach event.", {
564
591
  kind: "network",
565
592
  code: "STREAM_ENDED_BEFORE_TERMINAL",
@@ -592,5 +619,5 @@ async function consumeThreadSummaryStream(input) {
592
619
  }
593
620
 
594
621
  export { Agents24ClientError, AuthenticatedHttp, absoluteUrl, appendQuery, canonicalHtu, consumeRuntimeStream, consumeThreadSummaryStream, createByteMultipartEncoder, defaultClock, defaultIds, dpopTokenRequest, encodePath, missingCapability, normalizeBaseUrl, resolveDecoderFactory, resolveEncoder, resolveFetch, responseError, responseJson };
595
- //# sourceMappingURL=chunk-SCZMUBXD.js.map
596
- //# sourceMappingURL=chunk-SCZMUBXD.js.map
622
+ //# sourceMappingURL=chunk-LG3ZMQ2W.js.map
623
+ //# sourceMappingURL=chunk-LG3ZMQ2W.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/capabilities.ts","../src/url.ts","../src/http.ts","../src/multipart.ts","../src/stream.ts"],"names":["safeToken"],"mappings":"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","file":"chunk-LG3ZMQ2W.js","sourcesContent":["export type Agents24ErrorKind =\n | \"configuration\"\n | \"missing_capability\"\n | \"authentication\"\n | \"authorization\"\n | \"not_found\"\n | \"conflict\"\n | \"quota\"\n | \"rate_limit\"\n | \"validation\"\n | \"protocol\"\n | \"network\"\n | \"aborted\"\n | \"server\";\n\nexport interface FailureView {\n schema_version: \"agents24.failure.v1\";\n failure_id: string;\n code: string;\n category: string;\n message: string;\n retryable: boolean;\n request_id: string | null;\n retry_after_ms: number | null;\n details: Readonly<Record<string, unknown>>;\n}\n\nexport interface ResourcePolicyViolation {\n policy_subject_type: \"agent\" | \"client_deployment\" | \"user\";\n rule_type: \"allow\" | \"quota\";\n resource_type: \"agent\" | \"model\" | \"tool\" | \"toolset\" | \"knowledge_store\";\n resource_name: string;\n aggregation_scope?: \"subject\" | \"consumer\";\n quota_unit?: \"tokens\";\n quota_window?: \"monthly\";\n limit?: number;\n remaining?: number;\n resets_at?: string;\n}\n\nexport class Agents24ClientError extends Error {\n readonly kind: Agents24ErrorKind;\n readonly code: string;\n readonly status: number | undefined;\n readonly failure: FailureView | undefined;\n readonly requestId: string | undefined;\n readonly retryable: boolean;\n readonly violations: readonly ResourcePolicyViolation[];\n readonly cause?: unknown;\n\n constructor(\n message: string,\n options: {\n kind: Agents24ErrorKind;\n code?: string;\n status?: number;\n failure?: FailureView;\n requestId?: string;\n retryable?: boolean;\n violations?: readonly ResourcePolicyViolation[];\n cause?: unknown;\n },\n ) {\n super(message);\n this.name = \"Agents24ClientError\";\n this.kind = options.kind;\n this.code = options.failure?.code ?? options.code ?? \"CLIENT_ERROR\";\n this.status = options.status;\n this.failure = options.failure;\n this.requestId = options.failure?.request_id ?? options.requestId;\n this.retryable = options.failure?.retryable ?? options.retryable ?? false;\n const violations = options.failure?.details.violations;\n this.violations = Array.isArray(violations)\n ? violations as unknown as readonly ResourcePolicyViolation[]\n : options.violations ?? [];\n this.cause = options.cause;\n }\n\n get failureId(): string | undefined { return this.failure?.failure_id; }\n get category(): string | undefined { return this.failure?.category; }\n get retryAfterMs(): number | undefined { return this.failure?.retry_after_ms ?? undefined; }\n get details(): Readonly<Record<string, unknown>> { return this.failure?.details ?? {}; }\n}\n\nexport function missingCapability(name: string): Agents24ClientError {\n return new Agents24ClientError(`Required capability is unavailable: ${name}.`, {\n kind: \"missing_capability\",\n code: \"MISSING_CAPABILITY\",\n });\n}\n\nexport function abortedError(cause?: unknown): Agents24ClientError {\n return new Agents24ClientError(\"The operation was locally detached.\", {\n kind: \"aborted\",\n code: \"ABORTED\",\n cause,\n });\n}\n\nexport function protocolError(message: string, cause?: unknown): Agents24ClientError {\n return new Agents24ClientError(message, {\n kind: \"protocol\",\n code: \"PROTOCOL_ERROR\",\n cause,\n });\n}\n\nexport function errorKindForStatus(status: number): Agents24ErrorKind {\n if (status === 401) return \"authentication\";\n if (status === 403) return \"authorization\";\n if (status === 404) return \"not_found\";\n if (status === 409) return \"conflict\";\n if (status === 422 || status === 400) return \"validation\";\n if (status === 429) return \"rate_limit\";\n return \"server\";\n}\n","import { missingCapability } from \"./errors.js\";\nimport type { Clock, FetchLike, IdProvider, TextDecoderLike, TextEncoderLike } from \"./types.js\";\n\ntype GlobalCapabilities = {\n fetch?: FetchLike;\n TextDecoder?: new (label?: string, options?: { fatal?: boolean }) => TextDecoderLike;\n TextEncoder?: new () => TextEncoderLike;\n crypto?: {\n randomUUID?: () => string;\n getRandomValues?: (array: Uint8Array) => Uint8Array;\n };\n};\n\nfunction globals(): GlobalCapabilities {\n return globalThis as unknown as GlobalCapabilities;\n}\n\nexport function resolveFetch(injected?: FetchLike): FetchLike {\n if (injected) return injected;\n const implementation = globals().fetch;\n if (!implementation) throw missingCapability(\"fetch\");\n return implementation.bind(globalThis) as FetchLike;\n}\n\nexport function resolveDecoderFactory(\n injected?: () => TextDecoderLike,\n): () => TextDecoderLike {\n if (injected) return injected;\n const Constructor = globals().TextDecoder;\n if (!Constructor) throw missingCapability(\"TextDecoder\");\n return () => new Constructor(\"utf-8\", { fatal: true });\n}\n\nexport function resolveEncoder(injected?: TextEncoderLike): TextEncoderLike {\n if (injected) return injected;\n const Constructor = globals().TextEncoder;\n if (!Constructor) throw missingCapability(\"TextEncoder\");\n return new Constructor();\n}\n\nexport function defaultClock(): Clock {\n return { now: () => Date.now() };\n}\n\nfunction randomHex(bytes: number): string {\n const target = new Uint8Array(bytes);\n const crypto = globals().crypto;\n const getRandomValues = crypto?.getRandomValues?.bind(crypto);\n if (!getRandomValues) throw missingCapability(\"crypto.getRandomValues\");\n getRandomValues(target);\n return Array.from(target, (value) => value.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nexport function defaultIds(): IdProvider {\n return {\n createId() {\n const crypto = globals().crypto;\n const randomUUID = crypto?.randomUUID?.bind(crypto);\n return randomUUID ? randomUUID() : randomHex(16);\n },\n };\n}\n\nexport function secureRandomBytes(length: number): Uint8Array {\n const target = new Uint8Array(length);\n const crypto = globals().crypto;\n const getRandomValues = crypto?.getRandomValues?.bind(crypto);\n if (!getRandomValues) throw missingCapability(\"crypto.getRandomValues\");\n return getRandomValues(target);\n}\n","import { Agents24ClientError, missingCapability } from \"./errors.js\";\n\ninterface UrlLike {\n protocol: string;\n username: string;\n password: string;\n hash: string;\n origin: string;\n pathname: string;\n search: string;\n toString(): string;\n}\n\ntype UrlConstructor = new (input: string, base?: string) => UrlLike;\n\nfunction urlConstructor(): UrlConstructor {\n const Constructor = (globalThis as unknown as { URL?: UrlConstructor }).URL;\n if (!Constructor) throw missingCapability(\"URL\");\n return Constructor;\n}\n\nexport function normalizeBaseUrl(input: string): string {\n let parsed: UrlLike;\n try {\n parsed = new (urlConstructor())(input);\n } catch (cause) {\n throw new Agents24ClientError(\"baseUrl must be an absolute HTTP(S) URL.\", {\n kind: \"configuration\",\n code: \"INVALID_BASE_URL\",\n cause,\n });\n }\n if (!/^https?:$/.test(parsed.protocol) || parsed.username || parsed.password || parsed.hash) {\n throw new Agents24ClientError(\"baseUrl must be an absolute HTTP(S) origin without credentials or a fragment.\", {\n kind: \"configuration\",\n code: \"INVALID_BASE_URL\",\n });\n }\n return `${parsed.origin}${parsed.pathname.replace(/\\/+$/, \"\")}`;\n}\n\nexport function absoluteUrl(baseUrl: string, path: string): string {\n return new (urlConstructor())(path, `${baseUrl}/`).toString();\n}\n\nexport function canonicalHtu(input: string): string {\n const parsed = new (urlConstructor())(input);\n parsed.search = \"\";\n parsed.hash = \"\";\n return parsed.toString();\n}\n\nexport function encodePath(value: string): string {\n return encodeURIComponent(value);\n}\n\nexport function appendQuery(path: string, values: Readonly<Record<string, string | number | boolean | undefined>>): string {\n const query = Object.entries(values)\n .filter((entry): entry is [string, string | number | boolean] => entry[1] !== undefined)\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)\n .join(\"&\");\n return query ? `${path}?${query}` : path;\n}\n","import { defaultClock } from \"./capabilities.js\";\nimport { Agents24ClientError, errorKindForStatus, type FailureView } from \"./errors.js\";\nimport { absoluteUrl } from \"./url.js\";\nimport type {\n AbortSignalLike,\n ClientSessionAccess,\n ClientSessionProvider,\n Clock,\n FetchLike,\n FetchResponseLike,\n TelemetrySink,\n} from \"./types.js\";\n\nexport interface AuthenticatedHttpOptions {\n baseUrl: string;\n sessionProvider: ClientSessionProvider;\n fetch: FetchLike;\n clock?: Clock;\n telemetry?: TelemetrySink;\n}\n\nexport interface HttpRequestOptions {\n body?: unknown;\n rawBody?: unknown;\n contentType?: string;\n accept?: string;\n idempotencyKey?: string;\n headers?: Readonly<Record<string, string>>;\n signal?: AbortSignalLike | undefined;\n operation: string;\n}\n\nconst RESERVED_REQUEST_HEADERS = new Set([\n \"accept\",\n \"authorization\",\n \"cache-control\",\n \"content-type\",\n \"cookie\",\n \"dpop\",\n \"host\",\n \"idempotency-key\",\n \"origin\",\n \"pragma\",\n \"proxy-authorization\",\n]);\n\nfunction safeToken(value: string, field: string): string {\n if (!value || /[\\r\\n\\0]/.test(value)) {\n throw new Agents24ClientError(`${field} is invalid.`, {\n kind: \"configuration\",\n code: \"INVALID_CREDENTIAL\",\n });\n }\n return value;\n}\n\nfunction appendAdditionalHeaders(\n target: Record<string, string>,\n additional: Readonly<Record<string, string>> | undefined,\n): void {\n for (const [name, value] of Object.entries(additional ?? {})) {\n const normalized = name.toLowerCase();\n if (!/^[a-z0-9!#$%&'*+.^_`|~-]+$/.test(normalized) || RESERVED_REQUEST_HEADERS.has(normalized)) {\n throw new Agents24ClientError(`Reserved or invalid request header: ${name}.`, {\n kind: \"configuration\",\n code: \"RESERVED_REQUEST_HEADER\",\n });\n }\n target[name] = safeToken(value, `Request header ${name}`);\n }\n}\n\nfunction isPublicError(value: unknown): value is FailureView {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const candidate = value as Record<string, unknown>;\n return (\n candidate.schema_version === \"agents24.failure.v1\" &&\n typeof candidate.failure_id === \"string\" &&\n typeof candidate.code === \"string\" &&\n typeof candidate.category === \"string\" &&\n typeof candidate.message === \"string\" &&\n typeof candidate.retryable === \"boolean\" &&\n Boolean(candidate.details && typeof candidate.details === \"object\" && !Array.isArray(candidate.details))\n );\n}\n\nexport async function responseError(response: FetchResponseLike): Promise<Agents24ClientError> {\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n body = undefined;\n }\n if (isPublicError(body)) {\n return new Agents24ClientError(body.message, {\n kind: body.code === \"RESOURCE_POLICY_QUOTA_EXCEEDED\"\n ? \"quota\"\n : errorKindForStatus(response.status),\n code: body.code,\n status: response.status,\n failure: body,\n });\n }\n return new Agents24ClientError(\"The Agents24 runtime request failed.\", {\n kind: errorKindForStatus(response.status),\n code: `HTTP_${response.status}`,\n status: response.status,\n retryable: response.status >= 500,\n });\n}\n\nexport async function responseJson(response: FetchResponseLike): Promise<unknown> {\n try {\n return await response.json();\n } catch (cause) {\n throw new Agents24ClientError(\"The runtime returned invalid JSON.\", {\n kind: \"protocol\",\n code: \"INVALID_JSON_RESPONSE\",\n cause,\n });\n }\n}\n\nfunction assertPrivateResponse(response: FetchResponseLike): void {\n if (response.redirected || (response.status >= 300 && response.status < 400)) {\n throw new Agents24ClientError(\"Authenticated redirects are not allowed.\", {\n kind: \"network\",\n code: \"REDIRECT_REJECTED\",\n status: response.status,\n });\n }\n}\n\nexport class AuthenticatedHttp {\n readonly #baseUrl: string;\n readonly #provider: ClientSessionProvider;\n readonly #fetch: FetchLike;\n readonly #clock: Clock;\n readonly #telemetry: TelemetrySink | undefined;\n readonly #nonces = new Map<string, string>();\n #requestQueue: Promise<void> = Promise.resolve();\n\n constructor(options: AuthenticatedHttpOptions) {\n this.#baseUrl = options.baseUrl;\n this.#provider = options.sessionProvider;\n this.#fetch = options.fetch;\n this.#clock = options.clock ?? defaultClock();\n this.#telemetry = options.telemetry;\n }\n\n async #emit(event: Parameters<TelemetrySink[\"emit\"]>[0]): Promise<void> {\n try {\n await this.#telemetry?.emit(event);\n } catch {\n // Telemetry can never affect the authenticated operation.\n }\n }\n\n async #access(signal?: AbortSignalLike): Promise<ClientSessionAccess> {\n let access = await this.#provider.getAccess({ reason: \"request\", ...(signal ? { signal } : {}) });\n if (access.expiresAt <= this.#clock.now() + 30_000 && this.#provider.refresh) {\n access = await this.#provider.refresh({ reason: \"expired\", ...(signal ? { signal } : {}) });\n }\n return access;\n }\n\n async request(method: string, path: string, options: HttpRequestOptions): Promise<FetchResponseLike> {\n let releaseQueue!: () => void;\n const previousRequest = this.#requestQueue;\n this.#requestQueue = new Promise<void>((resolve) => { releaseQueue = resolve; });\n await previousRequest;\n try {\n return await this.#requestUnlocked(method, path, options);\n } finally {\n releaseQueue();\n }\n }\n\n async #requestUnlocked(method: string, path: string, options: HttpRequestOptions): Promise<FetchResponseLike> {\n const url = absoluteUrl(this.#baseUrl, path);\n const startedAt = this.#clock.now();\n let access = await this.#access(options.signal);\n let nonceRetried = false;\n let refreshRetried = false;\n let retryCount = 0;\n await this.#emit({ type: \"request.started\", operation: options.operation, method, retryCount });\n\n while (true) {\n const token = safeToken(access.accessToken, \"Access token\");\n if (access.tokenType === \"DPoP\" && !access.dpopKeyProvider) {\n throw new Agents24ClientError(\"A DPoP-bound session requires a DPoP key provider.\", {\n kind: \"configuration\",\n code: \"MISSING_DPOP_PROVIDER\",\n });\n }\n const headers: Record<string, string> = {\n Accept: options.accept ?? \"application/json\",\n Authorization: `${access.tokenType} ${token}`,\n \"Cache-Control\": \"no-store\",\n Pragma: \"no-cache\",\n };\n appendAdditionalHeaders(headers, options.headers);\n if (options.body !== undefined) headers[\"Content-Type\"] = \"application/json\";\n if (options.contentType) headers[\"Content-Type\"] = options.contentType;\n if (options.idempotencyKey) headers[\"Idempotency-Key\"] = safeToken(options.idempotencyKey, \"Idempotency key\");\n if (access.dpopKeyProvider) {\n headers.DPoP = await access.dpopKeyProvider.signProof({\n method,\n url,\n accessToken: token,\n nonce: this.#nonces.get(access.sessionId ?? \"default\") ?? access.dpopNonce,\n });\n }\n let response: FetchResponseLike;\n try {\n response = await this.#fetch(url, {\n method,\n headers,\n body: options.rawBody ?? (options.body === undefined ? undefined : JSON.stringify(options.body)),\n ...(options.signal ? { signal: options.signal } : {}),\n redirect: \"error\",\n cache: \"no-store\",\n credentials: \"omit\",\n });\n } catch (cause) {\n if (options.signal?.aborted) {\n throw new Agents24ClientError(\"The operation was locally detached.\", {\n kind: \"aborted\",\n code: \"ABORTED\",\n cause,\n });\n }\n throw new Agents24ClientError(\"The Agents24 runtime could not be reached.\", {\n kind: \"network\",\n code: \"NETWORK_ERROR\",\n retryable: true,\n cause,\n });\n }\n assertPrivateResponse(response);\n const challengedNonce = response.headers.get(\"DPoP-Nonce\");\n if (challengedNonce && access.dpopKeyProvider) {\n this.#nonces.set(access.sessionId ?? \"default\", safeToken(challengedNonce, \"DPoP nonce\"));\n }\n if (\n response.status === 401 &&\n challengedNonce &&\n access.dpopKeyProvider &&\n !nonceRetried\n ) {\n nonceRetried = true;\n retryCount += 1;\n continue;\n }\n if (response.status === 401 && this.#provider.refresh && !refreshRetried) {\n access = await this.#provider.refresh({\n reason: \"unauthorized\",\n ...(options.signal ? { signal: options.signal } : {}),\n });\n refreshRetried = true;\n nonceRetried = false;\n retryCount += 1;\n continue;\n }\n await this.#emit({\n type: \"request.completed\",\n operation: options.operation,\n method,\n status: response.status,\n durationMs: this.#clock.now() - startedAt,\n retryCount,\n });\n return response;\n }\n }\n\n async json<T>(method: string, path: string, options: HttpRequestOptions): Promise<T> {\n const response = await this.request(method, path, options);\n if (!response.ok) throw await responseError(response);\n return (await responseJson(response)) as T;\n }\n}\n\nexport async function dpopTokenRequest(input: {\n fetch: FetchLike;\n url: string;\n method?: string;\n body: unknown;\n dpopKeyProvider?: ClientSessionAccess[\"dpopKeyProvider\"];\n signal?: AbortSignalLike | undefined;\n idempotencyKey?: string;\n nonce?: string | undefined;\n prooflessInitialRequest?: boolean;\n}): Promise<FetchResponseLike> {\n const method = input.method ?? \"POST\";\n let nonce = input.nonce;\n for (let attempt = 0; attempt < 2; attempt += 1) {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n \"Cache-Control\": \"no-store\",\n Pragma: \"no-cache\",\n };\n if (input.idempotencyKey) headers[\"Idempotency-Key\"] = safeToken(input.idempotencyKey, \"Idempotency key\");\n if (input.dpopKeyProvider && !(input.prooflessInitialRequest && attempt === 0)) {\n headers.DPoP = await input.dpopKeyProvider.signProof({ method, url: input.url, nonce });\n }\n let response: FetchResponseLike;\n try {\n response = await input.fetch(input.url, {\n method,\n headers,\n body: JSON.stringify(input.body),\n ...(input.signal ? { signal: input.signal } : {}),\n redirect: \"error\",\n cache: \"no-store\",\n credentials: \"omit\",\n });\n } catch (cause) {\n if (input.signal?.aborted) {\n throw new Agents24ClientError(\"The operation was locally detached.\", {\n kind: \"aborted\",\n code: \"ABORTED\",\n cause,\n });\n }\n throw new Agents24ClientError(\"The Agents24 session endpoint could not be reached.\", {\n kind: \"network\",\n code: \"NETWORK_ERROR\",\n retryable: true,\n cause,\n });\n }\n assertPrivateResponse(response);\n const challenge = response.headers.get(\"DPoP-Nonce\");\n if (response.status === 401 && challenge && input.dpopKeyProvider && attempt === 0) {\n nonce = safeToken(challenge, \"DPoP nonce\");\n continue;\n }\n if (input.prooflessInitialRequest && input.dpopKeyProvider && attempt === 0 && response.ok) {\n throw new Agents24ClientError(\"DPoP enrollment succeeded without the required nonce challenge.\", {\n kind: \"authentication\",\n code: \"DPOP_ENROLLMENT_FAILED\",\n });\n }\n return response;\n }\n throw new Agents24ClientError(\"DPoP enrollment failed.\", {\n kind: \"authentication\",\n code: \"DPOP_ENROLLMENT_FAILED\",\n });\n}\n","import { secureRandomBytes } from \"./capabilities.js\";\nimport { Agents24ClientError } from \"./errors.js\";\nimport type { BinaryUploadData, MultipartEncoder, MultipartPart, PortableUpload, TextEncoderLike } from \"./types.js\";\n\nfunction isBlobLike(value: BinaryUploadData): value is Exclude<BinaryUploadData, Uint8Array | ArrayBuffer> {\n return typeof (value as { arrayBuffer?: unknown }).arrayBuffer === \"function\";\n}\n\nasync function toBytes(value: BinaryUploadData): Promise<Uint8Array> {\n if (value instanceof Uint8Array) return value;\n if (value instanceof ArrayBuffer) return new Uint8Array(value);\n if (isBlobLike(value)) return new Uint8Array(await value.arrayBuffer());\n throw new Agents24ClientError(\"Upload data must be bytes, an ArrayBuffer, or a compatible blob-like value.\", {\n kind: \"validation\",\n code: \"INVALID_UPLOAD_DATA\",\n });\n}\n\nfunction safeToken(value: string, field: string): string {\n if (!value || /[\\r\\n\\0]/.test(value)) {\n throw new Agents24ClientError(`${field} contains invalid characters.`, {\n kind: \"validation\",\n code: \"INVALID_MULTIPART_METADATA\",\n });\n }\n return value.replace(/[\"\\\\]/g, \"_\");\n}\n\nfunction concat(chunks: readonly Uint8Array[]): Uint8Array {\n const length = chunks.reduce((total, chunk) => total + chunk.byteLength, 0);\n const output = new Uint8Array(length);\n let offset = 0;\n for (const chunk of chunks) {\n output.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return output;\n}\n\nasync function encodePart(part: MultipartPart, boundary: string, encoder: TextEncoderLike): Promise<Uint8Array[]> {\n const field = safeToken(part.field, \"Multipart field\");\n if (typeof part.value === \"string\") {\n return [encoder.encode(`--${boundary}\\r\\nContent-Disposition: form-data; name=\"${field}\"\\r\\n\\r\\n${part.value}\\r\\n`)];\n }\n const upload = part.value as PortableUpload;\n const filename = safeToken(upload.name, \"Upload filename\");\n const mediaType = safeToken(upload.mediaType, \"Upload media type\");\n return [\n encoder.encode(\n `--${boundary}\\r\\nContent-Disposition: form-data; name=\"${field}\"; filename=\"${filename}\"\\r\\nContent-Type: ${mediaType}\\r\\n\\r\\n`,\n ),\n await toBytes(upload.data),\n encoder.encode(\"\\r\\n\"),\n ];\n}\n\nexport function createByteMultipartEncoder(encoder: TextEncoderLike): MultipartEncoder {\n return {\n async encode(parts) {\n const boundary = `agents24-${Array.from(secureRandomBytes(18), (value) => value.toString(16).padStart(2, \"0\")).join(\"\")}`;\n const chunks: Uint8Array[] = [];\n for (const part of parts) chunks.push(...(await encodePart(part, boundary, encoder)));\n chunks.push(encoder.encode(`--${boundary}--\\r\\n`));\n return {\n body: concat(chunks),\n contentType: `multipart/form-data; boundary=${boundary}`,\n };\n },\n };\n}\n","import {\n Agents24ProtocolError,\n createSseParser,\n parseRuntimeSsePayload,\n parseThreadSummarySsePayload,\n type RuntimeEvent,\n type ThreadSummaryEvent,\n} from \"./generated/protocol.js\";\nimport { Agents24ClientError } from \"./errors.js\";\nimport { responseError } from \"./http.js\";\nimport type {\n AbortSignalLike,\n FetchResponseLike,\n RuntimeEventHandler,\n StreamResult,\n TextDecoderLike,\n ThreadSummaryEventHandler,\n} from \"./types.js\";\n\nexport type RuntimeStreamState = StreamResult & {\n detachReason?: \"token_expired\" | \"revoked\" | \"policy_changed\" | \"server_detach\";\n};\n\nfunction detachReason(event: RuntimeEvent): RuntimeStreamState[\"detachReason\"] {\n if (event.event !== \"run.detached\") return undefined;\n const reason = event.payload.reason;\n if (reason === \"token_expired\" || reason === \"revoked\" || reason === \"policy_changed\") return reason;\n return \"server_detach\";\n}\n\nfunction threadId(event: RuntimeEvent): string | undefined {\n const value = event.payload.thread_id;\n return typeof value === \"string\" && value ? value : undefined;\n}\n\nasync function consumeBody(input: {\n response: FetchResponseLike;\n signal?: AbortSignalLike;\n decoder: TextDecoderLike;\n onPayload(payload: string): Promise<void>;\n}): Promise<void> {\n if (!input.response.ok) throw await responseError(input.response);\n if (!input.response.body) {\n throw new Agents24ClientError(\"The stream response did not include a readable body.\", {\n kind: \"protocol\",\n code: \"MISSING_STREAM_BODY\",\n });\n }\n const reader = input.response.body.getReader();\n let locallyAborted = input.signal?.aborted ?? false;\n const onAbort = () => {\n locallyAborted = true;\n void reader.cancel(input.signal?.reason).catch(() => undefined);\n };\n input.signal?.addEventListener(\"abort\", onAbort, { once: true });\n const parser = createSseParser({\n decoder: input.decoder,\n onPayload: input.onPayload,\n ...(input.signal ? { signal: input.signal } : {}),\n });\n try {\n while (!locallyAborted) {\n const chunk = await reader.read();\n if (chunk.value) await parser.push(chunk.value);\n if (chunk.done) break;\n }\n if (!locallyAborted) await parser.finish();\n } catch (cause) {\n if (!locallyAborted) {\n if (cause instanceof Agents24ProtocolError) throw cause;\n throw new Agents24ClientError(\"The runtime stream was interrupted.\", {\n kind: \"network\",\n code: \"STREAM_INTERRUPTED\",\n retryable: true,\n cause,\n });\n }\n } finally {\n input.signal?.removeEventListener(\"abort\", onAbort);\n reader.releaseLock?.();\n }\n if (locallyAborted) {\n throw new Agents24ClientError(\"The runtime stream was locally detached.\", {\n kind: \"aborted\",\n code: \"ABORTED\",\n retryable: false,\n });\n }\n}\n\nexport async function consumeRuntimeStream(input: {\n response: FetchResponseLike;\n signal?: AbortSignalLike;\n decoder: TextDecoderLike;\n onEvent: RuntimeEventHandler;\n afterCursor?: number;\n onProgress?: (state: RuntimeStreamState) => void;\n}): Promise<RuntimeStreamState> {\n let cursor = input.afterCursor ?? null;\n let runId: string | null = null;\n let resolvedThreadId: string | null = null;\n let detached = false;\n let streamComplete = false;\n let reason: RuntimeStreamState[\"detachReason\"];\n await consumeBody({\n response: input.response,\n ...(input.signal ? { signal: input.signal } : {}),\n decoder: input.decoder,\n async onPayload(payload) {\n const event = parseRuntimeSsePayload(payload);\n if (cursor !== null && event.seq <= cursor) return;\n // Public projections preserve the durable run cursor while omitting\n // private events, so visible sequence numbers are monotonic but may skip.\n cursor = event.seq;\n runId = event.run_id;\n resolvedThreadId = threadId(event) ?? resolvedThreadId;\n reason = detachReason(event);\n detached = reason !== undefined;\n streamComplete = (\n event.event === \"run.completed\"\n || event.event === \"run.failed\"\n || event.event === \"run.cancelled\"\n || event.event === \"run.paused\"\n );\n await input.onEvent(event);\n input.onProgress?.({\n runId,\n threadId: resolvedThreadId,\n cursor,\n detached,\n ...(reason ? { detachReason: reason } : {}),\n });\n },\n });\n if (runId && !streamComplete && !detached && !input.signal?.aborted) {\n throw new Agents24ClientError(\"The runtime stream ended before a terminal or detach event.\", {\n kind: \"network\",\n code: \"STREAM_ENDED_BEFORE_TERMINAL\",\n retryable: true,\n });\n }\n return {\n runId,\n threadId: resolvedThreadId,\n cursor,\n detached,\n ...(reason ? { detachReason: reason } : {}),\n };\n}\n\nexport async function consumeThreadSummaryStream(input: {\n response: FetchResponseLike;\n signal?: AbortSignalLike;\n decoder: TextDecoderLike;\n onEvent: ThreadSummaryEventHandler;\n afterCursor?: number;\n onCursor?: (cursor: number) => void;\n}): Promise<number | null> {\n let cursor = input.afterCursor ?? null;\n await consumeBody({\n response: input.response,\n ...(input.signal ? { signal: input.signal } : {}),\n decoder: input.decoder,\n async onPayload(payload) {\n const event: ThreadSummaryEvent = parseThreadSummarySsePayload(payload);\n if (event.event !== \"snapshot_required\" && cursor !== null && event.cursor <= cursor) return;\n cursor = cursor === null ? event.cursor : Math.max(cursor, event.cursor);\n await input.onEvent(event);\n input.onCursor?.(cursor);\n },\n });\n return cursor;\n}\n"]}