@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/CHANGELOG.md +39 -0
- package/README.md +47 -2
- package/dist/auto-events/index.d.mts +1 -1
- package/dist/auto-events/index.d.ts +1 -1
- package/dist/{crossdeck-server-Q3CYJC4Z.d.mts → crossdeck-server-BpBVFC4O.d.mts} +161 -3
- package/dist/{crossdeck-server-Q3CYJC4Z.d.ts → crossdeck-server-BpBVFC4O.d.ts} +161 -3
- package/dist/index.cjs +192 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.mjs +192 -14
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
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
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
4542
|
-
var SDK_VERSION2 = "1.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
5323
|
+
"bundledIn": "@cross-deck/node@1.10.1"
|
|
5146
5324
|
}
|
|
5147
5325
|
]);
|
|
5148
5326
|
|