@agents24/node 0.2.1 → 0.3.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-07
3
+ Last Updated: 2026-08-12
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
 
@@ -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 the deployment ID, and resolve authenticated customers as `{ issuer, subject }`. 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, deployment, and optional exact Agent version on the server. `npm create agents24-app@latest` generates the complete Hono/Vite arrangement.
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.
61
61
 
62
62
  ## Customer Resource Policies
63
63
 
@@ -1,5 +1,5 @@
1
1
  {
2
- "contractHash": "13f59fd11fc838b1f7a51afe15afcdb6f1429fed94e37a1341c97061882e57d2",
2
+ "contractHash": "a409af6996d10a8d94e0f6332c9a381c3535a9c8511314b6c42b237d7e057029",
3
3
  "contractVersion": "0.2.0",
4
4
  "corpus": "conformance/v1/corpus.json",
5
5
  "generatedBy": "@agents24/sdk-contract",
@@ -15,11 +15,11 @@
15
15
  "reactDom": ">=19 <20"
16
16
  },
17
17
  "@agents24/client": {
18
- "contract": "13f59fd11fc838b1f7a51afe15afcdb6f1429fed94e37a1341c97061882e57d2",
18
+ "contract": "a409af6996d10a8d94e0f6332c9a381c3535a9c8511314b6c42b237d7e057029",
19
19
  "runtime": "run-stream.v3"
20
20
  },
21
21
  "@agents24/node": {
22
- "contract": "13f59fd11fc838b1f7a51afe15afcdb6f1429fed94e37a1341c97061882e57d2",
22
+ "contract": "a409af6996d10a8d94e0f6332c9a381c3535a9c8511314b6c42b237d7e057029",
23
23
  "node": "^22.0.0 || ^24.0.0"
24
24
  },
25
25
  "@agents24/react": {
@@ -27,11 +27,11 @@
27
27
  "react": ">=19 <20"
28
28
  },
29
29
  "@talmudpedia/runtime-sdk": {
30
- "contract": "13f59fd11fc838b1f7a51afe15afcdb6f1429fed94e37a1341c97061882e57d2",
30
+ "contract": "a409af6996d10a8d94e0f6332c9a381c3535a9c8511314b6c42b237d7e057029",
31
31
  "protocolOwner": "@agents24/client"
32
32
  },
33
33
  "agents24": {
34
- "contract": "13f59fd11fc838b1f7a51afe15afcdb6f1429fed94e37a1341c97061882e57d2",
34
+ "contract": "a409af6996d10a8d94e0f6332c9a381c3535a9c8511314b6c42b237d7e057029",
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": 78,
52
- "python": 69
51
+ "node": 79,
52
+ "python": 70
53
53
  }
54
54
  }
package/dist/bff.cjs CHANGED
@@ -252,7 +252,6 @@ 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 deploymentId = normalized(options.deploymentId, "deploymentId");
256
255
  const basePath = normalizeBasePath(options.basePath);
257
256
  const embed = options.client.embed;
258
257
  return async (request) => {
@@ -267,8 +266,10 @@ function createAgents24BffHandler(options) {
267
266
  let resolution;
268
267
  try {
269
268
  resolution = await options.resolvePrincipal(request);
270
- resolution.principal.issuer = normalized(resolution.principal.issuer, "issuer");
271
269
  resolution.principal.subject = normalized(resolution.principal.subject, "subject");
270
+ if (resolution.principal.issuer !== void 0) {
271
+ resolution.principal.issuer = normalized(resolution.principal.issuer, "issuer");
272
+ }
272
273
  } catch {
273
274
  return publicError(401, "PRINCIPAL_REQUIRED", "A valid application session is required.");
274
275
  }
@@ -277,15 +278,12 @@ function createAgents24BffHandler(options) {
277
278
  try {
278
279
  let customerPrincipalRef = "";
279
280
  if (!(request.method === "GET" && (path === "/bootstrap" || path === "/resource-policy"))) {
280
- const entitlement = await options.client.resourcePolicies.getEffectiveCustomerPolicy({
281
- issuer: principal.issuer,
282
- subject: principal.subject,
283
- deployment_id: deploymentId
281
+ const entitlement = await embed.getResourcePolicy(agentId, {
282
+ external_user_id: principal.subject,
283
+ ...principal.issuer ? { external_user_issuer: principal.issuer } : {},
284
+ ...agentVersionId ? { agent_version_id: agentVersionId } : {}
284
285
  });
285
- customerPrincipalRef = normalized(
286
- String(entitlement.customer_principal_ref || ""),
287
- "customerPrincipalRef"
288
- );
286
+ customerPrincipalRef = stringValue(entitlement.customer_principal_ref) || principal.subject;
289
287
  }
290
288
  const identity = {
291
289
  external_user_id: customerPrincipalRef,
@@ -300,10 +298,10 @@ function createAgents24BffHandler(options) {
300
298
  const raw = await embed.getRuntimeBootstrap(agentId, agentVersionId);
301
299
  response = json(bootstrapDocument(raw, agentVersionId));
302
300
  } else if (request.method === "GET" && path === "/resource-policy") {
303
- response = json(await options.client.resourcePolicies.getEffectiveCustomerPolicy({
304
- issuer: principal.issuer,
305
- subject: principal.subject,
306
- deployment_id: deploymentId
301
+ response = json(await embed.getResourcePolicy(agentId, {
302
+ external_user_id: principal.subject,
303
+ ...principal.issuer ? { external_user_issuer: principal.issuer } : {},
304
+ ...agentVersionId ? { agent_version_id: agentVersionId } : {}
307
305
  }));
308
306
  } else if (request.method === "POST" && path === "/chat/stream") {
309
307
  const body = await requestJson(request);
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 issuer: string;\n subject: 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\" | \"resourcePolicies\">;\n agentId: string;\n deploymentId: 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 deploymentId = normalized(options.deploymentId, \"deploymentId\");\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.issuer = normalized(resolution.principal.issuer, \"issuer\");\n resolution.principal.subject = normalized(resolution.principal.subject, \"subject\");\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 options.client.resourcePolicies.getEffectiveCustomerPolicy({\n issuer: principal.issuer,\n subject: principal.subject,\n deployment_id: deploymentId,\n });\n customerPrincipalRef = normalized(\n String(entitlement.customer_principal_ref || \"\"),\n \"customerPrincipalRef\",\n );\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 options.client.resourcePolicies.getEffectiveCustomerPolicy({\n issuer: principal.issuer,\n subject: principal.subject,\n deployment_id: deploymentId,\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 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"]}
package/dist/bff.d.cts CHANGED
@@ -1,9 +1,9 @@
1
- import { A as Agents24 } from './client-CnOaaCVH.cjs';
1
+ import { A as Agents24 } from './client-Rmk3dh_D.cjs';
2
2
  import '@agents24/client/protocol';
3
3
 
4
4
  interface AgentBffPrincipal {
5
- issuer: string;
6
5
  subject: string;
6
+ issuer?: string;
7
7
  externalSessionId?: string;
8
8
  }
9
9
  interface AgentBffPrincipalResolution {
@@ -11,9 +11,8 @@ interface AgentBffPrincipalResolution {
11
11
  responseHeaders?: HeadersInit;
12
12
  }
13
13
  interface Agents24BffHandlerOptions {
14
- client: Pick<Agents24, "embed" | "resourcePolicies">;
14
+ client: Pick<Agents24, "embed">;
15
15
  agentId: string;
16
- deploymentId: string;
17
16
  agentVersionId?: string;
18
17
  basePath?: string;
19
18
  resolvePrincipal(request: Request): Promise<AgentBffPrincipalResolution> | AgentBffPrincipalResolution;
package/dist/bff.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- import { A as Agents24 } from './client-CnOaaCVH.js';
1
+ import { A as Agents24 } from './client-Rmk3dh_D.js';
2
2
  import '@agents24/client/protocol';
3
3
 
4
4
  interface AgentBffPrincipal {
5
- issuer: string;
6
5
  subject: string;
6
+ issuer?: string;
7
7
  externalSessionId?: string;
8
8
  }
9
9
  interface AgentBffPrincipalResolution {
@@ -11,9 +11,8 @@ interface AgentBffPrincipalResolution {
11
11
  responseHeaders?: HeadersInit;
12
12
  }
13
13
  interface Agents24BffHandlerOptions {
14
- client: Pick<Agents24, "embed" | "resourcePolicies">;
14
+ client: Pick<Agents24, "embed">;
15
15
  agentId: string;
16
- deploymentId: string;
17
16
  agentVersionId?: string;
18
17
  basePath?: string;
19
18
  resolvePrincipal(request: Request): Promise<AgentBffPrincipalResolution> | AgentBffPrincipalResolution;
package/dist/bff.js CHANGED
@@ -250,7 +250,6 @@ 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 deploymentId = normalized(options.deploymentId, "deploymentId");
254
253
  const basePath = normalizeBasePath(options.basePath);
255
254
  const embed = options.client.embed;
256
255
  return async (request) => {
@@ -265,8 +264,10 @@ function createAgents24BffHandler(options) {
265
264
  let resolution;
266
265
  try {
267
266
  resolution = await options.resolvePrincipal(request);
268
- resolution.principal.issuer = normalized(resolution.principal.issuer, "issuer");
269
267
  resolution.principal.subject = normalized(resolution.principal.subject, "subject");
268
+ if (resolution.principal.issuer !== void 0) {
269
+ resolution.principal.issuer = normalized(resolution.principal.issuer, "issuer");
270
+ }
270
271
  } catch {
271
272
  return publicError(401, "PRINCIPAL_REQUIRED", "A valid application session is required.");
272
273
  }
@@ -275,15 +276,12 @@ function createAgents24BffHandler(options) {
275
276
  try {
276
277
  let customerPrincipalRef = "";
277
278
  if (!(request.method === "GET" && (path === "/bootstrap" || path === "/resource-policy"))) {
278
- const entitlement = await options.client.resourcePolicies.getEffectiveCustomerPolicy({
279
- issuer: principal.issuer,
280
- subject: principal.subject,
281
- deployment_id: deploymentId
279
+ const entitlement = await embed.getResourcePolicy(agentId, {
280
+ external_user_id: principal.subject,
281
+ ...principal.issuer ? { external_user_issuer: principal.issuer } : {},
282
+ ...agentVersionId ? { agent_version_id: agentVersionId } : {}
282
283
  });
283
- customerPrincipalRef = normalized(
284
- String(entitlement.customer_principal_ref || ""),
285
- "customerPrincipalRef"
286
- );
284
+ customerPrincipalRef = stringValue(entitlement.customer_principal_ref) || principal.subject;
287
285
  }
288
286
  const identity = {
289
287
  external_user_id: customerPrincipalRef,
@@ -298,10 +296,10 @@ function createAgents24BffHandler(options) {
298
296
  const raw = await embed.getRuntimeBootstrap(agentId, agentVersionId);
299
297
  response = json(bootstrapDocument(raw, agentVersionId));
300
298
  } else if (request.method === "GET" && path === "/resource-policy") {
301
- response = json(await options.client.resourcePolicies.getEffectiveCustomerPolicy({
302
- issuer: principal.issuer,
303
- subject: principal.subject,
304
- deployment_id: deploymentId
299
+ response = json(await embed.getResourcePolicy(agentId, {
300
+ external_user_id: principal.subject,
301
+ ...principal.issuer ? { external_user_issuer: principal.issuer } : {},
302
+ ...agentVersionId ? { agent_version_id: agentVersionId } : {}
305
303
  }));
306
304
  } else if (request.method === "POST" && path === "/chat/stream") {
307
305
  const body = await requestJson(request);