@agent-cards/sdk 0.21.0 → 0.23.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 (113) hide show
  1. package/CHANGELOG.md +87 -2
  2. package/PREFLIGHT.md +32 -0
  3. package/README.md +1177 -23
  4. package/dist/aci.d.ts +173 -0
  5. package/dist/aci.generated.d.ts +87 -0
  6. package/dist/aci.generated.js +306 -0
  7. package/dist/aci.js +371 -0
  8. package/dist/adyen-merchant-hosted.generated.d.ts +3 -3
  9. package/dist/adyen-merchant-hosted.generated.js +302 -56
  10. package/dist/agentcard.d.ts +9 -2
  11. package/dist/agentcard.js +4 -2
  12. package/dist/amadeus-checkout.generated.d.ts +57 -0
  13. package/dist/amadeus-checkout.generated.js +549 -0
  14. package/dist/amadeus.d.ts +41 -0
  15. package/dist/amadeus.js +81 -0
  16. package/dist/builtin-registry.generated.js +1 -1
  17. package/dist/card-endpoint-facts.d.ts +96 -0
  18. package/dist/card-endpoint-facts.js +275 -0
  19. package/dist/card-endpoint-page.d.ts +54 -0
  20. package/dist/card-endpoint-page.js +69 -0
  21. package/dist/card-endpoint.d.ts +298 -0
  22. package/dist/card-endpoint.js +438 -0
  23. package/dist/card-fields.generated.d.ts +5 -3
  24. package/dist/card-fields.generated.js +284 -7
  25. package/dist/cdp.d.ts +5 -1
  26. package/dist/cdp.js +1155 -141
  27. package/dist/client.d.ts +456 -20
  28. package/dist/client.js +1072 -104
  29. package/dist/creditguard.generated.d.ts +79 -0
  30. package/dist/creditguard.generated.js +662 -0
  31. package/dist/cse-body.js +11 -1
  32. package/dist/cybersource-flex.d.ts +30 -0
  33. package/dist/cybersource-flex.generated.d.ts +27 -1
  34. package/dist/cybersource-flex.generated.js +42 -2
  35. package/dist/cybersource-flex.js +46 -0
  36. package/dist/datatrans.d.ts +96 -0
  37. package/dist/datatrans.generated.d.ts +64 -0
  38. package/dist/datatrans.generated.js +426 -0
  39. package/dist/datatrans.js +178 -0
  40. package/dist/ekashu.d.ts +35 -0
  41. package/dist/ekashu.js +55 -0
  42. package/dist/elavon-converge.d.ts +37 -0
  43. package/dist/elavon-converge.generated.d.ts +49 -0
  44. package/dist/elavon-converge.generated.js +439 -0
  45. package/dist/elavon-converge.js +84 -0
  46. package/dist/eprotect.d.ts +152 -0
  47. package/dist/eprotect.generated.d.ts +77 -0
  48. package/dist/eprotect.generated.js +498 -0
  49. package/dist/eprotect.js +222 -0
  50. package/dist/hosted-form.d.ts +3 -2
  51. package/dist/hosted-form.js +3 -2
  52. package/dist/index.d.ts +17 -3
  53. package/dist/index.js +6 -1
  54. package/dist/juspay-gate.d.ts +82 -0
  55. package/dist/juspay-gate.js +126 -0
  56. package/dist/juspay.generated.d.ts +89 -0
  57. package/dist/juspay.generated.js +705 -0
  58. package/dist/lifecycle.d.ts +60 -6
  59. package/dist/lifecycle.js +122 -8
  60. package/dist/merchant-card-endpoints.generated.d.ts +122 -0
  61. package/dist/merchant-card-endpoints.generated.js +4261 -0
  62. package/dist/merchant-hosted.d.ts +4 -1
  63. package/dist/merchant-hosted.js +5 -2
  64. package/dist/merchant-session-probe.d.ts +48 -0
  65. package/dist/merchant-session-probe.js +53 -0
  66. package/dist/merchant-session.generated.d.ts +69 -0
  67. package/dist/merchant-session.generated.js +919 -0
  68. package/dist/payrails.d.ts +133 -0
  69. package/dist/payrails.generated.d.ts +73 -0
  70. package/dist/payrails.generated.js +596 -0
  71. package/dist/payrails.js +305 -0
  72. package/dist/pelecard.d.ts +32 -0
  73. package/dist/pelecard.generated.d.ts +32 -0
  74. package/dist/pelecard.generated.js +283 -0
  75. package/dist/pelecard.js +42 -0
  76. package/dist/pre-claim.d.ts +81 -2
  77. package/dist/pre-claim.js +1023 -5
  78. package/dist/preflight-catalog.json +2267 -288
  79. package/dist/preflight-schemas.json +183 -6
  80. package/dist/preflight.generated.d.ts +1 -1
  81. package/dist/preflight.generated.js +243 -4
  82. package/dist/preparation.d.ts +12 -3
  83. package/dist/preparation.js +63 -12
  84. package/dist/prepared-processor.d.ts +84 -5
  85. package/dist/prepared-processor.js +147 -6
  86. package/dist/primer.d.ts +53 -0
  87. package/dist/primer.generated.d.ts +38 -0
  88. package/dist/primer.generated.js +624 -0
  89. package/dist/primer.js +82 -0
  90. package/dist/registry.d.ts +100 -8
  91. package/dist/registry.js +85 -11
  92. package/dist/shiji-sts.d.ts +144 -0
  93. package/dist/shiji-sts.generated.d.ts +72 -0
  94. package/dist/shiji-sts.generated.js +913 -0
  95. package/dist/shiji-sts.js +222 -0
  96. package/dist/stripe-checkout.generated.d.ts +1 -1
  97. package/dist/stripe-checkout.generated.js +764 -9
  98. package/dist/stripe-setup.d.ts +16 -0
  99. package/dist/stripe-setup.js +61 -0
  100. package/dist/substitutions.generated.js +187 -29
  101. package/dist/verifone.d.ts +68 -0
  102. package/dist/verifone.generated.d.ts +51 -0
  103. package/dist/verifone.generated.js +1413 -0
  104. package/dist/verifone.js +119 -0
  105. package/dist/voice-types.d.ts +27 -0
  106. package/dist/voice.d.ts +6 -1
  107. package/dist/voice.js +6 -1
  108. package/dist/wspay.d.ts +41 -0
  109. package/dist/wspay.generated.d.ts +41 -0
  110. package/dist/wspay.generated.js +370 -0
  111. package/dist/wspay.js +65 -0
  112. package/examples/preflight/kernel-native/inventory.json +1 -1
  113. package/package.json +3 -3
package/dist/aci.js ADDED
@@ -0,0 +1,371 @@
1
+ // ACI Worldwide COPYandPAY: the adapters' side of a split card.
2
+ //
3
+ // ACI's payment widget never sends a card in one request. Each of its PCI iframes posts only the
4
+ // field it holds to POST https://<host>/v1/checkouts/<id> (the card number, the CVC and, in the
5
+ // merchant's SAQ-A mode, the expiry and the holder), and once every one of those answered, the
6
+ // merchant page's own form posts /v1/checkouts/<id>/payment from a hidden iframe. The rules that
7
+ // judge each request (the leg classifier, the /payment continuation judge, the answer allow-list)
8
+ // live in payment-core and reach this SDK as aci.generated.ts. This module holds what one
9
+ // attachment decides from them:
10
+ // - the card-number request is the card request: the adapters pause it, the cardholder's device
11
+ // replays it with the real number, CVC and expiry, and the page gets ACI's rebuilt answer;
12
+ // - the page's own CVC and expiry requests carry the agent's placeholder values: they are held
13
+ // and answered with the card-number request's answer once it lands, never forwarded, and
14
+ // failed when it does not (or when no card-number request for their checkout ever begins);
15
+ // - the holder request carries nothing secret and continues;
16
+ // - a second card-number request on a checkout whose first one is running or was answered here
17
+ // is refused: that answer put the real card on the checkout and may already have let /payment
18
+ // through, and ACI warns that one checkout id reused can carry a second transaction;
19
+ // - the /payment submission continues only after its checkout's card-number request was
20
+ // answered, once, with the placeholder expiry a classic-mode page puts there removed, the
21
+ // brand held to the card number that request carried, and the return kept on the merchant.
22
+ // It continues only as a frame navigation, which is how the widget's form posts it into its
23
+ // hidden iframe, and a classic-mode body only on a browser shown to send the body the SDK
24
+ // replaced on a navigation (Chromium; see playwrightReplacesNavigationBody).
25
+ import { aciBrandOfCardLeg as brandOfCardLeg, aciEndpoint, classifyAciRequest, prepareAciContinuation, sanitizeAciResponse, } from './aci.generated.js';
26
+ const classifyLeg = classifyAciRequest;
27
+ const judgePayment = prepareAciContinuation;
28
+ /** The processor id, as the registry and the API name it. */
29
+ export const ACI_PSP = 'aci';
30
+ /** The dark-launch capability the API serves the ACI recognizer behind (payment-core definitions.js). */
31
+ export const ACI_CAPABILITY = 'aci_split_card.v1';
32
+ /**
33
+ * How long a sibling leg (the page's CVC or expiry request) waits for its checkout's card-number
34
+ * request to begin an approval. The widget fires every leg on one Pay click, milliseconds apart,
35
+ * so a sibling that still has no card-number request after this is one this SDK will never answer
36
+ * (a one-click stored-card CVC form, or a card-number request refused before it paused).
37
+ */
38
+ export const ACI_SIBLING_WAIT_MS = 5_000;
39
+ /** The /payment submission of a checkout whose card-number request was never answered here. */
40
+ export const ACI_PAYMENT_UNAPPROVED = 'aci_payment_unapproved';
41
+ /** A second /payment submission on a checkout that already continued one. */
42
+ export const ACI_PAYMENT_REPEATED = 'aci_payment_repeated';
43
+ /** A card-number request on a checkout whose card-number request is running or was answered here. */
44
+ export const ACI_CHECKOUT_REUSED = 'aci_checkout_reused';
45
+ /**
46
+ * How many failed checkouts one attachment keeps. A failed checkout only makes its later CVC and
47
+ * expiry requests fail at once instead of after ACI_SIBLING_WAIT_MS, so the oldest are dropped past
48
+ * this; a running or answered checkout is never dropped, since it is what refuses a second
49
+ * card-number request or /payment on that checkout.
50
+ */
51
+ export const ACI_FAILED_CHECKOUTS_KEPT = 16;
52
+ /**
53
+ * ACI's paymentBrand for the card number a card-number request carried, or null. That number is
54
+ * the agent's placeholder, typed in the approved card's network (a Mastercard-range placeholder for
55
+ * an Agentcard-issued card), and ACI's widget names the brand of the /payment submission from the
56
+ * same digits. The SDK is never told the approved card's own network: the widget's brand for the
57
+ * approved request is the one /payment may carry. The cardholder's device judges the placeholder
58
+ * with this same payment-core rule and refuses to send a card of another brand, which ACI would
59
+ * otherwise hold on the checkout before refusing /payment (100.100.700).
60
+ */
61
+ export function aciBrandOfCardLeg(body) {
62
+ return brandOfCardLeg(body);
63
+ }
64
+ /**
65
+ * The answer a paused card-number request gets, or null when the stored answer is not one to hand
66
+ * the page: a 2xx carrying exactly ACI's rebuilt success answer (payment-core sanitizeAciResponse,
67
+ * the allow-list the API stored it through), under JSON. The widget only waits for every leg to
68
+ * resolve, so nothing else ACI said is ever needed, and the same answer serves the sibling legs.
69
+ */
70
+ export function aciCardLegAnswer(response) {
71
+ if (!Number.isInteger(response?.status) || response.status < 200 || response.status > 299 || typeof response.body !== 'string')
72
+ return null;
73
+ let rebuilt;
74
+ try {
75
+ rebuilt = sanitizeAciResponse(response.body);
76
+ }
77
+ catch {
78
+ return null;
79
+ }
80
+ if (rebuilt !== response.body)
81
+ return null;
82
+ return { status: response.status, headers: { 'content-type': 'application/json' }, body: rebuilt };
83
+ }
84
+ /**
85
+ * The URL with an ACI checkout id taken out of its path, or null for a URL that is not on one of
86
+ * ACI's hosts under /v1/checkouts/. The id is the checkout's only capability: once the card-number
87
+ * request carried the real card, anyone holding it can post /payment against that card for the
88
+ * rest of the checkout's 30 minutes, so it never rides on an event.
89
+ */
90
+ export function redactAciCheckoutId(raw) {
91
+ let url;
92
+ try {
93
+ url = new URL(raw);
94
+ }
95
+ catch {
96
+ return null;
97
+ }
98
+ if (!['eu-prod.oppwa.com', 'oppwa.com', 'eu-test.oppwa.com', 'test.oppwa.com'].includes(url.hostname))
99
+ return null;
100
+ const path = /^\/v1\/checkouts\/[^/]+(\/.*)?$/.exec(url.pathname);
101
+ return path ? `${url.origin}/v1/checkouts/{checkoutId}${path[1] ?? ''}` : null;
102
+ }
103
+ /** How long the persistent-context engine probe (a CDP session opening) may take before it counts as no. */
104
+ export const ACI_ENGINE_PROBE_MS = 5_000;
105
+ /**
106
+ * Whether a Playwright page's browser sends the body the SDK replaced on a navigation. Removing the
107
+ * placeholder expiry from a classic-mode /payment needs it, because the widget's form posts
108
+ * /payment as its hidden iframe's navigation. The SDK's ACI browser test shows it on Chromium in
109
+ * both adapters (design gate G3), and CI installs only Chromium; a local WebKit 26.5 run sent the
110
+ * replaced body too, but nothing keeps that true, so every engine but Chromium is refused rather
111
+ * than trusted with the placeholder expiry. The engine is the page's browser type, or, for a
112
+ * persistent context that names no browser, whether a CDP session opens on the page, which only
113
+ * Chromium allows.
114
+ */
115
+ export async function playwrightReplacesNavigationBody(page, probeMs = ACI_ENGINE_PROBE_MS) {
116
+ let context;
117
+ try {
118
+ context = page?.context?.();
119
+ }
120
+ catch {
121
+ return false;
122
+ }
123
+ let engine;
124
+ try {
125
+ engine = context?.browser?.()?.browserType?.()?.name?.();
126
+ }
127
+ catch {
128
+ engine = undefined;
129
+ }
130
+ if (typeof engine === 'string')
131
+ return engine === 'chromium';
132
+ if (typeof context?.newCDPSession !== 'function')
133
+ return false;
134
+ let opening;
135
+ try {
136
+ opening = Promise.resolve(context.newCDPSession(page));
137
+ }
138
+ catch {
139
+ return false;
140
+ }
141
+ let timer;
142
+ // A ref'd timer: the probe always settles within probeMs, even when nothing else keeps Node running.
143
+ const expired = new Promise((resolve) => {
144
+ timer = setTimeout(() => resolve('expired'), probeMs);
145
+ });
146
+ try {
147
+ const session = await Promise.race([opening, expired]);
148
+ if (session === 'expired') {
149
+ // A session that opens after the probe gave up is closed then: the probe never keeps one.
150
+ opening.then((late) => late?.detach?.(), () => { }).catch(() => { });
151
+ return false;
152
+ }
153
+ try {
154
+ await session?.detach?.();
155
+ }
156
+ catch { /* the probe's own session; nothing depends on it */ }
157
+ return true;
158
+ }
159
+ catch {
160
+ return false;
161
+ }
162
+ finally {
163
+ clearTimeout(timer);
164
+ }
165
+ }
166
+ const groupKey = (leg) => `${leg.host}/${leg.checkoutId}`;
167
+ /**
168
+ * One attachment's ACI state, keyed by checkout (host and checkout id). Every sibling and every
169
+ * /payment submission is matched against a card-number request this attachment itself paused and
170
+ * answered, never taken on the page's word. Inert (classify returns null) until the registry serves
171
+ * ACI, which a client reaches only by syncing with the capability, so a build or an API that never
172
+ * served it leaves every ACI request exactly as before.
173
+ */
174
+ export class AciGate {
175
+ vault;
176
+ siblingWaitMs;
177
+ groups = new Map();
178
+ /** Siblings that arrived before their checkout's card-number request began, by checkout. */
179
+ early = new Map();
180
+ /** The checkout whose card-number request's approval is running. */
181
+ current = null;
182
+ constructor(vault, siblingWaitMs = ACI_SIBLING_WAIT_MS) {
183
+ this.vault = vault;
184
+ this.siblingWaitMs = siblingWaitMs;
185
+ }
186
+ served() {
187
+ return typeof this.vault?.recognizesProcessor === 'function' && this.vault.recognizesProcessor(ACI_PSP) === true;
188
+ }
189
+ /** What this request is, when the registry serves ACI and it is a POST to an ACI checkout; null leaves it to the other gates. */
190
+ classify(url, method, body) {
191
+ if (!this.served())
192
+ return null;
193
+ return classifyLeg({ url, method: typeof method === 'string' ? method.toUpperCase() : method, body });
194
+ }
195
+ /**
196
+ * Playwright's route predicate sees only the URL. The card-number, CVC, expiry and holder
197
+ * requests share the recognizer's URL; /payment and /registration do not, so they are routed
198
+ * here, and the rest of ACI's traffic (the widget script, /bins, /v1/collect) never is.
199
+ */
200
+ matches(url) {
201
+ return this.served() && aciEndpoint(url) !== null;
202
+ }
203
+ /**
204
+ * The card-number request of a checkout began its approval; its siblings wait for the outcome.
205
+ * False, with nothing changed, for a checkout whose card-number request is still running or was
206
+ * answered here: its group keeps its answer and its one /payment, so a second approval can never
207
+ * reopen that checkout for another /payment. The pre-claim gate refuses such a request first
208
+ * (reused, aci_checkout_reused), before it claims a preparation; the adapters fail it here too.
209
+ * A refused begin leaves the running approval it found running. A checkout whose card-number
210
+ * request failed begins again.
211
+ */
212
+ begin(url, method, body, merchantOrigin) {
213
+ const leg = classifyLeg({ url, method: typeof method === 'string' ? method.toUpperCase() : method, body });
214
+ if (leg?.leg !== 'card') {
215
+ this.current = null;
216
+ return true;
217
+ }
218
+ const key = groupKey(leg);
219
+ if (this.live(key))
220
+ return false;
221
+ const group = { state: 'running', answer: null, authorizationId: null, brand: aciBrandOfCardLeg(body),
222
+ merchantOrigin: merchantOrigin ?? null, paid: false, waiters: new Set() };
223
+ this.groups.set(key, group);
224
+ this.current = key;
225
+ const early = this.early.get(key);
226
+ this.early.delete(key);
227
+ for (const wake of early ?? [])
228
+ wake(group);
229
+ return true;
230
+ }
231
+ /** Whether this checkout's card-number request is running or was answered here: another one is refused. */
232
+ reused(leg) {
233
+ return this.live(groupKey(leg));
234
+ }
235
+ live(key) {
236
+ const group = this.groups.get(key);
237
+ return !!group && group.state !== 'failed';
238
+ }
239
+ /** Drops the oldest failed checkouts past ACI_FAILED_CHECKOUTS_KEPT; running and answered ones stay. */
240
+ prune() {
241
+ let failed = 0;
242
+ for (const group of this.groups.values())
243
+ if (group.state === 'failed')
244
+ failed++;
245
+ for (const [key, group] of this.groups) {
246
+ if (failed <= ACI_FAILED_CHECKOUTS_KEPT)
247
+ return;
248
+ if (group.state === 'failed') {
249
+ this.groups.delete(key);
250
+ failed--;
251
+ }
252
+ }
253
+ }
254
+ /** The card-number request's answer reached the page; its siblings get the same answer. */
255
+ answered(url, answer, authorizationId) {
256
+ const endpoint = aciEndpoint(url);
257
+ if (!endpoint || endpoint.kind !== 'leg' || this.current !== groupKey(endpoint))
258
+ return;
259
+ const group = this.groups.get(this.current);
260
+ if (!group || group.state !== 'running')
261
+ return;
262
+ group.state = 'answered';
263
+ group.answer = answer;
264
+ group.authorizationId = authorizationId;
265
+ for (const settle of group.waiters)
266
+ settle(answer);
267
+ group.waiters.clear();
268
+ }
269
+ /** The card-number request's approval ended, answered or not; unanswered siblings fail. */
270
+ end() {
271
+ const key = this.current;
272
+ this.current = null;
273
+ const group = key ? this.groups.get(key) : undefined;
274
+ if (!group || group.state !== 'running')
275
+ return;
276
+ group.state = 'failed';
277
+ for (const settle of group.waiters)
278
+ settle(null);
279
+ group.waiters.clear();
280
+ this.prune();
281
+ }
282
+ /**
283
+ * A request on this checkout was refused before any card-number request began (a card-number
284
+ * request that asks ACI to keep the card, a leg the widget never sends): the siblings waiting for
285
+ * one fail now, and so does every later sibling until a card-number request begins. A running or
286
+ * answered card-number request keeps its siblings.
287
+ */
288
+ refused(leg) {
289
+ const key = groupKey(leg);
290
+ const known = this.groups.get(key);
291
+ if (known && known.state !== 'failed')
292
+ return;
293
+ const failed = { state: 'failed', answer: null, authorizationId: null, brand: null, merchantOrigin: null, paid: false, waiters: new Set() };
294
+ // Deleted first, so the newest refusal is the last one pruned.
295
+ this.groups.delete(key);
296
+ this.groups.set(key, failed);
297
+ const early = this.early.get(key);
298
+ this.early.delete(key);
299
+ for (const wake of early ?? [])
300
+ wake(failed);
301
+ this.prune();
302
+ }
303
+ /**
304
+ * A sibling leg (the page's CVC or expiry request): the answer to hand it, once its checkout's
305
+ * card-number request was answered, or null when that request failed, never began within
306
+ * siblingWaitMs, or cannot be answered here. Never resolves to anything the page did not get.
307
+ */
308
+ hold(leg) {
309
+ const key = groupKey(leg);
310
+ const known = this.groups.get(key);
311
+ if (known?.state === 'answered')
312
+ return Promise.resolve(known.answer);
313
+ if (known?.state === 'failed')
314
+ return Promise.resolve(null);
315
+ return new Promise((resolve) => {
316
+ const attach = (group) => {
317
+ if (group.state === 'answered')
318
+ resolve(group.answer);
319
+ else if (group.state === 'failed')
320
+ resolve(null);
321
+ else
322
+ group.waiters.add(resolve);
323
+ };
324
+ if (known) {
325
+ attach(known);
326
+ return;
327
+ }
328
+ let waiting = this.early.get(key);
329
+ if (!waiting) {
330
+ waiting = new Set();
331
+ this.early.set(key, waiting);
332
+ }
333
+ const wake = (group) => { clearTimeout(timer); attach(group); };
334
+ // A ref'd timer: the page's request is answered within siblingWaitMs even when nothing else
335
+ // keeps Node running, never left pending while the process exits.
336
+ const timer = setTimeout(() => {
337
+ const set = this.early.get(key);
338
+ set?.delete(wake);
339
+ if (set && set.size === 0)
340
+ this.early.delete(key);
341
+ resolve(null);
342
+ }, this.siblingWaitMs);
343
+ waiting.add(wake);
344
+ });
345
+ }
346
+ /**
347
+ * The page's /payment submission: continue it with the body to send, or refuse it. It continues
348
+ * only as a frame navigation (the widget's form posting into its hidden iframe; a script's fetch
349
+ * of the same URL is not the widget's and is refused before it can take the reservation), only
350
+ * for a checkout whose card-number request this attachment answered, only once, and only as
351
+ * payment-core's judge admits it for that card's brand and the merchant the cardholder approved.
352
+ * The reservation is taken before the answer, so two submissions can never both continue.
353
+ */
354
+ payment(url, method, body, request) {
355
+ const leg = classifyLeg({ url, method: typeof method === 'string' ? method.toUpperCase() : method, body });
356
+ if (leg?.leg !== 'continuation' || request?.navigation !== true)
357
+ return { outcome: 'refuse', code: 'aci_unsupported_request' };
358
+ const group = this.groups.get(groupKey(leg));
359
+ if (!group || group.state !== 'answered')
360
+ return { outcome: 'refuse', code: ACI_PAYMENT_UNAPPROVED };
361
+ if (group.paid)
362
+ return { outcome: 'refuse', code: ACI_PAYMENT_REPEATED };
363
+ const verdict = judgePayment({ url, method: 'POST', body }, { brand: group.brand, merchantOrigin: group.merchantOrigin });
364
+ if (verdict.outcome !== 'continue')
365
+ return { outcome: 'refuse', code: verdict.code };
366
+ if (verdict.host !== leg.host || verdict.checkoutId !== leg.checkoutId)
367
+ return { outcome: 'refuse', code: 'aci_unsupported_request' };
368
+ group.paid = true;
369
+ return { outcome: 'continue', body: verdict.body, stripped: verdict.stripped, authorizationId: group.authorizationId };
370
+ }
371
+ }
@@ -239,7 +239,7 @@ declare function merchantTotalFromResponses(profileId: any, input: any): {
239
239
  bodyAmount: string;
240
240
  };
241
241
  };
242
- declare function merchantProfileUrlRelation(profileId: any, rawUrl: any): "endpoint" | "sibling" | null;
242
+ declare function merchantProfileUrlRelation(profileId: any, rawUrl: any): "sibling" | "endpoint" | "then" | "other" | null;
243
243
  declare function carriesAdyenCardCiphertext(body: any): any;
244
244
  declare function classifyMerchantBody(profileId: any, body: any): Readonly<{
245
245
  verdict: "pass";
@@ -257,7 +257,7 @@ declare function classifyMerchantRequest(profileId: any, rawUrl: any, method: an
257
257
  }> | Readonly<{
258
258
  verdict: "pause";
259
259
  }>;
260
- declare function declaredUrlRelation(endpoint: any, rawUrl: any): "endpoint" | "sibling" | null;
260
+ declare function declaredUrlRelation(endpoint: any, rawUrl: any): "sibling" | "endpoint" | null;
261
261
  declare function classifyDeclaredMerchantRequest(profileId: any, endpoint: any, rawUrl: any, method: any, body: any): Readonly<{
262
262
  verdict: "pass";
263
263
  }> | Readonly<{
@@ -269,7 +269,7 @@ declare function classifyDeclaredMerchantRequest(profileId: any, endpoint: any,
269
269
  declare function declaredTemplatedUrl(endpoint: any): string;
270
270
  declare function merchantProfileTemplatedUrl(profileId: any, rawUrl: any): string;
271
271
  declare function merchantBodyKeyPathSha256(body: any): string | null;
272
- declare function merchantProfileUrlGlobs(profileId: any): unknown[];
272
+ declare function merchantProfileUrlGlobs(profileId: any): any[];
273
273
  declare function declaredUrlGlobs(endpoint: any): string[];
274
274
  declare function merchantProfileRulesMatch(profileId: any, served: any): boolean;
275
275
  declare function merchantProfileEnvironment(profileId: any): "production" | "sandbox";