@glasstrace/sdk 1.15.1 → 1.17.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 (75) hide show
  1. package/README.md +118 -11
  2. package/dist/async-context/index.cjs +21 -2
  3. package/dist/async-context/index.cjs.map +1 -1
  4. package/dist/async-context/index.js +2 -2
  5. package/dist/{capture-error-03qDnC5v.d.cts → capture-error-B0txjNut.d.cts} +2 -2
  6. package/dist/{capture-error-CAfFUyIU.d.ts → capture-error-Dc01rYNR.d.ts} +2 -2
  7. package/dist/{chunk-ZIYT2Y4B.js → chunk-BJOZBAP7.js} +3 -3
  8. package/dist/{chunk-VMK2G6QR.js → chunk-CN5EP25B.js} +2 -2
  9. package/dist/{chunk-HMEHYSTS.js → chunk-EVX6D2TX.js} +2 -2
  10. package/dist/{chunk-T4ETJJSK.js → chunk-F2IPBTDJ.js} +133 -11
  11. package/dist/{chunk-T4ETJJSK.js.map → chunk-F2IPBTDJ.js.map} +1 -1
  12. package/dist/{chunk-XMD5OYD6.js → chunk-M3QGJUEI.js} +2 -2
  13. package/dist/{chunk-7LE2O4ZJ.js → chunk-MKT54VEH.js} +55 -6
  14. package/dist/{chunk-7LE2O4ZJ.js.map → chunk-MKT54VEH.js.map} +1 -1
  15. package/dist/{chunk-MP3QNDXQ.js → chunk-O7IJP2TQ.js} +2 -2
  16. package/dist/{chunk-F7A3QXCT.js → chunk-UOAG72NR.js} +2 -2
  17. package/dist/{chunk-6ST4QV7T.js → chunk-VEQX2YSQ.js} +3 -3
  18. package/dist/{chunk-LQZRGBN5.js → chunk-YKE6HJLW.js} +2 -2
  19. package/dist/cli/init.cjs +18 -5
  20. package/dist/cli/init.cjs.map +1 -1
  21. package/dist/cli/init.js +7 -7
  22. package/dist/cli/mcp-add.cjs +15 -2
  23. package/dist/cli/mcp-add.cjs.map +1 -1
  24. package/dist/cli/mcp-add.js +3 -3
  25. package/dist/cli/uninit.js +3 -3
  26. package/dist/cli/upgrade-instructions.cjs +1 -1
  27. package/dist/cli/upgrade-instructions.js +3 -3
  28. package/dist/cli/validate.cjs +14 -1
  29. package/dist/cli/validate.cjs.map +1 -1
  30. package/dist/cli/validate.js +2 -2
  31. package/dist/{correlation-id-YcfcqOru.d.ts → correlation-id-B9YYmoZw.d.ts} +1 -1
  32. package/dist/{correlation-id-CZ2bstzA.d.cts → correlation-id-CelUvw7j.d.cts} +1 -1
  33. package/dist/edge-entry.cjs +21 -2
  34. package/dist/edge-entry.cjs.map +1 -1
  35. package/dist/edge-entry.d.cts +2 -2
  36. package/dist/edge-entry.d.ts +2 -2
  37. package/dist/edge-entry.js +4 -4
  38. package/dist/import-graph-DBLGNjcI.d.cts +238 -0
  39. package/dist/import-graph-Dka_Fm7j.d.ts +238 -0
  40. package/dist/index.cjs +203 -12
  41. package/dist/index.cjs.map +1 -1
  42. package/dist/{index.d-BQIJ5Dvc.d.cts → index.d-3-cJoY8y.d.cts} +10 -2
  43. package/dist/{index.d-BQIJ5Dvc.d.ts → index.d-3-cJoY8y.d.ts} +10 -2
  44. package/dist/index.d.cts +102 -5
  45. package/dist/index.d.ts +102 -5
  46. package/dist/index.js +30 -5
  47. package/dist/index.js.map +1 -1
  48. package/dist/middleware/index.cjs +21 -2
  49. package/dist/middleware/index.cjs.map +1 -1
  50. package/dist/middleware/index.js +2 -2
  51. package/dist/node-entry.cjs +28 -8
  52. package/dist/node-entry.cjs.map +1 -1
  53. package/dist/node-entry.d.cts +4 -4
  54. package/dist/node-entry.d.ts +4 -4
  55. package/dist/node-entry.js +7 -7
  56. package/dist/node-subpath.cjs +27 -1
  57. package/dist/node-subpath.cjs.map +1 -1
  58. package/dist/node-subpath.d.cts +51 -235
  59. package/dist/node-subpath.d.ts +51 -235
  60. package/dist/node-subpath.js +16 -3
  61. package/dist/node-subpath.js.map +1 -1
  62. package/dist/{source-map-uploader-NUONOEJG.js → source-map-uploader-U7SLSKIZ.js} +3 -3
  63. package/dist/trpc/index.cjs +21 -2
  64. package/dist/trpc/index.cjs.map +1 -1
  65. package/dist/trpc/index.js +1 -1
  66. package/package.json +1 -1
  67. /package/dist/{chunk-ZIYT2Y4B.js.map → chunk-BJOZBAP7.js.map} +0 -0
  68. /package/dist/{chunk-VMK2G6QR.js.map → chunk-CN5EP25B.js.map} +0 -0
  69. /package/dist/{chunk-HMEHYSTS.js.map → chunk-EVX6D2TX.js.map} +0 -0
  70. /package/dist/{chunk-XMD5OYD6.js.map → chunk-M3QGJUEI.js.map} +0 -0
  71. /package/dist/{chunk-MP3QNDXQ.js.map → chunk-O7IJP2TQ.js.map} +0 -0
  72. /package/dist/{chunk-F7A3QXCT.js.map → chunk-UOAG72NR.js.map} +0 -0
  73. /package/dist/{chunk-6ST4QV7T.js.map → chunk-VEQX2YSQ.js.map} +0 -0
  74. /package/dist/{chunk-LQZRGBN5.js.map → chunk-YKE6HJLW.js.map} +0 -0
  75. /package/dist/{source-map-uploader-NUONOEJG.js.map → source-map-uploader-U7SLSKIZ.js.map} +0 -0
package/dist/index.cjs CHANGED
@@ -15338,7 +15338,11 @@ function isSideEffectSemanticFieldKey(key) {
15338
15338
  key
15339
15339
  ) || SIDE_EFFECT_SEMANTIC_FIELD_OPEN_PATTERN.test(key);
15340
15340
  }
15341
- var DevApiKeySchema, AnonApiKeySchema, SessionIdSchema, BuildHashSchema, SdkDiagnosticCodeSchema, CaptureConfigSchema, SdkCachedConfigSchema, GlasstraceOptionsSchema, GlasstraceEnvVarsSchema, GLASSTRACE_ATTRIBUTE_NAMES, DEFAULT_CAPTURE_CONFIG, MAX_SOURCE_MAP_FILE_PATH_LENGTH, MAX_SOURCE_MAP_FILE_SIZE, MAX_SOURCE_MAP_FILE_COUNT, MAX_PRESIGNED_CLIENT_TOKEN_LENGTH, MAX_PRESIGNED_PATHNAME_LENGTH, ImportGraphPayloadSchema, SdkHealthReportSchema, TierLimitsSchema, SdkInitResponseSchema, DiscoveryResponseSchema, SourceMapUploadResponseSchema, PresignedUploadRequestSchema, PresignedUploadResponseSchema, SourceMapManifestRequestSchema, SourceMapManifestResponseSchema, K, SIDE_EFFECT_OPERATION_KINDS, SIDE_EFFECT_SEMANTIC_FIELD_STABLE_CORE_KEYS, SIDE_EFFECT_SEMANTIC_FIELD_OPEN_PATTERN, MAX_SIDE_EFFECT_SEMANTIC_FIELD_KEY_LENGTH, SIDE_EFFECT_OMISSION_REASONS, SIDE_EFFECT_OPERATION_STATUSES, SIDE_EFFECT_OPERATION_PHASES;
15341
+ function isSideEffectScalarKey(key) {
15342
+ if (key.length > MAX_SIDE_EFFECT_SEMANTIC_FIELD_KEY_LENGTH) return false;
15343
+ return SIDE_EFFECT_SCALAR_KEY_PATTERN.test(key);
15344
+ }
15345
+ var DevApiKeySchema, AnonApiKeySchema, SessionIdSchema, BuildHashSchema, SdkDiagnosticCodeSchema, CaptureConfigSchema, SdkCachedConfigSchema, GlasstraceOptionsSchema, GlasstraceEnvVarsSchema, GLASSTRACE_ATTRIBUTE_NAMES, DEFAULT_CAPTURE_CONFIG, MAX_SOURCE_MAP_FILE_PATH_LENGTH, MAX_SOURCE_MAP_FILE_SIZE, MAX_SOURCE_MAP_FILE_COUNT, MAX_PRESIGNED_CLIENT_TOKEN_LENGTH, MAX_PRESIGNED_PATHNAME_LENGTH, ImportGraphPayloadSchema, SdkHealthReportSchema, TierLimitsSchema, SdkInitResponseSchema, DiscoveryResponseSchema, SourceMapUploadResponseSchema, PresignedUploadRequestSchema, PresignedUploadResponseSchema, SourceMapManifestRequestSchema, SourceMapManifestResponseSchema, K, SIDE_EFFECT_OPERATION_KINDS, SIDE_EFFECT_SEMANTIC_FIELD_STABLE_CORE_KEYS, SIDE_EFFECT_SEMANTIC_FIELD_OPEN_PATTERN, MAX_SIDE_EFFECT_SEMANTIC_FIELD_KEY_LENGTH, SIDE_EFFECT_OMISSION_REASONS, SIDE_EFFECT_SCALAR_KEY_PATTERN, SIDE_EFFECT_SCALAR_PREFIX, MAX_SIDE_EFFECT_SCALARS_PER_OPERATION, SIDE_EFFECT_HASHED_ID_PREFIX, SIDE_EFFECT_HASHED_ID_HEX_LENGTH, SIDE_EFFECT_OPERATION_STATUSES, SIDE_EFFECT_OPERATION_PHASES;
15342
15346
  var init_dist = __esm({
15343
15347
  "../protocol/dist/index.js"() {
15344
15348
  "use strict";
@@ -15377,7 +15381,20 @@ var init_dist = __esm({
15377
15381
  * client-side allowlist enforcement layered with the product's
15378
15382
  * storage-time filter as defense-in-depth.
15379
15383
  */
15380
- sideEffectEvidence: external_exports.boolean().optional().default(false)
15384
+ sideEffectEvidence: external_exports.boolean().optional().default(false),
15385
+ /**
15386
+ * Per-account value-fidelity capture posture (server-pushed).
15387
+ *
15388
+ * `strict` (default) is fail-closed: the SDK rejects raw wall-clock
15389
+ * timestamps and unhashed identifiers from the `scalar.*` channel at
15390
+ * emit time. `full` relaxes those rejections so raw magnitudes can be
15391
+ * surfaced — but only in conjunction with an explicit producer opt-in
15392
+ * (so a `full`-configured account still emits strict-shaped scalars
15393
+ * unless the producer also opts in). The operator owns this flag; it
15394
+ * is never derived from producer or request input. Absent on the wire
15395
+ * ⇒ `strict`.
15396
+ */
15397
+ captureFidelity: external_exports.enum(["strict", "full"]).optional().default("strict")
15381
15398
  });
15382
15399
  SdkCachedConfigSchema = external_exports.object({
15383
15400
  response: external_exports.record(external_exports.string(), external_exports.unknown()),
@@ -15568,7 +15585,13 @@ var init_dist = __esm({
15568
15585
  SIDE_EFFECT_OMITTED_UNSUPPORTED_KEY: "glasstrace.side_effect.omitted.unsupported_key",
15569
15586
  SIDE_EFFECT_OMITTED_VALUE_TOO_LONG: "glasstrace.side_effect.omitted.value_too_long",
15570
15587
  SIDE_EFFECT_OMITTED_NOT_EMITTED: "glasstrace.side_effect.omitted.not_emitted",
15571
- SIDE_EFFECT_OMITTED_CAPTURE_DISABLED: "glasstrace.side_effect.omitted.capture_disabled"
15588
+ SIDE_EFFECT_OMITTED_CAPTURE_DISABLED: "glasstrace.side_effect.omitted.capture_disabled",
15589
+ // Value-fidelity scalar-channel omission reasons. Counts only; the
15590
+ // rejected raw value (timestamp, unhashed id, non-finite number) is
15591
+ // never echoed. Mirror the product omission enum verbatim.
15592
+ SIDE_EFFECT_OMITTED_RAW_TIMESTAMP: "glasstrace.side_effect.omitted.raw_timestamp",
15593
+ SIDE_EFFECT_OMITTED_UNHASHED_ID: "glasstrace.side_effect.omitted.unhashed_id",
15594
+ SIDE_EFFECT_OMITTED_NON_FINITE: "glasstrace.side_effect.omitted.non_finite"
15572
15595
  };
15573
15596
  DEFAULT_CAPTURE_CONFIG = {
15574
15597
  requestBodies: false,
@@ -15578,7 +15601,8 @@ var init_dist = __esm({
15578
15601
  importGraph: false,
15579
15602
  consoleErrors: false,
15580
15603
  errorResponseBodies: false,
15581
- sideEffectEvidence: false
15604
+ sideEffectEvidence: false,
15605
+ captureFidelity: "strict"
15582
15606
  };
15583
15607
  MAX_SOURCE_MAP_FILE_PATH_LENGTH = 512;
15584
15608
  MAX_SOURCE_MAP_FILE_SIZE = 50 * 1024 * 1024;
@@ -15784,7 +15808,7 @@ var init_dist = __esm({
15784
15808
  "status",
15785
15809
  "phase"
15786
15810
  ];
15787
- SIDE_EFFECT_SEMANTIC_FIELD_OPEN_PATTERN = /^[a-z][A-Za-z0-9]*(Class|Count|Kind|Role)$/;
15811
+ SIDE_EFFECT_SEMANTIC_FIELD_OPEN_PATTERN = /^[a-z][A-Za-z0-9]*(Class|Count|Kind|Role|Holds)$/;
15788
15812
  MAX_SIDE_EFFECT_SEMANTIC_FIELD_KEY_LENGTH = 80;
15789
15813
  SIDE_EFFECT_OMISSION_REASONS = [
15790
15814
  "pii",
@@ -15793,8 +15817,28 @@ var init_dist = __esm({
15793
15817
  "unsupported_key",
15794
15818
  "value_too_long",
15795
15819
  "not_emitted",
15796
- "capture_disabled"
15820
+ "capture_disabled",
15821
+ // Value-fidelity scalar channel reasons. A scalar is dropped under
15822
+ // `raw_timestamp` when a wall-clock value (a `Date` instance, or a
15823
+ // numeric epoch on a `*Ms` key) is rejected in favor of a bounded
15824
+ // delta; `unhashed_id` when an `*Id` scalar is not the `gthid_<hex>`
15825
+ // output of `hashId`; `non_finite` when a number is NaN/±Infinity.
15826
+ // (A type-mismatched value — e.g. a date *string* on a numeric key —
15827
+ // is dropped under `raw_payload`, not `raw_timestamp`, since the
15828
+ // scalar channel only carries native numbers/booleans plus `gthid_`
15829
+ // ids.) These mirror the product `SideEffectOmissionReasonSchema`
15830
+ // tuple verbatim (hand-maintained on both sides; see @drift-check
15831
+ // above). `non_finite` is SDK-emit-time only — JSON cannot carry
15832
+ // NaN/Infinity to the wire.
15833
+ "raw_timestamp",
15834
+ "unhashed_id",
15835
+ "non_finite"
15797
15836
  ];
15837
+ SIDE_EFFECT_SCALAR_KEY_PATTERN = /^[a-z][A-Za-z0-9]*(Ms|Amount|Bytes|Ratio|Id|Value|Flag)$/;
15838
+ SIDE_EFFECT_SCALAR_PREFIX = "glasstrace.side_effect.scalar.";
15839
+ MAX_SIDE_EFFECT_SCALARS_PER_OPERATION = 16;
15840
+ SIDE_EFFECT_HASHED_ID_PREFIX = "gthid_";
15841
+ SIDE_EFFECT_HASHED_ID_HEX_LENGTH = 32;
15798
15842
  SIDE_EFFECT_OPERATION_STATUSES = [
15799
15843
  "scheduled",
15800
15844
  "started",
@@ -17886,7 +17930,9 @@ __export(src_exports, {
17886
17930
  getOrCreateAnonKey: () => getOrCreateAnonKey,
17887
17931
  getOrigin: () => getOrigin,
17888
17932
  getStatus: () => getStatus,
17933
+ invariant: () => invariant,
17889
17934
  isAnonymousMode: () => isAnonymousMode,
17935
+ isNullInvariant: () => isNullInvariant,
17890
17936
  isProductionDisabled: () => isProductionDisabled,
17891
17937
  isReady: () => isReady,
17892
17938
  isSideEffectSemanticFieldKey: () => isSideEffectSemanticFieldKey,
@@ -24090,6 +24136,9 @@ function registerHeartbeatShutdownHook(config2, anonKey, sdkVersion) {
24090
24136
  });
24091
24137
  }
24092
24138
 
24139
+ // src/side-effect/index.ts
24140
+ init_dist();
24141
+
24093
24142
  // src/side-effect/allowlist.ts
24094
24143
  init_dist();
24095
24144
  var MAX_SIDE_EFFECT_OPERATION_LABEL_LENGTH = 96;
@@ -24112,6 +24161,7 @@ var TOKEN_REGEX = /^[A-Za-z0-9][A-Za-z0-9_.:-]*$/;
24112
24161
  var LOCALE_REGEX = /^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8}){0,3}$/;
24113
24162
  var TIMEZONE_REGEX = /^(?:UTC|GMT|[A-Za-z][A-Za-z0-9_+-]*(?:\/[A-Za-z0-9_+-]+){1,3})$/;
24114
24163
  var DIGIT_REGEX = /^[0-9]+$/;
24164
+ var BOOL_REGEX = /^(?:true|false)$/;
24115
24165
  var URL_SCHEME = /:\/\//;
24116
24166
  var URL_SCHEME_RELATIVE = /^\/\//;
24117
24167
  var EMAIL_LIKE = /[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/i;
@@ -24146,6 +24196,9 @@ function passesFieldValidator(key, value) {
24146
24196
  if (typeof key === "string" && key.endsWith("Count")) {
24147
24197
  return DIGIT_REGEX.test(value);
24148
24198
  }
24199
+ if (typeof key === "string" && key.endsWith("Holds")) {
24200
+ return BOOL_REGEX.test(value);
24201
+ }
24149
24202
  return TOKEN_REGEX.test(value);
24150
24203
  }
24151
24204
  function checkOperationLabel(value) {
@@ -24181,6 +24234,59 @@ function checkSemanticFieldValue(key, value) {
24181
24234
  }
24182
24235
  return { accepted: true, value };
24183
24236
  }
24237
+ var GTHID_STRICT_REGEX = new RegExp(
24238
+ `^${SIDE_EFFECT_HASHED_ID_PREFIX}[0-9a-f]{${SIDE_EFFECT_HASHED_ID_HEX_LENGTH}}$`
24239
+ );
24240
+ var SCALAR_EPOCH_MS_MIN = 1e12;
24241
+ function isTimestampShapedScalarKey(key) {
24242
+ return key.endsWith("Ms");
24243
+ }
24244
+ function checkScalarField(key, value, mode = "strict") {
24245
+ if (typeof key !== "string" || !isSideEffectScalarKey(key)) {
24246
+ return { accepted: false, reason: "unsupported_key" };
24247
+ }
24248
+ if (value instanceof Date) {
24249
+ return { accepted: false, reason: "raw_timestamp" };
24250
+ }
24251
+ if (key.endsWith("Id")) {
24252
+ if (typeof value !== "string") {
24253
+ return { accepted: false, reason: "unhashed_id" };
24254
+ }
24255
+ if (mode === "strict") {
24256
+ if (!GTHID_STRICT_REGEX.test(value)) {
24257
+ return { accepted: false, reason: "unhashed_id" };
24258
+ }
24259
+ return { accepted: true, value };
24260
+ }
24261
+ if (value.length === 0) {
24262
+ return { accepted: false, reason: "raw_payload" };
24263
+ }
24264
+ const unsafe = detectUnsafePattern(value);
24265
+ if (unsafe) {
24266
+ return { accepted: false, reason: unsafe };
24267
+ }
24268
+ if (value.length > MAX_SIDE_EFFECT_FIELD_VALUE_LENGTH) {
24269
+ return { accepted: false, reason: "value_too_long" };
24270
+ }
24271
+ return { accepted: true, value };
24272
+ }
24273
+ if (key.endsWith("Flag")) {
24274
+ if (typeof value !== "boolean") {
24275
+ return { accepted: false, reason: "raw_payload" };
24276
+ }
24277
+ return { accepted: true, value };
24278
+ }
24279
+ if (typeof value !== "number") {
24280
+ return { accepted: false, reason: "raw_payload" };
24281
+ }
24282
+ if (!Number.isFinite(value)) {
24283
+ return { accepted: false, reason: "non_finite" };
24284
+ }
24285
+ if (mode === "strict" && isTimestampShapedScalarKey(key) && value >= SCALAR_EPOCH_MS_MIN) {
24286
+ return { accepted: false, reason: "raw_timestamp" };
24287
+ }
24288
+ return { accepted: true, value };
24289
+ }
24184
24290
  function checkSemanticFieldKey(key) {
24185
24291
  return typeof key === "string" && isSideEffectSemanticFieldKey(key);
24186
24292
  }
@@ -24246,7 +24352,10 @@ var OMISSION_ATTRIBUTE_BY_REASON = {
24246
24352
  unsupported_key: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_OMITTED_UNSUPPORTED_KEY,
24247
24353
  value_too_long: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_OMITTED_VALUE_TOO_LONG,
24248
24354
  not_emitted: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_OMITTED_NOT_EMITTED,
24249
- capture_disabled: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_OMITTED_CAPTURE_DISABLED
24355
+ capture_disabled: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_OMITTED_CAPTURE_DISABLED,
24356
+ raw_timestamp: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_OMITTED_RAW_TIMESTAMP,
24357
+ unhashed_id: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_OMITTED_UNHASHED_ID,
24358
+ non_finite: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_OMITTED_NON_FINITE
24250
24359
  };
24251
24360
  var FIELD_ATTRIBUTE_BY_KEY = {
24252
24361
  templateKey: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_FIELD_TEMPLATE_KEY,
@@ -24305,6 +24414,12 @@ function attachField(span, key, value) {
24305
24414
  } catch {
24306
24415
  }
24307
24416
  }
24417
+ function attachScalar(span, key, value) {
24418
+ try {
24419
+ span.setAttribute(`${SIDE_EFFECT_SCALAR_PREFIX}${key}`, value);
24420
+ } catch {
24421
+ }
24422
+ }
24308
24423
  function recordOmission(span, reason) {
24309
24424
  recordOmissionOnSpan(span, reason);
24310
24425
  }
@@ -24415,6 +24530,7 @@ function runRecordSideEffect(input) {
24415
24530
  recordOmission(outcome.span, "value_too_long");
24416
24531
  return;
24417
24532
  }
24533
+ const attachedFieldKeys = /* @__PURE__ */ new Set();
24418
24534
  const fields = candidate.fields;
24419
24535
  if (fields && typeof fields === "object") {
24420
24536
  for (const [rawKey, rawValue] of Object.entries(fields)) {
@@ -24433,6 +24549,56 @@ function runRecordSideEffect(input) {
24433
24549
  } catch {
24434
24550
  }
24435
24551
  attachField(outcome.span, rawKey, valueOutcome.value);
24552
+ attachedFieldKeys.add(rawKey);
24553
+ }
24554
+ }
24555
+ const relations = candidate.relations;
24556
+ if (relations && typeof relations === "object") {
24557
+ for (const [rawKey, rawValue] of Object.entries(relations)) {
24558
+ if (attachedFieldKeys.has(rawKey)) {
24559
+ recordOmission(outcome.span, "unsupported_key");
24560
+ continue;
24561
+ }
24562
+ if (!rawKey.endsWith("Holds") || !checkSemanticFieldKey(rawKey)) {
24563
+ recordOmission(outcome.span, "unsupported_key");
24564
+ continue;
24565
+ }
24566
+ if (typeof rawValue !== "boolean") {
24567
+ recordOmission(outcome.span, "raw_payload");
24568
+ continue;
24569
+ }
24570
+ const valueOutcome = checkSemanticFieldValue(
24571
+ rawKey,
24572
+ rawValue ? "true" : "false"
24573
+ );
24574
+ if (!valueOutcome.accepted) {
24575
+ recordOmission(outcome.span, valueOutcome.reason);
24576
+ continue;
24577
+ }
24578
+ try {
24579
+ maybeWarnMixedCasing(rawKey, valueOutcome.value);
24580
+ maybeWarnPatternKeyProliferation(rawKey);
24581
+ } catch {
24582
+ }
24583
+ attachField(outcome.span, rawKey, valueOutcome.value);
24584
+ attachedFieldKeys.add(rawKey);
24585
+ }
24586
+ }
24587
+ const scalars = candidate.scalars;
24588
+ if (scalars && typeof scalars === "object") {
24589
+ let scalarCount = 0;
24590
+ for (const [rawKey, rawValue] of Object.entries(scalars)) {
24591
+ if (scalarCount >= MAX_SIDE_EFFECT_SCALARS_PER_OPERATION) {
24592
+ recordOmission(outcome.span, "value_too_long");
24593
+ break;
24594
+ }
24595
+ scalarCount += 1;
24596
+ const scalarOutcome = checkScalarField(rawKey, rawValue);
24597
+ if (!scalarOutcome.accepted) {
24598
+ recordOmission(outcome.span, scalarOutcome.reason);
24599
+ continue;
24600
+ }
24601
+ attachScalar(outcome.span, rawKey, scalarOutcome.value);
24436
24602
  }
24437
24603
  }
24438
24604
  }
@@ -24737,11 +24903,11 @@ function registerGlasstrace(options) {
24737
24903
  setCoreState(CoreState.REGISTERING);
24738
24904
  maybeWarnStaleAgentInstructions({
24739
24905
  projectRoot: process.cwd(),
24740
- sdkVersion: "1.15.1"
24906
+ sdkVersion: "1.17.0"
24741
24907
  });
24742
24908
  startRuntimeStateWriter({
24743
24909
  projectRoot: process.cwd(),
24744
- sdkVersion: "1.15.1"
24910
+ sdkVersion: "1.17.0"
24745
24911
  });
24746
24912
  const config2 = resolveConfig(options);
24747
24913
  setSideEffectVerboseFlag(config2.verbose);
@@ -24909,8 +25075,8 @@ async function backgroundInit(config2, anonKeyForInit, generation) {
24909
25075
  if (config2.verbose) {
24910
25076
  console.info("[glasstrace] Background init firing.");
24911
25077
  }
24912
- const healthReport = collectHealthReport("1.15.1");
24913
- const initResult = await performInit(config2, anonKeyForInit, "1.15.1", healthReport);
25078
+ const healthReport = collectHealthReport("1.17.0");
25079
+ const initResult = await performInit(config2, anonKeyForInit, "1.17.0", healthReport);
24914
25080
  if (generation !== registrationGeneration) return;
24915
25081
  const currentState = getCoreState();
24916
25082
  if (currentState === CoreState.SHUTTING_DOWN || currentState === CoreState.SHUTDOWN) {
@@ -24933,7 +25099,7 @@ async function backgroundInit(config2, anonKeyForInit, generation) {
24933
25099
  }
24934
25100
  maybeInstallConsoleCapture();
24935
25101
  if (didLastInitSucceed()) {
24936
- startHeartbeat(config2, anonKeyForInit, "1.15.1", generation, (newApiKey, accountId) => {
25102
+ startHeartbeat(config2, anonKeyForInit, "1.17.0", generation, (newApiKey, accountId) => {
24937
25103
  setAuthState(AuthState.CLAIMING);
24938
25104
  emitLifecycleEvent("auth:claim_started", { accountId });
24939
25105
  setResolvedApiKey(newApiKey);
@@ -25226,6 +25392,29 @@ function firstToken(value) {
25226
25392
  return void 0;
25227
25393
  }
25228
25394
 
25395
+ // src/side-effect/invariant.ts
25396
+ function invariant(left, op, right) {
25397
+ switch (op) {
25398
+ case "eq":
25399
+ return left === right;
25400
+ case "neq":
25401
+ return left !== right;
25402
+ case "lt":
25403
+ return left < right;
25404
+ case "lte":
25405
+ return left <= right;
25406
+ case "gt":
25407
+ return left > right;
25408
+ case "gte":
25409
+ return left >= right;
25410
+ }
25411
+ op;
25412
+ return false;
25413
+ }
25414
+ function isNullInvariant(value) {
25415
+ return value === null || value === void 0;
25416
+ }
25417
+
25229
25418
  // src/index.ts
25230
25419
  init_dist();
25231
25420
  // Annotate the CommonJS export names for ESM import in node:
@@ -25246,7 +25435,9 @@ init_dist();
25246
25435
  getOrCreateAnonKey,
25247
25436
  getOrigin,
25248
25437
  getStatus,
25438
+ invariant,
25249
25439
  isAnonymousMode,
25440
+ isNullInvariant,
25250
25441
  isProductionDisabled,
25251
25442
  isReady,
25252
25443
  isSideEffectSemanticFieldKey,