@agents24/node 0.3.0 → 0.4.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/node`
2
2
 
3
- Last Updated: 2026-08-12
3
+ Last Updated: 2026-08-13
4
4
 
5
5
  Trusted-server Agents24 SDK for organization-authenticated control-plane, server embed, authoring, artifact, client-deployment, and client-session mint operations. It supports Node 22 and 24 with ESM and CJS entrypoints.
6
6
 
@@ -46,7 +46,7 @@ Artifact source imports the transport-free declaration DSL:
46
46
  import { defineArtifact, tool } from "@agents24/node/artifacts";
47
47
  ```
48
48
 
49
- Self-hosted Node artifact servers use `@agents24/node/server`. That server subpath does not re-export the declaration DSL.
49
+ Self-hosted Node artifact servers use `@agents24/node/server`. That server subpath does not re-export the declaration DSL. Remote Artifacts and their generated Tools/Toolsets are stable unversioned live identities: trusted draft execution resolves the active managed development relay, while published execution resolves the active production binding. A run freezes that live catalog at admission; relay liveness and production drift stay live safety gates.
50
50
  `createArtifactServer` exposes manifest, health, connection-verification, and
51
51
  invocation routes. Registration uses
52
52
  `POST /.well-known/agents24/artifact/verify`; signed servers prove possession
@@ -57,7 +57,7 @@ This package is server-only. Never expose an organization API key to browser cod
57
57
 
58
58
  ## Same-origin BFF
59
59
 
60
- `@agents24/node/bff` exports `createAgents24BffHandler(...)`. Mount its returned Fetch handler at a same-origin path, provide an API-key client plus Agent ID, and resolve a stable customer `subject`. Supply an optional `issuer` only when an authenticated customer must receive organization-wide governance across Agents or applications. Pair it with `createBffAgentClient` from `@agents24/client/bff`. The handler rejects cross-site browser requests before principal resolution, forwards durable attach cursors, and preserves caller idempotency keys for retryable mutations. The bridge keeps the API key, Agent, and optional exact Agent version on the server; it does not use a Client Deployment. `npm create agents24-app@latest` generates the complete Hono/Vite arrangement, including an auto-generated cookie secret for its default guest session.
60
+ `@agents24/node/bff` exports `createAgents24BffHandler(...)`. Mount its returned Fetch handler at a same-origin path, provide an API-key client plus Agent ID, and resolve a stable customer `subject`. Supply an optional `issuer` only when an authenticated customer needs organization-wide governance. The bridge keeps the API key, Agent, and optional exact Agent version on the server; it does not use a Client Deployment. It can explicitly use draft runtime only with `agents.execute`; direct clients stay published-only.
61
61
 
62
62
  ## Customer Resource Policies
63
63
 
@@ -1,5 +1,5 @@
1
1
  {
2
- "contractHash": "a409af6996d10a8d94e0f6332c9a381c3535a9c8511314b6c42b237d7e057029",
2
+ "contractHash": "4012be62020727eb18b7e88cdc8067dcc605e1ecbe9d5acd12c51268e351a289",
3
3
  "contractVersion": "0.2.0",
4
4
  "corpus": "conformance/v1/corpus.json",
5
5
  "generatedBy": "@agents24/sdk-contract",
@@ -19,7 +19,7 @@
19
19
  "runtime": "run-stream.v3"
20
20
  },
21
21
  "@agents24/node": {
22
- "contract": "a409af6996d10a8d94e0f6332c9a381c3535a9c8511314b6c42b237d7e057029",
22
+ "contract": "4012be62020727eb18b7e88cdc8067dcc605e1ecbe9d5acd12c51268e351a289",
23
23
  "node": "^22.0.0 || ^24.0.0"
24
24
  },
25
25
  "@agents24/react": {
@@ -31,7 +31,7 @@
31
31
  "protocolOwner": "@agents24/client"
32
32
  },
33
33
  "agents24": {
34
- "contract": "a409af6996d10a8d94e0f6332c9a381c3535a9c8511314b6c42b237d7e057029",
34
+ "contract": "4012be62020727eb18b7e88cdc8067dcc605e1ecbe9d5acd12c51268e351a289",
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": 22,
51
- "node": 79,
52
- "python": 70
51
+ "node": 93,
52
+ "python": 84
53
53
  }
54
54
  }
package/dist/bff.cjs CHANGED
@@ -252,6 +252,8 @@ function bootstrapDocument(raw, agentVersionId) {
252
252
  function createAgents24BffHandler(options) {
253
253
  const agentId = normalized(options.agentId, "agentId");
254
254
  const agentVersionId = stringValue(options.agentVersionId);
255
+ const runtimeTarget = options.runtimeTarget || "published";
256
+ if (runtimeTarget === "draft" && agentVersionId) throw new Error("agentVersionId cannot be used with draft runtimeTarget.");
255
257
  const basePath = normalizeBasePath(options.basePath);
256
258
  const embed = options.client.embed;
257
259
  return async (request) => {
@@ -281,7 +283,8 @@ function createAgents24BffHandler(options) {
281
283
  const entitlement = await embed.getResourcePolicy(agentId, {
282
284
  external_user_id: principal.subject,
283
285
  ...principal.issuer ? { external_user_issuer: principal.issuer } : {},
284
- ...agentVersionId ? { agent_version_id: agentVersionId } : {}
286
+ ...agentVersionId ? { agent_version_id: agentVersionId } : {},
287
+ runtime_target: runtimeTarget
285
288
  });
286
289
  customerPrincipalRef = stringValue(entitlement.customer_principal_ref) || principal.subject;
287
290
  }
@@ -291,17 +294,19 @@ function createAgents24BffHandler(options) {
291
294
  };
292
295
  const threadIdentity = {
293
296
  externalUserId: customerPrincipalRef,
297
+ runtimeTarget,
294
298
  ...principal.externalSessionId ? { externalSessionId: principal.externalSessionId } : {}
295
299
  };
296
300
  let response;
297
301
  if (request.method === "GET" && path === "/bootstrap") {
298
- const raw = await embed.getRuntimeBootstrap(agentId, agentVersionId);
302
+ const raw = await embed.getRuntimeBootstrap(agentId, agentVersionId, runtimeTarget);
299
303
  response = json(bootstrapDocument(raw, agentVersionId));
300
304
  } else if (request.method === "GET" && path === "/resource-policy") {
301
305
  response = json(await embed.getResourcePolicy(agentId, {
302
306
  external_user_id: principal.subject,
303
307
  ...principal.issuer ? { external_user_issuer: principal.issuer } : {},
304
- ...agentVersionId ? { agent_version_id: agentVersionId } : {}
308
+ ...agentVersionId ? { agent_version_id: agentVersionId } : {},
309
+ runtime_target: runtimeTarget
305
310
  }));
306
311
  } else if (request.method === "POST" && path === "/chat/stream") {
307
312
  const body = await requestJson(request);
@@ -312,6 +317,7 @@ function createAgents24BffHandler(options) {
312
317
  await embed.streamAgent(agentId, {
313
318
  ...identity,
314
319
  ...agentVersionId ? { agent_version_id: agentVersionId } : {},
320
+ runtime_target: runtimeTarget,
315
321
  ...input ? { input } : {},
316
322
  attachment_ids: attachmentIds,
317
323
  ...stringValue(body.threadId) ? { thread_id: stringValue(body.threadId) } : {},
@@ -331,6 +337,7 @@ function createAgents24BffHandler(options) {
331
337
  response = sseResponse(async (write) => {
332
338
  await embed.attachAgentRun(agentId, runId, {
333
339
  ...identity,
340
+ runtime_target: runtimeTarget,
334
341
  ...cursor === void 0 ? {} : { cursor: Number(cursor) }
335
342
  }, (event) => write(event), {
336
343
  idempotencyKey,
@@ -358,6 +365,7 @@ function createAgents24BffHandler(options) {
358
365
  }
359
366
  response = json(await embed.setAgentRunFeedback(agentId, runId, {
360
367
  ...identity,
368
+ runtime_target: runtimeTarget,
361
369
  rating,
362
370
  ...rating === "dislike" && reason ? { reason } : {},
363
371
  ...rating === "dislike" && comment ? { comment } : {}
@@ -367,6 +375,7 @@ function createAgents24BffHandler(options) {
367
375
  const limit = Number(url.searchParams.get("limit") || 20);
368
376
  response = json(await embed.listAgentThreads(agentId, {
369
377
  ...threadIdentity,
378
+ runtimeTarget,
370
379
  skip: Number.isFinite(skip) ? skip : 0,
371
380
  limit: Number.isFinite(limit) ? limit : 20
372
381
  }));
@@ -414,6 +423,7 @@ function createAgents24BffHandler(options) {
414
423
  response = json(await embed.createAttachmentContentAccess(agentId, attachmentId, {
415
424
  external_user_id: threadIdentity.externalUserId,
416
425
  ...threadIdentity.externalSessionId ? { external_session_id: threadIdentity.externalSessionId } : {},
426
+ runtime_target: runtimeTarget,
417
427
  disposition
418
428
  }));
419
429
  } else if (request.method === "POST" && /^\/runs\/[^/]+\/hitl\/[^/]+\/resume$/.test(path)) {
@@ -423,6 +433,7 @@ function createAgents24BffHandler(options) {
423
433
  const body = await requestJson(request);
424
434
  response = json(await embed.resumeAgentRun(agentId, runId, {
425
435
  ...identity,
436
+ runtime_target: runtimeTarget,
426
437
  schema_version: "agents24.hitl.resume.v2",
427
438
  interrupt_id: normalized(interruptId, "interruptId"),
428
439
  action: normalized(String(body.action || ""), "action"),
@@ -437,6 +448,7 @@ function createAgents24BffHandler(options) {
437
448
  const callbackOrigin = new URL(request.url).origin;
438
449
  response = json(await embed.startAgentRunMcpAuth(agentId, normalized(runId, "runId"), normalized(serverId, "serverId"), {
439
450
  ...identity,
451
+ runtime_target: runtimeTarget,
440
452
  interrupt_id: normalized(String(body.interruptId || ""), "interruptId"),
441
453
  callback_origin: callbackOrigin,
442
454
  popup_nonce: normalized(String(body.popupNonce || ""), "popupNonce")
package/dist/bff.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/bff.ts"],"names":["randomUUID"],"mappings":"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","file":"bff.cjs","sourcesContent":["export type Agents24SDKErrorKind = \"protocol\" | \"network\" | \"http\";\nexport type Agents24NodeErrorKind = Agents24SDKErrorKind;\nimport type { FailureView } from \"./types.js\";\n\nexport class Agents24SDKError extends Error {\n readonly kind: Agents24SDKErrorKind;\n readonly status?: number;\n readonly failure?: FailureView;\n readonly responseHeaders?: Readonly<Record<string, string>>;\n\n constructor(\n message: string,\n options: {\n kind: Agents24SDKErrorKind;\n status?: number;\n failure?: FailureView;\n responseHeaders?: Readonly<Record<string, string>>;\n cause?: unknown;\n },\n ) {\n super(message, { cause: options.cause });\n this.name = \"Agents24SDKError\";\n this.kind = options.kind;\n this.status = options.status;\n this.failure = options.failure;\n this.responseHeaders = options.responseHeaders;\n }\n\n get code(): string | undefined { return this.failure?.code; }\n get category(): string | undefined { return this.failure?.category; }\n get failureId(): string | undefined { return this.failure?.failure_id; }\n get requestId(): string | undefined { return this.failure?.request_id ?? undefined; }\n get retryable(): boolean { return this.failure?.retryable ?? false; }\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 { Agents24SDKError as Agents24NodeError };\n","import { randomUUID } from \"node:crypto\";\n\nimport type { Agents24 } from \"./client.js\";\nimport { Agents24SDKError } from \"./errors.js\";\nimport type { RuntimeEvent, ThreadSummaryEvent, ToolInputOverrides } from \"./types.js\";\n\nexport interface AgentBffPrincipal {\n subject: string;\n issuer?: string;\n externalSessionId?: string;\n}\n\nexport interface AgentBffPrincipalResolution {\n principal: AgentBffPrincipal;\n responseHeaders?: HeadersInit;\n}\n\nexport interface Agents24BffHandlerOptions {\n client: Pick<Agents24, \"embed\">;\n agentId: string;\n agentVersionId?: string;\n basePath?: string;\n resolvePrincipal(request: Request): Promise<AgentBffPrincipalResolution> | AgentBffPrincipalResolution;\n revokePrincipal?(\n request: Request,\n principal: AgentBffPrincipal,\n ): Promise<HeadersInit | void> | HeadersInit | void;\n}\n\nexport type Agents24BffHandler = (request: Request) => Promise<Response>;\n\nconst JSON_LIMIT_BYTES = 1_048_576;\n\nfunction normalized(value: string, field: string): string {\n const result = String(value || \"\").trim();\n if (!result || /[\\r\\n\\0]/.test(result)) throw new Error(`${field} is required.`);\n return result;\n}\n\nfunction normalizeBasePath(value: string | undefined): string {\n const path = String(value || \"/api/agents24\").trim().replace(/\\/+$/, \"\");\n if (!path.startsWith(\"/\") || /[\\r\\n\\0?#]/.test(path)) throw new Error(\"basePath must be an absolute path.\");\n return path;\n}\n\nfunction browserRequestIsSameOrigin(request: Request): boolean {\n const fetchSite = String(request.headers.get(\"sec-fetch-site\") || \"\").trim().toLowerCase();\n if (fetchSite) return fetchSite === \"same-origin\";\n\n const rawOrigin = String(request.headers.get(\"origin\") || \"\").trim();\n if (!rawOrigin) return true;\n try {\n return rawOrigin !== \"null\" && new URL(rawOrigin).origin === new URL(request.url).origin;\n } catch {\n return false;\n }\n}\n\nfunction publicError(\n status: number,\n code: string,\n message: string,\n retryable = false,\n violations?: readonly Record<string, unknown>[],\n): Response {\n const category = status === 401 ? \"authentication\"\n : status === 403 ? \"authorization\"\n : status === 404 ? \"not_found\"\n : status === 409 ? \"conflict\"\n : status === 429 ? \"rate_limit\"\n : status >= 500 ? \"internal\"\n : \"validation\";\n return Response.json({\n schema_version: \"agents24.failure.v1\",\n failure_id: randomUUID(),\n code,\n category,\n message,\n request_id: randomUUID(),\n retryable,\n retry_after_ms: null,\n details: violations?.length ? { violations } : {},\n }, {\n status,\n headers: { \"Cache-Control\": \"no-store\", \"Content-Type\": \"application/json; charset=utf-8\" },\n });\n}\n\nfunction safeResourcePolicyError(details: unknown): {\n failureId: string;\n code: string;\n category: \"policy\" | \"quota\";\n message: string;\n requestId: string | null;\n retryable: boolean;\n retryAfterMs: number | null;\n violations?: readonly Record<string, unknown>[];\n} | null {\n if (!details || typeof details !== \"object\" || Array.isArray(details)) return null;\n const outer = details as Record<string, unknown>;\n const candidate = outer.schema_version === \"agents24.failure.v1\"\n ? outer\n : outer.detail && typeof outer.detail === \"object\" && !Array.isArray(outer.detail)\n ? outer.detail as Record<string, unknown>\n : outer;\n const code = typeof candidate.code === \"string\" ? candidate.code : \"\";\n if (![\"RESOURCE_POLICY_ACCESS_DENIED\", \"RESOURCE_POLICY_QUOTA_EXCEEDED\", \"RESOURCE_POLICY_CONFIGURATION_ERROR\"].includes(code)) return null;\n const failureId = typeof candidate.failure_id === \"string\" && candidate.failure_id.trim()\n ? candidate.failure_id\n : \"\";\n if (!failureId) return null;\n const message = typeof candidate.message === \"string\" && candidate.message.trim()\n ? candidate.message.trim()\n : \"The resource policy prevented this request.\";\n const allowedViolationKeys = new Set([\n \"policy_subject_type\", \"rule_type\", \"aggregation_scope\", \"resource_type\",\n \"resource_name\", \"quota_unit\", \"quota_window\", \"limit\", \"remaining\", \"resets_at\",\n ]);\n const candidateDetails = candidate.details && typeof candidate.details === \"object\"\n ? candidate.details as Record<string, unknown>\n : candidate;\n const violations = Array.isArray(candidateDetails.violations)\n ? candidateDetails.violations.flatMap((item): Record<string, unknown>[] => {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) return [];\n return [Object.fromEntries(\n Object.entries(item as Record<string, unknown>)\n .filter(([key, value]) => allowedViolationKeys.has(key) && [\"string\", \"number\"].includes(typeof value)),\n )];\n }).filter((item) => Object.keys(item).length > 0).slice(0, 20)\n : undefined;\n return {\n failureId,\n code,\n category: code === \"RESOURCE_POLICY_QUOTA_EXCEEDED\" ? \"quota\" : \"policy\",\n message,\n requestId: typeof candidate.request_id === \"string\" ? candidate.request_id : null,\n retryable: candidate.retryable === true,\n retryAfterMs: typeof candidate.retry_after_ms === \"number\" && candidate.retry_after_ms >= 0\n ? candidate.retry_after_ms\n : null,\n ...(violations?.length ? { violations } : {}),\n };\n}\n\nfunction resourcePolicyFailureResponse(\n status: number,\n failure: NonNullable<ReturnType<typeof safeResourcePolicyError>>,\n): Response {\n return Response.json({\n schema_version: \"agents24.failure.v1\",\n failure_id: failure.failureId,\n code: failure.code,\n category: failure.category,\n message: failure.message,\n retryable: failure.retryable,\n request_id: failure.requestId,\n retry_after_ms: failure.retryAfterMs,\n details: failure.violations?.length ? { violations: failure.violations } : {},\n }, {\n status,\n headers: { \"Cache-Control\": \"no-store\", \"Content-Type\": \"application/json; charset=utf-8\" },\n });\n}\n\nfunction errorResponse(error: unknown): Response {\n const isSdkError = error instanceof Agents24SDKError || (\n error instanceof Error\n && error.name === \"Agents24SDKError\"\n && \"kind\" in error\n && [\"protocol\", \"network\", \"http\"].includes(String(error.kind))\n );\n if (isSdkError) {\n const sdkError = error as Agents24SDKError;\n const status = sdkError.status && sdkError.status >= 400 && sdkError.status <= 599 ? sdkError.status : 502;\n const policyError = safeResourcePolicyError(sdkError.failure);\n if (policyError) {\n return resourcePolicyFailureResponse(status, policyError);\n }\n return publicError(status, `UPSTREAM_${status}`, \"The Agent request failed.\", status >= 500);\n }\n return publicError(500, \"BFF_REQUEST_FAILED\", \"The Agent request could not be completed.\", true);\n}\n\nfunction mergeHeaders(response: Response, additional: HeadersInit | undefined): Response {\n if (!additional) return response;\n const headers = new Headers(response.headers);\n const extras = new Headers(additional);\n for (const [name, value] of extras) headers.append(name, value);\n return new Response(response.body, { status: response.status, statusText: response.statusText, headers });\n}\n\nfunction json(value: unknown, headers?: HeadersInit, status = 200): Response {\n const responseHeaders = new Headers(headers);\n responseHeaders.set(\"Cache-Control\", \"no-store\");\n responseHeaders.set(\"Content-Type\", \"application/json; charset=utf-8\");\n return new Response(JSON.stringify(value), { status, headers: responseHeaders });\n}\n\nasync function requestJson(request: Request): Promise<Record<string, unknown>> {\n const contentLength = Number(request.headers.get(\"content-length\") || 0);\n if (contentLength > JSON_LIMIT_BYTES) throw new BffInputError(413, \"REQUEST_TOO_LARGE\", \"The request body is too large.\");\n const value = await request.json().catch(() => null);\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new BffInputError(400, \"INVALID_JSON\", \"A JSON object is required.\");\n }\n return value as Record<string, unknown>;\n}\n\nclass BffInputError extends Error {\n constructor(readonly status: number, readonly code: string, message: string) { super(message); }\n}\n\nfunction stringValue(value: unknown): string | undefined {\n const result = typeof value === \"string\" ? value.trim() : \"\";\n return result || undefined;\n}\n\nfunction stringList(value: unknown): string[] {\n return Array.isArray(value) ? value.map(stringValue).filter((item): item is string => Boolean(item)) : [];\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" && !Array.isArray(value) ? value as Record<string, unknown> : {};\n}\n\nfunction routeId(path: string, pattern: RegExp, field: string): string {\n const match = pattern.exec(path);\n if (!match?.[1]) throw new BffInputError(404, \"NOT_FOUND\", \"The requested BFF route does not exist.\");\n try { return normalized(decodeURIComponent(match[1]), field); }\n catch { throw new BffInputError(400, \"INVALID_PATH\", `${field} is invalid.`); }\n}\n\nfunction sseHeaders(headers?: HeadersInit): Headers {\n const result = new Headers(headers);\n result.set(\"Cache-Control\", \"no-cache, no-transform\");\n result.set(\"Content-Type\", \"text/event-stream; charset=utf-8\");\n result.set(\"X-Accel-Buffering\", \"no\");\n return result;\n}\n\nfunction sseResponse(\n execute: (write: (value: unknown) => Promise<void>) => Promise<void>,\n headers?: HeadersInit,\n): Response {\n const stream = new TransformStream<Uint8Array, Uint8Array>();\n const writer = stream.writable.getWriter();\n const encoder = new TextEncoder();\n const write = (value: unknown) => writer.write(encoder.encode(`data: ${JSON.stringify(value)}\\n\\n`));\n void execute(write)\n .catch(async (error: unknown) => {\n const message = \"The Agent stream failed.\";\n const event: RuntimeEvent = {\n version: \"run-stream.v3\",\n seq: Number.MAX_SAFE_INTEGER,\n ts: new Date().toISOString(),\n event: \"run.failed\",\n run_id: \"bff-stream-error\",\n stage: \"run\",\n payload: { error: message },\n };\n await write(event).catch(() => undefined);\n })\n .finally(() => writer.close().catch(() => undefined));\n return new Response(stream.readable, { headers: sseHeaders(headers) });\n}\n\nfunction bootstrapDocument(raw: Record<string, unknown>, agentVersionId: string | undefined): Record<string, unknown> {\n const features = objectValue(raw.features);\n const selectable = objectValue(features.models).selectable === true;\n const resolvedVersionId = stringValue(raw.agent_version_id) || agentVersionId || \"\";\n const versionNumber = Number(raw.agent_version_number || 0);\n return {\n version: String(raw.version || \"agents24.embed.bootstrap.v1\"),\n deployment: {\n id: \"server-embed\",\n name: String(raw.agent_name || \"Agents24 Agent\"),\n version_policy: agentVersionId\n ? { mode: \"pinned\", version_id: agentVersionId }\n : { mode: \"latest_published\" },\n resolved_agent_version_id: resolvedVersionId,\n resolved_agent_version_number: Number.isFinite(versionNumber) ? versionNumber : 0,\n policy_epoch: 0,\n },\n authentication: { modes: [\"server_embed\"], access_token_lifetime_seconds: 0, jwks_path: \"\" },\n capabilities: [\"attachments.read\", \"attachments.write\", \"feedback.write\", ...(selectable ? [\"models.select\"] : [])],\n features,\n native_profiles: [],\n };\n}\n\nexport function createAgents24BffHandler(options: Agents24BffHandlerOptions): Agents24BffHandler {\n const agentId = normalized(options.agentId, \"agentId\");\n const agentVersionId = stringValue(options.agentVersionId);\n const basePath = normalizeBasePath(options.basePath);\n const embed = options.client.embed;\n\n return async (request) => {\n const url = new URL(request.url);\n if (url.pathname !== basePath && !url.pathname.startsWith(`${basePath}/`)) {\n return publicError(404, \"NOT_FOUND\", \"The requested BFF route does not exist.\");\n }\n if (!browserRequestIsSameOrigin(request)) {\n return publicError(403, \"BFF_ORIGIN_DENIED\", \"The BFF accepts same-origin browser requests only.\");\n }\n const path = url.pathname.slice(basePath.length) || \"/\";\n let resolution: AgentBffPrincipalResolution;\n try {\n resolution = await options.resolvePrincipal(request);\n resolution.principal.subject = normalized(resolution.principal.subject, \"subject\");\n if (resolution.principal.issuer !== undefined) {\n resolution.principal.issuer = normalized(resolution.principal.issuer, \"issuer\");\n }\n } catch {\n return publicError(401, \"PRINCIPAL_REQUIRED\", \"A valid application session is required.\");\n }\n const principal = resolution.principal;\n const idempotencyKey = stringValue(request.headers.get(\"idempotency-key\"));\n\n try {\n let customerPrincipalRef = \"\";\n if (!(request.method === \"GET\" && (path === \"/bootstrap\" || path === \"/resource-policy\"))) {\n const entitlement = await embed.getResourcePolicy(agentId, {\n external_user_id: principal.subject,\n ...(principal.issuer ? { external_user_issuer: principal.issuer } : {}),\n ...(agentVersionId ? { agent_version_id: agentVersionId } : {}),\n });\n customerPrincipalRef = stringValue(entitlement.customer_principal_ref) || principal.subject;\n }\n const identity = {\n external_user_id: customerPrincipalRef,\n ...(principal.externalSessionId ? { external_session_id: principal.externalSessionId } : {}),\n };\n const threadIdentity = {\n externalUserId: customerPrincipalRef,\n ...(principal.externalSessionId ? { externalSessionId: principal.externalSessionId } : {}),\n };\n let response: Response;\n if (request.method === \"GET\" && path === \"/bootstrap\") {\n const raw = await embed.getRuntimeBootstrap(agentId, agentVersionId) as Record<string, unknown>;\n response = json(bootstrapDocument(raw, agentVersionId));\n } else if (request.method === \"GET\" && path === \"/resource-policy\") {\n response = json(await embed.getResourcePolicy(agentId, {\n external_user_id: principal.subject,\n ...(principal.issuer ? { external_user_issuer: principal.issuer } : {}),\n ...(agentVersionId ? { agent_version_id: agentVersionId } : {}),\n }));\n } else if (request.method === \"POST\" && path === \"/chat/stream\") {\n const body = await requestJson(request);\n const input = stringValue(body.input);\n const attachmentIds = stringList(body.attachmentIds);\n if (!input && attachmentIds.length === 0) throw new BffInputError(400, \"INPUT_REQUIRED\", \"A message or attachment is required.\");\n response = sseResponse(async (write) => {\n await embed.streamAgent(agentId, {\n ...identity,\n ...(agentVersionId ? { agent_version_id: agentVersionId } : {}),\n ...(input ? { input } : {}),\n attachment_ids: attachmentIds,\n ...(stringValue(body.threadId) ? { thread_id: stringValue(body.threadId) } : {}),\n ...(stringValue(body.requestedModelId) ? { requested_model_id: stringValue(body.requestedModelId) } : {}),\n tool_inputs: objectValue(body.toolInputs) as ToolInputOverrides,\n metadata: objectValue(body.metadata),\n client: objectValue(body.client),\n }, (event) => write(event), { idempotencyKey, signal: request.signal });\n });\n } else if (request.method === \"POST\" && /^\\/runs\\/[^/]+\\/attach$/.test(path)) {\n const runId = routeId(path, /^\\/runs\\/([^/]+)\\/attach$/, \"runId\");\n const body = await requestJson(request);\n const cursor = body.cursor;\n if (cursor !== undefined && (!Number.isInteger(cursor) || Number(cursor) < 0)) {\n throw new BffInputError(400, \"INVALID_CURSOR\", \"cursor must be a non-negative integer.\");\n }\n response = sseResponse(async (write) => {\n await embed.attachAgentRun(agentId, runId, {\n ...identity,\n ...(cursor === undefined ? {} : { cursor: Number(cursor) }),\n }, (event) => write(event), {\n idempotencyKey,\n signal: request.signal,\n });\n });\n } else if (request.method === \"POST\" && /^\\/runs\\/[^/]+\\/cancel$/.test(path)) {\n const runId = routeId(path, /^\\/runs\\/([^/]+)\\/cancel$/, \"runId\");\n response = json(await embed.cancelAgentRun(agentId, runId, threadIdentity, { idempotencyKey }));\n } else if (request.method === \"PUT\" && /^\\/runs\\/[^/]+\\/feedback$/.test(path)) {\n const runId = routeId(path, /^\\/runs\\/([^/]+)\\/feedback$/, \"runId\");\n const body = await requestJson(request);\n const rating = body.rating === null ? null : stringValue(body.rating);\n const reasons = new Set([\"incorrect\", \"irrelevant\", \"incomplete\", \"unsafe\", \"citation_issue\", \"other\"]);\n const reason = stringValue(body.reason);\n const comment = stringValue(body.comment);\n if (rating !== null && rating !== \"like\" && rating !== \"dislike\") {\n throw new BffInputError(422, \"INVALID_FEEDBACK\", \"rating must be like, dislike, or null.\");\n }\n if (reason && !reasons.has(reason)) {\n throw new BffInputError(422, \"INVALID_FEEDBACK\", \"The feedback reason is invalid.\");\n }\n if (comment && comment.length > 1000) {\n throw new BffInputError(422, \"INVALID_FEEDBACK\", \"The feedback comment is too long.\");\n }\n response = json(await embed.setAgentRunFeedback(agentId, runId, {\n ...identity,\n rating,\n ...(rating === \"dislike\" && reason ? { reason: reason as import(\"./types\").FeedbackReason } : {}),\n ...(rating === \"dislike\" && comment ? { comment } : {}),\n }));\n } else if (request.method === \"GET\" && path === \"/threads\") {\n const skip = Number(url.searchParams.get(\"skip\") || 0);\n const limit = Number(url.searchParams.get(\"limit\") || 20);\n response = json(await embed.listAgentThreads(agentId, {\n ...threadIdentity,\n skip: Number.isFinite(skip) ? skip : 0,\n limit: Number.isFinite(limit) ? limit : 20,\n }));\n } else if (request.method === \"GET\" && path === \"/threads/events\") {\n const rawCursor = url.searchParams.get(\"cursor\");\n const cursor = rawCursor === null ? undefined : Number(rawCursor);\n response = sseResponse(async (write) => {\n await embed.subscribeAgentThreadEvents(agentId, {\n ...threadIdentity,\n ...(cursor !== undefined && Number.isFinite(cursor) ? { cursor } : {}),\n signal: request.signal,\n }, (event: ThreadSummaryEvent) => write(event));\n });\n } else if (/^\\/threads\\/[^/]+$/.test(path) && request.method === \"GET\") {\n const threadId = routeId(path, /^\\/threads\\/([^/]+)$/, \"threadId\");\n const rawBefore = url.searchParams.get(\"before_turn_index\");\n const rawLimit = url.searchParams.get(\"limit\");\n const before = rawBefore === null ? undefined : Number(rawBefore);\n const limit = rawLimit === null ? undefined : Number(rawLimit);\n response = json(await embed.getAgentThread(agentId, threadId, {\n ...threadIdentity,\n ...(before !== undefined && Number.isFinite(before) ? { beforeTurnIndex: before } : {}),\n ...(limit !== undefined && Number.isFinite(limit) ? { limit } : {}),\n }));\n } else if (/^\\/threads\\/[^/]+$/.test(path) && request.method === \"DELETE\") {\n const threadId = routeId(path, /^\\/threads\\/([^/]+)$/, \"threadId\");\n response = json(await embed.deleteAgentThread(agentId, threadId, threadIdentity, { idempotencyKey }));\n } else if (request.method === \"POST\" && path === \"/attachments/upload\") {\n const form = await request.formData();\n const files = form.getAll(\"files\").filter((entry): entry is File => entry instanceof File);\n if (files.length === 0) throw new BffInputError(400, \"ATTACHMENT_REQUIRED\", \"At least one attachment is required.\");\n response = json(await embed.uploadAgentAttachments(agentId, {\n ...threadIdentity,\n files,\n ...(stringValue(form.get(\"thread_id\")) ? { threadId: stringValue(form.get(\"thread_id\")) } : {}),\n idempotencyKey,\n }));\n } else if (request.method === \"POST\" && /^\\/attachments\\/[^/]+\\/content-access$/.test(path)) {\n const attachmentId = routeId(path, /^\\/attachments\\/([^/]+)\\/content-access$/, \"attachmentId\");\n const body = await requestJson(request);\n const disposition = stringValue(body.disposition);\n if (disposition !== \"inline\" && disposition !== \"attachment\") {\n throw new BffInputError(400, \"INVALID_DISPOSITION\", \"Attachment disposition is invalid.\");\n }\n response = json(await embed.createAttachmentContentAccess(agentId, attachmentId, {\n external_user_id: threadIdentity.externalUserId,\n ...(threadIdentity.externalSessionId ? { external_session_id: threadIdentity.externalSessionId } : {}),\n disposition,\n }));\n } else if (request.method === \"POST\" && /^\\/runs\\/[^/]+\\/hitl\\/[^/]+\\/resume$/.test(path)) {\n const match = /^\\/runs\\/([^/]+)\\/hitl\\/([^/]+)\\/resume$/.exec(path);\n const runId = routeId(path, /^\\/runs\\/([^/]+)\\/hitl\\//, \"runId\");\n const interruptId = match?.[2] ? decodeURIComponent(match[2]) : \"\";\n const body = await requestJson(request);\n response = json(await embed.resumeAgentRun(agentId, runId, {\n ...identity,\n schema_version: \"agents24.hitl.resume.v2\",\n interrupt_id: normalized(interruptId, \"interruptId\"),\n action: normalized(String(body.action || \"\"), \"action\") as \"approve\" | \"reject\" | \"connect\" | \"skip\" | \"respond\",\n ...(stringValue(body.comment) ? { comment: stringValue(body.comment) } : {}),\n ...(Array.isArray(body.answers) ? { answers: body.answers as import(\"./types\").HitlAnswer[] } : {}),\n }, { idempotencyKey }));\n } else if (request.method === \"POST\" && /^\\/runs\\/[^/]+\\/mcp\\/servers\\/[^/]+\\/auth\\/start$/.test(path)) {\n const match = /^\\/runs\\/([^/]+)\\/mcp\\/servers\\/([^/]+)\\/auth\\/start$/.exec(path);\n const runId = match?.[1] ? decodeURIComponent(match[1]) : \"\";\n const serverId = match?.[2] ? decodeURIComponent(match[2]) : \"\";\n const body = await requestJson(request);\n const callbackOrigin = new URL(request.url).origin;\n response = json(await embed.startAgentRunMcpAuth(agentId, normalized(runId, \"runId\"), normalized(serverId, \"serverId\"), {\n ...identity,\n interrupt_id: normalized(String(body.interruptId || \"\"), \"interruptId\"),\n callback_origin: callbackOrigin,\n popup_nonce: normalized(String(body.popupNonce || \"\"), \"popupNonce\"),\n }, { idempotencyKey }));\n } else if (request.method === \"POST\" && path === \"/mcp/callback/redeem\") {\n throw new BffInputError(409, \"MCP_CALLBACK_DIRECT\", \"Server-embed MCP callbacks complete in the authorization popup.\");\n } else if (request.method === \"POST\" && path === \"/session/revoke\") {\n const headers = await options.revokePrincipal?.(request, principal);\n response = new Response(null, { status: 204, ...(headers ? { headers } : {}) });\n } else {\n response = publicError(404, \"NOT_FOUND\", \"The requested BFF route does not exist.\");\n }\n return mergeHeaders(response, resolution.responseHeaders);\n } catch (error) {\n if (error instanceof BffInputError) {\n return mergeHeaders(publicError(error.status, error.code, error.message), resolution.responseHeaders);\n }\n return mergeHeaders(errorResponse(error), resolution.responseHeaders);\n }\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/bff.ts"],"names":["randomUUID"],"mappings":"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","file":"bff.cjs","sourcesContent":["export type Agents24SDKErrorKind = \"protocol\" | \"network\" | \"http\";\nexport type Agents24NodeErrorKind = Agents24SDKErrorKind;\nimport type { FailureView } from \"./types.js\";\n\nexport class Agents24SDKError extends Error {\n readonly kind: Agents24SDKErrorKind;\n readonly status?: number;\n readonly failure?: FailureView;\n readonly responseHeaders?: Readonly<Record<string, string>>;\n\n constructor(\n message: string,\n options: {\n kind: Agents24SDKErrorKind;\n status?: number;\n failure?: FailureView;\n responseHeaders?: Readonly<Record<string, string>>;\n cause?: unknown;\n },\n ) {\n super(message, { cause: options.cause });\n this.name = \"Agents24SDKError\";\n this.kind = options.kind;\n this.status = options.status;\n this.failure = options.failure;\n this.responseHeaders = options.responseHeaders;\n }\n\n get code(): string | undefined { return this.failure?.code; }\n get category(): string | undefined { return this.failure?.category; }\n get failureId(): string | undefined { return this.failure?.failure_id; }\n get requestId(): string | undefined { return this.failure?.request_id ?? undefined; }\n get retryable(): boolean { return this.failure?.retryable ?? false; }\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 { Agents24SDKError as Agents24NodeError };\n","import { randomUUID } from \"node:crypto\";\n\nimport type { Agents24 } from \"./client.js\";\nimport { Agents24SDKError } from \"./errors.js\";\nimport type { RuntimeEvent, ThreadSummaryEvent, ToolInputOverrides } from \"./types.js\";\n\nexport interface AgentBffPrincipal {\n subject: string;\n issuer?: string;\n externalSessionId?: string;\n}\n\nexport interface AgentBffPrincipalResolution {\n principal: AgentBffPrincipal;\n responseHeaders?: HeadersInit;\n}\n\nexport interface Agents24BffHandlerOptions {\n client: Pick<Agents24, \"embed\">;\n agentId: string;\n agentVersionId?: string;\n runtimeTarget?: \"draft\" | \"published\";\n basePath?: string;\n resolvePrincipal(request: Request): Promise<AgentBffPrincipalResolution> | AgentBffPrincipalResolution;\n revokePrincipal?(\n request: Request,\n principal: AgentBffPrincipal,\n ): Promise<HeadersInit | void> | HeadersInit | void;\n}\n\nexport type Agents24BffHandler = (request: Request) => Promise<Response>;\n\nconst JSON_LIMIT_BYTES = 1_048_576;\n\nfunction normalized(value: string, field: string): string {\n const result = String(value || \"\").trim();\n if (!result || /[\\r\\n\\0]/.test(result)) throw new Error(`${field} is required.`);\n return result;\n}\n\nfunction normalizeBasePath(value: string | undefined): string {\n const path = String(value || \"/api/agents24\").trim().replace(/\\/+$/, \"\");\n if (!path.startsWith(\"/\") || /[\\r\\n\\0?#]/.test(path)) throw new Error(\"basePath must be an absolute path.\");\n return path;\n}\n\nfunction browserRequestIsSameOrigin(request: Request): boolean {\n const fetchSite = String(request.headers.get(\"sec-fetch-site\") || \"\").trim().toLowerCase();\n if (fetchSite) return fetchSite === \"same-origin\";\n\n const rawOrigin = String(request.headers.get(\"origin\") || \"\").trim();\n if (!rawOrigin) return true;\n try {\n return rawOrigin !== \"null\" && new URL(rawOrigin).origin === new URL(request.url).origin;\n } catch {\n return false;\n }\n}\n\nfunction publicError(\n status: number,\n code: string,\n message: string,\n retryable = false,\n violations?: readonly Record<string, unknown>[],\n): Response {\n const category = status === 401 ? \"authentication\"\n : status === 403 ? \"authorization\"\n : status === 404 ? \"not_found\"\n : status === 409 ? \"conflict\"\n : status === 429 ? \"rate_limit\"\n : status >= 500 ? \"internal\"\n : \"validation\";\n return Response.json({\n schema_version: \"agents24.failure.v1\",\n failure_id: randomUUID(),\n code,\n category,\n message,\n request_id: randomUUID(),\n retryable,\n retry_after_ms: null,\n details: violations?.length ? { violations } : {},\n }, {\n status,\n headers: { \"Cache-Control\": \"no-store\", \"Content-Type\": \"application/json; charset=utf-8\" },\n });\n}\n\nfunction safeResourcePolicyError(details: unknown): {\n failureId: string;\n code: string;\n category: \"policy\" | \"quota\";\n message: string;\n requestId: string | null;\n retryable: boolean;\n retryAfterMs: number | null;\n violations?: readonly Record<string, unknown>[];\n} | null {\n if (!details || typeof details !== \"object\" || Array.isArray(details)) return null;\n const outer = details as Record<string, unknown>;\n const candidate = outer.schema_version === \"agents24.failure.v1\"\n ? outer\n : outer.detail && typeof outer.detail === \"object\" && !Array.isArray(outer.detail)\n ? outer.detail as Record<string, unknown>\n : outer;\n const code = typeof candidate.code === \"string\" ? candidate.code : \"\";\n if (![\"RESOURCE_POLICY_ACCESS_DENIED\", \"RESOURCE_POLICY_QUOTA_EXCEEDED\", \"RESOURCE_POLICY_CONFIGURATION_ERROR\"].includes(code)) return null;\n const failureId = typeof candidate.failure_id === \"string\" && candidate.failure_id.trim()\n ? candidate.failure_id\n : \"\";\n if (!failureId) return null;\n const message = typeof candidate.message === \"string\" && candidate.message.trim()\n ? candidate.message.trim()\n : \"The resource policy prevented this request.\";\n const allowedViolationKeys = new Set([\n \"policy_subject_type\", \"rule_type\", \"aggregation_scope\", \"resource_type\",\n \"resource_name\", \"quota_unit\", \"quota_window\", \"limit\", \"remaining\", \"resets_at\",\n ]);\n const candidateDetails = candidate.details && typeof candidate.details === \"object\"\n ? candidate.details as Record<string, unknown>\n : candidate;\n const violations = Array.isArray(candidateDetails.violations)\n ? candidateDetails.violations.flatMap((item): Record<string, unknown>[] => {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) return [];\n return [Object.fromEntries(\n Object.entries(item as Record<string, unknown>)\n .filter(([key, value]) => allowedViolationKeys.has(key) && [\"string\", \"number\"].includes(typeof value)),\n )];\n }).filter((item) => Object.keys(item).length > 0).slice(0, 20)\n : undefined;\n return {\n failureId,\n code,\n category: code === \"RESOURCE_POLICY_QUOTA_EXCEEDED\" ? \"quota\" : \"policy\",\n message,\n requestId: typeof candidate.request_id === \"string\" ? candidate.request_id : null,\n retryable: candidate.retryable === true,\n retryAfterMs: typeof candidate.retry_after_ms === \"number\" && candidate.retry_after_ms >= 0\n ? candidate.retry_after_ms\n : null,\n ...(violations?.length ? { violations } : {}),\n };\n}\n\nfunction resourcePolicyFailureResponse(\n status: number,\n failure: NonNullable<ReturnType<typeof safeResourcePolicyError>>,\n): Response {\n return Response.json({\n schema_version: \"agents24.failure.v1\",\n failure_id: failure.failureId,\n code: failure.code,\n category: failure.category,\n message: failure.message,\n retryable: failure.retryable,\n request_id: failure.requestId,\n retry_after_ms: failure.retryAfterMs,\n details: failure.violations?.length ? { violations: failure.violations } : {},\n }, {\n status,\n headers: { \"Cache-Control\": \"no-store\", \"Content-Type\": \"application/json; charset=utf-8\" },\n });\n}\n\nfunction errorResponse(error: unknown): Response {\n const isSdkError = error instanceof Agents24SDKError || (\n error instanceof Error\n && error.name === \"Agents24SDKError\"\n && \"kind\" in error\n && [\"protocol\", \"network\", \"http\"].includes(String(error.kind))\n );\n if (isSdkError) {\n const sdkError = error as Agents24SDKError;\n const status = sdkError.status && sdkError.status >= 400 && sdkError.status <= 599 ? sdkError.status : 502;\n const policyError = safeResourcePolicyError(sdkError.failure);\n if (policyError) {\n return resourcePolicyFailureResponse(status, policyError);\n }\n return publicError(status, `UPSTREAM_${status}`, \"The Agent request failed.\", status >= 500);\n }\n return publicError(500, \"BFF_REQUEST_FAILED\", \"The Agent request could not be completed.\", true);\n}\n\nfunction mergeHeaders(response: Response, additional: HeadersInit | undefined): Response {\n if (!additional) return response;\n const headers = new Headers(response.headers);\n const extras = new Headers(additional);\n for (const [name, value] of extras) headers.append(name, value);\n return new Response(response.body, { status: response.status, statusText: response.statusText, headers });\n}\n\nfunction json(value: unknown, headers?: HeadersInit, status = 200): Response {\n const responseHeaders = new Headers(headers);\n responseHeaders.set(\"Cache-Control\", \"no-store\");\n responseHeaders.set(\"Content-Type\", \"application/json; charset=utf-8\");\n return new Response(JSON.stringify(value), { status, headers: responseHeaders });\n}\n\nasync function requestJson(request: Request): Promise<Record<string, unknown>> {\n const contentLength = Number(request.headers.get(\"content-length\") || 0);\n if (contentLength > JSON_LIMIT_BYTES) throw new BffInputError(413, \"REQUEST_TOO_LARGE\", \"The request body is too large.\");\n const value = await request.json().catch(() => null);\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new BffInputError(400, \"INVALID_JSON\", \"A JSON object is required.\");\n }\n return value as Record<string, unknown>;\n}\n\nclass BffInputError extends Error {\n constructor(readonly status: number, readonly code: string, message: string) { super(message); }\n}\n\nfunction stringValue(value: unknown): string | undefined {\n const result = typeof value === \"string\" ? value.trim() : \"\";\n return result || undefined;\n}\n\nfunction stringList(value: unknown): string[] {\n return Array.isArray(value) ? value.map(stringValue).filter((item): item is string => Boolean(item)) : [];\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" && !Array.isArray(value) ? value as Record<string, unknown> : {};\n}\n\nfunction routeId(path: string, pattern: RegExp, field: string): string {\n const match = pattern.exec(path);\n if (!match?.[1]) throw new BffInputError(404, \"NOT_FOUND\", \"The requested BFF route does not exist.\");\n try { return normalized(decodeURIComponent(match[1]), field); }\n catch { throw new BffInputError(400, \"INVALID_PATH\", `${field} is invalid.`); }\n}\n\nfunction sseHeaders(headers?: HeadersInit): Headers {\n const result = new Headers(headers);\n result.set(\"Cache-Control\", \"no-cache, no-transform\");\n result.set(\"Content-Type\", \"text/event-stream; charset=utf-8\");\n result.set(\"X-Accel-Buffering\", \"no\");\n return result;\n}\n\nfunction sseResponse(\n execute: (write: (value: unknown) => Promise<void>) => Promise<void>,\n headers?: HeadersInit,\n): Response {\n const stream = new TransformStream<Uint8Array, Uint8Array>();\n const writer = stream.writable.getWriter();\n const encoder = new TextEncoder();\n const write = (value: unknown) => writer.write(encoder.encode(`data: ${JSON.stringify(value)}\\n\\n`));\n void execute(write)\n .catch(async (error: unknown) => {\n const message = \"The Agent stream failed.\";\n const event: RuntimeEvent = {\n version: \"run-stream.v3\",\n seq: Number.MAX_SAFE_INTEGER,\n ts: new Date().toISOString(),\n event: \"run.failed\",\n run_id: \"bff-stream-error\",\n stage: \"run\",\n payload: { error: message },\n };\n await write(event).catch(() => undefined);\n })\n .finally(() => writer.close().catch(() => undefined));\n return new Response(stream.readable, { headers: sseHeaders(headers) });\n}\n\nfunction bootstrapDocument(raw: Record<string, unknown>, agentVersionId: string | undefined): Record<string, unknown> {\n const features = objectValue(raw.features);\n const selectable = objectValue(features.models).selectable === true;\n const resolvedVersionId = stringValue(raw.agent_version_id) || agentVersionId || \"\";\n const versionNumber = Number(raw.agent_version_number || 0);\n return {\n version: String(raw.version || \"agents24.embed.bootstrap.v1\"),\n deployment: {\n id: \"server-embed\",\n name: String(raw.agent_name || \"Agents24 Agent\"),\n version_policy: agentVersionId\n ? { mode: \"pinned\", version_id: agentVersionId }\n : { mode: \"latest_published\" },\n resolved_agent_version_id: resolvedVersionId,\n resolved_agent_version_number: Number.isFinite(versionNumber) ? versionNumber : 0,\n policy_epoch: 0,\n },\n authentication: { modes: [\"server_embed\"], access_token_lifetime_seconds: 0, jwks_path: \"\" },\n capabilities: [\"attachments.read\", \"attachments.write\", \"feedback.write\", ...(selectable ? [\"models.select\"] : [])],\n features,\n native_profiles: [],\n };\n}\n\nexport function createAgents24BffHandler(options: Agents24BffHandlerOptions): Agents24BffHandler {\n const agentId = normalized(options.agentId, \"agentId\");\n const agentVersionId = stringValue(options.agentVersionId);\n const runtimeTarget = options.runtimeTarget || \"published\";\n if (runtimeTarget === \"draft\" && agentVersionId) throw new Error(\"agentVersionId cannot be used with draft runtimeTarget.\");\n const basePath = normalizeBasePath(options.basePath);\n const embed = options.client.embed;\n\n return async (request) => {\n const url = new URL(request.url);\n if (url.pathname !== basePath && !url.pathname.startsWith(`${basePath}/`)) {\n return publicError(404, \"NOT_FOUND\", \"The requested BFF route does not exist.\");\n }\n if (!browserRequestIsSameOrigin(request)) {\n return publicError(403, \"BFF_ORIGIN_DENIED\", \"The BFF accepts same-origin browser requests only.\");\n }\n const path = url.pathname.slice(basePath.length) || \"/\";\n let resolution: AgentBffPrincipalResolution;\n try {\n resolution = await options.resolvePrincipal(request);\n resolution.principal.subject = normalized(resolution.principal.subject, \"subject\");\n if (resolution.principal.issuer !== undefined) {\n resolution.principal.issuer = normalized(resolution.principal.issuer, \"issuer\");\n }\n } catch {\n return publicError(401, \"PRINCIPAL_REQUIRED\", \"A valid application session is required.\");\n }\n const principal = resolution.principal;\n const idempotencyKey = stringValue(request.headers.get(\"idempotency-key\"));\n\n try {\n let customerPrincipalRef = \"\";\n if (!(request.method === \"GET\" && (path === \"/bootstrap\" || path === \"/resource-policy\"))) {\n const entitlement = await embed.getResourcePolicy(agentId, {\n external_user_id: principal.subject,\n ...(principal.issuer ? { external_user_issuer: principal.issuer } : {}),\n ...(agentVersionId ? { agent_version_id: agentVersionId } : {}),\n runtime_target: runtimeTarget,\n });\n customerPrincipalRef = stringValue(entitlement.customer_principal_ref) || principal.subject;\n }\n const identity = {\n external_user_id: customerPrincipalRef,\n ...(principal.externalSessionId ? { external_session_id: principal.externalSessionId } : {}),\n };\n const threadIdentity = {\n externalUserId: customerPrincipalRef,\n runtimeTarget,\n ...(principal.externalSessionId ? { externalSessionId: principal.externalSessionId } : {}),\n };\n let response: Response;\n if (request.method === \"GET\" && path === \"/bootstrap\") {\n const raw = await embed.getRuntimeBootstrap(agentId, agentVersionId, runtimeTarget) as Record<string, unknown>;\n response = json(bootstrapDocument(raw, agentVersionId));\n } else if (request.method === \"GET\" && path === \"/resource-policy\") {\n response = json(await embed.getResourcePolicy(agentId, {\n external_user_id: principal.subject,\n ...(principal.issuer ? { external_user_issuer: principal.issuer } : {}),\n ...(agentVersionId ? { agent_version_id: agentVersionId } : {}),\n runtime_target: runtimeTarget,\n }));\n } else if (request.method === \"POST\" && path === \"/chat/stream\") {\n const body = await requestJson(request);\n const input = stringValue(body.input);\n const attachmentIds = stringList(body.attachmentIds);\n if (!input && attachmentIds.length === 0) throw new BffInputError(400, \"INPUT_REQUIRED\", \"A message or attachment is required.\");\n response = sseResponse(async (write) => {\n await embed.streamAgent(agentId, {\n ...identity,\n ...(agentVersionId ? { agent_version_id: agentVersionId } : {}),\n runtime_target: runtimeTarget,\n ...(input ? { input } : {}),\n attachment_ids: attachmentIds,\n ...(stringValue(body.threadId) ? { thread_id: stringValue(body.threadId) } : {}),\n ...(stringValue(body.requestedModelId) ? { requested_model_id: stringValue(body.requestedModelId) } : {}),\n tool_inputs: objectValue(body.toolInputs) as ToolInputOverrides,\n metadata: objectValue(body.metadata),\n client: objectValue(body.client),\n }, (event) => write(event), { idempotencyKey, signal: request.signal });\n });\n } else if (request.method === \"POST\" && /^\\/runs\\/[^/]+\\/attach$/.test(path)) {\n const runId = routeId(path, /^\\/runs\\/([^/]+)\\/attach$/, \"runId\");\n const body = await requestJson(request);\n const cursor = body.cursor;\n if (cursor !== undefined && (!Number.isInteger(cursor) || Number(cursor) < 0)) {\n throw new BffInputError(400, \"INVALID_CURSOR\", \"cursor must be a non-negative integer.\");\n }\n response = sseResponse(async (write) => {\n await embed.attachAgentRun(agentId, runId, {\n ...identity,\n runtime_target: runtimeTarget,\n ...(cursor === undefined ? {} : { cursor: Number(cursor) }),\n }, (event) => write(event), {\n idempotencyKey,\n signal: request.signal,\n });\n });\n } else if (request.method === \"POST\" && /^\\/runs\\/[^/]+\\/cancel$/.test(path)) {\n const runId = routeId(path, /^\\/runs\\/([^/]+)\\/cancel$/, \"runId\");\n response = json(await embed.cancelAgentRun(agentId, runId, threadIdentity, { idempotencyKey }));\n } else if (request.method === \"PUT\" && /^\\/runs\\/[^/]+\\/feedback$/.test(path)) {\n const runId = routeId(path, /^\\/runs\\/([^/]+)\\/feedback$/, \"runId\");\n const body = await requestJson(request);\n const rating = body.rating === null ? null : stringValue(body.rating);\n const reasons = new Set([\"incorrect\", \"irrelevant\", \"incomplete\", \"unsafe\", \"citation_issue\", \"other\"]);\n const reason = stringValue(body.reason);\n const comment = stringValue(body.comment);\n if (rating !== null && rating !== \"like\" && rating !== \"dislike\") {\n throw new BffInputError(422, \"INVALID_FEEDBACK\", \"rating must be like, dislike, or null.\");\n }\n if (reason && !reasons.has(reason)) {\n throw new BffInputError(422, \"INVALID_FEEDBACK\", \"The feedback reason is invalid.\");\n }\n if (comment && comment.length > 1000) {\n throw new BffInputError(422, \"INVALID_FEEDBACK\", \"The feedback comment is too long.\");\n }\n response = json(await embed.setAgentRunFeedback(agentId, runId, {\n ...identity,\n runtime_target: runtimeTarget,\n rating,\n ...(rating === \"dislike\" && reason ? { reason: reason as import(\"./types\").FeedbackReason } : {}),\n ...(rating === \"dislike\" && comment ? { comment } : {}),\n }));\n } else if (request.method === \"GET\" && path === \"/threads\") {\n const skip = Number(url.searchParams.get(\"skip\") || 0);\n const limit = Number(url.searchParams.get(\"limit\") || 20);\n response = json(await embed.listAgentThreads(agentId, {\n ...threadIdentity,\n runtimeTarget,\n skip: Number.isFinite(skip) ? skip : 0,\n limit: Number.isFinite(limit) ? limit : 20,\n }));\n } else if (request.method === \"GET\" && path === \"/threads/events\") {\n const rawCursor = url.searchParams.get(\"cursor\");\n const cursor = rawCursor === null ? undefined : Number(rawCursor);\n response = sseResponse(async (write) => {\n await embed.subscribeAgentThreadEvents(agentId, {\n ...threadIdentity,\n ...(cursor !== undefined && Number.isFinite(cursor) ? { cursor } : {}),\n signal: request.signal,\n }, (event: ThreadSummaryEvent) => write(event));\n });\n } else if (/^\\/threads\\/[^/]+$/.test(path) && request.method === \"GET\") {\n const threadId = routeId(path, /^\\/threads\\/([^/]+)$/, \"threadId\");\n const rawBefore = url.searchParams.get(\"before_turn_index\");\n const rawLimit = url.searchParams.get(\"limit\");\n const before = rawBefore === null ? undefined : Number(rawBefore);\n const limit = rawLimit === null ? undefined : Number(rawLimit);\n response = json(await embed.getAgentThread(agentId, threadId, {\n ...threadIdentity,\n ...(before !== undefined && Number.isFinite(before) ? { beforeTurnIndex: before } : {}),\n ...(limit !== undefined && Number.isFinite(limit) ? { limit } : {}),\n }));\n } else if (/^\\/threads\\/[^/]+$/.test(path) && request.method === \"DELETE\") {\n const threadId = routeId(path, /^\\/threads\\/([^/]+)$/, \"threadId\");\n response = json(await embed.deleteAgentThread(agentId, threadId, threadIdentity, { idempotencyKey }));\n } else if (request.method === \"POST\" && path === \"/attachments/upload\") {\n const form = await request.formData();\n const files = form.getAll(\"files\").filter((entry): entry is File => entry instanceof File);\n if (files.length === 0) throw new BffInputError(400, \"ATTACHMENT_REQUIRED\", \"At least one attachment is required.\");\n response = json(await embed.uploadAgentAttachments(agentId, {\n ...threadIdentity,\n files,\n ...(stringValue(form.get(\"thread_id\")) ? { threadId: stringValue(form.get(\"thread_id\")) } : {}),\n idempotencyKey,\n }));\n } else if (request.method === \"POST\" && /^\\/attachments\\/[^/]+\\/content-access$/.test(path)) {\n const attachmentId = routeId(path, /^\\/attachments\\/([^/]+)\\/content-access$/, \"attachmentId\");\n const body = await requestJson(request);\n const disposition = stringValue(body.disposition);\n if (disposition !== \"inline\" && disposition !== \"attachment\") {\n throw new BffInputError(400, \"INVALID_DISPOSITION\", \"Attachment disposition is invalid.\");\n }\n response = json(await embed.createAttachmentContentAccess(agentId, attachmentId, {\n external_user_id: threadIdentity.externalUserId,\n ...(threadIdentity.externalSessionId ? { external_session_id: threadIdentity.externalSessionId } : {}),\n runtime_target: runtimeTarget,\n disposition,\n }));\n } else if (request.method === \"POST\" && /^\\/runs\\/[^/]+\\/hitl\\/[^/]+\\/resume$/.test(path)) {\n const match = /^\\/runs\\/([^/]+)\\/hitl\\/([^/]+)\\/resume$/.exec(path);\n const runId = routeId(path, /^\\/runs\\/([^/]+)\\/hitl\\//, \"runId\");\n const interruptId = match?.[2] ? decodeURIComponent(match[2]) : \"\";\n const body = await requestJson(request);\n response = json(await embed.resumeAgentRun(agentId, runId, {\n ...identity,\n runtime_target: runtimeTarget,\n schema_version: \"agents24.hitl.resume.v2\",\n interrupt_id: normalized(interruptId, \"interruptId\"),\n action: normalized(String(body.action || \"\"), \"action\") as \"approve\" | \"reject\" | \"connect\" | \"skip\" | \"respond\",\n ...(stringValue(body.comment) ? { comment: stringValue(body.comment) } : {}),\n ...(Array.isArray(body.answers) ? { answers: body.answers as import(\"./types\").HitlAnswer[] } : {}),\n }, { idempotencyKey }));\n } else if (request.method === \"POST\" && /^\\/runs\\/[^/]+\\/mcp\\/servers\\/[^/]+\\/auth\\/start$/.test(path)) {\n const match = /^\\/runs\\/([^/]+)\\/mcp\\/servers\\/([^/]+)\\/auth\\/start$/.exec(path);\n const runId = match?.[1] ? decodeURIComponent(match[1]) : \"\";\n const serverId = match?.[2] ? decodeURIComponent(match[2]) : \"\";\n const body = await requestJson(request);\n const callbackOrigin = new URL(request.url).origin;\n response = json(await embed.startAgentRunMcpAuth(agentId, normalized(runId, \"runId\"), normalized(serverId, \"serverId\"), {\n ...identity,\n runtime_target: runtimeTarget,\n interrupt_id: normalized(String(body.interruptId || \"\"), \"interruptId\"),\n callback_origin: callbackOrigin,\n popup_nonce: normalized(String(body.popupNonce || \"\"), \"popupNonce\"),\n }, { idempotencyKey }));\n } else if (request.method === \"POST\" && path === \"/mcp/callback/redeem\") {\n throw new BffInputError(409, \"MCP_CALLBACK_DIRECT\", \"Server-embed MCP callbacks complete in the authorization popup.\");\n } else if (request.method === \"POST\" && path === \"/session/revoke\") {\n const headers = await options.revokePrincipal?.(request, principal);\n response = new Response(null, { status: 204, ...(headers ? { headers } : {}) });\n } else {\n response = publicError(404, \"NOT_FOUND\", \"The requested BFF route does not exist.\");\n }\n return mergeHeaders(response, resolution.responseHeaders);\n } catch (error) {\n if (error instanceof BffInputError) {\n return mergeHeaders(publicError(error.status, error.code, error.message), resolution.responseHeaders);\n }\n return mergeHeaders(errorResponse(error), resolution.responseHeaders);\n }\n };\n}\n"]}
package/dist/bff.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { A as Agents24 } from './client-Rmk3dh_D.cjs';
1
+ import { A as Agents24 } from './client-C5ui84wi.cjs';
2
2
  import '@agents24/client/protocol';
3
3
 
4
4
  interface AgentBffPrincipal {
@@ -14,6 +14,7 @@ interface Agents24BffHandlerOptions {
14
14
  client: Pick<Agents24, "embed">;
15
15
  agentId: string;
16
16
  agentVersionId?: string;
17
+ runtimeTarget?: "draft" | "published";
17
18
  basePath?: string;
18
19
  resolvePrincipal(request: Request): Promise<AgentBffPrincipalResolution> | AgentBffPrincipalResolution;
19
20
  revokePrincipal?(request: Request, principal: AgentBffPrincipal): Promise<HeadersInit | void> | HeadersInit | void;
package/dist/bff.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { A as Agents24 } from './client-Rmk3dh_D.js';
1
+ import { A as Agents24 } from './client-C5ui84wi.js';
2
2
  import '@agents24/client/protocol';
3
3
 
4
4
  interface AgentBffPrincipal {
@@ -14,6 +14,7 @@ interface Agents24BffHandlerOptions {
14
14
  client: Pick<Agents24, "embed">;
15
15
  agentId: string;
16
16
  agentVersionId?: string;
17
+ runtimeTarget?: "draft" | "published";
17
18
  basePath?: string;
18
19
  resolvePrincipal(request: Request): Promise<AgentBffPrincipalResolution> | AgentBffPrincipalResolution;
19
20
  revokePrincipal?(request: Request, principal: AgentBffPrincipal): Promise<HeadersInit | void> | HeadersInit | void;
package/dist/bff.js CHANGED
@@ -250,6 +250,8 @@ function bootstrapDocument(raw, agentVersionId) {
250
250
  function createAgents24BffHandler(options) {
251
251
  const agentId = normalized(options.agentId, "agentId");
252
252
  const agentVersionId = stringValue(options.agentVersionId);
253
+ const runtimeTarget = options.runtimeTarget || "published";
254
+ if (runtimeTarget === "draft" && agentVersionId) throw new Error("agentVersionId cannot be used with draft runtimeTarget.");
253
255
  const basePath = normalizeBasePath(options.basePath);
254
256
  const embed = options.client.embed;
255
257
  return async (request) => {
@@ -279,7 +281,8 @@ function createAgents24BffHandler(options) {
279
281
  const entitlement = await embed.getResourcePolicy(agentId, {
280
282
  external_user_id: principal.subject,
281
283
  ...principal.issuer ? { external_user_issuer: principal.issuer } : {},
282
- ...agentVersionId ? { agent_version_id: agentVersionId } : {}
284
+ ...agentVersionId ? { agent_version_id: agentVersionId } : {},
285
+ runtime_target: runtimeTarget
283
286
  });
284
287
  customerPrincipalRef = stringValue(entitlement.customer_principal_ref) || principal.subject;
285
288
  }
@@ -289,17 +292,19 @@ function createAgents24BffHandler(options) {
289
292
  };
290
293
  const threadIdentity = {
291
294
  externalUserId: customerPrincipalRef,
295
+ runtimeTarget,
292
296
  ...principal.externalSessionId ? { externalSessionId: principal.externalSessionId } : {}
293
297
  };
294
298
  let response;
295
299
  if (request.method === "GET" && path === "/bootstrap") {
296
- const raw = await embed.getRuntimeBootstrap(agentId, agentVersionId);
300
+ const raw = await embed.getRuntimeBootstrap(agentId, agentVersionId, runtimeTarget);
297
301
  response = json(bootstrapDocument(raw, agentVersionId));
298
302
  } else if (request.method === "GET" && path === "/resource-policy") {
299
303
  response = json(await embed.getResourcePolicy(agentId, {
300
304
  external_user_id: principal.subject,
301
305
  ...principal.issuer ? { external_user_issuer: principal.issuer } : {},
302
- ...agentVersionId ? { agent_version_id: agentVersionId } : {}
306
+ ...agentVersionId ? { agent_version_id: agentVersionId } : {},
307
+ runtime_target: runtimeTarget
303
308
  }));
304
309
  } else if (request.method === "POST" && path === "/chat/stream") {
305
310
  const body = await requestJson(request);
@@ -310,6 +315,7 @@ function createAgents24BffHandler(options) {
310
315
  await embed.streamAgent(agentId, {
311
316
  ...identity,
312
317
  ...agentVersionId ? { agent_version_id: agentVersionId } : {},
318
+ runtime_target: runtimeTarget,
313
319
  ...input ? { input } : {},
314
320
  attachment_ids: attachmentIds,
315
321
  ...stringValue(body.threadId) ? { thread_id: stringValue(body.threadId) } : {},
@@ -329,6 +335,7 @@ function createAgents24BffHandler(options) {
329
335
  response = sseResponse(async (write) => {
330
336
  await embed.attachAgentRun(agentId, runId, {
331
337
  ...identity,
338
+ runtime_target: runtimeTarget,
332
339
  ...cursor === void 0 ? {} : { cursor: Number(cursor) }
333
340
  }, (event) => write(event), {
334
341
  idempotencyKey,
@@ -356,6 +363,7 @@ function createAgents24BffHandler(options) {
356
363
  }
357
364
  response = json(await embed.setAgentRunFeedback(agentId, runId, {
358
365
  ...identity,
366
+ runtime_target: runtimeTarget,
359
367
  rating,
360
368
  ...rating === "dislike" && reason ? { reason } : {},
361
369
  ...rating === "dislike" && comment ? { comment } : {}
@@ -365,6 +373,7 @@ function createAgents24BffHandler(options) {
365
373
  const limit = Number(url.searchParams.get("limit") || 20);
366
374
  response = json(await embed.listAgentThreads(agentId, {
367
375
  ...threadIdentity,
376
+ runtimeTarget,
368
377
  skip: Number.isFinite(skip) ? skip : 0,
369
378
  limit: Number.isFinite(limit) ? limit : 20
370
379
  }));
@@ -412,6 +421,7 @@ function createAgents24BffHandler(options) {
412
421
  response = json(await embed.createAttachmentContentAccess(agentId, attachmentId, {
413
422
  external_user_id: threadIdentity.externalUserId,
414
423
  ...threadIdentity.externalSessionId ? { external_session_id: threadIdentity.externalSessionId } : {},
424
+ runtime_target: runtimeTarget,
415
425
  disposition
416
426
  }));
417
427
  } else if (request.method === "POST" && /^\/runs\/[^/]+\/hitl\/[^/]+\/resume$/.test(path)) {
@@ -421,6 +431,7 @@ function createAgents24BffHandler(options) {
421
431
  const body = await requestJson(request);
422
432
  response = json(await embed.resumeAgentRun(agentId, runId, {
423
433
  ...identity,
434
+ runtime_target: runtimeTarget,
424
435
  schema_version: "agents24.hitl.resume.v2",
425
436
  interrupt_id: normalized(interruptId, "interruptId"),
426
437
  action: normalized(String(body.action || ""), "action"),
@@ -435,6 +446,7 @@ function createAgents24BffHandler(options) {
435
446
  const callbackOrigin = new URL(request.url).origin;
436
447
  response = json(await embed.startAgentRunMcpAuth(agentId, normalized(runId, "runId"), normalized(serverId, "serverId"), {
437
448
  ...identity,
449
+ runtime_target: runtimeTarget,
438
450
  interrupt_id: normalized(String(body.interruptId || ""), "interruptId"),
439
451
  callback_origin: callbackOrigin,
440
452
  popup_nonce: normalized(String(body.popupNonce || ""), "popupNonce")