@cross-deck/node 1.10.1 → 1.11.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.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [1.11.0] — 2026-06-30
10
+
11
+ **Added — block `reference` and `supportEmail` on the trust surface (still v2 preview).**
12
+ `resolve()` and `gate()` now surface two fields on a block:
13
+
14
+ - `reference` — a short, opaque, human-quotable support handle (the "Ray ID", `xxxx-xxxx`).
15
+ Show it on your suspended screen; Crossdeck stores the same string on the block event, so
16
+ support resolves a quoted reference to the exact block in the admin Caught feed.
17
+ - `supportEmail` — the email you registered with Crossdeck at signup, so your suspended
18
+ screen's "Contact support" reaches the real operator by default instead of a placeholder.
19
+
20
+ Both were typed on `ResolveResult` / `GateVerdict` but the client previously **dropped**
21
+ them when building the result object — now passed through. Additive, non-breaking. Opaque +
22
+ non-PII (never the score or rule logic).
23
+
9
24
  ## [1.10.1] — 2026-06-30
10
25
 
11
26
  **Fixed — the blocking surface now works for the documented paths (still v2 preview).**
@@ -1,4 +1,4 @@
1
- import { x as CrossdeckServer } from '../crossdeck-server-BpBVFC4O.mjs';
1
+ import { x as CrossdeckServer } from '../crossdeck-server-DAQX_7rm.mjs';
2
2
  import 'node:events';
3
3
 
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { x as CrossdeckServer } from '../crossdeck-server-BpBVFC4O.js';
1
+ import { x as CrossdeckServer } from '../crossdeck-server-DAQX_7rm.js';
2
2
  import 'node:events';
3
3
 
4
4
  /**
@@ -183,8 +183,8 @@ declare const CrossdeckContracts: {
183
183
  readonly byId: (id: string) => Contract | undefined;
184
184
  readonly byPillar: (pillar: ContractPillar) => readonly Contract[];
185
185
  readonly withStatus: (status: ContractStatus) => readonly Contract[];
186
- readonly sdkVersion: "1.10.1";
187
- readonly bundledIn: "@cross-deck/node@1.10.1";
186
+ readonly sdkVersion: "1.11.0";
187
+ readonly bundledIn: "@cross-deck/node@1.11.0";
188
188
  /**
189
189
  * Resolve a failing test back to the contract it exercises.
190
190
  * Used by test-framework hooks to find the contract id of a
@@ -472,6 +472,18 @@ interface BlockVerdict {
472
472
  blockReason: string | null;
473
473
  /** The exact rule that fired: `"domain:spartan.net"` | `"ip:1.2.3.4"` | `"manual"` | null. */
474
474
  blockedKey: string | null;
475
+ /**
476
+ * Human-quotable support handle for this verdict (the "Ray ID"), formatted `xxxx-xxxx`.
477
+ * Show it on your suspended screen ("reference: blocklist:domain · a1f9-7c2e"); Crossdeck
478
+ * stores the same string on the block event, so support resolves it in the Caught feed.
479
+ */
480
+ reference?: string | null;
481
+ /**
482
+ * The recorded support contact (the project owner's signup email), present only when
483
+ * blocked — render it as the suspended screen's "Contact support" so appeals reach the
484
+ * real operator by default. Override with a dedicated address if you have one.
485
+ */
486
+ supportEmail?: string | null;
475
487
  /**
476
488
  * True when this is the fail-open default (Crossdeck unreachable / identity unresolved).
477
489
  * `blocked` is `false`; log it for observability, never treat it as a real "not blocked".
@@ -546,6 +558,10 @@ interface GateVerdict {
546
558
  blockReason: string | null;
547
559
  /** The exact rule/key that fired, when blocked. */
548
560
  blockedKey: string | null;
561
+ /** Human-quotable support handle (the "Ray ID"), formatted `xxxx-xxxx` — show it on the blocked screen. */
562
+ reference?: string | null;
563
+ /** Recorded support contact (project owner's signup email), present only on `block` — the blocked screen's "Contact support" default. */
564
+ supportEmail?: string | null;
549
565
  /** True when this is the fail-open default (Crossdeck unreachable). `allow` is `true`. */
550
566
  degraded?: boolean;
551
567
  }
@@ -183,8 +183,8 @@ declare const CrossdeckContracts: {
183
183
  readonly byId: (id: string) => Contract | undefined;
184
184
  readonly byPillar: (pillar: ContractPillar) => readonly Contract[];
185
185
  readonly withStatus: (status: ContractStatus) => readonly Contract[];
186
- readonly sdkVersion: "1.10.1";
187
- readonly bundledIn: "@cross-deck/node@1.10.1";
186
+ readonly sdkVersion: "1.11.0";
187
+ readonly bundledIn: "@cross-deck/node@1.11.0";
188
188
  /**
189
189
  * Resolve a failing test back to the contract it exercises.
190
190
  * Used by test-framework hooks to find the contract id of a
@@ -472,6 +472,18 @@ interface BlockVerdict {
472
472
  blockReason: string | null;
473
473
  /** The exact rule that fired: `"domain:spartan.net"` | `"ip:1.2.3.4"` | `"manual"` | null. */
474
474
  blockedKey: string | null;
475
+ /**
476
+ * Human-quotable support handle for this verdict (the "Ray ID"), formatted `xxxx-xxxx`.
477
+ * Show it on your suspended screen ("reference: blocklist:domain · a1f9-7c2e"); Crossdeck
478
+ * stores the same string on the block event, so support resolves it in the Caught feed.
479
+ */
480
+ reference?: string | null;
481
+ /**
482
+ * The recorded support contact (the project owner's signup email), present only when
483
+ * blocked — render it as the suspended screen's "Contact support" so appeals reach the
484
+ * real operator by default. Override with a dedicated address if you have one.
485
+ */
486
+ supportEmail?: string | null;
475
487
  /**
476
488
  * True when this is the fail-open default (Crossdeck unreachable / identity unresolved).
477
489
  * `blocked` is `false`; log it for observability, never treat it as a real "not blocked".
@@ -546,6 +558,10 @@ interface GateVerdict {
546
558
  blockReason: string | null;
547
559
  /** The exact rule/key that fired, when blocked. */
548
560
  blockedKey: string | null;
561
+ /** Human-quotable support handle (the "Ray ID"), formatted `xxxx-xxxx` — show it on the blocked screen. */
562
+ reference?: string | null;
563
+ /** Recorded support contact (project owner's signup email), present only on `block` — the blocked screen's "Contact support" default. */
564
+ supportEmail?: string | null;
549
565
  /** True when this is the fail-open default (Crossdeck unreachable). `allow` is `true`. */
550
566
  degraded?: boolean;
551
567
  }
package/dist/index.cjs CHANGED
@@ -387,7 +387,7 @@ function byteLength(s) {
387
387
  var https = __toESM(require("https"));
388
388
 
389
389
  // src/_version.ts
390
- var SDK_VERSION = "1.10.1";
390
+ var SDK_VERSION = "1.11.0";
391
391
  var SDK_NAME = "@cross-deck/node";
392
392
 
393
393
  // src/_diagnostic-telemetry.ts
@@ -3207,6 +3207,8 @@ var CrossdeckServer = class extends import_node_events.EventEmitter {
3207
3207
  blocked: raw.blocked === true,
3208
3208
  blockReason: raw.blockReason ?? null,
3209
3209
  blockedKey: raw.blockedKey ?? null,
3210
+ reference: raw.reference ?? null,
3211
+ supportEmail: raw.supportEmail ?? null,
3210
3212
  status: typeof raw.status === "string" ? raw.status : "active",
3211
3213
  entitlements: Array.isArray(raw.entitlements) ? raw.entitlements.filter((e) => typeof e === "string") : [],
3212
3214
  crossdeckCustomerId: raw.crossdeckCustomerId ?? raw.user?.id ?? null,
@@ -3316,7 +3318,9 @@ var CrossdeckServer = class extends import_node_events.EventEmitter {
3316
3318
  action,
3317
3319
  allow: raw.allow !== false && action !== "block",
3318
3320
  blockReason: raw.blockReason ?? null,
3319
- blockedKey: raw.blockedKey ?? null
3321
+ blockedKey: raw.blockedKey ?? null,
3322
+ reference: raw.reference ?? null,
3323
+ supportEmail: raw.supportEmail ?? null
3320
3324
  };
3321
3325
  } catch (err) {
3322
3326
  this.debug.emit(
@@ -4774,8 +4778,8 @@ function normaliseSecrets(input) {
4774
4778
  }
4775
4779
 
4776
4780
  // src/_contracts-bundled.ts
4777
- var BUNDLED_IN = "@cross-deck/node@1.10.1";
4778
- var SDK_VERSION2 = "1.10.1";
4781
+ var BUNDLED_IN = "@cross-deck/node@1.11.0";
4782
+ var SDK_VERSION2 = "1.11.0";
4779
4783
  var BUNDLED_CONTRACTS = Object.freeze([
4780
4784
  {
4781
4785
  "id": "contract-failed-payload-schema-lock",
@@ -4897,7 +4901,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
4897
4901
  "legal/security/index.html#diagnostic",
4898
4902
  "legal/sdk-data/index.html#b-diagnostic"
4899
4903
  ],
4900
- "bundledIn": "@cross-deck/node@1.10.1"
4904
+ "bundledIn": "@cross-deck/node@1.11.0"
4901
4905
  },
4902
4906
  {
4903
4907
  "id": "documentation-honesty",
@@ -4929,7 +4933,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
4929
4933
  ],
4930
4934
  "registeredAt": "2026-05-26",
4931
4935
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 \u2014 phase 7.1",
4932
- "bundledIn": "@cross-deck/node@1.10.1"
4936
+ "bundledIn": "@cross-deck/node@1.11.0"
4933
4937
  },
4934
4938
  {
4935
4939
  "id": "error-envelope-shape",
@@ -4968,7 +4972,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
4968
4972
  ],
4969
4973
  "registeredAt": "2026-05-26",
4970
4974
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 \u2014 phase 8 (codifies existing contract)",
4971
- "bundledIn": "@cross-deck/node@1.10.1"
4975
+ "bundledIn": "@cross-deck/node@1.11.0"
4972
4976
  },
4973
4977
  {
4974
4978
  "id": "flush-interval-parity",
@@ -5013,7 +5017,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
5013
5017
  ],
5014
5018
  "registeredAt": "2026-05-26",
5015
5019
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 \u2014 phase 3.3",
5016
- "bundledIn": "@cross-deck/node@1.10.1"
5020
+ "bundledIn": "@cross-deck/node@1.11.0"
5017
5021
  },
5018
5022
  {
5019
5023
  "id": "idempotency-key-deterministic",
@@ -5118,7 +5122,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
5118
5122
  ],
5119
5123
  "registeredAt": "2026-05-26",
5120
5124
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 \u2014 phase 2.2.a + 2.2.b + 2.2.c",
5121
- "bundledIn": "@cross-deck/node@1.10.1"
5125
+ "bundledIn": "@cross-deck/node@1.11.0"
5122
5126
  },
5123
5127
  {
5124
5128
  "id": "invalid-input-rejected-natively",
@@ -5174,7 +5178,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
5174
5178
  ],
5175
5179
  "registeredAt": "2026-06-11",
5176
5180
  "firstRegisteredIn": "swift trap-on-input class fix \u2014 first machine-tested Swift release",
5177
- "bundledIn": "@cross-deck/node@1.10.1"
5181
+ "bundledIn": "@cross-deck/node@1.11.0"
5178
5182
  },
5179
5183
  {
5180
5184
  "id": "node-pii-scrubber",
@@ -5213,7 +5217,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
5213
5217
  ],
5214
5218
  "registeredAt": "2026-05-26",
5215
5219
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 \u2014 phase 3.1",
5216
- "bundledIn": "@cross-deck/node@1.10.1"
5220
+ "bundledIn": "@cross-deck/node@1.11.0"
5217
5221
  },
5218
5222
  {
5219
5223
  "id": "node-shutdown-awaits-flush",
@@ -5246,7 +5250,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
5246
5250
  ],
5247
5251
  "registeredAt": "2026-05-26",
5248
5252
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 \u2014 phase 5.4",
5249
- "bundledIn": "@cross-deck/node@1.10.1"
5253
+ "bundledIn": "@cross-deck/node@1.11.0"
5250
5254
  },
5251
5255
  {
5252
5256
  "id": "sdk-error-codes-catalogue",
@@ -5291,7 +5295,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
5291
5295
  ],
5292
5296
  "registeredAt": "2026-05-26",
5293
5297
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 \u2014 phase 6.2",
5294
- "bundledIn": "@cross-deck/node@1.10.1"
5298
+ "bundledIn": "@cross-deck/node@1.11.0"
5295
5299
  },
5296
5300
  {
5297
5301
  "id": "sync-purchases-funnel-parity",
@@ -5324,7 +5328,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
5324
5328
  ],
5325
5329
  "registeredAt": "2026-05-26",
5326
5330
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 \u2014 phase 3.5",
5327
- "bundledIn": "@cross-deck/node@1.10.1"
5331
+ "bundledIn": "@cross-deck/node@1.11.0"
5328
5332
  },
5329
5333
  {
5330
5334
  "id": "verifier-timestamp-mandatory",
@@ -5378,7 +5382,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
5378
5382
  ],
5379
5383
  "registeredAt": "2026-05-26",
5380
5384
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 \u2014 phase 7.2",
5381
- "bundledIn": "@cross-deck/node@1.10.1"
5385
+ "bundledIn": "@cross-deck/node@1.11.0"
5382
5386
  }
5383
5387
  ]);
5384
5388