@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.
- package/README.md +36 -8
- package/compatibility.json +10 -10
- package/dist/adapters/browser.d.ts +83 -1
- package/dist/adapters/browser.js +303 -4
- package/dist/adapters/browser.js.map +1 -1
- package/dist/adapters/cloudflare.js +3 -3
- package/dist/adapters/node.js +3 -3
- package/dist/adapters/worker.js +3 -3
- package/dist/bff.js +39 -10
- package/dist/bff.js.map +1 -1
- package/dist/{chunk-QAIOKNUK.js → chunk-DEXGPNLL.js} +55 -11
- package/dist/chunk-DEXGPNLL.js.map +1 -0
- package/dist/{chunk-NGZUJ3YT.js → chunk-FLTCOJZR.js} +22 -7
- package/dist/chunk-FLTCOJZR.js.map +1 -0
- package/dist/{chunk-SCZMUBXD.js → chunk-LG3ZMQ2W.js} +47 -20
- package/dist/chunk-LG3ZMQ2W.js.map +1 -0
- package/dist/chunk-ZDLWNALI.js +569 -0
- package/dist/chunk-ZDLWNALI.js.map +1 -0
- package/dist/context-window.d.ts +16 -1
- package/dist/errors.d.ts +27 -2
- package/dist/generated/protocol.d.ts +34 -11
- package/dist/index.d.ts +4 -3
- package/dist/index.js +4 -556
- package/dist/index.js.map +1 -1
- package/dist/protocol.d.ts +2 -2
- package/dist/protocol.js +31 -1
- package/dist/protocol.js.map +1 -1
- package/dist/runtime-types.d.ts +37 -2
- package/dist/types.d.ts +139 -8
- package/package.json +1 -1
- package/dist/chunk-NGZUJ3YT.js.map +0 -1
- package/dist/chunk-QAIOKNUK.js.map +0 -1
- package/dist/chunk-SCZMUBXD.js.map +0 -1
|
@@ -1,23 +1,40 @@
|
|
|
1
|
-
import { createSseParser, Agents24ProtocolError, parseRuntimeSsePayload, parseThreadSummarySsePayload } from './chunk-
|
|
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.
|
|
18
|
-
this.
|
|
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.
|
|
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
|
-
|
|
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 (
|
|
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
|
|
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
|
-
|
|
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 && !
|
|
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-
|
|
596
|
-
//# sourceMappingURL=chunk-
|
|
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"]}
|