@agent-cards/sdk 0.23.28 → 0.24.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 (97) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/PREFLIGHT.md +7 -1
  3. package/README.md +137 -99
  4. package/dist/aci.d.ts +52 -22
  5. package/dist/aci.js +79 -15
  6. package/dist/adyen-merchant-hosted.generated.d.ts +1 -1
  7. package/dist/adyen-merchant-hosted.generated.js +459 -21
  8. package/dist/agent-amount.generated.js +1 -1
  9. package/dist/agentcard.d.ts +4 -5
  10. package/dist/agentcard.js +4 -5
  11. package/dist/amadeus.d.ts +9 -3
  12. package/dist/amadeus.js +33 -4
  13. package/dist/api-module.d.ts +1 -7
  14. package/dist/api-module.js +3 -5
  15. package/dist/{voice-retry.js → api-retry.js} +1 -1
  16. package/dist/api-types.d.ts +53 -0
  17. package/dist/{voice-types.js → api-types.js} +7 -2
  18. package/dist/approvals.d.ts +166 -0
  19. package/dist/approvals.js +213 -0
  20. package/dist/buy.d.ts +20 -101
  21. package/dist/buy.js +19 -74
  22. package/dist/capabilities.generated.js +1 -1
  23. package/dist/card-fields.generated.js +1398 -106
  24. package/dist/cdp.d.ts +3 -13
  25. package/dist/cdp.js +231 -175
  26. package/dist/client.d.ts +104 -22
  27. package/dist/client.js +215 -40
  28. package/dist/creditguard.generated.d.ts +4 -4
  29. package/dist/datatrans.generated.js +22 -1
  30. package/dist/elavon-converge.generated.js +5 -3
  31. package/dist/hold.d.ts +8 -0
  32. package/dist/hold.js +43 -2
  33. package/dist/hosted-entry.js +2 -0
  34. package/dist/index.d.ts +9 -15
  35. package/dist/index.js +6 -10
  36. package/dist/lifecycle.d.ts +9 -61
  37. package/dist/lifecycle.js +24 -10
  38. package/dist/merchant-card-endpoints.generated.d.ts +6 -1
  39. package/dist/merchant-card-endpoints.generated.js +344 -19
  40. package/dist/merchant-hosted.d.ts +8 -1
  41. package/dist/nike-order.d.ts +51 -0
  42. package/dist/nike-order.js +81 -0
  43. package/dist/oceanpayment.d.ts +38 -0
  44. package/dist/oceanpayment.js +70 -0
  45. package/dist/paddle-tokenex.generated.js +105 -10
  46. package/dist/payplug.d.ts +41 -0
  47. package/dist/payplug.js +71 -0
  48. package/dist/payrails.generated.js +27 -7
  49. package/dist/pre-claim.d.ts +9 -0
  50. package/dist/pre-claim.js +86 -7
  51. package/dist/preflight-capabilities.generated.d.ts +0 -4
  52. package/dist/preflight-capabilities.generated.js +0 -5
  53. package/dist/preflight-catalog.json +46 -5
  54. package/dist/preflight-playwright.d.ts +2 -2
  55. package/dist/preflight-playwright.js +63 -14
  56. package/dist/preflight-schemas.json +4 -0
  57. package/dist/preflight.generated.d.ts +0 -4
  58. package/dist/preflight.generated.js +24 -1
  59. package/dist/prepared-processor.d.ts +18 -5
  60. package/dist/prepared-processor.js +48 -8
  61. package/dist/primer.generated.js +1418 -120
  62. package/dist/processout.generated.d.ts +61 -0
  63. package/dist/processout.generated.js +577 -0
  64. package/dist/requests.js +1 -1
  65. package/dist/shiji-sts.generated.js +105 -10
  66. package/dist/stripe-checkout.generated.js +1405 -234
  67. package/dist/substitutions.generated.js +460 -26
  68. package/dist/tap-payments.generated.js +105 -10
  69. package/dist/twoc2p.generated.js +105 -10
  70. package/dist/url-masks/bluesnap.d.ts +2 -0
  71. package/dist/url-masks/bluesnap.js +15 -0
  72. package/dist/url-masks/oceanpayment.d.ts +2 -0
  73. package/dist/url-masks/oceanpayment.js +13 -0
  74. package/dist/url-masks/payplug.d.ts +2 -0
  75. package/dist/url-masks/payplug.js +13 -0
  76. package/dist/url-masks/vtex_payments.d.ts +2 -0
  77. package/dist/url-masks/vtex_payments.js +12 -0
  78. package/dist/url-masks.generated.d.ts +1 -1
  79. package/dist/url-masks.generated.js +6 -2
  80. package/dist/verifone.generated.js +42 -2
  81. package/dist/vtex-payments.generated.d.ts +127 -0
  82. package/dist/vtex-payments.generated.js +544 -0
  83. package/dist/webhooks.d.ts +2 -2
  84. package/dist/webhooks.js +2 -2
  85. package/examples/preflight/kernel-native/inventory.json +1 -1
  86. package/package.json +6 -8
  87. package/dist/languages.d.ts +0 -23
  88. package/dist/languages.js +0 -76
  89. package/dist/voice-pkce.d.ts +0 -49
  90. package/dist/voice-pkce.js +0 -147
  91. package/dist/voice-stream.generated.d.ts +0 -118
  92. package/dist/voice-stream.generated.js +0 -170
  93. package/dist/voice-types.d.ts +0 -735
  94. package/dist/voice.d.ts +0 -373
  95. package/dist/voice.js +0 -815
  96. package/readme.test.mjs +0 -53
  97. /package/dist/{voice-retry.d.ts → api-retry.d.ts} +0 -0
@@ -1,6 +1,6 @@
1
1
  // @ts-nocheck
2
2
  // Generated from @agent-cards/payment-core. Do not edit.
3
- // artifact-sha256: e15beada28ae21bc7d0145bea84f12379a45a8815f0cbb1405a2a78b14b34e4f
3
+ // artifact-sha256: 86399b941b10d14455119f42141475bdcd524b5e55375ca1e2d3d82548076ecd
4
4
  // src/deep-freeze.js
5
5
  function deepFreeze(value) {
6
6
  if (value && typeof value === "object" && !Object.isFrozen(value)) {
@@ -16,9 +16,65 @@ function isPlainObject(v) {
16
16
  return !!v && typeof v === "object" && !Array.isArray(v);
17
17
  }
18
18
  var MAX_PATH_STEPS = 16;
19
+ var MAX_TEXT_STEPS = 2;
20
+ var TEXT_STEP = /* @__PURE__ */ Object.freeze({ text: "json" });
21
+ function isTextStep(step) {
22
+ return isPlainObject(step) && Object.keys(step).length === 1 && step.text === "json";
23
+ }
24
+ function sameStep(a, b) {
25
+ return a === b || isTextStep(a) && isTextStep(b);
26
+ }
27
+ function spellJson(parsed, form) {
28
+ const text = JSON.stringify(parsed);
29
+ if (form !== "php")
30
+ return text;
31
+ return text.replace(/\//g, "\\/").replace(/[\u0080-\uffff]/g, (unit) => `\\u${unit.charCodeAt(0).toString(16).padStart(4, "0")}`);
32
+ }
33
+ function jsonTextForm(value) {
34
+ if (typeof value !== "string" || !/^[[{]/.test(value))
35
+ return void 0;
36
+ let parsed;
37
+ try {
38
+ parsed = JSON.parse(value);
39
+ }
40
+ catch {
41
+ return void 0;
42
+ }
43
+ if (parsed === null || typeof parsed !== "object")
44
+ return void 0;
45
+ for (const form of ["js", "php"]) {
46
+ try {
47
+ if (spellJson(parsed, form) === value)
48
+ return { parsed, form };
49
+ }
50
+ catch {
51
+ return void 0;
52
+ }
53
+ }
54
+ return void 0;
55
+ }
56
+ function jsonText(value) {
57
+ return jsonTextForm(value)?.parsed;
58
+ }
19
59
  function isJsonPath(path) {
20
60
  return Array.isArray(path) && path.length <= MAX_PATH_STEPS && path.every((step) => typeof step === "string" ? step.length > 0 && !FORBIDDEN_KEYS.has(step) : Number.isSafeInteger(step) && step >= 0);
21
61
  }
62
+ function isProfilePath(path) {
63
+ if (!Array.isArray(path) || path.length > MAX_PATH_STEPS)
64
+ return false;
65
+ let texts = 0;
66
+ for (const [i, step] of path.entries()) {
67
+ if (isTextStep(step)) {
68
+ texts += 1;
69
+ if (i === 0 || i === path.length - 1 || isTextStep(path[i - 1]) || texts > MAX_TEXT_STEPS)
70
+ return false;
71
+ }
72
+ else if (!isJsonPath([step])) {
73
+ return false;
74
+ }
75
+ }
76
+ return true;
77
+ }
22
78
  function jsonAt(root, path) {
23
79
  let node = root;
24
80
  for (const step of path) {
@@ -33,6 +89,25 @@ function jsonAt(root, path) {
33
89
  }
34
90
  return { found: true, value: node };
35
91
  }
92
+ function profileAt(root, path) {
93
+ if (!isProfilePath(path))
94
+ return { found: false };
95
+ let node = root;
96
+ for (const step of path) {
97
+ if (isTextStep(step)) {
98
+ const inner = jsonText(node);
99
+ if (inner === void 0)
100
+ return { found: false };
101
+ node = inner;
102
+ continue;
103
+ }
104
+ const at = jsonAt(node, [step]);
105
+ if (!at.found)
106
+ return { found: false };
107
+ node = at.value;
108
+ }
109
+ return { found: true, value: node };
110
+ }
36
111
  function roundTrips(parsed, body) {
37
112
  try {
38
113
  return JSON.stringify(parsed) === body;
@@ -44,7 +119,7 @@ function roundTrips(parsed, body) {
44
119
  function pathsOverlap(a, b) {
45
120
  const n = Math.min(a.length, b.length);
46
121
  for (let i = 0; i < n; i += 1)
47
- if (a[i] !== b[i])
122
+ if (!sameStep(a[i], b[i]))
48
123
  return false;
49
124
  return true;
50
125
  }
@@ -56,7 +131,12 @@ function valuesIgnoringCase(root, path) {
56
131
  for (const step of path) {
57
132
  const next = [];
58
133
  for (const node of nodes) {
59
- if (typeof step === "number") {
134
+ if (isTextStep(step)) {
135
+ const inner = jsonText(node);
136
+ if (inner !== void 0)
137
+ next.push(inner);
138
+ }
139
+ else if (typeof step === "number") {
60
140
  if (Array.isArray(node) && Number.isSafeInteger(step) && step >= 0 && step < node.length)
61
141
  next.push(node[step]);
62
142
  }
@@ -71,7 +151,7 @@ function valuesIgnoringCase(root, path) {
71
151
  return nodes;
72
152
  }
73
153
  function describePath(path) {
74
- return path.length ? path.map((step) => typeof step === "number" ? `[${step}]` : `.${step}`).join("").replace(/^\./, "") : "(root)";
154
+ return path.length ? path.map((step) => typeof step === "number" ? `[${step}]` : isTextStep(step) ? "<json>" : `.${step}`).join("").replace(/^\./, "") : "(root)";
75
155
  }
76
156
  // src/url-template.js
77
157
  var PLACEHOLDER_VALUE = /^[A-Za-z0-9._~@+-]{1,256}$/;
@@ -316,6 +396,7 @@ function listRefusal(list, max, label, each, { optional = true, min = 0 } = {})
316
396
  return null;
317
397
  }
318
398
  var pathRefusal = (path, label) => isJsonPath(path) && path.length > 0 ? null : `${label} is not a JSON path of keys and indices`;
399
+ var bodyPathRefusal = (path, label) => isProfilePath(path) && path.length > 0 ? null : `${label} is not a JSON path of keys and indices`;
319
400
  function equalsRuleRefusal(rule, label, { root }) {
320
401
  const byPath = root && isPlainObject(rule) && has(rule, "equalsPath");
321
402
  if (byPath && has(rule, "equals"))
@@ -755,11 +836,11 @@ function merchantBodyAmountRefusal(profile) {
755
836
  if (amount === null)
756
837
  return null;
757
838
  if (Array.isArray(amount))
758
- return pathRefusal(amount, "the body amount");
839
+ return bodyPathRefusal(amount, "the body amount");
759
840
  const members = membersRefusal(amount, BODY_AMOUNT_MEMBERS, BODY_AMOUNT_MEMBERS, "the body amount");
760
841
  if (members)
761
842
  return members;
762
- const paths = pathRefusal(amount.value, "the body amount's value") ?? pathRefusal(amount.currency, "the body amount's currency");
843
+ const paths = bodyPathRefusal(amount.value, "the body amount's value") ?? bodyPathRefusal(amount.currency, "the body amount's currency");
763
844
  if (paths)
764
845
  return paths;
765
846
  if (pathsOverlap(amount.value, amount.currency))
@@ -780,16 +861,16 @@ function readMerchantBodyAmount(profile, body) {
780
861
  if (amount === null)
781
862
  return { kind: "unnamed" };
782
863
  if (Array.isArray(amount)) {
783
- const at = jsonAt(body, amount);
864
+ const at = profileAt(body, amount);
784
865
  if (!at.found)
785
866
  return { kind: "absent" };
786
867
  const named = adyenAmount(at.value);
787
868
  return named ? { kind: "amount", amountCents: named.minor, currency: named.currency } : { kind: "unreadable" };
788
869
  }
789
- const value = jsonAt(body, amount.value);
870
+ const value = profileAt(body, amount.value);
790
871
  if (!value.found)
791
872
  return { kind: "absent" };
792
- const currency = jsonAt(body, amount.currency);
873
+ const currency = profileAt(body, amount.currency);
793
874
  if (!currency.found || typeof currency.value !== "string" || !/^[A-Za-z]{3}$/.test(currency.value))
794
875
  return { kind: "unreadable" };
795
876
  const code = currency.value.toUpperCase();
@@ -1542,6 +1623,289 @@ var MERCHANT_HOSTED_PROFILES = /* @__PURE__ */ deepFreeze([
1542
1623
  facts: [{ path: ["sign_request", "raw_card_bin"], fact: "bin6" }],
1543
1624
  then: { method: "POST", path: "/cpp-paypage/v1/miles-plus-cash-authorise", query: {}, holder: [] },
1544
1625
  adyen: { environment: "live", clientKey: null, publicKeySha256: null }
1626
+ },
1627
+ {
1628
+ // Read Oct 23, 2026, from teenage.engineering's shipped code and a card-free observe run on its
1629
+ // US checkout (every non-GET aborted once the card form was reached, the placeholder typed into
1630
+ // adyen-web's secured fields, nothing pressed). The store runs on Centra. Its checkout posts the
1631
+ // order form to /_api/mw/selections/<selection>/payment2 with paymentInitiateOnly (no card), and
1632
+ // Centra answers with the Adyen Drop-in's own script (adyen-web 6.41.1, environment live, this
1633
+ // client key, holder name required, enableStoreDetails false). That script's onSubmit hands
1634
+ // adyen-web's state.data to the page as paymentMethodSpecificFields (centra_checkout_payment_callback),
1635
+ // and the page's finishAdyenPayment (assets/shop.*.js, cart-api.*.js) posts
1636
+ // {paymentMethod: 'adyen-drop-in', address: <billing address>, paymentMethodSpecificFields:
1637
+ // state.data, termsAndConditions: true, affiliate} to the same path through fetch, with no
1638
+ // content type of its own (text/plain;charset=UTF-8 on the wire, a JSON text). The body names no
1639
+ // amount: Centra charges the selection the path names, so the total comes from the selection's
1640
+ // own answers below. The Drop-in's stored-payment update flow adds contracts. Public key read
1641
+ // from checkoutshopper-live.adyen.com on 2026-10-23 (UTC). Not yet seen on the wire: the card
1642
+ // request itself, which leaves only on the Pay press, so a press run confirms the body.
1643
+ id: "teenage_engineering_centra_payment",
1644
+ merchant: "teenage engineering",
1645
+ status: "observe",
1646
+ origins: [{ checkout: "https://teenage.engineering", endpoint: "https://teenage.engineering" }],
1647
+ method: "POST",
1648
+ path: "/_api/mw/selections/:selectionId/payment2",
1649
+ query: {},
1650
+ requires: [{ path: ["paymentMethod"], equals: "adyen-drop-in" }],
1651
+ holder: ["paymentMethodSpecificFields", "paymentMethod"],
1652
+ fields: {
1653
+ encryptedCardNumber: "encryptedCardNumber",
1654
+ encryptedExpiryMonth: "encryptedExpiryMonth",
1655
+ encryptedExpiryYear: "encryptedExpiryYear",
1656
+ encryptedSecurityCode: "encryptedSecurityCode"
1657
+ },
1658
+ // adyen-web 6.x stamps the dummy's brand after its bin lookup answers.
1659
+ remove: ["brand"],
1660
+ refuse: [
1661
+ { path: ["paymentMethodSpecificFields", "storePaymentMethod"], when: "true" },
1662
+ { path: ["paymentMethodSpecificFields", "paymentMethod", "storedPaymentMethodId"], when: "present" },
1663
+ { path: ["paymentMethodSpecificFields", "paymentMethod", "recurringDetailReference"], when: "present" },
1664
+ // The order form's own post on the same path initiates the payment and carries no card.
1665
+ { path: ["paymentInitiateOnly"], when: "true" },
1666
+ // The Drop-in's stored-payment update flow names subscription contracts the card would pay later.
1667
+ { path: ["contracts"], when: "present" }
1668
+ ],
1669
+ amount: null,
1670
+ // Read Oct 23, 2026 (the observe run above). Every selection call answers the whole selection
1671
+ // as JSON: the read, the country and VAT changes, item quantities and the address step (which
1672
+ // wraps it in `selection`). totals.grandTotalPriceAsNumber is what the Drop-in tells its own
1673
+ // wallets to charge, in major units (2497.29 in the run), and currency names the currency. The
1674
+ // card request's URL carries the same selection id, which binds each answer to it. Voucher,
1675
+ // VAT-number and item-removal answers were not seen in the run, so they are not read: any of
1676
+ // those calls after the chosen answer makes it stale.
1677
+ amountSource: {
1678
+ id: "teenage_engineering_selection_totals",
1679
+ origin: "endpoint",
1680
+ format: "json",
1681
+ responses: [
1682
+ { method: "GET", path: "/_api/mw/selections/:selectionId", query: {} },
1683
+ { method: "PUT", path: "/_api/mw/selections/:selectionId", query: {} },
1684
+ { method: "PUT", path: "/_api/mw/selections/:selectionId/address", query: {}, at: ["selection"] },
1685
+ { method: "DELETE", path: "/_api/mw/selections/:selectionId/vat", query: {} },
1686
+ { method: "POST", path: "/_api/mw/selections/:selectionId/items/:itemId/quantity/:quantity", query: {} },
1687
+ { method: "DELETE", path: "/_api/mw/selections/:selectionId/items/:itemId/quantity/:quantity", query: {} }
1688
+ ],
1689
+ total: { path: ["totals", "grandTotalPriceAsNumber"], format: "number" },
1690
+ unit: "major",
1691
+ currency: "USD",
1692
+ currencyPath: ["currency"],
1693
+ bind: [{ placeholder: "selectionId", cardPlaceholder: "selectionId" }],
1694
+ voidedBy: [
1695
+ { method: "POST", path: "/_api/mw/selections/:selectionId/vouchers/:voucherCode", query: {} },
1696
+ { method: "DELETE", path: "/_api/mw/selections/:selectionId/vouchers", query: {} },
1697
+ { method: "POST", path: "/_api/mw/selections/:selectionId/vat/:vatNumber", query: {} },
1698
+ { method: "DELETE", path: "/_api/mw/selections/:selectionId/items/:itemId", query: {} }
1699
+ ],
1700
+ maxAgeMs: 9e5
1701
+ },
1702
+ adyen: {
1703
+ environment: "live",
1704
+ clientKey: "live_FAQ7CUZM7JAO7K6CGXI67KMZ64K35AVH",
1705
+ publicKeySha256: "b99a44120544b609c01ede6041c82b481d23423d7e956355022a5d7f362b5349"
1706
+ }
1707
+ },
1708
+ {
1709
+ // Read Oct 23, 2026, from www.scheels.com's shipped checkout chunk (a Next.js page on commercetools
1710
+ // Frontastic) and a card-free observe run on its guest checkout (every non-GET aborted once the card
1711
+ // form was reached, the placeholder typed into adyen-web 5.5.3's secured fields, Review Order pressed:
1712
+ // the address save before it was aborted too, so the card request was not reached). The Card
1713
+ // component's onSubmit (showPayButton false; the page submits it on Review Order) sets
1714
+ // state.data.paymentMethod.brand from onBrand, then calls the Frontastic action
1715
+ // /cart/setAdyenCreditCard with {payment: {paymentMethod: 'CREDIT_CARD', bin (onBinValue's six
1716
+ // digits, or onFieldValid's issuerBin), lastFour (onFieldValid's endDigits), deviceFingerprint (when
1717
+ // the page has one)}, state: JSON.stringify(state)}. The SDK posts JSON.stringify(payload) to
1718
+ // apihub.scheels.com/frontastic/action/cart/setAdyenCreditCard (its path joiner collapses the
1719
+ // action's leading '/') with content-type application/json and the Frontastic-Session header. So the
1720
+ // four JWEs sit in adyen-web's state, inside the `state` text. bin and lastFour describe the dummy:
1721
+ // the approved card's BIN6 and last four are written there. The body names no amount: the cart the
1722
+ // session holds is charged when Place Order sends cart/checkout, which carries no card. Public key
1723
+ // read from checkoutshopper-live-us.adyen.com on 2026-10-23 (UTC).
1724
+ id: "scheels_frontastic_adyen_card",
1725
+ merchant: "SCHEELS",
1726
+ status: "observe",
1727
+ origins: [{ checkout: "https://www.scheels.com", endpoint: "https://apihub.scheels.com" }],
1728
+ method: "POST",
1729
+ path: "/frontastic/action/cart/setAdyenCreditCard",
1730
+ query: {},
1731
+ requires: [{ path: ["payment", "paymentMethod"], equals: "CREDIT_CARD" }],
1732
+ holder: ["state", TEXT_STEP, "data", "paymentMethod"],
1733
+ fields: {
1734
+ encryptedCardNumber: "encryptedCardNumber",
1735
+ encryptedExpiryMonth: "encryptedExpiryMonth",
1736
+ encryptedExpiryYear: "encryptedExpiryYear",
1737
+ encryptedSecurityCode: "encryptedSecurityCode"
1738
+ },
1739
+ // The page copies onBrand's code (the dummy's) into the state before it is stringified.
1740
+ remove: ["brand"],
1741
+ refuse: [
1742
+ // enableStoreDetails is on for a signed-in shopper only.
1743
+ { path: ["state", TEXT_STEP, "data", "storePaymentMethod"], when: "true" },
1744
+ { path: ["state", TEXT_STEP, "data", "paymentMethod", "storedPaymentMethodId"], when: "present" },
1745
+ { path: ["state", TEXT_STEP, "data", "paymentMethod", "recurringDetailReference"], when: "present" }
1746
+ ],
1747
+ amount: null,
1748
+ // Read Oct 23, 2026 (the observe run above). Every cart action on the checkout page answers the
1749
+ // whole cart, camelCase JSON at the root (addToCart wraps it in `cart`); summary.amountDue is what
1750
+ // the payment step shows as "Amount due" and what is left for the card, in cents (6538 in the run,
1751
+ // the run's total). The cart is the session's, so an answer is tied to the card request by its
1752
+ // page. A gift card or another tender lowers the amount due below the order's gross total and is
1753
+ // refused until a HAR shows which one the charge follows.
1754
+ amountSource: {
1755
+ id: "scheels_cart_amount_due",
1756
+ origin: "endpoint",
1757
+ format: "json",
1758
+ responses: [
1759
+ { method: "POST", path: "/frontastic/action/cart/updateCart", query: {} },
1760
+ { method: "POST", path: "/frontastic/action/cart/setCheckoutDefaults", query: {} },
1761
+ { method: "POST", path: "/frontastic/action/cart/clean", query: {} },
1762
+ { method: "POST", path: "/frontastic/action/cart/addToCart", query: {}, at: ["cart"] },
1763
+ { method: "POST", path: "/frontastic/action/route/addRouteProtection", query: {} },
1764
+ { method: "POST", path: "/frontastic/action/route/removeRouteProtection", query: {} }
1765
+ ],
1766
+ total: { path: ["summary", "amountDue", "centAmount"], format: "number" },
1767
+ unit: "minor",
1768
+ currency: "USD",
1769
+ currencyPath: ["summary", "amountDue", "currencyCode"],
1770
+ bind: [{ samePage: true }],
1771
+ requires: [{ path: ["summary", "amountDue", "centAmount"], equalsPath: ["summary", "grossTotal", "centAmount"] }],
1772
+ refuse: [
1773
+ { path: ["summary", "giftCardTotal", "centAmount"], when: "nonzero" },
1774
+ { path: ["summary", "tenderTotal", "centAmount"], when: "nonzero" }
1775
+ ],
1776
+ // Cart changes whose answers were not seen in the run: any of them after the chosen answer makes it stale.
1777
+ voidedBy: [
1778
+ { method: "POST", path: "/frontastic/action/cart/redeemDiscountCode", query: {} },
1779
+ { method: "POST", path: "/frontastic/action/cart/removeDiscountCode", query: {} },
1780
+ { method: "POST", path: "/frontastic/action/cart/updateItem", query: {} },
1781
+ { method: "POST", path: "/frontastic/action/cart/removeItem", query: {} },
1782
+ { method: "POST", path: "/frontastic/action/cart/setShippingMethod", query: {} },
1783
+ { method: "POST", path: "/frontastic/action/sameDay/setTip", query: {} }
1784
+ ],
1785
+ maxAgeMs: 9e5
1786
+ },
1787
+ facts: [
1788
+ { path: ["payment", "bin"], fact: "bin6" },
1789
+ { path: ["payment", "lastFour"], fact: "last4" }
1790
+ ],
1791
+ adyen: {
1792
+ environment: "live-us",
1793
+ clientKey: "live_7NQ5GGRX7ZD3PJCWBGV6WELTMMA3GBOO",
1794
+ publicKeySha256: "9d6aa672c539f6e76c082beed1fcbe089af526b87c9ea6878ab3671355089065"
1795
+ }
1796
+ },
1797
+ {
1798
+ // Read Oct 23, 2026, from www.buff.com's shipped US checkout (Magento on Hyvä Checkout with
1799
+ // Magewire, Adyen's Hyvä module, adyen-web 5.5.3) and a card-free observe run on its guest checkout
1800
+ // (every non-GET aborted once the card form was reached, the placeholder typed into the secured
1801
+ // fields, nothing pressed). The card renderer keeps adyen-web's state.data from onChange and the
1802
+ // brand code onBrand maps (amex AE, visa VI, mc MC). Place Order calls the adyen_cc component's
1803
+ // placeOrder({stateData, ccType, publicHash: null, extension_attributes}) through Magewire, which
1804
+ // posts JSON.stringify({fingerprint, serverMemo, updates: [{type: 'callMethod', payload: {id,
1805
+ // method: 'placeOrder', params: [that object]}}]}) to
1806
+ // /us/magewire/post/livewire/message/checkout.payment.methods.adyen_cc with content-type
1807
+ // application/json and X-CSRF-TOKEN. The server charges the quote there. ccType describes the
1808
+ // dummy: the approved card's code is written there. The body's own serverMemo, which Magewire signs
1809
+ // with its checksum, carries the component's paymentResponse as JSON text, and its
1810
+ // paymentMethodsExtraDetails.scheme.configuration.amount is the quote's grand total in cents: it
1811
+ // followed the run's total from 8600 to 9342 once shipping and tax were set. A saved card sends a
1812
+ // publicHash and enableStoreDetails is off for a guest. Public key read from
1813
+ // checkoutshopper-live.adyen.com on 2026-10-23 (UTC). Not yet seen on the wire: the card request
1814
+ // itself, which leaves only on Place Order.
1815
+ id: "buff_magewire_adyen_cc",
1816
+ merchant: "Buff",
1817
+ status: "observe",
1818
+ origins: [{ checkout: "https://www.buff.com", endpoint: "https://www.buff.com" }],
1819
+ method: "POST",
1820
+ path: "/us/magewire/post/livewire/message/checkout.payment.methods.adyen_cc",
1821
+ query: {},
1822
+ requires: [
1823
+ { path: ["fingerprint", "name"], equals: "checkout.payment.methods.adyen_cc" },
1824
+ { path: ["updates", 0, "type"], equals: "callMethod" },
1825
+ { path: ["updates", 0, "payload", "method"], equals: "placeOrder" }
1826
+ ],
1827
+ holder: ["updates", 0, "payload", "params", 0, "stateData", "paymentMethod"],
1828
+ fields: {
1829
+ encryptedCardNumber: "encryptedCardNumber",
1830
+ encryptedExpiryMonth: "encryptedExpiryMonth",
1831
+ encryptedExpiryYear: "encryptedExpiryYear",
1832
+ encryptedSecurityCode: "encryptedSecurityCode"
1833
+ },
1834
+ // adyen-web 5.x stamps the dummy's brand into state.data.
1835
+ remove: ["brand"],
1836
+ refuse: [
1837
+ // One call per message: a second update or a second argument is not the reviewed request.
1838
+ { path: ["updates", 1], when: "present" },
1839
+ { path: ["updates", 0, "payload", "params", 1], when: "present" },
1840
+ // A saved card's public hash, or a card kept for later.
1841
+ { path: ["updates", 0, "payload", "params", 0, "publicHash"], when: "true" },
1842
+ { path: ["updates", 0, "payload", "params", 0, "stateData", "storePaymentMethod"], when: "true" },
1843
+ { path: ["updates", 0, "payload", "params", 0, "stateData", "paymentMethod", "storedPaymentMethodId"], when: "present" },
1844
+ { path: ["updates", 0, "payload", "params", 0, "stateData", "paymentMethod", "recurringDetailReference"], when: "present" }
1845
+ ],
1846
+ amount: ["serverMemo", "data", "paymentResponse", TEXT_STEP, "paymentMethodsExtraDetails", "scheme", "configuration", "amount"],
1847
+ facts: [
1848
+ // The renderer's own map (componentHandler.getCcCodeByAltCode); Buff's card list names these three.
1849
+ { path: ["updates", 0, "payload", "params", 0, "ccType"], fact: "brand", map: { visa: "VI", mastercard: "MC", amex: "AE" } }
1850
+ ],
1851
+ adyen: {
1852
+ environment: "live",
1853
+ clientKey: "live_5NIC7BWSNFDX3GBSKL5XCZ4B4YCIWLKP",
1854
+ publicKeySha256: "3f7e1740684cb4964aa8bb7185b9718564fc0957cfc83e096f7bf016d6a7d001"
1855
+ }
1856
+ },
1857
+ {
1858
+ // Read Oct 23, 2026, from www.plein.com's shipped US checkout (Salesforce Commerce Cloud SiteGenesis with Adyen's
1859
+ // int_adyen cartridge, adyen-web 4.9.0) and the press lane's stored copy of the card request the page sent with the
1860
+ // placeholder typed (aborted unsent by the checkout SDK's hold; values sanitized, field names and shape kept). The
1861
+ // card component's onSubmit writes JSON.stringify(state.data) into the hidden field dwfrm_adyPaydata_adyenStateData,
1862
+ // and CONTINUE TO PLACE ORDER submits the billing form: a top-level form post (application/x-www-form-urlencoded) to
1863
+ // /us/billing/. So the four JWEs sit in adyen-web's state, inside that field's JSON text, under paymentMethod
1864
+ // (adyen-web 4.9 writes no brand there; one a later version writes is dropped). Beside the state the page writes
1865
+ // onBrand's code into dwfrm_billing_paymentMethods_creditCard_type and twelve '*' with onFieldValid's last four into
1866
+ // dwfrm_billing_paymentMethods_creditCard_number, both describing the dummy: the approved card's are written there.
1867
+ // The form also carries its csrf_token and its submit button's name twice (dwfrm_billing_save); a repeated field
1868
+ // never reaches a rule. enableStoreDetails is on for a signed-in shopper only. The body names no amount, and the
1869
+ // page's total sits only in its analytics block (tc_vars.order_amount_ati_with_sf), which no reviewed rule reads,
1870
+ // so amountPending holds the profile in observe. Public key read from checkoutshopper-live-us.adyen.com on
1871
+ // 2026-10-23 (UTC).
1872
+ id: "plein_sfcc_billing_form",
1873
+ merchant: "Philipp Plein",
1874
+ status: "observe",
1875
+ origins: [{ checkout: "https://www.plein.com", endpoint: "https://www.plein.com" }],
1876
+ method: "POST",
1877
+ path: "/us/billing/",
1878
+ query: {},
1879
+ encoding: "form",
1880
+ requires: [
1881
+ { path: ["dwfrm_billing_paymentMethods_selectedPaymentMethodID"], equals: "AdyenComponent" },
1882
+ { path: ["brandCode"], equals: "scheme" }
1883
+ ],
1884
+ holder: ["dwfrm_adyPaydata_adyenStateData", TEXT_STEP, "paymentMethod"],
1885
+ fields: {
1886
+ encryptedCardNumber: "encryptedCardNumber",
1887
+ encryptedExpiryMonth: "encryptedExpiryMonth",
1888
+ encryptedExpiryYear: "encryptedExpiryYear",
1889
+ encryptedSecurityCode: "encryptedSecurityCode"
1890
+ },
1891
+ remove: ["brand"],
1892
+ refuse: [
1893
+ { path: ["dwfrm_adyPaydata_adyenStateData", TEXT_STEP, "storePaymentMethod"], when: "true" },
1894
+ { path: ["dwfrm_adyPaydata_adyenStateData", TEXT_STEP, "paymentMethod", "storedPaymentMethodId"], when: "present" },
1895
+ { path: ["dwfrm_adyPaydata_adyenStateData", TEXT_STEP, "paymentMethod", "recurringDetailReference"], when: "present" }
1896
+ ],
1897
+ amount: null,
1898
+ amountPending: "the page names its total only in its analytics block (tc_vars.order_amount_ati_with_sf), which no reviewed rule reads",
1899
+ facts: [
1900
+ // onBrand's adyen-web codes for the networks a US checkout takes.
1901
+ { path: ["dwfrm_billing_paymentMethods_creditCard_type"], fact: "brand", map: { visa: "visa", mastercard: "mc", amex: "amex", discover: "discover" } },
1902
+ { path: ["dwfrm_billing_paymentMethods_creditCard_number"], fact: "masked_last4" }
1903
+ ],
1904
+ adyen: {
1905
+ environment: "live-us",
1906
+ clientKey: "live_P7RRXHAHEVFTLPS3XUD3ML7ZWUEZ6BXN",
1907
+ publicKeySha256: "3e0d4366563b714feb233d12ce98adcef3b606381596e097ca3a8123b9a91d67"
1908
+ }
1545
1909
  }
1546
1910
  ]);
1547
1911
  function adyenKeyHost(environment) {
@@ -1617,23 +1981,80 @@ function declaredEndpointRefusal(endpoint) {
1617
1981
  return `${url.hostname} belongs to a merchant Agentcard reviewed, so it cannot be declared`;
1618
1982
  return null;
1619
1983
  }
1620
- function merchantBodyRefusal(profile, body) {
1621
- const p = merchantProfileRecognizerById(typeof profile === "string" ? profile : profile?.id);
1622
- if (!p)
1623
- throw new Error("Refusing to pay: unknown merchant profile.");
1984
+ function textRefusal(p, parsed) {
1985
+ const amount = p.amount;
1986
+ const amountPaths = Array.isArray(amount) ? [amount] : isPlainObject(amount) ? [amount.value, amount.currency] : [];
1987
+ const paths = [p.holder, ...p.requires.map((rule) => rule.path), ...p.refuse.map((rule) => rule.path), ...amountPaths].filter(Array.isArray);
1988
+ for (const path of paths) {
1989
+ for (const [k, step] of path.entries()) {
1990
+ if (!isTextStep(step))
1991
+ continue;
1992
+ const before = path.slice(0, k);
1993
+ if (valuesIgnoringCase(parsed, before).some((value) => valuesIgnoringCase(value, [TEXT_STEP]).length === 0)) {
1994
+ return `the paused body's ${describePath(before)} is not JSON text written the way JSON.stringify or PHP's json_encode writes it, so ${p.merchant}'s rules cannot read it`;
1995
+ }
1996
+ }
1997
+ }
1998
+ return null;
1999
+ }
2000
+ function formBodyView(body) {
2001
+ if (typeof body !== "string" || body === "")
2002
+ return void 0;
2003
+ let params;
2004
+ try {
2005
+ params = new URLSearchParams(body);
2006
+ }
2007
+ catch {
2008
+ return void 0;
2009
+ }
2010
+ if (params.toString() !== body)
2011
+ return void 0;
2012
+ const view = /* @__PURE__ */ Object.create(null);
2013
+ for (const [name, value] of params) {
2014
+ if (!Object.prototype.hasOwnProperty.call(view, name))
2015
+ view[name] = value;
2016
+ else
2017
+ view[name] = Array.isArray(view[name]) ? [...view[name], value] : [view[name], value];
2018
+ }
2019
+ return view;
2020
+ }
2021
+ function readProfileBody(p, body) {
2022
+ if (p.encoding === "form") {
2023
+ const view = formBodyView(body);
2024
+ return view === void 0 ? { refusal: "the paused body is not a form written the way a browser writes it, so its rules cannot be read" } : { parsed: view };
2025
+ }
1624
2026
  let parsed;
1625
2027
  try {
1626
2028
  parsed = typeof body === "string" ? JSON.parse(body) : void 0;
1627
2029
  }
1628
2030
  catch {
1629
- return "the paused body is not JSON";
2031
+ return { refusal: "the paused body is not JSON" };
1630
2032
  }
1631
2033
  if (!isPlainObject(parsed))
1632
- return "the paused body is not a JSON object";
2034
+ return { refusal: "the paused body is not a JSON object" };
1633
2035
  if (!roundTrips(parsed, body))
1634
- return "the paused body does not round-trip through JSON, so its rules cannot be read";
2036
+ return { refusal: "the paused body does not round-trip through JSON, so its rules cannot be read" };
2037
+ return { parsed };
2038
+ }
2039
+ function merchantProfileBody(profile, body) {
2040
+ const p = merchantProfileRecognizerById(typeof profile === "string" ? profile : profile?.id);
2041
+ if (!p)
2042
+ throw new Error("Refusing to pay: unknown merchant profile.");
2043
+ return readProfileBody(p, body).parsed;
2044
+ }
2045
+ function merchantBodyRefusal(profile, body) {
2046
+ const p = merchantProfileRecognizerById(typeof profile === "string" ? profile : profile?.id);
2047
+ if (!p)
2048
+ throw new Error("Refusing to pay: unknown merchant profile.");
2049
+ const read = readProfileBody(p, body);
2050
+ if (read.refusal)
2051
+ return read.refusal;
2052
+ const parsed = read.parsed;
2053
+ const unreadText = textRefusal(p, parsed);
2054
+ if (unreadText)
2055
+ return unreadText;
1635
2056
  for (const rule of p.requires) {
1636
- const at = jsonAt(parsed, rule.path);
2057
+ const at = profileAt(parsed, rule.path);
1637
2058
  if (!at.found || at.value !== rule.equals || valuesIgnoringCase(parsed, rule.path).some((value) => value !== rule.equals)) {
1638
2059
  return `the paused body is not ${p.merchant}'s card request: ${describePath(rule.path)} is not ${JSON.stringify(rule.equals)}`;
1639
2060
  }
@@ -1949,7 +2370,7 @@ var PASS = /* @__PURE__ */ Object.freeze({ verdict: "pass" });
1949
2370
  var PAUSE = /* @__PURE__ */ Object.freeze({ verdict: "pause" });
1950
2371
  var abort = (reason) => Object.freeze({ verdict: "abort", reason });
1951
2372
  function holderRefusal(profile, parsed) {
1952
- const holder = jsonAt(parsed, profile.holder);
2373
+ const holder = profileAt(parsed, profile.holder);
1953
2374
  if (!holder.found || !isPlainObject(holder.value)) {
1954
2375
  return `the paused body carries no card object where ${profile.merchant}'s card request holds it`;
1955
2376
  }
@@ -1967,6 +2388,8 @@ function holderRefusal(profile, parsed) {
1967
2388
  function amountRefusal(profile, parsed) {
1968
2389
  const priced = isPlainObject(profile.amountSource);
1969
2390
  if (profile.amount === null || profile.amount === void 0) {
2391
+ if (!priced && typeof profile.amountPending === "string" && profile.amountPending !== "")
2392
+ return null;
1970
2393
  return priced ? null : `${profile.merchant}'s card request names no amount, so it cannot be checked against the amount the cardholder approves`;
1971
2394
  }
1972
2395
  if (!Array.isArray(profile.amount)) {
@@ -1984,7 +2407,7 @@ function amountRefusal(profile, parsed) {
1984
2407
  }
1985
2408
  return `the amount where ${profile.merchant}'s card request holds it is not the amount Agentcard reviewed, so it cannot be checked`;
1986
2409
  }
1987
- const at = jsonAt(parsed, profile.amount);
2410
+ const at = profileAt(parsed, profile.amount);
1988
2411
  if (!at.found) {
1989
2412
  return priced ? null : `the paused body names no amount where ${profile.merchant}'s card request holds it, so it cannot be checked against the amount the cardholder approves`;
1990
2413
  }
@@ -2002,7 +2425,7 @@ function classifyMerchantBody(profileId, body) {
2002
2425
  const refusal = merchantBodyRefusal(profile.id, body);
2003
2426
  if (refusal)
2004
2427
  return abort(refusal);
2005
- const parsed = JSON.parse(body);
2428
+ const parsed = merchantProfileBody(profile.id, body);
2006
2429
  const card = holderRefusal(profile, parsed) ?? amountRefusal(profile, parsed);
2007
2430
  return card ? abort(card) : PAUSE;
2008
2431
  }
@@ -2098,7 +2521,22 @@ function merchantBodyKeyPathSha256(body) {
2098
2521
  parsed = JSON.parse(body);
2099
2522
  }
2100
2523
  catch {
2101
- return null;
2524
+ parsed = void 0;
2525
+ }
2526
+ if (parsed === void 0) {
2527
+ const view = formBodyView(body);
2528
+ if (view === void 0)
2529
+ return null;
2530
+ parsed = Object.fromEntries(Object.entries(view).map(([name, value]) => {
2531
+ if (typeof value !== "string" || !/^[[{]/.test(value))
2532
+ return [name, value];
2533
+ try {
2534
+ return [name, JSON.parse(value)];
2535
+ }
2536
+ catch {
2537
+ return [name, value];
2538
+ }
2539
+ }));
2102
2540
  }
2103
2541
  const paths = /* @__PURE__ */ new Set();
2104
2542
  keyPaths(parsed, paths);
@@ -1,3 +1,3 @@
1
1
  // Written by scripts/generate-agent-amount.mjs from agent-amount-processors.json. Do not edit; git ignores it.
2
2
  /** agent-amount-processors.json, sorted; client.ts reads its amount tables from it. */
3
- export const AGENT_AMOUNT = { "processors": ["amazon_payment_services", "barion", "clover", "comgate", "cybersource_secure_acceptance", "fastspring", "gmo_pg", "gopay", "hipay", "makecommerce", "midtrans", "moneris", "nexi_checkout", "omise", "openpay_bbva", "paddle_vgs", "pay_nl", "payfast", "paygent", "paymongo", "paypal", "payrexx", "paytrail", "payu_latam", "pelecard", "pin_payments", "poynt", "przelewy24", "revolut", "sb_payment_service", "sumup", "tap_payments", "toast", "tokenex_iframe", "transbank_webpay", "twoc2p", "wix_payments", "wspay"], "aboveZero": ["amazon_payment_services", "barion", "clover", "comgate", "fastspring", "gopay", "hipay", "makecommerce", "midtrans", "moneris", "nexi_checkout", "omise", "openpay_bbva", "pay_nl", "payfast", "paymongo", "paypal", "payrexx", "payu_latam", "pin_payments", "poynt", "przelewy24", "revolut", "sb_payment_service", "sumup", "tap_payments", "toast", "tokenex_iframe", "transbank_webpay", "twoc2p"], "pageAmount": ["pelecard", "sb_payment_service"], "names": { "amazon_payment_services": "Amazon Payment Services", "barion": "Barion", "clover": "Clover", "comgate": "ComGate", "cybersource_secure_acceptance": "CyberSource Secure Acceptance", "fastspring": "FastSpring", "gmo_pg": "GMO", "gopay": "GoPay", "hipay": "HiPay", "makecommerce": "MakeCommerce", "midtrans": "Midtrans", "moneris": "Moneris", "nexi_checkout": "Nexi Checkout", "omise": "Omise", "openpay_bbva": "Openpay", "paddle_vgs": "Paddle", "pay_nl": "Pay.", "payfast": "Payfast", "paygent": "Paygent", "paymongo": "PayMongo", "paypal": "PayPal", "payrexx": "Payrexx", "paytrail": "Paytrail", "payu_latam": "PayU Latam", "pelecard": "Pelecard", "pin_payments": "Pin Payments", "poynt": "GoDaddy Payments", "przelewy24": "Przelewy24", "revolut": "Revolut", "sb_payment_service": "SB Payment Service", "sumup": "SumUp", "tap_payments": "Tap", "toast": "Toast", "tokenex_iframe": "TokenEx", "transbank_webpay": "Webpay", "twoc2p": "2C2P", "wix_payments": "Wix", "wspay": "WSPay" } };
3
+ export const AGENT_AMOUNT = { "processors": ["amazon_payment_services", "barion", "bluesnap", "clover", "comgate", "cybersource_secure_acceptance", "fastspring", "gmo_pg", "gopay", "hipay", "iyzico", "makecommerce", "midtrans", "moneris", "nexi_checkout", "oceanpayment", "omise", "openpay_bbva", "paddle_vgs", "pay_nl", "payfast", "paygent", "paymentwall", "paymongo", "paypal", "payplug", "payrexx", "paytrail", "payu_latam", "pelecard", "pin_payments", "poynt", "processout", "przelewy24", "revolut", "sb_payment_service", "sumup", "tap_payments", "toast", "tokenex_iframe", "transbank_webpay", "twoc2p", "usaepay", "wix_payments", "wspay"], "aboveZero": ["amazon_payment_services", "barion", "bluesnap", "clover", "comgate", "fastspring", "gopay", "hipay", "iyzico", "makecommerce", "midtrans", "moneris", "nexi_checkout", "oceanpayment", "omise", "openpay_bbva", "pay_nl", "payfast", "paymentwall", "paymongo", "paypal", "payplug", "payrexx", "payu_latam", "pin_payments", "poynt", "processout", "przelewy24", "revolut", "sb_payment_service", "sumup", "tap_payments", "toast", "tokenex_iframe", "transbank_webpay", "twoc2p", "usaepay"], "pageAmount": ["pelecard", "sb_payment_service"], "names": { "amazon_payment_services": "Amazon Payment Services", "barion": "Barion", "bluesnap": "BlueSnap", "clover": "Clover", "comgate": "ComGate", "cybersource_secure_acceptance": "CyberSource Secure Acceptance", "fastspring": "FastSpring", "gmo_pg": "GMO", "gopay": "GoPay", "hipay": "HiPay", "iyzico": "iyzico", "makecommerce": "MakeCommerce", "midtrans": "Midtrans", "moneris": "Moneris", "nexi_checkout": "Nexi Checkout", "oceanpayment": "Oceanpayment", "omise": "Omise", "openpay_bbva": "Openpay", "paddle_vgs": "Paddle", "pay_nl": "Pay.", "payfast": "Payfast", "paygent": "Paygent", "paymentwall": "Paymentwall", "paymongo": "PayMongo", "paypal": "PayPal", "payplug": "PayPlug", "payrexx": "Payrexx", "paytrail": "Paytrail", "payu_latam": "PayU Latam", "pelecard": "Pelecard", "pin_payments": "Pin Payments", "poynt": "GoDaddy Payments", "processout": "ProcessOut", "przelewy24": "Przelewy24", "revolut": "Revolut", "sb_payment_service": "SB Payment Service", "sumup": "SumUp", "tap_payments": "Tap", "toast": "Toast", "tokenex_iframe": "TokenEx", "transbank_webpay": "Webpay", "twoc2p": "2C2P", "usaepay": "USAePay", "wix_payments": "Wix", "wspay": "WSPay" } };
@@ -1,10 +1,9 @@
1
1
  /**
2
- * The one client: `new Agentcard({ clientId, clientSecret, voice?, sandbox? })`,
2
+ * The one client: `new Agentcard({ clientId, clientSecret, sandbox? })`,
3
3
  * with two modules. `checkout` pauses a browser purchase or creates one
4
- * directly and replays the processor's answer; `voice` connects a person to
5
- * your product once and approves a purchase by voice. One pair of
6
- * credentials, one token, one base URL; sandbox and live are decided by the
7
- * credentials.
4
+ * directly and replays the processor's answer; `buy` asks the Purchase API
5
+ * for a cart and places it. One pair of credentials, one token, one base
6
+ * URL; sandbox and live are decided by the credentials.
8
7
  */
9
8
  import { VaultClient, type AuthorizeInput, type PrepareCheckoutInput, type PreparedCheckout, type ReplayResponse, type RuntimeCancelReason, type VaultClientOptions } from './client.js';
10
9
  import { type AttachOptions, type CdpLike } from './cdp.js';