@devlab.group/agent-commerce 2.4.0 → 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.
Files changed (108) hide show
  1. package/README.md +115 -15
  2. package/dist/ap2.d.ts +24 -12
  3. package/dist/ap2.js +31 -13
  4. package/dist/ap2.js.map +1 -1
  5. package/dist/{chunk-AITMDXKW.js → chunk-3OTCFFFT.js} +37 -4
  6. package/dist/chunk-3OTCFFFT.js.map +1 -0
  7. package/dist/{chunk-4OEXK3YG.js → chunk-4K7FIBJM.js} +25 -4
  8. package/dist/chunk-4K7FIBJM.js.map +1 -0
  9. package/dist/{chunk-WUIAUAA7.js → chunk-FKQK5XZA.js} +652 -68
  10. package/dist/chunk-FKQK5XZA.js.map +1 -0
  11. package/dist/chunk-GA3O2A7R.js +92 -0
  12. package/dist/chunk-GA3O2A7R.js.map +1 -0
  13. package/dist/{chunk-6WACRJVT.js → chunk-VUCMBGUR.js} +3 -3
  14. package/dist/{chunk-6WACRJVT.js.map → chunk-VUCMBGUR.js.map} +1 -1
  15. package/dist/cli/{ap2-QDHPRSTF.js → ap2-YAPLERSC.js} +34 -15
  16. package/dist/cli/ap2-YAPLERSC.js.map +1 -0
  17. package/dist/cli/{chunk-G2JEY7MB.js → chunk-2J2IQQ4X.js} +8 -7
  18. package/dist/cli/chunk-2J2IQQ4X.js.map +1 -0
  19. package/dist/cli/chunk-2UPPX3FJ.js +311 -0
  20. package/dist/cli/chunk-2UPPX3FJ.js.map +1 -0
  21. package/dist/cli/{chunk-WYOGIANL.js → chunk-4H2QLHQI.js} +4 -4
  22. package/dist/cli/{chunk-WYOGIANL.js.map → chunk-4H2QLHQI.js.map} +1 -1
  23. package/dist/cli/{chunk-OZ4LAWBK.js → chunk-5R7DM5LM.js} +25 -4
  24. package/dist/cli/chunk-5R7DM5LM.js.map +1 -0
  25. package/dist/cli/chunk-663ALDZA.js +92 -0
  26. package/dist/cli/chunk-663ALDZA.js.map +1 -0
  27. package/dist/cli/{chunk-QQ3WY5L3.js → chunk-IDY2735M.js} +36 -104
  28. package/dist/cli/chunk-IDY2735M.js.map +1 -0
  29. package/dist/cli/chunk-JFVRG2HH.js +107 -0
  30. package/dist/cli/chunk-JFVRG2HH.js.map +1 -0
  31. package/dist/cli/chunk-M7NXVRU5.js +8 -0
  32. package/dist/cli/{chunk-UXB65XCS.js.map → chunk-M7NXVRU5.js.map} +1 -1
  33. package/dist/cli/chunk-NIU5EMSB.js +119 -0
  34. package/dist/cli/chunk-NIU5EMSB.js.map +1 -0
  35. package/dist/cli/{chunk-AZDWFVDW.js → chunk-QA2OPHBF.js} +655 -70
  36. package/dist/cli/chunk-QA2OPHBF.js.map +1 -0
  37. package/dist/cli/{chunk-DCMW67JM.js → chunk-QLUCNPRT.js} +404 -161
  38. package/dist/cli/chunk-QLUCNPRT.js.map +1 -0
  39. package/dist/cli/chunk-SYQLJXIU.js +105 -0
  40. package/dist/cli/chunk-SYQLJXIU.js.map +1 -0
  41. package/dist/cli/{chunk-3MGAJ5FX.js → chunk-VJ4EO4LE.js} +3 -3
  42. package/dist/cli/{chunk-3MGAJ5FX.js.map → chunk-VJ4EO4LE.js.map} +1 -1
  43. package/dist/cli/{chunk-PIMFPCNZ.js → chunk-Z34UMZBB.js} +234 -85
  44. package/dist/cli/chunk-Z34UMZBB.js.map +1 -0
  45. package/dist/cli/config-BWFMN2ZB.js +12 -0
  46. package/dist/cli/{config-UI4EDG4L.js.map → config-BWFMN2ZB.js.map} +1 -1
  47. package/dist/cli/index.js +258 -11
  48. package/dist/cli/index.js.map +1 -1
  49. package/dist/cli/{mcp-26LJMN4N.js → mcp-KZEMXLHR.js} +5 -4
  50. package/dist/cli/mcp-KZEMXLHR.js.map +1 -0
  51. package/dist/cli/{near-5AY3HWYF.js → near-U6365VFX.js} +15 -4
  52. package/dist/cli/near-U6365VFX.js.map +1 -0
  53. package/dist/cli/payment-providers-SZL36H3Y.js +6 -0
  54. package/dist/cli/payment-providers-SZL36H3Y.js.map +1 -0
  55. package/dist/cli/{provider-Z4OJNAYI.js → provider-6TKB5ADJ.js} +30 -16
  56. package/dist/cli/provider-6TKB5ADJ.js.map +1 -0
  57. package/dist/cli/receipts-ZGLJWMQG.js +8 -0
  58. package/dist/cli/receipts-ZGLJWMQG.js.map +1 -0
  59. package/dist/cli/reconcile-IC22MJD5.js +4 -0
  60. package/dist/cli/reconcile-IC22MJD5.js.map +1 -0
  61. package/dist/cli/{run-TEPYJUHG.js → run-ZTYPQI4D.js} +151 -115
  62. package/dist/cli/run-ZTYPQI4D.js.map +1 -0
  63. package/dist/cli/svm-KDSPDFJG.js +48 -0
  64. package/dist/cli/svm-KDSPDFJG.js.map +1 -0
  65. package/dist/cli/{x402-BMVONZKA.js → x402-WLYBLODI.js} +10 -9
  66. package/dist/cli/x402-WLYBLODI.js.map +1 -0
  67. package/dist/index.d.ts +112 -12
  68. package/dist/index.js +948 -157
  69. package/dist/index.js.map +1 -1
  70. package/dist/mcp.d.ts +1 -2
  71. package/dist/mcp.js +1 -1
  72. package/dist/mpp.js +24 -11
  73. package/dist/mpp.js.map +1 -1
  74. package/dist/{near-D6C42VPE.js → near-FH7HPZV3.js} +15 -4
  75. package/dist/near-FH7HPZV3.js.map +1 -0
  76. package/dist/{protocol-adapter-C9odYl6l.d.ts → protocol-adapter-DEXpdp8m.d.ts} +102 -48
  77. package/dist/{runtime-Cl_BLVZV.d.ts → runtime-Dz2fSO-P.d.ts} +220 -2
  78. package/dist/svm-KNC3PHMS.js +48 -0
  79. package/dist/svm-KNC3PHMS.js.map +1 -0
  80. package/dist/x402.js +5 -5
  81. package/package.json +1 -1
  82. package/dist/authorization-DjAecwuW.d.ts +0 -115
  83. package/dist/chunk-4OEXK3YG.js.map +0 -1
  84. package/dist/chunk-AITMDXKW.js.map +0 -1
  85. package/dist/chunk-KA2AX5FH.js +0 -44
  86. package/dist/chunk-KA2AX5FH.js.map +0 -1
  87. package/dist/chunk-WUIAUAA7.js.map +0 -1
  88. package/dist/cli/ap2-QDHPRSTF.js.map +0 -1
  89. package/dist/cli/chunk-AZDWFVDW.js.map +0 -1
  90. package/dist/cli/chunk-DCMW67JM.js.map +0 -1
  91. package/dist/cli/chunk-G2JEY7MB.js.map +0 -1
  92. package/dist/cli/chunk-OSTCU6ZK.js +0 -44
  93. package/dist/cli/chunk-OSTCU6ZK.js.map +0 -1
  94. package/dist/cli/chunk-OZ4LAWBK.js.map +0 -1
  95. package/dist/cli/chunk-PIMFPCNZ.js.map +0 -1
  96. package/dist/cli/chunk-QQ3WY5L3.js.map +0 -1
  97. package/dist/cli/chunk-UXB65XCS.js +0 -8
  98. package/dist/cli/config-UI4EDG4L.js +0 -11
  99. package/dist/cli/mcp-26LJMN4N.js.map +0 -1
  100. package/dist/cli/near-5AY3HWYF.js.map +0 -1
  101. package/dist/cli/provider-Z4OJNAYI.js.map +0 -1
  102. package/dist/cli/run-TEPYJUHG.js.map +0 -1
  103. package/dist/cli/svm-3MMYFPC7.js +0 -33
  104. package/dist/cli/svm-3MMYFPC7.js.map +0 -1
  105. package/dist/cli/x402-BMVONZKA.js.map +0 -1
  106. package/dist/near-D6C42VPE.js.map +0 -1
  107. package/dist/svm-QEUAUNPQ.js +0 -33
  108. package/dist/svm-QEUAUNPQ.js.map +0 -1
@@ -1,16 +1,20 @@
1
- import { createSqliteReceiptStore, A2A_DEFAULT_MOUNT_PATH, A2A_DEFAULT_AGENT_NAME, buildDescriptor, A2A_AGENT_CARD_PATH, A2A_JSON_MEDIA_TYPE, A2A_VERSION_HEADER, A2A_PROTOCOL_VERSION, A2A_EXTENSIONS_HEADER, A2A_PUSH_CONFIG_METHODS, A2A_TASK_LOOKUP_METHODS, A2A_UNSUPPORTED_METHODS, A2A_METHOD_SEND_MESSAGE, buildDescriptor2, A2A_PROTOCOL_BINDING, A2A_TASK_STATE_FAILED, A2A_TASK_STATE_COMPLETED, A2A_TASK_STATE_INPUT_REQUIRED } from './chunk-DCMW67JM.js';
2
- import { loadConfig } from './chunk-G2JEY7MB.js';
3
- import { HttpBackendExecutor, createResourceRegistry, createStoreEventSink, createExecutionPipeline, ACP_WELL_KNOWN_PATH, ACP_CHECKOUT_OPERATIONS, ACP_IN_FLIGHT_RETRY_AFTER_SECONDS, ACP_IDEMPOTENT_REPLAYED_HEADER, ACP_IDEMPOTENCY_KEY_HEADER, ACP_REQUEST_ID_HEADER, ACP_SPEC_VERSION, ACP_JSON_MEDIA_TYPE, ACP_API_VERSION, ACP_API_VERSION_HEADER, ACP_MAX_REQUEST_ID_LENGTH, ACP_OPERATION_INPUT_KEYS, ACP_OPERATION_OPTIONAL_INPUT_KEYS, ACP_SESSION_ID_INPUT_KEY, ACP_FORWARDED_HEADERS, ACP_MAX_FORWARDED_HEADER_LENGTH, BackendErrorResponse, ACP_MERCHANT_RETRY_AFTER_DEFAULT_SECONDS, ACP_MERCHANT_RETRY_AFTER_MAX_SECONDS } from './chunk-PIMFPCNZ.js';
4
- import { MPP_DEFAULT_PAYMENT_FLOW, MPP_PROFILE } from './chunk-AA3FIEAR.js';
5
- import { x402OfferName } from './chunk-WYOGIANL.js';
6
- import { X402_DEFAULT_PAYMENT_FLOW, resolveDeploymentMode, requireX402Network } from './chunk-OZ4LAWBK.js';
7
- import { openSqliteDatabase } from './chunk-3MGAJ5FX.js';
8
- import './chunk-FHCFR2GS.js';
1
+ import { createConfiguredPaymentProviders, importOptionalPeer } from './chunk-JFVRG2HH.js';
9
2
  import { readCappedBody, createBearerCheck, joinUrl, settlementResponse, settlementResponseFromDetails, settlementFailure, x402ErrorCode, x402RefusalStatus } from './chunk-SPAYKVUP.js';
3
+ import { A2A_DEFAULT_MOUNT_PATH, A2A_DEFAULT_AGENT_NAME, buildDescriptor, A2A_AGENT_CARD_PATH, A2A_JSON_MEDIA_TYPE, A2A_VERSION_HEADER, A2A_PROTOCOL_VERSION, A2A_EXTENSIONS_HEADER, A2A_PUSH_CONFIG_METHODS, A2A_TASK_LOOKUP_METHODS, A2A_UNSUPPORTED_METHODS, A2A_METHOD_SEND_MESSAGE, buildDescriptor2, A2A_PROTOCOL_BINDING, A2A_TASK_STATE_FAILED, A2A_TASK_STATE_COMPLETED, A2A_TASK_STATE_INPUT_REQUIRED } from './chunk-NIU5EMSB.js';
4
+ import { createSqliteReceiptStore } from './chunk-QLUCNPRT.js';
5
+ import { openSqliteDatabase } from './chunk-VJ4EO4LE.js';
6
+ import { loadConfig } from './chunk-2J2IQQ4X.js';
7
+ import { HttpBackendExecutor, createResourceRegistry, createStoreEventSink, createExecutionPipeline, ACP_WELL_KNOWN_PATH, ACP_CHECKOUT_OPERATIONS, ACP_IN_FLIGHT_RETRY_AFTER_SECONDS, ACP_IDEMPOTENT_REPLAYED_HEADER, ACP_IDEMPOTENCY_KEY_HEADER, ACP_REQUEST_ID_HEADER, ACP_SPEC_VERSION, ACP_JSON_MEDIA_TYPE, ACP_API_VERSION, ACP_API_VERSION_HEADER, ACP_MAX_REQUEST_ID_LENGTH, ACP_OPERATION_INPUT_KEYS, ACP_OPERATION_OPTIONAL_INPUT_KEYS, ACP_SESSION_ID_INPUT_KEY, ACP_FORWARDED_HEADERS, ACP_MAX_FORWARDED_HEADER_LENGTH, BackendErrorResponse, ACP_MERCHANT_RETRY_AFTER_DEFAULT_SECONDS, ACP_MERCHANT_RETRY_AFTER_MAX_SECONDS } from './chunk-Z34UMZBB.js';
8
+ import './chunk-FHCFR2GS.js';
10
9
  import './chunk-TPC4EJLT.js';
10
+ import { resolveManually, journalOf } from './chunk-2UPPX3FJ.js';
11
11
  import { contentDigest, CONTENT_DIGEST_METADATA_KEY, mppProblem, mppProblemDetail } from './chunk-5K4XEAZV.js';
12
- import { PACKAGE_VERSION } from './chunk-UXB65XCS.js';
13
- import { PAYMENT_HEADER, AUTHORIZATION_HEADER, CommerceError, isCommerceError, systemClock, toLogInfo, toCommerceError, extractReservedInputFields, isHttpProtocolAdapter, toErrorEnvelope, DELIVERY_SUMMARY_META_KEY, toDeliverySummary, toPaymentRequiredEnvelope, NOOP_LOGGER, parseAuthorizationHeader, PAYMENT_REQUIRED_HEADER, PAYMENT_RESPONSE_HEADER, PAYMENT_INPUT_FIELD, AUTHORIZATION_INPUT_FIELD, parseAuthorizationSubmission } from './chunk-QQ3WY5L3.js';
12
+ import { MPP_DEFAULT_PAYMENT_FLOW, MPP_PROFILE } from './chunk-AA3FIEAR.js';
13
+ import { PACKAGE_VERSION } from './chunk-M7NXVRU5.js';
14
+ import { x402OfferName } from './chunk-4H2QLHQI.js';
15
+ import { X402_DEFAULT_PAYMENT_FLOW, resolveDeploymentMode, requireX402Network } from './chunk-5R7DM5LM.js';
16
+ import { PAYMENT_HEADER, AUTHORIZATION_HEADER, systemClock, extractReservedInputFields, isHttpProtocolAdapter, toErrorEnvelope, DELIVERY_SUMMARY_META_KEY, toDeliverySummary, toPaymentRequiredEnvelope, NOOP_LOGGER, parseAuthorizationHeader, PAYMENT_REQUIRED_HEADER, PAYMENT_RESPONSE_HEADER, PAYMENT_INPUT_FIELD, AUTHORIZATION_INPUT_FIELD, parseAuthorizationSubmission, TRANSACTION_STATES } from './chunk-IDY2735M.js';
17
+ import { CommerceError, isCommerceError, toLogInfo, toCommerceError } from './chunk-SYQLJXIU.js';
14
18
  import { isRecord } from './chunk-3M6U7ILB.js';
15
19
  import { createHash, randomUUID } from 'crypto';
16
20
  import { z } from 'zod';
@@ -133,14 +137,13 @@ var A2A_CALL_SHAPE = 'one data part {"resource": "<skill id>", "input": {...}}';
133
137
  function userRoleProblem(role) {
134
138
  return role === A2A_USER_ROLE ? void 0 : `Unsupported message role "${String(role)}": only ${A2A_USER_ROLE} is accepted.`;
135
139
  }
136
- var UnknownRecord = z.record(z.string(), z.unknown());
137
140
  var MessageSchema = z.object({
138
141
  role: z.string(),
139
142
  messageId: z.string().optional(),
140
- parts: z.array(UnknownRecord),
143
+ parts: z.array(z.unknown()),
141
144
  taskId: z.string().optional(),
142
145
  contextId: z.string().optional(),
143
- referenceTaskIds: z.array(z.string()).optional()
146
+ referenceTaskIds: z.array(z.unknown()).optional()
144
147
  });
145
148
  var ParamsSchema = z.object({
146
149
  message: MessageSchema,
@@ -224,6 +227,7 @@ function parseInvocation(rawParams) {
224
227
  }
225
228
  const part = message.parts[0];
226
229
  if (part === void 0) throw invalid("Message carries no parts.");
230
+ if (!isRecord(part)) throw invalid("Message part must be a JSON object.");
227
231
  assertSupportedPart(part);
228
232
  const data = part["data"];
229
233
  if (!isRecord(data)) {
@@ -6149,99 +6153,6 @@ function wrapPino(instance) {
6149
6153
  return logger;
6150
6154
  }
6151
6155
 
6152
- // src/gateway/optional-peer.ts
6153
- var MISSING_PACKAGE = /Cannot find package '([^']+)'/;
6154
- async function importOptionalPeer(feature, load) {
6155
- try {
6156
- return await load();
6157
- } catch (cause) {
6158
- if (cause?.code !== "ERR_MODULE_NOT_FOUND") throw cause;
6159
- const pkg = MISSING_PACKAGE.exec(cause.message)?.[1];
6160
- if (pkg === void 0) throw cause;
6161
- throw new CommerceError(
6162
- "CONFIG_INVALID",
6163
- `${feature} is enabled, but the package "${pkg}" is not installed. Install the optional peers it needs at the versions \`agent-commerce version\` lists, or disable it.`,
6164
- { cause }
6165
- );
6166
- }
6167
- }
6168
-
6169
- // src/gateway/payment-providers.ts
6170
- function offerOptions(option) {
6171
- return {
6172
- network: option.network,
6173
- rpcUrl: option.rpcUrl,
6174
- asset: option.asset,
6175
- assetDecimals: option.assetDecimals,
6176
- payTo: option.payTo,
6177
- ...option.assetName !== void 0 ? { assetName: option.assetName } : {},
6178
- ...option.assetVersion !== void 0 ? { assetVersion: option.assetVersion } : {},
6179
- ...option.assetTransferMethod !== void 0 ? { assetTransferMethod: option.assetTransferMethod } : {}
6180
- };
6181
- }
6182
- async function createConfiguredPaymentProviders(payments, logger) {
6183
- const providers = [];
6184
- const { x402, mpp } = payments;
6185
- if (x402?.enabled) {
6186
- const { createX402PaymentProvider } = await importOptionalPeer(
6187
- "payments.x402",
6188
- () => import('./x402-BMVONZKA.js')
6189
- );
6190
- providers.push(
6191
- createX402PaymentProvider({
6192
- // Support manually built single-option configs without `options`
6193
- offers: (x402.options ?? [x402]).map(offerOptions),
6194
- ...x402.resourceOptions !== void 0 ? {
6195
- resourceOffers: Object.fromEntries(
6196
- Object.entries(x402.resourceOptions).map(([id, list]) => [
6197
- id,
6198
- list.map(offerOptions)
6199
- ])
6200
- )
6201
- } : {},
6202
- maxTimeoutSeconds: x402.maxTimeoutSeconds,
6203
- ...x402.paymentFlow !== void 0 ? { paymentFlow: x402.paymentFlow } : {},
6204
- ...x402.resourcePaymentFlows !== void 0 ? { resourcePaymentFlows: x402.resourcePaymentFlows } : {},
6205
- ...x402.resourceMimeTypes !== void 0 ? { resourceMimeTypes: x402.resourceMimeTypes } : {},
6206
- facilitator: x402.facilitator,
6207
- ...x402.allowMainnet !== void 0 ? { allowMainnet: x402.allowMainnet } : {},
6208
- ...x402.allowUnauthenticatedFacilitator !== void 0 ? { allowUnauthenticatedFacilitator: x402.allowUnauthenticatedFacilitator } : {},
6209
- ...x402.networks !== void 0 ? { customNetworks: x402.networks } : {},
6210
- // Pass quote settings only to x402; MPP builds a separate settlement
6211
- // provider without quotes
6212
- ...x402.quote !== void 0 ? { quote: x402.quote } : {},
6213
- logger
6214
- })
6215
- );
6216
- }
6217
- if (mpp?.enabled) {
6218
- const { createMppPaymentProvider } = await importOptionalPeer(
6219
- "payments.mpp",
6220
- () => import('./provider-Z4OJNAYI.js')
6221
- );
6222
- providers.push(
6223
- createMppPaymentProvider({
6224
- recipient: mpp.recipient,
6225
- asset: mpp.asset,
6226
- assetName: mpp.assetName,
6227
- assetVersion: mpp.assetVersion,
6228
- network: mpp.network,
6229
- realm: mpp.realm,
6230
- challengeSecret: mpp.challengeSecret,
6231
- ...mpp.challengeTtlSeconds !== void 0 ? { challengeTtlSeconds: mpp.challengeTtlSeconds } : {},
6232
- rpcUrl: mpp.rpcUrl,
6233
- facilitator: mpp.facilitator,
6234
- ...mpp.allowMainnet !== void 0 ? { allowMainnet: mpp.allowMainnet } : {},
6235
- ...mpp.allowUnauthenticatedFacilitator !== void 0 ? { allowUnauthenticatedFacilitator: mpp.allowUnauthenticatedFacilitator } : {},
6236
- ...mpp.paymentFlow !== void 0 ? { paymentFlow: mpp.paymentFlow } : {},
6237
- ...mpp.resourcePaymentFlows !== void 0 ? { resourcePaymentFlows: mpp.resourcePaymentFlows } : {},
6238
- logger
6239
- })
6240
- );
6241
- }
6242
- return providers;
6243
- }
6244
-
6245
6156
  // src/gateway/access-control.ts
6246
6157
  var CORS_METHODS = "GET,POST,OPTIONS";
6247
6158
  var CORS_HEADERS = [
@@ -6776,6 +6687,15 @@ function buildWellKnownDocument(options) {
6776
6687
 
6777
6688
  // src/gateway/routes.ts
6778
6689
  var X402_V1_PAYMENT_HEADER = "x-payment";
6690
+ var RESOLVE_BODY_LIMIT_BYTES = 4096;
6691
+ var RESOLVE_FIELDS = [
6692
+ "status",
6693
+ "actor",
6694
+ "reason",
6695
+ "externalReference",
6696
+ "confirmExpired"
6697
+ ];
6698
+ var TRANSACTION_EVENT_LIMIT = 50;
6779
6699
  function registerRoutes(options) {
6780
6700
  const { server } = options;
6781
6701
  const readinessProbe = createReadinessProbe({
@@ -6843,6 +6763,113 @@ function registerRoutes(options) {
6843
6763
  )
6844
6764
  )
6845
6765
  );
6766
+ const { store, clock } = options;
6767
+ const journal = () => journalOf(store);
6768
+ const withAge = (transaction) => ({
6769
+ ...transaction,
6770
+ ageSeconds: Math.max(
6771
+ 0,
6772
+ Math.floor((clock.now().getTime() - Date.parse(transaction.createdAt)) / 1e3)
6773
+ )
6774
+ });
6775
+ server.get(
6776
+ "/api/transactions",
6777
+ { onRequest: tokenHook },
6778
+ operatorHandler(async (request) => {
6779
+ const query = request.query;
6780
+ const limit = parseLimit(query["limit"]);
6781
+ const state = parseText(query["state"]);
6782
+ if (state !== void 0 && !TRANSACTION_STATES.includes(state)) {
6783
+ throw new CommerceError("INPUT_INVALID", `Unknown transaction state "${state}"`, {
6784
+ details: { field: "state" }
6785
+ });
6786
+ }
6787
+ const requestId = parseText(query["requestId"]);
6788
+ const cursor = parseText(query["cursor"]);
6789
+ const page = await journal().listTransactions({
6790
+ ...limit !== void 0 ? { limit } : {},
6791
+ ...parseFlag(query["unresolved"], "unresolved") ? { unresolved: true } : {},
6792
+ ...state !== void 0 ? { state } : {},
6793
+ ...requestId !== void 0 ? { requestId } : {},
6794
+ ...cursor !== void 0 ? { cursor } : {}
6795
+ });
6796
+ return {
6797
+ transactions: page.transactions.map(withAge),
6798
+ ...page.nextCursor !== void 0 ? { nextCursor: page.nextCursor } : {}
6799
+ };
6800
+ })
6801
+ );
6802
+ server.get(
6803
+ "/api/transactions/:id",
6804
+ { onRequest: tokenHook },
6805
+ operatorHandler(async (request) => {
6806
+ const id = request.params.id;
6807
+ const transaction = await journal().getTransaction(id);
6808
+ if (transaction === void 0) {
6809
+ throw new CommerceError("RESOURCE_NOT_FOUND", `Transaction "${id}" was not found`);
6810
+ }
6811
+ const [attempt, receipt, events] = await Promise.all([
6812
+ journal().getPaymentAttempt(transaction.payment.attemptId),
6813
+ transaction.receiptId !== void 0 ? store.getReceipt(transaction.receiptId) : void 0,
6814
+ store.listEvents({ requestId: transaction.requestId, limit: TRANSACTION_EVENT_LIMIT })
6815
+ ]);
6816
+ return {
6817
+ transaction: withAge(transaction),
6818
+ ...attempt !== void 0 ? { attempt } : {},
6819
+ ...receipt !== void 0 ? { receipt } : {},
6820
+ events
6821
+ };
6822
+ })
6823
+ );
6824
+ server.post(
6825
+ "/api/payment-attempts/:id/resolve",
6826
+ { onRequest: tokenHook, bodyLimit: RESOLVE_BODY_LIMIT_BYTES },
6827
+ operatorHandler(async (request) => {
6828
+ const result = await resolveManually({
6829
+ store,
6830
+ authorizationProviders: options.authorizationProviders,
6831
+ clock,
6832
+ logger: options.logger,
6833
+ attemptId: request.params.id,
6834
+ ...parseResolveBody(request.body)
6835
+ });
6836
+ if (!result.resolved) {
6837
+ throw new CommerceError("INPUT_INVALID", result.message, {
6838
+ httpStatus: 409,
6839
+ details: { reason: result.refusal, attemptStatus: result.attempt.status }
6840
+ });
6841
+ }
6842
+ return {
6843
+ attempt: result.attempt,
6844
+ ...result.hold !== void 0 ? { hold: result.hold } : {}
6845
+ };
6846
+ })
6847
+ );
6848
+ }
6849
+ function parseResolveBody(body) {
6850
+ if (!isRecord(body)) {
6851
+ throw new CommerceError("INPUT_INVALID", "The request body must be a JSON object");
6852
+ }
6853
+ const field = (name, type, required) => {
6854
+ const value = body[name];
6855
+ if (value === void 0 && required || value !== void 0 && typeof value !== type) {
6856
+ throw new CommerceError("INPUT_INVALID", `Field "${name}" must be a ${type}`, {
6857
+ details: { field: name }
6858
+ });
6859
+ }
6860
+ };
6861
+ const unknownField = Object.keys(body).find((name) => !RESOLVE_FIELDS.includes(name));
6862
+ if (unknownField !== void 0) {
6863
+ throw new CommerceError("INPUT_INVALID", `Unknown field "${unknownField}"`, {
6864
+ details: { field: unknownField }
6865
+ });
6866
+ }
6867
+ field("status", "string", true);
6868
+ field("actor", "string", true);
6869
+ field("reason", "string", true);
6870
+ field("externalReference", "string", false);
6871
+ field("confirmExpired", "boolean", false);
6872
+ return body;
6846
6873
  }
6847
6874
  var bodyDigests = /* @__PURE__ */ new WeakMap();
6848
6875
  function digestingStream(request) {
@@ -6858,13 +6885,10 @@ function digestingStream(request) {
6858
6885
  }
6859
6886
  });
6860
6887
  }
6861
- function ledgerHandler(key, list) {
6888
+ function operatorHandler(handle) {
6862
6889
  return async (request, reply) => {
6863
6890
  try {
6864
- const query = request.query;
6865
- const limit = parseLimit(query["limit"]);
6866
- const page = await list(limit !== void 0 ? { limit } : {}, query);
6867
- return { [key]: page };
6891
+ return await handle(request, reply);
6868
6892
  } catch (error) {
6869
6893
  const commerceError = toCommerceError(error);
6870
6894
  reply.status(commerceError.httpStatus).send(toErrorEnvelope(commerceError));
@@ -6872,6 +6896,14 @@ function ledgerHandler(key, list) {
6872
6896
  }
6873
6897
  };
6874
6898
  }
6899
+ function ledgerHandler(key, list) {
6900
+ return operatorHandler(async (request) => {
6901
+ const query = request.query;
6902
+ const limit = parseLimit(query["limit"]);
6903
+ const page = await list(limit !== void 0 ? { limit } : {}, query);
6904
+ return { [key]: page };
6905
+ });
6906
+ }
6875
6907
  async function handleInvoke(request, reply, options) {
6876
6908
  const resourceId = request.params.id;
6877
6909
  let paymentMethod;
@@ -7052,6 +7084,10 @@ function parseLimit(value) {
7052
7084
  }
7053
7085
  return n;
7054
7086
  }
7087
+ function parseText(value) {
7088
+ if (Array.isArray(value)) return parseText(value[0]);
7089
+ return typeof value === "string" && value !== "" ? value : void 0;
7090
+ }
7055
7091
  function parseFlag(value, field) {
7056
7092
  if (Array.isArray(value)) return parseFlag(value[0], field);
7057
7093
  if (value === void 0 || value === "false") return false;
@@ -7185,9 +7221,9 @@ async function runGateway(options = {}) {
7185
7221
  const { core: logger } = createGatewayLogger({ name: config.merchant.id });
7186
7222
  const paymentProviders = await createConfiguredPaymentProviders(config.payments, logger);
7187
7223
  const ap2 = config.authorization?.ap2;
7188
- const ap2Module = ap2?.enabled ? await importOptionalPeer("authorization.ap2", () => import('./ap2-QDHPRSTF.js')) : void 0;
7224
+ const ap2Module = ap2?.enabled ? await importOptionalPeer("authorization.ap2", () => import('./ap2-YAPLERSC.js')) : void 0;
7189
7225
  const mcp = config.protocols.mcp;
7190
- const mcpModule = mcp.enabled ? await importOptionalPeer("protocols.mcp", () => import('./mcp-26LJMN4N.js')) : void 0;
7226
+ const mcpModule = mcp.enabled ? await importOptionalPeer("protocols.mcp", () => import('./mcp-KZEMXLHR.js')) : void 0;
7191
7227
  const store = createSqliteReceiptStore({
7192
7228
  path: config.storage.receipts.path,
7193
7229
  logger
@@ -7318,5 +7354,5 @@ function printStartupError(error) {
7318
7354
  }
7319
7355
 
7320
7356
  export { printStartupError, runGateway };
7321
- //# sourceMappingURL=run-TEPYJUHG.js.map
7322
- //# sourceMappingURL=run-TEPYJUHG.js.map
7357
+ //# sourceMappingURL=run-ZTYPQI4D.js.map
7358
+ //# sourceMappingURL=run-ZTYPQI4D.js.map