@devlab.group/agent-commerce 2.4.1 → 2.5.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 +115 -15
- package/dist/ap2.d.ts +24 -12
- package/dist/ap2.js +31 -13
- package/dist/ap2.js.map +1 -1
- package/dist/{chunk-DTKU3Z2M.js → chunk-3OTCFFFT.js} +37 -4
- package/dist/chunk-3OTCFFFT.js.map +1 -0
- package/dist/{chunk-QPV3EGJO.js → chunk-4K7FIBJM.js} +25 -4
- package/dist/chunk-4K7FIBJM.js.map +1 -0
- package/dist/{chunk-CXWC5LWM.js → chunk-FKQK5XZA.js} +652 -68
- package/dist/chunk-FKQK5XZA.js.map +1 -0
- package/dist/chunk-GA3O2A7R.js +92 -0
- package/dist/chunk-GA3O2A7R.js.map +1 -0
- package/dist/{chunk-WZW5ORZH.js → chunk-VUCMBGUR.js} +3 -3
- package/dist/{chunk-WZW5ORZH.js.map → chunk-VUCMBGUR.js.map} +1 -1
- package/dist/cli/{ap2-GWSP4LYY.js → ap2-YAPLERSC.js} +34 -15
- package/dist/cli/ap2-YAPLERSC.js.map +1 -0
- package/dist/cli/{chunk-G2JEY7MB.js → chunk-2J2IQQ4X.js} +8 -7
- package/dist/cli/chunk-2J2IQQ4X.js.map +1 -0
- package/dist/cli/chunk-2UPPX3FJ.js +311 -0
- package/dist/cli/chunk-2UPPX3FJ.js.map +1 -0
- package/dist/cli/{chunk-WYOGIANL.js → chunk-4H2QLHQI.js} +4 -4
- package/dist/cli/{chunk-WYOGIANL.js.map → chunk-4H2QLHQI.js.map} +1 -1
- package/dist/cli/{chunk-OZ4LAWBK.js → chunk-5R7DM5LM.js} +25 -4
- package/dist/cli/chunk-5R7DM5LM.js.map +1 -0
- package/dist/cli/chunk-663ALDZA.js +92 -0
- package/dist/cli/chunk-663ALDZA.js.map +1 -0
- package/dist/cli/{chunk-QQ3WY5L3.js → chunk-IDY2735M.js} +36 -104
- package/dist/cli/chunk-IDY2735M.js.map +1 -0
- package/dist/cli/chunk-JFVRG2HH.js +107 -0
- package/dist/cli/chunk-JFVRG2HH.js.map +1 -0
- package/dist/cli/chunk-M7NXVRU5.js +8 -0
- package/dist/cli/{chunk-ITWNSS2B.js.map → chunk-M7NXVRU5.js.map} +1 -1
- package/dist/cli/chunk-NIU5EMSB.js +119 -0
- package/dist/cli/chunk-NIU5EMSB.js.map +1 -0
- package/dist/cli/{chunk-TNMLDPUO.js → chunk-QA2OPHBF.js} +655 -70
- package/dist/cli/chunk-QA2OPHBF.js.map +1 -0
- package/dist/cli/{chunk-GJIMDMYT.js → chunk-QLUCNPRT.js} +404 -161
- package/dist/cli/chunk-QLUCNPRT.js.map +1 -0
- package/dist/cli/chunk-SYQLJXIU.js +105 -0
- package/dist/cli/chunk-SYQLJXIU.js.map +1 -0
- package/dist/cli/{chunk-3MGAJ5FX.js → chunk-VJ4EO4LE.js} +3 -3
- package/dist/cli/{chunk-3MGAJ5FX.js.map → chunk-VJ4EO4LE.js.map} +1 -1
- package/dist/cli/{chunk-PIMFPCNZ.js → chunk-Z34UMZBB.js} +234 -85
- package/dist/cli/chunk-Z34UMZBB.js.map +1 -0
- package/dist/cli/config-BWFMN2ZB.js +12 -0
- package/dist/cli/{config-UI4EDG4L.js.map → config-BWFMN2ZB.js.map} +1 -1
- package/dist/cli/index.js +258 -11
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/{mcp-PGBRWZVA.js → mcp-KZEMXLHR.js} +5 -4
- package/dist/cli/mcp-KZEMXLHR.js.map +1 -0
- package/dist/cli/{near-5AY3HWYF.js → near-U6365VFX.js} +15 -4
- package/dist/cli/near-U6365VFX.js.map +1 -0
- package/dist/cli/payment-providers-SZL36H3Y.js +6 -0
- package/dist/cli/payment-providers-SZL36H3Y.js.map +1 -0
- package/dist/cli/{provider-I2ESL6RS.js → provider-6TKB5ADJ.js} +26 -15
- package/dist/cli/provider-6TKB5ADJ.js.map +1 -0
- package/dist/cli/receipts-ZGLJWMQG.js +8 -0
- package/dist/cli/receipts-ZGLJWMQG.js.map +1 -0
- package/dist/cli/reconcile-IC22MJD5.js +4 -0
- package/dist/cli/reconcile-IC22MJD5.js.map +1 -0
- package/dist/cli/{run-JK4ERPJV.js → run-ZTYPQI4D.js} +151 -115
- package/dist/cli/run-ZTYPQI4D.js.map +1 -0
- package/dist/cli/svm-KDSPDFJG.js +48 -0
- package/dist/cli/svm-KDSPDFJG.js.map +1 -0
- package/dist/cli/{x402-7WBFZQXV.js → x402-WLYBLODI.js} +10 -9
- package/dist/cli/x402-WLYBLODI.js.map +1 -0
- package/dist/index.d.ts +112 -12
- package/dist/index.js +948 -157
- package/dist/index.js.map +1 -1
- package/dist/mcp.d.ts +1 -2
- package/dist/mcp.js +1 -1
- package/dist/mpp.js +20 -10
- package/dist/mpp.js.map +1 -1
- package/dist/{near-D6C42VPE.js → near-FH7HPZV3.js} +15 -4
- package/dist/near-FH7HPZV3.js.map +1 -0
- package/dist/{protocol-adapter-C9odYl6l.d.ts → protocol-adapter-DEXpdp8m.d.ts} +102 -48
- package/dist/{runtime-Cl_BLVZV.d.ts → runtime-Dz2fSO-P.d.ts} +220 -2
- package/dist/svm-KNC3PHMS.js +48 -0
- package/dist/svm-KNC3PHMS.js.map +1 -0
- package/dist/x402.js +5 -5
- package/package.json +1 -1
- package/dist/authorization-DjAecwuW.d.ts +0 -115
- package/dist/chunk-CXWC5LWM.js.map +0 -1
- package/dist/chunk-DTKU3Z2M.js.map +0 -1
- package/dist/chunk-KA2AX5FH.js +0 -44
- package/dist/chunk-KA2AX5FH.js.map +0 -1
- package/dist/chunk-QPV3EGJO.js.map +0 -1
- package/dist/cli/ap2-GWSP4LYY.js.map +0 -1
- package/dist/cli/chunk-G2JEY7MB.js.map +0 -1
- package/dist/cli/chunk-GJIMDMYT.js.map +0 -1
- package/dist/cli/chunk-ITWNSS2B.js +0 -8
- package/dist/cli/chunk-OSTCU6ZK.js +0 -44
- package/dist/cli/chunk-OSTCU6ZK.js.map +0 -1
- package/dist/cli/chunk-OZ4LAWBK.js.map +0 -1
- package/dist/cli/chunk-PIMFPCNZ.js.map +0 -1
- package/dist/cli/chunk-QQ3WY5L3.js.map +0 -1
- package/dist/cli/chunk-TNMLDPUO.js.map +0 -1
- package/dist/cli/config-UI4EDG4L.js +0 -11
- package/dist/cli/mcp-PGBRWZVA.js.map +0 -1
- package/dist/cli/near-5AY3HWYF.js.map +0 -1
- package/dist/cli/provider-I2ESL6RS.js.map +0 -1
- package/dist/cli/run-JK4ERPJV.js.map +0 -1
- package/dist/cli/svm-3MMYFPC7.js +0 -33
- package/dist/cli/svm-3MMYFPC7.js.map +0 -1
- package/dist/cli/x402-7WBFZQXV.js.map +0 -1
- package/dist/near-D6C42VPE.js.map +0 -1
- package/dist/svm-QEUAUNPQ.js +0 -33
- package/dist/svm-QEUAUNPQ.js.map +0 -1
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { createHash } from 'crypto';
|
|
2
|
-
import { PERMIT2_ADDRESS } from '@x402/evm';
|
|
3
|
-
import { encodeAbiParameters, keccak256 } from 'viem';
|
|
4
|
-
|
|
5
|
-
// src/payments/x402/replay-key.ts
|
|
6
|
-
function computeReplayKey(input) {
|
|
7
|
-
const encoded = encodeAbiParameters(
|
|
8
|
-
[{ type: "uint256" }, { type: "address" }, { type: "address" }, { type: "bytes32" }],
|
|
9
|
-
[BigInt(input.chainId), input.asset, input.from, input.nonce]
|
|
10
|
-
);
|
|
11
|
-
return keccak256(encoded);
|
|
12
|
-
}
|
|
13
|
-
function computePermit2ReplayKey(input) {
|
|
14
|
-
return keccak256(
|
|
15
|
-
encodeAbiParameters(
|
|
16
|
-
[
|
|
17
|
-
{ type: "string" },
|
|
18
|
-
{ type: "uint256" },
|
|
19
|
-
{ type: "address" },
|
|
20
|
-
{ type: "address" },
|
|
21
|
-
{ type: "uint256" }
|
|
22
|
-
],
|
|
23
|
-
[
|
|
24
|
-
"x402/exact/permit2/v1",
|
|
25
|
-
BigInt(input.chainId),
|
|
26
|
-
PERMIT2_ADDRESS,
|
|
27
|
-
input.owner,
|
|
28
|
-
BigInt(input.nonce)
|
|
29
|
-
]
|
|
30
|
-
)
|
|
31
|
-
);
|
|
32
|
-
}
|
|
33
|
-
function computeSvmReplayKey(input) {
|
|
34
|
-
const digest = createHash("sha256").update("x402/exact/svm/v1\0").update(input.network).update("\0").update(Buffer.from(input.messageHash, "base64")).digest("hex");
|
|
35
|
-
return `0x${digest}`;
|
|
36
|
-
}
|
|
37
|
-
function computeNearReplayKey(input) {
|
|
38
|
-
const digest = createHash("sha256").update("x402/exact/near/v1\0").update(`${input.network}\0${input.senderId}\0${input.publicKey}\0${input.nonce.toString(10)}`).digest("hex");
|
|
39
|
-
return `0x${digest}`;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export { computeNearReplayKey, computePermit2ReplayKey, computeReplayKey, computeSvmReplayKey };
|
|
43
|
-
//# sourceMappingURL=chunk-OSTCU6ZK.js.map
|
|
44
|
-
//# sourceMappingURL=chunk-OSTCU6ZK.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/payments/x402/replay-key.ts"],"names":[],"mappings":";;;;;AAiBO,SAAS,iBAAiB,KAAA,EAA+B;AAC9D,EAAA,MAAM,OAAA,GAAU,mBAAA;AAAA,IACd,CAAC,EAAE,IAAA,EAAM,SAAA,EAAU,EAAG,EAAE,IAAA,EAAM,SAAA,EAAU,EAAG,EAAE,MAAM,SAAA,EAAU,EAAG,EAAE,IAAA,EAAM,WAAW,CAAA;AAAA,IACnF,CAAC,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,EAAG,MAAM,KAAA,EAAO,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,KAAK;AAAA,GAC9D;AACA,EAAA,OAAO,UAAU,OAAO,CAAA;AAC1B;AAOO,SAAS,wBAAwB,KAAA,EAI7B;AACT,EAAA,OAAO,SAAA;AAAA,IACL,mBAAA;AAAA,MACE;AAAA,QACE,EAAE,MAAM,QAAA,EAAS;AAAA,QACjB,EAAE,MAAM,SAAA,EAAU;AAAA,QAClB,EAAE,MAAM,SAAA,EAAU;AAAA,QAClB,EAAE,MAAM,SAAA,EAAU;AAAA,QAClB,EAAE,MAAM,SAAA;AAAU,OACpB;AAAA,MACA;AAAA,QACE,uBAAA;AAAA,QACA,MAAA,CAAO,MAAM,OAAO,CAAA;AAAA,QACpB,eAAA;AAAA,QACA,KAAA,CAAM,KAAA;AAAA,QACN,MAAA,CAAO,MAAM,KAAK;AAAA;AACpB;AACF,GACF;AACF;AAQO,SAAS,oBAAoB,KAAA,EAGzB;AACT,EAAA,MAAM,MAAA,GAAS,WAAW,QAAQ,CAAA,CAC/B,OAAO,qBAAqB,CAAA,CAC5B,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CACpB,OAAO,IAAI,CAAA,CACX,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,aAAa,QAAQ,CAAC,CAAA,CAC/C,MAAA,CAAO,KAAK,CAAA;AACf,EAAA,OAAO,KAAK,MAAM,CAAA,CAAA;AACpB;AAQO,SAAS,qBAAqB,KAAA,EAK1B;AACT,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,QAAQ,CAAA,CAC/B,MAAA,CAAO,sBAAsB,CAAA,CAC7B,MAAA,CAAO,CAAA,EAAG,KAAA,CAAM,OAAO,CAAA,EAAA,EAAK,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK,KAAA,CAAM,SAAS,CAAA,EAAA,EAAK,KAAA,CAAM,KAAA,CAAM,QAAA,CAAS,EAAE,CAAC,CAAA,CAAE,CAAA,CAC7F,MAAA,CAAO,KAAK,CAAA;AACf,EAAA,OAAO,KAAK,MAAM,CAAA,CAAA;AACpB","file":"chunk-OSTCU6ZK.js","sourcesContent":["/**\n * `PaymentResult.replayKey` is derived from the payment authorization alone,\n * never from the request id, so the same authorization replayed on another\n * request collides in the receipt store's reservation. The MPP provider uses\n * the EIP-3009 derivation.\n */\nimport { createHash } from 'node:crypto';\nimport { PERMIT2_ADDRESS } from '@x402/evm';\nimport { encodeAbiParameters, keccak256 } from 'viem';\n\nexport interface ReplayKeyInput {\n readonly chainId: number;\n readonly asset: `0x${string}`;\n readonly from: `0x${string}`;\n readonly nonce: `0x${string}`;\n}\n\nexport function computeReplayKey(input: ReplayKeyInput): string {\n const encoded = encodeAbiParameters(\n [{ type: 'uint256' }, { type: 'address' }, { type: 'address' }, { type: 'bytes32' }],\n [BigInt(input.chainId), input.asset, input.from, input.nonce],\n );\n return keccak256(encoded);\n}\n\n/**\n * Identifies a Permit2 authorization by chain, Permit2 contract, owner and\n * nonce. Nonces span all tokens and spenders, so asset and resource are excluded.\n * The tag separates these keys from EIP-3009 in the receipt store's unique column.\n */\nexport function computePermit2ReplayKey(input: {\n readonly chainId: number;\n readonly owner: `0x${string}`;\n readonly nonce: string;\n}): string {\n return keccak256(\n encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'uint256' },\n { type: 'address' },\n { type: 'address' },\n { type: 'uint256' },\n ],\n [\n 'x402/exact/permit2/v1',\n BigInt(input.chainId),\n PERMIT2_ADDRESS,\n input.owner,\n BigInt(input.nonce),\n ],\n ),\n );\n}\n\n/**\n * Identifies a Solana `exact` payment by network and SHA-256 of the signed\n * message bytes. Excludes signatures, including the facilitator's fee payer\n * slot, so altered signatures keep the same key. `messageHash` is the SDK's\n * base64 `transactionMessageHash`.\n */\nexport function computeSvmReplayKey(input: {\n readonly network: string;\n readonly messageHash: string;\n}): string {\n const digest = createHash('sha256')\n .update('x402/exact/svm/v1\\0')\n .update(input.network)\n .update('\\0')\n .update(Buffer.from(input.messageHash, 'base64'))\n .digest('hex');\n return `0x${digest}`;\n}\n\n/**\n * Identifies a NEAR `exact` payment by network, sender, curve-prefixed public\n * key (`ed25519:...`) and delegate nonce. Nonces are scoped per access key,\n * excluding token, recipient, relayer and signature; another key of the same\n * sender has an independent nonce scope.\n */\nexport function computeNearReplayKey(input: {\n readonly network: string;\n readonly senderId: string;\n readonly publicKey: string;\n readonly nonce: bigint;\n}): string {\n const digest = createHash('sha256')\n .update('x402/exact/near/v1\\0')\n .update(`${input.network}\\0${input.senderId}\\0${input.publicKey}\\0${input.nonce.toString(10)}`)\n .digest('hex');\n return `0x${digest}`;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/execution/settlement-order.ts","../../src/payments/x402/networks.ts","../../src/payments/x402/addresses.ts","../../src/payments/x402/payment-flow.ts","../../src/payments/x402/local-chain/accounts.ts"],"names":[],"mappings":"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","file":"chunk-OZ4LAWBK.js","sourcesContent":["/**\n * Set on a payment requirement to run the backend before settlement.\n * The pipeline settles first unless this metadata value is `true`.\n */\nexport const SETTLE_AFTER_BACKEND_METADATA_KEY = 'settleAfterBackend';\n\n/**\n * Set to `true` when the rail permits presenting an authorization again after\n * its attempt was rejected, which settled nothing; the chain still spends each\n * nonce once. The pipeline lets retries reclaim the rejected attempt;\n * otherwise, it refuses them as replays.\n */\nexport const REUSE_REJECTED_AUTHORIZATION_METADATA_KEY = 'reuseRejectedAuthorization';\n","/**\n * Network profiles: family, display name, environment, EVM chain ID and\n * default stablecoin. Config load rejects unknown IDs; parsing an EVM chain\n * ID cannot establish whether it is mainnet. Merchants must declare custom\n * EVM networks under `payments.x402.networks`; built-ins cannot be redeclared.\n *\n * Profiles copy SDK asset defaults to keep config load and the CLI SDK-free.\n * Tests compare each profile with the pinned SDK tables.\n *\n * The local Anvil chain has a profile of its own, `eip155:31337` (Anvil's\n * default chain id), so the network alone tells a local deployment from a\n * public one. Local health checks still require an Anvil response, because an\n * RPC endpoint can report any chain id.\n */\nimport { CommerceError } from '../../core';\n\n/** Chain id of the local Anvil dev chain, Anvil's default */\nexport const LOCAL_CHAIN_ID = 31337;\n\nexport type X402NetworkFamily = 'evm' | 'svm' | 'near';\n\nexport type NetworkKind = 'testnet' | 'mainnet';\n\n/** An EVM network the x402 provider can settle on */\nexport interface NetworkProfile {\n /** CAIP-2 identifier, e.g. `eip155:84532` */\n readonly id: string;\n /** Signed into the buyer's EIP-712 domain */\n readonly chainId: number;\n readonly displayName: string;\n readonly kind: NetworkKind;\n /** The local Anvil dev chain, where the in-process facilitator runs */\n readonly local?: boolean;\n /**\n * Default USDC deployment and EIP-712 domain. EVM offers may name another\n * token; the local chain has no default and requires explicit token metadata.\n *\n * `name` is the signed EIP-712 domain name, not the symbol, and deployments\n * differ: `\"USDC\"` on Base Sepolia, `\"USD Coin\"` on Base.\n */\n readonly canonicalAsset?: {\n readonly symbol: string;\n readonly address: string;\n readonly name: string;\n readonly version: string;\n readonly decimals: number;\n };\n}\n\ninterface NonEvmNetwork<F extends X402NetworkFamily> {\n readonly family: F;\n readonly id: string;\n readonly displayName: string;\n readonly kind: NetworkKind;\n /** Solana mint or NEAR NEP-141 contract account, with no EIP-712 domain */\n readonly canonicalAsset: {\n readonly symbol: string;\n readonly address: string;\n readonly decimals: number;\n };\n}\n\nexport type X402Network =\n | (NetworkProfile & { readonly family: 'evm' })\n | NonEvmNetwork<'svm'>\n | NonEvmNetwork<'near'>;\n\n/** A merchant-declared EVM network, from `payments.x402.networks` */\nexport interface CustomNetworkDeclaration {\n readonly kind: NetworkKind;\n readonly displayName: string;\n}\n\nexport type CustomNetworks = Readonly<Record<string, CustomNetworkDeclaration>>;\n\nconst usdc = (address: string, name: string) =>\n ({ symbol: 'USDC', address, name, version: '2', decimals: 6 }) as const;\n\nconst PROFILES: readonly X402Network[] = [\n {\n family: 'evm',\n id: `eip155:${LOCAL_CHAIN_ID}`,\n chainId: LOCAL_CHAIN_ID,\n displayName: 'Local Anvil',\n kind: 'testnet',\n local: true,\n },\n {\n family: 'evm',\n id: 'eip155:84532',\n chainId: 84532,\n displayName: 'Base Sepolia',\n kind: 'testnet',\n canonicalAsset: usdc('0x036CbD53842c5426634e7929541eC2318f3dCF7e', 'USDC'),\n },\n {\n family: 'evm',\n id: 'eip155:8453',\n chainId: 8453,\n displayName: 'Base',\n kind: 'mainnet',\n canonicalAsset: usdc('0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', 'USD Coin'),\n },\n {\n family: 'evm',\n id: 'eip155:1',\n chainId: 1,\n displayName: 'Ethereum',\n kind: 'mainnet',\n canonicalAsset: usdc('0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', 'USD Coin'),\n },\n {\n family: 'evm',\n id: 'eip155:137',\n chainId: 137,\n displayName: 'Polygon',\n kind: 'mainnet',\n canonicalAsset: usdc('0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359', 'USD Coin'),\n },\n {\n family: 'evm',\n id: 'eip155:42161',\n chainId: 42161,\n displayName: 'Arbitrum One',\n kind: 'mainnet',\n canonicalAsset: usdc('0xaf88d065e77c8cC2239327C5EDb3A432268e5831', 'USD Coin'),\n },\n {\n family: 'evm',\n id: 'eip155:421614',\n chainId: 421614,\n displayName: 'Arbitrum Sepolia',\n kind: 'testnet',\n canonicalAsset: usdc('0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d', 'USD Coin'),\n },\n {\n family: 'evm',\n id: 'eip155:43114',\n chainId: 43114,\n displayName: 'Avalanche C-Chain',\n kind: 'mainnet',\n canonicalAsset: usdc('0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E', 'USD Coin'),\n },\n {\n family: 'svm',\n id: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n displayName: 'Solana',\n kind: 'mainnet',\n canonicalAsset: {\n symbol: 'USDC',\n address: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',\n decimals: 6,\n },\n },\n {\n family: 'svm',\n id: 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n displayName: 'Solana Devnet',\n kind: 'testnet',\n canonicalAsset: {\n symbol: 'USDC',\n address: '4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU',\n decimals: 6,\n },\n },\n // NEAR's USDC contracts are implicit accounts: 64 lowercase hex characters\n {\n family: 'near',\n id: 'near:mainnet',\n displayName: 'NEAR',\n kind: 'mainnet',\n canonicalAsset: {\n symbol: 'USDC',\n address: '17208628f84f5d6ad33f0da3bbbeb27ffcb398eac501a31bd6ad2011e36133a1',\n decimals: 6,\n },\n },\n {\n family: 'near',\n id: 'near:testnet',\n displayName: 'NEAR Testnet',\n kind: 'testnet',\n canonicalAsset: {\n symbol: 'USDC',\n address: '3e2210e1184b45b64c8a434c0a7e7b23cc04ea7eb7a6c3c32520d03d4afcb8af',\n decimals: 6,\n },\n },\n];\n\nconst BY_ID = new Map(PROFILES.map((profile) => [profile.id, profile]));\n\n/** Built-in networks of every family, for tests and diagnostics */\nexport const BUILT_IN_NETWORKS: readonly X402Network[] = PROFILES;\n\n/** The built-in EVM networks the x402 provider settles on without a declaration */\nexport const SUPPORTED_NETWORK_IDS: readonly string[] = PROFILES.filter(\n (p) => p.family === 'evm',\n).map((p) => p.id);\n\n// A chain id viem and EIP-712 can carry as a JS number\nconst EVM_NETWORK_ID = /^eip155:([1-9]\\d{0,15})$/;\n\nfunction invalid(message: string, path: string): CommerceError {\n return new CommerceError('CONFIG_INVALID', message, { details: { path } });\n}\n\n/** Built-in EVM profile for callers using the original network interface */\nexport function findNetworkProfile(id: string): NetworkProfile | undefined {\n const profile = BY_ID.get(id);\n return profile?.family === 'evm' ? profile : undefined;\n}\n\n/** A built-in network of any family, or a declared custom EVM network */\nexport function findX402Network(id: string, custom?: CustomNetworks): X402Network | undefined {\n const builtIn = BY_ID.get(id);\n if (builtIn) return builtIn;\n const declared = custom?.[id];\n const chainId = Number(EVM_NETWORK_ID.exec(id)?.[1]);\n if (!declared || !Number.isSafeInteger(chainId)) return undefined;\n return {\n family: 'evm',\n id,\n chainId,\n displayName: declared.displayName,\n kind: declared.kind,\n };\n}\n\nexport function requireX402Network(id: string, path: string, custom?: CustomNetworks): X402Network {\n const network = findX402Network(id, custom);\n if (!network) {\n throw new CommerceError(\n 'CONFIG_INVALID',\n `${path}: \"${id}\" is not a known network. Built-in CAIP-2 identifiers: ${PROFILES.map((p) => p.id).join(', ')}. Declare another EVM network under payments.x402.networks with its kind and displayName.`,\n { details: { path, network: id } },\n );\n }\n return network;\n}\n\n/**\n * Allows only new `eip155` networks in `payments.x402.networks`. Redeclaring\n * built-ins could relabel mainnet as testnet; Solana and NEAR IDs are SDK-fixed.\n */\nexport function validateCustomNetworks(custom: CustomNetworks, path: string): void {\n for (const id of Object.keys(custom)) {\n const at = `${path}.${id}`;\n if (BY_ID.has(id)) {\n throw invalid(\n `${at}: \"${id}\" is a built-in network and cannot be redeclared; remove this entry`,\n at,\n );\n }\n if (!findX402Network(id, custom)) {\n throw invalid(\n `${at}: \"${id}\" is not an EVM CAIP-2 identifier (\"eip155:\" followed by a positive chain id below 2^53). Only EVM networks can be declared.`,\n at,\n );\n }\n }\n}\n\n/** What a deployment is: the local dev chain, or a public testnet or mainnet */\nexport type DeploymentMode = 'local' | 'testnet' | 'mainnet';\n\nexport function resolveDeploymentMode(profile: {\n readonly kind: NetworkKind;\n readonly local?: boolean;\n}): DeploymentMode {\n return profile.local ? 'local' : profile.kind;\n}\n\n// The banner an operator must not miss. Printed for mainnet only\nconst LIVE_MAINNET_BANNER = 'LIVE MAINNET MODE - REAL FUNDS';\n\nexport function describeDeploymentMode(mode: DeploymentMode): string {\n return mode === 'mainnet' ? LIVE_MAINNET_BANNER : mode.toUpperCase();\n}\n","/**\n * SDK-free address checks for config load and the CLI. EVM addresses compare\n * without case; Solana keys and NEAR account IDs compare exactly.\n */\nimport type { X402Network } from './networks';\n\n// `0x` + 40 hex characters. Config load cannot check the EIP-55 checksum,\n// which needs keccak-256; the x402 and MPP providers refuse a mixed-case\n// address whose checksum is wrong when they start.\nconst EVM_ADDRESS = /^0x[0-9a-fA-F]{40}$/;\nconst EVM_ZERO = /^0x0{40}$/i;\n\n/** `0x` followed by 40 hex characters, in any case */\nexport const isEvmAddress = (value: unknown): value is `0x${string}` =>\n typeof value === 'string' && EVM_ADDRESS.test(value);\n\n/** The EVM zero address, in any case */\nexport const isEvmZeroAddress = (value: string): boolean => EVM_ZERO.test(value);\n\nconst BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n// A 32-byte key is 32 to 44 base58 characters\nconst SOLANA_ADDRESS = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;\n// The all-zero key, which is the System Program and owns nothing recoverable\nconst SOLANA_ZERO = '11111111111111111111111111111111';\nconst EVM_TRANSACTION_HASH = /^0x[0-9a-fA-F]{64}$/;\n// A 64-byte Ed25519 signature is at most 88 base58 characters\nconst SOLANA_SIGNATURE = /^[1-9A-HJ-NP-Za-km-z]{64,88}$/;\n\n// nearcore's account ID rule: 2 to 64 characters, lowercase alphanumeric runs\n// joined by single \"-\", \"_\" or \".\"; implicit accounts are 64 hex characters\nconst NEAR_ACCOUNT_ID = /^(([a-z\\d]+[-_])*[a-z\\d]+\\.)*([a-z\\d]+[-_])*[a-z\\d]+$/;\n// A transaction hash: 32 bytes in base58\nconst NEAR_TRANSACTION_HASH = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;\n\n/**\n * Returns the family's wire address or `undefined`. NEAR uses named or\n * implicit account IDs; a `.near` suffix does not identify the network.\n */\nexport function normalizeAddress(network: X402Network, value: string): string | undefined {\n switch (network.family) {\n case 'evm':\n return isEvmAddress(value) ? value : undefined;\n case 'svm':\n return SOLANA_ADDRESS.test(value) && base58ByteLength(value) === 32 ? value : undefined;\n case 'near':\n return value.length >= 2 && value.length <= 64 && NEAR_ACCOUNT_ID.test(value)\n ? value\n : undefined;\n }\n}\n\n/**\n * An address funds cannot be recovered from: the zero address of its family.\n * NEAR has no zero account.\n */\nexport function isBurnAddress(network: X402Network, wireAddress: string): boolean {\n switch (network.family) {\n case 'evm':\n return isEvmZeroAddress(wireAddress);\n case 'svm':\n return wireAddress === SOLANA_ZERO;\n case 'near':\n return false;\n }\n}\n\n/** Compare EVM addresses case-insensitively, Solana keys and NEAR account IDs exactly */\nexport function sameAddress(network: X402Network, a: string, b: string): boolean {\n return network.family === 'evm' ? a.toLowerCase() === b.toLowerCase() : a === b;\n}\n\n/**\n * A settlement reference in its family's form: an EVM transaction hash, a\n * Solana transaction signature or a NEAR transaction hash\n */\nexport function isTransactionReference(network: X402Network, value: string): boolean {\n switch (network.family) {\n case 'evm':\n return EVM_TRANSACTION_HASH.test(value);\n case 'svm':\n return SOLANA_SIGNATURE.test(value) && base58ByteLength(value) === 64;\n case 'near':\n return NEAR_TRANSACTION_HASH.test(value) && base58ByteLength(value) === 32;\n }\n}\n\nfunction base58ByteLength(value: string): number {\n let n = 0n;\n for (const char of value) n = n * 58n + BigInt(BASE58_ALPHABET.indexOf(char));\n // Each leading '1' encodes one leading zero byte\n const leadingZeros = value.length - value.replace(/^1+/, '').length;\n return leadingZeros + (n === 0n ? 0 : Math.ceil(n.toString(16).length / 2));\n}\n","/**\n * x402 exact-scheme flows, shared by the config loader and CLI.\n * The default `authorization` flow settles after a successful backend call;\n * `upfront` settles first.\n */\nexport const X402_PAYMENT_FLOWS = ['authorization', 'upfront'] as const;\n\nexport type X402PaymentFlow = (typeof X402_PAYMENT_FLOWS)[number];\n\nexport const X402_DEFAULT_PAYMENT_FLOW: X402PaymentFlow = 'authorization';\n","/**\n * Anvil's well-known development accounts.\n *\n * LOCAL DEVELOPMENT ONLY - DO NOT FUND. The keys come from Foundry's public\n * default mnemonic (\"test test ... junk\"), so value sent to these addresses on\n * a real network can be taken by anyone.\n *\n * Index layout on the local demo chain:\n * 0 - deployer and local facilitator signer (pays gas, broadcasts settlement)\n * 1 - merchant settlement destination (`payTo`)\n * 2 - buyer (signs EIP-3009 authorizations; never held by the gateway)\n */\nexport interface AnvilWellKnownAccount {\n readonly address: `0x${string}`;\n readonly privateKey: `0x${string}`;\n}\n\n/** A fixed-length tuple, so indexing by the layout above is typed */\nexport const ANVIL_WELL_KNOWN_ACCOUNTS: readonly [\n AnvilWellKnownAccount,\n AnvilWellKnownAccount,\n AnvilWellKnownAccount,\n] = [\n {\n address: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',\n privateKey: '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',\n },\n {\n address: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8',\n privateKey: '0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d',\n },\n {\n address: '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC',\n privateKey: '0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a',\n },\n];\n\nexport const LOCAL_FACILITATOR_ACCOUNT = ANVIL_WELL_KNOWN_ACCOUNTS[0];\nexport const LOCAL_MERCHANT_ACCOUNT = ANVIL_WELL_KNOWN_ACCOUNTS[1];\nexport const LOCAL_BUYER_ACCOUNT = ANVIL_WELL_KNOWN_ACCOUNTS[2];\n\n/** Label printed wherever a dev key appears in output, logs or manifests */\nexport const DEV_KEY_LABEL = 'LOCAL DEVELOPMENT ONLY - DO NOT FUND';\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/config/filename.ts","../../src/core/execution/backend-request.ts","../../src/core/execution/backend-http.ts","../../src/core/execution/validation.ts","../../src/core/execution/pipeline/authorization.ts","../../src/core/execution/pipeline/challenge.ts","../../src/core/execution/pipeline/admission.ts","../../src/core/execution/pipeline/context.ts","../../src/core/execution/pipeline/settlement.ts","../../src/core/execution/pipeline/index.ts","../../src/core/execution/registry.ts","../../src/core/execution/store-event-sink.ts","../../src/protocols/acp/constants.ts"],"names":["url","durationMs"],"mappings":"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","file":"chunk-PIMFPCNZ.js","sourcesContent":["/**\n * The default configuration filename, shared by the loader, `init`'s default\n * output path and the `--config` help text.\n *\n * Its own module with no imports: `src/cli` loads the rest of `src/config`\n * only through a dynamic import (`src/cli/lib/config-client.ts`), so a broken\n * config module cannot take down commands that never read configuration. A\n * leaf with no module graph can be imported statically without undoing that.\n */\nexport const DEFAULT_CONFIG_FILENAME = 'config.yaml';\n","/**\n * Shapes a backend request from validated input: the path template, query,\n * body and forwarded headers. The pipeline checks the shape before pricing, so\n * a request the backend cannot receive fails before any payment.\n */\nimport type { BackendHandler, BackendMethod } from '../domain/resource';\nimport { CommerceError } from '../errors';\nimport { isRecord } from '../is-record';\n\n// Never forward credentials, transport headers or fields set by the executor\nconst NEVER_FORWARDED_HEADER =\n /^(authorization|cookie|set-cookie|host|content-length|content-type|connection|keep-alive|te|trailer|transfer-encoding|upgrade|idempotency-key|proxy-.*)$/;\n\n// The one `{param}` grammar, shared by substitution, config, `doctor` and the\n// OpenAPI importer. It admits `-` and `.` because\n// `/report/{report-id}` is ordinary REST. Config refuses any other brace\n// (findUnparsedBraceToken).\nconst PATH_PARAM_PATTERN = /\\{([a-zA-Z0-9_.-]+)\\}/g;\n\n/**\n * `{param}` names in a `backend.url` template, in declaration order. Config,\n * `doctor` and the OpenAPI importer use it so they read the same grammar as\n * substitution.\n */\nexport function extractPathParameterNames(url: string): string[] {\n return [...url.matchAll(PATH_PARAM_PATTERN)].map((match) => match[1] as string);\n}\n\n/**\n * A brace left over after every legal `{param}` is removed, or `undefined`.\n *\n * `{report id}`, `{a/b}`, `{}` and an unbalanced `{` match no parameter and\n * would reach the backend as literals, which on a paid resource means payment\n * without delivery. Config refuses any such residue, and the OpenAPI importer\n * skips the operation.\n */\nexport function findUnparsedBraceToken(url: string): string | undefined {\n const residue = url.replace(PATH_PARAM_PATTERN, '');\n const index = residue.search(/[{}]/);\n if (index === -1) return undefined;\n // Report the offending run, not just the character, so the error is fixable\n const token = /\\{[^{}]*\\}?|\\}/.exec(residue.slice(index));\n return token?.[0] ?? residue[index];\n}\n\n/**\n * Check path values, query collisions and headers before pricing. `call()`\n * repeats these checks. Invalid input or forwarded headers raise\n * `INPUT_INVALID`; invalid configured headers raise `BACKEND_ERROR`.\n * An unparseable URL remains a call-time error. Does no I/O.\n */\nexport function validateBackendRequestShape(\n handler: BackendHandler,\n input: unknown,\n context: ShapeContext,\n backendHeaders?: Readonly<Record<string, string>>,\n): void {\n const inputRecord = isRecord(input) ? input : {};\n\n // Every shape error (missing or invalid path parameter, a bound group that is\n // not an object) throws INPUT_INVALID here\n const parts = buildBackendRequestParts(handler, inputRecord, context);\n // Config refuses a bad header at load; this covers a hand-built resource\n buildHeaders(handler, context, backendHeaders);\n\n let target: URL;\n try {\n target = new URL(parts.url);\n } catch {\n return; // call() raises BACKEND_ERROR for an unparseable URL\n }\n checkQueryCollision(target, parts.query, context);\n}\n\ntype ShapeContext = { readonly requestId: string; readonly resourceId: string };\n\n// The path-templated URL plus the query and body values a request carries\ninterface BackendRequestParts {\n readonly url: string;\n readonly query: Record<string, unknown>;\n // Present when a JSON body should be sent; `value` is what gets encoded\n readonly body?: { readonly value: unknown };\n}\n\nfunction acceptsBody(method: BackendMethod): boolean {\n return method !== 'GET' && method !== 'DELETE';\n}\n\n/**\n * Split validated input into URL, query and body according to\n * `handler.inputBindings`. `call()` and `validateBackendRequestShape()` both\n * use it, so they cannot disagree about the request an input describes. Throws\n * only `CommerceError('INPUT_INVALID')`.\n */\nexport function buildBackendRequestParts(\n handler: BackendHandler,\n input: Record<string, unknown>,\n context: ShapeContext,\n): BackendRequestParts {\n const bindings = handler.inputBindings;\n if (bindings === undefined) {\n const { url, remaining } = applyPathTemplate(handler.url, input, context);\n return acceptsBody(handler.method)\n ? { url, query: {}, body: { value: remaining } }\n : { url, query: remaining };\n }\n\n const pathValues =\n bindings.path === undefined ? {} : resolveBoundGroup(input, bindings.path, 'path', context);\n const { url } = applyPathTemplate(handler.url, pathValues, context);\n const query =\n bindings.query === undefined ? {} : resolveBoundGroup(input, bindings.query, 'query', context);\n\n // An absent body value sends no body rather than `null`. A required body is\n // enforced earlier, by `required` in the resource's input schema.\n const bodyValue = bindings.body === undefined ? undefined : input[bindings.body];\n if (bodyValue === undefined || !acceptsBody(handler.method)) return { url, query };\n return { url, query, body: { value: bodyValue } };\n}\n\nfunction resolveBoundGroup(\n input: Record<string, unknown>,\n key: string,\n kind: 'path' | 'query',\n context: ShapeContext,\n): Record<string, unknown> {\n const value = input[key];\n if (value === undefined) return {};\n if (!isRecord(value)) {\n throw new CommerceError(\n 'INPUT_INVALID',\n `Input \"${key}\" must be an object of ${kind} parameters`,\n { ...context, details: { field: key } },\n );\n }\n return value;\n}\n\nexport function checkQueryCollision(\n target: URL,\n remaining: Record<string, unknown>,\n context: { readonly requestId: string; readonly resourceId: string },\n): void {\n const templateKeys = new Set(target.searchParams.keys());\n for (const key of Object.keys(remaining)) {\n if (templateKeys.has(key)) {\n throw new CommerceError(\n 'INPUT_INVALID',\n `Input key \"${key}\" collides with a query parameter already set on backend.url`,\n { requestId: context.requestId, resourceId: context.resourceId, details: { field: key } },\n );\n }\n }\n}\n\n// encodeURIComponent leaves \".\" alone, and new URL() then resolves a \".\" or\n// \"..\" segment, stepping outside the template's directory. Slashes are\n// escaped, so only these exact values (and \"\", an empty segment) need refusing.\nconst TRAVERSAL_PATH_VALUES = new Set(['', '.', '..']);\n\nfunction applyPathTemplate(\n template: string,\n input: Record<string, unknown>,\n context: ShapeContext,\n): { url: string; remaining: Record<string, unknown> } {\n const remaining: Record<string, unknown> = { ...input };\n let missing: string | undefined;\n let invalid: string | undefined;\n const url = template.replace(PATH_PARAM_PATTERN, (_match, key: string) => {\n // Object.hasOwn, not `in`: a parameter named \"constructor\" or \"toString\"\n // would otherwise resolve to the inherited Object.prototype member\n if (!Object.hasOwn(remaining, key)) {\n missing = key;\n return '';\n }\n const value = remaining[key];\n delete remaining[key];\n const raw = stringifyPrimitive(value);\n if (TRAVERSAL_PATH_VALUES.has(raw)) {\n invalid = key;\n return '';\n }\n return encodeURIComponent(raw);\n });\n if (missing !== undefined) {\n // Config refuses a template parameter the input schema cannot supply.\n // This covers a hand-built `CommerceResource` that skipped config: through\n // validateBackendRequestShape it fails before payment, instead of calling\n // the backend with an empty path segment.\n throw new CommerceError('INPUT_INVALID', `Path parameter \"${missing}\" was not supplied`, {\n ...context,\n details: { field: missing },\n });\n }\n if (invalid !== undefined) {\n throw new CommerceError('INPUT_INVALID', `Path parameter \"${invalid}\" is not a valid value`, {\n ...context,\n details: { field: invalid },\n });\n }\n return { url, remaining };\n}\n\nexport function stringifyPrimitive(value: unknown): string {\n if (value === undefined || value === null) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\n// `Headers` throws a TypeError on an illegal name or value. The error is\n// rethrown typed and without `cause`: the TypeError quotes the value, which may\n// be a credential.\nexport function buildHeaders(\n handler: BackendHandler,\n context: ShapeContext,\n forwarded: Readonly<Record<string, string>> = {},\n): Headers {\n let headers: Headers;\n try {\n headers = new Headers(handler.headers);\n } catch {\n throw invalidHeaderError(context);\n }\n // Caller headers cannot replace operator-configured backend credentials\n for (const [name, value] of Object.entries(forwarded)) {\n if (NEVER_FORWARDED_HEADER.test(name.toLowerCase())) continue;\n try {\n if (!headers.has(name)) headers.set(name, value);\n } catch {\n throw new CommerceError('INPUT_INVALID', 'A forwarded request header is invalid', {\n ...context,\n details: { reason: 'invalid-forwarded-header' },\n });\n }\n }\n return headers;\n}\n\nexport function setHeader(\n headers: Headers,\n name: string,\n value: string,\n context: ShapeContext,\n): void {\n try {\n headers.set(name, value);\n } catch {\n throw invalidHeaderError(context);\n }\n}\n\nfunction invalidHeaderError(context: ShapeContext): CommerceError {\n return new CommerceError('BACKEND_ERROR', 'Backend request headers are invalid', {\n ...context,\n details: { reason: 'invalid-header' },\n });\n}\n","/**\n * The built-in outbound HTTP path to a merchant backend.\n *\n * - Global `fetch`, always bounded by `AbortSignal.timeout`.\n * - `redirect: 'manual'`: a 3xx response is a `BACKEND_ERROR`, never followed\n * (SSRF hardening).\n * - `{param}` segments in `handler.url` are filled from validated input and\n * URL-encoded; the rest is mapped as `BackendHandler.inputBindings`\n * describes (see `backend-request.ts`).\n */\nimport { type BackendHandler, DEFAULT_BACKEND_TIMEOUT_MS } from '../domain/resource';\nimport { CommerceError, isCommerceError } from '../errors';\nimport type { BackendExecutor, BackendRequest, BackendResponse } from '../interfaces/backend';\nimport { type Logger, NOOP_LOGGER } from '../interfaces/logger';\nimport { isRecord } from '../is-record';\nimport {\n buildBackendRequestParts,\n buildHeaders,\n checkQueryCollision,\n setHeader,\n stringifyPrimitive,\n} from './backend-request';\n\nconst MAX_BODY_SNIPPET_LENGTH = 512;\n\n// How a merchant recognizes a repeat of an operation. The de facto standard\n// name, and the one ACP requires inbound.\nconst IDEMPOTENCY_KEY_HEADER = 'idempotency-key';\n\n// The timeout bounds a response by time, not bytes; this stops a hostile or\n// broken backend from filling memory\nconst MAX_RESPONSE_BODY_BYTES = 1024 * 1024;\n\nexport interface HttpBackendExecutorOptions {\n /** Override for `fetch`, used in tests. Defaults to the global implementation */\n readonly fetchImpl?: typeof fetch;\n /** Receives a non-2xx backend body at debug level; it never reaches the client */\n readonly logger?: Logger;\n}\n\n/**\n * Merchant non-2xx response attached as the `BACKEND_ERROR` cause. Adapters\n * can inspect its body and headers; client errors omit the cause.\n */\nexport class BackendErrorResponse {\n constructor(\n readonly status: number,\n readonly body: unknown,\n /** Lowercase names, as `Headers` yields them */\n readonly headers: Readonly<Record<string, string>> = {},\n ) {}\n}\n\nexport class HttpBackendExecutor implements BackendExecutor {\n private readonly fetchImpl: typeof fetch;\n private readonly logger: Logger;\n\n constructor(options: HttpBackendExecutorOptions = {}) {\n this.fetchImpl = options.fetchImpl ?? fetch;\n this.logger = options.logger ?? NOOP_LOGGER;\n }\n\n async call(handler: BackendHandler, request: BackendRequest): Promise<BackendResponse> {\n const timeoutMs = handler.timeoutMs ?? DEFAULT_BACKEND_TIMEOUT_MS;\n const inputRecord = isRecord(request.input) ? request.input : {};\n\n const context = { requestId: request.requestId, resourceId: request.resourceId };\n // Throws INPUT_INVALID for every shape problem. The pipeline already ran it\n // before payment through validateBackendRequestShape(); this copy covers a\n // caller that bypasses the pipeline.\n const parts = buildBackendRequestParts(handler, inputRecord, context);\n\n let target: URL;\n try {\n target = new URL(parts.url);\n } catch (error) {\n throw new CommerceError('BACKEND_ERROR', 'Backend URL could not be constructed from input', {\n ...context,\n details: { reason: 'invalid-url' },\n cause: error,\n });\n }\n\n // Beyond the per-parameter check: the resolved path must stay under the\n // template's literal prefix (everything before the first `{`)\n const prefixPathname = literalPrefixPathname(handler);\n if (prefixPathname !== undefined && !target.pathname.startsWith(prefixPathname)) {\n throw new CommerceError(\n 'INPUT_INVALID',\n 'Path parameters resolved outside the configured backend path',\n context,\n );\n }\n\n const headers = buildHeaders(handler, context, request.backendHeaders);\n // Replaces a configured header of the same name, unlike content-type below:\n // a static key would make every request look like a retry of the first\n if (request.idempotencyKey !== undefined) {\n setHeader(headers, IDEMPOTENCY_KEY_HEADER, request.idempotencyKey, context);\n }\n let body: string | undefined;\n\n // searchParams.set() replaces an existing param, so a caller key named\n // like an operator's query param (`?apikey=SECRET` in handler.url) would\n // overwrite it. validateBackendRequestShape() runs the same check before\n // payment.\n checkQueryCollision(target, parts.query, context);\n for (const [key, value] of Object.entries(parts.query)) {\n target.searchParams.set(key, stringifyPrimitive(value));\n }\n if (parts.body !== undefined) {\n body = JSON.stringify(parts.body.value);\n // A configured Content-Type, such as `application/vnd.x+json`, wins\n if (!headers.has('content-type')) headers.set('content-type', 'application/json');\n }\n\n const started = performance.now();\n let response: Response;\n try {\n response = await this.fetchImpl(target, {\n method: handler.method,\n headers,\n ...(body !== undefined ? { body } : {}),\n redirect: 'manual',\n signal: AbortSignal.timeout(timeoutMs),\n });\n } catch (error) {\n const durationMs = Math.round(performance.now() - started);\n if (isAbortError(error)) {\n throw new CommerceError(\n 'BACKEND_TIMEOUT',\n `Backend request timed out after ${timeoutMs}ms`,\n {\n requestId: request.requestId,\n resourceId: request.resourceId,\n details: { timeoutMs, durationMs },\n cause: error,\n },\n );\n }\n throw new CommerceError('BACKEND_ERROR', 'Backend request failed (transport error)', {\n requestId: request.requestId,\n resourceId: request.resourceId,\n details: { durationMs },\n cause: error,\n });\n }\n const durationMs = Math.round(performance.now() - started);\n\n const isRedirect =\n response.type === 'opaqueredirect' || (response.status >= 300 && response.status < 400);\n if (isRedirect) {\n throw new CommerceError(\n 'BACKEND_ERROR',\n 'Backend responded with a redirect, which is not followed',\n {\n requestId: request.requestId,\n resourceId: request.resourceId,\n details: { status: response.status, reason: 'redirect-not-followed' },\n },\n );\n }\n\n const responseHeaders = Object.fromEntries(response.headers);\n const contentType = response.headers.get('content-type') ?? '';\n let parsedBody: unknown;\n try {\n parsedBody = await parseBody(response, contentType);\n } catch (error) {\n const tooLarge = isCommerceError(error);\n throw new CommerceError(\n 'BACKEND_ERROR',\n tooLarge\n ? 'Backend response exceeded the maximum allowed size'\n : 'Backend response could not be read',\n {\n requestId: request.requestId,\n resourceId: request.resourceId,\n details: tooLarge\n ? { reason: 'response-too-large', maxBytes: MAX_RESPONSE_BODY_BYTES }\n : { reason: 'read-error' },\n cause: error,\n },\n );\n }\n\n if (response.status < 200 || response.status >= 300) {\n // The status may reach the client, but the body is logged at debug level\n // only: a backend in verbose error mode emits stack traces, hostnames or\n // SQL fragments, and the caller may be anonymous\n this.logger.debug(\n {\n requestId: request.requestId,\n resourceId: request.resourceId,\n status: response.status,\n bodySnippet: truncateSnippet(parsedBody),\n },\n 'Backend responded with a non-2xx status',\n );\n throw new CommerceError('BACKEND_ERROR', `Backend responded with status ${response.status}`, {\n requestId: request.requestId,\n resourceId: request.resourceId,\n details: { status: response.status },\n cause: new BackendErrorResponse(response.status, parsedBody, responseHeaders),\n });\n }\n\n return {\n status: response.status,\n headers: responseHeaders,\n body: parsedBody,\n durationMs,\n };\n }\n}\n\n// `handler.url` never changes, so its literal prefix is parsed once per handler.\n// `null` records a prefix that is not a URL, as when a parameter sits in the\n// host (which config refuses); the containment check is then skipped.\nconst prefixPathnames = new WeakMap<BackendHandler, string | null>();\n\nfunction literalPrefixPathname(handler: BackendHandler): string | undefined {\n let cached = prefixPathnames.get(handler);\n if (cached === undefined) {\n try {\n cached = new URL(handler.url.split('{')[0] ?? handler.url).pathname;\n } catch {\n cached = null;\n }\n prefixPathnames.set(handler, cached);\n }\n return cached ?? undefined;\n}\n\nasync function readBodyCapped(response: Response, maxBytes: number): Promise<string> {\n if (!response.body) return '';\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n total += value.byteLength;\n if (total > maxBytes) {\n await reader.cancel();\n // The only CommerceError parseBody can throw, which is how its caller\n // tells an oversized body from a read failure\n throw new CommerceError('BACKEND_ERROR', `response body exceeded ${maxBytes} bytes`);\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n return Buffer.concat(chunks).toString('utf8');\n}\n\nasync function parseBody(response: Response, contentType: string): Promise<unknown> {\n const text = await readBodyCapped(response, MAX_RESPONSE_BODY_BYTES);\n if (text.length === 0) return text;\n if (contentType.includes('json')) {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }\n return text;\n}\n\nfunction truncateSnippet(body: unknown): string {\n const text = typeof body === 'string' ? body : safeStringify(body);\n return text.length > MAX_BODY_SNIPPET_LENGTH\n ? `${text.slice(0, MAX_BODY_SNIPPET_LENGTH)}…`\n : text;\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && (error.name === 'TimeoutError' || error.name === 'AbortError');\n}\n","/**\n * A small JSON Schema validator for resource input.\n *\n * Supported subset (draft 2020-12 vocabulary, structural only):\n * - `type`: \"object\" | \"string\" | \"number\" | \"integer\" | \"boolean\" | \"array\" |\n * \"null\", or an array of those (e.g. `[\"object\", \"null\"]`)\n * - `properties` (validated recursively)\n * - `required` (string[])\n * - `additionalProperties` (boolean, or a schema applied to extra properties)\n * - `enum` (allowed values; objects and arrays compared structurally, in any key\n * order)\n * - `items` (one schema applied to every array element, no tuple form)\n *\n * Not enforced: `minLength`, `maxLength`, `pattern`, `format`, `minimum`,\n * `maximum`, `exclusiveMinimum/Maximum`, `multipleOf`, `oneOf`, `anyOf`,\n * `allOf`, `not`, `$ref`, `const`, `patternProperties`, `minItems`,\n * `maxItems`, `uniqueItems`, tuple-form `items`, and a `type` naming anything\n * outside the list above. Config warns at load when a schema uses one of these\n * keywords or a tuple `items`.\n */\nimport { isDeepStrictEqual } from 'node:util';\nimport type { JsonSchema } from '../domain/common';\nimport { isRecord } from '../is-record';\n\nexport interface FieldError {\n readonly path: string;\n readonly message: string;\n}\n\nexport type ValidationResult =\n | { readonly valid: true; readonly value: unknown }\n | { readonly valid: false; readonly errors: readonly FieldError[] };\n\nexport type Validator = (input: unknown) => ValidationResult;\n\nconst SUPPORTED_TYPES = new Set([\n 'object',\n 'string',\n 'number',\n 'integer',\n 'boolean',\n 'array',\n 'null',\n]);\n\n/** Wrap a resource `inputSchema` in a reusable validator function */\nexport function compileJsonSchema(schema: JsonSchema | undefined): Validator {\n return (input: unknown): ValidationResult => {\n if (schema === undefined) return { valid: true, value: input };\n const errors = validateNode(schema, input, '$');\n return errors.length === 0 ? { valid: true, value: input } : { valid: false, errors };\n };\n}\n\nfunction matchesType(type: string, value: unknown): boolean {\n switch (type) {\n case 'object':\n return isRecord(value);\n case 'array':\n return Array.isArray(value);\n case 'string':\n return typeof value === 'string';\n case 'boolean':\n return typeof value === 'boolean';\n case 'number':\n return typeof value === 'number' && Number.isFinite(value);\n case 'integer':\n return typeof value === 'number' && Number.isInteger(value);\n case 'null':\n return value === null;\n default:\n return true;\n }\n}\n\nfunction describeType(value: unknown): string {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'array';\n return typeof value;\n}\n\n// `===` first keeps a top-level -0 equal to 0; isDeepStrictEqual alone would not\nfunction deepEqual(a: unknown, b: unknown): boolean {\n return a === b || isDeepStrictEqual(a, b);\n}\n\nfunction own(obj: Record<string, unknown>, key: string): unknown {\n return Object.hasOwn(obj, key) ? obj[key] : undefined;\n}\n\n// `type` may be a string or an array of strings, e.g. `[\"object\", \"null\"]`. An\n// array with a non-string entry is ignored rather than guessed at.\nfunction typeList(raw: unknown): string[] | undefined {\n if (typeof raw === 'string') return [raw];\n if (Array.isArray(raw) && raw.every((entry): entry is string => typeof entry === 'string')) {\n return raw;\n }\n return undefined;\n}\n\n/**\n * Whether a schema node is an object schema: its `type` includes \"object\"\n * (`[\"object\", \"null\"]` counts), or it has no `type` and declares `properties`\n * or `required`.\n *\n * Config's `defaultClosedObjectSchema` uses it to close schemas and this\n * validator uses it to enforce them. With two definitions, a node could stay\n * open while config believes it closed.\n */\nexport function isObjectSchemaNode(schema: Record<string, unknown>): boolean {\n const types = typeList(schema['type']);\n if (types !== undefined) return types.includes('object');\n return Object.hasOwn(schema, 'properties') || Object.hasOwn(schema, 'required');\n}\n\nfunction validateNode(schema: JsonSchema, value: unknown, path: string): FieldError[] {\n const errors: FieldError[] = [];\n const types = typeList(own(schema, 'type'));\n const recognizedTypes = types?.filter((entry) => SUPPORTED_TYPES.has(entry));\n\n if (\n types !== undefined &&\n recognizedTypes !== undefined &&\n recognizedTypes.length === types.length &&\n types.length > 0\n ) {\n if (!types.some((entry) => matchesType(entry, value))) {\n errors.push({\n path,\n message: `expected type \"${types.join(' | ')}\" but got ${describeType(value)}`,\n });\n return errors;\n }\n }\n\n const enumRaw = own(schema, 'enum');\n if (Array.isArray(enumRaw)) {\n const allowed = enumRaw as unknown[];\n if (!allowed.some((candidate) => deepEqual(candidate, value))) {\n errors.push({ path, message: `must be one of ${JSON.stringify(allowed)}` });\n }\n }\n\n if (isObjectSchemaNode(schema) && isRecord(value)) {\n errors.push(...validateObject(schema, value, path));\n } else if ((types?.includes('array') ?? false) && Array.isArray(value)) {\n errors.push(...validateArray(schema, value, path));\n }\n\n return errors;\n}\n\nfunction validateObject(\n schema: JsonSchema,\n value: Record<string, unknown>,\n path: string,\n): FieldError[] {\n const errors: FieldError[] = [];\n const propsRaw = own(schema, 'properties');\n const properties = isRecord(propsRaw) ? propsRaw : {};\n const requiredRaw = own(schema, 'required');\n const required = Array.isArray(requiredRaw)\n ? requiredRaw.filter((entry): entry is string => typeof entry === 'string')\n : [];\n\n for (const key of required) {\n // Object.hasOwn, not `in`: `in` walks the prototype chain, so a required\n // \"toString\" or \"__proto__\" would always look present\n if (!Object.hasOwn(value, key)) {\n errors.push({ path: `${path}.${key}`, message: 'is required' });\n }\n }\n\n const additional = own(schema, 'additionalProperties');\n\n for (const key of Object.keys(value)) {\n // Own-property lookup: `properties[\"toString\"]` would find the inherited\n // member and skip the additionalProperties check below\n const propSchemaRaw = own(properties, key);\n if (propSchemaRaw !== undefined) {\n if (isRecord(propSchemaRaw)) {\n errors.push(...validateNode(propSchemaRaw, value[key], `${path}.${key}`));\n }\n continue;\n }\n if (additional === false) {\n errors.push({ path: `${path}.${key}`, message: 'additional property not allowed' });\n } else if (isRecord(additional)) {\n errors.push(...validateNode(additional, value[key], `${path}.${key}`));\n }\n }\n\n return errors;\n}\n\nfunction validateArray(schema: JsonSchema, value: unknown[], path: string): FieldError[] {\n const errors: FieldError[] = [];\n const itemsRaw = own(schema, 'items');\n if (isRecord(itemsRaw)) {\n value.forEach((item, index) => {\n errors.push(...validateNode(itemsRaw, item, `${path}[${index}]`));\n });\n }\n return errors;\n}\n","// Verifies and reserves the authorization a resource requires, before its payment is reserved\nimport type { AuthorizationProvider, AuthorizationVerification } from '../../domain/authorization';\nimport type { AuthorizationMethodName } from '../../domain/common';\nimport type { PaymentRequirement } from '../../domain/payment';\nimport type { CanonicalRequest } from '../../domain/request';\nimport type { CommerceResource } from '../../domain/resource';\nimport { CommerceError, describeError, isCommerceError } from '../../errors';\nimport type { AuthorizationHold, PipelineContext } from './context';\n\n// The provider for each method a resource requires, in the resource's order.\n// Config refuses a method that is not enabled at load; it is checked again\n// because missing it here would serve the resource with no authorization.\nexport function resolveAuthorizationProviders(\n providers: readonly AuthorizationProvider[],\n resource: CommerceResource,\n requestId: string,\n): readonly AuthorizationProvider[] {\n const required = resource.authorization?.required ?? [];\n return required.map((method: AuthorizationMethodName) => {\n const found = providers.find((provider) => provider.name === method);\n if (!found) {\n throw new CommerceError(\n 'CONFIG_INVALID',\n `Resource \"${resource.id}\" requires authorization method \"${method}\", which is not enabled`,\n { requestId, resourceId: resource.id },\n );\n }\n return found;\n });\n}\n\nexport type AuthorizeAndReserve = (\n request: CanonicalRequest,\n resource: CommerceResource,\n providers: readonly AuthorizationProvider[],\n requirement: PaymentRequirement,\n input: unknown,\n) => Promise<AuthorizationHold | undefined>;\n\nexport function createAuthorizeAndReserve(ctx: PipelineContext): AuthorizeAndReserve {\n const { options, safeEmit, buildEvent } = ctx;\n\n // Verify and reserve what the resource requires, or undefined if it requires\n // none. Runs after payment verification, which has no side effect, so a bad\n // payment proof cannot burn a reservation.\n async function authorizeAndReserve(\n request: CanonicalRequest,\n resource: CommerceResource,\n providers: readonly AuthorizationProvider[],\n requirement: PaymentRequirement,\n input: unknown,\n ): Promise<AuthorizationHold | undefined> {\n if (providers.length === 0) return undefined;\n\n const submission = request.authorization;\n const provider = providers.find((candidate) => candidate.name === submission?.method);\n // A request carries one proof, so a resource requiring two methods is\n // refused here rather than half-checked\n const unmet = providers.filter((candidate) => candidate !== provider).map((c) => c.name);\n\n if (submission === undefined || provider === undefined || unmet.length > 0) {\n await safeEmit(\n buildEvent({\n type: 'authorization.rejected',\n requestId: request.requestId,\n resourceId: resource.id,\n adapter: request.protocol,\n status: 'error',\n data: { reason: 'AUTHORIZATION_REQUIRED', methods: unmet },\n }),\n );\n throw new CommerceError(\n 'AUTHORIZATION_REQUIRED',\n `Resource \"${resource.id}\" requires authorization: ${unmet.join(', ')}`,\n {\n requestId: request.requestId,\n resourceId: resource.id,\n details: { required: providers.map((candidate) => candidate.name), missing: unmet },\n },\n );\n }\n\n let verification: AuthorizationVerification;\n try {\n verification = await provider.verifyAndReserve({\n requestId: request.requestId,\n resourceId: resource.id,\n input,\n submission,\n requirement,\n });\n } catch (error) {\n // An untyped throw says nothing about whose fault it was. Unavailable is\n // honest and retryable; invalid would blame the buyer for our outage.\n const mapped = isCommerceError(error)\n ? error\n : new CommerceError(\n 'AUTHORIZATION_PROVIDER_UNAVAILABLE',\n 'Authorization provider is unavailable',\n {\n requestId: request.requestId,\n resourceId: resource.id,\n cause: error,\n },\n );\n await safeEmit(\n buildEvent({\n type: 'authorization.rejected',\n requestId: request.requestId,\n resourceId: resource.id,\n adapter: request.protocol,\n status: 'error',\n data: { reason: mapped.code, method: provider.name },\n }),\n );\n throw mapped;\n }\n\n await safeEmit(\n buildEvent({\n type: 'authorization.verified',\n requestId: request.requestId,\n resourceId: resource.id,\n adapter: request.protocol,\n status: 'ok',\n data: { method: verification.method, reference: verification.reference },\n }),\n );\n\n const context = { requestId: request.requestId, resourceId: resource.id };\n return {\n record: {\n method: verification.method,\n reference: verification.reference,\n ...(verification.metadata !== undefined ? { metadata: verification.metadata } : {}),\n },\n async finalize(action) {\n try {\n await provider[action](verification.reservationId, context);\n } catch (error) {\n // A failure leaves the reservation reserved, which is still\n // unspendable, so the caller's outcome stands\n options.logger.error(\n { err: describeError(error), requestId: request.requestId, action },\n 'Authorization finalization failed; the reservation stays reserved',\n );\n }\n },\n };\n }\n\n return authorizeAndReserve;\n}\n","// What a refused or replayed payment answers with: the unused challenge, when one may be retried\nimport type { PaymentRequirement } from '../../domain/payment';\nimport { CommerceError } from '../../errors';\n\n// A refusal leaves this request's challenge unused. Return it with the\n// provider's reason so the client can retry without fetching another challenge\nexport function retryChallenge(\n requirement: PaymentRequirement,\n reason?: string,\n): { details?: Record<string, unknown> } {\n const envelope = requirement.challenge.envelope;\n if (envelope === undefined && reason === undefined) return {};\n return {\n details: {\n ...(envelope !== undefined ? { challenge: envelope } : {}),\n ...(reason !== undefined ? { reason } : {}),\n },\n };\n}\n\n// Attempt statuses the pipeline treats as finished when handling a replay. The\n// legacy `failed` is not one: it recorded any throw from settle(), so it may\n// hide a transfer, like `settlement-uncertain`.\nconst FINISHED_ATTEMPT_STATUSES: ReadonlySet<string> = new Set(['settled', 'rejected']);\n\n// Include the paid offer's network for the rail's replay code. Finished\n// attempts get 402 with a fresh challenge; unfinished or unreadable attempts\n// keep 409 to avoid prompting a second payment.\nexport function replayError(error: CommerceError, requirement: PaymentRequirement): CommerceError {\n if (error.code !== 'PAYMENT_REPLAYED') return error;\n const status = error.details?.['attemptStatus'];\n const finished = typeof status === 'string' && FINISHED_ATTEMPT_STATUSES.has(status);\n const network = requirement.network;\n if (!finished && network === undefined) return error;\n return new CommerceError('PAYMENT_REPLAYED', error.message, {\n ...(error.requestId !== undefined ? { requestId: error.requestId } : {}),\n ...(error.resourceId !== undefined ? { resourceId: error.resourceId } : {}),\n ...(finished ? { httpStatus: 402 } : {}),\n details: {\n ...error.details,\n ...(network !== undefined ? { network } : {}),\n ...(finished ? retryChallenge(requirement).details : {}),\n },\n });\n}\n","// The payment phase: challenge, offer selection, verification, and the authorization and replay reservations\n\nimport type { PaymentMethodName } from '../../domain/common';\nimport type { PaymentProvider, PaymentRequirement, PaymentResult } from '../../domain/payment';\nimport type { CanonicalRequest, PaymentRequiredOutcome } from '../../domain/request';\nimport type { CommerceResource, Pricing } from '../../domain/resource';\nimport { CommerceError, isCommerceError, toCommerceError } from '../../errors';\nimport { REUSE_REJECTED_AUTHORIZATION_METADATA_KEY } from '../settlement-order';\nimport { type AuthorizeAndReserve, resolveAuthorizationProviders } from './authorization';\nimport { replayError, retryChallenge } from './challenge';\nimport type { PipelineContext, SettleArgs } from './context';\n\n/** A verified payment whose authorization and replay identity are reserved */\nexport interface AdmittedPayment {\n readonly kind: 'admitted';\n readonly settleArgs: SettleArgs;\n}\n\nexport type AdmitPayment = (\n request: CanonicalRequest,\n resource: CommerceResource,\n pricing: Extract<Pricing, { type: 'fixed' }>,\n validInput: unknown,\n) => Promise<PaymentRequiredOutcome | AdmittedPayment>;\n\n/**\n * Builds the payment phase. It returns the challenge when the request carries\n * no proof, and otherwise verifies the proof and reserves the authorization\n * and replay identity, or throws.\n */\nexport function createPaymentAdmission(\n ctx: PipelineContext,\n authorizeAndReserve: AuthorizeAndReserve,\n): AdmitPayment {\n const { options, safeEmit, buildEvent } = ctx;\n\n return async function admitPayment(request, resource, pricing, validInput) {\n const provider = pickProvider(options.paymentProviders, resource.paymentMethods);\n if (!provider) {\n throw new CommerceError(\n 'PAYMENT_PROVIDER_UNAVAILABLE',\n `No enabled payment provider for resource \"${resource.id}\"`,\n {\n requestId: request.requestId,\n resourceId: resource.id,\n details: { paymentMethods: resource.paymentMethods },\n },\n );\n }\n\n // Resolved before the challenge so the 402 can name what the retry must\n // also carry, and so an uncheckable method fails before payment starts\n const authProviders = resolveAuthorizationProviders(\n options.authorizationProviders ?? [],\n resource,\n request.requestId,\n );\n\n let requirement: PaymentRequirement;\n try {\n requirement = await provider.createRequirement({\n requestId: request.requestId,\n resource,\n amount: pricing.amount,\n currency: pricing.currency,\n requestedAt: options.clock.nowIso(),\n input: validInput,\n // Transport facts a rail may bind into its challenge, such as a body digest\n ...(request.metadata !== undefined ? { metadata: request.metadata } : {}),\n });\n } catch (error) {\n throw isCommerceError(error)\n ? error\n : new CommerceError('PAYMENT_PROVIDER_UNAVAILABLE', 'Payment provider is unavailable', {\n requestId: request.requestId,\n resourceId: resource.id,\n cause: error,\n });\n }\n\n if (!request.payment) {\n await safeEmit(\n buildEvent({\n type: 'payment.required',\n requestId: request.requestId,\n resourceId: resource.id,\n adapter: request.protocol,\n paymentProvider: provider.name,\n }),\n );\n return {\n kind: 'payment-required',\n requestId: request.requestId,\n resourceId: resource.id,\n requirement,\n ...(authProviders.length > 0\n ? { authorization: authProviders.map((p) => p.requirement) }\n : {}),\n };\n }\n\n const payment = request.payment;\n\n let verification: PaymentResult;\n try {\n // Later steps, including authorization and settlement order, use the\n // selected requirement with its full retry challenge\n if (provider.selectRequirement) {\n requirement = await provider.selectRequirement({\n requestId: request.requestId,\n resource,\n requirement,\n submission: payment,\n });\n }\n verification = await provider.verify({\n requestId: request.requestId,\n resource,\n requirement,\n submission: payment,\n });\n } catch (error) {\n // A typed CommerceError is rethrown as is, keeping its code and its\n // possibly retryable status. Only an untyped throw is mapped, with a\n // fixed client-facing message.\n const mapped = isCommerceError(error)\n ? error\n : new CommerceError('PAYMENT_INVALID', 'Payment verification failed', {\n requestId: request.requestId,\n resourceId: resource.id,\n cause: error,\n ...retryChallenge(requirement),\n });\n await safeEmit(\n buildEvent({\n type: 'payment.rejected',\n requestId: request.requestId,\n resourceId: resource.id,\n adapter: request.protocol,\n paymentProvider: provider.name,\n status: 'error',\n data: { reason: mapped.code },\n }),\n );\n throw mapped;\n }\n\n if (verification.status !== 'verified') {\n await safeEmit(\n buildEvent({\n type: 'payment.rejected',\n requestId: request.requestId,\n resourceId: resource.id,\n adapter: request.protocol,\n paymentProvider: provider.name,\n status: 'error',\n data: verification.rejectionReason ? { reason: verification.rejectionReason } : {},\n }),\n );\n throw new CommerceError(\n 'PAYMENT_INVALID',\n verification.rejectionReason ?? 'Payment was rejected',\n {\n requestId: request.requestId,\n resourceId: resource.id,\n ...retryChallenge(requirement, verification.rejectionReason),\n },\n );\n }\n\n if (!verification.replayKey) {\n await safeEmit(\n buildEvent({\n type: 'payment.rejected',\n requestId: request.requestId,\n resourceId: resource.id,\n adapter: request.protocol,\n paymentProvider: provider.name,\n status: 'error',\n data: { reason: 'missing-replay-key' },\n }),\n );\n throw new CommerceError('PAYMENT_INVALID', 'Payment provider did not return a replay key', {\n requestId: request.requestId,\n resourceId: resource.id,\n });\n }\n const replayKey = verification.replayKey;\n\n const hold = await authorizeAndReserve(\n request,\n resource,\n authProviders,\n requirement,\n validInput,\n );\n\n try {\n await options.store.reservePaymentAttempt({\n requestId: request.requestId,\n resourceId: resource.id,\n provider: provider.name,\n replayKey,\n amount: verification.amount,\n currency: verification.currency,\n ...(verification.payer !== undefined ? { payer: verification.payer } : {}),\n ...(verification.payee !== undefined ? { payee: verification.payee } : {}),\n ...(requirement.metadata?.[REUSE_REJECTED_AUTHORIZATION_METADATA_KEY] === true\n ? { reclaimRejected: true }\n : {}),\n });\n } catch (error) {\n // A duplicate replayKey arrives as PAYMENT_REPLAYED and is kept. Any\n // other failure (a full disk, a dropped connection) is STORAGE_ERROR,\n // never a replay.\n const mapped = toCommerceError(\n error,\n 'STORAGE_ERROR',\n 'Payment attempt could not be recorded',\n );\n await hold?.finalize('release');\n await safeEmit(\n buildEvent({\n type: 'payment.rejected',\n requestId: request.requestId,\n resourceId: resource.id,\n adapter: request.protocol,\n paymentProvider: provider.name,\n status: 'error',\n data: { reason: mapped.code },\n }),\n );\n throw replayError(mapped, requirement);\n }\n\n await safeEmit(\n buildEvent({\n type: 'payment.verified',\n requestId: request.requestId,\n resourceId: resource.id,\n adapter: request.protocol,\n paymentProvider: provider.name,\n status: 'ok',\n }),\n );\n\n return {\n kind: 'admitted',\n settleArgs: {\n request,\n resource,\n provider,\n requirement,\n payment,\n verification,\n replayKey,\n hold,\n },\n };\n };\n}\n\nfunction pickProvider(\n providers: readonly PaymentProvider[],\n methods: readonly PaymentMethodName[],\n): PaymentProvider | undefined {\n for (const method of methods) {\n const found = providers.find((provider) => provider.name === method);\n if (found) return found;\n }\n return undefined;\n}\n","// What the pipeline's stages share: its options, and event and persistence writes that never fail a flow\nimport type { AuthorizationProvider, AuthorizationRecord } from '../../domain/authorization';\nimport type { CommerceEvent, EventSink } from '../../domain/event';\nimport type {\n PaymentProvider,\n PaymentRequirement,\n PaymentResult,\n PaymentSubmission,\n} from '../../domain/payment';\nimport type { CanonicalRequest } from '../../domain/request';\nimport type { CommerceResource, ResourceRegistry } from '../../domain/resource';\nimport { describeError } from '../../errors';\nimport type { BackendExecutor } from '../../interfaces/backend';\nimport type { Logger } from '../../interfaces/logger';\nimport type { Clock, IdGenerator } from '../../interfaces/runtime';\nimport type { ReceiptStore } from '../../interfaces/store';\n\nexport interface CreateExecutionPipelineOptions {\n readonly resources: ResourceRegistry;\n readonly paymentProviders: readonly PaymentProvider[];\n /** Defaults to none */\n readonly authorizationProviders?: readonly AuthorizationProvider[];\n readonly store: ReceiptStore;\n readonly backend: BackendExecutor;\n readonly events: EventSink;\n readonly logger: Logger;\n readonly clock: Clock;\n readonly ids: IdGenerator;\n}\n\n/**\n * A reservation held across settlement, plus the summary the receipt keeps.\n * `finalize` ends it.\n */\nexport interface AuthorizationHold {\n readonly record: AuthorizationRecord;\n finalize(action: 'consume' | 'release' | 'markUncertain'): Promise<void>;\n}\n\n/** A verified, reserved payment and everything its settlement needs */\nexport interface SettleArgs {\n readonly request: CanonicalRequest;\n readonly resource: CommerceResource;\n readonly provider: PaymentProvider;\n readonly requirement: PaymentRequirement;\n readonly payment: PaymentSubmission;\n readonly verification: PaymentResult;\n readonly replayKey: string;\n readonly hold: AuthorizationHold | undefined;\n}\n\nexport interface PipelineContext {\n readonly options: CreateExecutionPipelineOptions;\n /** Emits an event; a failing sink is logged, never thrown */\n readonly safeEmit: (event: CommerceEvent) => Promise<void>;\n /** Runs a store write; a failure is logged, never thrown */\n readonly safePersist: (\n op: () => Promise<void>,\n label: string,\n requestId: string,\n ) => Promise<void>;\n readonly buildEvent: (partial: Omit<CommerceEvent, 'id' | 'at'>) => CommerceEvent;\n}\n\nexport function createPipelineContext(options: CreateExecutionPipelineOptions): PipelineContext {\n async function safeEmit(event: CommerceEvent): Promise<void> {\n try {\n await options.events.emit(event);\n } catch (error) {\n options.logger.error(\n { err: describeError(error), eventType: event.type, requestId: event.requestId },\n 'Event sink failed; commerce flow continues',\n );\n }\n }\n\n async function safePersist(\n op: () => Promise<void>,\n label: string,\n requestId: string,\n ): Promise<void> {\n try {\n await op();\n } catch (error) {\n options.logger.error(\n { err: describeError(error), requestId },\n `Persistence failed: ${label}`,\n );\n }\n }\n\n function buildEvent(partial: Omit<CommerceEvent, 'id' | 'at'>): CommerceEvent {\n return { id: options.ids.next('evt'), at: options.clock.nowIso(), ...partial };\n }\n\n return { options, safeEmit, safePersist, buildEvent };\n}\n","// Settles a verified, reserved payment, or records that the backend failed before it could\nimport type { PaymentRequirement, PaymentResult } from '../../domain/payment';\nimport { CommerceError, isCommerceError } from '../../errors';\nimport { retryChallenge } from './challenge';\nimport type { PipelineContext, SettleArgs } from './context';\n\nexport interface Settlement {\n /** Settles and finalizes the authorization; a refusal or unknown outcome throws */\n readonly settle: (args: SettleArgs) => Promise<PaymentResult>;\n /** Records a backend failure before settlement and releases the authorization */\n readonly abandonSettlement: (args: SettleArgs, backendErrorCode: string) => Promise<void>;\n}\n\nexport function createSettlement(ctx: PipelineContext): Settlement {\n const { options, safeEmit, safePersist, buildEvent } = ctx;\n\n // Settle a verified, reserved payment and finalize its authorization.\n // Rejected or uncertain settlement throws before any response is delivered.\n async function settle(args: SettleArgs): Promise<PaymentResult> {\n const { request, resource, provider, requirement, payment, verification, replayKey, hold } =\n args;\n let settlement: PaymentResult;\n try {\n settlement = await provider.settle({\n requestId: request.requestId,\n resource,\n requirement,\n submission: payment,\n verification,\n });\n } catch (error) {\n // Confirmed non-submission leaves the authorization spendable. Release\n // it for retry and report the provider failure.\n const notSubmitted = notSubmittedReason(error);\n if (notSubmitted !== undefined) {\n await hold?.finalize('release');\n await safePersist(\n () =>\n options.store.updatePaymentAttempt({\n replayKey,\n status: 'rejected',\n rejectionReason: notSubmitted,\n }),\n 'updatePaymentAttempt(not-submitted)',\n request.requestId,\n );\n await safeEmit(\n buildEvent({\n type: 'payment.rejected',\n requestId: request.requestId,\n resourceId: resource.id,\n adapter: request.protocol,\n paymentProvider: provider.name,\n status: 'error',\n data: { reason: 'settlement-not-submitted', providerReason: notSubmitted },\n }),\n );\n throw new CommerceError(\n 'PAYMENT_PROVIDER_UNAVAILABLE',\n 'The payment provider could not settle the payment; nothing was charged',\n { requestId: request.requestId, resourceId: resource.id, cause: error },\n );\n }\n // A throw gives no settlement verdict. The facilitator may have\n // broadcast before losing its response, even without a transaction\n // hash. Keep the authorization uncertain so it cannot be spent again.\n const txHash = settlementTxHash(error);\n await hold?.finalize('markUncertain');\n await safePersist(\n () =>\n options.store.updatePaymentAttempt({\n replayKey,\n status: 'settlement-uncertain',\n ...(txHash !== undefined ? { externalReference: txHash } : {}),\n ...(error instanceof Error ? { rejectionReason: error.message } : {}),\n }),\n 'updatePaymentAttempt(settlement-uncertain)',\n request.requestId,\n );\n await safeEmit(\n buildEvent({\n type: 'payment.rejected',\n requestId: request.requestId,\n resourceId: resource.id,\n adapter: request.protocol,\n paymentProvider: provider.name,\n status: 'error',\n data: {\n reason: 'settlement-uncertain',\n ...(txHash !== undefined ? { transactionHash: txHash } : {}),\n },\n }),\n );\n // The replay key remains reserved, so report an uncertain, non-retryable\n // outcome. Expose only the transaction hash from the underlying error.\n throw new CommerceError('PAYMENT_SETTLEMENT_FAILED', 'Settlement could not be confirmed', {\n requestId: request.requestId,\n resourceId: resource.id,\n cause: error,\n details: {\n settlementUncertain: true,\n ...(txHash !== undefined ? { transactionHash: txHash } : {}),\n ...settlementParties(requirement, verification),\n },\n });\n }\n\n if (settlement.status !== 'settled') {\n await hold?.finalize('release');\n await safePersist(\n () =>\n options.store.updatePaymentAttempt({\n replayKey,\n status: 'rejected',\n ...(settlement.rejectionReason !== undefined\n ? { rejectionReason: settlement.rejectionReason }\n : {}),\n ...(settlement.externalReference !== undefined\n ? { externalReference: settlement.externalReference }\n : {}),\n }),\n 'updatePaymentAttempt(rejected)',\n request.requestId,\n );\n await safeEmit(\n buildEvent({\n type: 'payment.rejected',\n requestId: request.requestId,\n resourceId: resource.id,\n adapter: request.protocol,\n paymentProvider: provider.name,\n status: 'error',\n data: settlement.rejectionReason ? { reason: settlement.rejectionReason } : {},\n }),\n );\n // A returned rejection confirms no settlement. Both rails return 402.\n const rejectionDetails = retryChallenge(requirement, settlement.rejectionReason).details;\n throw new CommerceError(\n 'PAYMENT_SETTLEMENT_FAILED',\n settlement.rejectionReason ?? 'Settlement was rejected',\n {\n requestId: request.requestId,\n resourceId: resource.id,\n httpStatus: 402,\n details: {\n ...rejectionDetails,\n ...settlementParties(requirement, settlement, verification),\n },\n },\n );\n }\n\n await hold?.finalize('consume');\n await safePersist(\n () =>\n options.store.updatePaymentAttempt({\n replayKey,\n status: 'settled',\n ...(settlement.externalReference !== undefined\n ? { externalReference: settlement.externalReference }\n : {}),\n }),\n 'updatePaymentAttempt(settled)',\n request.requestId,\n );\n await safeEmit(\n buildEvent({\n type: 'payment.settled',\n requestId: request.requestId,\n resourceId: resource.id,\n adapter: request.protocol,\n paymentProvider: provider.name,\n status: 'ok',\n }),\n );\n\n return settlement;\n }\n\n // Record the pre-settlement backend failure and release the authorization\n // hold. Rails with reuse metadata can reserve the unspent replay key again,\n // as after any rejection.\n async function abandonSettlement(args: SettleArgs, backendErrorCode: string): Promise<void> {\n const { request, resource, provider, replayKey, hold } = args;\n await hold?.finalize('release');\n await safePersist(\n () =>\n options.store.updatePaymentAttempt({\n replayKey,\n status: 'rejected',\n rejectionReason: 'backend_failed',\n }),\n 'updatePaymentAttempt(backend-failed)',\n request.requestId,\n );\n await safeEmit(\n buildEvent({\n type: 'payment.rejected',\n requestId: request.requestId,\n resourceId: resource.id,\n adapter: request.protocol,\n paymentProvider: provider.name,\n status: 'error',\n data: { reason: 'backend-failed', backendErrorCode },\n }),\n );\n }\n\n return { settle, abandonSettlement };\n}\n\n// The reason a provider gave when it threw before submitting anything\nfunction notSubmittedReason(error: unknown): string | undefined {\n if (!isCommerceError(error) || error.details?.['settlementNotSubmitted'] !== true) {\n return undefined;\n }\n const reason = error.details['reason'];\n return typeof reason === 'string' ? reason : 'settlement_not_submitted';\n}\n\n// The broadcast transaction hash a provider attached to a settlement throw,\n// when it knows one\nfunction settlementTxHash(error: unknown): string | undefined {\n const hash = isCommerceError(error) ? error.details?.['transactionHash'] : undefined;\n return typeof hash === 'string' ? hash : undefined;\n}\n\n// Prefer the network and payer reported by settlement or verification, then\n// fall back to the requirement's network\nfunction settlementParties(\n requirement: PaymentRequirement,\n ...results: readonly PaymentResult[]\n): { network?: string; payer?: string } {\n const network = results.find((r) => r.network !== undefined)?.network ?? requirement.network;\n const payer = results.find((r) => r.payer !== undefined)?.payer;\n return {\n ...(network !== undefined ? { network } : {}),\n ...(payer !== undefined ? { payer } : {}),\n };\n}\n","/**\n * The single execution path every protocol adapter converges on. The order is a\n * security boundary; do not reorder:\n *\n * 1. resolve resource (RESOURCE_NOT_FOUND)\n * 2. strip reserved input fields, validate input and the backend request shape\n * (INPUT_INVALID, or BACKEND_ERROR for an illegal configured header)\n * 3. resolve price\n * 4. free: straight to the backend\n * 5. paid: pick provider and createRequirement, then return a challenge, or\n * select the offer the proof pays, verify it, and reserve authorization and\n * replay identities\n * 6. settle before calling the backend, or call the backend first and settle\n * only if it succeeds. Finalize authorization according to the outcome\n * (BACKEND_TIMEOUT / BACKEND_ERROR)\n * 7. persist receipt, emit events, return outcome\n */\n\nimport type { AuthorizationRecord } from '../../domain/authorization';\nimport type { PaymentResult } from '../../domain/payment';\nimport type { CommerceReceipt } from '../../domain/receipt';\nimport type { CanonicalRequest, ExecutionOutcome, ExecutionPipeline } from '../../domain/request';\nimport type { CommerceResource } from '../../domain/resource';\nimport { RESERVED_INPUT_FIELDS } from '../../domain/wire';\nimport { CommerceError, toCommerceError } from '../../errors';\nimport type { BackendResponse } from '../../interfaces/backend';\nimport { isRecord } from '../../is-record';\nimport { validateBackendRequestShape } from '../backend-request';\nimport { SETTLE_AFTER_BACKEND_METADATA_KEY } from '../settlement-order';\nimport { compileJsonSchema, type Validator } from '../validation';\nimport { createPaymentAdmission } from './admission';\nimport { createAuthorizeAndReserve } from './authorization';\nimport {\n type CreateExecutionPipelineOptions,\n createPipelineContext,\n type SettleArgs,\n} from './context';\nimport { createSettlement } from './settlement';\n\nexport type { CreateExecutionPipelineOptions } from './context';\n\nexport function createExecutionPipeline(\n options: CreateExecutionPipelineOptions,\n): ExecutionPipeline {\n const validators = new Map<string, Validator>();\n\n function getValidator(resource: CommerceResource): Validator {\n const cached = validators.get(resource.id);\n if (cached) return cached;\n const compiled = compileJsonSchema(resource.inputSchema);\n validators.set(resource.id, compiled);\n return compiled;\n }\n\n const ctx = createPipelineContext(options);\n const { safeEmit, safePersist, buildEvent } = ctx;\n const { settle, abandonSettlement } = createSettlement(ctx);\n const admitPayment = createPaymentAdmission(ctx, createAuthorizeAndReserve(ctx));\n\n async function execute(request: CanonicalRequest): Promise<ExecutionOutcome> {\n const pipelineStart = options.clock.monotonicMs();\n\n // 1. resolve resource\n const resource = options.resources.get(request.resourceId);\n // Same code and message as an unknown id: a caller on a protocol the\n // resource is not exposed via must not learn that it exists\n if (!resource?.exposedVia.includes(request.protocol)) {\n throw new CommerceError(\n 'RESOURCE_NOT_FOUND',\n `Resource \"${request.resourceId}\" was not found`,\n {\n requestId: request.requestId,\n resourceId: request.resourceId,\n },\n );\n }\n\n await safeEmit(\n buildEvent({\n type: 'resource.requested',\n requestId: request.requestId,\n resourceId: resource.id,\n adapter: request.protocol,\n }),\n );\n\n // 2. strip reserved gateway fields, then validate input\n const strippedInput = stripReservedFields(request.input);\n const validation = getValidator(resource)(strippedInput);\n if (!validation.valid) {\n throw new CommerceError(\n 'INPUT_INVALID',\n `Input for resource \"${resource.id}\" failed validation`,\n {\n requestId: request.requestId,\n resourceId: resource.id,\n details: { errors: validation.errors },\n },\n );\n }\n const validInput = validation.value;\n\n // Before pricing, so a request the backend cannot receive fails before\n // payment (see validateBackendRequestShape)\n validateBackendRequestShape(\n resource.handler,\n validInput,\n { requestId: request.requestId, resourceId: resource.id },\n request.backendHeaders,\n );\n\n // 3. resolve price\n if (resource.pricing.type === 'dynamic') {\n // Config validation rejects this at load; this is defense in depth\n throw new CommerceError(\n 'CONFIG_INVALID',\n `Resource \"${resource.id}\" uses unsupported dynamic pricing`,\n {\n requestId: request.requestId,\n resourceId: resource.id,\n },\n );\n }\n\n // Authorization gates settlement, so on a free resource nothing would read\n // the proof. Config refuses this at load; this is defense in depth.\n if (resource.pricing.type !== 'fixed' && (resource.authorization?.required.length ?? 0) > 0) {\n throw new CommerceError(\n 'CONFIG_INVALID',\n `Resource \"${resource.id}\" requires authorization but is not a paid resource`,\n {\n requestId: request.requestId,\n resourceId: resource.id,\n },\n );\n }\n\n let paymentResult: PaymentResult | undefined;\n let authorization: AuthorizationRecord | undefined;\n let deferredSettlement: SettleArgs | undefined;\n\n if (resource.pricing.type === 'fixed') {\n const admission = await admitPayment(request, resource, resource.pricing, validInput);\n if (admission.kind === 'payment-required') return admission;\n const { settleArgs } = admission;\n authorization = settleArgs.hold?.record;\n if (settleArgs.requirement.metadata?.[SETTLE_AFTER_BACKEND_METADATA_KEY] === true) {\n deferredSettlement = settleArgs;\n } else {\n paymentResult = await settle(settleArgs);\n }\n }\n\n // 6. call backend\n const backendStart = options.clock.monotonicMs();\n let backendResponse: BackendResponse;\n try {\n backendResponse = await options.backend.call(resource.handler, {\n requestId: request.requestId,\n resourceId: resource.id,\n input: validInput,\n ...(request.idempotencyKey !== undefined ? { idempotencyKey: request.idempotencyKey } : {}),\n ...(request.backendHeaders !== undefined ? { backendHeaders: request.backendHeaders } : {}),\n });\n } catch (error) {\n const commerceError = toCommerceError(error, 'BACKEND_ERROR', 'Backend call failed');\n await safeEmit(\n buildEvent({\n type: 'backend.failed',\n requestId: request.requestId,\n resourceId: resource.id,\n adapter: request.protocol,\n status: 'error',\n durationMs: Math.round(options.clock.monotonicMs() - backendStart),\n data: { code: commerceError.code },\n }),\n );\n\n if (deferredSettlement !== undefined) {\n await abandonSettlement(deferredSettlement, commerceError.code);\n throw commerceError;\n }\n\n if (paymentResult !== undefined) {\n // The payment settled and the backend then failed. Record an\n // undelivered receipt for the merchant and tell the buyer what they\n // paid, including the settlement reference.\n const failedReceipt: CommerceReceipt = {\n id: options.ids.next('receipt'),\n requestId: request.requestId,\n resourceId: resource.id,\n deliveredAt: options.clock.nowIso(),\n backendStatus: backendErrorStatus(commerceError),\n protocol: request.protocol,\n payment: paymentResult,\n ...(authorization !== undefined ? { authorization } : {}),\n metadata: { delivered: false, backendErrorCode: commerceError.code },\n };\n await safePersist(\n () => options.store.saveReceipt(failedReceipt),\n 'saveReceipt(backend-failed-after-settlement)',\n request.requestId,\n );\n\n throw new CommerceError(\n 'BACKEND_ERROR',\n 'Payment settled but the backend call failed; the payment was not refunded automatically',\n {\n requestId: request.requestId,\n resourceId: resource.id,\n cause: commerceError,\n details: {\n payment: {\n status: paymentResult.status,\n provider: paymentResult.provider,\n amount: paymentResult.amount,\n currency: paymentResult.currency,\n ...(paymentResult.network !== undefined ? { network: paymentResult.network } : {}),\n ...(paymentResult.externalReference !== undefined\n ? { externalReference: paymentResult.externalReference }\n : {}),\n ...(paymentResult.payer !== undefined ? { payer: paymentResult.payer } : {}),\n ...(typeof paymentResult.metadata?.['amountBaseUnits'] === 'string'\n ? { amountBaseUnits: paymentResult.metadata['amountBaseUnits'] }\n : {}),\n ...(typeof paymentResult.metadata?.['receipt'] === 'string'\n ? { receipt: paymentResult.metadata['receipt'] }\n : {}),\n },\n },\n },\n );\n }\n\n throw commerceError;\n }\n\n await safeEmit(\n buildEvent({\n type: 'backend.called',\n requestId: request.requestId,\n resourceId: resource.id,\n adapter: request.protocol,\n status: 'ok',\n durationMs: backendResponse.durationMs,\n data: { status: backendResponse.status },\n }),\n );\n\n // Hold the backend response until settlement succeeds. A refusal or\n // uncertain outcome throws before delivery.\n if (deferredSettlement !== undefined) {\n paymentResult = await settle(deferredSettlement);\n }\n\n // 7. persist receipt, emit final event, return outcome\n const receipt: CommerceReceipt = {\n id: options.ids.next('receipt'),\n requestId: request.requestId,\n resourceId: resource.id,\n deliveredAt: options.clock.nowIso(),\n backendStatus: backendResponse.status,\n durationMs: backendResponse.durationMs,\n protocol: request.protocol,\n ...(paymentResult !== undefined ? { payment: paymentResult } : {}),\n ...(authorization !== undefined ? { authorization } : {}),\n };\n\n await safePersist(() => options.store.saveReceipt(receipt), 'saveReceipt', request.requestId);\n\n const totalDurationMs = Math.round(options.clock.monotonicMs() - pipelineStart);\n\n await safeEmit(\n buildEvent({\n type: 'resource.delivered',\n requestId: request.requestId,\n resourceId: resource.id,\n adapter: request.protocol,\n status: 'ok',\n durationMs: totalDurationMs,\n }),\n );\n\n return {\n kind: 'delivered',\n requestId: request.requestId,\n resourceId: resource.id,\n backendStatus: backendResponse.status,\n body: backendResponse.body,\n headers: backendResponse.headers,\n ...(paymentResult !== undefined ? { payment: paymentResult } : {}),\n receipt,\n durationMs: totalDurationMs,\n };\n }\n\n return { execute };\n}\n\n// The status the backend returned, which backend-http.ts puts on\n// `details.status` for a non-2xx or redirect response. 0 means no status is\n// known, as after a timeout, a transport failure or an unreadable or oversized\n// body.\nfunction backendErrorStatus(error: CommerceError): number {\n const status = error.details?.['status'];\n return typeof status === 'number' ? status : 0;\n}\n\nconst RESERVED_INPUT_KEYS: readonly string[] = [...RESERVED_INPUT_FIELDS, '__proto__'];\n\nfunction stripReservedFields(input: unknown): unknown {\n if (!isRecord(input)) return input;\n // Object.hasOwn, not `in`, which also matches inherited names\n if (!RESERVED_INPUT_KEYS.some((key) => Object.hasOwn(input, key))) return input;\n const rest: Record<string, unknown> = {};\n for (const key of Object.keys(input)) {\n // \"__proto__\" is dropped too: assigning it would call the inherited setter\n // and replace `rest`'s prototype instead of creating a data property.\n // validation.ts's own-property lookups are the primary control.\n if (!RESERVED_INPUT_KEYS.includes(key)) rest[key] = input[key];\n }\n return rest;\n}\n","// In-memory implementation of the frozen `ResourceRegistry` interface\nimport type { ProtocolName } from '../domain/common';\nimport type { CommerceResource, ResourceRegistry } from '../domain/resource';\nimport { CommerceError } from '../errors';\n\nclass ResourceRegistryImpl implements ResourceRegistry {\n private readonly byId = new Map<string, CommerceResource>();\n private readonly ordered: readonly CommerceResource[];\n\n constructor(resources: readonly CommerceResource[]) {\n for (const resource of resources) {\n if (this.byId.has(resource.id)) {\n throw new CommerceError('CONFIG_INVALID', `Duplicate resource id \"${resource.id}\"`, {\n details: { resourceId: resource.id },\n });\n }\n this.byId.set(resource.id, resource);\n }\n this.ordered = [...resources];\n }\n\n get(id: string): CommerceResource | undefined {\n return this.byId.get(id);\n }\n\n list(): readonly CommerceResource[] {\n return this.ordered;\n }\n\n listExposedVia(protocol: ProtocolName): readonly CommerceResource[] {\n return this.ordered.filter((resource) => resource.exposedVia.includes(protocol));\n }\n\n has(id: string): boolean {\n return this.byId.has(id);\n }\n}\n\n/** Build a `ResourceRegistry` from a validated list of canonical resources */\nexport function createResourceRegistry(resources: readonly CommerceResource[]): ResourceRegistry {\n return new ResourceRegistryImpl(resources);\n}\n","/**\n * `EventSink` that persists every event to the receipt store. A store failure\n * is logged, never thrown to the caller.\n */\nimport type { CommerceEvent, EventSink } from '../domain/event';\nimport { describeError } from '../errors';\nimport type { Logger } from '../interfaces/logger';\nimport type { ReceiptStore } from '../interfaces/store';\n\nexport interface CreateStoreEventSinkOptions {\n readonly store: ReceiptStore;\n readonly logger: Logger;\n}\n\nexport function createStoreEventSink(options: CreateStoreEventSinkOptions): EventSink {\n return {\n async emit(event: CommerceEvent): Promise<void> {\n try {\n await options.store.appendEvent(event);\n } catch (error) {\n options.logger.error(\n { err: describeError(error), eventType: event.type, requestId: event.requestId },\n 'Failed to persist commerce event',\n );\n }\n },\n };\n}\n","/**\n * ACP protocol constants shared by the config layer and the adapter.\n *\n * Kept dependency-free: `src/config` reads the operation set at load time, so\n * anything imported here would become a config-load dependency too.\n */\n\n/**\n * The ACP stable snapshot this adapter implements, and the only value accepted\n * in the `API-Version` request header. Both name the same released snapshot;\n * they are separate constants because ACP versions the wire contract and the\n * header independently, and a future snapshot may accept more than one.\n *\n * Changing either means vendoring a new schema directory beside\n * `spec/2026-04-17/` - never editing the vendored one in place.\n */\nexport const ACP_SPEC_VERSION = '2026-04-17';\nexport const ACP_API_VERSION = '2026-04-17';\n\n/** Discovery path fixed by the ACP specification, never a configurable mount */\nexport const ACP_WELL_KNOWN_PATH = '/.well-known/acp.json';\n\n/**\n * The stable checkout operations, by ACP operation id. All five are required\n * when ACP is enabled: a partially configured checkout lifecycle would be\n * advertised as a whole service the seller cannot actually serve.\n */\nexport const ACP_CHECKOUT_OPERATIONS = [\n 'createCheckoutSession',\n 'updateCheckoutSession',\n 'getCheckoutSession',\n 'completeCheckoutSession',\n 'cancelCheckoutSession',\n] as const;\n\nexport type AcpCheckoutOperation = (typeof ACP_CHECKOUT_OPERATIONS)[number];\n\n/**\n * Top-level canonical-input properties each operation always supplies.\n *\n * `path` carries `{ checkout_session_id }`, `body` the ACP request document.\n */\nexport const ACP_OPERATION_INPUT_KEYS: Readonly<\n Record<AcpCheckoutOperation, readonly ('path' | 'body')[]>\n> = {\n createCheckoutSession: ['body'],\n updateCheckoutSession: ['path', 'body'],\n getCheckoutSession: ['path'],\n completeCheckoutSession: ['path', 'body'],\n cancelCheckoutSession: ['path'],\n};\n\n/**\n * Canonical-input properties an operation supplies only when the caller sends\n * them. The pinned schema lets a cancel omit its body, so a bare cancel has no\n * `body`, but one carrying `intent_trace` passes it on.\n */\nexport const ACP_OPERATION_OPTIONAL_INPUT_KEYS: Readonly<\n Partial<Record<AcpCheckoutOperation, readonly 'body'[]>>\n> = {\n cancelCheckoutSession: ['body'],\n};\n\n/** The key inside `path` that carries the checkout session id from the route */\nexport const ACP_SESSION_ID_INPUT_KEY = 'checkout_session_id';\n\n/** Media type for every ACP request and response body */\nexport const ACP_JSON_MEDIA_TYPE = 'application/json';\n\n/**\n * Protocol headers, lowercased as Node delivers them.\n *\n * `API-Version` is mandatory on checkout requests and is never defaulted:\n * answering an unversioned request as if it named the pinned snapshot would be\n * guessing on the caller's behalf about a contract that changes.\n */\nexport const ACP_API_VERSION_HEADER = 'api-version';\nexport const ACP_REQUEST_ID_HEADER = 'request-id';\nexport const ACP_IDEMPOTENCY_KEY_HEADER = 'idempotency-key';\nexport const ACP_IDEMPOTENT_REPLAYED_HEADER = 'idempotent-replayed';\n\n/**\n * Seconds a client is told to wait before retrying a key whose first request is\n * still running. Short: the original is a live HTTP call, not a queue.\n */\nexport const ACP_IN_FLIGHT_RETRY_AFTER_SECONDS = 1;\n\n/**\n * Longest `Request-Id` echoed back. The value is the caller's, so it is\n * bounded and filtered before it is ever written into a response header.\n */\nexport const ACP_MAX_REQUEST_ID_LENGTH = 128;\n\n/** Caller headers forwarded to the merchant; the bearer token stays at the gateway */\nexport const ACP_FORWARDED_HEADERS = [\n 'accept-language',\n 'user-agent',\n ACP_REQUEST_ID_HEADER,\n ACP_API_VERSION_HEADER,\n 'signature',\n 'timestamp',\n] as const;\n\n/** Maximum forwarded header value length; longer values are dropped */\nexport const ACP_MAX_FORWARDED_HEADER_LENGTH = 2048;\n\n/** Fallback and maximum `Retry-After` seconds for merchant 429 or 503 */\nexport const ACP_MERCHANT_RETRY_AFTER_DEFAULT_SECONDS = 5;\nexport const ACP_MERCHANT_RETRY_AFTER_MAX_SECONDS = 300;\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/errors/codes.ts","../../src/core/errors/commerce-error.ts","../../src/core/interfaces/runtime.ts","../../src/core/domain/common.ts","../../src/core/domain/resource.ts","../../src/core/domain/wire.ts","../../src/core/interfaces/logger.ts","../../src/core/interfaces/protocol-adapter.ts"],"names":[],"mappings":"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","file":"chunk-QQ3WY5L3.js","sourcesContent":["/**\n * Typed domain error codes. FROZEN CONTRACT. Protocol adapters map them into\n * their own response format. Never throw a bare string or untyped Error across\n * an area boundary.\n */\nexport const COMMERCE_ERROR_CODES = [\n 'CONFIG_INVALID',\n 'RESOURCE_NOT_FOUND',\n 'INPUT_INVALID',\n 'PAYMENT_REQUIRED',\n 'PAYMENT_INVALID',\n 'PAYMENT_REPLAYED',\n 'PAYMENT_PROVIDER_UNAVAILABLE',\n 'PAYMENT_SETTLEMENT_FAILED',\n 'AUTHORIZATION_REQUIRED',\n 'AUTHORIZATION_INVALID',\n 'AUTHORIZATION_REPLAYED',\n 'AUTHORIZATION_PROVIDER_UNAVAILABLE',\n 'BACKEND_TIMEOUT',\n 'BACKEND_ERROR',\n 'PROTOCOL_UNSUPPORTED',\n 'GATEWAY_BUSY',\n 'STORAGE_ERROR',\n 'INTERNAL_ERROR',\n] as const;\n\nexport type CommerceErrorCode = (typeof COMMERCE_ERROR_CODES)[number];\n\n/**\n * Canonical HTTP status for each error code. Every payment failure maps to a\n * 4xx or 5xx status, never to a delivery.\n */\nexport const COMMERCE_ERROR_HTTP_STATUS: Readonly<Record<CommerceErrorCode, number>> = {\n CONFIG_INVALID: 500,\n RESOURCE_NOT_FOUND: 404,\n INPUT_INVALID: 400,\n PAYMENT_REQUIRED: 402,\n PAYMENT_INVALID: 402,\n PAYMENT_REPLAYED: 409,\n PAYMENT_PROVIDER_UNAVAILABLE: 503,\n PAYMENT_SETTLEMENT_FAILED: 502,\n // 403, not 402: a 402 tells a client to pay and retry, which cannot fix a\n // missing or rejected mandate, and a client that auto-pays on 402 would be\n // charged for a request that was never going to be delivered\n AUTHORIZATION_REQUIRED: 403,\n AUTHORIZATION_INVALID: 403,\n AUTHORIZATION_REPLAYED: 409,\n AUTHORIZATION_PROVIDER_UNAVAILABLE: 503,\n BACKEND_TIMEOUT: 504,\n BACKEND_ERROR: 502,\n PROTOCOL_UNSUPPORTED: 501,\n GATEWAY_BUSY: 503,\n STORAGE_ERROR: 500,\n INTERNAL_ERROR: 500,\n};\n\n/** Codes for which a client may reasonably retry the same request */\nexport const RETRYABLE_ERROR_CODES: ReadonlySet<CommerceErrorCode> = new Set([\n 'PAYMENT_PROVIDER_UNAVAILABLE',\n // The verifier or replay store was unreachable, so the mandate got no\n // verdict. The same proof can verify once the outage clears.\n 'AUTHORIZATION_PROVIDER_UNAVAILABLE',\n 'BACKEND_TIMEOUT',\n // Load shedding is transient: the caller should back off and try again.\n // Clients act on this flag, and leaving it out would make a momentary\n // throttle look like a permanent failure.\n 'GATEWAY_BUSY',\n]);\n","// The single error type crossing area boundaries. FROZEN CONTRACT\nimport { COMMERCE_ERROR_HTTP_STATUS, type CommerceErrorCode, RETRYABLE_ERROR_CODES } from './codes';\n\nexport interface CommerceErrorOptions {\n /** Structured, non-secret detail safe to return to a client */\n readonly details?: Readonly<Record<string, unknown>>;\n readonly cause?: unknown;\n readonly requestId?: string;\n readonly resourceId?: string;\n /** Override the default HTTP status for this code */\n readonly httpStatus?: number;\n}\n\n/** Serializable wire form of a CommerceError */\nexport interface CommerceErrorInfo {\n readonly code: CommerceErrorCode;\n readonly message: string;\n readonly httpStatus: number;\n readonly retryable: boolean;\n readonly requestId?: string;\n readonly resourceId?: string;\n readonly details?: Readonly<Record<string, unknown>>;\n}\n\nexport class CommerceError extends Error {\n readonly code: CommerceErrorCode;\n readonly httpStatus: number;\n readonly retryable: boolean;\n readonly details?: Readonly<Record<string, unknown>>;\n readonly requestId?: string;\n readonly resourceId?: string;\n\n constructor(code: CommerceErrorCode, message: string, options: CommerceErrorOptions = {}) {\n super(message, options.cause !== undefined ? { cause: options.cause } : undefined);\n this.name = 'CommerceError';\n this.code = code;\n this.httpStatus = options.httpStatus ?? COMMERCE_ERROR_HTTP_STATUS[code];\n this.retryable = RETRYABLE_ERROR_CODES.has(code);\n if (options.details !== undefined) this.details = options.details;\n if (options.requestId !== undefined) this.requestId = options.requestId;\n if (options.resourceId !== undefined) this.resourceId = options.resourceId;\n Error.captureStackTrace?.(this, CommerceError);\n }\n\n /** Non-secret, client-safe representation. `cause` is never included */\n toInfo(): CommerceErrorInfo {\n return {\n code: this.code,\n message: this.message,\n httpStatus: this.httpStatus,\n retryable: this.retryable,\n ...(this.requestId !== undefined ? { requestId: this.requestId } : {}),\n ...(this.resourceId !== undefined ? { resourceId: this.resourceId } : {}),\n ...(this.details !== undefined ? { details: this.details } : {}),\n };\n }\n}\n\nexport function isCommerceError(value: unknown): value is CommerceError {\n return value instanceof CommerceError;\n}\n\n/**\n * Passes an existing CommerceError through. Other thrown values become a\n * CommerceError with a caller-chosen message, for example\n * `toCommerceError(err, 'BACKEND_ERROR', 'Backend call failed')`.\n *\n * Arbitrary Error messages may contain internal URLs, hostnames or file paths.\n * The original value remains on `cause` for internal logging; `toInfo()` and\n * `toErrorEnvelope()` do not serialize it.\n */\nexport function toCommerceError(\n value: unknown,\n fallbackCode: CommerceErrorCode = 'INTERNAL_ERROR',\n fallbackMessage = 'Unexpected internal error',\n): CommerceError {\n if (isCommerceError(value)) return value;\n return new CommerceError(fallbackCode, fallbackMessage, { cause: value });\n}\n\n/** A thrown value reduced to its message and name, for a log line */\nexport function describeError(error: unknown): { message: string; name?: string } {\n if (error instanceof Error) return { message: error.message, name: error.name };\n return { message: String(error) };\n}\n\n/**\n * `Name: message` for a log line, with every URL cut to its scheme and host,\n * because a backend or RPC URL can carry a credential in its userinfo, path or\n * query\n */\nexport function redactedErrorText(value: unknown): string {\n const text = value instanceof Error ? `${value.name}: ${value.message}` : String(value);\n return text.replace(/\\b[a-z][a-z\\d+.-]*:\\/\\/[^\\s\"'<>]+/gi, (match) => {\n try {\n const url = new URL(match);\n return `${url.protocol}//${url.host}`;\n } catch {\n return '[unparseable URL]';\n }\n });\n}\n\n// Deepest `cause` level toLogInfo() follows, which also ends a cyclic chain\nconst MAX_LOGGED_CAUSES = 5;\n\n/**\n * An error for an operator log line: the `toInfo()` fields plus the `cause`\n * chain that `toInfo()` leaves out, each level as `redactedErrorText()` gives it\n */\nexport function toLogInfo(\n value: unknown,\n): CommerceErrorInfo & { readonly cause?: readonly string[] } {\n const error = toCommerceError(value);\n const cause: string[] = [];\n let current = error.cause;\n while (current !== undefined && cause.length < MAX_LOGGED_CAUSES) {\n cause.push(redactedErrorText(current));\n current = current instanceof Error ? current.cause : undefined;\n }\n return cause.length > 0 ? { ...error.toInfo(), cause } : error.toInfo();\n}\n","// Time and ids are injected so tests can be deterministic\nimport type { IsoTimestamp } from '../domain/common';\n\nexport interface Clock {\n now(): Date;\n nowIso(): IsoTimestamp;\n /** Milliseconds since an arbitrary origin; use for durations only */\n monotonicMs(): number;\n}\n\nexport interface IdGenerator {\n /** Opaque, collision-resistant identifier */\n next(prefix?: string): string;\n}\n\nexport const systemClock: Clock = {\n now: () => new Date(),\n nowIso: () => new Date().toISOString(),\n monotonicMs: () => performance.now(),\n};\n","// Shared primitive aliases for the canonical domain model. FROZEN CONTRACT\n\n/**\n * A JSON Schema document (in practice a draft 2020-12 subset). Deliberately\n * loose: adapters translate it to their own schema representation. Never treat\n * it as trusted input without validation.\n */\nexport type JsonSchema = Record<string, unknown>;\n\n/** Protocol surfaces a resource can be exposed through */\nexport type ProtocolName = 'http' | 'mcp' | 'a2a' | 'acp';\n\n// A Record over the union fails to compile when a name is missing or extra\nconst PROTOCOL_NAME_KEYS: Record<ProtocolName, true> = {\n http: true,\n mcp: true,\n a2a: true,\n acp: true,\n};\n\n/**\n * The same names as a value, for code that checks one at runtime: config\n * validation and the OpenAPI importer's `--expose`\n */\nexport const PROTOCOL_NAMES: readonly ProtocolName[] = Object.keys(\n PROTOCOL_NAME_KEYS,\n) as ProtocolName[];\n\n/**\n * Payment rails a resource can accept.\n *\n * A resource's list is an ordered candidate list, not a buyer-selected menu.\n * The pipeline uses the first method with an enabled provider, and a\n * rejection ends the request instead of trying another rail. Config requires at\n * least one named rail to be enabled and permits others that are not.\n */\nexport type PaymentMethodName = 'x402' | 'mpp';\n\n// Checked for completeness the same way as PROTOCOL_NAME_KEYS\nconst PAYMENT_METHOD_NAME_KEYS: Record<PaymentMethodName, true> = { x402: true, mpp: true };\n\n/** The same names as a value, for config validation */\nexport const PAYMENT_METHOD_NAMES: readonly PaymentMethodName[] = Object.keys(\n PAYMENT_METHOD_NAME_KEYS,\n) as PaymentMethodName[];\n\n/**\n * Authorization methods a resource can require. Neither a transport nor a\n * payment rail: it proves the purchase was approved, and sits beside the\n * payment rather than replacing it.\n */\nexport type AuthorizationMethodName = 'ap2';\n\n/** ISO-8601 timestamp string, always UTC with millisecond precision */\nexport type IsoTimestamp = string;\n\n/**\n * A decimal amount as a string in the currency's display unit (for example\n * \"0.01\" USDC), never a float and never base units. Payment providers convert\n * it to on-chain base units.\n */\nexport type DecimalAmount = string;\n\n/** Health of an individual adapter or subsystem */\nexport interface AdapterHealth {\n readonly status: 'pass' | 'warn' | 'fail';\n readonly detail?: string;\n readonly checkedAt: IsoTimestamp;\n readonly durationMs?: number;\n /**\n * Results per checked part, such as each x402 offer. Names and statuses\n * may be published; exclude diagnostic detail.\n */\n readonly components?: readonly AdapterHealthComponent[];\n}\n\n/** One part of an {@link AdapterHealth} result */\nexport interface AdapterHealthComponent {\n readonly name: string;\n readonly status: 'pass' | 'warn' | 'fail';\n}\n\n/** Describes an adapter's supported surface for diagnostics */\nexport interface AdapterDescriptor {\n readonly name: string;\n readonly kind: 'protocol' | 'payment' | 'storage' | 'authorization';\n /** Version of this adapter implementation, independent of the spec */\n readonly implementationVersion: string;\n /** Exact pinned specification revision this adapter targets */\n readonly supportedSpec: string;\n readonly capabilities: readonly string[];\n readonly status: 'stable' | 'experimental' | 'planned';\n /** Capabilities explicitly not implemented, printed by `doctor` */\n readonly unsupported?: readonly string[];\n}\n","// Canonical resource model. FROZEN CONTRACT\nimport type {\n AuthorizationMethodName,\n DecimalAmount,\n JsonSchema,\n PaymentMethodName,\n ProtocolName,\n} from './common';\n\n/** HTTP methods a backend handler may use */\nexport type BackendMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n\n/**\n * How the gateway calls the merchant's existing backend.\n *\n * Backend URLs come from operator configuration only, never from users or\n * agents (docs/security.md, SSRF). Secret header values belong in `${ENV_VAR}`\n * placeholders resolved by the config loader, not in plaintext configuration.\n */\nexport interface BackendHandler {\n readonly type: 'http';\n readonly method: BackendMethod;\n readonly url: string;\n readonly headers?: Readonly<Record<string, string>>;\n /** Hard upper bound on the backend call. Defaults to `DEFAULT_BACKEND_TIMEOUT_MS` */\n readonly timeoutMs?: number;\n /**\n * Names the top-level input properties carrying each part of the request.\n *\n * When absent, `{param}` values come from top-level input and everything left\n * over becomes the query string (GET/DELETE) or the whole JSON body\n * (POST/PUT/PATCH). That cannot express an operation with path, query and\n * body at once, such as `POST /users/{userId}/orders?notify=true`.\n *\n * When present, each group comes from its named property, and top-level input\n * that no binding names is not forwarded.\n */\n readonly inputBindings?: {\n readonly path?: string;\n readonly query?: string;\n readonly body?: string;\n };\n}\n\n/** Default backend timeout when a resource does not specify one */\nexport const DEFAULT_BACKEND_TIMEOUT_MS = 10_000;\n\n/**\n * Canonical pricing. `dynamic` exists in the type for forward compatibility;\n * config validation rejects it and the pipeline refuses it as defense in depth.\n */\nexport type Pricing =\n | { readonly type: 'free' }\n | {\n readonly type: 'fixed';\n readonly amount: DecimalAmount;\n readonly currency: string;\n }\n | {\n readonly type: 'dynamic';\n readonly resolver: string;\n };\n\n/**\n * A merchant capability exposed to agents. Protocol adapters map it outward and\n * never define their own parallel notion of a resource.\n */\nexport interface CommerceResource {\n readonly id: string;\n readonly name: string;\n readonly description?: string;\n readonly inputSchema?: JsonSchema;\n readonly outputSchema?: JsonSchema;\n readonly handler: BackendHandler;\n readonly pricing: Pricing;\n readonly exposedVia: readonly ProtocolName[];\n readonly paymentMethods: readonly PaymentMethodName[];\n /**\n * Authorization the buyer must present in addition to payment. Opt-in per\n * resource. It sits beside `paymentMethods`, not inside it, because an\n * authorization method is not a payment rail and must never be selectable as\n * one.\n */\n readonly authorization?: {\n readonly required: readonly AuthorizationMethodName[];\n };\n}\n\n/** Read-only view of every configured resource */\nexport interface ResourceRegistry {\n get(id: string): CommerceResource | undefined;\n list(): readonly CommerceResource[];\n /** Resources exposed through a given protocol surface */\n listExposedVia(protocol: ProtocolName): readonly CommerceResource[];\n has(id: string): boolean;\n}\n","/**\n * Gateway-defined wire envelopes and carriers. FROZEN CONTRACT.\n *\n * The HTTP routes and the MCP and A2A adapters build their \"payment required\"\n * and \"error\" bodies with these helpers, so those surfaces send the same\n * shapes. The ACP adapter maps errors to ACP's own error format instead.\n */\n\nimport { CommerceError, type CommerceErrorCode } from '../errors';\nimport { isRecord } from '../is-record';\nimport type { AuthorizationRequirement, AuthorizationSubmission } from './authorization';\nimport type { DecimalAmount, IsoTimestamp, PaymentMethodName } from './common';\nimport type { PaymentSubmission } from './payment';\nimport type { DeliveredOutcome, PaymentRequiredOutcome } from './request';\nimport type { CommerceResource } from './resource';\n\n/**\n * Reserved input property carrying a payment proof on protocols with no header\n * channel (MCP tool calls, A2A message data). HTTP uses a header instead.\n */\nexport const PAYMENT_INPUT_FIELD = '_payment';\n\n/**\n * HTTP request header carrying an x402 payment proof. MPP proofs use\n * `Authorization: Payment ...` instead.\n *\n * The x402 v2 header names, lowercased as Node presents incoming headers. v1's\n * `X-PAYMENT` / `X-PAYMENT-RESPONSE` pair is not accepted: honoring both\n * versions would mean two verification paths for the same money.\n */\nexport const PAYMENT_HEADER = 'payment-signature';\n\n/** HTTP response header carrying the settlement result */\nexport const PAYMENT_RESPONSE_HEADER = 'payment-response';\n\n/**\n * Reserved input property carrying an authorization proof, the counterpart of\n * {@link PAYMENT_INPUT_FIELD}.\n *\n * `_payment` is a bare string whose method is taken from the resource's first\n * payment method. This field is a `{ method, payload }` object, because the\n * method of a security control should be stated, not inferred.\n */\nexport const AUTHORIZATION_INPUT_FIELD = '_authorization';\n\n/**\n * Every input property name the gateway claims for itself. The config loader\n * rejects a resource declaring one, protocol adapters lift them out of client\n * input, and the pipeline strips them again as defense in depth.\n */\nexport const RESERVED_INPUT_FIELDS: readonly string[] = [\n PAYMENT_INPUT_FIELD,\n AUTHORIZATION_INPUT_FIELD,\n];\n\n/**\n * HTTP request header carrying the authorization proof: base64url-encoded JSON\n * of the same `{ method, payload }` object the reserved input field carries.\n *\n * An Agent Commerce carrier, not a header from any authorization\n * specification. It is namespaced rather than reusing `Authorization`, which\n * already carries other credentials, including MPP payment proofs.\n */\nexport const AUTHORIZATION_HEADER = 'agent-authorization';\n\n/**\n * Hard cap on the encoded `Agent-Authorization` header.\n *\n * Node's default limit is 16 KiB across all request headers, and a request over\n * it is refused before the gateway sees it. Capping well below that gives an\n * oversized proof a deterministic `AUTHORIZATION_INVALID` naming the limit.\n */\nexport const MAX_AUTHORIZATION_HEADER_BYTES = 8192;\n\n/**\n * HTTP response header carrying the base64 x402 challenge on a 402.\n *\n * The body still carries the richer {@link PaymentRequiredEnvelope}, the only\n * channel MCP has, but an x402 v2 client reads the challenge from this header\n * and ignores the body, so both are sent.\n */\nexport const PAYMENT_REQUIRED_HEADER = 'payment-required';\n\n/**\n * Key under which a protocol adapter attaches a {@link DeliverySummary} to its\n * result metadata: MCP's `CallToolResult._meta` and the A2A task artifact's\n * metadata.\n *\n * Part of the frozen contract because producer and consumer must agree on it;\n * both import this constant. Follows MCP's `<namespace>/<name>` convention for\n * `_meta` keys.\n */\nexport const DELIVERY_SUMMARY_META_KEY = 'agent-commerce/delivery';\n\nexport interface PaymentRequiredEnvelope {\n readonly status: 'payment-required';\n readonly code: 'PAYMENT_REQUIRED';\n readonly requestId: string;\n readonly resourceId: string;\n readonly message: string;\n readonly payment: {\n readonly provider: PaymentMethodName;\n readonly version: string;\n readonly amount: DecimalAmount;\n readonly currency: string;\n /**\n * @deprecated Read each offer's `payTo` in `accepts`. Absent when the\n * challenge offers several destinations.\n */\n readonly destination?: string;\n /** @deprecated Read each offer's `network` in `accepts` */\n readonly network?: string;\n /** @deprecated Read each offer's `asset` in `accepts` */\n readonly asset?: string;\n readonly expiresAt?: IsoTimestamp;\n /** Provider-native requirement objects, passed through verbatim */\n readonly accepts: readonly Readonly<Record<string, unknown>>[];\n /**\n * The provider's own challenge document, verbatim (see\n * {@link PaymentChallenge.envelope}). Present for providers that have one;\n * a buyer's protocol client can hand it straight to its SDK.\n */\n readonly envelope?: Readonly<Record<string, unknown>>;\n };\n /**\n * Present only when the resource also requires an authorization proof, so a\n * client learns before it spends anything that paying alone will not get the\n * resource delivered. A client that ignores the field sees the plain\n * envelope. The proof comes from the merchant's own approval flow, outside\n * the gateway.\n */\n readonly authorization?: {\n readonly required: readonly AuthorizationRequirement[];\n };\n}\n\nexport interface ErrorEnvelope {\n readonly status: 'error';\n readonly code: CommerceErrorCode;\n readonly message: string;\n readonly retryable: boolean;\n readonly requestId?: string;\n readonly resourceId?: string;\n readonly details?: Readonly<Record<string, unknown>>;\n}\n\n/**\n * What a buyer learns about their own completed purchase: the request, whether\n * it settled, and the settlement reference they can check on-chain. The\n * merchant's ledger is not theirs to read, which is why `/api/receipts` is an\n * operator route behind `server.adminToken`.\n */\nexport interface DeliverySummary {\n readonly requestId: string;\n readonly resourceId: string;\n readonly receiptId: string;\n readonly deliveredAt: IsoTimestamp;\n readonly payment?: {\n readonly status: 'verified' | 'settled' | 'rejected';\n readonly amount: DecimalAmount;\n readonly currency: string;\n /** Settlement reference, e.g. an on-chain transaction hash */\n readonly externalReference?: string;\n readonly network?: string;\n };\n}\n\n/** Build the payer-facing summary of a delivered outcome */\nexport function toDeliverySummary(outcome: DeliveredOutcome): DeliverySummary {\n const p = outcome.payment;\n return {\n requestId: outcome.requestId,\n resourceId: outcome.resourceId,\n receiptId: outcome.receipt.id,\n deliveredAt: outcome.receipt.deliveredAt,\n ...(p !== undefined\n ? {\n payment: {\n status: p.status,\n amount: p.amount,\n currency: p.currency,\n ...(p.externalReference !== undefined\n ? { externalReference: p.externalReference }\n : {}),\n ...(p.network !== undefined ? { network: p.network } : {}),\n },\n }\n : {}),\n };\n}\n\nexport function toPaymentRequiredEnvelope(\n outcome: PaymentRequiredOutcome,\n): PaymentRequiredEnvelope {\n const r = outcome.requirement;\n return {\n status: 'payment-required',\n code: 'PAYMENT_REQUIRED',\n requestId: outcome.requestId,\n resourceId: outcome.resourceId,\n message: `Payment of ${r.amount} ${r.currency} is required for resource \"${outcome.resourceId}\". Retry with a ${r.provider} payment proof.`,\n payment: {\n provider: r.provider,\n version: r.challenge.version,\n amount: r.amount,\n currency: r.currency,\n ...(r.destination !== undefined ? { destination: r.destination } : {}),\n ...(r.network !== undefined ? { network: r.network } : {}),\n ...(r.asset !== undefined ? { asset: r.asset } : {}),\n ...(r.expiresAt !== undefined ? { expiresAt: r.expiresAt } : {}),\n accepts: r.challenge.accepts,\n ...(r.challenge.envelope !== undefined ? { envelope: r.challenge.envelope } : {}),\n },\n ...(outcome.authorization !== undefined && outcome.authorization.length > 0\n ? { authorization: { required: outcome.authorization } }\n : {}),\n };\n}\n\nexport function toErrorEnvelope(error: CommerceError): ErrorEnvelope {\n const info = error.toInfo();\n return {\n status: 'error',\n code: info.code,\n message: info.message,\n retryable: info.retryable,\n ...(info.requestId !== undefined ? { requestId: info.requestId } : {}),\n ...(info.resourceId !== undefined ? { resourceId: info.resourceId } : {}),\n ...(info.details !== undefined ? { details: info.details } : {}),\n };\n}\n\nexport function isPaymentRequiredEnvelope(value: unknown): value is PaymentRequiredEnvelope {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as PaymentRequiredEnvelope).status === 'payment-required' &&\n typeof (value as PaymentRequiredEnvelope).payment === 'object'\n );\n}\n\n/**\n * Parses the `{ method, payload }` authorization object, whichever carrier\n * brought it. Absent returns `undefined`; malformed throws\n * `AUTHORIZATION_INVALID`.\n *\n * An unusable `_payment` is dropped, which leaves the buyer a 402 to act on. A\n * dropped authorization would instead come back as \"not authorized\", with no\n * way to tell a rejected mandate from a typo in the object around it.\n */\nexport function parseAuthorizationSubmission(\n value: unknown,\n requestId?: string,\n): AuthorizationSubmission | undefined {\n if (value === undefined || value === null) return undefined;\n\n const fail = (detail: string): never => {\n throw new CommerceError('AUTHORIZATION_INVALID', `Malformed authorization: ${detail}`, {\n ...(requestId !== undefined ? { requestId } : {}),\n });\n };\n\n if (!isRecord(value)) {\n return fail(`expected an object with \"method\" and \"payload\", got ${typeof value}`);\n }\n const method = value['method'];\n const payload = value['payload'];\n\n // Compared against the literal rather than a registry: a second method needs\n // a second verifier, a deliberate addition rather than a string that starts\n // working because a client sent it\n if (method !== 'ap2') {\n fail(`unsupported method ${typeof method === 'string' ? `\"${method}\"` : typeof method}`);\n }\n if (typeof payload !== 'string' || payload.length === 0) {\n fail('\"payload\" must be a non-empty string');\n }\n\n return { method: 'ap2', payload: payload as string };\n}\n\n/**\n * Decodes the base64url JSON `Agent-Authorization` header. The size check runs\n * on the encoded value, so an oversized header costs a length comparison rather\n * than a decode and a JSON parse.\n */\nexport function parseAuthorizationHeader(\n raw: string | readonly string[] | undefined,\n requestId?: string,\n): AuthorizationSubmission | undefined {\n const value = Array.isArray(raw) ? raw[0] : (raw as string | undefined);\n if (value === undefined || value.length === 0) return undefined;\n\n const fail = (detail: string): never => {\n throw new CommerceError('AUTHORIZATION_INVALID', `Malformed authorization: ${detail}`, {\n ...(requestId !== undefined ? { requestId } : {}),\n });\n };\n\n if (Buffer.byteLength(value, 'utf8') > MAX_AUTHORIZATION_HEADER_BYTES) {\n fail(`header exceeds the ${MAX_AUTHORIZATION_HEADER_BYTES}-byte limit`);\n }\n\n let decoded: unknown;\n try {\n decoded = JSON.parse(Buffer.from(value, 'base64url').toString('utf8'));\n } catch {\n // Nothing from the exception is repeated back: a JSON parse error quotes\n // the input it choked on, which here is whatever the caller sent\n fail('header is not base64url-encoded JSON');\n }\n return parseAuthorizationSubmission(decoded, requestId);\n}\n\n/**\n * Splits raw client input into resource input plus the reserved fields, for\n * protocols that carry them in the input object (MCP tool arguments, A2A\n * message data). HTTP carries both in headers.\n *\n * A payment proof is labeled with the resource's first payment method.\n * `createGateway` puts provider-backed methods first so the label matches the\n * pipeline's selection; a custom registry must keep that order. A resource with\n * no payment method gets no payment proof, so the request reaches the pipeline\n * unpaid.\n */\nexport function extractReservedInputFields(\n rawInput: Record<string, unknown>,\n resource: CommerceResource | undefined,\n requestId?: string,\n): {\n input: Record<string, unknown>;\n payment?: PaymentSubmission;\n authorization?: AuthorizationSubmission;\n} {\n const {\n [PAYMENT_INPUT_FIELD]: paymentValue,\n [AUTHORIZATION_INPUT_FIELD]: authorizationValue,\n ...input\n } = rawInput;\n\n const method = resource?.paymentMethods[0];\n const payment =\n typeof paymentValue === 'string' && paymentValue.length > 0 && method !== undefined\n ? ({ method, payload: paymentValue } satisfies PaymentSubmission)\n : undefined;\n const authorization = parseAuthorizationSubmission(authorizationValue, requestId);\n\n return {\n input,\n ...(payment !== undefined ? { payment } : {}),\n ...(authorization !== undefined ? { authorization } : {}),\n };\n}\n","/**\n * Minimal structural logger. Core does not depend on pino; the gateway injects\n * a pino instance that satisfies this shape.\n *\n * Never log secrets: private keys, seed phrases, Authorization headers or\n * payment authorization payloads.\n */\nexport interface Logger {\n debug(obj: Record<string, unknown>, msg?: string): void;\n info(obj: Record<string, unknown>, msg?: string): void;\n warn(obj: Record<string, unknown>, msg?: string): void;\n error(obj: Record<string, unknown>, msg?: string): void;\n child(bindings: Record<string, unknown>): Logger;\n}\n\n/** A logger that discards everything */\nexport const NOOP_LOGGER: Logger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n child: () => NOOP_LOGGER,\n};\n","/**\n * Protocol adapter boundary. FROZEN CONTRACT.\n *\n * An adapter translates a protocol's wire format into a `CanonicalRequest`,\n * hands it to the execution pipeline and maps the outcome back. It must not\n * call merchant backends, implement payment logic or hold its own copy of the\n * canonical model. A failure while starting or serving one adapter must not\n * stop the others.\n */\nimport type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { AdapterDescriptor, AdapterHealth, ProtocolName } from '../domain/common';\nimport type { EventSink } from '../domain/event';\nimport type { ExecutionPipeline } from '../domain/request';\nimport type { ResourceRegistry } from '../domain/resource';\nimport type { Logger } from './logger';\nimport type { Clock, IdGenerator } from './runtime';\n\n/** Everything an adapter is given. Nothing else is available to it */\nexport interface ProtocolAdapterContext {\n readonly pipeline: ExecutionPipeline;\n readonly resources: ResourceRegistry;\n readonly events: EventSink;\n readonly logger: Logger;\n readonly clock: Clock;\n readonly ids: IdGenerator;\n /** Externally reachable base URL of the gateway, from config */\n readonly publicBaseUrl: string;\n}\n\nexport interface ProtocolAdapter {\n readonly name: ProtocolName;\n readonly descriptor: AdapterDescriptor;\n\n start(context: ProtocolAdapterContext): Promise<void>;\n health(): Promise<AdapterHealth>;\n stop(): Promise<void>;\n}\n\n/**\n * A protocol adapter served over HTTP. The gateway mounts `handleHttp` at\n * `mountPath` with raw Node request and response objects, so adapters stay\n * independent of the HTTP framework.\n *\n * Guarantee: `req` arrives with its body stream unread. The gateway suppresses\n * every body parser on the mount, so an adapter whose SDK reads the body itself\n * (MCP's Streamable HTTP transport) can do so. The adapter owns reading,\n * size-limiting beyond the gateway's own cap, and parsing.\n *\n * The guarantee can break silently. Fastify prefers its exact-match\n * `application/json` and `text/plain` parsers over a `'*'` wildcard, so a\n * wildcard no-op alone lets the JSON parser drain the body and the adapter\n * reads an empty stream. The MCP conformance suite drives `handleHttp` over a\n * bare `node:http` server and cannot catch it, so any change to adapter mounting\n * needs a test that POSTs a JSON body through the real gateway and asserts the\n * adapter received it intact.\n */\nexport interface HttpProtocolAdapter extends ProtocolAdapter {\n /** Path prefix the gateway mounts this adapter at, e.g. '/mcp' */\n readonly mountPath: string;\n handleHttp(req: IncomingMessage, res: ServerResponse): Promise<void>;\n /**\n * Fixed paths this adapter owns outside its mount, for protocols whose\n * specification pins a discovery URL (A2A's `/.well-known/agent-card.json`).\n * The gateway mounts them with the same guarantees as `mountPath`: unread\n * body, concurrency cap and failure isolation.\n */\n readonly additionalHttpRoutes?: readonly AdapterHttpRoute[];\n}\n\n/**\n * One fixed, method-scoped route owned by an adapter. Unlike `mountPath` it\n * registers no wildcard and matches exactly the path given.\n */\nexport interface AdapterHttpRoute {\n readonly method: 'GET' | 'POST';\n /** Absolute gateway path, e.g. '/.well-known/agent-card.json' */\n readonly path: string;\n handleHttp(req: IncomingMessage, res: ServerResponse): Promise<void>;\n}\n\nexport function isHttpProtocolAdapter(adapter: ProtocolAdapter): adapter is HttpProtocolAdapter {\n return typeof (adapter as HttpProtocolAdapter).handleHttp === 'function';\n}\n"]}
|