@tangle-network/agent-gateway 0.7.0 → 0.8.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 +108 -6
- package/dist/chunk-GITV7CPT.js +84 -0
- package/dist/chunk-GITV7CPT.js.map +1 -0
- package/dist/chunk-J5SDVHOL.js +104 -0
- package/dist/chunk-J5SDVHOL.js.map +1 -0
- package/dist/chunk-MP6IIAIA.js +5651 -0
- package/dist/chunk-MP6IIAIA.js.map +1 -0
- package/dist/index.d.ts +76 -12
- package/dist/index.js +307 -21
- package/dist/index.js.map +1 -1
- package/dist/middleware.d.ts +7 -2
- package/dist/middleware.js +3 -2
- package/dist/nonce-store.d.ts +47 -11
- package/dist/nonce-store.js +9 -3
- package/dist/observer-types-A0RtA8uL.d.ts +95 -0
- package/dist/observer.d.ts +79 -0
- package/dist/observer.js +11 -0
- package/dist/observer.js.map +1 -0
- package/dist/{types-CX2V06cN.d.ts → types-BHISsm7D.d.ts} +423 -166
- package/dist/types.d.ts +2 -1
- package/package.json +1 -1
- package/src/a2a/agent-card.ts +4 -3
- package/src/a2a/execution-fence.ts +162 -0
- package/src/a2a/handler.ts +507 -562
- package/src/a2a/message-send-execution.ts +241 -0
- package/src/a2a/message-stream-execution.ts +392 -0
- package/src/a2a/payment-recovery.ts +431 -0
- package/src/a2a/push-config-methods.ts +158 -0
- package/src/a2a/push-notifications.ts +172 -22
- package/src/a2a/task-cancellation.ts +50 -0
- package/src/a2a/task-finalization.ts +451 -0
- package/src/a2a/task-lifecycle.ts +54 -0
- package/src/a2a/task-methods.ts +163 -0
- package/src/a2a/task-push-delivery.ts +119 -0
- package/src/a2a/task-recovery.ts +11 -0
- package/src/a2a/task-state.ts +99 -0
- package/src/a2a/task-store-sql.ts +222 -24
- package/src/a2a/task-store.ts +58 -1
- package/src/a2a/task-submission-recovery.ts +178 -0
- package/src/a2a/types.ts +1 -0
- package/src/dispatch-authorization.ts +437 -0
- package/src/dispatch-payment-recovery.ts +248 -0
- package/src/dispatch-payment.ts +425 -0
- package/src/dispatch-pricing.ts +108 -0
- package/src/dispatch-sandbox.ts +422 -0
- package/src/dispatch-settlement.ts +139 -0
- package/src/dispatch-types.ts +81 -0
- package/src/dispatch.ts +35 -462
- package/src/index.ts +64 -2
- package/src/middleware.ts +313 -32
- package/src/mpp-payment.ts +117 -0
- package/src/nonce-store.ts +122 -20
- package/src/observer-types.ts +63 -0
- package/src/observer.ts +3 -63
- package/src/payment-operations.ts +485 -0
- package/src/payment-recovery-sql.ts +108 -0
- package/src/payment-recovery-worker.ts +488 -0
- package/src/payment-recovery.ts +331 -0
- package/src/payment-types.ts +48 -0
- package/src/types.ts +153 -42
- package/src/verify.ts +265 -36
- package/dist/chunk-3IKQWFKX.js +0 -1703
- package/dist/chunk-3IKQWFKX.js.map +0 -1
- package/dist/chunk-M7ZJAK4K.js +0 -53
- package/dist/chunk-M7ZJAK4K.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/middleware.ts","../src/dispatch-pricing.ts","../src/filter.ts","../src/mpp-payment.ts","../src/verify.ts","../src/dispatch-authorization.ts","../src/payment-operations.ts","../src/payment-recovery.ts","../src/dispatch-payment-recovery.ts","../src/dispatch-payment.ts","../src/dispatch-sandbox.ts","../src/dispatch-settlement.ts","../src/a2a/agent-card.ts","../src/a2a/execution-fence.ts","../src/a2a/types.ts","../src/a2a/task-recovery.ts","../src/a2a/task-state.ts","../src/a2a/task-submission-recovery.ts","../src/a2a/payment-recovery.ts","../src/a2a/translate.ts","../src/a2a/task-finalization.ts","../src/a2a/jsonrpc.ts","../src/a2a/message-send-execution.ts","../src/a2a/task-cancellation.ts","../src/a2a/message-stream-execution.ts","../src/a2a/push-notifications.ts","../src/a2a/task-push-delivery.ts","../src/payment-recovery-worker.ts","../src/a2a/task-lifecycle.ts","../src/a2a/task-methods.ts","../src/a2a/push-config-methods.ts","../src/a2a/handler.ts","../src/a2a/task-store.ts"],"sourcesContent":["import { Hono } from 'hono'\n\nimport { createA2AHandlers } from './a2a/handler'\nimport { InMemoryTaskStore } from './a2a/task-store'\nimport {\n type AuthorizedRequest,\n type GatewayState,\n authenticateAndGuard,\n beginPaymentExecution,\n markPaymentExecutionStarted,\n renewPaymentExecution,\n claimPayment,\n dispatchSandboxStreamRich,\n releasePayment,\n releasePaymentAfterFailure,\n settleAndRecord,\n} from './dispatch'\nimport { isAtomicNonceStore, MemoryNonceStore } from './nonce-store'\nimport { type GatewayObserver, type RequestContext, generateRequestId } from './observer'\nimport {\n MemoryPaymentRecoveryStore,\n PaymentRecoveryReplayError,\n assertPaymentRecoveryConfig,\n} from './payment-recovery'\nimport { MemoryRateLimitStore, type RateLimitStore } from './rate-limit'\nimport type { ChatCompletionChunk, ChatCompletionRequest, GatewayConfig } from './types'\nimport { isApiKeyAuthEnabled, isMppAuthEnabled } from './verify'\n\n/**\n * Create a Hono router that serves the agent gateway.\n *\n * Mount at any path:\n * app.route('/v1/agents', createAgentGateway(config))\n *\n * Exposes:\n * GET /:slug/chat/completions — agent discovery metadata (Tangle-native shape)\n * POST /:slug/chat/completions — OpenAI-compatible chat endpoint (paid)\n */\nexport function createAgentGateway(inputConfig: GatewayConfig) {\n let config = inputConfig\n // Production gateways must verify x402 signatures. Tests and local\n // dev can opt into the explicit demo path.\n if (!config.x402.verifySigner && !config.x402.demoMode) {\n throw new Error(\n 'createAgentGateway: x402.verifySigner is required in production. ' +\n 'For tests, set x402.demoMode: true explicitly.',\n )\n }\n const maxOutputTokens = config.maxOutputTokens ?? 4096\n const defaultOutputTokens = config.defaultOutputTokens ?? 1024\n if (!Number.isSafeInteger(maxOutputTokens) || maxOutputTokens <= 0) {\n throw new Error('createAgentGateway: maxOutputTokens must be a positive integer')\n }\n if (\n !Number.isSafeInteger(defaultOutputTokens) ||\n defaultOutputTokens <= 0 ||\n defaultOutputTokens > maxOutputTokens\n ) {\n throw new Error(\n 'createAgentGateway: defaultOutputTokens must be a positive integer no greater than maxOutputTokens',\n )\n }\n if (\n config.x402.currencyDecimals !== undefined &&\n (!Number.isInteger(config.x402.currencyDecimals) ||\n config.x402.currencyDecimals < 0 ||\n config.x402.currencyDecimals > 18)\n ) {\n throw new Error('createAgentGateway: x402.currencyDecimals must be an integer between 0 and 18')\n }\n const executionBudget = config.executionBudget\n for (const [name, value] of [\n ['maxReasoningTokens', executionBudget?.maxReasoningTokens ?? maxOutputTokens],\n ['maxToolTokens', executionBudget?.maxToolTokens ?? maxOutputTokens],\n ['maxToolCalls', executionBudget?.maxToolCalls ?? 8],\n ] as const) {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(`createAgentGateway: executionBudget.${name} must be a non-negative safe integer`)\n }\n }\n if (\n executionBudget?.maxProviderCostUsd !== undefined &&\n (!Number.isFinite(executionBudget.maxProviderCostUsd) || executionBudget.maxProviderCostUsd < 0)\n ) {\n throw new Error('createAgentGateway: executionBudget.maxProviderCostUsd must be finite and non-negative')\n }\n if (config.x402.paymentOperations && config.x402.paymentProtocolVersion === undefined) {\n throw new Error('createAgentGateway: paymentProtocolVersion must be explicit when durable payment operations are configured')\n }\n if (\n config.x402.authorizePayment &&\n config.x402.paymentProtocolVersion !== 2 &&\n !config.x402.demoMode\n ) {\n throw new Error(\n 'createAgentGateway: production x402 version 1 cannot use authorizePayment; ' +\n 'use paymentProtocolVersion: 2 with paymentOperations for durable payment ownership',\n )\n }\n if (config.x402.paymentProtocolVersion === 2 &&\n (!config.x402.paymentOperations || config.x402.paymentOperations.protocolVersion !== 2)) {\n throw new Error('createAgentGateway: payment protocol version 2 requires durable payment operations')\n }\n if (config.x402.paymentProtocolVersion === 1 && config.x402.paymentOperations) {\n throw new Error('createAgentGateway: version 1 cannot be combined with version 2 payment operations')\n }\n if (\n config.a2a?.pushStore &&\n !config.x402.demoMode &&\n (!config.a2a.webhookSecret || config.a2a.webhookSecret.trim().length === 0)\n ) {\n throw new Error('createAgentGateway: production A2A push requires a webhookSecret')\n }\n const mppMethod = (config.mpp?.method ?? 'blueprintevm').toLowerCase()\n if (config.mpp?.authenticateCredential !== undefined &&\n typeof config.mpp.authenticateCredential !== 'function') {\n throw new Error('createAgentGateway: mpp.authenticateCredential must be a function')\n }\n if (config.mpp?.verifySigner !== undefined && typeof config.mpp.verifySigner !== 'function') {\n throw new Error('createAgentGateway: mpp.verifySigner must be a function')\n }\n const mppAuthenticator = typeof config.mpp?.authenticateCredential === 'function'\n ? config.mpp.authenticateCredential\n : typeof config.mpp?.verifySigner === 'function'\n ? config.mpp.verifySigner\n : undefined\n if (config.mpp?.charge && config.mpp.charge.protocolVersion !== 1) {\n throw new Error('createAgentGateway: unsupported MPP charge lifecycle version')\n }\n if (\n config.mpp?.charge &&\n mppMethod !== 'blueprintevm' &&\n !mppAuthenticator\n ) {\n throw new Error('createAgentGateway: generic MPP methods require credential authentication')\n }\n if (\n config.mpp &&\n mppMethod !== 'blueprintevm' &&\n mppAuthenticator &&\n !config.mpp.charge\n ) {\n throw new Error('createAgentGateway: generic MPP methods require a charge lifecycle')\n }\n if (config.mpp && mppMethod !== 'blueprintevm' && !mppAuthenticator) {\n throw new Error('createAgentGateway: generic MPP methods require credential authentication')\n }\n if (config.nonceStore && !isAtomicNonceStore(config.nonceStore)) {\n throw new Error('createAgentGateway: durable payment ownership requires an atomic nonce store')\n }\n const needsRecovery = config.x402.paymentProtocolVersion === 2 ||\n (mppMethod !== 'blueprintevm' && config.mpp?.charge !== undefined)\n if (needsRecovery && !config.paymentRecovery) {\n if (!config.x402.demoMode) {\n throw new Error('createAgentGateway: durable payment recovery is required in production')\n }\n config = {\n ...config,\n paymentRecovery: { store: new MemoryPaymentRecoveryStore() },\n }\n }\n if (config.paymentRecovery) assertPaymentRecoveryConfig(config.paymentRecovery)\n const gw = new Hono()\n const rateLimitStore: RateLimitStore = config.rateLimitStore ?? new MemoryRateLimitStore()\n const state: GatewayState = {\n rateLimitStore,\n nonceStore: config.nonceStore ?? new MemoryNonceStore(),\n globalRateLimit: config.rateLimit ?? { limit: 60, windowSeconds: 60 },\n requiredScope: config.requiredScope ?? 'chat',\n maxLen: config.maxMessageLength ?? 8000,\n maxOutputTokens,\n defaultOutputTokens,\n maxReasoningTokens: config.executionBudget?.maxReasoningTokens ?? maxOutputTokens,\n maxToolTokens: config.executionBudget?.maxToolTokens ?? maxOutputTokens,\n maxToolCalls: config.executionBudget?.maxToolCalls ?? 8,\n maxProviderCostUsd: config.executionBudget?.maxProviderCostUsd,\n obs: config.observer,\n }\n const obs: GatewayObserver | undefined = state.obs\n\n // --- Discovery endpoint (no auth) ---\n\n gw.get('/:slug/chat/completions', async (c) => {\n const slug = c.req.param('slug')\n const agent = await config.resolveAgent(slug)\n if (!agent || !agent.enabled) return c.json({ error: 'Agent not found or not published' }, 404)\n\n const paymentMethods: Array<Record<string, unknown>> = [\n {\n type: 'x402',\n operator: config.x402.operatorAddress,\n chain_id: config.x402.chainId,\n credits_contract: config.x402.creditsAddress,\n },\n ]\n if (isMppAuthEnabled(config)) {\n paymentMethods.push({\n type: 'mpp',\n realm: config.mpp!.realm,\n method: config.mpp!.method ?? 'blueprintevm',\n })\n }\n if (isApiKeyAuthEnabled(config)) paymentMethods.push({ type: 'api_key', prefix: 'sk_agent_' })\n\n return c.json({\n slug: agent.slug,\n pricing: {\n per_token_usd: agent.pricePerTokenUsd,\n currency: 'USD',\n platform_fee_percent: agent.platformFeePercent,\n },\n hosting: {\n mode: agent.sandboxEndpoint ? 'sovereign' : 'centralized',\n endpoint: agent.sandboxEndpoint ?? config.baseUrl ?? 'tangle.tools',\n },\n payment_methods: paymentMethods,\n capabilities: ['chat.completions', 'streaming'],\n openai_compatible: true,\n })\n })\n\n // --- Chat completions endpoint (paid) ---\n\n gw.post('/:slug/chat/completions', async (c) => {\n const slug = c.req.param('slug')\n\n // Body size limit (before parsing — DoS prevention).\n const contentLength = Number.parseInt(c.req.header('Content-Length') ?? '0', 10)\n if (contentLength > 65536) {\n const requestId = generateRequestId()\n await obs?.onBodyTooLarge?.(\n { requestId, agentSlug: slug, startMs: Date.now() },\n contentLength,\n )\n return c.json(\n {\n error: {\n message: 'Request body too large (max 64KB)',\n type: 'invalid_request',\n },\n },\n 413,\n )\n }\n\n let body: ChatCompletionRequest\n try {\n body = await c.req.json()\n } catch {\n return c.json({ error: { message: 'Invalid JSON', type: 'invalid_request' } }, 400)\n }\n if (!body.messages?.length) {\n return c.json(\n { error: { message: 'messages array required', type: 'invalid_request' } },\n 400,\n )\n }\n\n const guard = await authenticateAndGuard(\n c,\n slug,\n body.messages,\n config,\n state,\n body.max_tokens,\n )\n if (guard instanceof Response) return guard\n const authz = guard\n try {\n await claimPayment(authz, config, state)\n } catch (error) {\n const replayedGenericMpp = error instanceof PaymentRecoveryReplayError &&\n authz.paymentMethod === 'mpp' &&\n authz.mppMethod !== 'blueprintevm'\n try {\n await releasePayment(authz, config, 'payment authorization failed')\n } catch (releaseError) {\n console.error(\n `[agent-gateway] payment release failed for ${authz.requestId}:`,\n releaseError instanceof Error ? releaseError.message : String(releaseError),\n )\n }\n await obs?.onAuthFailure?.(\n {\n requestId: authz.requestId,\n agentSlug: authz.agent.slug,\n startMs: authz.startMs,\n },\n {\n method: authz.paymentMethod,\n code: replayedGenericMpp ? 'invalid_mpp_credential' : 'payment_authorization_failed',\n httpStatus: replayedGenericMpp ? 401 : 402,\n },\n )\n const status = replayedGenericMpp ? 401 : 402\n return c.json(\n {\n error: {\n message: replayedGenericMpp ? 'Invalid Payment credential' : 'Payment authorization failed',\n type: replayedGenericMpp ? 'authentication_error' : 'payment_required',\n code: replayedGenericMpp ? 'invalid_mpp_credential' : 'payment_authorization_failed',\n },\n },\n replayedGenericMpp\n ? {\n status,\n headers: {\n 'WWW-Authenticate': `Payment realm=\"${config.mpp!.realm}\", method=\"${config.mpp!.method ?? 'blueprintevm'}\"`,\n 'X-Request-Id': authz.requestId,\n },\n }\n : { status, headers: { 'X-Payment-Required': 'spendauth', 'X-Request-Id': authz.requestId } },\n )\n }\n\n return streamChatCompletions(c, authz, config, obs)\n })\n\n // --- A2A protocol surface (Google Agent-to-Agent, JSON-RPC 2.0 + AgentCard) ---\n // Mounted alongside the OpenAI-compat routes so a single agent speaks both.\n // Both surfaces share authenticateAndGuard + dispatchSandboxStream +\n // settleAndRecord, so every security and billing guarantee applies uniformly\n // regardless of which protocol the caller used.\n const taskStore = config.a2a?.taskStore ?? new InMemoryTaskStore()\n const pushStore = config.a2a?.pushStore\n try {\n const a2a = createA2AHandlers({ config, state, taskStore, pushStore })\n gw.get('/:slug/.well-known/agent.json', a2a.handleAgentCard)\n gw.post('/:slug', a2a.handleJsonRpc)\n } catch (error) {\n // An older custom store must not take down the OpenAI surface. Keep the\n // A2A surface unavailable until its owner supplies atomic methods.\n console.error(\n '[agent-gateway] A2A is unavailable until its task store is upgraded:',\n error instanceof Error ? error.message : String(error),\n )\n const unavailable = (c: import('hono').Context) => c.json(\n { error: 'A2A task persistence is not configured for concurrent workers' },\n 503,\n )\n gw.get('/:slug/.well-known/agent.json', unavailable)\n gw.post('/:slug', unavailable)\n }\n\n return gw\n}\n\n// Consumers that bind the gateway through a package boundary can fail closed\n// when an old binary ignores the version 2 operation contract.\nObject.assign(createAgentGateway, { paymentProtocolVersion: 2 as const })\n\n/** Public package-boundary version marker for durable payment operations. */\nexport namespace createAgentGateway {\n export const paymentProtocolVersion = 2 as const\n}\n\n/**\n * Drain the sandbox stream into an OpenAI-shaped SSE response, settle the\n * payment, fire observer hooks. Identical pre-refactor behavior, just lifted\n * out of the handler so the A2A wrapper can reach the same dispatch path\n * without duplicating it.\n */\nfunction streamChatCompletions(\n c: import('hono').Context,\n authz: AuthorizedRequest,\n config: GatewayConfig,\n obs: GatewayObserver | undefined,\n): Response {\n const {\n agent,\n consumerId,\n paymentMethod,\n requestId,\n userMessage,\n rateLimitRemaining,\n maxOutputTokens,\n } = authz\n let outputText = ''\n let usage: import('./types').SandboxUsageReceipt | undefined\n let workObserved = false\n const requestSignal = c.req.raw.signal\n const abortController = new AbortController()\n const abortFromRequest = () => abortController.abort()\n if (requestSignal.aborted) abortFromRequest()\n else requestSignal.addEventListener('abort', abortFromRequest, { once: true })\n const ctx: RequestContext = {\n requestId,\n agentSlug: agent.slug,\n startMs: authz.startMs,\n }\n\n const stream = new ReadableStream({\n async start(controller) {\n const encoder = new TextEncoder()\n const sendChunk = (delta: string) => {\n if (controller.desiredSize === null) return\n outputText += delta\n const chunk: ChatCompletionChunk = {\n id: `chatcmpl-${Date.now()}`,\n object: 'chat.completion.chunk',\n created: Math.floor(Date.now() / 1000),\n model: agent.slug,\n choices: [{ index: 0, delta: { content: delta }, finish_reason: null }],\n }\n controller.enqueue(encoder.encode(`data: ${JSON.stringify(chunk)}\\n\\n`))\n }\n\n try {\n for await (const event of dispatchSandboxStreamRich(\n agent,\n userMessage,\n consumerId,\n config,\n abortController.signal,\n undefined,\n maxOutputTokens,\n () => beginPaymentExecution(authz, config),\n authz.paymentOperation !== undefined || authz.mppChargeOperation !== undefined,\n async () => {\n if (authz.paymentRecoveryId) workObserved = true\n await markPaymentExecutionStarted(authz, config)\n },\n authz.executionBudget.maxInputTokens,\n () => renewPaymentExecution(authz, config),\n )) {\n if (event.kind === 'text') {\n sendChunk(event.delta)\n workObserved = true\n }\n if (event.kind === 'activity') workObserved = true\n if (event.kind === 'usage') usage = event.usage\n }\n\n if (!usage) throw new Error('sandbox did not provide a usage receipt')\n\n await settleAndRecord(\n agent,\n authz,\n usage,\n config,\n obs,\n )\n\n const done: ChatCompletionChunk = {\n id: `chatcmpl-${Date.now()}`,\n object: 'chat.completion.chunk',\n created: Math.floor(Date.now() / 1000),\n model: agent.slug,\n choices: [{ index: 0, delta: {}, finish_reason: 'stop' }],\n }\n if (controller.desiredSize !== null) {\n controller.enqueue(encoder.encode(`data: ${JSON.stringify(done)}\\n\\n`))\n controller.enqueue(encoder.encode('data: [DONE]\\n\\n'))\n }\n } catch (err) {\n const rawMessage = err instanceof Error ? err.message : String(err)\n // Never expose stack traces / absolute paths from sandbox internals.\n const safeMessage =\n rawMessage.includes('/') || rawMessage.includes('\\\\')\n ? 'Internal agent error'\n : rawMessage\n try {\n await obs?.onStreamError?.(ctx, { consumerId, errorMessage: rawMessage })\n } catch (observerError) {\n console.error(\n `[agent-gateway] stream observer failed for ${requestId}:`,\n observerError instanceof Error ? observerError.message : String(observerError),\n )\n }\n try {\n await releasePaymentAfterFailure(authz, config, rawMessage, workObserved || usage !== undefined)\n } catch (releaseError) {\n console.error(\n `[agent-gateway] payment release failed for ${authz.requestId}:`,\n releaseError instanceof Error ? releaseError.message : String(releaseError),\n )\n }\n if (!abortController.signal.aborted && controller.desiredSize !== null) {\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ error: { message: safeMessage, type: 'server_error' } })}\\n\\n`,\n ),\n )\n }\n } finally {\n requestSignal.removeEventListener('abort', abortFromRequest)\n if (controller.desiredSize !== null) controller.close()\n }\n },\n cancel() {\n abortController.abort()\n },\n })\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'X-Request-Id': requestId,\n 'X-Agent-Slug': agent.slug,\n 'X-Agent-Hosting': agent.sandboxEndpoint ? 'sovereign' : 'centralized',\n 'X-Payment-Method': paymentMethod,\n 'X-Payment-Settled': paymentMethod === 'x402' || authz.paymentOperation ? 'pending' : 'true',\n ...(authz.mppChargeOperation\n ? { 'Payment-Receipt': authz.mppChargeOperation.receipt }\n : {}),\n ...(authz.paymentRecoveryId\n ? { 'X-Payment-Operation-Id': authz.paymentRecoveryId }\n : {}),\n ...(rateLimitRemaining !== undefined\n ? { 'X-RateLimit-Remaining': String(rateLimitRemaining) }\n : {}),\n },\n })\n}\n","import type { AgentMeta, ChatMessage } from './types'\n\nfunction decimalFraction(value: number): { numerator: bigint; denominator: bigint } {\n if (!Number.isFinite(value) || value < 0) {\n throw new Error('agent pricePerTokenUsd must be a finite non-negative number')\n }\n const [mantissa, exponentText] = value.toString().toLowerCase().split('e')\n const exponent = exponentText ? Number(exponentText) : 0\n const [whole, fraction = ''] = mantissa.split('.')\n let numerator = BigInt(`${whole}${fraction}`)\n let scale = fraction.length - exponent\n if (scale < 0) {\n numerator *= 10n ** BigInt(-scale)\n scale = 0\n }\n return { numerator, denominator: 10n ** BigInt(scale) }\n}\n\nfunction amountForTokens(\n pricePerTokenUsd: number,\n tokenCount: number,\n currencyDecimals: number,\n providerCostUsd: number,\n): bigint {\n const { numerator, denominator } = decimalFraction(pricePerTokenUsd)\n const scaled = BigInt(tokenCount) * numerator * 10n ** BigInt(currencyDecimals)\n const tokenAmount = (scaled + denominator - 1n) / denominator\n const provider = providerCostUsd === 0\n ? { numerator: 0n, denominator: 1n }\n : decimalFraction(providerCostUsd)\n const providerScaled = provider.numerator * 10n ** BigInt(currencyDecimals)\n const providerAmount = (providerScaled + provider.denominator - 1n) / provider.denominator\n return tokenAmount > providerAmount ? tokenAmount : providerAmount\n}\n\n/** Exact base-unit reservation required to cover the request's token ceiling. */\nexport function requiredX402Amount(\n pricePerTokenUsd: number,\n inputTokens: number,\n maxOutputTokens: number,\n currencyDecimals = 6,\n maxReasoningTokens = 0,\n maxToolTokens = 0,\n maxProviderCostUsd = 0,\n): bigint {\n if (!Number.isSafeInteger(inputTokens) || inputTokens < 0) {\n throw new Error('input token estimate must be a non-negative safe integer')\n }\n if (!Number.isSafeInteger(maxOutputTokens) || maxOutputTokens <= 0) {\n throw new Error('max output tokens must be a positive safe integer')\n }\n if (!Number.isInteger(currencyDecimals) || currencyDecimals < 0 || currencyDecimals > 18) {\n throw new Error('x402 currencyDecimals must be an integer between 0 and 18')\n }\n for (const [name, value] of [\n ['maxReasoningTokens', maxReasoningTokens],\n ['maxToolTokens', maxToolTokens],\n ] as const) {\n if (!Number.isSafeInteger(value) || value < 0) throw new Error(`${name} must be a non-negative safe integer`)\n }\n if (!Number.isFinite(maxProviderCostUsd) || maxProviderCostUsd < 0) {\n throw new Error('maxProviderCostUsd must be finite and non-negative')\n }\n const tokenCount = inputTokens + maxOutputTokens + maxReasoningTokens + maxToolTokens\n if (!Number.isSafeInteger(tokenCount)) throw new Error('token budget exceeds safe integer range')\n return amountForTokens(pricePerTokenUsd, tokenCount, currencyDecimals, maxProviderCostUsd)\n}\n\nexport function actualX402Amount(\n pricePerTokenUsd: number,\n inputTokens: number,\n outputTokens: number,\n reasoningTokens: number,\n toolTokens: number,\n currencyDecimals = 6,\n providerCostUsd = 0,\n): bigint {\n return amountForTokens(\n pricePerTokenUsd,\n inputTokens + outputTokens + reasoningTokens + toolTokens,\n currencyDecimals,\n providerCostUsd,\n )\n}\n\n/** Token estimate matching the existing chat-completions handler (4 chars ≈ 1 token). */\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / 4)\n}\n\n/** Include the host-owned system prompt because the provider bills it too. */\nexport function estimateBillableInputTokens(agent: AgentMeta, userMessage: string): number {\n return estimateTokens(userMessage) + estimateTokens(agent.systemPrompt ?? '')\n}\n\n/** A tokenizer cannot emit more tokens than the UTF-8 bytes it consumes. */\nexport function maximumBillableInputTokens(agent: AgentMeta, userMessage: string): number\nexport function maximumBillableInputTokens(agent: AgentMeta, messages: readonly ChatMessage[]): number\nexport function maximumBillableInputTokens(\n agent: AgentMeta,\n userMessageOrMessages: string | readonly ChatMessage[],\n): number {\n const encoder = new TextEncoder()\n const prompt = typeof userMessageOrMessages === 'string'\n ? userMessageOrMessages\n : JSON.stringify(userMessageOrMessages)\n return encoder.encode(prompt).byteLength + encoder.encode(agent.systemPrompt ?? '').byteLength\n}\n","import type { ChatMessage } from './types'\n\n// --- Injection detection patterns ---\n\nconst INJECTION_PATTERNS = [\n // Direct instruction override\n /ignore\\s+(all\\s+)?(previous|prior|above|earlier)\\s+(instructions?|prompts?|rules?|directives?)/i,\n /disregard\\s+(all\\s+)?(previous|prior|system)/i,\n /forget\\s+(everything|all|your)\\s+(previous|instructions?|training)/i,\n // Role assumption\n /you\\s+are\\s+now\\s+(a|an|the)\\s+/i,\n /pretend\\s+(you\\s+are|to\\s+be)\\s+/i,\n /act\\s+as\\s+(if\\s+you\\s+are|a|an|the)\\s+/i,\n /new\\s+instructions?:/i,\n /\\[system\\]/i,\n /\\[INST\\]/i,\n // Prompt extraction\n /what\\s+(is|are)\\s+your\\s+(system\\s+)?(prompt|instructions?|rules?|directives?)/i,\n /repeat\\s+(your|the)\\s+(system\\s+)?(prompt|instructions?)/i,\n /output\\s+(your|the)\\s+((system|initial|original|first|full|real|hidden|secret|raw|exact)\\s+)?(prompt|instructions?)/i,\n /show\\s+(me\\s+)?(your|the)\\s+((system|hidden|secret|initial|original)\\s+)?(prompt|instructions?|message|directives?)/i,\n /tell\\s+me\\s+(your|the)\\s+(system\\s+)?(prompt|instructions?|rules?)/i,\n // Developer/debug/admin/jailbreak mode override\n /(developer|debug|admin|god|sudo|jailbreak|unrestricted|maintenance)\\s+mode/i,\n // Safety/safeguard disablement\n /(disable|bypass|override|remove|turn\\s+off)\\s+(your\\s+|the\\s+)?(safety|safeguards?|guardrails?|filters?|restrictions?|rules?|limitations?|content\\s+policy)/i,\n // Role reversal\n /(from\\s+now\\s+on|starting\\s+now|now)\\s+you('re|\\s+are)\\s+(the\\s+)?(user|human|customer|assistant)/i,\n /i('m|\\s+am)\\s+(the\\s+)?(assistant|ai|model|llm|bot)/i,\n // Tool-call / JSON-shaped spoofs\n /\"(?:tool|function|action|call)\"\\s*:\\s*\"[^\"]*(exfiltrate|leak|reveal|dump|extract|steal)[^\"]*\"/i,\n /exfiltrate[_\\s]*(system|prompt|secret|vault|config|data)/i,\n // Data exfiltration\n /read\\s+(the\\s+)?(vault|workspace|config|secret|\\.env)/i,\n /cat\\s+\\/home\\/agent\\/(vault|config|\\.env|secrets?)/i,\n /list\\s+(all\\s+)?(vault|workspace|secret)\\s+(files?|contents?|data)/i,\n // i18n — Spanish\n /ignor[ae]\\s+(todas?\\s+)?(las\\s+)?(instrucciones?|indicaciones?|órdenes?)\\s+(previas?|anteriores?)/i,\n /olvid[ae]\\s+(todas?\\s+|tus\\s+)?(instrucciones?|indicaciones?)/i,\n /(ahora\\s+)?(tú\\s+)?eres\\s+(ahora\\s+)?(un|una|el|la)\\s+/i,\n /finge\\s+(que\\s+eres|ser)\\s+/i,\n // i18n — French\n /ignor(ez|e|es)\\s+(toutes?\\s+)?(les\\s+)?(instructions?|consignes?|directives?)\\s+(précédentes?|antérieures?)/i,\n /oublie(z|s)?\\s+(toutes?\\s+|vos\\s+|tes\\s+)?(instructions?|consignes?)/i,\n /(vous\\s+êtes|tu\\s+es)\\s+(maintenant|désormais)\\s+(un|une)\\s+/i,\n /prétend(ez|s)?\\s+(être|que\\s+vous\\s+êtes|que\\s+tu\\s+es)\\s+/i,\n // i18n — German\n /ignorier(e|en|t)\\s+(alle\\s+)?(vorherigen?|vorigen?|bisherigen?)\\s+(anweisungen|anordnungen|vorgaben)/i,\n /vergiss\\s+(alle\\s+|deine\\s+)?(anweisungen|vorgaben|regeln)/i,\n /du\\s+bist\\s+(jetzt|nun)\\s+(ein|eine)\\s+/i,\n /tu\\s+so\\s+als\\s+(wärst\\s+du|ob\\s+du)\\s+/i,\n]\n\n// Cyrillic + Greek confusables that look identical to Latin letters but\n// NFKC does NOT collapse (they are distinct characters in Unicode, not\n// compatibility equivalents). A payload like `ignоre аll previоus\n// instructiоns` (o's are Cyrillic U+043E) evades the pattern set\n// entirely because `ignore` written with Cyrillic chars never matches\n// the Latin `[o]` in our regexes even after NFKC.\n//\n// Mapping derived from Unicode's confusables.txt, intentionally limited\n// to letters that routinely appear in English prompt-injection payloads.\n// Not a full confusable table — adding every entry would risk mangling\n// legitimate Russian/Greek content that happens to contain these\n// letters. Our INJECTION_PATTERNS and redaction keywords are English\n// ASCII, so collapsing to ASCII only touches payloads impersonating\n// those tokens.\nconst HOMOGLYPHS: Record<string, string> = {\n 'а': 'a', 'е': 'e', 'о': 'o', 'р': 'p',\n 'с': 'c', 'у': 'y', 'х': 'x', 'і': 'i',\n 'ј': 'j', 'ѕ': 's', 'һ': 'h',\n 'А': 'A', 'В': 'B', 'Е': 'E', 'К': 'K',\n 'М': 'M', 'Н': 'H', 'О': 'O', 'Р': 'P',\n 'С': 'C', 'Т': 'T', 'Х': 'X', 'І': 'I',\n 'Ј': 'J', 'Ѕ': 'S',\n 'α': 'a', 'ε': 'e', 'ο': 'o', 'ρ': 'p',\n 'υ': 'y', 'ν': 'v', 'ι': 'i', 'τ': 't',\n 'κ': 'k', 'χ': 'x', 'η': 'n', 'μ': 'u',\n 'Α': 'A', 'Β': 'B', 'Ε': 'E', 'Ζ': 'Z',\n 'Η': 'H', 'Ι': 'I', 'Κ': 'K', 'Μ': 'M',\n 'Ν': 'N', 'Ο': 'O', 'Ρ': 'P', 'Τ': 'T',\n 'Χ': 'X', 'Υ': 'Y',\n}\n\nfunction collapseHomoglyphs(text: string): string {\n let out = ''\n for (const ch of text) out += HOMOGLYPHS[ch] ?? ch\n return out\n}\n\n// Unicode normalization for REDACTION.\n//\n// Strip zero-widths entirely (no space substitute) so cross-character\n// elisions like \"vault/secret\" → \"vault/secret\" are matched\n// by the redaction keyword pass. NFKC collapses compatibility chars\n// (fullwidth `ignore` → `ignore`). collapseHomoglyphs catches the\n// Cyrillic/Greek lookalikes NFKC leaves alone.\nfunction normalizeUnicode(text: string): string {\n return collapseHomoglyphs(\n text.replace(/[\\u200B-\\u200F\\u2028-\\u202F\\u2060\\uFEFF]/g, '').normalize('NFKC'),\n )\n}\n\n// Unicode normalization for DETECTION.\n//\n// Two adversarial concerns diverge from redaction:\n//\n// 1. Between-word zero-widths (\"ignoreallprevious\") — the\n// attacker separates tokens with ZWSP so \\s+-anchored regexes do\n// not fire. Strip-then-detect glues the tokens into one\n// unmatchable word; replace ZWSP with a real SPACE instead so\n// /ignore\\s+all\\s+previous/ fires.\n// 2. Punctuation noise (\"Ignore,,, all...previous!!!\") — collapse\n// punctuation runs to a single space. Preserve `[` `]` because\n// literal `[system]` / `[INST]` are first-class injection signals\n// we match directly.\nfunction normalizeForDetection(text: string): string {\n const spaced = text\n .replace(/[\\u200B\\u200C\\uFEFF]/g, ' ')\n .replace(/[\\u200D\\u200E\\u200F\\u2028-\\u202F\\u2060]/g, '')\n .normalize('NFKC')\n return collapseHomoglyphs(spaced)\n .replace(/[(){}<>,.!?:;\"`~]+/g, ' ')\n .replace(/\\s+/g, ' ')\n}\n\n// Third pass: also collapse square brackets. Literal `[system]` /\n// `[INST]` patterns are matched against the other two passes (which\n// preserve brackets); this pass catches the OPPOSITE evasion where\n// the attacker wraps tokens in brackets to split them for \\s+-anchored\n// regexes — e.g. `(ignore) [all] {previous} <instructions>` should\n// still match the baseline pattern.\nfunction normalizeForDetectionNoBrackets(text: string): string {\n return normalizeForDetection(text)\n .replace(/[\\[\\]]+/g, ' ')\n .replace(/\\s+/g, ' ')\n}\n\n/**\n * Detect prompt injection attempts.\n * Returns array of matched pattern descriptions, empty if clean.\n *\n * Patterns run against TWO normalizations so both within-word and\n * between-word zero-width evasions are caught, and so `[system]` /\n * `[INST]` literals are not lost to punctuation-collapse:\n * - normalizeUnicode — strips zero-widths, preserves brackets\n * - normalizeForDetection — spaces zero-widths, collapses punct\n */\nexport function detectInjection(content: string): string[] {\n const stripNorm = normalizeUnicode(content)\n const detectNorm = normalizeForDetection(content)\n const noBracketNorm = normalizeForDetectionNoBrackets(content)\n const matches: string[] = []\n\n for (const pattern of INJECTION_PATTERNS) {\n if (pattern.test(stripNorm) || pattern.test(detectNorm) || pattern.test(noBracketNorm)) {\n matches.push(pattern.source.slice(0, 60))\n }\n }\n\n // Check for base64-encoded injection attempts in either normalization.\n for (const norm of [stripNorm, detectNorm]) {\n const b64Matches = norm.match(/[A-Za-z0-9+/]{40,}={0,2}/g)\n if (!b64Matches) continue\n for (const b64 of b64Matches) {\n try {\n const decoded = atob(b64)\n if (INJECTION_PATTERNS.some(p => p.test(decoded))) {\n if (!matches.includes('base64-encoded injection')) {\n matches.push('base64-encoded injection')\n }\n }\n } catch { /* not valid b64 */ }\n }\n }\n\n return matches\n}\n\n/**\n * Security boundary — filter consumer messages before forwarding to agent.\n *\n * Defense in depth:\n * 1. Strip system messages (consumers cannot set system prompt)\n * 2. Normalize Unicode (collapse homoglyphs, remove zero-width chars)\n * 3. Detect injection patterns (instruction override, prompt extraction, data exfil)\n * 4. Redact sensitive keywords\n * 5. Cap message length\n *\n * Returns filtered messages and any injection warnings detected.\n */\nexport function filterConsumerMessages(\n messages: ChatMessage[],\n maxLength = 8000,\n): ChatMessage[] {\n return messages\n .filter((m) => m.role !== 'system')\n .map((m) => {\n const normalized = normalizeUnicode(m.content)\n const redacted = normalized\n .replace(/\\b(vault|workspace|owner|admin|secret|\\.env|config\\.json)[\\s/:][^\\s]*/gi, '[REDACTED]')\n .slice(0, maxLength)\n return { role: m.role, content: redacted }\n })\n}\n\n/**\n * Filter consumer messages with injection detection.\n * Returns { messages, injectionWarnings }.\n * If injectionWarnings is non-empty, the gateway should log and optionally reject.\n */\nexport function filterConsumerMessagesStrict(\n messages: ChatMessage[],\n maxLength = 8000,\n): { messages: ChatMessage[]; injectionWarnings: string[] } {\n const filtered = filterConsumerMessages(messages, maxLength)\n const allContent = filtered.map(m => m.content).join(' ')\n const injectionWarnings = detectInjection(allContent)\n return { messages: filtered, injectionWarnings }\n}\n\n/**\n * Redact system prompt content from agent output.\n * Prevents the agent from leaking its own instructions in responses.\n *\n * Strategy: if any chunk of the system prompt appears verbatim (>40 chars)\n * in the output, replace it with [REDACTED].\n */\nexport function redactSystemPromptFromOutput(\n output: string,\n systemPrompt: string | undefined,\n): string {\n if (!systemPrompt || systemPrompt.length < 40) return output\n\n // Split system prompt into meaningful chunks (sentences or lines)\n const chunks = systemPrompt\n .split(/[.\\n]/)\n .map(s => s.trim())\n .filter(s => s.length >= 40)\n\n let redacted = output\n for (const chunk of chunks) {\n // Case-insensitive substring match\n const idx = redacted.toLowerCase().indexOf(chunk.toLowerCase())\n if (idx >= 0) {\n redacted = redacted.slice(0, idx) + '[REDACTED — system instructions]' + redacted.slice(idx + chunk.length)\n }\n }\n\n return redacted\n}\n","/** Version of the gateway's method-specific MPP charge contract. */\nexport const MPP_CHARGE_PROTOCOL_VERSION = 1 as const\n\nexport type MppChargeOperationState = 'confirmed' | 'releasing' | 'released'\n\n/** Pure authentication result for one method credential. */\nexport interface MppAuthenticatedCredential {\n consumerId: string\n /**\n * Stable, non-secret processor identity for this payment credential.\n * Return the same value for equivalent encodings of one credential.\n * The gateway hashes this value before it persists or claims it.\n */\n paymentIdentity: string\n}\n\n/** Durable result of one immediate MPP charge. */\nexport interface MppChargeOperation {\n protocolVersion: typeof MPP_CHARGE_PROTOCOL_VERSION\n operationId: string\n acquiredByRequestId: string\n method: string\n /** A complete Payment-Receipt header value. */\n receipt: string\n state: MppChargeOperationState\n}\n\nexport interface MppChargeRequest {\n /**\n * Stable provider idempotency key. The adapter must bind every processor\n * operation to this value before it attempts confirmation.\n */\n operationId: string\n requestId: string\n agentId: string\n consumerId: string\n method: string\n /** Original decoded credential. It is available only on the live request. */\n credential: string\n amount: bigint\n currencyDecimals: number\n}\n\nexport type MppChargeRecoveryResult =\n | MppChargeOperation\n /** `not-found` is final and must fence this operation ID against a later charge. */\n | { operationId: string; state: 'not-found' | 'pending' }\n\n/**\n * Immediate-charge lifecycle for a non-BlueprinTEVM MPP method.\n *\n * `confirmPayment` runs after every request denial and before a response or\n * sandbox call. It must use `operationId` as its processor idempotency key,\n * confirm payment, verify final success, and only then return `confirmed`.\n *\n * Every method must also support id-only recovery and an idempotent release.\n * Recovery must inspect the existing processor operation. It must never\n * create a second charge when an acknowledgement is ambiguous.\n */\nexport interface MppChargeLifecycle {\n readonly protocolVersion: typeof MPP_CHARGE_PROTOCOL_VERSION\n confirmPayment(request: MppChargeRequest): Promise<MppChargeOperation>\n releasePayment(operation: MppChargeOperation, reason: string): Promise<MppChargeOperation>\n recoverPayment(operationId: string): Promise<MppChargeRecoveryResult>\n}\n\n/** Stable gateway identity. Neither the credential nor adapter identity is persisted. */\nexport async function mppPaymentOperationId(\n method: string,\n paymentIdentity: string,\n): Promise<string> {\n const normalizedMethod = method.trim().toLowerCase()\n if (!normalizedMethod || normalizedMethod.length > 128) {\n throw new Error('MPP payment method is invalid')\n }\n if (!paymentIdentity || paymentIdentity.length > 8192) {\n throw new Error('MPP payment identity is invalid')\n }\n const digest = await globalThis.crypto.subtle.digest(\n 'SHA-256',\n new TextEncoder().encode(`${normalizedMethod}\\0${paymentIdentity}`),\n )\n const fingerprint = [...new Uint8Array(digest)]\n .map((byte) => byte.toString(16).padStart(2, '0'))\n .join('')\n return `mpp:${normalizedMethod}:${fingerprint}`\n}\n\nexport function assertMppChargeOperation(\n operation: MppChargeOperation,\n expected: { operationId: string; requestId: string; method: string },\n allowedStates: readonly MppChargeOperationState[],\n requireReceipt = true,\n): void {\n if (operation.protocolVersion !== MPP_CHARGE_PROTOCOL_VERSION) {\n throw new Error('MPP charge operation protocol version mismatch')\n }\n if (operation.operationId !== expected.operationId) {\n throw new Error('MPP charge operation id mismatch')\n }\n if (operation.acquiredByRequestId !== expected.requestId) {\n throw new Error('MPP charge operation request owner mismatch')\n }\n if (operation.method.toLowerCase() !== expected.method.toLowerCase()) {\n throw new Error('MPP charge operation method mismatch')\n }\n if (!allowedStates.includes(operation.state)) {\n throw new Error(`MPP charge operation is in invalid state ${operation.state}`)\n }\n if (requireReceipt && (\n !operation.receipt ||\n operation.receipt.length > 8192 ||\n /[^\\x20-\\x7e]/.test(operation.receipt)\n )) {\n throw new Error('MPP charge operation has an invalid payment receipt')\n }\n}\n","import type { X402Config, MppConfig, ApiKeyInfo, GatewayConfig } from './types'\nimport { claimStoredNonce, nonceTtlSeconds, type NonceStore } from './nonce-store'\nimport {\n mppPaymentOperationId,\n type MppAuthenticatedCredential,\n} from './mpp-payment'\n\nexport interface VerifiedMppCredential extends MppAuthenticatedCredential {\n /** Opaque replay key. BlueprinTEVM shares the x402 nonce namespace. */\n replayKey: string\n}\n\n/** Return the legacy opaque nonce key used by older consumers. */\nexport function mppReplayNonceKey(authHeader: string): string | undefined {\n const decoded = decodeMppCredential(authHeader)\n return decoded ? canonicalMppNonceKey(decoded.method, decoded.payload, decoded.credential) : undefined\n}\n\n/** Return the decoded MPP payload for a durable payment claim. */\nexport function mppPaymentPayload(authHeader: string): Record<string, unknown> | undefined {\n return decodeMppCredential(authHeader)?.payload\n}\n\n/** Return the decoded method credential for the post-guard charge lifecycle. */\nexport function mppPaymentCredential(authHeader: string): string | undefined {\n return decodeMppCredential(authHeader)?.credential\n}\n\ninterface DecodedMppCredential {\n method: string\n credential: string\n payload: Record<string, unknown>\n}\n\nfunction decodeMppCredential(authHeader: string): DecodedMppCredential | undefined {\n const match = authHeader.match(/^Payment\\s+(\\S+)\\s+(\\S+)$/i)\n if (!match) return undefined\n const [, rawMethod, credentialB64] = match\n if (!/^[A-Za-z0-9_-]+$/.test(credentialB64)) return undefined\n try {\n const decoded = Buffer.from(credentialB64, 'base64url').toString('utf-8')\n let payload: Record<string, unknown> = {}\n try {\n const credential = JSON.parse(decoded) as unknown\n if (credential && typeof credential === 'object' && !Array.isArray(credential)) {\n const record = credential as Record<string, unknown>\n const nested = record.payload\n payload = nested && typeof nested === 'object' && !Array.isArray(nested)\n ? nested as Record<string, unknown>\n : record\n }\n } catch {\n // Method-specific verifiers may accept a non-JSON credential format.\n }\n return { method: rawMethod.toLowerCase(), credential: decoded, payload }\n } catch {\n return undefined\n }\n}\n\nfunction canonicalMppNonceKey(\n method: string,\n payload: Record<string, unknown>,\n credential: string,\n): string {\n if (payload.nonce === undefined) {\n return `mpp:${method.toLowerCase()}:receipt:${Buffer.from(credential).toString('base64url')}`\n }\n const nonce = BigInt(String(payload.nonce)).toString()\n const commitment = payload.commitment\n if (method.toLowerCase() === 'blueprintevm' && typeof commitment === 'string' && commitment.length > 0) {\n return `${commitment.toLowerCase()}:${nonce}`\n }\n return `mpp:${method.toLowerCase()}:${String(payload.commitment ?? payload.from ?? 'unknown').toLowerCase()}:${nonce}`\n}\n\nfunction blueprintevmNonceKey(payload: Record<string, unknown>): string | undefined {\n if (payload.nonce === undefined) return undefined\n const nonce = BigInt(String(payload.nonce)).toString()\n const identity = payload.commitment ?? payload.from\n if (typeof identity !== 'string' || identity.length === 0) return undefined\n return `${identity.toLowerCase()}:${nonce}`\n}\n\nfunction stableJson(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(stableJson).join(',')}]`\n if (value && typeof value === 'object') {\n const record = value as Record<string, unknown>\n return `{${Object.keys(record).sort().map((key) => `${JSON.stringify(key)}:${stableJson(record[key])}`).join(',')}}`\n }\n return JSON.stringify(value)\n}\n\nfunction legacyMppPaymentIdentity(\n method: string,\n payload: Record<string, unknown>,\n credential: string,\n): string {\n const canonicalPayload = stableJson(payload)\n if (canonicalPayload !== '{}') return `legacy:${method}:${canonicalPayload}`\n return `legacy:${method}:credential:${Buffer.from(credential).toString('base64url')}`\n}\n\n/** Pure capability checks shared by discovery and every request protocol. */\nexport function isApiKeyAuthEnabled(\n config: Pick<GatewayConfig, 'verifyApiKey' | 'x402'>,\n): boolean {\n return config.verifyApiKey !== undefined || config.x402.demoMode === true\n}\n\n/** MPP is enabled only when authentication and method settlement are complete. */\nexport function isMppAuthEnabled(\n config: Pick<GatewayConfig, 'mpp' | 'x402'>,\n): boolean {\n const method = (config.mpp?.method ?? 'blueprintevm').toLowerCase()\n if (!config.mpp) return false\n const authenticated = typeof config.mpp.authenticateCredential === 'function' ||\n typeof config.mpp.verifySigner === 'function' ||\n (method === 'blueprintevm' && config.x402.verifySigner !== undefined) ||\n (method === 'blueprintevm' && config.x402.demoMode === true)\n if (!authenticated) return false\n return method === 'blueprintevm' || config.mpp.charge !== undefined\n}\n\n/**\n * Verify x402 SpendAuth signature (EIP-712).\n * Returns the signer address (commitment) if valid, null otherwise.\n *\n * demoMode: true — accepts any well-formed header\n * shape after replay/expiry checks.\n * Tests + local dev only.\n * verifySigner present — production verification path.\n * neither — rejected by createAgentGateway and\n * by this function as defense-in-depth.\n */\nexport async function verifyX402(\n spendAuthHeader: string,\n config: X402Config,\n nonceStore?: NonceStore,\n minimumAmount = 1n,\n markNonce = true,\n): Promise<string | null> {\n try {\n const raw = JSON.parse(spendAuthHeader)\n if (!raw.commitment || !raw.signature || !raw.amount) return null\n if (raw.operator?.toLowerCase() !== config.operatorAddress.toLowerCase()) return null\n\n const amount = BigInt(raw.amount)\n const nonce = BigInt(raw.nonce)\n const expiry = BigInt(raw.expiry)\n\n // Reject expired payments\n if (expiry < BigInt(Math.floor(Date.now() / 1000))) return null\n\n // Reject payments that cannot cover the request's maximum charge. The\n // check runs before the host verifier because that callback can reserve or\n // settle funds as part of its production verification path.\n if (amount <= 0n || minimumAmount < 0n || amount < minimumAmount) return null\n\n const nonceKey = `${String(raw.commitment).toLowerCase()}:${nonce.toString()}`\n if (nonceStore?.hasSeen && await nonceStore.hasSeen(nonceKey)) return null\n\n if (config.verifySigner) {\n const verified = await config.verifySigner(raw, {\n protocolVersion: config.paymentProtocolVersion ?? (config.paymentOperations ? 2 : 1),\n })\n if (!verified) return null\n } else if (!config.demoMode) {\n return null\n }\n\n // Claim only after the signature is accepted. Otherwise invalid traffic\n // can burn a valid payer nonce and deny the real request.\n if (nonceStore && markNonce) {\n const ttl = nonceTtlSeconds(expiry)\n if (ttl === undefined) return null\n const claimed = await claimStoredNonce(nonceStore, nonceKey, ttl)\n if (!claimed) return null\n }\n\n return raw.commitment\n } catch {\n return null\n }\n}\n\n/**\n * Verify MPP (Machine Payments Protocol) Authorization: Payment header.\n *\n * MPP uses `Authorization: Payment <method> <credential>` format. The\n * credential is method-specific; `MppConfig.authenticateCredential` owns authentication\n * and returns the consumer plus stable payment identity. The built-in `blueprintevm` path can\n * reuse the x402 verifier for credentials with the compatible payload shape.\n *\n * Returns authenticated identity if valid, null otherwise.\n * In demo mode, accepts any well-formed Payment header with an identity.\n */\nexport async function verifyMppCredential(\n authHeader: string,\n config: MppConfig,\n x402Config: X402Config,\n nonceStore?: NonceStore,\n minimumAmount = 1n,\n markNonce = true,\n): Promise<VerifiedMppCredential | null> {\n // MPP format: \"Payment <method> <base64url-credential>\"\n const match = authHeader.match(/^Payment\\s+(\\S+)\\s+(\\S+)$/i)\n if (!match) return null\n\n const [, rawMethod] = match\n const method = rawMethod.toLowerCase()\n if (method !== (config.method ?? 'blueprintevm').toLowerCase()) return null\n\n try {\n const decodedCredential = decodeMppCredential(authHeader)\n if (!decodedCredential) return null\n const { credential: decoded, payload } = decodedCredential\n\n // Validate common EVM fields before pure credential authentication.\n // BlueprinTEVM carries x402-equivalent token amounts and must cover the\n // same request ceiling as the X-Payment-Signature path.\n const operator = payload.operator ?? payload.to\n if (operator !== undefined) {\n if (typeof operator !== 'string' || operator.toLowerCase() !== x402Config.operatorAddress.toLowerCase()) {\n return null\n }\n }\n const paymentAmount = payload.amount ?? payload.value\n if (paymentAmount !== undefined) {\n const amount = BigInt(String(paymentAmount))\n if (amount <= 0n || (method === 'blueprintevm' && amount < minimumAmount)) return null\n } else if (method === 'blueprintevm') {\n return null\n }\n if (payload.nonce !== undefined) BigInt(String(payload.nonce))\n if (payload.expiry !== undefined && BigInt(String(payload.expiry)) < BigInt(Math.floor(Date.now() / 1000))) {\n return null\n }\n\n const blueprintevmKey = method === 'blueprintevm'\n ? blueprintevmNonceKey(payload)\n : undefined\n if (markNonce && blueprintevmKey && nonceStore?.hasSeen && await nonceStore.hasSeen(blueprintevmKey)) {\n return null\n }\n\n let authenticated: MppAuthenticatedCredential | null = null\n if (config.authenticateCredential) {\n authenticated = await config.authenticateCredential(payload, { method, credential: decoded })\n } else if (config.verifySigner) {\n const consumerId = await config.verifySigner(payload, { method, credential: decoded })\n authenticated = typeof consumerId === 'string' && consumerId.length > 0\n ? {\n consumerId,\n paymentIdentity: legacyMppPaymentIdentity(method, payload, decoded),\n }\n : null\n } else if (method === 'blueprintevm' && x402Config.verifySigner && payload.commitment) {\n const verified = await x402Config.verifySigner(payload, {\n protocolVersion: x402Config.paymentProtocolVersion ?? (x402Config.paymentOperations ? 2 : 1),\n })\n const paymentIdentity = blueprintevmNonceKey(payload) ?? stableJson(payload)\n authenticated = verified\n ? { consumerId: String(payload.commitment), paymentIdentity }\n : null\n } else if (x402Config.demoMode) {\n const identity = payload.commitment ?? payload.from\n if (typeof identity !== 'string' || identity.length === 0) return null\n const paymentIdentity = method === 'blueprintevm'\n ? blueprintevmNonceKey(payload) ?? stableJson(payload)\n : ''\n if (!paymentIdentity) return null\n authenticated = { consumerId: identity, paymentIdentity }\n } else {\n return null\n }\n if (\n !authenticated ||\n typeof authenticated.consumerId !== 'string' ||\n authenticated.consumerId.length === 0 ||\n typeof authenticated.paymentIdentity !== 'string' ||\n authenticated.paymentIdentity.length === 0\n ) return null\n\n const replayKey = method === 'blueprintevm'\n ? blueprintevmKey ??\n await mppPaymentOperationId(method, authenticated.paymentIdentity)\n : await mppPaymentOperationId(method, authenticated.paymentIdentity)\n if (!replayKey) return null\n if (markNonce && !blueprintevmKey && nonceStore?.hasSeen && await nonceStore.hasSeen(replayKey)) return null\n\n if (nonceStore && markNonce) {\n const expiry = payload.expiry === undefined\n ? BigInt(Math.floor(Date.now() / 1000) + 3600)\n : BigInt(String(payload.expiry))\n const ttl = nonceTtlSeconds(expiry)\n if (ttl === undefined) return null\n const claimed = await claimStoredNonce(nonceStore, replayKey, ttl)\n if (!claimed) return null\n }\n\n return { ...authenticated, replayKey }\n } catch {\n return null\n }\n}\n\n/**\n * Verify an MPP credential using the 0.7.1 public return shape.\n * Rich durable callers use verifyMppCredential instead.\n */\nexport async function verifyMpp(\n authHeader: string,\n config: MppConfig,\n x402Config: X402Config,\n nonceStore?: NonceStore,\n minimumAmount = 1n,\n markNonce = true,\n): Promise<string | null> {\n const authenticated = await verifyMppCredential(\n authHeader,\n config,\n x402Config,\n nonceStore,\n minimumAmount,\n markNonce,\n )\n return authenticated?.consumerId ?? null\n}\n\n/**\n * Default API key verifier — accepts any `sk_agent_*` key (demo mode).\n * Override in GatewayConfig.verifyApiKey for production.\n */\nexport async function defaultVerifyApiKey(\n authHeader: string,\n): Promise<ApiKeyInfo | null> {\n if (!authHeader.startsWith('Bearer sk_agent_')) return null\n const key = authHeader.slice(7)\n return {\n keyId: key.slice(0, 16),\n consumerId: `apikey:${key.slice(0, 16)}`,\n }\n}\n","import type { Context } from 'hono'\n\nimport { filterConsumerMessagesStrict } from './filter'\nimport { type RequestContext, generateRequestId } from './observer'\nimport { type GatewayState, type AuthorizedRequest } from './dispatch-types'\nimport { checkRateLimit } from './rate-limit'\nimport {\n maximumBillableInputTokens,\n requiredX402Amount,\n} from './dispatch-pricing'\nimport type {\n ApiKeyInfo,\n ChatMessage,\n GatewayConfig,\n PaymentMethod,\n SandboxExecutionBudget,\n} from './types'\nimport {\n defaultVerifyApiKey,\n isApiKeyAuthEnabled,\n isMppAuthEnabled,\n mppPaymentPayload,\n mppPaymentCredential,\n verifyMppCredential,\n verifyX402,\n} from './verify'\n\n/**\n * Resolve the agent, then run the full pre-dispatch pipeline: payment +\n * rate-limit + injection filter + user-message extraction + optional\n * `authorizeConsumer` hook. Returns the success record on the happy path\n * or a fully-formed `Response` (402/404/429/400/403) on any short-circuit.\n *\n * Body parsing is the caller's responsibility — different wire formats\n * (OpenAI chat completions vs A2A JSON-RPC) have different envelopes; both\n * still ultimately produce a `ChatMessage[]`.\n */\nexport async function authenticateAndGuard(\n c: Context,\n slug: string,\n messages: ChatMessage[],\n config: GatewayConfig,\n state: GatewayState,\n requestedMaxOutputTokens?: number,\n): Promise<AuthorizedRequest | Response> {\n const startMs = Date.now()\n const requestId = generateRequestId()\n const ctx: RequestContext = { requestId, agentSlug: slug, startMs }\n await state.obs?.onRequestStart?.(ctx)\n\n const agent = await config.resolveAgent(slug)\n if (!agent || !agent.enabled) {\n return c.json({ error: { message: 'Agent not found', type: 'not_found' } }, 404)\n }\n if (!messages?.length) {\n return c.json(\n { error: { message: 'messages array required', type: 'invalid_request' } },\n 400,\n )\n }\n\n const maxOutputTokens = requestedMaxOutputTokens ?? state.defaultOutputTokens\n if (\n !Number.isInteger(maxOutputTokens) ||\n maxOutputTokens <= 0 ||\n maxOutputTokens > state.maxOutputTokens\n ) {\n return c.json(\n {\n error: {\n message: `max_tokens must be an integer between 1 and ${state.maxOutputTokens}`,\n type: 'invalid_request',\n code: 'invalid_max_tokens',\n },\n },\n 400,\n )\n }\n\n // Quote the maximum UTF-8 input plus every hidden provider cost before\n // verification. The verifier must remain read-only at this point.\n const { messages: filtered, injectionWarnings } = filterConsumerMessagesStrict(\n messages,\n state.maxLen,\n )\n const userMessage = filtered\n .filter((m) => m.role === 'user')\n .map((m) => m.content)\n .join('\\n\\n')\n if (!userMessage) {\n return c.json(\n { error: { message: 'No user message provided', type: 'invalid_request' } },\n 400,\n )\n }\n\n let requiredPaymentAmount: bigint\n const messageInputBound = maximumBillableInputTokens(agent, filtered)\n let maxInputTokens = messageInputBound\n if (config.inputTokenBound) {\n let configuredBound: number\n try {\n configuredBound = config.inputTokenBound({ agent, messages: filtered })\n } catch {\n return c.json(\n {\n error: {\n message: 'Agent input token bound is unavailable',\n type: 'server_error',\n code: 'input_token_bound_unavailable',\n },\n },\n 503,\n )\n }\n if (!Number.isSafeInteger(configuredBound) || configuredBound < messageInputBound) {\n return c.json(\n {\n error: {\n message: 'Agent input token bound is invalid',\n type: 'server_error',\n code: 'invalid_input_token_bound',\n },\n },\n 503,\n )\n }\n maxInputTokens = configuredBound\n }\n const maxReasoningTokens = state.maxReasoningTokens\n const maxToolTokens = state.maxToolTokens\n const maxToolCalls = state.maxToolCalls\n const maxProviderCostUsd = state.maxProviderCostUsd ??\n (maxInputTokens + maxOutputTokens + maxReasoningTokens + maxToolTokens) * agent.pricePerTokenUsd\n const executionBudget: SandboxExecutionBudget = {\n maxInputTokens,\n maxOutputTokens,\n maxReasoningTokens,\n maxToolTokens,\n maxToolCalls,\n maxProviderCostUsd,\n }\n try {\n requiredPaymentAmount = requiredX402Amount(\n agent.pricePerTokenUsd,\n maxInputTokens,\n maxOutputTokens,\n config.x402.currencyDecimals,\n maxReasoningTokens,\n maxToolTokens,\n maxProviderCostUsd,\n )\n } catch {\n return c.json(\n {\n error: {\n message: 'Agent payment configuration is invalid',\n type: 'server_error',\n code: 'invalid_payment_configuration',\n },\n },\n 503,\n )\n }\n\n // Payment / auth.\n const spendAuthHeader = c.req.header('X-Payment-Signature')\n const authHeader = c.req.header('Authorization') ?? ''\n let consumerId: string | null = null\n let paymentMethod: PaymentMethod = 'none'\n let keyInfo: ApiKeyInfo | null = null\n let x402Payload: Record<string, unknown> | null = null\n let paymentNonceKey: string | undefined\n let mppMethod: string | undefined\n let mppCredential: string | undefined\n let mppPaymentIdentity: string | undefined\n\n if (spendAuthHeader) {\n const signer = await verifyX402(\n spendAuthHeader,\n config.x402,\n state.nonceStore,\n requiredPaymentAmount,\n false,\n )\n if (!signer) {\n await state.obs?.onAuthFailure?.(ctx, {\n method: 'x402',\n code: 'invalid_spend_auth',\n httpStatus: 402,\n })\n return c.json(\n {\n error: {\n message: 'Invalid X-Payment-Signature',\n type: 'authentication_error',\n code: 'invalid_spend_auth',\n required_amount: requiredPaymentAmount.toString(),\n currency_decimals: config.x402.currencyDecimals ?? 6,\n },\n },\n {\n status: 402,\n headers: { 'X-Payment-Required': 'spendauth', 'X-Request-Id': requestId },\n },\n )\n }\n x402Payload = JSON.parse(spendAuthHeader) as Record<string, unknown>\n paymentNonceKey = `${String(x402Payload.commitment).toLowerCase()}:${BigInt(String(x402Payload.nonce)).toString()}`\n consumerId = signer\n paymentMethod = 'x402'\n } else if (isMppAuthEnabled(config) && authHeader.toLowerCase().startsWith('payment ')) {\n const authenticated = await verifyMppCredential(\n authHeader,\n config.mpp!,\n config.x402,\n state.nonceStore,\n requiredPaymentAmount,\n false,\n )\n if (!authenticated) {\n const realm = config.mpp!.realm\n const method = config.mpp!.method ?? 'blueprintevm'\n await state.obs?.onAuthFailure?.(ctx, {\n method: 'mpp',\n code: 'invalid_mpp_credential',\n httpStatus: 401,\n })\n return c.json(\n {\n error: {\n message: 'Invalid Payment credential',\n type: 'authentication_error',\n code: 'invalid_mpp_credential',\n },\n },\n {\n status: 401,\n headers: {\n 'WWW-Authenticate': `Payment realm=\"${realm}\", method=\"${method}\"`,\n 'X-Request-Id': requestId,\n },\n },\n )\n }\n consumerId = authenticated.consumerId\n paymentMethod = 'mpp'\n mppMethod = authHeader.match(/^Payment\\s+(\\S+)\\s+/i)?.[1]?.toLowerCase()\n mppCredential = mppPaymentCredential(authHeader)\n mppPaymentIdentity = authenticated.paymentIdentity\n x402Payload = mppPaymentPayload(authHeader) ?? null\n paymentNonceKey = authenticated.replayKey\n } else if (authHeader.startsWith('Bearer ')) {\n const verify = config.verifyApiKey ?? (config.x402.demoMode ? defaultVerifyApiKey : null)\n if (!verify || !isApiKeyAuthEnabled(config)) {\n await state.obs?.onAuthFailure?.(ctx, {\n method: 'apikey',\n code: 'api_keys_not_configured',\n httpStatus: 401,\n })\n return c.json(\n { error: { message: 'API key authentication is not configured', type: 'authentication_error' } },\n { status: 401, headers: { 'X-Request-Id': requestId } },\n )\n }\n const key = await verify(authHeader)\n if (!key) {\n await state.obs?.onAuthFailure?.(ctx, {\n method: 'apikey',\n code: 'invalid_api_key',\n httpStatus: 401,\n })\n return c.json(\n { error: { message: 'Invalid API key', type: 'authentication_error' } },\n { status: 401, headers: { 'X-Request-Id': requestId } },\n )\n }\n if (key.scopes && key.scopes.length > 0 && !key.scopes.includes(state.requiredScope)) {\n await state.obs?.onAuthFailure?.(ctx, {\n method: 'apikey',\n code: 'insufficient_scope',\n httpStatus: 403,\n })\n return c.json(\n {\n error: {\n message: `API key missing required scope: ${state.requiredScope}`,\n type: 'forbidden',\n code: 'insufficient_scope',\n },\n },\n { status: 403, headers: { 'X-Request-Id': requestId } },\n )\n }\n consumerId = key.consumerId\n paymentMethod = 'apikey'\n keyInfo = key\n } else {\n await state.obs?.onAuthFailure?.(ctx, {\n method: 'none',\n code: 'payment_required',\n httpStatus: 402,\n })\n const methods: string[] = ['x402']\n if (isMppAuthEnabled(config)) methods.push('mpp')\n if (isApiKeyAuthEnabled(config)) methods.push('api_key')\n const headers: Record<string, string> = {\n 'X-Payment-Required': methods.join(', '),\n 'X-Request-Id': requestId,\n }\n if (isMppAuthEnabled(config) && config.mpp) {\n headers['WWW-Authenticate'] =\n `Payment realm=\"${config.mpp.realm}\", method=\"${config.mpp.method ?? 'blueprintevm'}\"`\n }\n return c.json(\n {\n error: {\n message: 'Payment required',\n type: 'payment_required',\n payment_methods: methods,\n x402: {\n operator: config.x402.operatorAddress,\n chain_id: config.x402.chainId,\n credits_address: config.x402.creditsAddress,\n required_amount: requiredPaymentAmount.toString(),\n currency_decimals: config.x402.currencyDecimals ?? 6,\n max_output_tokens: maxOutputTokens,\n },\n ...(isMppAuthEnabled(config) && config.mpp\n ? { mpp: { realm: config.mpp.realm, method: config.mpp.method ?? 'blueprintevm' } }\n : {}),\n ...(isApiKeyAuthEnabled(config)\n ? {\n api_key: {\n purchase_url: config.baseUrl\n ? `${config.baseUrl}/agents/${slug}/api-keys`\n : undefined,\n },\n }\n : {}),\n },\n },\n { status: 402, headers },\n )\n }\n\n // Rate limit.\n const effectiveRateLimit = keyInfo?.rateLimitPerMinute\n ? { limit: keyInfo.rateLimitPerMinute, windowSeconds: 60 }\n : state.globalRateLimit\n const rl = await checkRateLimit(consumerId, effectiveRateLimit, state.rateLimitStore)\n if (!rl.allowed) {\n await state.obs?.onRateLimited?.(ctx, {\n consumerId: consumerId,\n retryAfterSeconds: rl.retryAfterSeconds ?? 60,\n })\n return c.json(\n {\n error: {\n message: 'Rate limit exceeded',\n type: 'rate_limit_error',\n retry_after: rl.retryAfterSeconds,\n },\n },\n {\n status: 429,\n headers: {\n 'Retry-After': String(rl.retryAfterSeconds ?? 60),\n 'X-Request-Id': requestId,\n },\n },\n )\n }\n\n // Reject or report injection only after authentication so observer events\n // retain the authenticated consumer identity.\n if (injectionWarnings.length > 0) {\n await state.obs?.onInjectionDetected?.(ctx, {\n consumerId: consumerId,\n patterns: injectionWarnings,\n blocked: !!config.blockInjection,\n })\n if (config.blockInjection) {\n return c.json(\n {\n error: {\n message: 'Request rejected: potential prompt injection detected',\n type: 'content_policy_violation',\n },\n },\n { status: 400, headers: { 'X-Request-Id': requestId } },\n )\n }\n }\n\n if (config.authorizeConsumer) {\n const authz = await config.authorizeConsumer(agent, {\n method: paymentMethod,\n consumerId: consumerId,\n keyId: keyInfo?.keyId,\n requestId,\n })\n if (!authz.allow) {\n return c.json(\n {\n error: {\n message: authz.reason,\n type: 'authorization_denied',\n code: authz.code,\n },\n },\n { status: 403, headers: { 'X-Request-Id': requestId } },\n )\n }\n }\n\n return {\n agent,\n consumerId,\n paymentMethod,\n keyInfo,\n userMessage,\n rateLimitRemaining: rl.remaining,\n requestId,\n startMs,\n maxOutputTokens,\n executionBudget,\n requiredPaymentAmount,\n paymentPayload: x402Payload,\n paymentNonceKey,\n mppMethod,\n mppCredential,\n mppPaymentIdentity,\n }\n}\n\nexport type { AuthorizedRequest, GatewayState }\n","import type {\n PaymentSettlementBasis,\n SandboxUsageReceipt,\n} from './payment-types'\n\n/** Version negotiated by gateways that use durable payment operations. */\nexport const PAYMENT_PROTOCOL_VERSION = 2 as const\n\nexport type PaymentOperationState =\n | 'claiming'\n | 'claimed'\n | 'executing'\n | 'retained'\n | 'settling'\n | 'settled'\n | 'releasing'\n | 'released'\n | 'reclaimable'\n | 'reclaimed'\n\n/** Fenced result for a recovery lookup that found no provider operation. */\nexport interface PaymentOperationNotFound {\n protocolVersion: typeof PAYMENT_PROTOCOL_VERSION\n operationId: string\n state: 'not-found'\n}\n\nexport type PaymentOperationRecoveryResult = PaymentOperation | PaymentOperationNotFound\n\n/** Durable ownership of one signed payment authorization. */\nexport interface PaymentOperation {\n protocolVersion: typeof PAYMENT_PROTOCOL_VERSION\n operationId: string\n /** Request that atomically created this operation. Idempotent reads retain the original value. */\n acquiredByRequestId: string\n executionStartedAt?: number\n retentionReason?: string\n nonceKey: string\n authorizationId: string\n reservedAmount: bigint\n settledAmount: bigint\n refundAmount: bigint\n expiresAt: number\n state: PaymentOperationState\n}\n\nexport interface PaymentAuthorizationContext {\n requestId: string\n agentId: string\n requiredAmount: bigint\n maxOutputTokens: number\n executionBudget: {\n maxInputTokens: number\n maxOutputTokens: number\n maxReasoningTokens: number\n maxToolTokens: number\n maxToolCalls: number\n maxProviderCostUsd: number\n }\n}\n\nexport interface PaymentSettlementInput {\n amount: bigint\n totalCostUsd: number\n usage: SandboxUsageReceipt\n /** Distinguishes a provider receipt from the bounded missing-receipt fallback. */\n basis: PaymentSettlementBasis\n}\n\n/**\n * One payment lifecycle shared by every payment-backed gateway surface.\n * Implementations must persist the operation before external side effects.\n */\nexport interface PaymentOperations {\n readonly protocolVersion: typeof PAYMENT_PROTOCOL_VERSION\n claimPayment(\n payload: Record<string, unknown>,\n context: PaymentAuthorizationContext,\n ): Promise<PaymentOperation>\n /** Prevent expiry reclaim while the sandbox can consume provider resources. */\n beginPaymentExecution(operation: PaymentOperation): Promise<PaymentOperation>\n /** Preserve funds after work when the final usage receipt is still missing. */\n retainPayment(operation: PaymentOperation, reason: string): Promise<PaymentOperation>\n settlePayment(\n operation: PaymentOperation,\n input: PaymentSettlementInput,\n ): Promise<PaymentOperation>\n /**\n * Read the authoritative durable operation without changing its state.\n * Recovery uses this to avoid repeating a provider settlement after the\n * provider committed but the task finalization write lost its acknowledgement.\n */\n getPaymentOperation(operationId: string): Promise<PaymentOperationRecoveryResult>\n /**\n * Release an unused authorization.\n * Repeated calls must recover an ambiguous acknowledgement by operationId.\n */\n releasePayment(operation: PaymentOperation, reason: string): Promise<PaymentOperation>\n reclaimPayment(operationId: string): Promise<PaymentOperationRecoveryResult>\n}\n\nexport interface MemoryPaymentOperationsOptions {\n now?: () => number\n onClaim?: (operation: PaymentOperation) => Promise<void>\n onSettle?: (operation: PaymentOperation, input: PaymentSettlementInput) => Promise<void>\n onRelease?: (operation: PaymentOperation, reason: string) => Promise<void>\n onReclaim?: (operation: PaymentOperation) => Promise<void>\n}\n\n/** Small atomic implementation used by single-process deployments and tests. */\nexport class MemoryPaymentOperations implements PaymentOperations {\n readonly protocolVersion = PAYMENT_PROTOCOL_VERSION\n private readonly operations = new Map<string, PaymentOperation>()\n private readonly claimFlights = new Map<string, Promise<PaymentOperation>>()\n private readonly claimTokens = new Map<string, string>()\n private readonly settleFlights = new Map<string, Promise<PaymentOperation>>()\n private readonly releaseFlights = new Map<string, Promise<PaymentOperation>>()\n private readonly reclaimFlights = new Map<string, Promise<PaymentOperation>>()\n private readonly now: () => number\n\n constructor(private readonly options: MemoryPaymentOperationsOptions = {}) {\n if ((options.onClaim || options.onSettle || options.onRelease) && !options.onReclaim) {\n throw new Error('onReclaim is required when payment callbacks can lose acknowledgement')\n }\n this.now = options.now ?? (() => Math.floor(Date.now() / 1000))\n }\n\n async claimPayment(\n payload: Record<string, unknown>,\n context: PaymentAuthorizationContext,\n ): Promise<PaymentOperation> {\n const nonceKey = paymentNonceKey(payload)\n const operationId = `x402:${nonceKey}`\n const existing = this.operations.get(operationId)\n if (existing) {\n if (existing.state === 'claiming') throw new Error('payment operation is being recovered')\n throw new Error('payment operation was already claimed')\n }\n\n const reservedAmount = unsignedAmount(payload.amount)\n if (reservedAmount < context.requiredAmount) {\n throw new Error('payment authorization is below the request ceiling')\n }\n const expiresAt = unsignedAmount(payload.expiry, 'expiry')\n if (expiresAt > BigInt(Number.MAX_SAFE_INTEGER)) throw new Error('payment expiry is too large')\n if (Number(expiresAt) <= this.now()) throw new Error('payment authorization has expired')\n\n const operation: PaymentOperation = {\n protocolVersion: PAYMENT_PROTOCOL_VERSION,\n operationId,\n acquiredByRequestId: context.requestId,\n nonceKey,\n authorizationId: typeof payload.authHash === 'string' ? payload.authHash : operationId,\n reservedAmount,\n settledAmount: 0n,\n refundAmount: reservedAmount,\n expiresAt: Number(expiresAt),\n state: 'claiming',\n }\n // The map write is synchronous. No second caller can observe a free nonce\n // between the uniqueness check and ownership write.\n this.operations.set(operationId, operation)\n const claimToken = globalThis.crypto.randomUUID()\n this.claimTokens.set(operationId, claimToken)\n const claim = (async () => {\n try {\n await this.options.onClaim?.(operation)\n if (this.claimTokens.get(operationId) !== claimToken) {\n throw new Error('payment claim ownership was reclaimed')\n }\n const current = this.operations.get(operationId)\n if (!current || current.state !== 'claiming') {\n throw new Error('payment claim ownership was lost')\n }\n const claimed = { ...current, state: 'claimed' as const }\n this.operations.set(operationId, claimed)\n return claimed\n } catch (error) {\n // Keep the durable `claiming` row. The external authorization may have\n // committed before its acknowledgement was lost, so expiry recovery\n // must own the decision to reclaim it.\n throw error\n } finally {\n if (this.claimTokens.get(operationId) === claimToken) {\n this.claimTokens.delete(operationId)\n }\n }\n })()\n this.claimFlights.set(operationId, claim)\n try {\n return await claim\n } finally {\n if (this.claimFlights.get(operationId) === claim) {\n this.claimFlights.delete(operationId)\n }\n }\n }\n\n async settlePayment(\n operation: PaymentOperation,\n input: PaymentSettlementInput,\n ): Promise<PaymentOperation> {\n const current = this.requireCurrent(operation)\n if (current.state === 'settled') {\n if (current.settledAmount !== input.amount) throw new Error('payment operation was settled twice')\n return current\n }\n if (current.state === 'settling') {\n if (current.settledAmount !== input.amount) throw new Error('payment operation has a different pending settlement')\n const flight = this.settleFlights.get(current.operationId)\n if (flight) return flight\n const reclaimFlight = this.reclaimFlights.get(current.operationId)\n if (reclaimFlight) return reclaimFlight\n const recovery = this.recoverSettlement(current, input)\n this.settleFlights.set(current.operationId, recovery)\n try {\n return await recovery\n } finally {\n if (this.settleFlights.get(current.operationId) === recovery) {\n this.settleFlights.delete(current.operationId)\n }\n }\n } else if (current.state !== 'claimed' && current.state !== 'executing' && current.state !== 'retained') {\n throw new Error(`cannot settle payment in state ${current.state}`)\n }\n validateSettlement(current, input)\n const settling = {\n ...current,\n state: 'settling' as const,\n settledAmount: input.amount,\n refundAmount: current.reservedAmount - input.amount,\n }\n this.operations.set(current.operationId, settling)\n const flight = this.runSettlement(settling, input)\n this.settleFlights.set(current.operationId, flight)\n try {\n return await flight\n } finally {\n if (this.settleFlights.get(current.operationId) === flight) {\n this.settleFlights.delete(current.operationId)\n }\n }\n }\n\n async beginPaymentExecution(operation: PaymentOperation): Promise<PaymentOperation> {\n const current = this.requireCurrent(operation)\n if (current.state === 'executing') return current\n if (current.state !== 'claimed') {\n throw new Error(`cannot begin payment execution in state ${current.state}`)\n }\n const executing = {\n ...current,\n state: 'executing' as const,\n executionStartedAt: this.now(),\n }\n this.operations.set(current.operationId, executing)\n return executing\n }\n\n async retainPayment(operation: PaymentOperation, reason: string): Promise<PaymentOperation> {\n const current = this.requireCurrent(operation)\n if (current.state === 'retained' || current.state === 'settling' || current.state === 'settled') {\n return current\n }\n if (current.state !== 'claimed' && current.state !== 'executing') {\n throw new Error(`cannot retain payment in state ${current.state}`)\n }\n const retained = {\n ...current,\n state: 'retained' as const,\n retentionReason: reason,\n }\n this.operations.set(current.operationId, retained)\n return retained\n }\n\n async releasePayment(operation: PaymentOperation, reason: string): Promise<PaymentOperation> {\n const current = this.requireCurrent(operation)\n if (current.state === 'released') return current\n if (current.state === 'releasing') {\n const flight = this.releaseFlights.get(current.operationId)\n if (flight) return flight\n const recovered = await this.reclaimPayment(current.operationId)\n if (recovered.state === 'not-found') {\n throw new Error('payment operation disappeared during release recovery')\n }\n return recovered\n }\n if (current.state !== 'claimed' && current.state !== 'executing') {\n throw new Error(`cannot release payment in state ${current.state}`)\n }\n const releasing = { ...current, state: 'releasing' as const }\n this.operations.set(current.operationId, releasing)\n return this.runRelease(releasing, reason)\n }\n\n async reclaimPayment(operationId: string): Promise<PaymentOperationRecoveryResult> {\n const current = this.operations.get(operationId)\n if (!current) {\n return {\n protocolVersion: PAYMENT_PROTOCOL_VERSION,\n operationId,\n state: 'not-found',\n }\n }\n if (current.state === 'reclaimed') return current\n if (current.state === 'executing' || current.state === 'retained') {\n throw new Error(`cannot reclaim payment in state ${current.state} without a usage receipt`)\n }\n if (current.state === 'settling') {\n const flight = this.settleFlights.get(operationId)\n if (flight) return flight\n const recoveryFlight = this.reclaimFlights.get(operationId)\n if (recoveryFlight) return recoveryFlight\n const recovery = this.recoverSettlement(current, {\n amount: current.settledAmount,\n totalCostUsd: 0,\n basis: 'usage-receipt',\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n reasoningTokens: 0,\n toolTokens: 0,\n toolCallCount: 0,\n providerCostUsd: 0,\n budgetEnforced: true,\n },\n })\n this.reclaimFlights.set(operationId, recovery)\n try {\n return await recovery\n } finally {\n if (this.reclaimFlights.get(operationId) === recovery) this.reclaimFlights.delete(operationId)\n }\n }\n if (current.state === 'releasing') {\n if (!this.options.onReclaim) throw new Error('payment release recovery is not configured')\n const releaseFlight = this.releaseFlights.get(operationId)\n if (releaseFlight) return releaseFlight\n const flight = this.reclaimFlights.get(operationId)\n if (flight) return flight\n const recovery = this.runReclaim(current, 'released')\n this.reclaimFlights.set(operationId, recovery)\n try {\n return await recovery\n } finally {\n if (this.reclaimFlights.get(operationId) === recovery) this.reclaimFlights.delete(operationId)\n }\n }\n if (current.state !== 'claiming' && current.state !== 'claimed' && current.state !== 'reclaimable') {\n throw new Error(`cannot reclaim payment in state ${current.state}`)\n }\n const flight = this.reclaimFlights.get(operationId)\n if (flight) return flight\n if (current.expiresAt > this.now()) throw new Error('payment operation has not expired')\n if (current.state === 'claiming') {\n // Invalidate the live claim before starting recovery. Its callback may\n // still finish, but it can no longer promote the operation to claimed.\n this.claimTokens.delete(operationId)\n }\n const reclaimable = { ...current, state: 'reclaimable' as const }\n this.operations.set(operationId, reclaimable)\n const recovery = this.runReclaim(reclaimable, 'reclaimed')\n this.reclaimFlights.set(operationId, recovery)\n try {\n return await recovery\n } finally {\n if (this.reclaimFlights.get(operationId) === recovery) this.reclaimFlights.delete(operationId)\n }\n }\n\n private async runSettlement(\n settling: PaymentOperation,\n input: PaymentSettlementInput,\n ): Promise<PaymentOperation> {\n await this.options.onSettle?.(settling, input)\n const settled = {\n ...settling,\n state: 'settled' as const,\n settledAmount: input.amount,\n refundAmount: settling.reservedAmount - input.amount,\n }\n this.operations.set(settling.operationId, settled)\n return settled\n }\n\n private async recoverSettlement(\n settling: PaymentOperation,\n input: PaymentSettlementInput,\n ): Promise<PaymentOperation> {\n if (!this.options.onReclaim) throw new Error('payment settlement recovery is not configured')\n await this.options.onReclaim(settling)\n const settled = {\n ...settling,\n state: 'settled' as const,\n settledAmount: input.amount,\n refundAmount: settling.reservedAmount - input.amount,\n }\n this.operations.set(settling.operationId, settled)\n return settled\n }\n\n private async runReclaim(\n operation: PaymentOperation,\n finalState: 'released' | 'reclaimed',\n ): Promise<PaymentOperation> {\n await this.options.onReclaim?.(operation)\n const recovered = { ...operation, state: finalState as PaymentOperationState }\n this.operations.set(operation.operationId, recovered)\n return recovered\n }\n\n private async runRelease(\n releasing: PaymentOperation,\n reason: string,\n ): Promise<PaymentOperation> {\n const flight = (async () => {\n await this.options.onRelease?.(releasing, reason)\n const released = { ...releasing, state: 'released' as const }\n this.operations.set(releasing.operationId, released)\n return released\n })()\n this.releaseFlights.set(releasing.operationId, flight)\n try {\n return await flight\n } finally {\n if (this.releaseFlights.get(releasing.operationId) === flight) {\n this.releaseFlights.delete(releasing.operationId)\n }\n }\n }\n\n get(operationId: string): PaymentOperation | undefined {\n const operation = this.operations.get(operationId)\n return operation ? { ...operation } : undefined\n }\n\n async getPaymentOperation(operationId: string): Promise<PaymentOperationRecoveryResult> {\n const operation = this.get(operationId)\n return operation ?? {\n protocolVersion: PAYMENT_PROTOCOL_VERSION,\n operationId,\n state: 'not-found',\n }\n }\n\n private requireCurrent(operation: PaymentOperation): PaymentOperation {\n const current = this.operations.get(operation.operationId)\n if (!current) throw new Error('payment operation was not found')\n if (current.protocolVersion !== operation.protocolVersion) {\n throw new Error('payment operation protocol version mismatch')\n }\n return current\n }\n}\n\nexport function paymentNonceKey(payload: Record<string, unknown>): string {\n const commitment = String(payload.commitment ?? '').toLowerCase()\n const nonce = unsignedAmount(payload.nonce, 'nonce').toString()\n if (!commitment) throw new Error('payment commitment is required')\n return `${commitment}:${nonce}`\n}\n\nfunction unsignedAmount(value: unknown, name = 'amount'): bigint {\n const raw = typeof value === 'string'\n ? value\n : typeof value === 'number' && Number.isSafeInteger(value)\n ? String(value)\n : ''\n if (!/^\\d+$/.test(raw)) throw new Error(`${name} is not an unsigned integer`)\n return BigInt(raw)\n}\n\nfunction validateSettlement(operation: PaymentOperation, input: PaymentSettlementInput): void {\n if (input.amount < 0n || input.amount > operation.reservedAmount) {\n throw new Error('settled amount must be between zero and the reserved amount')\n }\n if (!Number.isFinite(input.totalCostUsd) || input.totalCostUsd < 0) {\n throw new Error('settlement cost must be finite and non-negative')\n }\n if (!input.usage.budgetEnforced) throw new Error('sandbox usage receipt is not budget-enforced')\n if (input.basis !== 'usage-receipt' && input.basis !== 'quoted-ceiling') {\n throw new Error('payment settlement basis is invalid')\n }\n}\n","import type { MppChargeOperation } from './mpp-payment'\nimport type { PaymentOperation } from './payment-operations'\nimport type {\n PaymentMethod,\n PaymentSettlementBasis,\n SandboxExecutionBudget,\n SandboxUsageReceipt,\n} from './payment-types'\n\nexport type { PaymentSettlementBasis } from './payment-types'\n\nexport const PAYMENT_RECOVERY_VERSION = 1 as const\n\nexport type PaymentRecoveryState =\n | 'claiming'\n | 'claimed'\n | 'executing'\n | 'retained'\n | 'settling'\n | 'releasing'\n | 'reconciled'\n\nexport interface SerializedPaymentOperation {\n protocolVersion: 2\n operationId: string\n acquiredByRequestId: string\n executionStartedAt?: number\n retentionReason?: string\n nonceKey: string\n authorizationId: string\n reservedAmount: string\n settledAmount: string\n refundAmount: string\n expiresAt: number\n state: PaymentOperation['state']\n}\n\nexport interface PaymentRecoveryAttribution {\n requestId: string\n agentId: string\n agentSlug: string\n consumerId: string\n paymentMethod: PaymentMethod\n startMs: number\n pricePerTokenUsd: number\n platformFeePercent: number\n requiredAmount: string\n currencyDecimals: number\n maxOutputTokens: number\n executionBudget: SandboxExecutionBudget\n}\n\nexport type PaymentRecoveryTarget =\n | {\n kind: 'x402'\n operationId: string\n operation?: SerializedPaymentOperation\n }\n | {\n kind: 'mpp-charge'\n method: string\n operationId: string\n operation?: MppChargeOperation\n }\n\n/** Durable outbox row for one payment identity. Rows are never deleted here. */\nexport interface PaymentRecoveryRecord {\n version: typeof PAYMENT_RECOVERY_VERSION\n id: string\n revision: number\n state: PaymentRecoveryState\n payment: PaymentRecoveryTarget\n attribution: PaymentRecoveryAttribution\n workStarted: boolean\n /** Earliest time a missing receipt may settle at the quoted ceiling. */\n fallbackAt?: number\n usage?: SandboxUsageReceipt\n usageRecorded: boolean\n settlementBasis?: PaymentSettlementBasis\n reason?: string\n attempts: number\n lastError?: string\n nextAttemptAt: number\n lease?: { id: string; expiresAt: number }\n createdAt: number\n updatedAt: number\n reconciledAt?: number\n}\n\nexport interface PaymentRecoveryStore {\n createIfAbsent(record: PaymentRecoveryRecord): Promise<boolean>\n get(id: string): Promise<PaymentRecoveryRecord | undefined>\n compareAndSet(\n expected: PaymentRecoveryRecord,\n next: PaymentRecoveryRecord,\n ): Promise<boolean>\n listDue(now: number, limit: number): Promise<PaymentRecoveryRecord[]>\n}\n\nexport interface PaymentRecoveryConfig {\n store: PaymentRecoveryStore\n /** Claimed payment with no execution becomes recoverable after this delay. */\n staleRequestMs?: number\n /** Work without a final receipt settles at the quoted ceiling after this delay. */\n receiptTimeoutMs?: number\n /** Failed provider recovery waits this long before its next attempt. */\n retryDelayMs?: number\n /** One recovery worker owns a row for this duration. */\n leaseMs?: number\n}\n\nexport const DEFAULT_STALE_REQUEST_MS = 30_000\nexport const DEFAULT_RECEIPT_TIMEOUT_MS = 5 * 60_000\nexport const DEFAULT_RECOVERY_RETRY_MS = 30_000\nexport const DEFAULT_RECOVERY_LEASE_MS = 30_000\n\n/** Atomic single-process store for tests and explicit local demo mode. */\nexport class MemoryPaymentRecoveryStore implements PaymentRecoveryStore {\n private readonly records = new Map<string, PaymentRecoveryRecord>()\n\n async createIfAbsent(record: PaymentRecoveryRecord): Promise<boolean> {\n if (this.records.has(record.id)) return false\n this.records.set(record.id, clone(record))\n return true\n }\n\n async get(id: string): Promise<PaymentRecoveryRecord | undefined> {\n const record = this.records.get(id)\n return record ? clone(record) : undefined\n }\n\n async compareAndSet(\n expected: PaymentRecoveryRecord,\n next: PaymentRecoveryRecord,\n ): Promise<boolean> {\n const current = this.records.get(expected.id)\n if (!current || current.revision !== expected.revision) return false\n this.records.set(expected.id, clone(next))\n return true\n }\n\n async listDue(now: number, limit: number): Promise<PaymentRecoveryRecord[]> {\n return [...this.records.values()]\n .filter((record) => record.state !== 'reconciled' && record.nextAttemptAt <= now)\n .sort((left, right) => left.nextAttemptAt - right.nextAttemptAt)\n .slice(0, limit)\n .map(clone)\n }\n}\n\nexport class PaymentRecoveryFenceError extends Error {\n constructor(id: string) {\n super(`payment recovery fence was lost for ${id}`)\n this.name = 'PaymentRecoveryFenceError'\n }\n}\n\nexport class PaymentRecoveryReplayError extends Error {\n constructor(id: string) {\n super(`payment recovery identity was already reconciled: ${id}`)\n this.name = 'PaymentRecoveryReplayError'\n }\n}\n\n/** Update only while the caller still owns the durable row fence. */\nexport async function updateOwnedPaymentRecovery(\n store: PaymentRecoveryStore,\n id: string,\n fenceId: string,\n update: (record: PaymentRecoveryRecord) => PaymentRecoveryRecord,\n now = Date.now(),\n): Promise<PaymentRecoveryRecord> {\n for (let attempt = 0; attempt < 16; attempt += 1) {\n const current = await store.get(id)\n if (!current) throw new Error(`payment recovery record ${id} was not found`)\n if (current.state === 'reconciled' || current.lease?.id !== fenceId) {\n throw new PaymentRecoveryFenceError(id)\n }\n const candidate = update(clone(current))\n assertRecoveryUpdate(current, candidate)\n const next: PaymentRecoveryRecord = {\n ...candidate,\n id: current.id,\n version: PAYMENT_RECOVERY_VERSION,\n revision: current.revision + 1,\n createdAt: current.createdAt,\n updatedAt: now,\n }\n if (await store.compareAndSet(current, next)) return next\n }\n throw new Error(`payment recovery record ${id} changed too many times`)\n}\n\nconst PAYMENT_RECOVERY_TRANSITIONS: Record<PaymentRecoveryState, ReadonlySet<PaymentRecoveryState>> = {\n claiming: new Set(['claiming', 'claimed', 'releasing', 'reconciled']),\n claimed: new Set(['claimed', 'executing', 'releasing', 'reconciled']),\n executing: new Set(['executing', 'retained', 'settling', 'releasing', 'reconciled']),\n retained: new Set(['retained', 'settling', 'reconciled']),\n settling: new Set(['settling', 'reconciled']),\n releasing: new Set(['releasing', 'reconciled']),\n reconciled: new Set(['reconciled']),\n}\n\nfunction assertRecoveryUpdate(\n current: PaymentRecoveryRecord,\n candidate: PaymentRecoveryRecord,\n): void {\n if (!PAYMENT_RECOVERY_TRANSITIONS[current.state].has(candidate.state)) {\n throw new Error(`invalid payment recovery transition ${current.state} -> ${candidate.state}`)\n }\n if (JSON.stringify(current.attribution) !== JSON.stringify(candidate.attribution)) {\n throw new Error('payment recovery attribution is immutable')\n }\n if (\n current.payment.kind !== candidate.payment.kind ||\n current.payment.operationId !== candidate.payment.operationId ||\n (current.payment.kind === 'mpp-charge' &&\n candidate.payment.kind === 'mpp-charge' &&\n current.payment.method !== candidate.payment.method)\n ) {\n throw new Error('payment recovery identity is immutable')\n }\n if (current.workStarted && !candidate.workStarted) {\n throw new Error('payment recovery cannot forget started work')\n }\n if (current.usageRecorded && !candidate.usageRecorded) {\n throw new Error('payment recovery cannot forget usage attribution')\n }\n if (current.usage && (!candidate.usage || !sameRecoveryUsage(current.usage, candidate.usage))) {\n throw new Error('payment recovery usage receipt is immutable')\n }\n if (\n current.settlementBasis &&\n current.settlementBasis !== candidate.settlementBasis\n ) {\n throw new Error('payment recovery settlement basis is immutable')\n }\n}\n\nfunction sameRecoveryUsage(\n left: SandboxUsageReceipt,\n right: SandboxUsageReceipt,\n): boolean {\n return left.inputTokens === right.inputTokens &&\n left.outputTokens === right.outputTokens &&\n left.reasoningTokens === right.reasoningTokens &&\n left.toolTokens === right.toolTokens &&\n left.toolCallCount === right.toolCallCount &&\n left.providerCostUsd === right.providerCostUsd &&\n left.budgetEnforced === right.budgetEnforced\n}\n\nexport function serializePaymentOperation(\n operation: PaymentOperation,\n): SerializedPaymentOperation {\n return {\n protocolVersion: 2,\n operationId: operation.operationId,\n acquiredByRequestId: operation.acquiredByRequestId,\n ...(operation.executionStartedAt !== undefined\n ? { executionStartedAt: operation.executionStartedAt }\n : {}),\n ...(operation.retentionReason ? { retentionReason: operation.retentionReason } : {}),\n nonceKey: operation.nonceKey,\n authorizationId: operation.authorizationId,\n reservedAmount: operation.reservedAmount.toString(),\n settledAmount: operation.settledAmount.toString(),\n refundAmount: operation.refundAmount.toString(),\n expiresAt: operation.expiresAt,\n state: operation.state,\n }\n}\n\nexport function deserializePaymentOperation(\n value: SerializedPaymentOperation,\n): PaymentOperation {\n if (value.protocolVersion !== 2) throw new Error('unsupported payment operation version')\n if (!value.operationId || !value.acquiredByRequestId || !value.nonceKey || !value.authorizationId) {\n throw new Error('incomplete payment operation recovery record')\n }\n return {\n protocolVersion: 2,\n operationId: value.operationId,\n acquiredByRequestId: value.acquiredByRequestId,\n ...(value.executionStartedAt !== undefined ? { executionStartedAt: value.executionStartedAt } : {}),\n ...(value.retentionReason ? { retentionReason: value.retentionReason } : {}),\n nonceKey: value.nonceKey,\n authorizationId: value.authorizationId,\n reservedAmount: BigInt(value.reservedAmount),\n settledAmount: BigInt(value.settledAmount),\n refundAmount: BigInt(value.refundAmount),\n expiresAt: value.expiresAt,\n state: value.state,\n }\n}\n\nexport function recoveryTiming(config: PaymentRecoveryConfig): {\n staleRequestMs: number\n receiptTimeoutMs: number\n retryDelayMs: number\n leaseMs: number\n} {\n return {\n staleRequestMs: config.staleRequestMs ?? DEFAULT_STALE_REQUEST_MS,\n receiptTimeoutMs: config.receiptTimeoutMs ?? DEFAULT_RECEIPT_TIMEOUT_MS,\n retryDelayMs: config.retryDelayMs ?? DEFAULT_RECOVERY_RETRY_MS,\n leaseMs: config.leaseMs ?? DEFAULT_RECOVERY_LEASE_MS,\n }\n}\n\nexport function assertPaymentRecoveryConfig(config: PaymentRecoveryConfig): void {\n for (const [name, value] of Object.entries(recoveryTiming(config))) {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new Error(`payment recovery ${name} must be a positive safe integer`)\n }\n }\n const store = config.store\n if (\n !store ||\n typeof store.createIfAbsent !== 'function' ||\n typeof store.get !== 'function' ||\n typeof store.compareAndSet !== 'function' ||\n typeof store.listDue !== 'function'\n ) {\n throw new Error('payment recovery store must provide atomic create, compare-and-set, and due scans')\n }\n}\n\nfunction clone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T\n}\n","import {\n PAYMENT_RECOVERY_VERSION,\n PaymentRecoveryFenceError,\n PaymentRecoveryReplayError,\n recoveryTiming,\n serializePaymentOperation,\n updateOwnedPaymentRecovery,\n type PaymentRecoveryRecord,\n type PaymentRecoveryTarget,\n type PaymentSettlementBasis,\n} from './payment-recovery'\nimport type { GatewayConfig, SandboxUsageReceipt } from './types'\nimport type {\n AuthorizedRequest,\n PaymentClaimHooks,\n} from './dispatch-types'\n\nexport function paymentAuthorizationContext(authz: AuthorizedRequest) {\n return {\n requestId: authz.requestId,\n agentId: authz.agent.id,\n requiredAmount: authz.requiredPaymentAmount,\n maxOutputTokens: authz.maxOutputTokens,\n executionBudget: authz.executionBudget,\n }\n}\n\nexport async function preparePaymentRecovery(\n authz: AuthorizedRequest,\n config: GatewayConfig,\n payment: PaymentRecoveryTarget,\n hooks: PaymentClaimHooks,\n): Promise<void> {\n const recovery = config.paymentRecovery\n if (!recovery) throw new Error('durable payment recovery is not configured')\n const now = Date.now()\n const fenceId = globalThis.crypto.randomUUID()\n const leaseExpiresAt = now + recoveryTiming(recovery).staleRequestMs\n const record: PaymentRecoveryRecord = {\n version: PAYMENT_RECOVERY_VERSION,\n id: payment.operationId,\n revision: 0,\n state: 'claiming',\n payment,\n attribution: {\n requestId: authz.requestId,\n agentId: authz.agent.id,\n agentSlug: authz.agent.slug,\n consumerId: authz.consumerId,\n paymentMethod: authz.paymentMethod,\n startMs: authz.startMs,\n pricePerTokenUsd: authz.agent.pricePerTokenUsd,\n platformFeePercent: authz.agent.platformFeePercent,\n requiredAmount: authz.requiredPaymentAmount.toString(),\n currencyDecimals: config.x402.currencyDecimals ?? 6,\n maxOutputTokens: authz.maxOutputTokens,\n executionBudget: authz.executionBudget,\n },\n workStarted: false,\n usageRecorded: false,\n attempts: 0,\n nextAttemptAt: leaseExpiresAt,\n lease: { id: fenceId, expiresAt: leaseExpiresAt },\n createdAt: now,\n updatedAt: now,\n }\n if (!await recovery.store.createIfAbsent(record)) {\n if ((await recovery.store.get(record.id))?.state === 'reconciled') {\n throw new PaymentRecoveryReplayError(record.id)\n }\n throw new Error('payment recovery identity was already claimed')\n }\n authz.paymentRecoveryId = record.id\n authz.paymentRecoveryFence = fenceId\n await hooks.onRecoveryPrepared?.(record.id)\n}\n\nexport async function markRecoveryClaimed(\n authz: AuthorizedRequest,\n config: GatewayConfig,\n): Promise<void> {\n const recovery = config.paymentRecovery\n if (!recovery || !authz.paymentRecoveryId) return\n const fenceId = requirePaymentRecoveryFence(authz)\n const now = Date.now()\n const leaseExpiresAt = now + recoveryTiming(recovery).staleRequestMs\n await updateRecovery(authz, config, (record) => ({\n ...record,\n state: 'claimed',\n payment: recoveryTarget(authz, record.payment),\n lease: { id: fenceId, expiresAt: leaseExpiresAt },\n nextAttemptAt: leaseExpiresAt,\n }), now)\n}\n\nexport function requirePaymentRecoveryFence(authz: AuthorizedRequest): string {\n if (!authz.paymentRecoveryFence) {\n throw new Error('payment recovery fence is unavailable')\n }\n return authz.paymentRecoveryFence\n}\n\nasync function updateRecovery(\n authz: AuthorizedRequest,\n config: GatewayConfig,\n update: (record: PaymentRecoveryRecord) => PaymentRecoveryRecord,\n now = Date.now(),\n): Promise<PaymentRecoveryRecord | undefined> {\n const recovery = config.paymentRecovery\n if (!recovery || !authz.paymentRecoveryId) return undefined\n return updateOwnedPaymentRecovery(\n recovery.store,\n authz.paymentRecoveryId,\n requirePaymentRecoveryFence(authz),\n update,\n now,\n )\n}\n\nexport function recoveryTarget(\n authz: AuthorizedRequest,\n current: PaymentRecoveryTarget,\n): PaymentRecoveryTarget {\n if (authz.paymentOperation) {\n return {\n kind: 'x402',\n operationId: authz.paymentOperation.operationId,\n operation: serializePaymentOperation(authz.paymentOperation),\n }\n }\n if (authz.mppChargeOperation) {\n return {\n kind: 'mpp-charge',\n method: authz.mppChargeOperation.method,\n operationId: authz.mppChargeOperation.operationId,\n operation: authz.mppChargeOperation,\n }\n }\n return current\n}\n\nexport async function relinquishPaymentRecovery(\n authz: AuthorizedRequest,\n config: GatewayConfig,\n nextAttemptAt: number,\n): Promise<void> {\n const recovery = config.paymentRecovery\n if (!recovery || !authz.paymentRecoveryId || !authz.paymentRecoveryFence) return\n try {\n await updateOwnedPaymentRecovery(\n recovery.store,\n authz.paymentRecoveryId,\n authz.paymentRecoveryFence,\n (record) => ({ ...record, lease: undefined, nextAttemptAt }),\n )\n } catch (error) {\n if (!(error instanceof PaymentRecoveryFenceError)) throw error\n }\n}\n\nexport async function markRecoveryReleasing(\n authz: AuthorizedRequest,\n config: GatewayConfig,\n reason: string,\n): Promise<void> {\n const recovery = config.paymentRecovery\n if (!recovery || !authz.paymentRecoveryId) return\n await updateRecovery(authz, config, (record) => ({\n ...record,\n state: 'releasing',\n payment: recoveryTarget(authz, record.payment),\n reason,\n nextAttemptAt: Date.now(),\n }))\n}\n\nexport async function markRecoveryReconciled(\n authz: AuthorizedRequest,\n config: GatewayConfig,\n): Promise<void> {\n const recovery = config.paymentRecovery\n if (!recovery || !authz.paymentRecoveryId) return\n const now = Date.now()\n await updateRecovery(authz, config, (record) => ({\n ...record,\n state: 'reconciled',\n payment: recoveryTarget(authz, record.payment),\n lease: undefined,\n lastError: undefined,\n nextAttemptAt: Number.MAX_SAFE_INTEGER,\n reconciledAt: now,\n }), now)\n}\n\nexport function assertX402V1SettlementSafe(authz: AuthorizedRequest, config: GatewayConfig): void {\n if (\n authz.paymentMethod === 'x402' &&\n config.x402.paymentProtocolVersion !== 2 &&\n !config.x402.demoMode &&\n config.settlePayment\n ) {\n throw new Error(\n 'production x402 version 1 cannot use settlePayment; ' +\n 'use paymentProtocolVersion: 2 with paymentOperations',\n )\n }\n}\n\nexport async function markRecoverySettling(\n authz: AuthorizedRequest,\n usage: SandboxUsageReceipt,\n settlementBasis: PaymentSettlementBasis,\n config: GatewayConfig,\n): Promise<void> {\n const recovery = config.paymentRecovery\n if (!recovery || !authz.paymentRecoveryId) return\n await updateRecovery(authz, config, (record) => {\n const next: PaymentRecoveryRecord = {\n ...record,\n state: 'settling',\n payment: recoveryTarget(authz, record.payment),\n workStarted: true,\n settlementBasis,\n nextAttemptAt: Date.now(),\n }\n // A quoted-ceiling settlement has no provider receipt. Keep the durable\n // basis and original amount, then rebuild the synthetic accounting input\n // on each retry instead of persisting a lossy floating-point surrogate.\n if (settlementBasis !== 'quoted-ceiling' || record.usage !== undefined) {\n next.usage = usage\n } else {\n delete next.usage\n }\n return next\n })\n}\n\nexport async function markRecoveryUsageRecorded(\n authz: AuthorizedRequest,\n config: GatewayConfig,\n): Promise<void> {\n const recovery = config.paymentRecovery\n if (!recovery || !authz.paymentRecoveryId) return\n await updateRecovery(authz, config, (record) => ({\n ...record,\n usageRecorded: true,\n }))\n}\n","import {\n assertMppChargeOperation,\n mppPaymentOperationId,\n} from './mpp-payment'\nimport { claimStoredNonce, nonceTtlSeconds, type NonceStore } from './nonce-store'\nimport {\n paymentNonceKey,\n type PaymentOperation,\n type PaymentOperationRecoveryResult,\n} from './payment-operations'\nimport { recoveryTiming, updateOwnedPaymentRecovery } from './payment-recovery'\nimport type {\n AuthorizedRequest,\n GatewayState,\n PaymentClaimHooks,\n} from './dispatch-types'\nimport {\n assertX402V1SettlementSafe,\n markRecoveryClaimed,\n markRecoveryReconciled,\n markRecoveryReleasing,\n paymentAuthorizationContext,\n preparePaymentRecovery,\n recoveryTarget,\n relinquishPaymentRecovery,\n requirePaymentRecoveryFence,\n} from './dispatch-payment-recovery'\nimport type { GatewayConfig } from './types'\n\n/** Claim payment ownership after every request guard has accepted the call. */\nexport async function claimPayment(\n authz: AuthorizedRequest,\n config: GatewayConfig,\n state: GatewayState,\n hooks: PaymentClaimHooks = {},\n): Promise<void> {\n assertX402V1SettlementSafe(authz, config)\n if (authz.paymentMethod === 'x402' && authz.paymentPayload) {\n const context = paymentAuthorizationContext(authz)\n if (config.x402.paymentProtocolVersion === 2) {\n await preparePaymentRecovery(authz, config, {\n kind: 'x402',\n operationId: `x402:${paymentNonceKey(authz.paymentPayload)}`,\n }, hooks)\n }\n let operation: PaymentOperation | undefined\n if (config.x402.authorizePayment) {\n if (config.x402.paymentProtocolVersion !== 2 && !config.x402.demoMode) {\n throw new Error(\n 'production x402 version 1 cannot use authorizePayment; ' +\n 'use paymentProtocolVersion: 2 with paymentOperations',\n )\n }\n // Version 1 has no durable operation to release if another request wins\n // the shared nonce while this callback is still running. This callback\n // remains only for explicit demo-mode compatibility; production callers\n // must use the durable version 2 operation lifecycle.\n const legacyClaimed = config.x402.paymentProtocolVersion !== 2 && authz.paymentNonceKey\n ? await claimPaymentNonce(state.nonceStore, authz.paymentNonceKey, authz.paymentPayload)\n : undefined\n if (legacyClaimed === false) throw new Error('payment nonce was already consumed')\n const result = await config.x402.authorizePayment(authz.paymentPayload, context)\n if (!result) throw new Error('payment authorization was rejected')\n if (typeof result !== 'boolean') {\n operation = result\n }\n else if (config.x402.paymentProtocolVersion === 2) {\n throw new Error('version 2 payment authorization did not return an operation')\n } else if (authz.paymentNonceKey && legacyClaimed === undefined) {\n const claimed = await claimPaymentNonce(state.nonceStore, authz.paymentNonceKey, authz.paymentPayload)\n if (!claimed) throw new Error('payment nonce was already consumed')\n }\n } else if (config.x402.paymentOperations) {\n operation = await config.x402.paymentOperations.claimPayment(authz.paymentPayload, context)\n } else if (authz.paymentNonceKey) {\n const claimed = await claimPaymentNonce(state.nonceStore, authz.paymentNonceKey, authz.paymentPayload)\n if (!claimed) throw new Error('payment nonce was already consumed')\n }\n if (operation && operation.protocolVersion !== 2) {\n throw new Error('payment operation protocol version mismatch')\n }\n if (\n operation &&\n config.x402.paymentProtocolVersion === 2 &&\n operation.operationId !== authz.paymentRecoveryId\n ) {\n throw new Error('x402 payment operation identity mismatch')\n }\n if (operation && !config.x402.paymentOperations) {\n throw new Error('durable payment operations are required to settle a claimed operation')\n }\n if (operation) {\n authz.paymentOperationAcquired = operation.acquiredByRequestId === context.requestId\n if (!authz.paymentOperationAcquired) {\n throw new Error('payment operation was already claimed')\n }\n // Attach owned state before the shared nonce claim. If that claim fails,\n // the caller can persist release recovery after an ambiguous refund.\n authz.paymentOperation = operation\n await markRecoveryClaimed(authz, config)\n }\n if (operation && authz.paymentNonceKey) {\n const claimed = await claimPaymentNonce(\n state.nonceStore,\n authz.paymentNonceKey,\n authz.paymentPayload,\n `${operation.operationId}:${context.requestId}`,\n )\n if (!claimed) {\n await releaseAfterNonceConflict(authz, config)\n throw new Error('payment nonce was already consumed')\n }\n }\n } else if (authz.paymentMethod === 'mpp') {\n if (!authz.paymentNonceKey) {\n throw new Error('MPP payment has no replay identity')\n }\n const mppMethod = (authz.mppMethod ?? config.mpp?.method ?? 'blueprintevm').toLowerCase()\n const durablePayload = durableMppPaymentPayload(authz.paymentPayload)\n // Only BlueprinTEVM carries x402 authorization fields. Other MPP methods\n // use the isolated immediate-charge lifecycle below.\n if (mppMethod === 'blueprintevm' && durablePayload && config.x402.paymentOperations) {\n const context = paymentAuthorizationContext(authz)\n await preparePaymentRecovery(authz, config, {\n kind: 'x402',\n operationId: `x402:${paymentNonceKey(durablePayload)}`,\n }, hooks)\n const operation = await config.x402.paymentOperations.claimPayment(durablePayload, context)\n if (operation.protocolVersion !== 2) throw new Error('payment operation protocol version mismatch')\n if (operation.operationId !== authz.paymentRecoveryId) {\n throw new Error('x402 payment operation identity mismatch')\n }\n if (operation.acquiredByRequestId !== context.requestId) {\n throw new Error('payment operation was already claimed')\n }\n authz.paymentPayload = durablePayload\n authz.paymentOperation = operation\n authz.paymentOperationAcquired = true\n await markRecoveryClaimed(authz, config)\n const claimed = await claimPaymentNonce(\n state.nonceStore,\n authz.paymentNonceKey,\n durablePayload,\n `${operation.operationId}:${context.requestId}`,\n )\n if (!claimed) {\n await releaseAfterNonceConflict(authz, config)\n throw new Error('payment nonce was already consumed')\n }\n } else if (mppMethod === 'blueprintevm') {\n const claimed = await claimPaymentNonce(state.nonceStore, authz.paymentNonceKey, authz.paymentPayload ?? {})\n if (!claimed) throw new Error('payment nonce was already consumed')\n } else {\n const lifecycle = config.mpp?.charge\n if (!lifecycle || lifecycle.protocolVersion !== 1) {\n throw new Error('MPP charge lifecycle is not configured')\n }\n if (!authz.mppCredential) throw new Error('MPP payment credential is unavailable')\n if (!authz.mppPaymentIdentity) throw new Error('MPP payment identity is unavailable')\n const operationId = await mppPaymentOperationId(mppMethod, authz.mppPaymentIdentity)\n await preparePaymentRecovery(authz, config, {\n kind: 'mpp-charge',\n method: mppMethod,\n operationId,\n }, hooks)\n const claimed = await claimPaymentNonce(\n state.nonceStore,\n authz.paymentNonceKey,\n authz.paymentPayload ?? {},\n `${operationId}:${authz.requestId}`,\n )\n if (!claimed) {\n await markRecoveryReconciled(authz, config)\n throw new Error('payment nonce was already consumed')\n }\n const operation = await lifecycle.confirmPayment({\n operationId,\n requestId: authz.requestId,\n agentId: authz.agent.id,\n consumerId: authz.consumerId,\n method: mppMethod,\n credential: authz.mppCredential,\n amount: authz.requiredPaymentAmount,\n currencyDecimals: config.x402.currencyDecimals ?? 6,\n })\n assertMppChargeOperation(\n operation,\n { operationId, requestId: authz.requestId, method: mppMethod },\n ['confirmed'],\n false,\n )\n authz.mppChargeOperation = operation\n await markRecoveryClaimed(authz, config)\n assertMppChargeOperation(\n operation,\n { operationId, requestId: authz.requestId, method: mppMethod },\n ['confirmed'],\n )\n }\n }\n\n try {\n await state.obs?.onPaymentVerified?.(\n {\n requestId: authz.requestId,\n agentSlug: authz.agent.slug,\n startMs: authz.startMs,\n },\n {\n method: authz.paymentMethod,\n consumerId: authz.consumerId,\n keyId: authz.keyInfo?.keyId,\n },\n )\n } catch (error) {\n // Observability must not turn a durable claim into a stranded payment.\n console.error(\n '[agent-gateway] payment observer failed for ' + authz.requestId + ':',\n error instanceof Error ? error.message : String(error),\n )\n }\n}\n\n/** Release an owned operation when execution cannot produce a valid receipt. */\nexport async function releasePayment(\n authz: AuthorizedRequest,\n config: GatewayConfig,\n reason: string,\n): Promise<void> {\n const ownsX402 = authz.paymentOperation &&\n authz.paymentOperationAcquired === true &&\n config.x402.paymentOperations\n const ownsMpp = authz.mppChargeOperation && config.mpp?.charge\n if (!ownsX402 && !ownsMpp) {\n await relinquishPaymentRecovery(authz, config, Date.now())\n return\n }\n let reconciled = false\n try {\n await markRecoveryReleasing(authz, config, reason)\n if (ownsX402) {\n authz.paymentOperation = await config.x402.paymentOperations!.releasePayment(\n authz.paymentOperation!,\n reason,\n )\n } else {\n const operation = await config.mpp!.charge!.releasePayment(authz.mppChargeOperation!, reason)\n assertMppChargeOperation(\n operation,\n {\n operationId: authz.mppChargeOperation!.operationId,\n requestId: authz.requestId,\n method: authz.mppChargeOperation!.method,\n },\n ['released'],\n false,\n )\n authz.mppChargeOperation = operation\n }\n await markRecoveryReconciled(authz, config)\n reconciled = true\n } finally {\n if (!reconciled) {\n try {\n await relinquishPaymentRecovery(authz, config, Date.now())\n } catch {\n // Preserve the original provider or metadata error. A later worker\n // retry still has the durable row when cleanup itself is unavailable.\n }\n }\n }\n}\n\n/** Mark a durable reservation active immediately before sandbox execution. */\nexport async function beginPaymentExecution(\n authz: AuthorizedRequest,\n config: GatewayConfig,\n): Promise<void> {\n if (authz.paymentOperation && authz.paymentOperationAcquired === true && config.x402.paymentOperations) {\n authz.paymentOperation = await config.x402.paymentOperations.beginPaymentExecution(authz.paymentOperation)\n }\n}\n\n/** Persist the sandbox handoff immediately before the adapter call. */\nexport async function markPaymentExecutionStarted(\n authz: AuthorizedRequest,\n config: GatewayConfig,\n): Promise<void> {\n await updateExecutionLease(authz, config, true)\n}\n\n/** Renew the live execution lease while a provider stream is still open. */\nexport async function renewPaymentExecution(\n authz: AuthorizedRequest,\n config: GatewayConfig,\n): Promise<void> {\n await updateExecutionLease(authz, config, false)\n}\n\nasync function updateExecutionLease(\n authz: AuthorizedRequest,\n config: GatewayConfig,\n markStarted: boolean,\n): Promise<void> {\n if (!authz.paymentRecoveryId) return\n const recovery = config.paymentRecovery\n if (!recovery) throw new Error('durable payment recovery is not configured')\n const fenceId = requirePaymentRecoveryFence(authz)\n const now = Date.now()\n const fallbackAt = now + recoveryTiming(recovery).receiptTimeoutMs\n await updateOwnedPaymentRecovery(recovery.store, authz.paymentRecoveryId, fenceId, (record) => ({\n ...record,\n state: 'executing',\n ...(markStarted\n ? { payment: recoveryTarget(authz, record.payment), workStarted: true }\n : {}),\n fallbackAt,\n lease: { id: fenceId, expiresAt: fallbackAt },\n nextAttemptAt: fallbackAt,\n }), now)\n}\n\n/**\n * Release only when no sandbox work was observed. Once output or a receipt\n * exists, retain the owner for settlement or background recovery.\n */\nexport async function releasePaymentAfterFailure(\n authz: AuthorizedRequest,\n config: GatewayConfig,\n reason: string,\n workObserved: boolean,\n): Promise<void> {\n if (workObserved) {\n const recovery = config.paymentRecovery\n if (recovery && authz.paymentRecoveryId) {\n const fenceId = requirePaymentRecoveryFence(authz)\n await updateOwnedPaymentRecovery(recovery.store, authz.paymentRecoveryId, fenceId, (record) => {\n if (record.state === 'settling' && record.usage) {\n return { ...record, lease: undefined, nextAttemptAt: Date.now() }\n }\n const fallbackAt = record.fallbackAt ??\n Date.now() + recoveryTiming(recovery).receiptTimeoutMs\n return {\n ...record,\n state: 'retained',\n payment: recoveryTarget(authz, record.payment),\n workStarted: true,\n fallbackAt,\n reason,\n lease: undefined,\n nextAttemptAt: fallbackAt,\n }\n })\n }\n if (authz.paymentOperation && authz.paymentOperationAcquired === true && config.x402.paymentOperations) {\n authz.paymentOperation = await config.x402.paymentOperations.retainPayment(authz.paymentOperation, reason)\n }\n console.error(\n `[agent-gateway] retaining payment ownership after sandbox work for ${authz.requestId}: ${reason}`,\n )\n return\n }\n await releasePayment(authz, config, reason)\n}\n\nexport async function reclaimPayment(\n operationId: string,\n config: GatewayConfig,\n): Promise<PaymentOperationRecoveryResult> {\n if (!config.x402.paymentOperations) throw new Error('durable payment operations are not configured')\n return config.x402.paymentOperations.reclaimPayment(operationId)\n}\n\nasync function releaseAfterNonceConflict(\n authz: AuthorizedRequest,\n config: GatewayConfig,\n): Promise<void> {\n try {\n await releasePayment(authz, config, 'shared payment nonce was already owned')\n } catch (releaseError) {\n console.error(\n `[agent-gateway] payment release failed for ${authz.requestId}:`,\n releaseError instanceof Error ? releaseError.message : String(releaseError),\n )\n }\n}\n\nasync function claimPaymentNonce(\n nonceStore: NonceStore,\n nonceKey: string,\n payload: Record<string, unknown>,\n ownerId?: string,\n): Promise<boolean> {\n const expiry = payload.expiry === undefined\n ? BigInt(Math.floor(Date.now() / 1000) + 3600)\n : BigInt(String(payload.expiry))\n const ttl = nonceTtlSeconds(expiry)\n if (ttl === undefined) return false\n return claimStoredNonce(nonceStore, nonceKey, ttl, ownerId)\n}\n\nfunction durableMppPaymentPayload(\n payload: Record<string, unknown> | null,\n): Record<string, unknown> | undefined {\n if (!payload) return undefined\n const commitment = payload.commitment ?? payload.from\n const amount = payload.amount ?? payload.value\n const nonce = payload.nonce\n if (typeof commitment !== 'string' || commitment.length === 0) return undefined\n if (amount === undefined || nonce === undefined) return undefined\n const amountText = String(amount)\n const nonceText = String(nonce)\n if (!/^\\d+$/.test(amountText) || !/^\\d+$/.test(nonceText)) return undefined\n const expiryText = payload.expiry === undefined\n ? String(Math.floor(Date.now() / 1000) + 3600)\n : String(payload.expiry)\n if (!/^\\d+$/.test(expiryText)) return undefined\n return {\n ...payload,\n commitment,\n amount: amountText,\n nonce: nonceText,\n expiry: expiryText,\n }\n}\n","import { redactSystemPromptFromOutput } from './filter'\nimport type { A2ADispatchEvent } from './dispatch-types'\nimport {\n estimateTokens,\n maximumBillableInputTokens,\n} from './dispatch-pricing'\nimport type {\n AgentMeta,\n GatewayConfig,\n SandboxExecutionBudget,\n SandboxStreamEvent,\n SandboxUsageReceipt,\n} from './types'\n\nexport async function* dispatchSandboxStream(\n agent: AgentMeta,\n userMessage: string,\n consumerId: string,\n config: GatewayConfig,\n signal?: AbortSignal,\n sessionId?: string,\n maxOutputTokens?: number,\n): AsyncIterable<string> {\n for await (const event of dispatchSandboxStreamRich(\n agent,\n userMessage,\n consumerId,\n config,\n signal,\n sessionId,\n maxOutputTokens,\n )) {\n if (event.kind === 'text') yield event.delta\n }\n}\n\n/**\n * Like `dispatchSandboxStream` but yields a discriminated union so callers can\n * react to `input-required` signals from the sandbox. The sandbox opts in by\n * emitting `{ type: 'input-required', data: { inputRequired: { prompt? } } }`\n * (or by setting `data.inputRequired` on any event); sandboxes that don't emit\n * such events see identical behavior.\n *\n * `sessionId` defaults to `consumer:<id>` matching the existing single-turn\n * path; multi-turn continuations pass an explicit `taskId` so the sandbox can\n * keep per-task conversation memory.\n */\nexport async function* dispatchSandboxStreamRich(\n agent: AgentMeta,\n userMessage: string,\n consumerId: string,\n config: GatewayConfig,\n signal?: AbortSignal,\n sessionId?: string,\n maxOutputTokens?: number,\n onExecutionStart?: () => Promise<void>,\n requiresReceipt = config.x402.paymentOperations !== undefined,\n onSandboxStart?: () => void | Promise<void>,\n maxInputTokens?: number,\n onExecutionHeartbeat?: () => Promise<void>,\n): AsyncIterable<A2ADispatchEvent> {\n if (signal?.aborted) return\n const box = await config.getSandbox(agent)\n if (signal?.aborted) return\n const outputLimit = maxOutputTokens ?? config.defaultOutputTokens ?? 1024\n if (!Number.isSafeInteger(outputLimit) || outputLimit <= 0) {\n throw new Error('max output tokens must be a positive safe integer')\n }\n let outputBytes = 0\n // Bound untrusted adapters while the final receipt is pending. The receipt\n // remains authoritative for token count, so over-limit output is never sent.\n const maxOutputBytes = outputLimit * 4\n if (!Number.isSafeInteger(maxOutputBytes)) {\n throw new Error('max output token bound exceeds safe integer range')\n }\n const encoder = new TextEncoder()\n let usageParts: Partial<SandboxUsageReceipt> = {}\n let observedReasoningTokens = 0\n let observedToolTokens = 0\n let observedToolCalls = 0\n let legacyOutputText = ''\n const executionController = new AbortController()\n const forwardAbort = () => executionController.abort()\n if (signal?.aborted) return\n signal?.addEventListener('abort', forwardAbort, { once: true })\n const executionBudget: SandboxExecutionBudget = {\n maxInputTokens: maxInputTokens ?? maximumBillableInputTokens(agent, userMessage),\n maxOutputTokens: outputLimit,\n maxReasoningTokens: config.executionBudget?.maxReasoningTokens ?? outputLimit,\n maxToolTokens: config.executionBudget?.maxToolTokens ?? outputLimit,\n maxToolCalls: config.executionBudget?.maxToolCalls ?? 8,\n maxProviderCostUsd: config.executionBudget?.maxProviderCostUsd ?? (\n (maxInputTokens ?? maximumBillableInputTokens(agent, userMessage)) + outputLimit +\n (config.executionBudget?.maxReasoningTokens ?? outputLimit) +\n (config.executionBudget?.maxToolTokens ?? outputLimit)\n ) * agent.pricePerTokenUsd,\n }\n if (executionController.signal.aborted) return\n await onExecutionStart?.()\n if (executionController.signal.aborted) return\n let heartbeatError: unknown\n let heartbeatInFlight: Promise<void> | undefined\n let heartbeatTimer: ReturnType<typeof setInterval> | undefined\n let iterator: AsyncIterator<SandboxStreamEvent> | undefined\n try {\n // This durable handoff is after sandbox acquisition and immediately before\n // the adapter call that may start paid work.\n await onSandboxStart?.()\n const promptStream = box.streamPrompt(userMessage, {\n sessionId: sessionId ?? `consumer:${consumerId}`,\n systemPrompt: agent.systemPrompt,\n maxOutputTokens: outputLimit,\n executionBudget,\n signal: executionController.signal,\n })\n iterator = promptStream[Symbol.asyncIterator]()\n const heartbeatMs = onExecutionHeartbeat\n ? Math.max(100, Math.min(\n Math.floor((config.paymentRecovery?.receiptTimeoutMs ?? 5 * 60_000) / 3),\n 5_000,\n ))\n : 0\n if (onExecutionHeartbeat) {\n heartbeatTimer = setInterval(() => {\n if (heartbeatInFlight || heartbeatError !== undefined) return\n heartbeatInFlight = onExecutionHeartbeat()\n .catch((error: unknown) => {\n heartbeatError = error\n executionController.abort()\n })\n .finally(() => {\n heartbeatInFlight = undefined\n })\n }, heartbeatMs)\n }\n while (true) {\n const next = await readSandboxEvent(iterator, executionController.signal)\n if (next === ABORTED_SANDBOX_READ) {\n if (heartbeatError !== undefined) throw heartbeatError\n return\n }\n if (next.done) break\n const event = next.value\n if (event.data?.usage) usageParts = mergeUsage(usageParts, event.data.usage)\n if (event.data?.reasoning?.tokens !== undefined) {\n observedReasoningTokens += nonNegativeSafeInteger(event.data.reasoning.tokens, 'reasoning tokens')\n yield { kind: 'activity' }\n }\n if (event.data?.tool) {\n observedToolCalls += 1\n observedToolTokens +=\n nonNegativeSafeInteger(event.data.tool.inputTokens ?? 0, 'tool input tokens') +\n nonNegativeSafeInteger(event.data.tool.outputTokens ?? 0, 'tool output tokens')\n yield { kind: 'activity' }\n }\n enforceUsageBudget(withObservedUsage(\n usageParts,\n observedReasoningTokens,\n observedToolTokens,\n observedToolCalls,\n ), executionBudget)\n if (\n event.type === 'message.part.updated' &&\n event.data?.part?.type === 'text' &&\n event.data.delta\n ) {\n const remainingBytes = maxOutputBytes - outputBytes\n if (remainingBytes <= 0) throw new Error('sandbox exceeded max output tokens')\n const bounded = truncateUtf8(event.data.delta, remainingBytes, encoder)\n if (bounded.truncated) {\n yield { kind: 'activity' }\n throw new Error('sandbox exceeded max output tokens')\n }\n outputBytes += bounded.bytes\n legacyOutputText += bounded.text\n yield { kind: 'activity' }\n yield { kind: 'text', delta: redactSystemPromptFromOutput(bounded.text, agent.systemPrompt) }\n continue\n }\n if (event.type === 'input-required' || event.data?.inputRequired) {\n const usage = completeUsage(\n usageParts,\n observedReasoningTokens,\n observedToolTokens,\n observedToolCalls,\n userMessage,\n legacyOutputText,\n executionBudget,\n requiresReceipt,\n )\n yield { kind: 'input-required', prompt: event.data?.inputRequired?.prompt }\n // Terminal for the sandbox stream — sandbox SHOULD stop emitting until\n // the gateway dispatches a continuation message with the new user input.\n yield { kind: 'usage', usage }\n return\n }\n }\n const usage = completeUsage(\n usageParts,\n observedReasoningTokens,\n observedToolTokens,\n observedToolCalls,\n userMessage,\n legacyOutputText,\n executionBudget,\n requiresReceipt,\n )\n yield { kind: 'usage', usage }\n } finally {\n if (heartbeatTimer !== undefined) clearInterval(heartbeatTimer)\n const pendingHeartbeat = heartbeatInFlight\n if (pendingHeartbeat) await pendingHeartbeat\n signal?.removeEventListener('abort', forwardAbort)\n if (iterator) await closeSandboxIterator(iterator)\n if (heartbeatError !== undefined && !signal?.aborted) throw heartbeatError\n }\n}\n\nconst ABORTED_SANDBOX_READ = Symbol('aborted-sandbox-read')\n\nasync function readSandboxEvent(\n iterator: AsyncIterator<SandboxStreamEvent>,\n signal?: AbortSignal,\n): Promise<IteratorResult<SandboxStreamEvent> | typeof ABORTED_SANDBOX_READ> {\n if (!signal) return iterator.next()\n if (signal.aborted) return ABORTED_SANDBOX_READ\n return new Promise((resolve, reject) => {\n const onAbort = () => {\n signal.removeEventListener('abort', onAbort)\n resolve(ABORTED_SANDBOX_READ)\n }\n signal.addEventListener('abort', onAbort, { once: true })\n iterator.next().then(\n (result) => {\n signal.removeEventListener('abort', onAbort)\n resolve(result)\n },\n (error: unknown) => {\n signal.removeEventListener('abort', onAbort)\n reject(error)\n },\n )\n })\n}\n\nconst SANDBOX_CLEANUP_TIMEOUT_MS = 50\n\nasync function closeSandboxIterator(iterator: AsyncIterator<SandboxStreamEvent>): Promise<void> {\n let closing: PromiseLike<unknown> | undefined\n try {\n const result = iterator.return?.()\n if (result) closing = Promise.resolve(result)\n } catch {\n return\n }\n if (!closing) return\n let timeout: ReturnType<typeof setTimeout> | undefined\n try {\n await Promise.race([\n Promise.resolve(closing).catch(() => undefined),\n new Promise<void>((resolve) => {\n timeout = setTimeout(resolve, SANDBOX_CLEANUP_TIMEOUT_MS)\n }),\n ])\n } finally {\n if (timeout !== undefined) clearTimeout(timeout)\n }\n}\n\nfunction mergeUsage(\n current: Partial<SandboxUsageReceipt>,\n update: Partial<SandboxUsageReceipt>,\n): Partial<SandboxUsageReceipt> {\n const merged = { ...current, ...update }\n for (const key of ['inputTokens', 'outputTokens', 'reasoningTokens', 'toolTokens', 'toolCallCount', 'providerCostUsd'] as const) {\n const value = update[key]\n if (value !== undefined && (!Number.isFinite(value) || value < 0)) {\n throw new Error(`sandbox usage field ${key} is invalid`)\n }\n if (value !== undefined && current[key] !== undefined) {\n // Usage events are cumulative receipts. Never let a later partial or\n // final event erase spend observed earlier in the same execution.\n merged[key] = Math.max(current[key]!, value)\n }\n }\n if (current.budgetEnforced === false || update.budgetEnforced === false) {\n merged.budgetEnforced = false\n }\n return merged\n}\n\nfunction withObservedUsage(\n usage: Partial<SandboxUsageReceipt>,\n reasoningTokens: number,\n toolTokens: number,\n toolCallCount: number,\n): Partial<SandboxUsageReceipt> {\n return {\n ...usage,\n ...(usage.reasoningTokens !== undefined || reasoningTokens > 0\n ? { reasoningTokens: Math.max(usage.reasoningTokens ?? 0, reasoningTokens) }\n : {}),\n ...(usage.toolTokens !== undefined || toolTokens > 0\n ? { toolTokens: Math.max(usage.toolTokens ?? 0, toolTokens) }\n : {}),\n ...(usage.toolCallCount !== undefined || toolCallCount > 0\n ? { toolCallCount: Math.max(usage.toolCallCount ?? 0, toolCallCount) }\n : {}),\n }\n}\n\nfunction nonNegativeSafeInteger(value: number, name: string): number {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(`sandbox ${name} is invalid`)\n }\n return value\n}\n\nfunction enforceUsageBudget(\n usage: Partial<SandboxUsageReceipt>,\n budget: SandboxExecutionBudget,\n): void {\n if (usage.inputTokens !== undefined && usage.inputTokens > budget.maxInputTokens) {\n throw new Error('sandbox exceeded max input tokens')\n }\n if (usage.outputTokens !== undefined && usage.outputTokens > budget.maxOutputTokens) {\n throw new Error('sandbox exceeded max output tokens')\n }\n if (usage.reasoningTokens !== undefined && usage.reasoningTokens > budget.maxReasoningTokens) {\n throw new Error('sandbox exceeded max reasoning tokens')\n }\n if (usage.toolTokens !== undefined && usage.toolTokens > budget.maxToolTokens) {\n throw new Error('sandbox exceeded max tool tokens')\n }\n if (usage.toolCallCount !== undefined && usage.toolCallCount > budget.maxToolCalls) {\n throw new Error('sandbox exceeded max tool calls')\n }\n if (usage.providerCostUsd !== undefined && usage.providerCostUsd > budget.maxProviderCostUsd) {\n throw new Error('sandbox exceeded max provider cost')\n }\n}\n\nfunction finalizeUsage(\n parts: Partial<SandboxUsageReceipt>,\n budget: SandboxExecutionBudget,\n): SandboxUsageReceipt {\n const fields = ['inputTokens', 'outputTokens', 'reasoningTokens', 'toolTokens', 'toolCallCount', 'providerCostUsd', 'budgetEnforced'] as const\n if (fields.some((field) => parts[field] === undefined)) {\n throw new Error('sandbox did not provide a complete usage receipt')\n }\n const usage = parts as SandboxUsageReceipt\n for (const field of ['inputTokens', 'outputTokens', 'reasoningTokens', 'toolTokens', 'toolCallCount'] as const) {\n if (!Number.isSafeInteger(usage[field]) || usage[field] < 0) {\n throw new Error(`sandbox usage field ${field} is invalid`)\n }\n }\n if (!Number.isFinite(usage.providerCostUsd) || usage.providerCostUsd < 0) {\n throw new Error('sandbox usage provider cost is invalid')\n }\n if (typeof usage.budgetEnforced !== 'boolean') {\n throw new Error('sandbox usage budget flag is invalid')\n }\n if (!Number.isSafeInteger(\n usage.inputTokens + usage.outputTokens + usage.reasoningTokens + usage.toolTokens,\n )) {\n throw new Error('sandbox usage token total exceeds safe integer range')\n }\n enforceUsageBudget(usage, budget)\n if (!usage.budgetEnforced) throw new Error('sandbox did not enforce the execution budget')\n return usage\n}\n\nfunction completeUsage(\n parts: Partial<SandboxUsageReceipt>,\n reasoningTokens: number,\n toolTokens: number,\n toolCallCount: number,\n userMessage: string,\n outputText: string,\n budget: SandboxExecutionBudget,\n requiresReceipt: boolean,\n): SandboxUsageReceipt {\n const observed = withObservedUsage(parts, reasoningTokens, toolTokens, toolCallCount)\n if (\n !requiresReceipt &&\n Object.keys(parts).length === 0 &&\n reasoningTokens === 0 &&\n toolTokens === 0 &&\n toolCallCount === 0\n ) {\n // Preserve the pre-receipt SandboxBox contract for legacy API-key\n // adapters. Durable payment operations must use provider-enforced usage.\n return {\n inputTokens: estimateTokens(userMessage),\n outputTokens: estimateTokens(outputText),\n reasoningTokens: 0,\n toolTokens: 0,\n toolCallCount: 0,\n providerCostUsd: 0,\n budgetEnforced: false,\n }\n }\n return finalizeUsage(observed, budget)\n}\n\nfunction truncateUtf8(\n value: string,\n maxBytes: number,\n encoder: TextEncoder,\n): { text: string; bytes: number; truncated: boolean } {\n const bytes = encoder.encode(value).byteLength\n if (bytes <= maxBytes) return { text: value, bytes, truncated: false }\n let text = ''\n let used = 0\n for (const character of value) {\n const characterBytes = encoder.encode(character).byteLength\n if (used + characterBytes > maxBytes) break\n text += character\n used += characterBytes\n }\n return { text, bytes: used, truncated: true }\n}\n","import { type GatewayObserver, type RequestContext } from './observer'\nimport { actualX402Amount } from './dispatch-pricing'\nimport {\n assertX402V1SettlementSafe,\n markRecoveryReconciled,\n markRecoverySettling,\n markRecoveryUsageRecorded,\n} from './dispatch-payment-recovery'\nimport type {\n AuthorizedRequest,\n SettleAndRecordOptions,\n} from './dispatch-types'\nimport type { AgentMeta, GatewayConfig, SandboxUsageReceipt } from './types'\n\n/**\n * Record usage, settle payment, and invoke the observer. Both wire formats\n * call this once their stream has drained, so settlement happens exactly once\n * per request regardless of protocol.\n */\nexport async function settleAndRecord(\n agent: AgentMeta,\n authz: AuthorizedRequest,\n usage: SandboxUsageReceipt,\n config: GatewayConfig,\n obs: GatewayObserver | undefined,\n options: SettleAndRecordOptions = {},\n): Promise<void> {\n assertX402V1SettlementSafe(authz, config)\n const settlementBasis = options.settlementBasis ?? 'usage-receipt'\n await markRecoverySettling(authz, usage, settlementBasis, config)\n if (options.usageAlreadyRecorded) await markRecoveryUsageRecorded(authz, config)\n const tokenCost = (\n usage.inputTokens + usage.outputTokens + usage.reasoningTokens + usage.toolTokens\n ) * agent.pricePerTokenUsd\n const totalCost = Math.max(tokenCost, usage.providerCostUsd)\n const ownerEarned = totalCost * (1 - agent.platformFeePercent)\n const platformFee = totalCost * agent.platformFeePercent\n const usageEvent = {\n requestId: authz.requestId,\n agentId: agent.id,\n agentSlug: agent.slug,\n consumerId: authz.consumerId,\n paymentMethod: authz.paymentMethod,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n reasoningTokens: usage.reasoningTokens,\n toolTokens: usage.toolTokens,\n toolCallCount: usage.toolCallCount,\n providerCostUsd: usage.providerCostUsd,\n totalCostUsd: totalCost,\n ownerEarnedUsd: ownerEarned,\n platformFeeUsd: platformFee,\n durationMs: Date.now() - authz.startMs,\n settlementBasis,\n }\n const ctx: RequestContext = {\n requestId: authz.requestId,\n agentSlug: agent.slug,\n startMs: authz.startMs,\n }\n try {\n if (authz.paymentOperation && config.x402.paymentOperations) {\n const amount = options.paymentAmount ?? actualX402Amount(\n agent.pricePerTokenUsd,\n usage.inputTokens,\n usage.outputTokens,\n usage.reasoningTokens,\n usage.toolTokens,\n config.x402.currencyDecimals,\n usage.providerCostUsd,\n )\n if (options.paymentAlreadySettled) {\n if (\n authz.paymentOperation.state !== 'settled' ||\n authz.paymentOperation.settledAmount !== amount\n ) {\n throw new Error('authoritative payment state does not match finalization')\n }\n } else {\n authz.paymentOperation = await config.x402.paymentOperations.settlePayment(\n authz.paymentOperation,\n { amount, totalCostUsd: totalCost, usage, basis: settlementBasis },\n )\n }\n // Durable settlement happens first. If attribution storage is\n // unavailable, recovery must never refund delivered work.\n if (!options.usageAlreadyRecorded) {\n await config.recordUsage(usageEvent)\n await options.onUsageRecorded?.()\n await markRecoveryUsageRecorded(authz, config)\n }\n } else if (authz.mppChargeOperation) {\n // Generic MPP charge methods confirm before the response. Finalization\n // records attribution only; it never invokes the legacy settlement hook.\n if (!options.usageAlreadyRecorded) {\n await config.recordUsage(usageEvent)\n await options.onUsageRecorded?.()\n await markRecoveryUsageRecorded(authz, config)\n }\n } else {\n // Legacy adapters retain attribution-before-charge because their\n // settlement callback may resolve that usage row.\n if (!options.usageAlreadyRecorded) {\n await config.recordUsage(usageEvent)\n await options.onUsageRecorded?.()\n }\n if (config.settlePayment) {\n await config.settlePayment(\n {\n method: authz.paymentMethod,\n consumerId: authz.consumerId,\n requestId: authz.requestId,\n },\n totalCost,\n )\n }\n }\n await markRecoveryReconciled(authz, config)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n console.error(`[agent-gateway] settlement failed for ${authz.consumerId}: ${msg}`)\n await obs?.onSettlementError?.(ctx, {\n consumerId: authz.consumerId,\n method: authz.paymentMethod,\n errorMessage: msg,\n })\n throw err\n }\n try {\n await obs?.onRequestComplete?.(ctx, usageEvent)\n } catch (error) {\n console.error(\n `[agent-gateway] completion observer failed for ${authz.requestId}:`,\n error instanceof Error ? error.message : String(error),\n )\n }\n}\n\nexport type { SettleAndRecordOptions }\n","/**\n * Build an A2A AgentCard from the gateway's existing AgentMeta + GatewayConfig.\n * The card's `url` MUST be the JSON-RPC endpoint a client POSTs to; clients\n * fetch the card from `<url>/.well-known/agent.json` per A2A convention.\n *\n * Auth schemes advertised reflect the gateway's actually-accepted payment\n * methods (x402 always; mpp and Bearer only when configured). Skills\n * fall back to a single synthesized \"chat\" skill when the AgentMeta doesn't\n * declare its own — most consumers will override.\n */\n\nimport type { AgentMeta, GatewayConfig } from '../types'\nimport { isApiKeyAuthEnabled, isMppAuthEnabled } from '../verify'\nimport type { AgentCard, AgentSkill } from './types'\n\nexport function buildAgentCard(\n agent: AgentMeta,\n config: GatewayConfig,\n agentUrl: string,\n): AgentCard {\n const schemes: string[] = ['x402']\n if (isMppAuthEnabled(config)) schemes.push('mpp')\n if (isApiKeyAuthEnabled(config)) schemes.push('Bearer')\n\n const skills: AgentSkill[] =\n agent.skills && agent.skills.length > 0\n ? agent.skills\n : [\n {\n id: 'chat',\n name: agent.slug,\n description: agent.description ?? `${agent.slug} agent`,\n tags: ['chat'],\n inputModes: ['text'],\n outputModes: ['text'],\n },\n ]\n\n return {\n name: agent.slug,\n description: agent.description ?? `${agent.slug} agent`,\n url: agentUrl,\n version: '1.0.0',\n provider: { organization: 'Tangle', url: 'https://tangle.tools' },\n capabilities: {\n streaming: true,\n pushNotifications: !!config.a2a?.pushStore,\n stateTransitionHistory: false,\n },\n authentication: { schemes },\n defaultInputModes: ['text'],\n defaultOutputModes: ['text'],\n skills,\n }\n}\n","import type { Task } from './types'\n\ninterface ExecutionTaskStore {\n get(id: string): Promise<Task | undefined>\n compareAndSet?(expected: Task, next: Task): Promise<boolean>\n compareAndSetExecution?(\n expected: Task,\n next: Task,\n requestId: string,\n now: number,\n ): Promise<boolean>\n}\n\n/** Durable marker that prevents cancellation from racing sandbox start. */\nexport const TASK_EXECUTION_METADATA_KEY = 'gatewayExecution'\n\nconst TASK_EXECUTION_VERSION = 1 as const\nconst TASK_EXECUTION_LEASE_MS = 5 * 60 * 1000\n\nexport interface TaskExecutionMarker {\n version: typeof TASK_EXECUTION_VERSION\n requestId: string\n lease: { id: string; expiresAt: number }\n}\n\nexport type TaskExecutionInspection =\n | { state: 'absent' }\n | { state: 'valid'; marker: TaskExecutionMarker }\n | { state: 'malformed'; reason: string }\n\nexport class TaskExecutionCanceledError extends Error {\n constructor(taskId: string) {\n super(`A2A task '${taskId}' was canceled before sandbox execution`)\n this.name = 'TaskExecutionCanceledError'\n }\n}\n\n/** Claim the right to start one task after its sandbox has been acquired. */\nexport async function claimTaskExecution(\n store: ExecutionTaskStore,\n task: Task,\n requestId: string,\n now = Date.now(),\n): Promise<Task> {\n for (let attempt = 0; attempt < 8; attempt += 1) {\n const current = await store.get(task.id)\n if (!current || current.status.state !== 'working') {\n throw new TaskExecutionCanceledError(task.id)\n }\n const inspection = inspectTaskExecution(current)\n if (inspection.state === 'malformed') {\n throw new Error(`A2A task '${task.id}' has a malformed execution marker`)\n }\n const existing = inspection.state === 'valid' ? inspection.marker : undefined\n if (existing && existing.lease.expiresAt > now) {\n if (existing.requestId === requestId) return current\n throw new Error(`A2A task '${task.id}' is already executing`)\n }\n const next = withTaskExecution(current, requestId, now)\n if (store.compareAndSet && await store.compareAndSet(current, next)) return next\n }\n throw new Error(`A2A task '${task.id}' changed too many times before sandbox execution`)\n}\n\n/** Renew both the task execution fence and its cancellation protection. */\nexport async function renewTaskExecution(\n store: ExecutionTaskStore,\n taskId: string,\n requestId: string,\n now?: number,\n): Promise<Task> {\n for (let attempt = 0; attempt < 8; attempt += 1) {\n const current = await store.get(taskId)\n const inspection = current ? inspectTaskExecution(current) : { state: 'absent' as const }\n if (inspection.state === 'malformed') {\n throw new Error(`A2A task '${taskId}' has a malformed execution marker`)\n }\n const marker = inspection.state === 'valid' ? inspection.marker : undefined\n if (!current || current.status.state !== 'working' || marker?.requestId !== requestId) {\n throw new TaskExecutionCanceledError(taskId)\n }\n const renewalNow = now ?? Date.now()\n if (marker.lease.expiresAt <= renewalNow) {\n throw new TaskExecutionCanceledError(taskId)\n }\n const next = withTaskExecution(current, requestId, renewalNow)\n if (!store.compareAndSetExecution) {\n throw new Error('A2A task store does not provide atomic execution renewal')\n }\n if (await store.compareAndSetExecution(current, next, requestId, renewalNow)) return next\n }\n throw new Error(`A2A task '${taskId}' changed too many times while execution was active`)\n}\n\n/** Remote cancellation is rejected while a live execution fence is held. */\nexport function hasActiveTaskExecution(task: Task, now = Date.now()): boolean {\n const marker = readTaskExecution(task)\n return marker !== undefined && marker.lease.expiresAt > now\n}\n\n/** A working task with this marker has lost its execution owner. */\nexport function hasExpiredTaskExecution(task: Task, now = Date.now()): boolean {\n const marker = readTaskExecution(task)\n return marker !== undefined && !hasActiveTaskExecution(task, now)\n}\n\n/** A working task with an execution key that cannot be trusted. */\nexport function hasMalformedTaskExecution(task: Task): boolean {\n return inspectTaskExecution(task).state === 'malformed'\n}\n\n/** Remove the marker when the task reaches a terminal or paused state. */\nexport function clearTaskExecution(task: Task): Task {\n if (!task.metadata || !(TASK_EXECUTION_METADATA_KEY in task.metadata)) return task\n const metadata = { ...task.metadata }\n delete metadata[TASK_EXECUTION_METADATA_KEY]\n return Object.keys(metadata).length > 0\n ? { ...task, metadata }\n : (() => {\n const { metadata: _metadata, ...withoutMetadata } = task\n return withoutMetadata\n })()\n}\n\nfunction withTaskExecution(task: Task, requestId: string, now: number): Task {\n return {\n ...task,\n metadata: {\n ...(task.metadata ?? {}),\n [TASK_EXECUTION_METADATA_KEY]: {\n version: TASK_EXECUTION_VERSION,\n requestId,\n lease: { id: requestId, expiresAt: now + TASK_EXECUTION_LEASE_MS },\n } satisfies TaskExecutionMarker,\n },\n }\n}\n\nfunction readTaskExecution(task: Task): TaskExecutionMarker | undefined {\n const inspection = inspectTaskExecution(task)\n return inspection.state === 'valid' ? inspection.marker : undefined\n}\n\nexport function inspectTaskExecution(task: Task): TaskExecutionInspection {\n const raw = task.metadata?.[TASK_EXECUTION_METADATA_KEY]\n if (raw === undefined) return { state: 'absent' }\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return { state: 'malformed', reason: 'marker must be an object' }\n }\n const marker = raw as Partial<TaskExecutionMarker>\n if (\n marker.version !== TASK_EXECUTION_VERSION ||\n typeof marker.requestId !== 'string' ||\n marker.requestId.length === 0 ||\n !marker.lease ||\n typeof marker.lease.id !== 'string' ||\n marker.lease.id.length === 0 ||\n typeof marker.lease.expiresAt !== 'number' ||\n !Number.isFinite(marker.lease.expiresAt)\n ) return { state: 'malformed', reason: 'marker fields are invalid' }\n return { state: 'valid', marker: marker as TaskExecutionMarker }\n}\n","/**\n * A2A protocol types (Google Agent-to-Agent, April 2025).\n *\n * Subset shipped by this gateway:\n * - Discovery: AgentCard via `.well-known/agent.json`\n * - Messaging: `message/send`, `message/stream`\n * - Task control: `tasks/get`, `tasks/cancel`, `tasks/resubscribe`\n * - Push: `tasks/pushNotificationConfig/{set,get,list,delete}` (gated on `pushStore`)\n * - Multi-turn: `input-required` state + follow-up `message/send` with the same `taskId`\n * - Capabilities: streaming = true; pushNotifications gated on config; stateTransitionHistory = false\n * - Parts: text only on input/output (data/file parts rejected with CONTENT_TYPE_NOT_SUPPORTED)\n *\n * Deferred until a real consumer needs them: authenticated extended card,\n * data/file parts, OAuth2/mTLS auth schemes.\n */\n\n// ── JSON-RPC 2.0 envelopes ───────────────────────────────────────────────\n\nexport interface JSONRPCRequest {\n jsonrpc: '2.0'\n id: string | number | null\n method: string\n params?: unknown\n}\n\nexport interface JSONRPCSuccessResponse<T = unknown> {\n jsonrpc: '2.0'\n id: string | number | null\n result: T\n}\n\nexport interface JSONRPCErrorResponse {\n jsonrpc: '2.0'\n id: string | number | null\n error: { code: number; message: string; data?: unknown }\n}\n\nexport type JSONRPCResponse<T = unknown> = JSONRPCSuccessResponse<T> | JSONRPCErrorResponse\n\n/** Standard JSON-RPC + A2A-specific codes. Negative ints per JSON-RPC spec. */\nexport const A2A_ERROR_CODES = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n TASK_NOT_FOUND: -32001,\n TASK_NOT_CANCELABLE: -32002,\n PUSH_NOT_SUPPORTED: -32003,\n UNSUPPORTED_OPERATION: -32004,\n CONTENT_TYPE_NOT_SUPPORTED: -32005,\n INVALID_AGENT_RESPONSE: -32006,\n AUTHENTICATED_EXTENDED_CARD_NOT_CONFIGURED: -32007,\n TASK_ACCESS_DENIED: -32008,\n} as const\n\n// ── Message parts ────────────────────────────────────────────────────────\n\nexport interface TextPart {\n kind: 'text'\n text: string\n metadata?: Record<string, unknown>\n}\n\nexport interface DataPart {\n kind: 'data'\n data: Record<string, unknown>\n metadata?: Record<string, unknown>\n}\n\nexport interface FilePart {\n kind: 'file'\n file: { name?: string; mimeType?: string; bytes?: string; uri?: string }\n metadata?: Record<string, unknown>\n}\n\nexport type Part = TextPart | DataPart | FilePart\n\n// ── Message + Task + Artifact ────────────────────────────────────────────\n\nexport interface Message {\n kind: 'message'\n role: 'user' | 'agent'\n parts: Part[]\n messageId: string\n taskId?: string\n contextId?: string\n metadata?: Record<string, unknown>\n}\n\nexport type TaskState =\n | 'submitted'\n | 'working'\n | 'input-required'\n | 'completed'\n | 'canceled'\n | 'failed'\n | 'rejected'\n | 'auth-required'\n\nexport interface TaskStatus {\n state: TaskState\n message?: Message\n timestamp: string\n}\n\nexport interface Artifact {\n artifactId: string\n name?: string\n description?: string\n parts: Part[]\n metadata?: Record<string, unknown>\n}\n\nexport interface Task {\n kind: 'task'\n id: string\n contextId: string\n status: TaskStatus\n history?: Message[]\n artifacts?: Artifact[]\n metadata?: Record<string, unknown>\n}\n\n// ── Streaming events (carried as JSON-RPC result over SSE) ──────────────\n\nexport interface TaskStatusUpdateEvent {\n kind: 'status-update'\n taskId: string\n contextId: string\n status: TaskStatus\n /** True on the terminal event; clients close the stream after this. */\n final: boolean\n metadata?: Record<string, unknown>\n}\n\nexport interface TaskArtifactUpdateEvent {\n kind: 'artifact-update'\n taskId: string\n contextId: string\n artifact: Artifact\n /** True when this artifact's parts should be appended to the prior emit (incremental streaming). */\n append?: boolean\n /** True on the artifact's final chunk. */\n lastChunk?: boolean\n metadata?: Record<string, unknown>\n}\n\nexport type StreamingEvent = TaskStatusUpdateEvent | TaskArtifactUpdateEvent\n\n// ── Method-specific params ───────────────────────────────────────────────\n\nexport interface MessageSendParams {\n message: Message\n configuration?: {\n acceptedOutputModes?: string[]\n blocking?: boolean\n historyLength?: number\n }\n}\n\nexport interface TaskIdParams {\n id: string\n metadata?: Record<string, unknown>\n}\n\nexport interface TaskPushNotificationConfigGetParams {\n /** Task id whose configs are being queried. */\n id: string\n /** Specific config id to fetch. Required for `set` and `delete`; omitted for `list`. */\n pushNotificationConfigId?: string\n metadata?: Record<string, unknown>\n}\n\n// ── Agent Card ──────────────────────────────────────────────────────────\n\nexport interface AgentSkill {\n id: string\n name: string\n description: string\n tags?: string[]\n examples?: string[]\n inputModes?: string[]\n outputModes?: string[]\n}\n\nexport interface AgentCapabilities {\n streaming?: boolean\n pushNotifications?: boolean\n stateTransitionHistory?: boolean\n}\n\nexport interface AgentProvider {\n organization: string\n url?: string\n}\n\nexport interface AgentCardAuthentication {\n /** Auth scheme names the agent accepts (e.g. 'Bearer', 'x402', 'mpp'). */\n schemes: string[]\n /** Optional human-readable hint about obtaining credentials. */\n credentials?: string\n}\n\nexport interface AgentCard {\n name: string\n description: string\n /** JSON-RPC endpoint URL — clients POST methods here. */\n url: string\n version: string\n documentationUrl?: string\n provider?: AgentProvider\n capabilities: AgentCapabilities\n authentication: AgentCardAuthentication\n defaultInputModes: string[]\n defaultOutputModes: string[]\n skills: AgentSkill[]\n}\n","import type { Task } from './types'\n\nconst PAYMENT_RECOVERY_KEYS = [\n 'gatewayFinalizing',\n 'gatewayPaymentRelease',\n 'gatewayPaymentRecovery',\n] as const\n\nexport function hasPendingPaymentRecovery(task: Task): boolean {\n return PAYMENT_RECOVERY_KEYS.some((key) => task.metadata?.[key] !== undefined)\n}\n","import type { Task, TaskStatus, Message } from './types'\nimport { clearTaskExecution } from './execution-fence'\nimport { hasPendingPaymentRecovery } from './task-recovery'\n\nexport interface TaskStateStore {\n get(id: string): Promise<Task | undefined>\n compareAndSet?(expected: Task, next: Task): Promise<boolean>\n}\n\nexport const TERMINAL_STATES: ReadonlySet<Task['status']['state']> = new Set([\n 'completed',\n 'canceled',\n 'failed',\n 'rejected',\n])\n\nexport function isTerminal(state: Task['status']['state']): boolean {\n return TERMINAL_STATES.has(state)\n}\n\nexport function shouldPreserveTask(task: Task): boolean {\n return isTerminal(task.status.state) || hasPendingPaymentRecovery(task)\n}\n\nexport async function compareAndSetTask(\n taskStore: TaskStateStore,\n expected: Task,\n next: Task,\n): Promise<boolean> {\n if (!taskStore.compareAndSet) {\n throw new Error('A2A task store does not provide compareAndSet')\n }\n return taskStore.compareAndSet(expected, next)\n}\n\nexport async function persistTaskIfCurrent(\n taskStore: TaskStateStore,\n expected: Task,\n next: Task,\n): Promise<Task> {\n if (expected === next || JSON.stringify(expected) === JSON.stringify(next)) return expected\n if (await compareAndSetTask(taskStore, expected, next)) return next\n return await taskStore.get(expected.id) ?? expected\n}\n\nexport function clearTaskMetadata(task: Task, key: string): Task {\n if (!task.metadata || !(key in task.metadata)) return task\n const metadata = { ...task.metadata }\n delete metadata[key]\n if (Object.keys(metadata).length > 0) return { ...task, metadata }\n const { metadata: _metadata, ...withoutMetadata } = task\n return withoutMetadata\n}\n\nexport function withStatus(\n task: Task,\n state: TaskStatus['state'],\n message?: Message,\n artifacts?: Task['artifacts'],\n): Task {\n const next: Task = {\n ...task,\n status: { state, timestamp: nowIso(), ...(message ? { message } : {}) },\n ...(artifacts !== undefined ? { artifacts } : {}),\n }\n return isTerminal(state) || state === 'input-required' ? clearTaskExecution(next) : next\n}\n\nexport function agentMessage(task: Task, text: string): Message {\n return {\n kind: 'message',\n role: 'agent',\n parts: [{ kind: 'text', text }],\n messageId: `${task.id}-input-required-${stableMessageDigest(text)}`,\n taskId: task.id,\n contextId: task.contextId,\n }\n}\n\nexport function asError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error))\n}\n\nexport function nowIso(): string {\n return new Date().toISOString()\n}\n\nexport function cryptoRandomId(): string {\n return crypto.randomUUID().replace(/-/g, '')\n}\n\nfunction stableMessageDigest(value: string): string {\n let hash = 2166136261\n for (let index = 0; index < value.length; index += 1) {\n hash ^= value.charCodeAt(index)\n hash = Math.imul(hash, 16777619)\n }\n return (hash >>> 0).toString(16).padStart(8, '0')\n}\n","import type { Task } from './types'\nimport {\n compareAndSetTask,\n cryptoRandomId,\n type TaskStateStore,\n withStatus,\n} from './task-state'\n\nconst TASK_ORIGIN_METADATA_KEY = 'gatewayOrigin'\nconst TASK_SUBMISSION_METADATA_KEY = 'gatewaySubmission'\nconst TASK_SUBMISSION_RECOVERY_METADATA_KEY = 'gatewaySubmissionRecovery'\nconst TASK_SUBMISSION_LEASE_MS = 5 * 60 * 1000\n\nexport interface TaskOriginAgent {\n id: string\n slug: string\n}\n\nexport interface TaskSubmissionIdentity {\n agent: TaskOriginAgent\n requestId: string\n consumerId: string\n}\n\ninterface TaskOriginBinding {\n version: 1\n agentId: string\n agentSlug: string\n}\n\nexport interface TaskSubmissionRecord {\n version: 1\n lease: { id: string; expiresAt: number }\n agentId: string\n agentSlug: string\n requestId: string\n consumerId: string\n}\n\nexport interface SubmissionRecoveryDependencies {\n taskStore: TaskStateStore\n deliverPush: (task: Task) => Promise<void>\n}\n\nexport function withTaskOrigin(\n metadata: Record<string, unknown> | undefined,\n agent: TaskOriginAgent,\n): Record<string, unknown> {\n return {\n ...(metadata ?? {}),\n [TASK_ORIGIN_METADATA_KEY]: {\n version: 1,\n agentId: agent.id,\n agentSlug: agent.slug,\n } satisfies TaskOriginBinding,\n }\n}\n\nexport function withTaskSubmission(\n metadata: Record<string, unknown> | undefined,\n identity: TaskSubmissionIdentity,\n): Record<string, unknown> {\n const origin = metadata?.[TASK_ORIGIN_METADATA_KEY]\n return {\n ...(metadata ?? {}),\n ...(origin === undefined\n ? {\n [TASK_ORIGIN_METADATA_KEY]: {\n version: 1,\n agentId: identity.agent.id,\n agentSlug: identity.agent.slug,\n } satisfies TaskOriginBinding,\n }\n : {}),\n [TASK_SUBMISSION_METADATA_KEY]: {\n version: 1,\n lease: { id: cryptoRandomId(), expiresAt: Date.now() + TASK_SUBMISSION_LEASE_MS },\n agentId: identity.agent.id,\n agentSlug: identity.agent.slug,\n requestId: identity.requestId,\n consumerId: identity.consumerId,\n } satisfies TaskSubmissionRecord,\n }\n}\n\nexport function readTaskOrigin(task: Task): TaskOriginBinding | undefined {\n const raw = task.metadata?.[TASK_ORIGIN_METADATA_KEY]\n if (!raw || typeof raw !== 'object') return undefined\n const origin = raw as Partial<TaskOriginBinding>\n if (\n origin.version !== 1 ||\n typeof origin.agentId !== 'string' ||\n origin.agentId.length === 0 ||\n typeof origin.agentSlug !== 'string' ||\n origin.agentSlug.length === 0\n ) {\n return undefined\n }\n return origin as TaskOriginBinding\n}\n\nexport function readTaskSubmission(task: Task): TaskSubmissionRecord | undefined {\n const raw = task.metadata?.[TASK_SUBMISSION_METADATA_KEY]\n if (!raw || typeof raw !== 'object') return undefined\n const submission = raw as Partial<TaskSubmissionRecord>\n if (\n submission.version !== 1 ||\n !submission.lease ||\n typeof submission.lease.id !== 'string' ||\n submission.lease.id.length === 0 ||\n typeof submission.lease.expiresAt !== 'number' ||\n !Number.isFinite(submission.lease.expiresAt) ||\n typeof submission.agentId !== 'string' ||\n submission.agentId.length === 0 ||\n typeof submission.agentSlug !== 'string' ||\n submission.agentSlug.length === 0 ||\n typeof submission.requestId !== 'string' ||\n submission.requestId.length === 0 ||\n typeof submission.consumerId !== 'string'\n ) {\n return undefined\n }\n return submission as TaskSubmissionRecord\n}\n\nexport function clearTaskSubmission(task: Task): Task {\n if (!task.metadata || !(TASK_SUBMISSION_METADATA_KEY in task.metadata)) return task\n const metadata = { ...task.metadata }\n delete metadata[TASK_SUBMISSION_METADATA_KEY]\n if (Object.keys(metadata).length > 0) return { ...task, metadata }\n const { metadata: _metadata, ...withoutMetadata } = task\n return withoutMetadata\n}\n\nexport async function recoverSubmissionIfNeeded(\n task: Task,\n deps: SubmissionRecoveryDependencies,\n): Promise<Task> {\n const raw = task.metadata?.[TASK_SUBMISSION_METADATA_KEY]\n if (raw === undefined) return task\n const submission = readTaskSubmission(task)\n if (submission && submission.lease.expiresAt > Date.now()) return task\n if (task.status.state !== 'submitted') {\n return (await clearTaskSubmissionMarker(deps.taskStore, task)).task\n }\n\n const cleanTask = clearTaskSubmission(task)\n const failed: Task = {\n ...withStatus(cleanTask, 'failed'),\n metadata: {\n ...(cleanTask.metadata ?? {}),\n [TASK_SUBMISSION_RECOVERY_METADATA_KEY]: {\n error: submission\n ? 'A2A task submission lease expired before payment authorization completed'\n : 'A2A task submission lease is invalid',\n },\n },\n }\n if (await compareAndSetTask(deps.taskStore, task, failed)) {\n await deps.deliverPush(failed)\n return failed\n }\n return await deps.taskStore.get(task.id) ?? task\n}\n\nasync function clearTaskSubmissionMarker(\n taskStore: TaskStateStore,\n expected: Task,\n): Promise<{ task: Task; applied: boolean }> {\n const current = await taskStore.get(expected.id)\n if (!current || JSON.stringify(current) !== JSON.stringify(expected)) {\n return { task: current ?? expected, applied: false }\n }\n const cleared = clearTaskSubmission(current)\n if (cleared === current) return { task: current, applied: true }\n if (await compareAndSetTask(taskStore, current, cleared)) return { task: cleared, applied: true }\n return { task: await taskStore.get(expected.id) ?? expected, applied: false }\n}\n","import type { AuthorizedRequest } from '../dispatch'\nimport type { PaymentOperations, PaymentOperation } from '../payment-operations'\nimport {\n deserializePaymentOperation,\n serializePaymentOperation,\n type PaymentRecoveryConfig,\n type PaymentRecoveryRecord,\n type SerializedPaymentOperation,\n} from '../payment-recovery'\nimport type { SandboxUsageReceipt } from '../types'\nimport type { Task } from './types'\nimport {\n asError,\n compareAndSetTask,\n clearTaskMetadata,\n cryptoRandomId,\n withStatus,\n type TaskStateStore,\n} from './task-state'\n\nconst PAYMENT_RELEASE_METADATA_KEY = 'gatewayPaymentRelease'\nconst PAYMENT_RECOVERY_METADATA_KEY = 'gatewayPaymentRecovery'\nconst PAYMENT_RELEASE_LEASE_MS = 5 * 60 * 1000\n\ninterface TaskPaymentRecoveryMarker {\n version: 1\n id: string\n}\n\ninterface PaymentReleaseRecord {\n version: 1\n lease: { id: string; expiresAt: number }\n agentSlug: string\n requestId: string\n operationId: string\n paymentOperation: SerializedPaymentOperation\n reason: string\n recoveryAttempts?: number\n recoveryError?: string\n}\n\nexport interface PaymentRecoveryDependencies {\n taskStore: TaskStateStore\n paymentOperations?: PaymentOperations\n paymentRecovery?: PaymentRecoveryConfig\n releasePayment: (authz: AuthorizedRequest, reason: string) => Promise<void>\n releasePaymentAfterFailure: (\n authz: AuthorizedRequest,\n reason: string,\n workObserved: boolean,\n ) => Promise<void>\n recoverDurablePayment: (\n recoveryId: string,\n options?: { force?: boolean; usage?: SandboxUsageReceipt },\n ) => Promise<PaymentRecoveryRecord | undefined>\n deliverPush: (task: Task) => Promise<void>\n}\n\nexport async function attachPaymentRecoveryMarker(\n taskStore: TaskStateStore,\n task: Task,\n recoveryId: string | undefined,\n): Promise<Task> {\n if (!recoveryId) return task\n const existing = readPaymentRecoveryMarker(task)\n if (existing) {\n if (existing.id !== recoveryId) {\n throw new Error('A2A task already has a different payment recovery identity')\n }\n return task\n }\n const next = withPaymentRecoveryMarker(task, recoveryId)\n if (await compareAndSetTask(taskStore, task, next)) return next\n throw new Error('A2A task changed while payment recovery was attached')\n}\n\n/** Attach only as a retention marker. The returned task must never execute. */\nexport async function retainPaymentRecoveryMarker(\n taskStore: TaskStateStore,\n task: Task,\n recoveryId: string | undefined,\n): Promise<Task> {\n if (!recoveryId) return task\n let current = await taskStore.get(task.id) ?? task\n for (let attempt = 0; attempt < 16; attempt += 1) {\n const existing = readPaymentRecoveryMarker(current)\n if (existing) {\n if (existing.id !== recoveryId) {\n throw new Error('A2A task already has a different payment recovery identity')\n }\n return current\n }\n const next = withPaymentRecoveryMarker(current, recoveryId)\n if (await compareAndSetTask(taskStore, current, next)) return next\n const latest = await taskStore.get(task.id)\n if (!latest) throw new Error('A2A task disappeared while payment recovery was retained')\n current = latest\n }\n throw new Error('A2A task changed too many times while payment recovery was retained')\n}\n\nexport function preservePaymentRecoveryMarker(base: Task, source: Task): Task {\n const marker = readPaymentRecoveryMarker(source)\n return marker ? withPaymentRecoveryMarker(base, marker.id) : base\n}\n\nexport function readPaymentRecoveryMarker(task: Task): TaskPaymentRecoveryMarker | undefined {\n const raw = task.metadata?.[PAYMENT_RECOVERY_METADATA_KEY]\n if (!raw || typeof raw !== 'object') return undefined\n const marker = raw as Partial<TaskPaymentRecoveryMarker>\n if (marker.version !== 1 || typeof marker.id !== 'string' || marker.id.length === 0) {\n return undefined\n }\n return marker as TaskPaymentRecoveryMarker\n}\n\nexport function clearPaymentRecoveryMarker(task: Task): Task {\n return clearTaskMetadata(task, PAYMENT_RECOVERY_METADATA_KEY)\n}\n\nexport function hasPaymentReleaseRecovery(task: Task): boolean {\n return task.metadata?.[PAYMENT_RELEASE_METADATA_KEY] !== undefined\n}\n\nexport async function releaseTaskPayment(\n authz: AuthorizedRequest,\n task: Task,\n deps: PaymentRecoveryDependencies,\n reason: string,\n workObserved: boolean,\n): Promise<Task> {\n if (\n !workObserved &&\n !authz.paymentRecoveryId &&\n authz.paymentOperation &&\n deps.paymentOperations\n ) {\n let marked: Task\n try {\n marked = await beginPaymentReleaseRecovery(deps.taskStore, task, authz, reason) ?? task\n } catch (error) {\n console.error(\n '[a2a] failed to persist payment release recovery for ' + authz.requestId + ':',\n error instanceof Error ? error.message : String(error),\n )\n return await deps.taskStore.get(task.id) ?? task\n }\n const record = readPaymentReleaseRecord(marked)\n if (!record) return marked\n try {\n await deps.releasePayment(authz, reason)\n } catch (releaseError) {\n const retained = await retainPaymentReleaseForRecovery(\n deps.taskStore,\n task.id,\n record.lease.id,\n asError(releaseError),\n )\n console.error(\n '[a2a] payment release retained for ' + authz.requestId + ':',\n releaseError instanceof Error ? releaseError.message : String(releaseError),\n )\n return retained ?? marked\n }\n return clearPaymentReleaseRecovery(deps.taskStore, marked, record.lease.id)\n }\n\n try {\n await deps.releasePaymentAfterFailure(authz, reason, workObserved)\n } catch (releaseError) {\n console.error(\n `[a2a] payment release failed for ${authz.requestId}:`,\n releaseError instanceof Error ? releaseError.message : String(releaseError),\n )\n }\n const current = await deps.taskStore.get(task.id) ?? task\n return workObserved\n ? current\n : clearReconciledPaymentRecoveryMarker(current, deps)\n}\n\nasync function beginPaymentReleaseRecovery(\n taskStore: TaskStateStore,\n task: Task,\n authz: AuthorizedRequest,\n reason: string,\n): Promise<Task | undefined> {\n const record = buildPaymentReleaseRecord(authz, reason)\n if (!record) return undefined\n for (let attempt = 0; attempt < 8; attempt += 1) {\n const current = await taskStore.get(task.id) ?? task\n const existing = readPaymentReleaseRecord(current)\n if (existing) {\n if (existing.operationId !== record.operationId) {\n throw new Error('A2A task already has a different payment release recovery')\n }\n return current\n }\n const next = withPaymentReleaseRecord(current, record)\n if (await compareAndSetTask(taskStore, current, next)) return next\n }\n throw new Error('A2A task changed before payment release recovery was stored')\n}\n\nasync function retainPaymentReleaseForRecovery(\n taskStore: TaskStateStore,\n taskId: string,\n leaseId: string,\n error: Error,\n): Promise<Task | undefined> {\n const current = await taskStore.get(taskId)\n if (!current) return undefined\n const record = readPaymentReleaseRecord(current)\n if (!record || record.lease.id !== leaseId) return undefined\n const retry: PaymentReleaseRecord = {\n ...record,\n lease: { id: cryptoRandomId(), expiresAt: Date.now() + PAYMENT_RELEASE_LEASE_MS },\n recoveryAttempts: (record.recoveryAttempts ?? 0) + 1,\n recoveryError: error.message,\n }\n const next = withPaymentReleaseRecord(current, retry)\n if (await compareAndSetTask(taskStore, current, next)) return next\n return await taskStore.get(taskId)\n}\n\nasync function clearPaymentReleaseRecovery(\n taskStore: TaskStateStore,\n task: Task,\n leaseId: string,\n): Promise<Task> {\n const current = await taskStore.get(task.id) ?? task\n const record = readPaymentReleaseRecord(current)\n if (!record || record.lease.id !== leaseId) return current\n const cleared = clearPaymentRecoveryMarker(clearPaymentReleaseRecord(current))\n if (await compareAndSetTask(taskStore, current, cleared)) return cleared\n return await taskStore.get(task.id) ?? cleared\n}\n\nexport async function recoverPaymentReleaseIfNeeded(\n task: Task,\n deps: PaymentRecoveryDependencies,\n): Promise<Task> {\n const raw = task.metadata?.[PAYMENT_RELEASE_METADATA_KEY]\n if (raw === undefined) return task\n const record = readPaymentReleaseRecord(task)\n if (!record) {\n return expirePaymentRelease(\n task,\n deps,\n new Error('A2A payment release recovery record is missing'),\n )\n }\n if (record.lease.expiresAt > Date.now()) return task\n\n const renewed: PaymentReleaseRecord = {\n ...record,\n lease: { id: cryptoRandomId(), expiresAt: Date.now() + PAYMENT_RELEASE_LEASE_MS },\n }\n const leasedTask = withPaymentReleaseRecord(task, renewed)\n if (!await compareAndSetTask(deps.taskStore, task, leasedTask)) {\n return await deps.taskStore.get(task.id) ?? task\n }\n\n try {\n if (!deps.paymentOperations) {\n throw new Error('A2A payment release recovery is not configured')\n }\n const operation = deserializePaymentOperation(renewed.paymentOperation)\n await deps.paymentOperations.releasePayment(operation, renewed.reason)\n if (deps.paymentRecovery) {\n const recovered = await deps.recoverDurablePayment(renewed.operationId, { force: true })\n if (recovered && recovered.state !== 'reconciled') {\n throw new Error('durable payment release is still pending')\n }\n }\n const recovered = clearPaymentReleaseRecord(leasedTask)\n if (!await compareAndSetTask(deps.taskStore, leasedTask, recovered)) {\n return await deps.taskStore.get(task.id) ?? recovered\n }\n return recovered\n } catch (error) {\n const recoveryError = asError(error)\n const retained = await retainPaymentReleaseForRecovery(\n deps.taskStore,\n task.id,\n renewed.lease.id,\n recoveryError,\n )\n console.error(\n '[a2a] payment release recovery failed for ' + task.id + ':',\n recoveryError.message,\n )\n return retained ?? leasedTask\n }\n}\n\nexport async function recoverPaymentMarkerIfNeeded(\n task: Task,\n deps: PaymentRecoveryDependencies,\n): Promise<Task> {\n const marker = readPaymentRecoveryMarker(task)\n if (!marker || !deps.paymentRecovery) return task\n try {\n const record = await deps.recoverDurablePayment(marker.id)\n if (record?.state !== 'reconciled') return task\n return clearReconciledPaymentRecoveryMarker(task, deps)\n } catch (error) {\n console.error(\n `[a2a] durable payment recovery failed for ${task.id}:`,\n error instanceof Error ? error.message : String(error),\n )\n return task\n }\n}\n\nasync function clearReconciledPaymentRecoveryMarker(\n task: Task,\n deps: PaymentRecoveryDependencies,\n): Promise<Task> {\n const marker = readPaymentRecoveryMarker(task)\n if (!marker || !deps.paymentRecovery) return task\n const record = await deps.paymentRecovery.store.get(marker.id)\n if (record?.state !== 'reconciled') return task\n const cleared = clearPaymentRecoveryMarker(task)\n if (cleared.status.state === 'working' || cleared.status.state === 'submitted') {\n const failed: Task = {\n ...withStatus(cleared, 'failed'),\n metadata: {\n ...(cleared.metadata ?? {}),\n gatewayExecutionRecovery: {\n error: 'payment recovery completed without a task result',\n },\n },\n }\n if (await compareAndSetTask(deps.taskStore, task, failed)) return failed\n return await deps.taskStore.get(task.id) ?? failed\n }\n if (await compareAndSetTask(deps.taskStore, task, cleared)) return cleared\n return await deps.taskStore.get(task.id) ?? cleared\n}\n\nfunction withPaymentRecoveryMarker(task: Task, recoveryId: string): Task {\n return {\n ...task,\n metadata: {\n ...(task.metadata ?? {}),\n [PAYMENT_RECOVERY_METADATA_KEY]: { version: 1, id: recoveryId },\n },\n }\n}\n\nfunction withPaymentReleaseRecord(task: Task, record: PaymentReleaseRecord): Task {\n return {\n ...task,\n metadata: { ...(task.metadata ?? {}), [PAYMENT_RELEASE_METADATA_KEY]: record },\n }\n}\n\nfunction clearPaymentReleaseRecord(task: Task): Task {\n return clearTaskMetadata(task, PAYMENT_RELEASE_METADATA_KEY)\n}\n\nfunction readPaymentReleaseRecord(task: Task): PaymentReleaseRecord | undefined {\n const raw = task.metadata?.[PAYMENT_RELEASE_METADATA_KEY]\n if (!raw || typeof raw !== 'object') return undefined\n const record = raw as Partial<PaymentReleaseRecord>\n if (\n record.version !== 1 ||\n !record.lease ||\n typeof record.lease.id !== 'string' ||\n record.lease.id.length === 0 ||\n typeof record.lease.expiresAt !== 'number' ||\n !Number.isFinite(record.lease.expiresAt) ||\n typeof record.agentSlug !== 'string' ||\n record.agentSlug.length === 0 ||\n typeof record.requestId !== 'string' ||\n record.requestId.length === 0 ||\n typeof record.operationId !== 'string' ||\n record.operationId.length === 0 ||\n !record.paymentOperation ||\n typeof record.paymentOperation !== 'object' ||\n typeof record.reason !== 'string'\n ) {\n return undefined\n }\n if (record.paymentOperation.operationId !== record.operationId) return undefined\n try {\n deserializePaymentOperation(record.paymentOperation)\n } catch {\n return undefined\n }\n return record as PaymentReleaseRecord\n}\n\nfunction buildPaymentReleaseRecord(\n authz: AuthorizedRequest,\n reason: string,\n): PaymentReleaseRecord | undefined {\n const operation = authz.paymentOperation\n if (!operation) return undefined\n return {\n version: 1,\n lease: { id: cryptoRandomId(), expiresAt: Date.now() + PAYMENT_RELEASE_LEASE_MS },\n agentSlug: authz.agent.slug,\n requestId: authz.requestId,\n operationId: operation.operationId,\n paymentOperation: serializePaymentOperation({ ...operation, state: 'releasing' }),\n reason,\n }\n}\n\nasync function expirePaymentRelease(\n task: Task,\n deps: PaymentRecoveryDependencies,\n error: Error,\n): Promise<Task> {\n const cleanTask = clearPaymentReleaseRecord(task)\n const terminalTask = withStatus(cleanTask, 'failed')\n const failed: Task = {\n ...terminalTask,\n metadata: {\n ...(terminalTask.metadata ?? {}),\n gatewayPaymentReleaseRecovery: { error: error.message },\n },\n }\n if (await compareAndSetTask(deps.taskStore, task, failed)) {\n await deps.deliverPush(failed)\n return failed\n }\n return await deps.taskStore.get(task.id) ?? failed\n}\n","/**\n * A2A Message ↔ inner-agent (text-only) translation. Both directions are\n * intentionally narrow: callers send text parts, the inner sandbox produces\n * text. Data + file parts are rejected with `CONTENT_TYPE_NOT_SUPPORTED`\n * rather than silently dropped — the protocol's whole point is letting the\n * caller know exactly what an agent does and doesn't accept.\n */\n\nimport { A2A_ERROR_CODES, type Artifact, type Message } from './types'\n\nexport interface ExtractedText {\n text: string\n}\n\nexport interface ExtractError {\n error: { code: number; message: string }\n}\n\n/**\n * Pull `text` out of a Message's parts. Concatenates multi-text-part messages\n * with two newlines, mirroring the OpenAI-compat path's join of `user`\n * messages. Returns an A2A error code on any non-text part — text-only is the\n * declared capability of every agent this gateway fronts.\n */\nexport function extractTextFromMessage(message: Message): ExtractedText | ExtractError {\n if (!message || message.kind !== 'message') {\n return {\n error: {\n code: A2A_ERROR_CODES.INVALID_PARAMS,\n message: 'params.message must be an A2A Message ({ kind: \"message\", role, parts, messageId })',\n },\n }\n }\n if (!Array.isArray(message.parts) || message.parts.length === 0) {\n return {\n error: {\n code: A2A_ERROR_CODES.INVALID_PARAMS,\n message: 'message.parts must be a non-empty array',\n },\n }\n }\n const texts: string[] = []\n for (const part of message.parts) {\n if (part.kind === 'text') {\n if (typeof part.text !== 'string') {\n return {\n error: {\n code: A2A_ERROR_CODES.INVALID_PARAMS,\n message: 'text part .text must be a string',\n },\n }\n }\n texts.push(part.text)\n } else {\n return {\n error: {\n code: A2A_ERROR_CODES.CONTENT_TYPE_NOT_SUPPORTED,\n message: `part.kind '${(part as { kind: string }).kind}' not supported; this agent accepts text parts only`,\n },\n }\n }\n }\n return { text: texts.join('\\n\\n') }\n}\n\n/**\n * Wrap the agent's final response text as an A2A Artifact for the task's\n * `artifacts` field. `name='response'` is the convention for the primary\n * model output across A2A reference servers.\n */\nexport function responseTextToArtifact(text: string, artifactId: string): Artifact {\n return {\n artifactId,\n name: 'response',\n parts: [{ kind: 'text', text }],\n }\n}\n","import type {\n AuthorizedRequest,\n SettleAndRecordOptions,\n} from '../dispatch'\nimport type { PaymentOperation, PaymentOperations } from '../payment-operations'\nimport {\n deserializePaymentOperation,\n serializePaymentOperation,\n type PaymentRecoveryConfig,\n type PaymentRecoveryRecord,\n type SerializedPaymentOperation,\n} from '../payment-recovery'\nimport type { AgentMeta, PaymentMethod, SandboxExecutionBudget, SandboxUsageReceipt } from '../types'\nimport {\n clearPaymentRecoveryMarker,\n readPaymentRecoveryMarker,\n} from './payment-recovery'\nimport { clearTaskSubmission } from './task-submission-recovery'\nimport type { Task } from './types'\nimport {\n agentMessage,\n asError,\n compareAndSetTask,\n clearTaskMetadata,\n cryptoRandomId,\n isTerminal,\n persistTaskIfCurrent,\n type TaskStateStore,\n withStatus,\n} from './task-state'\nimport { responseTextToArtifact } from './translate'\nimport type { Artifact } from './types'\n\nconst FINALIZING_METADATA_KEY = 'gatewayFinalizing'\nconst FINALIZATION_LEASE_MS = 5 * 60 * 1000\n\nexport type FinalizationState = 'completed' | 'input-required' | 'canceled'\n\nexport interface FinalizationRecord {\n version: 1\n lease: { id: string; expiresAt: number }\n agentSlug: string\n requestId: string\n consumerId: string\n paymentMethod: PaymentMethod\n startMs: number\n operationId: string | null\n paymentOperation: SerializedPaymentOperation | null\n receipt: SandboxUsageReceipt\n artifact: Artifact | null\n inputRequired: boolean\n inputRequiredPrompt?: string\n finalState?: FinalizationState\n maxOutputTokens: number\n executionBudget: SandboxExecutionBudget\n usageRecorded: boolean\n recoveryAttempts?: number\n recoveryError?: string\n}\n\nexport interface TaskFinalizationDependencies {\n taskStore: TaskStateStore\n settle: (\n authz: AuthorizedRequest,\n usage: SandboxUsageReceipt,\n options?: SettleAndRecordOptions,\n ) => Promise<void>\n resolveAgent: (slug: string) => Promise<AgentMeta | null | undefined>\n paymentOperations?: PaymentOperations\n paymentRecovery?: PaymentRecoveryConfig\n recoverDurablePayment: (\n recoveryId: string,\n options?: { force?: boolean; usage?: SandboxUsageReceipt },\n ) => Promise<PaymentRecoveryRecord | undefined>\n releasePaymentAfterFailure: (\n authz: AuthorizedRequest,\n reason: string,\n workObserved: boolean,\n ) => Promise<void>\n releaseTaskPayment: (\n authz: AuthorizedRequest,\n task: Task,\n reason: string,\n workObserved: boolean,\n ) => Promise<Task>\n deliverPush: (task: Task) => Promise<void>\n}\n\nexport function buildFinalizationRecord(\n authz: AuthorizedRequest,\n receipt: SandboxUsageReceipt,\n artifact: Artifact | null,\n inputRequired: boolean,\n inputRequiredPrompt: string | undefined,\n finalState: FinalizationState = inputRequired ? 'input-required' : 'completed',\n): FinalizationRecord {\n const operation = authz.paymentOperation\n return {\n version: 1,\n lease: { id: cryptoRandomId(), expiresAt: Date.now() + FINALIZATION_LEASE_MS },\n agentSlug: authz.agent.slug,\n requestId: authz.requestId,\n consumerId: authz.consumerId,\n paymentMethod: authz.paymentMethod,\n startMs: authz.startMs,\n operationId: operation?.operationId ?? null,\n paymentOperation: operation ? serializePaymentOperation(operation) : null,\n receipt,\n artifact,\n inputRequired,\n ...(inputRequiredPrompt ? { inputRequiredPrompt } : {}),\n finalState,\n maxOutputTokens: authz.maxOutputTokens,\n executionBudget: authz.executionBudget,\n usageRecorded: false,\n }\n}\n\nexport function withFinalizationRecord(task: Task, record: FinalizationRecord): Task {\n return {\n ...task,\n metadata: { ...(task.metadata ?? {}), [FINALIZING_METADATA_KEY]: record },\n }\n}\n\nexport function readFinalizationRecord(task: Task): FinalizationRecord | undefined {\n const raw = task.metadata?.[FINALIZING_METADATA_KEY]\n if (!raw || typeof raw !== 'object') return undefined\n const record = raw as Partial<FinalizationRecord>\n if (\n record.version !== 1 ||\n !record.lease ||\n typeof record.lease.id !== 'string' ||\n typeof record.lease.expiresAt !== 'number'\n ) {\n return undefined\n }\n return record as FinalizationRecord\n}\n\nexport function isTaskFinalizing(task: Task): boolean {\n const marker = task.metadata?.[FINALIZING_METADATA_KEY]\n return marker === true || (typeof marker === 'object' && marker !== null)\n}\n\nexport function clearFinalizationMarker(task: Task): Task {\n return clearTaskMetadata(task, FINALIZING_METADATA_KEY)\n}\n\nfunction markUsageRecordedRecord(task: Task): Task {\n const record = readFinalizationRecord(task)\n if (!record || record.usageRecorded) return task\n return withFinalizationRecord(task, { ...record, usageRecorded: true })\n}\n\nexport async function markUsageRecorded(\n taskStore: TaskStateStore,\n task: Task,\n): Promise<Task> {\n const marked = markUsageRecordedRecord(task)\n if (marked === task) return task\n if (await compareAndSetTask(taskStore, task, marked)) return marked\n return await taskStore.get(task.id) ?? marked\n}\n\nexport async function retainFinalizationForRecovery(\n taskStore: TaskStateStore,\n taskId: string,\n leaseId: string,\n error: Error,\n): Promise<Task | undefined> {\n const current = await taskStore.get(taskId)\n if (!current) return undefined\n const record = readFinalizationRecord(current)\n if (!record || record.lease.id !== leaseId) return undefined\n const retry: FinalizationRecord = {\n ...record,\n lease: { id: cryptoRandomId(), expiresAt: Date.now() + FINALIZATION_LEASE_MS },\n recoveryAttempts: (record.recoveryAttempts ?? 0) + 1,\n recoveryError: error.message,\n }\n const next = withFinalizationRecord(current, retry)\n if (await compareAndSetTask(taskStore, current, next)) return next\n return await taskStore.get(taskId)\n}\n\nexport async function completeCanceledTask(\n authz: AuthorizedRequest,\n task: Task,\n responseText: string,\n usage: SandboxUsageReceipt | undefined,\n workObserved: boolean,\n deps: TaskFinalizationDependencies,\n): Promise<Task> {\n if (usage) {\n const current = await deps.taskStore.get(task.id) ?? task\n const finalization = buildFinalizationRecord(\n authz,\n usage,\n responseText\n ? responseTextToArtifact(responseText, `${task.id}-artifact-0`)\n : current.artifacts?.[0] ?? null,\n false,\n undefined,\n 'canceled',\n )\n let finalizingTask: Task | undefined\n let candidate = current\n for (let attempt = 0; attempt < 8; attempt += 1) {\n if (isTaskFinalizing(candidate)) return candidate\n if (isTerminal(candidate.status.state) && candidate.status.state !== 'canceled') return candidate\n const next = withFinalizationRecord(candidate, finalization)\n if (await compareAndSetTask(deps.taskStore, candidate, next)) {\n finalizingTask = next\n break\n }\n const latest = await deps.taskStore.get(task.id)\n if (!latest) break\n if (isTerminal(latest.status.state) && latest.status.state !== 'canceled') return latest\n candidate = latest\n }\n if (!finalizingTask) {\n throw new Error(`A2A task '${task.id}' changed before cancellation settlement`)\n }\n\n let usageRecordedTask = finalizingTask\n try {\n await deps.settle(authz, usage, {\n onUsageRecorded: async () => {\n usageRecordedTask = await markUsageRecorded(deps.taskStore, usageRecordedTask)\n },\n })\n usageRecordedTask = await markUsageRecorded(deps.taskStore, usageRecordedTask)\n } catch (settlementError) {\n await deps.releasePaymentAfterFailure(\n authz,\n settlementError instanceof Error ? settlementError.message : String(settlementError),\n true,\n )\n const retained = await retainFinalizationForRecovery(\n deps.taskStore,\n task.id,\n finalization.lease.id,\n asError(settlementError),\n )\n const recoveryTask = retained ?? finalizingTask\n console.error(\n `[a2a] canceled task settlement retained for ${authz.requestId}:`,\n settlementError instanceof Error ? settlementError.message : String(settlementError),\n )\n await deps.deliverPush(recoveryTask)\n return recoveryTask\n }\n\n const canceled = withStatus(\n clearPaymentRecoveryMarker(clearFinalizationMarker(usageRecordedTask)),\n 'canceled',\n undefined,\n responseText\n ? [responseTextToArtifact(responseText, `${task.id}-artifact-0`)]\n : finalizingTask.artifacts,\n )\n if (!await compareAndSetTask(deps.taskStore, usageRecordedTask, canceled)) {\n return await deps.taskStore.get(task.id) ?? canceled\n }\n await deps.deliverPush(canceled)\n return canceled\n }\n await deps.releaseTaskPayment(authz, task, 'a2a task canceled', workObserved)\n const currentTask = await deps.taskStore.get(task.id)\n const canceledBase = currentTask?.status.state === 'canceled'\n ? currentTask\n : withStatus(currentTask ?? task, 'canceled')\n const canceled: Task = responseText\n ? {\n ...canceledBase,\n artifacts: [responseTextToArtifact(responseText, `${task.id}-artifact-0`)],\n }\n : canceledBase\n const persisted = await persistTaskIfCurrent(deps.taskStore, currentTask ?? task, canceled)\n await deps.deliverPush(persisted)\n return persisted\n}\n\nexport async function recoverFinalizationIfNeeded(\n task: Task,\n deps: TaskFinalizationDependencies,\n requestedAgentSlug: string,\n): Promise<Task> {\n if (!isTaskFinalizing(task)) return task\n const record = readFinalizationRecord(task)\n if (!record) {\n return expireFinalization(task, deps, null, new Error('A2A finalization record is missing'))\n }\n if (record.lease.expiresAt > Date.now()) return task\n\n const renewed: FinalizationRecord = {\n ...record,\n lease: { id: cryptoRandomId(), expiresAt: Date.now() + FINALIZATION_LEASE_MS },\n }\n const leasedTask = withFinalizationRecord(task, renewed)\n if (!await compareAndSetTask(deps.taskStore, task, leasedTask)) {\n return await deps.taskStore.get(task.id) ?? task\n }\n\n try {\n const agentSlug = renewed.agentSlug || requestedAgentSlug\n const agent = await deps.resolveAgent(agentSlug)\n if (!agent || !agent.enabled) throw new Error('A2A recovery agent is unavailable')\n\n const paymentRecovery = readPaymentRecoveryMarker(leasedTask)\n if (paymentRecovery && deps.paymentRecovery) {\n const recovery = await deps.recoverDurablePayment(paymentRecovery.id, {\n force: true,\n usage: renewed.receipt,\n })\n if (recovery?.state !== 'reconciled') {\n throw new Error('durable payment finalization is still pending')\n }\n const usageRecordedTask = await markUsageRecorded(deps.taskStore, leasedTask)\n const recoveredTask = finalizationResultTask(usageRecordedTask, renewed)\n if (!await compareAndSetTask(deps.taskStore, usageRecordedTask, recoveredTask)) {\n return await deps.taskStore.get(task.id) ?? recoveredTask\n }\n await deps.deliverPush(recoveredTask)\n return recoveredTask\n }\n\n let paymentOperation: PaymentOperation | undefined\n if (renewed.operationId || renewed.paymentOperation) {\n if (!renewed.operationId || !renewed.paymentOperation) {\n throw new Error('A2A payment operation recovery record is incomplete')\n }\n if (renewed.operationId !== renewed.paymentOperation.operationId) {\n throw new Error('A2A payment operation recovery id does not match')\n }\n if (!deps.paymentOperations) {\n throw new Error('A2A payment operation recovery is not configured')\n }\n paymentOperation = deserializePaymentOperation(renewed.paymentOperation)\n }\n\n let paymentAlreadySettled = false\n if (paymentOperation && deps.paymentOperations) {\n const currentOperation = await deps.paymentOperations.getPaymentOperation(paymentOperation.operationId)\n if (currentOperation.state === 'not-found') {\n throw new Error('A2A payment operation disappeared during finalization recovery')\n }\n if (currentOperation.operationId !== paymentOperation.operationId) {\n throw new Error('A2A payment operation recovery returned a different operation')\n }\n paymentOperation = currentOperation\n paymentAlreadySettled = currentOperation.state === 'settled'\n }\n\n const authz: AuthorizedRequest = {\n agent,\n consumerId: renewed.consumerId,\n paymentMethod: renewed.paymentMethod,\n keyInfo: null,\n userMessage: '[recovered A2A task]',\n rateLimitRemaining: undefined,\n requestId: renewed.requestId,\n startMs: renewed.startMs,\n maxOutputTokens: renewed.maxOutputTokens,\n executionBudget: renewed.executionBudget,\n requiredPaymentAmount: 0n,\n paymentPayload: null,\n ...(paymentRecovery ? { paymentRecoveryId: paymentRecovery.id } : {}),\n ...(paymentOperation ? { paymentOperation, paymentOperationAcquired: true } : {}),\n }\n let usageRecordedTask = leasedTask\n await deps.settle(authz, renewed.receipt, {\n usageAlreadyRecorded: renewed.usageRecorded === true,\n paymentAlreadySettled,\n onUsageRecorded: async () => {\n usageRecordedTask = await markUsageRecorded(deps.taskStore, usageRecordedTask)\n },\n })\n usageRecordedTask = await markUsageRecorded(deps.taskStore, usageRecordedTask)\n const recovered = finalizationResultTask(usageRecordedTask, renewed)\n if (!await compareAndSetTask(deps.taskStore, usageRecordedTask, recovered)) {\n return await deps.taskStore.get(task.id) ?? recovered\n }\n await deps.deliverPush(recovered)\n return recovered\n } catch (error) {\n const recoveryError = asError(error)\n console.error(`[a2a] finalization recovery failed for ${task.id}:`, recoveryError.message)\n if (\n (readPaymentRecoveryMarker(leasedTask) && deps.paymentRecovery) ||\n (renewed.operationId && renewed.paymentOperation)\n ) {\n const retained = await retainFinalizationForRecovery(\n deps.taskStore,\n task.id,\n renewed.lease.id,\n recoveryError,\n )\n if (retained) return retained\n }\n return expireFinalization(leasedTask, deps, renewed, recoveryError)\n }\n}\n\nfunction finalizationResultTask(task: Task, record: FinalizationRecord): Task {\n const cleanTask = clearPaymentRecoveryMarker(clearFinalizationMarker(task))\n const finalState = record.finalState ?? (\n task.status.state === 'canceled'\n ? 'canceled'\n : record.inputRequired\n ? 'input-required'\n : 'completed'\n )\n if (finalState === 'canceled') {\n return withStatus(cleanTask, 'canceled', undefined, record.artifact ? [record.artifact] : cleanTask.artifacts)\n }\n if (finalState === 'input-required') {\n return withStatus(\n cleanTask,\n 'input-required',\n record.inputRequiredPrompt ? agentMessage(cleanTask, record.inputRequiredPrompt) : undefined,\n record.artifact ? [record.artifact] : cleanTask.artifacts,\n )\n }\n return withStatus(cleanTask, 'completed', undefined, record.artifact ? [record.artifact] : cleanTask.artifacts)\n}\n\nasync function expireFinalization(\n task: Task,\n deps: TaskFinalizationDependencies,\n record: FinalizationRecord | null,\n error: Error,\n): Promise<Task> {\n const cleanTask = clearFinalizationMarker(task)\n const failed: Task = {\n ...withStatus(cleanTask, 'failed'),\n metadata: {\n ...(cleanTask.metadata ?? {}),\n gatewayFinalizationRecovery: {\n operationId: record?.operationId ?? null,\n error: error.message,\n },\n },\n }\n if (await compareAndSetTask(deps.taskStore, task, failed)) {\n await deps.deliverPush(failed)\n return failed\n }\n return await deps.taskStore.get(task.id) ?? failed\n}\n","/**\n * JSON-RPC 2.0 envelope parsing + response builders. Keeps the wire\n * format isolated from the method dispatcher so a fuzz harness can throw\n * malformed bodies at `parseEnvelope` directly.\n */\n\nimport {\n A2A_ERROR_CODES,\n type JSONRPCErrorResponse,\n type JSONRPCRequest,\n type JSONRPCSuccessResponse,\n} from './types'\n\nexport interface EnvelopeError {\n /** id is whatever the caller sent (or null when we can't recover it). */\n id: string | number | null\n code: number\n message: string\n}\n\n/**\n * Parse an inbound body. Returns the request envelope on success OR an\n * EnvelopeError that the caller renders as a JSONRPCErrorResponse. We never\n * throw — JSON-RPC says any malformed body becomes a -32700/-32600 response.\n */\nexport function parseEnvelope(raw: unknown): JSONRPCRequest | EnvelopeError {\n if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {\n return {\n id: null,\n code: A2A_ERROR_CODES.INVALID_REQUEST,\n message: 'request must be a JSON object',\n }\n }\n const req = raw as Record<string, unknown>\n const id = req.id === undefined ? null : (req.id as string | number | null)\n if (req.jsonrpc !== '2.0') {\n return { id, code: A2A_ERROR_CODES.INVALID_REQUEST, message: 'jsonrpc field must be \"2.0\"' }\n }\n if (typeof req.method !== 'string' || req.method.length === 0) {\n return { id, code: A2A_ERROR_CODES.INVALID_REQUEST, message: 'method field required' }\n }\n return {\n jsonrpc: '2.0',\n id,\n method: req.method,\n params: req.params,\n }\n}\n\nexport function ok<T>(id: string | number | null, result: T): JSONRPCSuccessResponse<T> {\n return { jsonrpc: '2.0', id, result }\n}\n\nexport function fail(\n id: string | number | null,\n code: number,\n message: string,\n data?: unknown,\n): JSONRPCErrorResponse {\n return {\n jsonrpc: '2.0',\n id,\n error: { code, message, ...(data !== undefined ? { data } : {}) },\n }\n}\n","import type { Context } from 'hono'\nimport {\n type AuthorizedRequest,\n dispatchSandboxStreamRich,\n beginPaymentExecution,\n markPaymentExecutionStarted,\n renewPaymentExecution,\n} from '../dispatch'\nimport { claimTaskExecution, renewTaskExecution } from './execution-fence'\nimport type { GatewayConfig, SandboxUsageReceipt } from '../types'\nimport type { TaskStore } from './task-store'\nimport { A2A_ERROR_CODES, type JSONRPCRequest, type Task } from './types'\nimport { clearTaskSubmission } from './task-submission-recovery'\nimport {\n buildFinalizationRecord,\n clearFinalizationMarker,\n completeCanceledTask,\n markUsageRecorded,\n retainFinalizationForRecovery,\n withFinalizationRecord,\n} from './task-finalization'\nimport { clearPaymentRecoveryMarker, releaseTaskPayment } from './payment-recovery'\nimport {\n agentMessage,\n asError,\n compareAndSetTask,\n isTerminal,\n nowIso,\n persistTaskIfCurrent,\n shouldPreserveTask,\n withStatus,\n} from './task-state'\nimport { fail, ok } from './jsonrpc'\nimport { responseTextToArtifact } from './translate'\nimport type { TaskFinalizationDependencies } from './task-finalization'\nimport type { PaymentRecoveryDependencies } from './payment-recovery'\n\nexport interface MessageExecutionDependencies {\n taskStore: TaskStore\n config: GatewayConfig\n payment: PaymentRecoveryDependencies\n finalization: TaskFinalizationDependencies\n}\n\nexport async function executeMessageSend(\n c: Context,\n req: JSONRPCRequest,\n deps: MessageExecutionDependencies,\n authz: AuthorizedRequest,\n task: Task,\n signal: AbortSignal,\n): Promise<Response> {\n if (isTerminal(task.status.state)) return c.json(ok(req.id, task))\n const taskWithoutSubmission = clearTaskSubmission(task)\n let workingTask: Task = task.status.state === 'working'\n ? taskWithoutSubmission\n : { ...taskWithoutSubmission, status: { state: 'working', timestamp: nowIso() } }\n if (\n JSON.stringify(task) !== JSON.stringify(workingTask) &&\n !await compareAndSetTask(deps.taskStore, task, workingTask)\n ) {\n await releaseTaskPayment(authz, task, deps.payment, 'A2A task changed before execution started', false)\n if (signal.aborted) {\n const canceled = await deps.taskStore.get(task.id)\n if (canceled?.status.state === 'canceled') {\n await deps.finalization.deliverPush(canceled)\n return c.json(ok(req.id, canceled))\n }\n }\n return c.json(fail(req.id, A2A_ERROR_CODES.INVALID_PARAMS, `task '${task.id}' changed before execution`))\n }\n\n let responseText = ''\n let usage: SandboxUsageReceipt | undefined\n let workObserved = false\n let inputRequiredPrompt: string | undefined\n let inputRequiredSeen = false\n let finalizationLeaseId: string | undefined\n try {\n for await (const event of dispatchSandboxStreamRich(\n authz.agent,\n authz.userMessage,\n authz.consumerId,\n deps.config,\n signal,\n task.id,\n authz.maxOutputTokens,\n async () => {\n workingTask = await claimTaskExecution(deps.taskStore, workingTask, authz.requestId)\n await beginPaymentExecution(authz, deps.config)\n },\n authz.paymentOperation !== undefined || authz.mppChargeOperation !== undefined,\n async () => {\n workObserved = true\n await markPaymentExecutionStarted(authz, deps.config)\n },\n authz.executionBudget.maxInputTokens,\n async () => {\n workingTask = await renewTaskExecution(deps.taskStore, task.id, authz.requestId)\n await renewPaymentExecution(authz, deps.config)\n },\n )) {\n if (event.kind === 'text') {\n responseText += event.delta\n workObserved = true\n } else if (event.kind === 'activity') {\n workObserved = true\n } else if (event.kind === 'usage') {\n usage = event.usage\n } else {\n inputRequiredSeen = true\n inputRequiredPrompt = event.prompt\n workObserved = true\n }\n }\n } catch (err) {\n const releasedTask = await releaseTaskPayment(\n authz,\n workingTask,\n deps.payment,\n err instanceof Error ? err.message : String(err),\n workObserved || usage !== undefined,\n )\n const currentTask = await deps.taskStore.get(task.id) ?? releasedTask\n const failed = shouldPreserveTask(currentTask)\n ? currentTask\n : withStatus(clearTaskSubmission(currentTask), 'failed')\n try {\n const persisted = await persistTaskIfCurrent(deps.taskStore, currentTask, failed)\n await deps.finalization.deliverPush(persisted)\n } catch (taskError) {\n console.error(\n `[a2a] failed to persist failed task ${task.id}:`,\n taskError instanceof Error ? taskError.message : String(taskError),\n )\n }\n return c.json(fail(req.id, A2A_ERROR_CODES.INTERNAL_ERROR, err instanceof Error ? err.message : String(err)))\n }\n\n if (signal.aborted) {\n const canceled = await completeCanceledTask(\n authz,\n workingTask,\n responseText,\n usage,\n workObserved,\n deps.finalization,\n )\n return c.json(ok(req.id, canceled))\n }\n\n try {\n if (!usage) throw new Error('sandbox did not provide a usage receipt')\n const finalizationArtifact = responseText\n ? responseTextToArtifact(responseText, `${task.id}-artifact-0`)\n : task.artifacts?.[0] ?? null\n const finalization = buildFinalizationRecord(\n authz,\n usage,\n finalizationArtifact,\n inputRequiredSeen,\n inputRequiredPrompt,\n )\n const finalizingTask = withFinalizationRecord(workingTask, finalization)\n if (!await compareAndSetTask(deps.taskStore, workingTask, finalizingTask)) {\n const currentTask = await deps.taskStore.get(task.id)\n if (currentTask?.status.state === 'canceled') {\n const canceled = await completeCanceledTask(\n authz,\n currentTask,\n responseText,\n usage,\n workObserved,\n deps.finalization,\n )\n return c.json(ok(req.id, canceled))\n }\n throw new Error('A2A task changed before payment settlement')\n }\n finalizationLeaseId = finalization.lease.id\n let usageRecordedTask = finalizingTask\n await deps.finalization.settle(authz, usage, {\n onUsageRecorded: async () => {\n usageRecordedTask = await markUsageRecorded(deps.taskStore, usageRecordedTask)\n },\n })\n usageRecordedTask = await markUsageRecorded(deps.taskStore, usageRecordedTask)\n const settledBase = clearPaymentRecoveryMarker(clearFinalizationMarker(usageRecordedTask))\n const result = inputRequiredSeen\n ? withStatus(\n settledBase,\n 'input-required',\n inputRequiredPrompt ? agentMessage(task, inputRequiredPrompt) : undefined,\n responseText ? [responseTextToArtifact(responseText, `${task.id}-artifact-0`)] : task.artifacts,\n )\n : withStatus(settledBase, 'completed', undefined, [\n responseTextToArtifact(responseText, `${task.id}-artifact-0`),\n ])\n if (!await compareAndSetTask(deps.taskStore, usageRecordedTask, result)) {\n const currentTask = await deps.taskStore.get(task.id)\n if (currentTask && (isTerminal(currentTask.status.state) || currentTask.status.state === 'input-required')) {\n return c.json(ok(req.id, currentTask))\n }\n throw new Error('A2A task changed after payment settlement')\n }\n if (inputRequiredSeen) return c.json(ok(req.id, result))\n await deps.finalization.deliverPush(result)\n return c.json(ok(req.id, result))\n } catch (err) {\n const releasedTask = await releaseTaskPayment(\n authz,\n workingTask,\n deps.payment,\n err instanceof Error ? err.message : String(err),\n workObserved || usage !== undefined,\n )\n if (finalizationLeaseId) {\n await retainFinalizationForRecovery(\n deps.taskStore,\n task.id,\n finalizationLeaseId,\n asError(err),\n )\n return c.json(fail(req.id, A2A_ERROR_CODES.INTERNAL_ERROR, 'Payment settlement failed'))\n }\n const currentTask = await deps.taskStore.get(task.id) ?? releasedTask\n const failed = shouldPreserveTask(currentTask)\n ? currentTask\n : withStatus(clearTaskSubmission(currentTask), 'failed')\n try {\n const persisted = await persistTaskIfCurrent(deps.taskStore, currentTask, failed)\n await deps.finalization.deliverPush(persisted)\n } catch (taskError) {\n console.error(\n `[a2a] failed to persist failed task ${task.id}:`,\n taskError instanceof Error ? taskError.message : String(taskError),\n )\n }\n return c.json(fail(req.id, A2A_ERROR_CODES.INTERNAL_ERROR, 'Payment settlement failed'))\n }\n}\n","export class TaskCancellationRegistry {\n private readonly controllers = new Map<string, AbortController>()\n private readonly finalizing = new Set<string>()\n\n register(taskId: string): AbortController {\n const controller = new AbortController()\n this.controllers.set(taskId, controller)\n return controller\n }\n\n clear(taskId: string): void {\n this.controllers.delete(taskId)\n this.finalizing.delete(taskId)\n }\n\n beginFinalization(taskId: string): boolean {\n const controller = this.controllers.get(taskId)\n if (!controller || controller.signal.aborted || this.finalizing.has(taskId)) return false\n this.finalizing.add(taskId)\n return true\n }\n\n isFinalizing(taskId: string): boolean {\n return this.finalizing.has(taskId)\n }\n\n has(taskId: string): boolean {\n const controller = this.controllers.get(taskId)\n return controller !== undefined && !controller.signal.aborted\n }\n\n cancel(taskId: string): boolean {\n if (this.finalizing.has(taskId)) return false\n const controller = this.controllers.get(taskId)\n if (!controller) return false\n controller.abort()\n this.controllers.delete(taskId)\n return true\n }\n}\n\nexport function bindRequestAbort(\n requestSignal: AbortSignal,\n controller: AbortController,\n): () => void {\n const abort = () => controller.abort()\n if (requestSignal.aborted) abort()\n else requestSignal.addEventListener('abort', abort, { once: true })\n return () => requestSignal.removeEventListener('abort', abort)\n}\n","import type { Context } from 'hono'\nimport {\n type AuthorizedRequest,\n beginPaymentExecution,\n dispatchSandboxStreamRich,\n markPaymentExecutionStarted,\n renewPaymentExecution,\n} from '../dispatch'\nimport type { GatewayConfig, SandboxUsageReceipt } from '../types'\nimport { claimTaskExecution, renewTaskExecution } from './execution-fence'\nimport { fail, ok } from './jsonrpc'\nimport {\n clearPaymentRecoveryMarker,\n releaseTaskPayment,\n} from './payment-recovery'\nimport {\n buildFinalizationRecord,\n clearFinalizationMarker,\n completeCanceledTask,\n markUsageRecorded,\n retainFinalizationForRecovery,\n withFinalizationRecord,\n} from './task-finalization'\nimport { clearTaskSubmission } from './task-submission-recovery'\nimport { bindRequestAbort, type TaskCancellationRegistry } from './task-cancellation'\nimport type { TaskLifecycle } from './task-lifecycle'\nimport {\n agentMessage,\n asError,\n compareAndSetTask,\n isTerminal,\n nowIso,\n persistTaskIfCurrent,\n shouldPreserveTask,\n withStatus,\n} from './task-state'\nimport type { TaskStateStore } from './task-state'\nimport {\n A2A_ERROR_CODES,\n type JSONRPCRequest,\n type StreamingEvent,\n type Task,\n type TaskArtifactUpdateEvent,\n type TaskStatusUpdateEvent,\n} from './types'\nimport { responseTextToArtifact } from './translate'\n\nexport interface MessageStreamExecutionDependencies {\n taskStore: TaskStateStore\n config: GatewayConfig\n lifecycle: TaskLifecycle\n cancels: TaskCancellationRegistry\n deliverPush: (task: Task) => Promise<void>\n reportStreamError: (authz: AuthorizedRequest, error: unknown) => Promise<void>\n}\n\nexport async function executeMessageStream(\n c: Context,\n req: JSONRPCRequest,\n deps: MessageStreamExecutionDependencies,\n authz: AuthorizedRequest,\n task: Task,\n): Promise<Response> {\n const controller = deps.cancels.register(task.id)\n const lifecycle = deps.lifecycle\n const detachRequestAbort = bindRequestAbort(c.req.raw.signal, controller)\n const workingStatus: TaskStatusUpdateEvent = {\n kind: 'status-update',\n taskId: task.id,\n contextId: task.contextId,\n status: { state: 'working', timestamp: nowIso() },\n final: false,\n }\n if (isTerminal(task.status.state)) {\n detachRequestAbort()\n deps.cancels.clear(task.id)\n return c.json(ok(req.id, task))\n }\n let workingTask: Task = task.status.state === 'working'\n ? task\n : { ...task, status: workingStatus.status }\n if (task.status.state !== 'working' && !await compareAndSetTask(deps.taskStore, task, workingTask)) {\n detachRequestAbort()\n deps.cancels.clear(task.id)\n const current = await releaseTaskPayment(\n authz,\n await deps.taskStore.get(task.id) ?? task,\n lifecycle.payment,\n 'A2A task changed before execution started',\n false,\n )\n if (current.status.state === 'canceled') return c.json(ok(req.id, current))\n return c.json(fail(req.id, A2A_ERROR_CODES.INVALID_PARAMS, `task '${task.id}' changed before execution`))\n }\n let responseText = ''\n let usage: SandboxUsageReceipt | undefined\n let workObserved = false\n\n const stream = new ReadableStream({\n start(ctrl) {\n void (async () => {\n const encoder = new TextEncoder()\n const send = (event: StreamingEvent) => {\n if (ctrl.desiredSize === null) return\n try {\n ctrl.enqueue(encoder.encode(`data: ${JSON.stringify(ok(req.id, event))}\\n\\n`))\n } catch {\n // The client can cancel between the desiredSize check and enqueue.\n }\n }\n\n let inputRequiredPrompt: string | undefined\n let inputRequiredSeen = false\n let finalizationLeaseId: string | undefined\n try {\n send(workingStatus)\n\n for await (const event of dispatchSandboxStreamRich(\n authz.agent,\n authz.userMessage,\n authz.consumerId,\n deps.config,\n controller.signal,\n task.id,\n authz.maxOutputTokens,\n async () => {\n workingTask = await claimTaskExecution(deps.taskStore, workingTask, authz.requestId)\n await beginPaymentExecution(authz, deps.config)\n },\n authz.paymentOperation !== undefined || authz.mppChargeOperation !== undefined,\n async () => {\n workObserved = true\n await markPaymentExecutionStarted(authz, deps.config)\n },\n authz.executionBudget.maxInputTokens,\n async () => {\n workingTask = await renewTaskExecution(deps.taskStore, task.id, authz.requestId)\n await renewPaymentExecution(authz, deps.config)\n },\n )) {\n if (event.kind === 'text') {\n responseText += event.delta\n workObserved = true\n const artifactEvent: TaskArtifactUpdateEvent = {\n kind: 'artifact-update',\n taskId: task.id,\n contextId: task.contextId,\n artifact: {\n artifactId: `${task.id}-artifact-0`,\n name: 'response',\n parts: [{ kind: 'text', text: event.delta }],\n },\n append: true,\n }\n send(artifactEvent)\n } else if (event.kind === 'activity') {\n workObserved = true\n } else if (event.kind === 'usage') {\n usage = event.usage\n } else {\n inputRequiredSeen = true\n inputRequiredPrompt = event.prompt\n workObserved = true\n }\n }\n\n if (controller.signal.aborted) {\n const canceled = await completeCanceledTask(\n authz,\n workingTask,\n responseText,\n usage,\n workObserved,\n lifecycle.finalization,\n )\n send({\n kind: 'status-update',\n taskId: task.id,\n contextId: task.contextId,\n status: canceled.status,\n final: true,\n })\n return\n }\n\n if (!usage) throw new Error('sandbox did not provide a usage receipt')\n const finalizationArtifact = responseTextToArtifact(responseText, `${task.id}-artifact-0`)\n const finalization = buildFinalizationRecord(\n authz,\n usage,\n finalizationArtifact,\n inputRequiredSeen,\n inputRequiredPrompt,\n )\n // Let the durable task-store CAS decide the cancellation race.\n const finalizingTask = withFinalizationRecord(workingTask, finalization)\n if (!await compareAndSetTask(deps.taskStore, workingTask, finalizingTask)) {\n const currentTask = await deps.taskStore.get(task.id)\n if (currentTask?.status.state === 'canceled') {\n const canceled = await completeCanceledTask(\n authz,\n currentTask,\n responseText,\n usage,\n workObserved,\n lifecycle.finalization,\n )\n send({\n kind: 'status-update',\n taskId: task.id,\n contextId: task.contextId,\n status: canceled.status,\n final: true,\n })\n return\n }\n await releaseTaskPayment(\n authz,\n task,\n lifecycle.payment,\n 'A2A task changed before payment settlement',\n workObserved || usage !== undefined,\n )\n return\n }\n finalizationLeaseId = finalization.lease.id\n deps.cancels.beginFinalization(task.id)\n let usageRecordedTask = finalizingTask\n await lifecycle.finalization.settle(authz, usage, {\n onUsageRecorded: async () => {\n usageRecordedTask = await markUsageRecorded(deps.taskStore, usageRecordedTask)\n },\n })\n usageRecordedTask = await markUsageRecorded(deps.taskStore, usageRecordedTask)\n\n if (inputRequiredSeen) {\n const paused = withStatus(\n clearPaymentRecoveryMarker(clearFinalizationMarker(usageRecordedTask)),\n 'input-required',\n inputRequiredPrompt ? agentMessage(task, inputRequiredPrompt) : undefined,\n responseText\n ? [responseTextToArtifact(responseText, `${task.id}-artifact-0`)]\n : task.artifacts,\n )\n if (!await compareAndSetTask(deps.taskStore, usageRecordedTask, paused)) {\n const currentTask = await deps.taskStore.get(task.id)\n if (currentTask) {\n send({\n kind: 'status-update',\n taskId: task.id,\n contextId: task.contextId,\n status: currentTask.status,\n final: isTerminal(currentTask.status.state) || currentTask.status.state === 'input-required',\n })\n }\n return\n }\n send({\n kind: 'status-update',\n taskId: task.id,\n contextId: task.contextId,\n status: paused.status,\n final: true,\n })\n return\n }\n\n const completed = withStatus(\n clearPaymentRecoveryMarker(clearFinalizationMarker(usageRecordedTask)),\n 'completed',\n undefined,\n [responseTextToArtifact(responseText, `${task.id}-artifact-0`)],\n )\n if (!await compareAndSetTask(deps.taskStore, usageRecordedTask, completed)) {\n const currentTask = await deps.taskStore.get(task.id)\n if (currentTask) {\n send({\n kind: 'status-update',\n taskId: task.id,\n contextId: task.contextId,\n status: currentTask.status,\n final: isTerminal(currentTask.status.state) || currentTask.status.state === 'input-required',\n })\n }\n return\n }\n send({\n kind: 'artifact-update',\n taskId: task.id,\n contextId: task.contextId,\n artifact: {\n artifactId: `${task.id}-artifact-0`,\n name: 'response',\n parts: [{ kind: 'text', text: '' }],\n },\n append: true,\n lastChunk: true,\n })\n send({\n kind: 'status-update',\n taskId: task.id,\n contextId: task.contextId,\n status: completed.status,\n final: true,\n })\n await lifecycle.finalization.deliverPush(completed)\n } catch (err) {\n const releasedTask = await releaseTaskPayment(\n authz,\n task,\n lifecycle.payment,\n err instanceof Error ? err.message : String(err),\n workObserved || usage !== undefined,\n )\n if (finalizationLeaseId) {\n const retained = await retainFinalizationForRecovery(\n deps.taskStore,\n task.id,\n finalizationLeaseId,\n asError(err),\n )\n if (retained) {\n send({\n kind: 'status-update',\n taskId: task.id,\n contextId: task.contextId,\n status: retained.status,\n final: false,\n })\n }\n return\n }\n const currentTask = await deps.taskStore.get(task.id) ?? releasedTask\n const failed = shouldPreserveTask(currentTask)\n ? currentTask\n : withStatus(clearTaskSubmission(currentTask), 'failed')\n try {\n const persisted = await persistTaskIfCurrent(deps.taskStore, currentTask, failed)\n send({\n kind: 'status-update',\n taskId: task.id,\n contextId: task.contextId,\n status: persisted.status,\n final: true,\n })\n await deps.deliverPush(persisted)\n } catch (taskError) {\n console.error(\n `[a2a] failed to persist failed task ${task.id}:`,\n taskError instanceof Error ? taskError.message : String(taskError),\n )\n }\n try {\n await deps.reportStreamError(authz, err)\n } catch (observerError) {\n console.error(\n `[a2a] stream observer failed for ${authz.requestId}:`,\n observerError instanceof Error ? observerError.message : String(observerError),\n )\n }\n } finally {\n detachRequestAbort()\n deps.cancels.clear(task.id)\n try {\n if (ctrl.desiredSize !== null) ctrl.close()\n } catch {\n // The response may already be closed by client cancellation.\n }\n }\n })()\n },\n cancel() {\n controller.abort()\n },\n })\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'X-Request-Id': authz.requestId,\n 'X-Agent-Slug': authz.agent.slug,\n 'X-Task-Id': task.id,\n ...(authz.mppChargeOperation\n ? { 'Payment-Receipt': authz.mppChargeOperation.receipt }\n : {}),\n ...(authz.paymentRecoveryId\n ? { 'X-Payment-Operation-Id': authz.paymentRecoveryId }\n : {}),\n },\n })\n}\n","/**\n * @stable\n *\n * A2A push notifications — a webhook delivery channel that fires when a task\n * reaches a terminal state (`completed`, `canceled`, `failed`, `rejected`).\n * The protocol specifies four JSON-RPC methods (`tasks/pushNotificationConfig/`\n * {set, get, list, delete}) for registering / inspecting / removing configs,\n * plus the delivery contract: an HTTP POST to the registered URL with the\n * task envelope as the body and an HMAC-SHA256 signature for verification.\n *\n * This is the minimum shape long-horizon agents need. A consumer that finishes\n * a task in 30 minutes can't keep an SSE stream open against a Worker (CPU\n * limits) or an unauthenticated browser tab (network drops) — they need a\n * fire-and-forget endpoint the gateway calls when the task is done.\n *\n * Out of scope for the first pass: retries, queue durability, partial-state\n * notifications. If the webhook returns non-2xx or the request fails, the\n * gateway logs and moves on — the consumer's endpoint should idempotently\n * pull state via `tasks/get` rather than rely on at-least-once delivery.\n *\n * @example registering a webhook\n * {\n * \"jsonrpc\": \"2.0\", \"id\": 1, \"method\": \"tasks/pushNotificationConfig/set\",\n * \"params\": {\n * \"taskId\": \"task_abc\",\n * \"pushNotificationConfig\": {\n * \"id\": \"cfg_1\",\n * \"url\": \"https://my-consumer.example.com/agent/done\",\n * \"token\": \"my-shared-secret-not-the-hmac-secret\"\n * }\n * }\n * }\n *\n * @example webhook delivery\n * POST https://my-consumer.example.com/agent/done\n * X-A2A-Notification-Token: my-shared-secret-not-the-hmac-secret\n * X-A2A-Signature: sha256=<hex(HMAC-SHA256(webhookSecret, body))>\n * Content-Type: application/json\n * { \"taskId\": \"task_abc\", \"state\": \"completed\", \"task\": { ...full Task... } }\n */\n\nimport type { SqlAdapter } from './task-store-sql'\nimport type { Task } from './types'\n\n/**\n * Authentication metadata for the webhook itself. The A2A spec leaves this\n * to consumers — the most common shape is a bearer token the gateway sends as\n * `Authorization: <scheme> <credential>`. We pass it through verbatim.\n */\nexport interface PushNotificationAuthentication {\n schemes: string[]\n credentials?: string\n}\n\n/**\n * Per-task push notification configuration. A task can have multiple configs\n * (e.g. one for the consumer's own webhook + one for an audit log endpoint).\n */\nexport interface PushNotificationConfig {\n /** Stable id within the task's config set. Required for get/delete addressing. */\n id: string\n /** HTTPS URL the gateway will POST to. */\n url: string\n /**\n * Opaque token the gateway sends back as `X-A2A-Notification-Token` so the\n * webhook can verify the call originated from a registration the consumer\n * authorized. Distinct from the HMAC signature (which proves the body\n * wasn't tampered with) — this proves the registration is recognised.\n */\n token?: string\n /** Optional webhook-side auth metadata. */\n authentication?: PushNotificationAuthentication\n}\n\nexport interface TaskPushNotificationConfig {\n taskId: string\n pushNotificationConfig: PushNotificationConfig\n}\n\n/**\n * Storage for push configs. The default in-memory store is fine for single\n * Worker instances + tests; production multi-instance deployments need\n * `SqlPushNotificationStore` (or any other shared-state adapter) so a config\n * registered on instance A is visible to a delivery firing from instance B.\n */\nexport interface PushNotificationStore {\n set(taskId: string, config: PushNotificationConfig): Promise<void>\n get(taskId: string, configId: string): Promise<PushNotificationConfig | undefined>\n list(taskId: string): Promise<PushNotificationConfig[]>\n delete(taskId: string, configId: string): Promise<void>\n}\n\n/**\n * Validate a push destination before the gateway sends task data to it.\n *\n * The default policy rejects URL credentials, non-HTTPS schemes, IP literals\n * in reserved ranges, and common private hostnames. Production deployments\n * should also provide `GatewayConfig.a2a.pushUrlValidator` for DNS policy.\n */\nexport function validatePushNotificationUrl(value: string): URL | undefined {\n let url: URL\n try {\n url = new URL(value)\n } catch {\n return undefined\n }\n if (\n url.protocol !== 'https:' ||\n url.username !== '' ||\n url.password !== '' ||\n isPrivatePushHostname(url.hostname)\n ) {\n return undefined\n }\n return url\n}\n\nfunction isPrivatePushHostname(value: string): boolean {\n const hostname = value.toLowerCase().replace(/\\.$/, '')\n const ipv4 = parseIpv4(hostname)\n if (ipv4) {\n const [first, second] = ipv4\n return first === 0 ||\n first === 10 ||\n first === 127 ||\n (first === 100 && second >= 64 && second <= 127) ||\n (first === 169 && second === 254) ||\n (first === 172 && second >= 16 && second <= 31) ||\n (first === 192 && second === 0) ||\n (first === 192 && second === 168) ||\n (first === 198 && (second === 18 || second === 19)) ||\n (first === 203 && second === 0) ||\n first >= 224\n }\n const ipv6 = hostname.replace(/^\\[|\\]$/g, '')\n if (\n ipv6 === '::' ||\n ipv6 === '::1' ||\n ipv6.startsWith('fc') ||\n ipv6.startsWith('fd') ||\n ipv6.startsWith('fe8') ||\n ipv6.startsWith('fe9') ||\n ipv6.startsWith('fea') ||\n ipv6.startsWith('feb') ||\n // WHATWG URL normalizes dotted IPv4-mapped IPv6 literals to hexadecimal.\n // Reject the whole mapped range instead of matching only dotted forms.\n ipv6.startsWith('::ffff:') ||\n // IPv4-compatible IPv6 literals can also embed loopback/private IPv4.\n (ipv6.startsWith('::') && ipv6 !== '::1')\n ) return true\n return hostname === 'localhost' ||\n hostname === 'localhost.localdomain' ||\n hostname === 'metadata' ||\n hostname === 'metadata.google.internal' ||\n hostname.endsWith('.localhost') ||\n hostname.endsWith('.local') ||\n hostname.endsWith('.internal') ||\n hostname.endsWith('.intranet') ||\n hostname.endsWith('.lan') ||\n hostname.endsWith('.home')\n}\n\nfunction parseIpv4(value: string): [number, number, number, number] | undefined {\n const parts = value.split('.')\n if (parts.length !== 4 || parts.some((part) => !/^\\d{1,3}$/.test(part))) return undefined\n const numbers = parts.map(Number)\n if (numbers.some((part) => part > 255)) return undefined\n return numbers as [number, number, number, number]\n}\n\nexport class InMemoryPushNotificationStore implements PushNotificationStore {\n private readonly byTask = new Map<string, Map<string, PushNotificationConfig>>()\n\n async set(taskId: string, config: PushNotificationConfig): Promise<void> {\n let configs = this.byTask.get(taskId)\n if (!configs) {\n configs = new Map()\n this.byTask.set(taskId, configs)\n }\n configs.set(config.id, { ...config })\n }\n\n async get(taskId: string, configId: string): Promise<PushNotificationConfig | undefined> {\n const cfg = this.byTask.get(taskId)?.get(configId)\n return cfg ? { ...cfg } : undefined\n }\n\n async list(taskId: string): Promise<PushNotificationConfig[]> {\n const configs = this.byTask.get(taskId)\n if (!configs) return []\n return [...configs.values()].map((c) => ({ ...c }))\n }\n\n async delete(taskId: string, configId: string): Promise<void> {\n const configs = this.byTask.get(taskId)\n if (!configs) return\n configs.delete(configId)\n if (configs.size === 0) this.byTask.delete(taskId)\n }\n}\n\nconst PUSH_TABLE_DDL = (table: string) => `\n CREATE TABLE IF NOT EXISTS ${table} (\n task_id TEXT NOT NULL,\n config_id TEXT NOT NULL,\n url TEXT NOT NULL,\n token TEXT,\n authentication TEXT,\n PRIMARY KEY (task_id, config_id)\n )\n`\n\n/** SQL-backed push config store. Schema: one row per (taskId, configId). */\nexport class SqlPushNotificationStore implements PushNotificationStore {\n constructor(\n private readonly db: SqlAdapter,\n private readonly table: string = 'a2a_push_configs',\n ) {}\n\n async migrate(): Promise<void> {\n await this.db.exec(PUSH_TABLE_DDL(this.table))\n }\n\n async set(taskId: string, config: PushNotificationConfig): Promise<void> {\n const auth = config.authentication ? JSON.stringify(config.authentication) : null\n await this.db.exec(\n `INSERT INTO ${this.table} (task_id, config_id, url, token, authentication) VALUES (?, ?, ?, ?, ?)\n ON CONFLICT (task_id, config_id) DO UPDATE SET\n url = excluded.url,\n token = excluded.token,\n authentication = excluded.authentication`,\n [taskId, config.id, config.url, config.token ?? null, auth],\n )\n }\n\n async get(taskId: string, configId: string): Promise<PushNotificationConfig | undefined> {\n const rows = await this.db.query<{\n config_id: string\n url: string\n token: string | null\n authentication: string | null\n }>(\n `SELECT config_id, url, token, authentication FROM ${this.table} WHERE task_id = ? AND config_id = ?`,\n [taskId, configId],\n )\n const row = rows[0]\n if (!row) return undefined\n return {\n id: row.config_id,\n url: row.url,\n token: row.token ?? undefined,\n authentication: row.authentication\n ? (JSON.parse(row.authentication) as PushNotificationAuthentication)\n : undefined,\n }\n }\n\n async list(taskId: string): Promise<PushNotificationConfig[]> {\n const rows = await this.db.query<{\n config_id: string\n url: string\n token: string | null\n authentication: string | null\n }>(\n `SELECT config_id, url, token, authentication FROM ${this.table} WHERE task_id = ?`,\n [taskId],\n )\n return rows.map((row) => ({\n id: row.config_id,\n url: row.url,\n token: row.token ?? undefined,\n authentication: row.authentication\n ? (JSON.parse(row.authentication) as PushNotificationAuthentication)\n : undefined,\n }))\n }\n\n async delete(taskId: string, configId: string): Promise<void> {\n await this.db.exec(\n `DELETE FROM ${this.table} WHERE task_id = ? AND config_id = ?`,\n [taskId, configId],\n )\n }\n}\n\ninterface PushDeliveryOptions {\n task: Task\n store: PushNotificationStore\n webhookSecret?: string\n /** Atomically claim one terminal delivery before its external side effect. */\n claimDelivery?: (\n taskId: string,\n configId: string,\n terminalState: Task['status']['state'],\n ) => Promise<boolean>\n /** Inject for tests. Defaults to global `fetch`. */\n fetcher?: typeof fetch\n /** Optional DNS-aware host policy for production deployments. */\n urlValidator?: (url: URL) => boolean | Promise<boolean>\n /** Require `urlValidator` before sending from a production gateway. */\n requireUrlValidator?: boolean\n /** Optional callback so the gateway's observer can log delivery outcomes. */\n onDelivery?: (result: PushDeliveryResult) => void\n}\n\nexport type PushNotificationDeliveryOptions = Omit<PushDeliveryOptions, 'webhookSecret'> & {\n webhookSecret: string\n}\n\n/**\n * Send signed webhooks for a terminal task.\n *\n * A non-empty HMAC secret is mandatory. This public production path cannot\n * send an unsigned request.\n */\nexport async function deliverPushNotifications(\n args: PushNotificationDeliveryOptions,\n): Promise<PushDeliveryResult[]> {\n if (typeof args.webhookSecret !== 'string' || args.webhookSecret.trim().length === 0) {\n throw new Error('deliverPushNotifications requires a non-empty webhookSecret')\n }\n return deliverPushNotificationsInternal(args)\n}\n\n/**\n * Deliver unsigned webhooks only for explicit local demo mode.\n *\n * Production callers must use `deliverPushNotifications`.\n */\nexport async function deliverDemoPushNotifications(\n args: Omit<PushNotificationDeliveryOptions, 'webhookSecret'>,\n): Promise<PushDeliveryResult[]> {\n return deliverPushNotificationsInternal(args)\n}\n\nasync function deliverPushNotificationsInternal(args: PushDeliveryOptions): Promise<PushDeliveryResult[]> {\n const fetcher = args.fetcher ?? fetch\n const configs = await args.store.list(args.task.id)\n const body = JSON.stringify({\n taskId: args.task.id,\n state: args.task.status.state,\n task: args.task,\n })\n const signature = args.webhookSecret\n ? `sha256=${await hmacSha256Hex(args.webhookSecret, body)}`\n : undefined\n\n const results: PushDeliveryResult[] = []\n for (const config of configs) {\n // Validate before claiming so policy rejection remains retryable.\n try {\n const url = validatePushNotificationUrl(config.url)\n if (!url) {\n throw new Error('push notification URL is not a safe HTTPS destination')\n }\n if (args.requireUrlValidator && !args.urlValidator) {\n throw new Error('push notification URL validation is not configured')\n }\n if (args.urlValidator && !await args.urlValidator(url)) {\n throw new Error('push notification URL was rejected by host policy')\n }\n } catch (err) {\n const result: PushDeliveryResult = {\n taskId: args.task.id,\n configId: config.id,\n url: config.url,\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n }\n args.onDelivery?.(result)\n results.push(result)\n continue\n }\n\n if (\n args.claimDelivery &&\n !await args.claimDelivery(args.task.id, config.id, args.task.status.state)\n ) {\n continue\n }\n const headers: Record<string, string> = { 'Content-Type': 'application/json' }\n if (config.token) headers['X-A2A-Notification-Token'] = config.token\n if (signature) headers['X-A2A-Signature'] = signature\n if (config.authentication?.credentials) {\n const scheme = config.authentication.schemes[0] ?? 'Bearer'\n headers.Authorization = `${scheme} ${config.authentication.credentials}`\n }\n\n let result: PushDeliveryResult\n try {\n const res = await fetcher(config.url, {\n method: 'POST',\n headers,\n body,\n // Never follow a user-controlled redirect. The redirected destination\n // could be an internal HTTP service or instance metadata endpoint.\n redirect: 'manual',\n })\n result = {\n taskId: args.task.id,\n configId: config.id,\n url: config.url,\n ok: res.ok,\n status: res.status,\n ...(res.status >= 300 && res.status < 400\n ? { error: 'push notification redirect rejected' }\n : {}),\n }\n } catch (err) {\n result = {\n taskId: args.task.id,\n configId: config.id,\n url: config.url,\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n }\n }\n args.onDelivery?.(result)\n results.push(result)\n }\n return results\n}\n\nexport interface PushDeliveryResult {\n taskId: string\n configId: string\n url: string\n ok: boolean\n status?: number\n error?: string\n}\n\n/**\n * HMAC-SHA256 via WebCrypto. Works on Workers, Node 19+, Bun, Deno. The\n * gateway requires WebCrypto for x402 verification already, so this adds no\n * new platform constraint.\n */\nasync function hmacSha256Hex(secret: string, body: string): Promise<string> {\n const enc = new TextEncoder()\n const key = await crypto.subtle.importKey(\n 'raw',\n enc.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n )\n const sig = await crypto.subtle.sign('HMAC', key, enc.encode(body))\n return [...new Uint8Array(sig)].map((b) => b.toString(16).padStart(2, '0')).join('')\n}\n","import {\n deliverDemoPushNotifications,\n deliverPushNotifications,\n type PushDeliveryResult,\n type PushNotificationDeliveryOptions,\n type PushNotificationStore,\n} from './push-notifications'\nimport type { Task } from './types'\nimport {\n compareAndSetTask,\n clearTaskMetadata,\n TERMINAL_STATES,\n type TaskStateStore,\n} from './task-state'\n\nconst PUSH_DELIVERY_METADATA_KEY = 'gatewayPushDelivery'\n\ninterface TaskPushDeliveryClaims {\n version: 1\n claims: Record<string, Task['status']['state']>\n}\n\nexport interface PushDeliveryDependencies {\n taskStore: TaskStateStore\n pushStore?: PushNotificationStore\n demoMode: boolean\n webhookSecret?: string\n fetcher?: PushNotificationDeliveryOptions['fetcher']\n urlValidator?: PushNotificationDeliveryOptions['urlValidator']\n onDeliveryFailure?: (task: Task, result: PushDeliveryResult) => void\n}\n\nexport async function deliverTaskPush(\n task: Task,\n deps: PushDeliveryDependencies,\n): Promise<void> {\n if (!deps.pushStore || !TERMINAL_STATES.has(task.status.state)) return\n const webhookSecret = deps.webhookSecret\n const hasWebhookSecret = typeof webhookSecret === 'string' && webhookSecret.trim().length > 0\n if (!deps.demoMode && !hasWebhookSecret) {\n console.error(`[agent-gateway] production A2A push requires a webhookSecret for task ${task.id}`)\n return\n }\n try {\n const deliveryTask = clearPushDeliveryClaims(task)\n const deliveryArgs: Omit<PushNotificationDeliveryOptions, 'webhookSecret'> = {\n task: deliveryTask,\n store: deps.pushStore,\n fetcher: deps.fetcher,\n urlValidator: deps.urlValidator,\n requireUrlValidator: !deps.demoMode,\n claimDelivery: (taskId, configId, terminalState) => claimTaskPushDelivery(\n deps.taskStore,\n taskId,\n configId,\n terminalState,\n ),\n onDelivery: (result) => {\n if (!result.ok) deps.onDeliveryFailure?.(task, result)\n },\n }\n if (hasWebhookSecret) {\n await deliverPushNotifications({ ...deliveryArgs, webhookSecret })\n } else {\n await deliverDemoPushNotifications(deliveryArgs)\n }\n } catch (err) {\n console.error(\n `[agent-gateway] push delivery threw for task ${task.id}: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n}\n\nasync function claimTaskPushDelivery(\n taskStore: TaskStateStore,\n taskId: string,\n configId: string,\n terminalState: Task['status']['state'],\n): Promise<boolean> {\n if (!TERMINAL_STATES.has(terminalState)) return false\n for (let attempt = 0; attempt < 16; attempt += 1) {\n const current = await taskStore.get(taskId)\n if (!current || current.status.state !== terminalState) return false\n const existing = readPushDeliveryClaims(current)\n if (existing?.claims[configId] === terminalState) return false\n const next: Task = {\n ...current,\n metadata: {\n ...(current.metadata ?? {}),\n [PUSH_DELIVERY_METADATA_KEY]: {\n version: 1,\n claims: {\n ...(existing?.claims ?? {}),\n [configId]: terminalState,\n },\n } satisfies TaskPushDeliveryClaims,\n },\n }\n if (await compareAndSetTask(taskStore, current, next)) return true\n }\n throw new Error(`A2A push delivery claim changed too many times for task '${taskId}'`)\n}\n\nfunction clearPushDeliveryClaims(task: Task): Task {\n return clearTaskMetadata(task, PUSH_DELIVERY_METADATA_KEY)\n}\n\nfunction readPushDeliveryClaims(task: Task): TaskPushDeliveryClaims | undefined {\n const raw = task.metadata?.[PUSH_DELIVERY_METADATA_KEY]\n if (!raw || typeof raw !== 'object') return undefined\n const record = raw as Partial<TaskPushDeliveryClaims>\n if (!record.claims || typeof record.claims !== 'object') return undefined\n const claims = Object.fromEntries(\n Object.entries(record.claims).filter(([, state]) =>\n typeof state === 'string' && TERMINAL_STATES.has(state as Task['status']['state']),\n ),\n ) as Record<string, Task['status']['state']>\n return record.version === 1 ? { version: 1, claims } : undefined\n}\n","import {\n type AuthorizedRequest,\n releasePayment,\n settleAndRecord,\n} from './dispatch'\nimport { assertMppChargeOperation } from './mpp-payment'\nimport {\n deserializePaymentOperation,\n PaymentRecoveryFenceError,\n recoveryTiming,\n updateOwnedPaymentRecovery,\n type PaymentRecoveryRecord,\n} from './payment-recovery'\nimport type { AgentMeta, GatewayConfig, SandboxUsageReceipt } from './types'\n\ninterface RecoveryWorkerOptions {\n now?: number\n /** Fresh wall-clock source for each row's lease and retry timestamps. */\n clock?: () => number\n workerId?: string\n}\n\nexport interface RecoverPaymentOptions extends RecoveryWorkerOptions {\n /** Process one requested row even when its normal retry time is later. */\n force?: boolean\n /** Exact receipt recovered from a durable protocol record, such as an A2A task. */\n usage?: SandboxUsageReceipt\n}\n\n/** Batch recovery never accepts receipt data because each receipt belongs to one row. */\nexport interface RecoverPaymentsOptions extends RecoveryWorkerOptions {\n limit?: number\n}\n\nexport interface PaymentRecoveryRun {\n scanned: number\n reconciled: number\n deferred: number\n failed: number\n}\n\n/** Scan and reconcile due payment rows. Safe to run concurrently on many workers. */\nexport async function recoverPayments(\n config: GatewayConfig,\n options: RecoverPaymentsOptions = {},\n): Promise<PaymentRecoveryRun> {\n const recovery = config.paymentRecovery\n if (!recovery) throw new Error('durable payment recovery is not configured')\n const scanNow = options.now ?? recoveryNow(options)\n const limit = options.limit ?? 100\n if (!Number.isSafeInteger(limit) || limit <= 0) {\n throw new Error('payment recovery limit must be a positive safe integer')\n }\n const due = await recovery.store.listDue(scanNow, limit)\n const run: PaymentRecoveryRun = { scanned: due.length, reconciled: 0, deferred: 0, failed: 0 }\n for (const candidate of due) {\n try {\n const result = await recoverPayment(candidate.id, config, {\n force: false,\n ...(options.clock ? { clock: options.clock } : {}),\n ...(options.workerId ? { workerId: options.workerId } : {}),\n })\n if (result?.state === 'reconciled') run.reconciled += 1\n else run.deferred += 1\n } catch {\n run.failed += 1\n }\n }\n return run\n}\n\n/** Reconcile one payment identity. Hosts can expose this through a private worker API. */\nexport async function recoverPayment(\n recoveryId: string,\n config: GatewayConfig,\n options: RecoverPaymentOptions = {},\n): Promise<PaymentRecoveryRecord | undefined> {\n const recovery = config.paymentRecovery\n if (!recovery) throw new Error('durable payment recovery is not configured')\n const scanNow = options.now ?? recoveryNow(options)\n const current = await recovery.store.get(recoveryId)\n if (!current || current.state === 'reconciled') return current\n if (!options.force && current.nextAttemptAt > scanNow) return current\n const now = options.now ?? recoveryNow(options)\n\n const leased = await acquireLease(\n current.id,\n config,\n options.workerId ? `${options.workerId}:${randomId()}` : randomId(),\n now,\n )\n if (!leased) return recovery.store.get(recoveryId)\n const fenceId = requireFence(leased)\n\n try {\n const ready = options.usage\n ? await persistRecoveredUsage(leased, options.usage, config, now)\n : leased\n await reconcileLeased(ready, config, now)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const failedAt = options.now ?? recoveryNow(options)\n try {\n await updateOwnedPaymentRecovery(recovery.store, recoveryId, fenceId, (record) => ({\n ...record,\n attempts: record.attempts + 1,\n lastError: message,\n lease: undefined,\n nextAttemptAt: failedAt + recoveryTiming(recovery).retryDelayMs,\n }), failedAt)\n } catch (updateError) {\n if (!(updateError instanceof PaymentRecoveryFenceError)) throw updateError\n }\n throw error\n }\n return recovery.store.get(recoveryId)\n}\n\nfunction recoveryNow(options: RecoveryWorkerOptions): number {\n return options.clock?.() ?? Date.now()\n}\n\nasync function reconcileLeased(\n record: PaymentRecoveryRecord,\n config: GatewayConfig,\n now: number,\n): Promise<void> {\n if (record.payment.kind === 'mpp-charge' && !record.payment.operation) {\n record = await recoverUnknownMppCharge(record, config, now)\n }\n if (record.state === 'reconciled') return\n\n if (record.state === 'claiming') {\n if (record.payment.kind === 'x402') {\n if (!config.x402.paymentOperations) {\n throw new Error('x402 payment recovery is not configured')\n }\n const recovered = await config.x402.paymentOperations.reclaimPayment(record.payment.operationId)\n if (recovered.state === 'not-found') {\n if (recovered.operationId !== record.payment.operationId) {\n throw new Error('x402 recovery operation id mismatch')\n }\n await completeRecord(record, config, now)\n return\n }\n if (recovered.state !== 'released' && recovered.state !== 'reclaimed') {\n throw new Error(`ambiguous x402 claim recovered in state ${recovered.state}`)\n }\n await completeRecord(record, config, now)\n return\n }\n throw new Error('MPP charge confirmation remains unresolved')\n }\n\n if (record.state === 'claimed' && !record.workStarted) {\n await releaseRecoveredPayment(record, config, 'request ended before sandbox execution', now)\n return\n }\n\n if (record.state === 'releasing') {\n await releaseRecoveredPayment(record, config, record.reason ?? 'payment recovery release', now)\n return\n }\n\n if (\n record.state === 'executing' ||\n record.state === 'retained' ||\n record.state === 'settling' ||\n (record.state === 'claimed' && record.workStarted)\n ) {\n if (!record.usage && record.fallbackAt !== undefined && record.fallbackAt > now) {\n await updateOwnedPaymentRecovery(\n config.paymentRecovery!.store,\n record.id,\n requireFence(record),\n (current) => ({\n ...current,\n lease: undefined,\n nextAttemptAt: record.fallbackAt!,\n }),\n now,\n )\n return\n }\n await settleRecoveredPayment(record, config)\n return\n }\n\n throw new Error(`payment recovery cannot reconcile state ${record.state}`)\n}\n\nasync function recoverUnknownMppCharge(\n record: PaymentRecoveryRecord,\n config: GatewayConfig,\n now: number,\n): Promise<PaymentRecoveryRecord> {\n if (record.payment.kind !== 'mpp-charge') return record\n const method = record.payment.method\n const operationId = record.payment.operationId\n const lifecycle = config.mpp?.charge\n if (!lifecycle || lifecycle.protocolVersion !== 1) {\n throw new Error('MPP charge recovery is not configured')\n }\n const result = await lifecycle.recoverPayment(operationId)\n if (!('protocolVersion' in result)) {\n if (result.operationId !== operationId) {\n throw new Error('MPP recovery operation id mismatch')\n }\n if (result.state === 'not-found') {\n await completeRecord(record, config, now)\n return requireRecord(record.id, config)\n }\n throw new Error('MPP charge confirmation is still pending')\n }\n assertMppChargeOperation(\n result,\n {\n operationId,\n requestId: record.attribution.requestId,\n method,\n },\n ['confirmed', 'releasing', 'released'],\n false,\n )\n return updateOwnedPaymentRecovery(\n config.paymentRecovery!.store,\n record.id,\n requireFence(record),\n (current) => ({\n ...current,\n state: result.state === 'released'\n ? 'reconciled'\n : result.state === 'releasing'\n ? 'releasing'\n : current.workStarted\n ? 'executing'\n : 'claimed',\n payment: { kind: 'mpp-charge', method, operationId, operation: result },\n ...(result.state === 'released'\n ? { reconciledAt: now, nextAttemptAt: Number.MAX_SAFE_INTEGER, lease: undefined }\n : {}),\n }),\n now,\n )\n}\n\nasync function releaseRecoveredPayment(\n record: PaymentRecoveryRecord,\n config: GatewayConfig,\n reason: string,\n now: number,\n): Promise<void> {\n const authz = authorizedRequest(record)\n if (record.payment.kind === 'x402') {\n if (!record.payment.operation) {\n if (!config.x402.paymentOperations) throw new Error('x402 payment recovery is not configured')\n const recovered = await config.x402.paymentOperations.reclaimPayment(record.payment.operationId)\n if (recovered.state === 'not-found') {\n if (recovered.operationId !== record.payment.operationId) {\n throw new Error('x402 recovery operation id mismatch')\n }\n await completeRecord(record, config, now)\n return\n }\n if (recovered.state !== 'released' && recovered.state !== 'reclaimed') {\n throw new Error(`x402 release recovered in state ${recovered.state}`)\n }\n await completeRecord(record, config, now)\n return\n }\n authz.paymentOperation = deserializePaymentOperation(record.payment.operation)\n authz.paymentOperationAcquired = true\n } else {\n if (!record.payment.operation) throw new Error('MPP release operation is missing')\n authz.mppChargeOperation = record.payment.operation\n }\n await releasePayment(authz, config, reason)\n}\n\nasync function settleRecoveredPayment(\n record: PaymentRecoveryRecord,\n config: GatewayConfig,\n): Promise<void> {\n const authz = authorizedRequest(record)\n if (record.payment.kind === 'x402') {\n if (!record.payment.operation) throw new Error('x402 settlement operation is missing')\n authz.paymentOperation = deserializePaymentOperation(record.payment.operation)\n authz.paymentOperationAcquired = true\n } else {\n if (!record.payment.operation) throw new Error('MPP settlement operation is missing')\n authz.mppChargeOperation = record.payment.operation\n }\n\n const fallback = record.settlementBasis === 'quoted-ceiling' || !record.usage\n const usage = record.usage ?? quotedCeilingUsage(record)\n const settlementBasis = fallback\n ? 'quoted-ceiling'\n : record.settlementBasis ?? 'usage-receipt'\n await settleAndRecord(\n recoveryAgent(record),\n authz,\n usage,\n config,\n config.observer,\n {\n usageAlreadyRecorded: record.usageRecorded,\n settlementBasis,\n ...(settlementBasis === 'quoted-ceiling' && record.payment.kind === 'x402'\n ? { paymentAmount: BigInt(record.attribution.requiredAmount) }\n : {}),\n },\n )\n}\n\nfunction quotedCeilingUsage(record: PaymentRecoveryRecord): SandboxUsageReceipt {\n const amount = BigInt(record.attribution.requiredAmount)\n const providerCostUsd = baseUnitsToNumber(amount, record.attribution.currencyDecimals)\n if (!Number.isFinite(providerCostUsd) || providerCostUsd < 0) {\n throw new Error('quoted payment ceiling cannot be represented as USD')\n }\n return {\n inputTokens: 0,\n outputTokens: 0,\n reasoningTokens: 0,\n toolTokens: 0,\n toolCallCount: 0,\n providerCostUsd,\n budgetEnforced: true,\n }\n}\n\nfunction baseUnitsToNumber(amount: bigint, decimals: number): number {\n const digits = amount.toString().padStart(decimals + 1, '0')\n if (decimals === 0) return Number(digits)\n const split = digits.length - decimals\n return Number(`${digits.slice(0, split)}.${digits.slice(split)}`)\n}\n\nfunction authorizedRequest(record: PaymentRecoveryRecord): AuthorizedRequest {\n const attribution = record.attribution\n return {\n agent: recoveryAgent(record),\n consumerId: attribution.consumerId,\n paymentMethod: attribution.paymentMethod,\n keyInfo: null,\n userMessage: '[payment recovery]',\n rateLimitRemaining: undefined,\n requestId: attribution.requestId,\n startMs: attribution.startMs,\n maxOutputTokens: attribution.maxOutputTokens,\n executionBudget: attribution.executionBudget,\n requiredPaymentAmount: BigInt(attribution.requiredAmount),\n paymentPayload: null,\n paymentRecoveryId: record.id,\n paymentRecoveryFence: requireFence(record),\n }\n}\n\nfunction recoveryAgent(record: PaymentRecoveryRecord): AgentMeta {\n const attribution = record.attribution\n return {\n id: attribution.agentId,\n ownerId: '[payment recovery]',\n slug: attribution.agentSlug,\n pricePerTokenUsd: attribution.pricePerTokenUsd,\n platformFeePercent: attribution.platformFeePercent,\n sandboxEndpoint: null,\n remoteSandboxId: null,\n remoteBearerToken: null,\n enabled: true,\n }\n}\n\nasync function acquireLease(\n id: string,\n config: GatewayConfig,\n workerId: string,\n now: number,\n): Promise<PaymentRecoveryRecord | undefined> {\n const recovery = config.paymentRecovery!\n for (let attempt = 0; attempt < 16; attempt += 1) {\n const current = await recovery.store.get(id)\n if (!current || current.state === 'reconciled') return current\n if (current.lease && current.lease.expiresAt > now) return undefined\n const next: PaymentRecoveryRecord = {\n ...current,\n revision: current.revision + 1,\n lease: { id: workerId, expiresAt: now + recoveryTiming(recovery).leaseMs },\n updatedAt: now,\n }\n if (await recovery.store.compareAndSet(current, next)) return next\n }\n throw new Error(`payment recovery record ${id} changed too many times`)\n}\n\nasync function completeRecord(\n record: PaymentRecoveryRecord,\n config: GatewayConfig,\n now: number,\n): Promise<void> {\n await updateOwnedPaymentRecovery(\n config.paymentRecovery!.store,\n record.id,\n requireFence(record),\n (current) => ({\n ...current,\n state: 'reconciled',\n lease: undefined,\n lastError: undefined,\n nextAttemptAt: Number.MAX_SAFE_INTEGER,\n reconciledAt: now,\n }),\n now,\n )\n}\n\nasync function requireRecord(id: string, config: GatewayConfig): Promise<PaymentRecoveryRecord> {\n const record = await config.paymentRecovery!.store.get(id)\n if (!record) throw new Error(`payment recovery record ${id} was not found`)\n return record\n}\n\nfunction randomId(): string {\n return globalThis.crypto.randomUUID()\n}\n\nfunction requireFence(record: PaymentRecoveryRecord): string {\n if (!record.lease?.id) throw new Error(`payment recovery record ${record.id} has no owner fence`)\n return record.lease.id\n}\n\nasync function persistRecoveredUsage(\n record: PaymentRecoveryRecord,\n usage: SandboxUsageReceipt,\n config: GatewayConfig,\n now: number,\n): Promise<PaymentRecoveryRecord> {\n assertRecoveryUsage(usage)\n return updateOwnedPaymentRecovery(\n config.paymentRecovery!.store,\n record.id,\n requireFence(record),\n (current) => {\n if (current.usage && !sameUsage(current.usage, usage)) {\n throw new Error('payment recovery receipt does not match persisted usage')\n }\n return {\n ...current,\n state: 'settling',\n workStarted: true,\n usage,\n settlementBasis: 'usage-receipt',\n nextAttemptAt: now,\n }\n },\n now,\n )\n}\n\nfunction assertRecoveryUsage(usage: SandboxUsageReceipt): void {\n for (const [name, value] of [\n ['inputTokens', usage.inputTokens],\n ['outputTokens', usage.outputTokens],\n ['reasoningTokens', usage.reasoningTokens],\n ['toolTokens', usage.toolTokens],\n ['toolCallCount', usage.toolCallCount],\n ] as const) {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(`payment recovery ${name} must be a non-negative safe integer`)\n }\n }\n if (!Number.isFinite(usage.providerCostUsd) || usage.providerCostUsd < 0) {\n throw new Error('payment recovery providerCostUsd must be finite and non-negative')\n }\n if (usage.budgetEnforced !== true) {\n throw new Error('payment recovery receipt must confirm budget enforcement')\n }\n}\n\nfunction sameUsage(left: SandboxUsageReceipt, right: SandboxUsageReceipt): boolean {\n return left.inputTokens === right.inputTokens &&\n left.outputTokens === right.outputTokens &&\n left.reasoningTokens === right.reasoningTokens &&\n left.toolTokens === right.toolTokens &&\n left.toolCallCount === right.toolCallCount &&\n left.providerCostUsd === right.providerCostUsd &&\n left.budgetEnforced === right.budgetEnforced\n}\n","import {\n type GatewayState,\n releasePayment,\n releasePaymentAfterFailure,\n settleAndRecord,\n} from '../dispatch'\nimport { recoverPayment as recoverDurablePayment } from '../payment-recovery-worker'\nimport type { GatewayConfig } from '../types'\nimport { releaseTaskPayment } from './payment-recovery'\nimport type { PaymentRecoveryDependencies } from './payment-recovery'\nimport type { TaskFinalizationDependencies } from './task-finalization'\nimport type { Task } from './types'\nimport type { TaskStateStore } from './task-state'\n\nexport interface TaskLifecycleDependencies {\n taskStore: TaskStateStore\n config: GatewayConfig\n state: GatewayState\n deliverPush: (task: Task) => Promise<void>\n}\n\nexport interface TaskLifecycle {\n payment: PaymentRecoveryDependencies\n finalization: TaskFinalizationDependencies\n}\n\nexport function createTaskLifecycle(deps: TaskLifecycleDependencies): TaskLifecycle {\n const payment: PaymentRecoveryDependencies = {\n taskStore: deps.taskStore,\n paymentOperations: deps.config.x402.paymentOperations,\n paymentRecovery: deps.config.paymentRecovery,\n releasePayment: (authz, reason) => releasePayment(authz, deps.config, reason),\n releasePaymentAfterFailure: (authz, reason, workObserved) =>\n releasePaymentAfterFailure(authz, deps.config, reason, workObserved),\n recoverDurablePayment: (recoveryId, options) =>\n recoverDurablePayment(recoveryId, deps.config, options),\n deliverPush: deps.deliverPush,\n }\n const finalization: TaskFinalizationDependencies = {\n taskStore: deps.taskStore,\n settle: (authz, usage, options) =>\n settleAndRecord(authz.agent, authz, usage, deps.config, deps.state.obs, options),\n resolveAgent: deps.config.resolveAgent,\n paymentOperations: deps.config.x402.paymentOperations,\n paymentRecovery: deps.config.paymentRecovery,\n recoverDurablePayment: (recoveryId, options) =>\n recoverDurablePayment(recoveryId, deps.config, options),\n releasePaymentAfterFailure: payment.releasePaymentAfterFailure,\n releaseTaskPayment: (authz, task, reason, workObserved) =>\n releaseTaskPayment(authz, task, payment, reason, workObserved),\n deliverPush: deps.deliverPush,\n }\n return { payment, finalization }\n}\n","import type { Context } from 'hono'\nimport { hasActiveTaskExecution } from './execution-fence'\nimport { fail, ok } from './jsonrpc'\nimport { releaseTaskPayment } from './payment-recovery'\nimport type { PaymentRecoveryDependencies } from './payment-recovery'\nimport { isTaskFinalizing } from './task-finalization'\nimport type { TaskCancellationRegistry } from './task-cancellation'\nimport {\n compareAndSetTask,\n isTerminal,\n withStatus,\n} from './task-state'\nimport type { TaskStateStore } from './task-state'\nimport {\n A2A_ERROR_CODES,\n type JSONRPCRequest,\n type Task,\n type TaskIdParams,\n type TaskStatusUpdateEvent,\n} from './types'\n\nexport interface TaskMethodDependencies {\n taskStore: TaskStateStore\n payment: PaymentRecoveryDependencies\n cancels: TaskCancellationRegistry\n authorizeTaskAccess: (\n c: Context,\n req: JSONRPCRequest,\n task: Task,\n ) => Promise<Response | undefined>\n recoverTask: (task: Task, requestedAgentSlug: string) => Promise<Task>\n deliverPush: (task: Task) => Promise<void>\n}\n\nexport async function handleTasksGet(\n c: Context,\n req: JSONRPCRequest,\n deps: TaskMethodDependencies,\n): Promise<Response> {\n const params = req.params as TaskIdParams | undefined\n if (!params || typeof params.id !== 'string') {\n return c.json(fail(req.id, A2A_ERROR_CODES.INVALID_PARAMS, 'params.id required'))\n }\n const storedTask = await deps.taskStore.get(params.id)\n if (!storedTask) {\n return c.json(fail(req.id, A2A_ERROR_CODES.TASK_NOT_FOUND, `task '${params.id}' not found`))\n }\n const accessError = await deps.authorizeTaskAccess(c, req, storedTask)\n if (accessError) return accessError\n const task = await deps.recoverTask(storedTask, c.req.param('slug') ?? '')\n return c.json(ok(req.id, task))\n}\n\nexport async function handleTasksCancel(\n c: Context,\n req: JSONRPCRequest,\n deps: TaskMethodDependencies,\n): Promise<Response> {\n const params = req.params as TaskIdParams | undefined\n if (!params || typeof params.id !== 'string') {\n return c.json(fail(req.id, A2A_ERROR_CODES.INVALID_PARAMS, 'params.id required'))\n }\n const storedTask = await deps.taskStore.get(params.id)\n if (!storedTask) {\n return c.json(fail(req.id, A2A_ERROR_CODES.TASK_NOT_FOUND, `task '${params.id}' not found`))\n }\n const accessError = await deps.authorizeTaskAccess(c, req, storedTask)\n if (accessError) return accessError\n const task = await deps.recoverTask(storedTask, c.req.param('slug') ?? '')\n if (isTerminal(task.status.state)) {\n return c.json(\n fail(\n req.id,\n A2A_ERROR_CODES.TASK_NOT_CANCELABLE,\n `task '${params.id}' is in terminal state '${task.status.state}'`,\n ),\n )\n }\n if (\n isTaskFinalizing(task) ||\n deps.cancels.isFinalizing(task.id) ||\n (hasActiveTaskExecution(task) && !deps.cancels.has(task.id))\n ) {\n return c.json(\n fail(\n req.id,\n A2A_ERROR_CODES.TASK_NOT_CANCELABLE,\n hasActiveTaskExecution(task)\n ? `task '${task.id}' has an active execution fence`\n : `task '${task.id}' is being finalized`,\n ),\n )\n }\n let candidate = task\n for (let attempt = 0; attempt < 8; attempt += 1) {\n if (isTerminal(candidate.status.state)) {\n return c.json(\n fail(req.id, A2A_ERROR_CODES.TASK_NOT_CANCELABLE, `task '${task.id}' changed before cancellation`),\n )\n }\n if (isTaskFinalizing(candidate)) {\n return c.json(\n fail(req.id, A2A_ERROR_CODES.TASK_NOT_CANCELABLE, `task '${task.id}' is being finalized`),\n )\n }\n if (hasActiveTaskExecution(candidate) && !deps.cancels.has(candidate.id)) {\n return c.json(\n fail(req.id, A2A_ERROR_CODES.TASK_NOT_CANCELABLE, `task '${task.id}' has an active execution fence`),\n )\n }\n const canceled = withStatus(candidate, 'canceled')\n if (await compareAndSetTask(deps.taskStore, candidate, canceled)) {\n const stillActive = deps.cancels.cancel(task.id)\n if (!stillActive) await deps.deliverPush(canceled)\n return c.json(ok(req.id, canceled))\n }\n const current = await deps.taskStore.get(task.id)\n if (!current) {\n return c.json(fail(req.id, A2A_ERROR_CODES.TASK_NOT_FOUND, `task '${task.id}' not found`))\n }\n candidate = current\n }\n return c.json(fail(req.id, A2A_ERROR_CODES.INTERNAL_ERROR, 'task changed before cancellation'))\n}\n\nexport async function handleTasksResubscribe(\n c: Context,\n req: JSONRPCRequest,\n deps: TaskMethodDependencies,\n): Promise<Response> {\n const params = req.params as TaskIdParams | undefined\n if (!params || typeof params.id !== 'string') {\n return c.json(fail(req.id, A2A_ERROR_CODES.INVALID_PARAMS, 'params.id required'))\n }\n const storedTask = await deps.taskStore.get(params.id)\n if (!storedTask) {\n return c.json(fail(req.id, A2A_ERROR_CODES.TASK_NOT_FOUND, `task '${params.id}' not found`))\n }\n const accessError = await deps.authorizeTaskAccess(c, req, storedTask)\n if (accessError) return accessError\n const task = await deps.recoverTask(storedTask, c.req.param('slug') ?? '')\n const event: TaskStatusUpdateEvent = {\n kind: 'status-update',\n taskId: task.id,\n contextId: task.contextId,\n status: task.status,\n final: isTerminal(task.status.state) || task.status.state === 'input-required',\n }\n const encoder = new TextEncoder()\n const stream = new ReadableStream({\n start(ctrl) {\n ctrl.enqueue(encoder.encode(`data: ${JSON.stringify(ok(req.id, event))}\\n\\n`))\n ctrl.close()\n },\n })\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'X-Task-Id': task.id,\n },\n })\n}\n","import type { Context } from 'hono'\nimport {\n validatePushNotificationUrl,\n type PushNotificationStore,\n type TaskPushNotificationConfig,\n} from './push-notifications'\nimport type { TaskStateStore } from './task-state'\nimport {\n A2A_ERROR_CODES,\n type JSONRPCRequest,\n type Task,\n type TaskIdParams,\n type TaskPushNotificationConfigGetParams,\n} from './types'\nimport { fail, ok } from './jsonrpc'\n\nexport interface PushConfigMethodDependencies {\n taskStore: TaskStateStore\n pushStore?: PushNotificationStore\n demoMode: boolean\n urlValidator?: (url: URL) => boolean | Promise<boolean>\n authorizeTaskAccess: (\n c: Context,\n req: JSONRPCRequest,\n task: Task,\n ) => Promise<Response | undefined>\n}\n\nexport async function handlePushSet(\n c: Context,\n req: JSONRPCRequest,\n deps: PushConfigMethodDependencies,\n): Promise<Response> {\n if (!deps.pushStore) {\n return c.json(fail(req.id, A2A_ERROR_CODES.PUSH_NOT_SUPPORTED, 'push notifications not configured'))\n }\n const params = req.params as TaskPushNotificationConfig | undefined\n if (!params || typeof params.taskId !== 'string' || !params.pushNotificationConfig?.id) {\n return c.json(\n fail(req.id, A2A_ERROR_CODES.INVALID_PARAMS, 'params.taskId and params.pushNotificationConfig.id required'),\n )\n }\n if (typeof params.pushNotificationConfig.url !== 'string') {\n return c.json(fail(req.id, A2A_ERROR_CODES.INVALID_PARAMS, 'pushNotificationConfig.url required'))\n }\n const task = await deps.taskStore.get(params.taskId)\n if (!task) {\n return c.json(fail(req.id, A2A_ERROR_CODES.TASK_NOT_FOUND, `task '${params.taskId}' not found`))\n }\n const accessError = await deps.authorizeTaskAccess(c, req, task)\n if (accessError) return accessError\n const pushUrl = validatePushNotificationUrl(params.pushNotificationConfig.url)\n if (!pushUrl) {\n return c.json(\n fail(req.id, A2A_ERROR_CODES.INVALID_PARAMS, 'pushNotificationConfig.url is not a safe HTTPS destination'),\n )\n }\n if (!deps.demoMode && !deps.urlValidator) {\n return c.json(\n fail(req.id, A2A_ERROR_CODES.INVALID_PARAMS, 'production push URL validation is not configured'),\n )\n }\n let allowedByHostPolicy = true\n try {\n if (deps.urlValidator) allowedByHostPolicy = await deps.urlValidator(pushUrl)\n } catch (error) {\n allowedByHostPolicy = false\n console.error(\n `[a2a] push URL policy failed for task ${task.id}:`,\n error instanceof Error ? error.message : String(error),\n )\n }\n if (!allowedByHostPolicy) {\n return c.json(fail(req.id, A2A_ERROR_CODES.INVALID_PARAMS, 'pushNotificationConfig.url was rejected'))\n }\n await deps.pushStore.set(params.taskId, params.pushNotificationConfig)\n const stored = await deps.pushStore.get(params.taskId, params.pushNotificationConfig.id)\n return c.json(ok(req.id, { taskId: params.taskId, pushNotificationConfig: stored }))\n}\n\nexport async function handlePushGet(\n c: Context,\n req: JSONRPCRequest,\n deps: PushConfigMethodDependencies,\n): Promise<Response> {\n if (!deps.pushStore) {\n return c.json(fail(req.id, A2A_ERROR_CODES.PUSH_NOT_SUPPORTED, 'push notifications not configured'))\n }\n const params = req.params as TaskPushNotificationConfigGetParams | undefined\n if (!params || typeof params.id !== 'string' || typeof params.pushNotificationConfigId !== 'string') {\n return c.json(\n fail(req.id, A2A_ERROR_CODES.INVALID_PARAMS, 'params.id and params.pushNotificationConfigId required'),\n )\n }\n const task = await deps.taskStore.get(params.id)\n if (!task) {\n return c.json(fail(req.id, A2A_ERROR_CODES.TASK_NOT_FOUND, `task '${params.id}' not found`))\n }\n const accessError = await deps.authorizeTaskAccess(c, req, task)\n if (accessError) return accessError\n const cfg = await deps.pushStore.get(params.id, params.pushNotificationConfigId)\n if (!cfg) {\n return c.json(\n fail(\n req.id,\n A2A_ERROR_CODES.TASK_NOT_FOUND,\n `push config '${params.pushNotificationConfigId}' not found for task '${params.id}'`,\n ),\n )\n }\n return c.json(ok(req.id, { taskId: params.id, pushNotificationConfig: cfg }))\n}\n\nexport async function handlePushList(\n c: Context,\n req: JSONRPCRequest,\n deps: PushConfigMethodDependencies,\n): Promise<Response> {\n if (!deps.pushStore) {\n return c.json(fail(req.id, A2A_ERROR_CODES.PUSH_NOT_SUPPORTED, 'push notifications not configured'))\n }\n const params = req.params as TaskIdParams | undefined\n if (!params || typeof params.id !== 'string') {\n return c.json(fail(req.id, A2A_ERROR_CODES.INVALID_PARAMS, 'params.id required'))\n }\n const task = await deps.taskStore.get(params.id)\n if (!task) {\n return c.json(fail(req.id, A2A_ERROR_CODES.TASK_NOT_FOUND, `task '${params.id}' not found`))\n }\n const accessError = await deps.authorizeTaskAccess(c, req, task)\n if (accessError) return accessError\n const configs = await deps.pushStore.list(params.id)\n return c.json(ok(req.id, configs.map((cfg) => ({ taskId: params.id, pushNotificationConfig: cfg }))))\n}\n\nexport async function handlePushDelete(\n c: Context,\n req: JSONRPCRequest,\n deps: PushConfigMethodDependencies,\n): Promise<Response> {\n if (!deps.pushStore) {\n return c.json(fail(req.id, A2A_ERROR_CODES.PUSH_NOT_SUPPORTED, 'push notifications not configured'))\n }\n const params = req.params as TaskPushNotificationConfigGetParams | undefined\n if (!params || typeof params.id !== 'string' || typeof params.pushNotificationConfigId !== 'string') {\n return c.json(\n fail(req.id, A2A_ERROR_CODES.INVALID_PARAMS, 'params.id and params.pushNotificationConfigId required'),\n )\n }\n const task = await deps.taskStore.get(params.id)\n if (!task) {\n return c.json(fail(req.id, A2A_ERROR_CODES.TASK_NOT_FOUND, `task '${params.id}' not found`))\n }\n const accessError = await deps.authorizeTaskAccess(c, req, task)\n if (accessError) return accessError\n await deps.pushStore.delete(params.id, params.pushNotificationConfigId)\n return c.json(ok(req.id, null))\n}\n","/**\n * A2A JSON-RPC method dispatcher. Both `message/send` and `message/stream`\n * route through the shared `authenticateAndGuard` + `dispatchSandboxStream`\n * + `settleAndRecord` pipeline so every protocol surface gets the same\n * payment, rate-limit, injection, and authorization guarantees.\n *\n * State the dispatcher owns:\n * - the task store (durable record of every task we accepted)\n * - an in-process map of active AbortControllers so `tasks/cancel` can\n * interrupt a still-running `dispatchSandboxStream`\n */\n\nimport type { Context } from 'hono'\n\nimport {\n type AuthorizedRequest,\n type GatewayState,\n authenticateAndGuard,\n claimPayment,\n} from '../dispatch'\nimport type {\n ChatMessage,\n GatewayConfig,\n} from '../types'\nimport { buildAgentCard } from './agent-card'\nimport {\n clearTaskExecution,\n hasExpiredTaskExecution,\n hasMalformedTaskExecution,\n inspectTaskExecution,\n} from './execution-fence'\nimport { executeMessageSend } from './message-send-execution'\nimport { executeMessageStream } from './message-stream-execution'\nimport { fail, ok, parseEnvelope } from './jsonrpc'\nimport {\n type PushNotificationStore,\n} from './push-notifications'\nimport { type TaskStore } from './task-store'\nimport { extractTextFromMessage } from './translate'\nimport {\n A2A_ERROR_CODES,\n type JSONRPCRequest,\n type Message,\n type MessageSendParams,\n type Task,\n} from './types'\nimport {\n attachPaymentRecoveryMarker,\n hasPaymentReleaseRecovery,\n preservePaymentRecoveryMarker,\n releaseTaskPayment,\n recoverPaymentMarkerIfNeeded,\n recoverPaymentReleaseIfNeeded,\n retainPaymentRecoveryMarker,\n} from './payment-recovery'\nimport {\n isTaskFinalizing,\n recoverFinalizationIfNeeded,\n} from './task-finalization'\nimport {\n clearTaskSubmission,\n readTaskOrigin,\n recoverSubmissionIfNeeded,\n withTaskOrigin,\n withTaskSubmission,\n} from './task-submission-recovery'\nimport { deliverTaskPush, type PushDeliveryDependencies } from './task-push-delivery'\nimport {\n bindRequestAbort,\n TaskCancellationRegistry,\n} from './task-cancellation'\nimport {\n createTaskLifecycle as buildTaskLifecycle,\n type TaskLifecycle,\n} from './task-lifecycle'\nimport {\n handleTasksCancel,\n handleTasksGet,\n handleTasksResubscribe,\n type TaskMethodDependencies,\n} from './task-methods'\nimport {\n handlePushDelete,\n handlePushGet,\n handlePushList,\n handlePushSet,\n type PushConfigMethodDependencies,\n} from './push-config-methods'\nimport {\n compareAndSetTask,\n cryptoRandomId,\n isTerminal,\n shouldPreserveTask,\n nowIso,\n withStatus,\n} from './task-state'\n\nexport interface A2AHandlerDeps {\n config: GatewayConfig\n state: GatewayState\n taskStore: TaskStore\n pushStore?: PushNotificationStore\n}\n\nconst MAX_A2A_BODY_BYTES = 64 * 1024\n\nclass RequestBodyTooLargeError extends Error {}\n\nfunction createTaskLifecycle(deps: A2AHandlerDeps): TaskLifecycle {\n return buildTaskLifecycle({\n taskStore: deps.taskStore,\n config: deps.config,\n state: deps.state,\n deliverPush: (task) => maybeDeliverPush(task, deps),\n })\n}\n\nfunction buildTaskMethodDependencies(\n deps: A2AHandlerDeps,\n cancels: TaskCancellationRegistry,\n): TaskMethodDependencies {\n const lifecycle = createTaskLifecycle(deps)\n return {\n taskStore: deps.taskStore,\n payment: lifecycle.payment,\n cancels,\n authorizeTaskAccess: (c, req, task) => authorizeTaskAccess(c, req, task, deps),\n recoverTask: (task, requestedAgentSlug) =>\n recoverTaskIfNeeded(task, deps, requestedAgentSlug),\n deliverPush: (task) => maybeDeliverPush(task, deps),\n }\n}\n\nfunction buildPushConfigMethodDependencies(\n deps: A2AHandlerDeps,\n): PushConfigMethodDependencies {\n return {\n taskStore: deps.taskStore,\n pushStore: deps.pushStore,\n demoMode: deps.config.x402.demoMode === true,\n urlValidator: deps.config.a2a?.pushUrlValidator,\n authorizeTaskAccess: (c, req, task) => authorizeTaskAccess(c, req, task, deps),\n }\n}\n\nexport function createA2AHandlers(deps: A2AHandlerDeps) {\n const runtimeDeps: A2AHandlerDeps = {\n ...deps,\n taskStore: normalizeTaskStore(deps.taskStore, deps.config.x402.demoMode === true),\n }\n const cancels = new TaskCancellationRegistry()\n\n // GET /:slug/.well-known/agent.json\n const handleAgentCard = async (c: Context): Promise<Response> => {\n const slug = c.req.param('slug')\n if (!slug) return c.json({ error: 'slug required' }, 400)\n const agent = await deps.config.resolveAgent(slug)\n if (!agent || !agent.enabled) {\n return c.json({ error: 'Agent not found or not published' }, 404)\n }\n const url = new URL(c.req.url)\n const agentUrl = `${url.origin}${url.pathname.replace(/\\/\\.well-known\\/agent\\.json$/, '')}`\n return c.json(buildAgentCard(agent, deps.config, agentUrl))\n }\n\n // POST /:slug — JSON-RPC dispatcher\n const handleJsonRpc = async (c: Context): Promise<Response> => {\n const slug = c.req.param('slug')\n if (!slug) {\n return c.json(fail(null, A2A_ERROR_CODES.INVALID_REQUEST, 'slug required'), 400)\n }\n\n // Body size limit (DoS prevention) — mirrors the OpenAI-compat handler.\n const contentLength = Number.parseInt(c.req.header('Content-Length') ?? '0', 10)\n if (contentLength > MAX_A2A_BODY_BYTES) {\n return c.json(fail(null, A2A_ERROR_CODES.INVALID_REQUEST, 'request body too large (max 64KB)'), 413)\n }\n\n let raw: unknown\n try {\n raw = await readJsonBody(c.req.raw)\n } catch (error) {\n if (error instanceof RequestBodyTooLargeError) {\n return c.json(\n fail(null, A2A_ERROR_CODES.INVALID_REQUEST, 'request body too large (max 64KB)'),\n 413,\n )\n }\n return c.json(fail(null, A2A_ERROR_CODES.PARSE_ERROR, 'invalid JSON'), 400)\n }\n const parsed = parseEnvelope(raw)\n if ('code' in parsed) {\n return c.json(fail(parsed.id, parsed.code, parsed.message), 400)\n }\n\n switch (parsed.method) {\n case 'message/send':\n return handleMessageSend(c, slug, parsed, runtimeDeps, cancels)\n case 'message/stream':\n return handleMessageStream(c, slug, parsed, runtimeDeps, cancels)\n case 'tasks/get':\n return handleTasksGet(c, parsed, buildTaskMethodDependencies(runtimeDeps, cancels))\n case 'tasks/cancel':\n return handleTasksCancel(c, parsed, buildTaskMethodDependencies(runtimeDeps, cancels))\n case 'tasks/resubscribe':\n return handleTasksResubscribe(c, parsed, buildTaskMethodDependencies(runtimeDeps, cancels))\n case 'tasks/pushNotificationConfig/set':\n return handlePushSet(c, parsed, buildPushConfigMethodDependencies(runtimeDeps))\n case 'tasks/pushNotificationConfig/get':\n return handlePushGet(c, parsed, buildPushConfigMethodDependencies(runtimeDeps))\n case 'tasks/pushNotificationConfig/list':\n return handlePushList(c, parsed, buildPushConfigMethodDependencies(runtimeDeps))\n case 'tasks/pushNotificationConfig/delete':\n return handlePushDelete(c, parsed, buildPushConfigMethodDependencies(runtimeDeps))\n default:\n return c.json(\n fail(parsed.id, A2A_ERROR_CODES.METHOD_NOT_FOUND, `unknown method '${parsed.method}'`),\n )\n }\n }\n\n return { handleAgentCard, handleJsonRpc }\n}\n\n// ── message/send (synchronous) ────────────────────────────────────────────\n\nasync function handleMessageSend(\n c: Context,\n slug: string,\n req: JSONRPCRequest,\n deps: A2AHandlerDeps,\n cancels: TaskCancellationRegistry,\n): Promise<Response> {\n const guard = await guardMessageRequest(c, slug, req, deps)\n if (guard instanceof Response) return guard\n const { authz, task } = guard\n setPaymentResponseHeaders(c, authz)\n const controller = cancels.register(task.id)\n const detachRequestAbort = bindRequestAbort(c.req.raw.signal, controller)\n const lifecycle = createTaskLifecycle(deps)\n try {\n return await executeMessageSend(\n c,\n req,\n { taskStore: deps.taskStore, config: deps.config, ...lifecycle },\n authz,\n task,\n controller.signal,\n )\n } finally {\n detachRequestAbort()\n cancels.clear(task.id)\n }\n}\n\n// ── message/stream (SSE) ──────────────────────────────────────────────────\n\nasync function handleMessageStream(\n c: Context,\n slug: string,\n req: JSONRPCRequest,\n deps: A2AHandlerDeps,\n cancels: TaskCancellationRegistry,\n): Promise<Response> {\n const guard = await guardMessageRequest(c, slug, req, deps)\n if (guard instanceof Response) return guard\n const { authz, task } = guard\n setPaymentResponseHeaders(c, authz)\n return executeMessageStream(\n c,\n req,\n {\n taskStore: deps.taskStore,\n config: deps.config,\n lifecycle: createTaskLifecycle(deps),\n cancels,\n deliverPush: (streamTask) => maybeDeliverPush(streamTask, deps),\n reportStreamError: async (streamAuthz, error) => {\n await deps.state.obs?.onStreamError?.(\n {\n requestId: streamAuthz.requestId,\n agentSlug: streamAuthz.agent.slug,\n startMs: streamAuthz.startMs,\n },\n {\n consumerId: streamAuthz.consumerId,\n errorMessage: error instanceof Error ? error.message : String(error),\n },\n )\n },\n },\n authz,\n task,\n )\n}\n\n// ── Shared message-send setup (auth + task allocation) ────────────────────\n\ninterface GuardSuccess {\n authz: AuthorizedRequest\n task: Task\n}\n\nasync function guardMessageRequest(\n c: Context,\n slug: string,\n req: JSONRPCRequest,\n deps: A2AHandlerDeps,\n): Promise<GuardSuccess | Response> {\n const params = req.params as MessageSendParams | undefined\n if (!params || !params.message) {\n return c.json(fail(req.id, A2A_ERROR_CODES.INVALID_PARAMS, 'params.message required'))\n }\n const extracted = extractTextFromMessage(params.message)\n if ('error' in extracted) {\n return c.json(fail(req.id, extracted.error.code, extracted.error.message))\n }\n\n let billingMessages: ChatMessage[] = [{ role: 'user', content: extracted.text }]\n if (typeof params.message.taskId === 'string') {\n const storedForQuote = await deps.taskStore.get(params.message.taskId)\n if (storedForQuote) {\n const accessError = await authorizeTaskAccess(c, req, storedForQuote, deps)\n if (accessError) return accessError\n const quotedTask = await recoverTaskIfNeeded(storedForQuote, deps, slug)\n if (quotedTask.status.state === 'input-required') {\n billingMessages = [\n ...taskHistoryAsChatMessages(quotedTask),\n { role: 'user', content: extracted.text },\n ]\n }\n }\n }\n\n const guard = await authenticateAndGuard(\n c,\n slug,\n billingMessages,\n deps.config,\n deps.state,\n )\n if (guard instanceof Response) return guard\n const authz = guard\n // The provider session receives only the new turn. The quote above covers\n // every retained message and the configured hidden provider context.\n authz.userMessage = extracted.text\n\n // Multi-turn continuation: if the caller addressed an existing task that is\n // currently in `input-required`, append the new message and reserve it as\n // `submitted`. The handler transitions it to `working` only after payment\n // succeeds, so cancellation during payment cannot start sandbox work.\n // Any other taskId (unknown OR pointing at a terminal/working\n // task) means the caller is starting a fresh task and we mint a new id.\n if (typeof params.message.taskId === 'string') {\n const storedExisting = await deps.taskStore.get(params.message.taskId)\n if (storedExisting) {\n const accessError = await authorizeTaskAccess(c, req, storedExisting, deps)\n if (accessError) return accessError\n const existing = await recoverTaskIfNeeded(storedExisting, deps, slug)\n if (existing.status.state !== 'input-required') {\n return c.json(\n fail(\n req.id,\n A2A_ERROR_CODES.INVALID_PARAMS,\n `task '${existing.id}' is in state '${existing.status.state}'; only 'input-required' tasks accept follow-up messages`,\n ),\n )\n }\n const appendedMessage: Message = {\n ...params.message,\n taskId: existing.id,\n contextId: existing.contextId,\n }\n const continued: Task = {\n ...existing,\n status: { state: 'submitted', timestamp: nowIso() },\n history: [...(existing.history ?? []), appendedMessage],\n metadata: withTaskSubmission(existing.metadata, authz),\n }\n if (!await compareAndSetTask(deps.taskStore, existing, continued)) {\n return c.json(\n fail(req.id, A2A_ERROR_CODES.INVALID_PARAMS, `task '${existing.id}' changed before continuation`),\n )\n }\n const claimedTask = await claimTaskPayment(c, req, continued, authz, deps, existing)\n if (claimedTask instanceof Response) return claimedTask\n return { authz, task: claimedTask }\n }\n // Unknown taskId in params: fall through and mint a fresh task with that\n // exact id so callers that pre-allocate ids (idempotency) get them.\n }\n\n const taskId = params.message.taskId ?? `task_${cryptoRandomId()}`\n const contextId = params.message.contextId ?? `ctx_${cryptoRandomId()}`\n const initialMessage = {\n ...params.message,\n taskId,\n contextId,\n }\n const task: Task = {\n kind: 'task',\n id: taskId,\n contextId,\n status: { state: 'submitted', timestamp: nowIso() },\n history: [initialMessage],\n metadata: withTaskSubmission(withTaskOrigin(undefined, authz.agent), authz),\n }\n if (!await createTask(deps.taskStore, task)) {\n return c.json(\n fail(req.id, A2A_ERROR_CODES.INVALID_PARAMS, `task '${task.id}' already exists`),\n )\n }\n const claimedTask = await claimTaskPayment(c, req, task, authz, deps)\n if (claimedTask instanceof Response) return claimedTask\n return { authz, task: claimedTask }\n}\n\nasync function claimTaskPayment(\n c: Context,\n req: JSONRPCRequest,\n task: Task,\n authz: AuthorizedRequest,\n deps: A2AHandlerDeps,\n paymentFailureTask?: Task,\n): Promise<Response | Task> {\n const lifecycle = createTaskLifecycle(deps)\n let paymentTask = task\n try {\n await claimPayment(authz, deps.config, deps.state, {\n onRecoveryPrepared: async (recoveryId) => {\n paymentTask = await attachPaymentRecoveryMarker(\n deps.taskStore,\n paymentTask,\n recoveryId,\n )\n },\n })\n } catch {\n let recoveryTask = paymentTask\n try {\n recoveryTask = await retainPaymentRecoveryMarker(\n deps.taskStore,\n paymentTask,\n authz.paymentRecoveryId,\n )\n } catch (error) {\n console.error(\n `[a2a] failed to attach payment recovery to ${task.id}:`,\n error instanceof Error ? error.message : String(error),\n )\n }\n const releasedTask = await releaseTaskPayment(\n authz,\n recoveryTask,\n lifecycle.payment,\n 'payment authorization failed',\n false,\n )\n const cleanedReleasedTask = clearTaskSubmission(releasedTask)\n const hasReleaseRecord = hasPaymentReleaseRecovery(cleanedReleasedTask)\n const failed = hasReleaseRecord\n ? isTerminal(cleanedReleasedTask.status.state)\n ? cleanedReleasedTask\n : withStatus(cleanedReleasedTask, 'failed')\n : paymentFailureTask\n ? preservePaymentRecoveryMarker(paymentFailureTask, cleanedReleasedTask)\n : isTerminal(cleanedReleasedTask.status.state)\n ? cleanedReleasedTask\n : withStatus(cleanedReleasedTask, 'failed')\n try {\n if (await compareAndSetTask(deps.taskStore, releasedTask, failed) && isTerminal(failed.status.state)) {\n await maybeDeliverPush(failed, deps)\n }\n } catch (taskError) {\n console.error(\n `[a2a] failed to persist payment-failed task ${task.id}:`,\n taskError instanceof Error ? taskError.message : String(taskError),\n )\n }\n return c.json(fail(req.id, A2A_ERROR_CODES.INTERNAL_ERROR, 'Payment authorization failed'))\n }\n\n const current = await deps.taskStore.get(task.id)\n if (current && JSON.stringify(current) === JSON.stringify(paymentTask)) {\n return paymentTask\n }\n {\n const changedTask = current ?? paymentTask\n let recoveryTask = changedTask\n try {\n recoveryTask = await retainPaymentRecoveryMarker(\n deps.taskStore,\n changedTask,\n authz.paymentRecoveryId,\n )\n } catch (error) {\n console.error(\n `[a2a] failed to retain payment recovery after task race for ${task.id}:`,\n error instanceof Error ? error.message : String(error),\n )\n }\n const released = await releaseTaskPayment(\n authz,\n recoveryTask,\n lifecycle.payment,\n 'A2A task changed during payment confirmation',\n false,\n )\n if (released.status.state === 'canceled') return c.json(ok(req.id, released))\n return c.json(\n fail(req.id, A2A_ERROR_CODES.INVALID_PARAMS, `task '${task.id}' changed during payment confirmation`),\n )\n }\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────\n\nconst EXECUTION_RECOVERY_METADATA_KEY = 'gatewayExecutionRecovery'\n\nfunction setPaymentResponseHeaders(c: Context, authz: AuthorizedRequest): void {\n if (authz.mppChargeOperation) {\n c.header('Payment-Receipt', authz.mppChargeOperation.receipt)\n }\n if (authz.paymentRecoveryId) {\n c.header('X-Payment-Operation-Id', authz.paymentRecoveryId)\n }\n}\n\nasync function authorizeTaskAccess(\n c: Context,\n req: JSONRPCRequest,\n task: Task,\n deps: A2AHandlerDeps,\n): Promise<Response | undefined> {\n const requestedAgentSlug = c.req.param('slug') ?? ''\n const origin = readTaskOrigin(task)\n if (origin) {\n if (origin.agentSlug !== requestedAgentSlug) {\n return c.json(fail(req.id, A2A_ERROR_CODES.TASK_ACCESS_DENIED, 'task belongs to a different agent'), 403)\n }\n const requestedAgent = await deps.config.resolveAgent(requestedAgentSlug)\n if (!requestedAgent || requestedAgent.id !== origin.agentId) {\n return c.json(fail(req.id, A2A_ERROR_CODES.TASK_ACCESS_DENIED, 'task belongs to a different agent'), 403)\n }\n } else if (!deps.config.x402.demoMode) {\n return c.json(fail(req.id, A2A_ERROR_CODES.TASK_ACCESS_DENIED, 'task origin is not recorded'), 403)\n }\n const authorize = deps.config.a2a?.authorizeTaskAccess\n if (!authorize && deps.config.x402.demoMode) return undefined\n if (!authorize) {\n return c.json(\n fail(req.id, A2A_ERROR_CODES.TASK_ACCESS_DENIED, 'task access authorization is not configured'),\n 403,\n )\n }\n let allowed = false\n try {\n allowed = await authorize(task, {\n method: req.method,\n agentSlug: requestedAgentSlug,\n authorization: c.req.header('Authorization') ?? '',\n paymentSignature: c.req.header('X-Payment-Signature') ?? '',\n })\n } catch (error) {\n console.error(\n `[a2a] task access authorization failed for ${task.id}:`,\n error instanceof Error ? error.message : String(error),\n )\n }\n if (allowed) return undefined\n return c.json(fail(req.id, A2A_ERROR_CODES.TASK_ACCESS_DENIED, 'task access denied'), 403)\n}\n\nfunction taskHistoryAsChatMessages(task: Task): ChatMessage[] {\n return (task.history ?? []).flatMap((message) => {\n const extracted = extractTextFromMessage(message)\n if ('error' in extracted) return []\n return [{\n role: message.role === 'agent' ? 'assistant' : 'user',\n content: extracted.text,\n }]\n })\n}\n\nasync function createTask(taskStore: TaskStore, task: Task): Promise<boolean> {\n if (!taskStore.createIfAbsent) {\n throw new Error('A2A task store does not provide createIfAbsent')\n }\n return taskStore.createIfAbsent(task)\n}\nfunction normalizeTaskStore(taskStore: TaskStore, allowUnsafeFallback: boolean): TaskStore {\n const hasCreateIfAbsent = typeof taskStore.createIfAbsent === 'function'\n const hasCompareAndSet = typeof taskStore.compareAndSet === 'function'\n const hasCompareAndSetExecution = typeof taskStore.compareAndSetExecution === 'function'\n if (hasCreateIfAbsent && hasCompareAndSet && hasCompareAndSetExecution) {\n return taskStore\n }\n if (!allowUnsafeFallback) {\n throw new Error(\n 'A2A production task store must implement createIfAbsent, compareAndSet, and compareAndSetExecution',\n )\n }\n return {\n get: (id) => taskStore.get(id),\n put: (task) => taskStore.put(task),\n delete: (id) => taskStore.delete(id),\n async createIfAbsent(task) {\n if (hasCreateIfAbsent) return taskStore.createIfAbsent!(task)\n if (await taskStore.get(task.id)) return false\n await taskStore.put(task)\n return true\n },\n async compareAndSet(expected, next) {\n if (hasCompareAndSet) return taskStore.compareAndSet!(expected, next)\n const current = await taskStore.get(expected.id)\n if (!current || JSON.stringify(current) !== JSON.stringify(expected)) return false\n await taskStore.put(next)\n return true\n },\n async compareAndSetExecution(expected, next, requestId, now) {\n if (hasCompareAndSetExecution) {\n return taskStore.compareAndSetExecution!(expected, next, requestId, now)\n }\n const current = await taskStore.get(expected.id)\n const expectedMarker = inspectTaskExecution(current ?? expected)\n const nextMarker = inspectTaskExecution(next)\n if (\n !current ||\n JSON.stringify(current) !== JSON.stringify(expected) ||\n expectedMarker.state !== 'valid' ||\n nextMarker.state !== 'valid' ||\n expectedMarker.marker.requestId !== requestId ||\n nextMarker.marker.requestId !== requestId ||\n expectedMarker.marker.lease.expiresAt <= now\n ) return false\n await taskStore.put(next)\n return true\n },\n }\n}\n\nasync function recoverTaskIfNeeded(\n task: Task,\n deps: A2AHandlerDeps,\n requestedAgentSlug: string,\n): Promise<Task> {\n const lifecycle = createTaskLifecycle(deps)\n const paymentReleased = await recoverPaymentReleaseIfNeeded(task, lifecycle.payment)\n const finalized = await recoverFinalizationIfNeeded(\n paymentReleased,\n lifecycle.finalization,\n requestedAgentSlug,\n )\n const paymentRecovered = await recoverPaymentMarkerIfNeeded(finalized, lifecycle.payment)\n const submissionRecovered = await recoverSubmissionIfNeeded(paymentRecovered, {\n taskStore: deps.taskStore,\n deliverPush: lifecycle.finalization.deliverPush,\n })\n return recoverExpiredExecutionIfNeeded(submissionRecovered, deps)\n}\n\nasync function recoverExpiredExecutionIfNeeded(task: Task, deps: A2AHandlerDeps): Promise<Task> {\n const malformed = hasMalformedTaskExecution(task)\n if (\n task.status.state !== 'working' ||\n (isTaskFinalizing(task) && !malformed) ||\n (!malformed && !hasExpiredTaskExecution(task))\n ) return task\n const inspection = inspectTaskExecution(task)\n const failed: Task = {\n ...withStatus(task, 'failed'),\n metadata: {\n ...(clearTaskExecution(task).metadata ?? {}),\n [EXECUTION_RECOVERY_METADATA_KEY]: {\n error: inspection.state === 'malformed'\n ? `A2A execution marker was malformed: ${inspection.reason}`\n : 'A2A execution lease expired before a task result was stored',\n },\n },\n }\n if (await compareAndSetTask(deps.taskStore, task, failed)) {\n await maybeDeliverPush(failed, deps)\n return failed\n }\n return await deps.taskStore.get(task.id) ?? task\n}\n\nasync function readJsonBody(request: Request): Promise<unknown> {\n if (!request.body) return await request.json()\n const reader = request.body.getReader()\n const chunks: Uint8Array[] = []\n let total = 0\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n if (value) {\n total += value.byteLength\n if (total > MAX_A2A_BODY_BYTES) {\n await reader.cancel().catch(() => undefined)\n throw new RequestBodyTooLargeError('request body too large')\n }\n chunks.push(value)\n }\n }\n } finally {\n reader.releaseLock()\n }\n const body = new Uint8Array(total)\n let offset = 0\n for (const chunk of chunks) {\n body.set(chunk, offset)\n offset += chunk.byteLength\n }\n return JSON.parse(new TextDecoder().decode(body)) as unknown\n}\n\n/**\n * Fire-and-forget push delivery. Idempotent w.r.t. push: if the task hasn't\n * reached a terminal state, this is a no-op. The dispatch logs failures via\n * the observer rather than failing the request — webhook receivers re-fetch\n * via `tasks/get` to confirm state.\n */\nasync function maybeDeliverPush(task: Task, deps: A2AHandlerDeps): Promise<void> {\n const pushDeps: PushDeliveryDependencies = {\n taskStore: deps.taskStore,\n pushStore: deps.pushStore,\n demoMode: deps.config.x402.demoMode === true,\n webhookSecret: deps.config.a2a?.webhookSecret,\n fetcher: deps.config.a2a?.pushFetcher,\n urlValidator: deps.config.a2a?.pushUrlValidator,\n onDeliveryFailure: (failedTask, result) => {\n void deps.state.obs?.onStreamError?.(\n { requestId: result.taskId, agentSlug: failedTask.id, startMs: Date.now() },\n {\n consumerId: result.configId,\n errorMessage: `push delivery failed (${result.status ?? 'no-status'}): ${result.error ?? 'non-2xx'}`,\n },\n )\n },\n }\n await deliverTaskPush(task, pushDeps)\n}\n","/**\n * Task persistence behind the JSON-RPC dispatcher. Default adapter is in\n * memory with a 1-hour TTL — adequate for tests, scratch, and Workers with\n * a short-lived process. Production deployments wire their own\n * `TaskStore` (D1, postgres, Durable Object) via `GatewayConfig.a2a`.\n */\n\nimport type { Task } from './types'\nimport { inspectTaskExecution } from './execution-fence'\nimport { hasPendingPaymentRecovery } from './task-recovery'\n\nexport { hasPendingPaymentRecovery } from './task-recovery'\n\nexport interface TaskStore {\n get(id: string): Promise<Task | undefined>\n put(task: Task): Promise<void>\n /** Insert only when the task id is absent. Required outside explicit demo mode. */\n createIfAbsent?(task: Task): Promise<boolean>\n /** Replace only when the stored task still equals `expected`. Required for production races. */\n compareAndSet?(expected: Task, next: Task): Promise<boolean>\n /** Replace an execution marker only while its owner lease is still live. */\n compareAndSetExecution?(\n expected: Task,\n next: Task,\n requestId: string,\n now: number,\n ): Promise<boolean>\n delete(id: string): Promise<void>\n}\n\nconst DEFAULT_TTL_MS = 60 * 60 * 1000\n\nexport class InMemoryTaskStore implements TaskStore {\n private readonly entries = new Map<string, { task: Task; expiresAt: number }>()\n\n constructor(private readonly ttlMs: number = DEFAULT_TTL_MS) {}\n\n async get(id: string): Promise<Task | undefined> {\n this.gc()\n const entry = this.entries.get(id)\n if (!entry) return undefined\n return clone(entry.task)\n }\n\n async put(task: Task): Promise<void> {\n this.gc()\n this.entries.set(task.id, { task: clone(task), expiresAt: Date.now() + this.ttlMs })\n }\n\n async createIfAbsent(task: Task): Promise<boolean> {\n this.gc()\n if (this.entries.has(task.id)) return false\n this.entries.set(task.id, { task: clone(task), expiresAt: Date.now() + this.ttlMs })\n return true\n }\n\n async compareAndSet(expected: Task, next: Task): Promise<boolean> {\n this.gc()\n const entry = this.entries.get(expected.id)\n if (!entry || JSON.stringify(entry.task) !== JSON.stringify(expected)) return false\n this.entries.set(expected.id, { task: clone(next), expiresAt: Date.now() + this.ttlMs })\n return true\n }\n\n async compareAndSetExecution(\n expected: Task,\n next: Task,\n requestId: string,\n now: number,\n ): Promise<boolean> {\n this.gc()\n const entry = this.entries.get(expected.id)\n if (!entry || JSON.stringify(entry.task) !== JSON.stringify(expected)) return false\n const expectedMarker = inspectTaskExecution(expected)\n const nextMarker = inspectTaskExecution(next)\n if (\n expectedMarker.state !== 'valid' ||\n nextMarker.state !== 'valid' ||\n expectedMarker.marker.requestId !== requestId ||\n nextMarker.marker.requestId !== requestId ||\n expectedMarker.marker.lease.expiresAt <= now ||\n nextMarker.marker.lease.expiresAt <= now\n ) return false\n this.entries.set(expected.id, { task: clone(next), expiresAt: Date.now() + this.ttlMs })\n return true\n }\n\n async delete(id: string): Promise<void> {\n const entry = this.entries.get(id)\n if (entry && hasPendingPaymentRecovery(entry.task)) return\n this.entries.delete(id)\n }\n\n /**\n * Sweep expired tasks. Called inline on every read/write — cheap for the\n * Map sizes this is designed for (10s–1000s of concurrent tasks).\n */\n private gc(): void {\n const now = Date.now()\n for (const [id, entry] of this.entries) {\n if (entry.expiresAt <= now && !hasPendingPaymentRecovery(entry.task)) {\n this.entries.delete(id)\n }\n }\n }\n}\n\nfunction clone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T\n}\n"],"mappings":"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","names":["paymentNonceKey","flight","recovery","usage","recovered","canceled","usageRecordedTask","result","createTaskLifecycle","claimedTask","clone","createAgentGateway"]}
|