@cross-deck/node 1.9.1 → 1.10.1

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/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- export { A as AliasIdentityInput, a as AliasResult, b as AuditDecision, c as AuditEntry, B as Breadcrumb, d as BreadcrumbCategory, e as BreadcrumbLevel, C as CROSSDECK_API_VERSION, f as CapturedError, g as Contract, h as ContractAppliesTo, i as ContractFailureInput, j as ContractPillar, k as ContractStatus, l as ContractTestRef, m as CrossdeckAuthenticationError, n as CrossdeckConfigurationError, o as CrossdeckContracts, p as CrossdeckError, q as CrossdeckErrorPayload, r as CrossdeckErrorType, s as CrossdeckInternalError, t as CrossdeckNetworkError, u as CrossdeckPermissionError, v as CrossdeckRateLimitError, w as CrossdeckServer, x as CrossdeckServerOptions, y as CrossdeckValidationError, D as DEFAULT_BASE_URL, z as DEFAULT_TIMEOUT_MS, E as Diagnostics, F as EntitlementCacheOptions, G as EntitlementMutationResult, H as EntitlementStore, I as EntitlementsListResponse, J as EntitlementsListener, K as Environment, L as ErrorCaptureConfig, M as ErrorLevel, N as EventProperties, O as ForgetResult, P as GrantDuration, Q as GrantEntitlementInput, R as GroupMembership, S as HeartbeatResponse, T as HttpRequestInfo, U as HttpResponseInfo, V as HttpRetriesConfig, W as IdentifyOptions, X as IdentityHints, Y as IngestOptions, Z as IngestResponse, _ as PublicEntitlement, $ as PurchaseResult, a0 as RequestOptions, a1 as RevokeEntitlementInput, a2 as RuntimeHost, a3 as RuntimeInfo, a4 as ServerEvent, a5 as StackFrame, a6 as StoredEntitlements, a7 as SyncPurchaseInput, a8 as makeCrossdeckError } from './crossdeck-server-Q3CYJC4Z.mjs';
1
+ export { A as AliasIdentityInput, a as AliasResult, b as AuditDecision, c as AuditEntry, B as BlockVerdict, d as Breadcrumb, e as BreadcrumbCategory, f as BreadcrumbLevel, C as CROSSDECK_API_VERSION, g as CapturedError, h as Contract, i as ContractAppliesTo, j as ContractFailureInput, k as ContractPillar, l as ContractStatus, m as ContractTestRef, n as CrossdeckAuthenticationError, o as CrossdeckConfigurationError, p as CrossdeckContracts, q as CrossdeckError, r as CrossdeckErrorPayload, s as CrossdeckErrorType, t as CrossdeckInternalError, u as CrossdeckNetworkError, v as CrossdeckPermissionError, w as CrossdeckRateLimitError, x as CrossdeckServer, y as CrossdeckServerOptions, z as CrossdeckValidationError, D as DEFAULT_BASE_URL, E as DEFAULT_TIMEOUT_MS, F as Diagnostics, G as EntitlementCacheOptions, H as EntitlementMutationResult, I as EntitlementStore, J as EntitlementsListResponse, K as EntitlementsListener, L as Environment, M as ErrorCaptureConfig, N as ErrorLevel, O as EventProperties, P as ForgetResult, Q as GateInput, R as GateVerdict, S as GrantDuration, T as GrantEntitlementInput, U as GroupMembership, V as HeartbeatResponse, W as HttpRequestInfo, X as HttpResponseInfo, Y as HttpRetriesConfig, Z as IdentifyOptions, _ as IdentityHints, $ as IngestOptions, a0 as IngestResponse, a1 as OwnerStatusInput, a2 as PublicEntitlement, a3 as PurchaseResult, a4 as RequestOptions, a5 as ResolveInput, a6 as ResolveResult, a7 as RevokeEntitlementInput, a8 as RuntimeHost, a9 as RuntimeInfo, aa as ServerEvent, ab as StackFrame, ac as StoredEntitlements, ad as SyncPurchaseInput, ae as makeCrossdeckError } from './crossdeck-server-BpBVFC4O.mjs';
2
2
  import 'node:events';
3
3
 
4
4
  /**
@@ -17,7 +17,7 @@ import 'node:events';
17
17
  *
18
18
  * Do NOT edit by hand — `node scripts/sync-sdk-versions.mjs`.
19
19
  */
20
- declare const SDK_VERSION = "1.9.1";
20
+ declare const SDK_VERSION = "1.10.1";
21
21
  declare const SDK_NAME = "@cross-deck/node";
22
22
 
23
23
  /**
@@ -501,7 +501,7 @@ declare function scrubPiiFromProperties(properties: Record<string, unknown>): Re
501
501
  * - `sdk.no_durable_store`
502
502
  * - `sdk.super_property_registered`
503
503
  */
504
- type DebugSignal = "sdk.configured" | "sdk.first_event_sent" | "sdk.invalid_key" | "sdk.no_identity" | "sdk.entitlement_cache_used" | "sdk.entitlement_cache_warm" | "sdk.entitlement_cache_stale" | "sdk.entitlement_store_recovered" | "sdk.no_durable_store" | "sdk.purchase_evidence_sent" | "sdk.environment_mismatch" | "sdk.sensitive_property_warning" | "sdk.property_coerced" | "sdk.flush_retry_scheduled" | "sdk.flush_permanent_failure" | "sdk.parked" | "sdk.flush_on_exit_started" | "sdk.flush_on_exit_completed" | "sdk.webhook_verified" | "sdk.runtime_detected" | "sdk.super_property_registered" | "sdk.boot_heartbeat_failed";
504
+ type DebugSignal = "sdk.configured" | "sdk.first_event_sent" | "sdk.invalid_key" | "sdk.no_identity" | "sdk.entitlement_cache_used" | "sdk.entitlement_cache_warm" | "sdk.entitlement_cache_stale" | "sdk.entitlement_store_recovered" | "sdk.no_durable_store" | "sdk.purchase_evidence_sent" | "sdk.environment_mismatch" | "sdk.sensitive_property_warning" | "sdk.property_coerced" | "sdk.flush_retry_scheduled" | "sdk.flush_permanent_failure" | "sdk.parked" | "sdk.flush_on_exit_started" | "sdk.flush_on_exit_completed" | "sdk.webhook_verified" | "sdk.runtime_detected" | "sdk.super_property_registered" | "sdk.boot_heartbeat_failed" | "sdk.resolve_missing_identity" | "sdk.resolve_failed" | "sdk.owner_status_missing_identity" | "sdk.owner_status_failed" | "sdk.gate_missing_input" | "sdk.gate_failed";
505
505
  interface DebugContext {
506
506
  [key: string]: unknown;
507
507
  }
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { A as AliasIdentityInput, a as AliasResult, b as AuditDecision, c as AuditEntry, B as Breadcrumb, d as BreadcrumbCategory, e as BreadcrumbLevel, C as CROSSDECK_API_VERSION, f as CapturedError, g as Contract, h as ContractAppliesTo, i as ContractFailureInput, j as ContractPillar, k as ContractStatus, l as ContractTestRef, m as CrossdeckAuthenticationError, n as CrossdeckConfigurationError, o as CrossdeckContracts, p as CrossdeckError, q as CrossdeckErrorPayload, r as CrossdeckErrorType, s as CrossdeckInternalError, t as CrossdeckNetworkError, u as CrossdeckPermissionError, v as CrossdeckRateLimitError, w as CrossdeckServer, x as CrossdeckServerOptions, y as CrossdeckValidationError, D as DEFAULT_BASE_URL, z as DEFAULT_TIMEOUT_MS, E as Diagnostics, F as EntitlementCacheOptions, G as EntitlementMutationResult, H as EntitlementStore, I as EntitlementsListResponse, J as EntitlementsListener, K as Environment, L as ErrorCaptureConfig, M as ErrorLevel, N as EventProperties, O as ForgetResult, P as GrantDuration, Q as GrantEntitlementInput, R as GroupMembership, S as HeartbeatResponse, T as HttpRequestInfo, U as HttpResponseInfo, V as HttpRetriesConfig, W as IdentifyOptions, X as IdentityHints, Y as IngestOptions, Z as IngestResponse, _ as PublicEntitlement, $ as PurchaseResult, a0 as RequestOptions, a1 as RevokeEntitlementInput, a2 as RuntimeHost, a3 as RuntimeInfo, a4 as ServerEvent, a5 as StackFrame, a6 as StoredEntitlements, a7 as SyncPurchaseInput, a8 as makeCrossdeckError } from './crossdeck-server-Q3CYJC4Z.js';
1
+ export { A as AliasIdentityInput, a as AliasResult, b as AuditDecision, c as AuditEntry, B as BlockVerdict, d as Breadcrumb, e as BreadcrumbCategory, f as BreadcrumbLevel, C as CROSSDECK_API_VERSION, g as CapturedError, h as Contract, i as ContractAppliesTo, j as ContractFailureInput, k as ContractPillar, l as ContractStatus, m as ContractTestRef, n as CrossdeckAuthenticationError, o as CrossdeckConfigurationError, p as CrossdeckContracts, q as CrossdeckError, r as CrossdeckErrorPayload, s as CrossdeckErrorType, t as CrossdeckInternalError, u as CrossdeckNetworkError, v as CrossdeckPermissionError, w as CrossdeckRateLimitError, x as CrossdeckServer, y as CrossdeckServerOptions, z as CrossdeckValidationError, D as DEFAULT_BASE_URL, E as DEFAULT_TIMEOUT_MS, F as Diagnostics, G as EntitlementCacheOptions, H as EntitlementMutationResult, I as EntitlementStore, J as EntitlementsListResponse, K as EntitlementsListener, L as Environment, M as ErrorCaptureConfig, N as ErrorLevel, O as EventProperties, P as ForgetResult, Q as GateInput, R as GateVerdict, S as GrantDuration, T as GrantEntitlementInput, U as GroupMembership, V as HeartbeatResponse, W as HttpRequestInfo, X as HttpResponseInfo, Y as HttpRetriesConfig, Z as IdentifyOptions, _ as IdentityHints, $ as IngestOptions, a0 as IngestResponse, a1 as OwnerStatusInput, a2 as PublicEntitlement, a3 as PurchaseResult, a4 as RequestOptions, a5 as ResolveInput, a6 as ResolveResult, a7 as RevokeEntitlementInput, a8 as RuntimeHost, a9 as RuntimeInfo, aa as ServerEvent, ab as StackFrame, ac as StoredEntitlements, ad as SyncPurchaseInput, ae as makeCrossdeckError } from './crossdeck-server-BpBVFC4O.js';
2
2
  import 'node:events';
3
3
 
4
4
  /**
@@ -17,7 +17,7 @@ import 'node:events';
17
17
  *
18
18
  * Do NOT edit by hand — `node scripts/sync-sdk-versions.mjs`.
19
19
  */
20
- declare const SDK_VERSION = "1.9.1";
20
+ declare const SDK_VERSION = "1.10.1";
21
21
  declare const SDK_NAME = "@cross-deck/node";
22
22
 
23
23
  /**
@@ -501,7 +501,7 @@ declare function scrubPiiFromProperties(properties: Record<string, unknown>): Re
501
501
  * - `sdk.no_durable_store`
502
502
  * - `sdk.super_property_registered`
503
503
  */
504
- type DebugSignal = "sdk.configured" | "sdk.first_event_sent" | "sdk.invalid_key" | "sdk.no_identity" | "sdk.entitlement_cache_used" | "sdk.entitlement_cache_warm" | "sdk.entitlement_cache_stale" | "sdk.entitlement_store_recovered" | "sdk.no_durable_store" | "sdk.purchase_evidence_sent" | "sdk.environment_mismatch" | "sdk.sensitive_property_warning" | "sdk.property_coerced" | "sdk.flush_retry_scheduled" | "sdk.flush_permanent_failure" | "sdk.parked" | "sdk.flush_on_exit_started" | "sdk.flush_on_exit_completed" | "sdk.webhook_verified" | "sdk.runtime_detected" | "sdk.super_property_registered" | "sdk.boot_heartbeat_failed";
504
+ type DebugSignal = "sdk.configured" | "sdk.first_event_sent" | "sdk.invalid_key" | "sdk.no_identity" | "sdk.entitlement_cache_used" | "sdk.entitlement_cache_warm" | "sdk.entitlement_cache_stale" | "sdk.entitlement_store_recovered" | "sdk.no_durable_store" | "sdk.purchase_evidence_sent" | "sdk.environment_mismatch" | "sdk.sensitive_property_warning" | "sdk.property_coerced" | "sdk.flush_retry_scheduled" | "sdk.flush_permanent_failure" | "sdk.parked" | "sdk.flush_on_exit_started" | "sdk.flush_on_exit_completed" | "sdk.webhook_verified" | "sdk.runtime_detected" | "sdk.super_property_registered" | "sdk.boot_heartbeat_failed" | "sdk.resolve_missing_identity" | "sdk.resolve_failed" | "sdk.owner_status_missing_identity" | "sdk.owner_status_failed" | "sdk.gate_missing_input" | "sdk.gate_failed";
505
505
  interface DebugContext {
506
506
  [key: string]: unknown;
507
507
  }
package/dist/index.mjs CHANGED
@@ -329,7 +329,7 @@ function byteLength(s) {
329
329
  import * as https from "https";
330
330
 
331
331
  // src/_version.ts
332
- var SDK_VERSION = "1.9.1";
332
+ var SDK_VERSION = "1.10.1";
333
333
  var SDK_NAME = "@cross-deck/node";
334
334
 
335
335
  // src/_diagnostic-telemetry.ts
@@ -3091,6 +3091,184 @@ var CrossdeckServer = class extends EventEmitter {
3091
3091
  this.populateEntitlementCache({ customerId }, response);
3092
3092
  return response;
3093
3093
  }
3094
+ // ── Blocking — "entitlements, inverted" (Crossdeck Trust, v2 preview) ───────
3095
+ //
3096
+ // getEntitlements() answers "can they access Pro?"; resolve() answers "should
3097
+ // they be here at all?". Same call, opposite question. Both read Crossdeck live.
3098
+ // The safety inversion: entitlements fail CLOSED (protect revenue); blocking
3099
+ // fails OPEN (protect real users) — these methods NEVER throw for the verdict
3100
+ // and NEVER return blocked:true on uncertainty.
3101
+ /**
3102
+ * Resolve a user's BLOCK verdict (plus identity / entitlement context) — the same
3103
+ * `/v1/resolve` you'd call for entitlements, read for `blocked`. Wire it into signup
3104
+ * and every visit; on `blocked`, sign the user out (and, for public content, take
3105
+ * their pages offline — see the Blocking developer guide, Pattern B).
3106
+ *
3107
+ * **Fail-open is the contract.** This never throws for the block decision and never
3108
+ * returns `blocked: true` on uncertainty. Any error — Crossdeck unreachable, timeout,
3109
+ * unresolved identity — yields `{ blocked: false, degraded: true }`, so a glitch can
3110
+ * never lock out a real user.
3111
+ *
3112
+ * Forward the END USER's `ip` (you call this server-to-server, so otherwise Crossdeck
3113
+ * sees your server's IP and an ip-rule can't match the visitor), and the verified
3114
+ * identity (`userId` + `idToken`) so a `domain`/`email` rule can match the email.
3115
+ *
3116
+ * @experimental Preview — Crossdeck Trust ships with Crossdeck v2. Stable shape, not yet GA.
3117
+ */
3118
+ async resolve(input, options) {
3119
+ const failOpen = () => ({
3120
+ blocked: false,
3121
+ blockReason: null,
3122
+ blockedKey: null,
3123
+ degraded: true,
3124
+ status: "anonymous",
3125
+ entitlements: [],
3126
+ crossdeckCustomerId: null,
3127
+ anonymousId: input?.anonymousId ?? null,
3128
+ identityError: null
3129
+ });
3130
+ if (!input || !input.anonymousId && !input.userId) {
3131
+ this.debug.emit(
3132
+ "sdk.resolve_missing_identity",
3133
+ "resolve() needs an anonymousId or a userId; returning fail-open blocked:false."
3134
+ );
3135
+ return failOpen();
3136
+ }
3137
+ try {
3138
+ const raw = await this.http.request("POST", "/resolve", {
3139
+ body: {
3140
+ ...input.userId ? { userId: input.userId } : {},
3141
+ ...input.idToken ? { idToken: input.idToken } : {},
3142
+ ...input.anonymousId ? { anonymousId: input.anonymousId } : {},
3143
+ ...input.ip ? { ip: input.ip } : {}
3144
+ },
3145
+ signal: options?.signal,
3146
+ timeoutMs: options?.timeoutMs
3147
+ });
3148
+ return {
3149
+ blocked: raw.blocked === true,
3150
+ blockReason: raw.blockReason ?? null,
3151
+ blockedKey: raw.blockedKey ?? null,
3152
+ status: typeof raw.status === "string" ? raw.status : "active",
3153
+ entitlements: Array.isArray(raw.entitlements) ? raw.entitlements.filter((e) => typeof e === "string") : [],
3154
+ crossdeckCustomerId: raw.crossdeckCustomerId ?? raw.user?.id ?? null,
3155
+ anonymousId: raw.anonymousId ?? input.anonymousId ?? null,
3156
+ identityError: raw.identityError ?? null
3157
+ };
3158
+ } catch (err) {
3159
+ this.debug.emit(
3160
+ "sdk.resolve_failed",
3161
+ `resolve() failed \u2014 fail-open blocked:false. ${err instanceof Error ? err.message : String(err)}`,
3162
+ { error: err instanceof Error ? err.message : String(err) }
3163
+ );
3164
+ return failOpen();
3165
+ }
3166
+ }
3167
+ /**
3168
+ * Convenience over {@link resolve}: just the boolean. Fail-open (false on any error).
3169
+ *
3170
+ * @experimental Preview — see {@link resolve}.
3171
+ */
3172
+ async isBlocked(input, options) {
3173
+ return (await this.resolve(input, options)).blocked;
3174
+ }
3175
+ /**
3176
+ * The OWNER's block verdict for the public-page path (Pattern B / §5b of the Blocking
3177
+ * developer guide) — "is the owner of this page blocked?", no session token required.
3178
+ * Pass the owner's recorded identifiers (`userId`/`email`/`domain`/`ip`; the `ip` is
3179
+ * their CREATION ip, not a live visitor's). Poll on a short TTL to invalidate your
3180
+ * public-page cache. Fail-open — any error → `{ blocked: false, degraded: true }`.
3181
+ *
3182
+ * @experimental Preview — see {@link resolve}.
3183
+ */
3184
+ async getOwnerStatus(input, options) {
3185
+ const query = {
3186
+ userId: input?.userId || void 0,
3187
+ email: input?.email || void 0,
3188
+ domain: input?.domain || void 0,
3189
+ ip: input?.ip || void 0
3190
+ };
3191
+ if (!query.userId && !query.email && !query.domain && !query.ip) {
3192
+ this.debug.emit(
3193
+ "sdk.owner_status_missing_identity",
3194
+ "getOwnerStatus() needs at least one of userId/email/domain/ip; returning fail-open blocked:false."
3195
+ );
3196
+ return { blocked: false, blockReason: null, blockedKey: null, degraded: true };
3197
+ }
3198
+ try {
3199
+ const raw = await this.http.request("GET", "/trust/status", {
3200
+ query,
3201
+ signal: options?.signal,
3202
+ timeoutMs: options?.timeoutMs
3203
+ });
3204
+ return {
3205
+ blocked: raw.blocked === true,
3206
+ blockReason: raw.blockReason ?? null,
3207
+ blockedKey: raw.blockedKey ?? null
3208
+ };
3209
+ } catch (err) {
3210
+ this.debug.emit(
3211
+ "sdk.owner_status_failed",
3212
+ `getOwnerStatus() failed \u2014 fail-open blocked:false. ${err instanceof Error ? err.message : String(err)}`,
3213
+ { error: err instanceof Error ? err.message : String(err) }
3214
+ );
3215
+ return { blocked: false, blockReason: null, blockedKey: null, degraded: true };
3216
+ }
3217
+ }
3218
+ /**
3219
+ * The brand-new-signup door (§3 of the Blocking developer guide). Block a user Crossdeck
3220
+ * has **never seen** — at the instant they sign up — by the two strings you have then:
3221
+ * their `email` and `ip`. There's no identity to ride yet, so {@link resolve} can't catch
3222
+ * them; this matches `email` / domain / `ip` blocklist rules directly. Call it BEFORE you
3223
+ * create the account; on `action: "block"`, reject the signup.
3224
+ *
3225
+ * **Fail-open by contract** — never throws, never blocks on uncertainty: any error →
3226
+ * `{ action: "allow", allow: true, degraded: true }`, so a glitch can't reject a real signup.
3227
+ *
3228
+ * @experimental Preview — Crossdeck Trust ships with Crossdeck v2.
3229
+ */
3230
+ async gate(input, options) {
3231
+ const failOpen = () => ({
3232
+ action: "allow",
3233
+ allow: true,
3234
+ blockReason: null,
3235
+ blockedKey: null,
3236
+ degraded: true
3237
+ });
3238
+ if (!input || !input.email && !input.ip && !input.domain) {
3239
+ this.debug.emit(
3240
+ "sdk.gate_missing_input",
3241
+ "gate() needs at least one of email / ip / domain; returning fail-open allow:true."
3242
+ );
3243
+ return failOpen();
3244
+ }
3245
+ try {
3246
+ const raw = await this.http.request("POST", "/trust/gate", {
3247
+ body: {
3248
+ ...input.email ? { email: input.email } : {},
3249
+ ...input.ip ? { ip: input.ip } : {},
3250
+ ...input.domain ? { domain: input.domain } : {},
3251
+ ...input.fingerprint ? { fingerprint: input.fingerprint } : {}
3252
+ },
3253
+ signal: options?.signal,
3254
+ timeoutMs: options?.timeoutMs
3255
+ });
3256
+ const action = raw.action === "block" || raw.action === "review" ? raw.action : "allow";
3257
+ return {
3258
+ action,
3259
+ allow: raw.allow !== false && action !== "block",
3260
+ blockReason: raw.blockReason ?? null,
3261
+ blockedKey: raw.blockedKey ?? null
3262
+ };
3263
+ } catch (err) {
3264
+ this.debug.emit(
3265
+ "sdk.gate_failed",
3266
+ `gate() failed \u2014 fail-open allow:true. ${err instanceof Error ? err.message : String(err)}`,
3267
+ { error: err instanceof Error ? err.message : String(err) }
3268
+ );
3269
+ return failOpen();
3270
+ }
3271
+ }
3094
3272
  /**
3095
3273
  * Synchronous entitlement check. Returns `true` iff the customer
3096
3274
  * has the entitlement AND the cache entry is fresh (within
@@ -4538,8 +4716,8 @@ function normaliseSecrets(input) {
4538
4716
  }
4539
4717
 
4540
4718
  // src/_contracts-bundled.ts
4541
- var BUNDLED_IN = "@cross-deck/node@1.8.2";
4542
- var SDK_VERSION2 = "1.8.2";
4719
+ var BUNDLED_IN = "@cross-deck/node@1.10.1";
4720
+ var SDK_VERSION2 = "1.10.1";
4543
4721
  var BUNDLED_CONTRACTS = Object.freeze([
4544
4722
  {
4545
4723
  "id": "contract-failed-payload-schema-lock",
@@ -4661,7 +4839,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
4661
4839
  "legal/security/index.html#diagnostic",
4662
4840
  "legal/sdk-data/index.html#b-diagnostic"
4663
4841
  ],
4664
- "bundledIn": "@cross-deck/node@1.8.2"
4842
+ "bundledIn": "@cross-deck/node@1.10.1"
4665
4843
  },
4666
4844
  {
4667
4845
  "id": "documentation-honesty",
@@ -4693,7 +4871,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
4693
4871
  ],
4694
4872
  "registeredAt": "2026-05-26",
4695
4873
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 \u2014 phase 7.1",
4696
- "bundledIn": "@cross-deck/node@1.8.2"
4874
+ "bundledIn": "@cross-deck/node@1.10.1"
4697
4875
  },
4698
4876
  {
4699
4877
  "id": "error-envelope-shape",
@@ -4732,7 +4910,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
4732
4910
  ],
4733
4911
  "registeredAt": "2026-05-26",
4734
4912
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 \u2014 phase 8 (codifies existing contract)",
4735
- "bundledIn": "@cross-deck/node@1.8.2"
4913
+ "bundledIn": "@cross-deck/node@1.10.1"
4736
4914
  },
4737
4915
  {
4738
4916
  "id": "flush-interval-parity",
@@ -4777,7 +4955,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
4777
4955
  ],
4778
4956
  "registeredAt": "2026-05-26",
4779
4957
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 \u2014 phase 3.3",
4780
- "bundledIn": "@cross-deck/node@1.8.2"
4958
+ "bundledIn": "@cross-deck/node@1.10.1"
4781
4959
  },
4782
4960
  {
4783
4961
  "id": "idempotency-key-deterministic",
@@ -4882,7 +5060,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
4882
5060
  ],
4883
5061
  "registeredAt": "2026-05-26",
4884
5062
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 \u2014 phase 2.2.a + 2.2.b + 2.2.c",
4885
- "bundledIn": "@cross-deck/node@1.8.2"
5063
+ "bundledIn": "@cross-deck/node@1.10.1"
4886
5064
  },
4887
5065
  {
4888
5066
  "id": "invalid-input-rejected-natively",
@@ -4938,7 +5116,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
4938
5116
  ],
4939
5117
  "registeredAt": "2026-06-11",
4940
5118
  "firstRegisteredIn": "swift trap-on-input class fix \u2014 first machine-tested Swift release",
4941
- "bundledIn": "@cross-deck/node@1.8.2"
5119
+ "bundledIn": "@cross-deck/node@1.10.1"
4942
5120
  },
4943
5121
  {
4944
5122
  "id": "node-pii-scrubber",
@@ -4977,7 +5155,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
4977
5155
  ],
4978
5156
  "registeredAt": "2026-05-26",
4979
5157
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 \u2014 phase 3.1",
4980
- "bundledIn": "@cross-deck/node@1.8.2"
5158
+ "bundledIn": "@cross-deck/node@1.10.1"
4981
5159
  },
4982
5160
  {
4983
5161
  "id": "node-shutdown-awaits-flush",
@@ -5010,7 +5188,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
5010
5188
  ],
5011
5189
  "registeredAt": "2026-05-26",
5012
5190
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 \u2014 phase 5.4",
5013
- "bundledIn": "@cross-deck/node@1.8.2"
5191
+ "bundledIn": "@cross-deck/node@1.10.1"
5014
5192
  },
5015
5193
  {
5016
5194
  "id": "sdk-error-codes-catalogue",
@@ -5055,7 +5233,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
5055
5233
  ],
5056
5234
  "registeredAt": "2026-05-26",
5057
5235
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 \u2014 phase 6.2",
5058
- "bundledIn": "@cross-deck/node@1.8.2"
5236
+ "bundledIn": "@cross-deck/node@1.10.1"
5059
5237
  },
5060
5238
  {
5061
5239
  "id": "sync-purchases-funnel-parity",
@@ -5088,7 +5266,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
5088
5266
  ],
5089
5267
  "registeredAt": "2026-05-26",
5090
5268
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 \u2014 phase 3.5",
5091
- "bundledIn": "@cross-deck/node@1.8.2"
5269
+ "bundledIn": "@cross-deck/node@1.10.1"
5092
5270
  },
5093
5271
  {
5094
5272
  "id": "verifier-timestamp-mandatory",
@@ -5142,7 +5320,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
5142
5320
  ],
5143
5321
  "registeredAt": "2026-05-26",
5144
5322
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 \u2014 phase 7.2",
5145
- "bundledIn": "@cross-deck/node@1.8.2"
5323
+ "bundledIn": "@cross-deck/node@1.10.1"
5146
5324
  }
5147
5325
  ]);
5148
5326