@agent-cards/sdk 0.23.3 → 0.23.4

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/CHANGELOG.md CHANGED
@@ -10,6 +10,8 @@
10
10
 
11
11
  - Recognize Target Optical's card request as its checkout sends it today: a JSON `PUT` to `/wcs/resources/store/12001/cart/@self/addPayment` with the page's `nocache` query, the total in `piAmount` with five decimals (`"49.42000"`). The profile described the form post Target Optical's older checkout sent, which no request matches now, so the adapters let the dummy card reach Target Optical. The profile stays in observe: both adapters now pause that request and refuse it as `unsupported_checkout` before any authorization, let the saved-card body to the same URL through untouched, and abort the card save a signed-in shopper's page sends to `/wcs/resources/store/12001/mypayments` in every status. They also abort, in every status, a post to `/AjaxOrderChangeServicePIAddTO`, the form endpoint the older checkout used, which they refused before and which the storefront still declares in a script it serves, so moving the profile to the `PUT` leaves no path where the dummy card reaches Target Optical. `attachToPlaywright` routes a reviewed card endpoint's request by every method the profiles name; it asked only for `POST`, so a `PUT` card request or resend never reached its gates. A card endpoint create names the profile's own method in `request.method`; an API that reads every card endpoint request as a `POST` refuses a `PUT` create with `invalid_request`, so nothing is charged. TypeScript: `CardEndpointProfile.method` can be `PUT`.
12
12
 
13
+ - Pay Cinemark and Dick's Sporting Goods' own storefront, two reviewed Adyen merchants that take the card on their own server. Both profiles, `cinemark_initiate` and `dsg_paygate_v2`, ship `enabled`, and the API serves them `enabled` only to a client of a company Agentcard turned them on for. For every other client the adapters keep pausing and aborting their card requests as `merchant_profile_observed`, as before. A payment there needs a preparation for the profile and the cardholder's approval in the Vault, and Autopilot never pays one. The create carries the merchant's own checkout total as your agent's browser read it, and the API refuses a payment whose amount is not that total. Dick's paygate at Golf Galaxy, Public Lands and Going Going Gone moves to its own profile, `dsg_other_stores_paygate_v2`, which ships in `observe`, so the adapters abort those card requests as before. Matching API and Vault releases are required.
14
+
13
15
  - Stop the card fields adyen-web 5 encrypts at a reviewed Adyen merchant profile. adyen-web 5 seals each field as an RSA-OAEP / A256CBC-HS512 JWE, where adyen-web 6 writes RSA-OAEP-256 / A256GCM, and the SDK read only adyen-web 6's form. So the card requests of Cathay Pacific's payment page and Dunelm's legacy checkout, and Cathay's charge request after its signing step, reached the merchant with the agent's dummy card. The adapters now read both forms as a card. Both profiles ship in `observe`, so the adapters abort each of these requests before it leaves the browser and report it as `merchant_profile_observed`. The Vault writes only adyen-web 6's form, so the API refuses a create for a card request in adyen-web 5's form with `cse_template_unsupported`, and nothing is charged.
14
16
 
15
17
  - Abort the requests in which IHG's pay page sends the typed card outside its reviewed card request, in every status, as `card_endpoint_refused` with reason `card_resend`. The page posts the same booking to IHG's enrollment service while its pre-ticked "Enroll for free" box stays ticked, posts it on other paths for more than one room, a travel agent or Business Rewards, and at a hotel that asks for 3-D Secure first posts the number to two 3-D Secure calls. The SDK let each of these reach IHG with the agent's dummy card. A booking with the box unticked reaches IHG's reviewed card request, which the adapters refuse as before while IHG is in `observe`.
package/README.md CHANGED
@@ -255,7 +255,7 @@ Coverage is specific to the processor request format, merchant setup, browser tr
255
255
  | Mercado Pago | Card tokenization and prepared checkout are implemented. Guest Checkout Pro in Mexico also corrects the issuer for one native card association when the selected card has the same brand and type. One live MXN 40 Lotería Chida purchase with published SDK 0.10.0 completed automatically through Pay; the merchant confirmed paid status and PDF fulfillment. The historical SDK result remains unknown because the private receipt adapter rejected a relative download URL; a separate read with the corrected adapter confirms that same paid receipt. Independent processor capture/settlement and other country or integration paths remain unverified. |
256
256
  | VGS Collect (Very Good Security; Wolt) | not supported: VGS's proxy aliases only submissions from its own iframe, so a replay from the cardholder's device is refused by the merchant (verified on Wolt, 2026-09-03). Not recognized, so the agent's browser is not paused there |
257
257
  | PayPal Hosted Fields (the legacy card fields of PayPal's JS SDK; Planet Golf UK) | not supported: no Agentcard payment takes over the card these fields send to `cors.api.paypal.com`. The SDK fails that request for every company, so PayPal's payment confirm never receives the dummy card, and the controller reads `unsupported` with reason `unsupported_paypal_hosted_fields` and holds the attachment until you attach again; a PayPal wallet payment continues untouched |
258
- | Adyen | supported (mode `cse`): the vault encrypts the card for Adyen on the cardholder's device and your browser sends it. Sessions flow: the paused request is `/checkoutshopper/v1/sessions/{id}/payments` on Adyen's own hosts. A merchant that posts the encrypted fields to its own server pauses only when Agentcard reviewed it as a merchant profile (Dunelm and Cinemark so far); both profiles are in `observe`, so their card requests are reported and aborted and nothing pays there yet (see "Adyen merchants that take the card on their own server"). Without a preparation, approval starts at Pay and must land before Adyen Web's own request timeout (observed at 60 seconds on Adyen Web 6.41 and 6.44; not enforced by the SDK); `prepare({ psp: 'adyen' })` moves the approval before Pay |
258
+ | Adyen | supported (mode `cse`): the vault encrypts the card for Adyen on the cardholder's device and your browser sends it. Sessions flow: the paused request is `/checkoutshopper/v1/sessions/{id}/payments` on Adyen's own hosts. A merchant that posts the encrypted fields to its own server pauses only when Agentcard reviewed it as a merchant profile. Cinemark and Dick's Sporting Goods' own storefront take payments for a company Agentcard turned them on for; every other reviewed merchant is in `observe`, so its card requests are reported and aborted and nothing pays there yet (see "Adyen merchants that take the card on their own server"). Without a preparation, approval starts at Pay and must land before Adyen Web's own request timeout (observed at 60 seconds on Adyen Web 6.41 and 6.44; not enforced by the SDK); `prepare({ psp: 'adyen' })` moves the approval before Pay |
259
259
  | ACI Worldwide COPYandPAY (Halfords) | dark launch: served only after `syncRegistry()` and only for an org Agentcard enabled; prepared checkout only. The card-number request is replayed from the cardholder's device, the page's own CVC and expiry requests are answered locally, and `/payment` continues once. See [Pay an ACI COPYandPAY checkout](#pay-an-aci-copyandpay-checkout) |
260
260
  | Tranzila | supported (mode `hosted_form`): the cardholder finishes on Tranzila's own page; the paused form navigation resolves to a synthetic page, and you poll the merchant's order state |
261
261
  | Fiserv Commerce Hub | implemented (mode `cse`, prepared checkout only) and off until Agentcard turns it on for your company: the card frame's card capture on `connect.fiservapis.com` (or `connect-cert.fiservapis.com` in the sandbox), with the approved card encrypted on the cardholder's device under a key Agentcard reviewed for the merchant. A merchant whose frame posts to Fiserv's `payment-link` endpoint is not recognized. No live merchant purchase is verified yet |
@@ -1252,7 +1252,7 @@ Some Adyen merchants have adyen-web encrypt the card into four fields and post t
1252
1252
 
1253
1253
  - A request that carries no encrypted card (a basket query, a preflight) continues as before.
1254
1254
  - A body the browser did not hand over (a blob or a file, which neither adapter can read) is not proven card-free, so any request but a `GET`, `HEAD` or `OPTIONS` that carries one is treated as a card request the profile cannot finish. Playwright reports a missing body the same way, so an empty body is treated alike in both adapters.
1255
- - A profile in `observe` never pays. Its card request is aborted before it reaches the merchant, and the adapters report `merchant_profile_observed` with the profile, the templated URL, the verdict and `keyPathSha256`, the SHA-256 of the body's sorted key paths (never a value; `null` for a body that was not read), then `unsupported_checkout`. The controller reads `unsupported` with reason `merchant_profile_observe`, and no authorization exists. Both reviewed profiles, `dunelm_was_graphql` and `cinemark_initiate`, ship in `observe`.
1255
+ - A profile in `observe` never pays. Its card request is aborted before it reaches the merchant, and the adapters report `merchant_profile_observed` with the profile, the templated URL, the verdict and `keyPathSha256`, the SHA-256 of the body's sorted key paths (never a value; `null` for a body that was not read), then `unsupported_checkout`. The controller reads `unsupported` with reason `merchant_profile_observe`, and no authorization exists. `cinemark_initiate` and `dsg_paygate_v2` (Dick's Sporting Goods' own storefront) ship `enabled`, and the API serves them `enabled` only to a client of a company Agentcard turned them on for. Every other reviewed profile ships in `observe`, `dunelm_was_graphql` and `dsg_other_stores_paygate_v2` (Dick's paygate at Golf Galaxy, Public Lands and Going Going Gone) among them.
1256
1256
  - A card request the profile cannot finish (storing the card, a stored card, another operation, three fields instead of four, a sibling endpoint, an unreadable body) is aborted with `unsupported_checkout` and the reason, and reads `unsupported` with reason `merchant_request_unsupported`.
1257
1257
  - The profile's own card request, once Agentcard enables the profile for your client and this build, pays only through a preparation for that profile. Without one it is aborted before any pause, prompt or authorization: the adapters report `blocked` with `preparation_required`, the controller reads `failed` with that reason, and `prepare()` is refused on that attachment, as after any first card request. Create a new attachment and prepare before Pay.
1258
1258
 
@@ -1266,7 +1266,7 @@ After hand-off, a `5xx` final answer (after any redirect), a network failure, or
1266
1266
 
1267
1267
  #### Testing against your own Adyen TEST account
1268
1268
 
1269
- A test-mode client can run the same checkout against its own server and its own Adyen TEST account, before any reviewed profile is enabled. Declare your endpoint on the client, before any attach, as taking the card request of a profile this build reviewed:
1269
+ A test-mode client can run the same checkout against its own server and its own Adyen TEST account, whether or not Agentcard has enabled the reviewed profile. Declare your endpoint on the client, before any attach, as taking the card request of a profile this build reviewed:
1270
1270
 
1271
1271
  ```ts
1272
1272
  const vault = new VaultClient({ clientId, clientSecret, sandboxMerchants: [
@@ -1,6 +1,6 @@
1
1
  // @ts-nocheck
2
2
  // Generated from @agent-cards/payment-core. Do not edit.
3
- // artifact-sha256: c979802cf1a5aa95eedd5dd00949cd56c5c478ca3c637b3232b69597cc62d4a4
3
+ // artifact-sha256: 4790fdfc656acbda50ddf8471507933ddd4938f4c5b351ec096a9549a7c8c257
4
4
  // src/deep-freeze.js
5
5
  function deepFreeze(value) {
6
6
  if (value && typeof value === "object" && !Object.isFrozen(value)) {
@@ -1086,6 +1086,118 @@ function selectMerchantExchanges(profile, stageName, input) {
1086
1086
  return { ok: true, responses: newestMerchantExchanges(kept) };
1087
1087
  }
1088
1088
  // src/merchant-profiles.js
1089
+ var DSG_PAYGATE_V2 = /* @__PURE__ */ deepFreeze({
1090
+ method: "POST",
1091
+ path: "/prod/api/paygate/v2/authorization",
1092
+ query: {},
1093
+ // The page sends true for every checkout its translator read, the only checkouts
1094
+ // the amount source below maps; a legacy checkout is not this card request.
1095
+ requires: [{ path: ["isModernOrder"], equals: true }],
1096
+ holder: ["tenders", "encryptedCardTenders", 0],
1097
+ fields: {
1098
+ encryptedCardNumber: "cardNumber",
1099
+ encryptedExpiryMonth: "expirationMonth",
1100
+ encryptedExpiryYear: "expirationYear",
1101
+ encryptedSecurityCode: "cvv"
1102
+ },
1103
+ // cardType and vinBalue describe the dummy the agent typed: the facts below
1104
+ // write the approved card's instead, so nothing is removed.
1105
+ remove: [],
1106
+ refuse: [
1107
+ { path: ["tenders", "encryptedCardTenders", 0, "saveForLater"], when: "true" },
1108
+ // A saved card, or a second card tender the Vault never encrypted.
1109
+ { path: ["tenders", "savedCardTender"], when: "present" },
1110
+ { path: ["tenders", "encryptedCardTenders", 1], when: "present" },
1111
+ // A gift card pays part of the order, so the card pays less than the total.
1112
+ { path: ["tenders", "giftCardTenders"], when: "present" }
1113
+ ],
1114
+ amount: null,
1115
+ // Read Sep 25, 2026 (research amount_source/dickssportinggoods). Every checkout call
1116
+ // on the checkout page answers the whole checkout, camelCase on the wire: the page
1117
+ // load's PATCH (or the create), then every address, shipping, promotion, gift card,
1118
+ // tip and ScoreCard change. pricing.totalRemaining is what the card pays, a string
1119
+ // with exactly two decimals ("123.45"; the page itself drops the dot for minor
1120
+ // units). transactionReference is the checkout key, in the body and the URL. After
1121
+ // payment the order submit and the confirmation read return the placed checkout.
1122
+ amountSource: {
1123
+ id: "dsg_checkout_pricing",
1124
+ origin: "checkout",
1125
+ format: "json",
1126
+ responses: [
1127
+ { method: "PATCH", path: "/api/v1/checkouts/:checkoutKey", query: {} },
1128
+ { method: "POST", path: "/api/v1/checkouts", query: {} },
1129
+ { method: "POST", path: "/api/v1/checkouts/:checkoutKey/addresses", queries: [{}, { type: "billing" }, { type: "shipping" }] },
1130
+ { method: "PUT", path: "/api/v1/checkouts/:checkoutKey/shipping/selected/groups/:groupNumber/mode", query: {} },
1131
+ { method: "PUT", path: "/api/v2/checkouts/:checkoutKey/promotion/cart", query: {} },
1132
+ { method: "DELETE", path: "/api/v2/checkouts/:checkoutKey/promotion/cart", query: {} },
1133
+ { method: "POST", path: "/api/v1/checkouts/:checkoutKey/gift-cards", query: {} },
1134
+ { method: "DELETE", path: "/api/v1/checkouts/:checkoutKey/gift-cards/:giftCardIndex", query: {} },
1135
+ { method: "PUT", path: "/api/v1/checkouts/:checkoutKey/tip", query: {} },
1136
+ { method: "PUT", path: "/api/v1/checkouts/:checkoutKey/scorecard", query: {} },
1137
+ { method: "DELETE", path: "/api/v1/checkouts/:checkoutKey/scorecard", query: {} },
1138
+ { method: "DELETE", path: "/api/v1/checkouts/:checkoutKey/v2/gifts", query: {} }
1139
+ ],
1140
+ total: { path: ["pricing", "totalRemaining"], format: "decimal2" },
1141
+ unit: "major",
1142
+ currency: "USD",
1143
+ currencyPath: ["pricing", "currency"],
1144
+ bind: [
1145
+ { source: ["checkoutKey"], card: ["transactionReference"] },
1146
+ { placeholder: "checkoutKey", card: ["transactionReference"] }
1147
+ ],
1148
+ // The order total and the card's share are the same text. Anything that lowers the
1149
+ // share below the total (a gift card, ScoreCard rewards) or lands in only one of them
1150
+ // (a tip, a donation) is refused until a HAR shows which one the charge follows, so
1151
+ // the approved amount and the placed checkout's total read after payment agree.
1152
+ requires: [{ path: ["pricing", "total"], equalsPath: ["pricing", "totalRemaining"] }],
1153
+ refuse: [
1154
+ // A placed checkout is not the one being paid.
1155
+ { path: ["orderPlacedTime"], when: "true" },
1156
+ // Gift cards and a checkout with no address yet (tax not estimated) wait for a HAR.
1157
+ { path: ["payment", "giftCards"], when: "nonEmpty" },
1158
+ { path: ["addresses"], when: "empty" }
1159
+ ],
1160
+ maxAgeMs: 9e5,
1161
+ afterPayment: {
1162
+ origin: "checkout",
1163
+ format: "json",
1164
+ responses: [
1165
+ { method: "POST", path: "/api/v1/checkouts/:checkoutKey", query: {} },
1166
+ { method: "GET", path: "/api/v1/checkouts/submitted/:checkoutKey", query: {} }
1167
+ ],
1168
+ // The order total, which the requires rule above held equal to the card's share
1169
+ // before payment. totalRemaining is not read here: after placement it can drop to
1170
+ // what is still unpaid, which would hide a higher charge.
1171
+ total: { path: ["pricing", "total"], format: "decimal2" },
1172
+ unit: "major",
1173
+ currency: "USD",
1174
+ currencyPath: ["pricing", "currency"],
1175
+ bind: [
1176
+ { source: ["checkoutKey"], card: ["transactionReference"] },
1177
+ { placeholder: "checkoutKey", card: ["transactionReference"] }
1178
+ ],
1179
+ refuse: [{ path: ["orderPlacedTime"], when: "unset" }]
1180
+ }
1181
+ },
1182
+ facts: [
1183
+ // adyen-web's brand codes, the ones the page's supported list names; Dick's own
1184
+ // private-label (plcc, comc) cards have no Agentcard brand and are refused.
1185
+ {
1186
+ path: ["tenders", "encryptedCardTenders", 0, "cardType"],
1187
+ fact: "brand",
1188
+ map: { visa: "visa", mastercard: "mc", amex: "amex", discover: "discover", diners: "diners", jcb: "jcb" }
1189
+ },
1190
+ { path: ["tenders", "encryptedCardTenders", 0, "vinBalue"], fact: "bin6" }
1191
+ ],
1192
+ adyen: {
1193
+ environment: "live",
1194
+ clientKey: "live_YJLFKT47JJG2RI7QIYX6HTKKDEDOEGOH",
1195
+ publicKeySha256: "da33611149dff3ab715be8671c0550bb8aec6112983b2473db9ee7afb829c110"
1196
+ }
1197
+ });
1198
+ function dsgPaygateProfile(own) {
1199
+ return { ...own, ...DSG_PAYGATE_V2 };
1200
+ }
1089
1201
  var MERCHANT_HOSTED_PROFILES = /* @__PURE__ */ deepFreeze([
1090
1202
  {
1091
1203
  // Read Sep 23, 2026. assets.dunelm.com checkout-page bundle: submitPayment
@@ -1181,10 +1293,13 @@ var MERCHANT_HOSTED_PROFILES = /* @__PURE__ */ deepFreeze([
1181
1293
  // client key from the three securedFields iframes on
1182
1294
  // checkoutshopper-live-us.adyen.com (adyen-web 6.x). The request body itself
1183
1295
  // was not captured: the guest email gate stopped the run before Pay. Public
1184
- // key read from checkoutshopper-live-us.adyen.com on 2026-09-25 (UTC).
1296
+ // key read from checkoutshopper-live-us.adyen.com on 2026-09-25 (UTC). Enabled
1297
+ // Oct 7, 2026 under D1 (amountSource, above): live checks on Sep 30 and Oct 6
1298
+ // matched its key pin, its card request as the page's script builds it, and its
1299
+ // checkout total.
1185
1300
  id: "cinemark_initiate",
1186
1301
  merchant: "Cinemark",
1187
- status: "observe",
1302
+ status: "enabled",
1188
1303
  origins: [{ checkout: "https://www.cinemark.com", endpoint: "https://www.cinemark.com" }],
1189
1304
  method: "POST",
1190
1305
  path: "/api/adyen/initiatePayment",
@@ -1257,137 +1372,29 @@ var MERCHANT_HOSTED_PROFILES = /* @__PURE__ */ deepFreeze([
1257
1372
  publicKeySha256: "9dd5ef549c7454d60ca970ff76c8f4cac36d79f2961e59eca9116791e86cbcc5"
1258
1373
  }
1259
1374
  },
1260
- {
1261
- // Read Sep 23, 2026. payments.dickssportinggoods.com/library/dppjs/index-v2.js
1262
- // (adyen-web 6.39.0): Dd() builds tenders.encryptedCardTenders[0] from the Card
1263
- // component's four JWEs as cardNumber, expirationMonth, expirationYear and cvv,
1264
- // beside cardType (adyen-web's first detected brand), saveForLater (the save-card
1265
- // box) and vinBalue (the six digits onBinValue reports). The page posts it with
1266
- // transactionReference, customer.device and any giftCardTenders to
1267
- // <payments host>/prod/api/paygate/v2/authorization, the host picked from the
1268
- // page's own (Dick's, Golf Galaxy, Public Lands, Going Going Gone). The same slot
1269
- // carries Afterpay, CashApp and Affirm tenders with literal strings where the JWEs
1270
- // go, and a saved card goes to tenders.savedCardTender instead. The body names no
1271
- // amount: the paygate charges the cart it holds for transactionReference.
1272
- // mountCCForm names the client key and environment 'live'. Public key read from
1273
- // checkoutshopper-live.adyen.com on 2026-09-25 (UTC).
1375
+ /* @__PURE__ */ dsgPaygateProfile({
1376
+ // Dick's own storefront, the one live checks read on Sep 30 and Oct 6, 2026: its key
1377
+ // pin, its card request as the page's code builds it, its card facts and its checkout
1378
+ // pricing matched DSG_PAYGATE_V2. Enabled Oct 7, 2026 under D1 (amountSource, above).
1274
1379
  id: "dsg_paygate_v2",
1275
1380
  merchant: "Dick's Sporting Goods",
1381
+ status: "enabled",
1382
+ origins: [
1383
+ { checkout: "https://www.dickssportinggoods.com", endpoint: "https://payments.dickssportinggoods.com" }
1384
+ ]
1385
+ }),
1386
+ /* @__PURE__ */ dsgPaygateProfile({
1387
+ // The same paygate on the three other storefronts its page names. No live check has
1388
+ // read them, so their card requests stay paused and aborted in observe.
1389
+ id: "dsg_other_stores_paygate_v2",
1390
+ merchant: "Golf Galaxy, Public Lands and Going Going Gone",
1276
1391
  status: "observe",
1277
1392
  origins: [
1278
- { checkout: "https://www.dickssportinggoods.com", endpoint: "https://payments.dickssportinggoods.com" },
1279
1393
  { checkout: "https://www.golfgalaxy.com", endpoint: "https://payments.golfgalaxy.com" },
1280
1394
  { checkout: "https://www.publiclands.com", endpoint: "https://payments.publiclands.com" },
1281
1395
  { checkout: "https://www.goinggoinggone.com", endpoint: "https://payments.goinggoinggone.com" }
1282
- ],
1283
- method: "POST",
1284
- path: "/prod/api/paygate/v2/authorization",
1285
- query: {},
1286
- // The page sends true for every checkout its translator read, the only checkouts
1287
- // the amount source below maps; a legacy checkout is not this card request.
1288
- requires: [{ path: ["isModernOrder"], equals: true }],
1289
- holder: ["tenders", "encryptedCardTenders", 0],
1290
- fields: {
1291
- encryptedCardNumber: "cardNumber",
1292
- encryptedExpiryMonth: "expirationMonth",
1293
- encryptedExpiryYear: "expirationYear",
1294
- encryptedSecurityCode: "cvv"
1295
- },
1296
- // cardType and vinBalue describe the dummy the agent typed: the facts below
1297
- // write the approved card's instead, so nothing is removed.
1298
- remove: [],
1299
- refuse: [
1300
- { path: ["tenders", "encryptedCardTenders", 0, "saveForLater"], when: "true" },
1301
- // A saved card, or a second card tender the Vault never encrypted.
1302
- { path: ["tenders", "savedCardTender"], when: "present" },
1303
- { path: ["tenders", "encryptedCardTenders", 1], when: "present" },
1304
- // A gift card pays part of the order, so the card pays less than the total.
1305
- { path: ["tenders", "giftCardTenders"], when: "present" }
1306
- ],
1307
- amount: null,
1308
- // Read Sep 25, 2026 (research amount_source/dickssportinggoods). Every checkout call
1309
- // on the checkout page answers the whole checkout, camelCase on the wire: the page
1310
- // load's PATCH (or the create), then every address, shipping, promotion, gift card,
1311
- // tip and ScoreCard change. pricing.totalRemaining is what the card pays, a string
1312
- // with exactly two decimals ("123.45"; the page itself drops the dot for minor
1313
- // units). transactionReference is the checkout key, in the body and the URL. After
1314
- // payment the order submit and the confirmation read return the placed checkout.
1315
- amountSource: {
1316
- id: "dsg_checkout_pricing",
1317
- origin: "checkout",
1318
- format: "json",
1319
- responses: [
1320
- { method: "PATCH", path: "/api/v1/checkouts/:checkoutKey", query: {} },
1321
- { method: "POST", path: "/api/v1/checkouts", query: {} },
1322
- { method: "POST", path: "/api/v1/checkouts/:checkoutKey/addresses", queries: [{}, { type: "billing" }, { type: "shipping" }] },
1323
- { method: "PUT", path: "/api/v1/checkouts/:checkoutKey/shipping/selected/groups/:groupNumber/mode", query: {} },
1324
- { method: "PUT", path: "/api/v2/checkouts/:checkoutKey/promotion/cart", query: {} },
1325
- { method: "DELETE", path: "/api/v2/checkouts/:checkoutKey/promotion/cart", query: {} },
1326
- { method: "POST", path: "/api/v1/checkouts/:checkoutKey/gift-cards", query: {} },
1327
- { method: "DELETE", path: "/api/v1/checkouts/:checkoutKey/gift-cards/:giftCardIndex", query: {} },
1328
- { method: "PUT", path: "/api/v1/checkouts/:checkoutKey/tip", query: {} },
1329
- { method: "PUT", path: "/api/v1/checkouts/:checkoutKey/scorecard", query: {} },
1330
- { method: "DELETE", path: "/api/v1/checkouts/:checkoutKey/scorecard", query: {} },
1331
- { method: "DELETE", path: "/api/v1/checkouts/:checkoutKey/v2/gifts", query: {} }
1332
- ],
1333
- total: { path: ["pricing", "totalRemaining"], format: "decimal2" },
1334
- unit: "major",
1335
- currency: "USD",
1336
- currencyPath: ["pricing", "currency"],
1337
- bind: [
1338
- { source: ["checkoutKey"], card: ["transactionReference"] },
1339
- { placeholder: "checkoutKey", card: ["transactionReference"] }
1340
- ],
1341
- // The order total and the card's share are the same text. Anything that lowers the
1342
- // share below the total (a gift card, ScoreCard rewards) or lands in only one of them
1343
- // (a tip, a donation) is refused until a HAR shows which one the charge follows, so
1344
- // the approved amount and the placed checkout's total read after payment agree.
1345
- requires: [{ path: ["pricing", "total"], equalsPath: ["pricing", "totalRemaining"] }],
1346
- refuse: [
1347
- // A placed checkout is not the one being paid.
1348
- { path: ["orderPlacedTime"], when: "true" },
1349
- // Gift cards and a checkout with no address yet (tax not estimated) wait for a HAR.
1350
- { path: ["payment", "giftCards"], when: "nonEmpty" },
1351
- { path: ["addresses"], when: "empty" }
1352
- ],
1353
- maxAgeMs: 9e5,
1354
- afterPayment: {
1355
- origin: "checkout",
1356
- format: "json",
1357
- responses: [
1358
- { method: "POST", path: "/api/v1/checkouts/:checkoutKey", query: {} },
1359
- { method: "GET", path: "/api/v1/checkouts/submitted/:checkoutKey", query: {} }
1360
- ],
1361
- // The order total, which the requires rule above held equal to the card's share
1362
- // before payment. totalRemaining is not read here: after placement it can drop to
1363
- // what is still unpaid, which would hide a higher charge.
1364
- total: { path: ["pricing", "total"], format: "decimal2" },
1365
- unit: "major",
1366
- currency: "USD",
1367
- currencyPath: ["pricing", "currency"],
1368
- bind: [
1369
- { source: ["checkoutKey"], card: ["transactionReference"] },
1370
- { placeholder: "checkoutKey", card: ["transactionReference"] }
1371
- ],
1372
- refuse: [{ path: ["orderPlacedTime"], when: "unset" }]
1373
- }
1374
- },
1375
- facts: [
1376
- // adyen-web's brand codes, the ones the page's supported list names; Dick's own
1377
- // private-label (plcc, comc) cards have no Agentcard brand and are refused.
1378
- {
1379
- path: ["tenders", "encryptedCardTenders", 0, "cardType"],
1380
- fact: "brand",
1381
- map: { visa: "visa", mastercard: "mc", amex: "amex", discover: "discover", diners: "diners", jcb: "jcb" }
1382
- },
1383
- { path: ["tenders", "encryptedCardTenders", 0, "vinBalue"], fact: "bin6" }
1384
- ],
1385
- adyen: {
1386
- environment: "live",
1387
- clientKey: "live_YJLFKT47JJG2RI7QIYX6HTKKDEDOEGOH",
1388
- publicKeySha256: "da33611149dff3ab715be8671c0550bb8aec6112983b2473db9ee7afb829c110"
1389
- }
1390
- },
1396
+ ]
1397
+ }),
1391
1398
  {
1392
1399
  // Read Sep 25, 2026, from public code only: the WooCommerce plugin super-payments 1.40.1 and
1393
1400
  // cdn.superpayments.com/js/v2/payment.webcomponents.script.js as it stood on Sep 19.
@@ -17,7 +17,8 @@
17
17
  * the agent's dummy card never reaches the merchant and nothing is charged;
18
18
  * 'enabled' lets a prepared checkout pay it. The API can hold a profile in
19
19
  * 'observe' for a client but never enable it past this build: a profile is
20
- * 'enabled' only when both say so. Every profile ships in 'observe' today.
20
+ * 'enabled' only when both say so. Cinemark and Dick's own storefront ship
21
+ * 'enabled'; every other profile ships in 'observe'.
21
22
  */
22
23
  import { MERCHANT_PROFILE_RECOGNIZERS as SHARED_PROFILES, classifyDeclaredMerchantRequest as sharedClassifyDeclared, declaredTemplatedUrl as sharedDeclaredTemplatedUrl, declaredUrlGlobs as sharedDeclaredUrlGlobs, declaredUrlRelation as sharedDeclaredUrlRelation, declaredEndpointRefusal as sharedDeclaredEndpointRefusal, classifyMerchantRequest as sharedClassify, merchantBodyKeyPathSha256 as sharedKeyPathSha256, merchantProfileEnvironment as sharedEnvironment, merchantProfileRulesMatch as sharedRulesMatch, merchantProfileTemplatedUrl as sharedTemplatedUrl, merchantProfileUrlGlobs as sharedUrlGlobs, merchantProfileUrlRelation as sharedUrlRelation, sha256Hex as sharedSha256Hex, } from './adyen-merchant-hosted.generated.js';
23
24
  import { SubstitutionError, substituteMerchantHosted as sharedSubstitute } from './substitutions.generated.js';
@@ -12,7 +12,10 @@
12
12
  *
13
13
  * What this proves: the total is what the agent's browser session saw. It catches a
14
14
  * mistyped amount and a cart that changed under the agent; it cannot tell a merchant's
15
- * response from one the agent wrote, so every profile priced this way stays in observe.
15
+ * response from one the agent wrote. So a profile priced this way stays in observe unless
16
+ * Agentcard accepted that risk for it by name (Cinemark and Dick's own storefront, Oct 7,
17
+ * 2026), and then it pays only for the company Agentcard enables it for, and only after the
18
+ * cardholder approves each payment.
16
19
  *
17
20
  * What the SDK owes payment-core (the header of merchant-amount.js): every exchange of
18
21
  * the profile's shapes, projected, with the time it left; a wait for any such request
@@ -1,6 +1,6 @@
1
1
  // @ts-nocheck
2
2
  // Generated from @agent-cards/payment-core. Do not edit.
3
- // artifact-sha256: 6209fa4a22c349d03eed24ea4ff9e626334c5975ec515a4b7f6a83592343274f
3
+ // artifact-sha256: a1b7d280655947da8bb1d465d17c3436504ee350dd0be7f345d524eea0f2f374
4
4
  // src/adyen-jwe.js
5
5
  var ADYEN_JWE_HEADER = { alg: "RSA-OAEP-256", enc: "A256GCM", version: "1" };
6
6
  var BASE64URL = /^[A-Za-z0-9_-]+$/;
@@ -277,6 +277,118 @@ function merchantBodyAmountPaths(profile) {
277
277
  return isPlainObject(amount) ? [amount.value, amount.currency].filter(Array.isArray) : [];
278
278
  }
279
279
  // src/merchant-profiles.js
280
+ var DSG_PAYGATE_V2 = /* @__PURE__ */ deepFreeze({
281
+ method: "POST",
282
+ path: "/prod/api/paygate/v2/authorization",
283
+ query: {},
284
+ // The page sends true for every checkout its translator read, the only checkouts
285
+ // the amount source below maps; a legacy checkout is not this card request.
286
+ requires: [{ path: ["isModernOrder"], equals: true }],
287
+ holder: ["tenders", "encryptedCardTenders", 0],
288
+ fields: {
289
+ encryptedCardNumber: "cardNumber",
290
+ encryptedExpiryMonth: "expirationMonth",
291
+ encryptedExpiryYear: "expirationYear",
292
+ encryptedSecurityCode: "cvv"
293
+ },
294
+ // cardType and vinBalue describe the dummy the agent typed: the facts below
295
+ // write the approved card's instead, so nothing is removed.
296
+ remove: [],
297
+ refuse: [
298
+ { path: ["tenders", "encryptedCardTenders", 0, "saveForLater"], when: "true" },
299
+ // A saved card, or a second card tender the Vault never encrypted.
300
+ { path: ["tenders", "savedCardTender"], when: "present" },
301
+ { path: ["tenders", "encryptedCardTenders", 1], when: "present" },
302
+ // A gift card pays part of the order, so the card pays less than the total.
303
+ { path: ["tenders", "giftCardTenders"], when: "present" }
304
+ ],
305
+ amount: null,
306
+ // Read Sep 25, 2026 (research amount_source/dickssportinggoods). Every checkout call
307
+ // on the checkout page answers the whole checkout, camelCase on the wire: the page
308
+ // load's PATCH (or the create), then every address, shipping, promotion, gift card,
309
+ // tip and ScoreCard change. pricing.totalRemaining is what the card pays, a string
310
+ // with exactly two decimals ("123.45"; the page itself drops the dot for minor
311
+ // units). transactionReference is the checkout key, in the body and the URL. After
312
+ // payment the order submit and the confirmation read return the placed checkout.
313
+ amountSource: {
314
+ id: "dsg_checkout_pricing",
315
+ origin: "checkout",
316
+ format: "json",
317
+ responses: [
318
+ { method: "PATCH", path: "/api/v1/checkouts/:checkoutKey", query: {} },
319
+ { method: "POST", path: "/api/v1/checkouts", query: {} },
320
+ { method: "POST", path: "/api/v1/checkouts/:checkoutKey/addresses", queries: [{}, { type: "billing" }, { type: "shipping" }] },
321
+ { method: "PUT", path: "/api/v1/checkouts/:checkoutKey/shipping/selected/groups/:groupNumber/mode", query: {} },
322
+ { method: "PUT", path: "/api/v2/checkouts/:checkoutKey/promotion/cart", query: {} },
323
+ { method: "DELETE", path: "/api/v2/checkouts/:checkoutKey/promotion/cart", query: {} },
324
+ { method: "POST", path: "/api/v1/checkouts/:checkoutKey/gift-cards", query: {} },
325
+ { method: "DELETE", path: "/api/v1/checkouts/:checkoutKey/gift-cards/:giftCardIndex", query: {} },
326
+ { method: "PUT", path: "/api/v1/checkouts/:checkoutKey/tip", query: {} },
327
+ { method: "PUT", path: "/api/v1/checkouts/:checkoutKey/scorecard", query: {} },
328
+ { method: "DELETE", path: "/api/v1/checkouts/:checkoutKey/scorecard", query: {} },
329
+ { method: "DELETE", path: "/api/v1/checkouts/:checkoutKey/v2/gifts", query: {} }
330
+ ],
331
+ total: { path: ["pricing", "totalRemaining"], format: "decimal2" },
332
+ unit: "major",
333
+ currency: "USD",
334
+ currencyPath: ["pricing", "currency"],
335
+ bind: [
336
+ { source: ["checkoutKey"], card: ["transactionReference"] },
337
+ { placeholder: "checkoutKey", card: ["transactionReference"] }
338
+ ],
339
+ // The order total and the card's share are the same text. Anything that lowers the
340
+ // share below the total (a gift card, ScoreCard rewards) or lands in only one of them
341
+ // (a tip, a donation) is refused until a HAR shows which one the charge follows, so
342
+ // the approved amount and the placed checkout's total read after payment agree.
343
+ requires: [{ path: ["pricing", "total"], equalsPath: ["pricing", "totalRemaining"] }],
344
+ refuse: [
345
+ // A placed checkout is not the one being paid.
346
+ { path: ["orderPlacedTime"], when: "true" },
347
+ // Gift cards and a checkout with no address yet (tax not estimated) wait for a HAR.
348
+ { path: ["payment", "giftCards"], when: "nonEmpty" },
349
+ { path: ["addresses"], when: "empty" }
350
+ ],
351
+ maxAgeMs: 9e5,
352
+ afterPayment: {
353
+ origin: "checkout",
354
+ format: "json",
355
+ responses: [
356
+ { method: "POST", path: "/api/v1/checkouts/:checkoutKey", query: {} },
357
+ { method: "GET", path: "/api/v1/checkouts/submitted/:checkoutKey", query: {} }
358
+ ],
359
+ // The order total, which the requires rule above held equal to the card's share
360
+ // before payment. totalRemaining is not read here: after placement it can drop to
361
+ // what is still unpaid, which would hide a higher charge.
362
+ total: { path: ["pricing", "total"], format: "decimal2" },
363
+ unit: "major",
364
+ currency: "USD",
365
+ currencyPath: ["pricing", "currency"],
366
+ bind: [
367
+ { source: ["checkoutKey"], card: ["transactionReference"] },
368
+ { placeholder: "checkoutKey", card: ["transactionReference"] }
369
+ ],
370
+ refuse: [{ path: ["orderPlacedTime"], when: "unset" }]
371
+ }
372
+ },
373
+ facts: [
374
+ // adyen-web's brand codes, the ones the page's supported list names; Dick's own
375
+ // private-label (plcc, comc) cards have no Agentcard brand and are refused.
376
+ {
377
+ path: ["tenders", "encryptedCardTenders", 0, "cardType"],
378
+ fact: "brand",
379
+ map: { visa: "visa", mastercard: "mc", amex: "amex", discover: "discover", diners: "diners", jcb: "jcb" }
380
+ },
381
+ { path: ["tenders", "encryptedCardTenders", 0, "vinBalue"], fact: "bin6" }
382
+ ],
383
+ adyen: {
384
+ environment: "live",
385
+ clientKey: "live_YJLFKT47JJG2RI7QIYX6HTKKDEDOEGOH",
386
+ publicKeySha256: "da33611149dff3ab715be8671c0550bb8aec6112983b2473db9ee7afb829c110"
387
+ }
388
+ });
389
+ function dsgPaygateProfile(own) {
390
+ return { ...own, ...DSG_PAYGATE_V2 };
391
+ }
280
392
  var MERCHANT_HOSTED_PROFILES = /* @__PURE__ */ deepFreeze([
281
393
  {
282
394
  // Read Sep 23, 2026. assets.dunelm.com checkout-page bundle: submitPayment
@@ -372,10 +484,13 @@ var MERCHANT_HOSTED_PROFILES = /* @__PURE__ */ deepFreeze([
372
484
  // client key from the three securedFields iframes on
373
485
  // checkoutshopper-live-us.adyen.com (adyen-web 6.x). The request body itself
374
486
  // was not captured: the guest email gate stopped the run before Pay. Public
375
- // key read from checkoutshopper-live-us.adyen.com on 2026-09-25 (UTC).
487
+ // key read from checkoutshopper-live-us.adyen.com on 2026-09-25 (UTC). Enabled
488
+ // Oct 7, 2026 under D1 (amountSource, above): live checks on Sep 30 and Oct 6
489
+ // matched its key pin, its card request as the page's script builds it, and its
490
+ // checkout total.
376
491
  id: "cinemark_initiate",
377
492
  merchant: "Cinemark",
378
- status: "observe",
493
+ status: "enabled",
379
494
  origins: [{ checkout: "https://www.cinemark.com", endpoint: "https://www.cinemark.com" }],
380
495
  method: "POST",
381
496
  path: "/api/adyen/initiatePayment",
@@ -448,137 +563,29 @@ var MERCHANT_HOSTED_PROFILES = /* @__PURE__ */ deepFreeze([
448
563
  publicKeySha256: "9dd5ef549c7454d60ca970ff76c8f4cac36d79f2961e59eca9116791e86cbcc5"
449
564
  }
450
565
  },
451
- {
452
- // Read Sep 23, 2026. payments.dickssportinggoods.com/library/dppjs/index-v2.js
453
- // (adyen-web 6.39.0): Dd() builds tenders.encryptedCardTenders[0] from the Card
454
- // component's four JWEs as cardNumber, expirationMonth, expirationYear and cvv,
455
- // beside cardType (adyen-web's first detected brand), saveForLater (the save-card
456
- // box) and vinBalue (the six digits onBinValue reports). The page posts it with
457
- // transactionReference, customer.device and any giftCardTenders to
458
- // <payments host>/prod/api/paygate/v2/authorization, the host picked from the
459
- // page's own (Dick's, Golf Galaxy, Public Lands, Going Going Gone). The same slot
460
- // carries Afterpay, CashApp and Affirm tenders with literal strings where the JWEs
461
- // go, and a saved card goes to tenders.savedCardTender instead. The body names no
462
- // amount: the paygate charges the cart it holds for transactionReference.
463
- // mountCCForm names the client key and environment 'live'. Public key read from
464
- // checkoutshopper-live.adyen.com on 2026-09-25 (UTC).
566
+ /* @__PURE__ */ dsgPaygateProfile({
567
+ // Dick's own storefront, the one live checks read on Sep 30 and Oct 6, 2026: its key
568
+ // pin, its card request as the page's code builds it, its card facts and its checkout
569
+ // pricing matched DSG_PAYGATE_V2. Enabled Oct 7, 2026 under D1 (amountSource, above).
465
570
  id: "dsg_paygate_v2",
466
571
  merchant: "Dick's Sporting Goods",
572
+ status: "enabled",
573
+ origins: [
574
+ { checkout: "https://www.dickssportinggoods.com", endpoint: "https://payments.dickssportinggoods.com" }
575
+ ]
576
+ }),
577
+ /* @__PURE__ */ dsgPaygateProfile({
578
+ // The same paygate on the three other storefronts its page names. No live check has
579
+ // read them, so their card requests stay paused and aborted in observe.
580
+ id: "dsg_other_stores_paygate_v2",
581
+ merchant: "Golf Galaxy, Public Lands and Going Going Gone",
467
582
  status: "observe",
468
583
  origins: [
469
- { checkout: "https://www.dickssportinggoods.com", endpoint: "https://payments.dickssportinggoods.com" },
470
584
  { checkout: "https://www.golfgalaxy.com", endpoint: "https://payments.golfgalaxy.com" },
471
585
  { checkout: "https://www.publiclands.com", endpoint: "https://payments.publiclands.com" },
472
586
  { checkout: "https://www.goinggoinggone.com", endpoint: "https://payments.goinggoinggone.com" }
473
- ],
474
- method: "POST",
475
- path: "/prod/api/paygate/v2/authorization",
476
- query: {},
477
- // The page sends true for every checkout its translator read, the only checkouts
478
- // the amount source below maps; a legacy checkout is not this card request.
479
- requires: [{ path: ["isModernOrder"], equals: true }],
480
- holder: ["tenders", "encryptedCardTenders", 0],
481
- fields: {
482
- encryptedCardNumber: "cardNumber",
483
- encryptedExpiryMonth: "expirationMonth",
484
- encryptedExpiryYear: "expirationYear",
485
- encryptedSecurityCode: "cvv"
486
- },
487
- // cardType and vinBalue describe the dummy the agent typed: the facts below
488
- // write the approved card's instead, so nothing is removed.
489
- remove: [],
490
- refuse: [
491
- { path: ["tenders", "encryptedCardTenders", 0, "saveForLater"], when: "true" },
492
- // A saved card, or a second card tender the Vault never encrypted.
493
- { path: ["tenders", "savedCardTender"], when: "present" },
494
- { path: ["tenders", "encryptedCardTenders", 1], when: "present" },
495
- // A gift card pays part of the order, so the card pays less than the total.
496
- { path: ["tenders", "giftCardTenders"], when: "present" }
497
- ],
498
- amount: null,
499
- // Read Sep 25, 2026 (research amount_source/dickssportinggoods). Every checkout call
500
- // on the checkout page answers the whole checkout, camelCase on the wire: the page
501
- // load's PATCH (or the create), then every address, shipping, promotion, gift card,
502
- // tip and ScoreCard change. pricing.totalRemaining is what the card pays, a string
503
- // with exactly two decimals ("123.45"; the page itself drops the dot for minor
504
- // units). transactionReference is the checkout key, in the body and the URL. After
505
- // payment the order submit and the confirmation read return the placed checkout.
506
- amountSource: {
507
- id: "dsg_checkout_pricing",
508
- origin: "checkout",
509
- format: "json",
510
- responses: [
511
- { method: "PATCH", path: "/api/v1/checkouts/:checkoutKey", query: {} },
512
- { method: "POST", path: "/api/v1/checkouts", query: {} },
513
- { method: "POST", path: "/api/v1/checkouts/:checkoutKey/addresses", queries: [{}, { type: "billing" }, { type: "shipping" }] },
514
- { method: "PUT", path: "/api/v1/checkouts/:checkoutKey/shipping/selected/groups/:groupNumber/mode", query: {} },
515
- { method: "PUT", path: "/api/v2/checkouts/:checkoutKey/promotion/cart", query: {} },
516
- { method: "DELETE", path: "/api/v2/checkouts/:checkoutKey/promotion/cart", query: {} },
517
- { method: "POST", path: "/api/v1/checkouts/:checkoutKey/gift-cards", query: {} },
518
- { method: "DELETE", path: "/api/v1/checkouts/:checkoutKey/gift-cards/:giftCardIndex", query: {} },
519
- { method: "PUT", path: "/api/v1/checkouts/:checkoutKey/tip", query: {} },
520
- { method: "PUT", path: "/api/v1/checkouts/:checkoutKey/scorecard", query: {} },
521
- { method: "DELETE", path: "/api/v1/checkouts/:checkoutKey/scorecard", query: {} },
522
- { method: "DELETE", path: "/api/v1/checkouts/:checkoutKey/v2/gifts", query: {} }
523
- ],
524
- total: { path: ["pricing", "totalRemaining"], format: "decimal2" },
525
- unit: "major",
526
- currency: "USD",
527
- currencyPath: ["pricing", "currency"],
528
- bind: [
529
- { source: ["checkoutKey"], card: ["transactionReference"] },
530
- { placeholder: "checkoutKey", card: ["transactionReference"] }
531
- ],
532
- // The order total and the card's share are the same text. Anything that lowers the
533
- // share below the total (a gift card, ScoreCard rewards) or lands in only one of them
534
- // (a tip, a donation) is refused until a HAR shows which one the charge follows, so
535
- // the approved amount and the placed checkout's total read after payment agree.
536
- requires: [{ path: ["pricing", "total"], equalsPath: ["pricing", "totalRemaining"] }],
537
- refuse: [
538
- // A placed checkout is not the one being paid.
539
- { path: ["orderPlacedTime"], when: "true" },
540
- // Gift cards and a checkout with no address yet (tax not estimated) wait for a HAR.
541
- { path: ["payment", "giftCards"], when: "nonEmpty" },
542
- { path: ["addresses"], when: "empty" }
543
- ],
544
- maxAgeMs: 9e5,
545
- afterPayment: {
546
- origin: "checkout",
547
- format: "json",
548
- responses: [
549
- { method: "POST", path: "/api/v1/checkouts/:checkoutKey", query: {} },
550
- { method: "GET", path: "/api/v1/checkouts/submitted/:checkoutKey", query: {} }
551
- ],
552
- // The order total, which the requires rule above held equal to the card's share
553
- // before payment. totalRemaining is not read here: after placement it can drop to
554
- // what is still unpaid, which would hide a higher charge.
555
- total: { path: ["pricing", "total"], format: "decimal2" },
556
- unit: "major",
557
- currency: "USD",
558
- currencyPath: ["pricing", "currency"],
559
- bind: [
560
- { source: ["checkoutKey"], card: ["transactionReference"] },
561
- { placeholder: "checkoutKey", card: ["transactionReference"] }
562
- ],
563
- refuse: [{ path: ["orderPlacedTime"], when: "unset" }]
564
- }
565
- },
566
- facts: [
567
- // adyen-web's brand codes, the ones the page's supported list names; Dick's own
568
- // private-label (plcc, comc) cards have no Agentcard brand and are refused.
569
- {
570
- path: ["tenders", "encryptedCardTenders", 0, "cardType"],
571
- fact: "brand",
572
- map: { visa: "visa", mastercard: "mc", amex: "amex", discover: "discover", diners: "diners", jcb: "jcb" }
573
- },
574
- { path: ["tenders", "encryptedCardTenders", 0, "vinBalue"], fact: "bin6" }
575
- ],
576
- adyen: {
577
- environment: "live",
578
- clientKey: "live_YJLFKT47JJG2RI7QIYX6HTKKDEDOEGOH",
579
- publicKeySha256: "da33611149dff3ab715be8671c0550bb8aec6112983b2473db9ee7afb829c110"
580
- }
581
- },
587
+ ]
588
+ }),
582
589
  {
583
590
  // Read Sep 25, 2026, from public code only: the WooCommerce plugin super-payments 1.40.1 and
584
591
  // cdn.superpayments.com/js/v2/payment.webcomponents.script.js as it stood on Sep 19.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-cards/sdk",
3
- "version": "0.23.3",
3
+ "version": "0.23.4",
4
4
  "description": "Agentcard's SDK: one client, Agentcard, with two modules. checkout pauses a browser purchase and pays it with the person's own card; voice connects a person to your product once and approves a purchase by voice inside it. Card data never enters your process.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",