@glasstrace/sdk 1.15.1 → 1.16.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 (74) hide show
  1. package/README.md +74 -8
  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-F7A3QXCT.js → chunk-774XIOZG.js} +2 -2
  8. package/dist/{chunk-VMK2G6QR.js → chunk-AFTCLH77.js} +2 -2
  9. package/dist/{chunk-XMD5OYD6.js → chunk-BGJKEFBN.js} +2 -2
  10. package/dist/{chunk-LQZRGBN5.js → chunk-DW3CZDS6.js} +2 -2
  11. package/dist/{chunk-T4ETJJSK.js → chunk-EWW3TZ52.js} +95 -11
  12. package/dist/{chunk-T4ETJJSK.js.map → chunk-EWW3TZ52.js.map} +1 -1
  13. package/dist/{chunk-7LE2O4ZJ.js → chunk-GBVMPMVV.js} +54 -5
  14. package/dist/{chunk-7LE2O4ZJ.js.map → chunk-GBVMPMVV.js.map} +1 -1
  15. package/dist/{chunk-HMEHYSTS.js → chunk-KM4UNN3Q.js} +2 -2
  16. package/dist/{chunk-MP3QNDXQ.js → chunk-OHSX224U.js} +2 -2
  17. package/dist/{chunk-6ST4QV7T.js → chunk-T7B752NF.js} +3 -3
  18. package/dist/{chunk-ZIYT2Y4B.js → chunk-WOYJAG7H.js} +3 -3
  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 +137 -11
  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 +28 -4
  45. package/dist/index.d.ts +28 -4
  46. package/dist/index.js +5 -5
  47. package/dist/middleware/index.cjs +21 -2
  48. package/dist/middleware/index.cjs.map +1 -1
  49. package/dist/middleware/index.js +2 -2
  50. package/dist/node-entry.cjs +28 -8
  51. package/dist/node-entry.cjs.map +1 -1
  52. package/dist/node-entry.d.cts +4 -4
  53. package/dist/node-entry.d.ts +4 -4
  54. package/dist/node-entry.js +7 -7
  55. package/dist/node-subpath.cjs +27 -1
  56. package/dist/node-subpath.cjs.map +1 -1
  57. package/dist/node-subpath.d.cts +51 -235
  58. package/dist/node-subpath.d.ts +51 -235
  59. package/dist/node-subpath.js +16 -3
  60. package/dist/node-subpath.js.map +1 -1
  61. package/dist/{source-map-uploader-NUONOEJG.js → source-map-uploader-UJPZCUFN.js} +3 -3
  62. package/dist/trpc/index.cjs +21 -2
  63. package/dist/trpc/index.cjs.map +1 -1
  64. package/dist/trpc/index.js +1 -1
  65. package/package.json +1 -1
  66. /package/dist/{chunk-F7A3QXCT.js.map → chunk-774XIOZG.js.map} +0 -0
  67. /package/dist/{chunk-VMK2G6QR.js.map → chunk-AFTCLH77.js.map} +0 -0
  68. /package/dist/{chunk-XMD5OYD6.js.map → chunk-BGJKEFBN.js.map} +0 -0
  69. /package/dist/{chunk-LQZRGBN5.js.map → chunk-DW3CZDS6.js.map} +0 -0
  70. /package/dist/{chunk-HMEHYSTS.js.map → chunk-KM4UNN3Q.js.map} +0 -0
  71. /package/dist/{chunk-MP3QNDXQ.js.map → chunk-OHSX224U.js.map} +0 -0
  72. /package/dist/{chunk-6ST4QV7T.js.map → chunk-T7B752NF.js.map} +0 -0
  73. /package/dist/{chunk-ZIYT2Y4B.js.map → chunk-WOYJAG7H.js.map} +0 -0
  74. /package/dist/{source-map-uploader-NUONOEJG.js.map → source-map-uploader-UJPZCUFN.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;
@@ -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",
@@ -24090,6 +24134,9 @@ function registerHeartbeatShutdownHook(config2, anonKey, sdkVersion) {
24090
24134
  });
24091
24135
  }
24092
24136
 
24137
+ // src/side-effect/index.ts
24138
+ init_dist();
24139
+
24093
24140
  // src/side-effect/allowlist.ts
24094
24141
  init_dist();
24095
24142
  var MAX_SIDE_EFFECT_OPERATION_LABEL_LENGTH = 96;
@@ -24181,6 +24228,59 @@ function checkSemanticFieldValue(key, value) {
24181
24228
  }
24182
24229
  return { accepted: true, value };
24183
24230
  }
24231
+ var GTHID_STRICT_REGEX = new RegExp(
24232
+ `^${SIDE_EFFECT_HASHED_ID_PREFIX}[0-9a-f]{${SIDE_EFFECT_HASHED_ID_HEX_LENGTH}}$`
24233
+ );
24234
+ var SCALAR_EPOCH_MS_MIN = 1e12;
24235
+ function isTimestampShapedScalarKey(key) {
24236
+ return key.endsWith("Ms");
24237
+ }
24238
+ function checkScalarField(key, value, mode = "strict") {
24239
+ if (typeof key !== "string" || !isSideEffectScalarKey(key)) {
24240
+ return { accepted: false, reason: "unsupported_key" };
24241
+ }
24242
+ if (value instanceof Date) {
24243
+ return { accepted: false, reason: "raw_timestamp" };
24244
+ }
24245
+ if (key.endsWith("Id")) {
24246
+ if (typeof value !== "string") {
24247
+ return { accepted: false, reason: "unhashed_id" };
24248
+ }
24249
+ if (mode === "strict") {
24250
+ if (!GTHID_STRICT_REGEX.test(value)) {
24251
+ return { accepted: false, reason: "unhashed_id" };
24252
+ }
24253
+ return { accepted: true, value };
24254
+ }
24255
+ if (value.length === 0) {
24256
+ return { accepted: false, reason: "raw_payload" };
24257
+ }
24258
+ const unsafe = detectUnsafePattern(value);
24259
+ if (unsafe) {
24260
+ return { accepted: false, reason: unsafe };
24261
+ }
24262
+ if (value.length > MAX_SIDE_EFFECT_FIELD_VALUE_LENGTH) {
24263
+ return { accepted: false, reason: "value_too_long" };
24264
+ }
24265
+ return { accepted: true, value };
24266
+ }
24267
+ if (key.endsWith("Flag")) {
24268
+ if (typeof value !== "boolean") {
24269
+ return { accepted: false, reason: "raw_payload" };
24270
+ }
24271
+ return { accepted: true, value };
24272
+ }
24273
+ if (typeof value !== "number") {
24274
+ return { accepted: false, reason: "raw_payload" };
24275
+ }
24276
+ if (!Number.isFinite(value)) {
24277
+ return { accepted: false, reason: "non_finite" };
24278
+ }
24279
+ if (mode === "strict" && isTimestampShapedScalarKey(key) && value >= SCALAR_EPOCH_MS_MIN) {
24280
+ return { accepted: false, reason: "raw_timestamp" };
24281
+ }
24282
+ return { accepted: true, value };
24283
+ }
24184
24284
  function checkSemanticFieldKey(key) {
24185
24285
  return typeof key === "string" && isSideEffectSemanticFieldKey(key);
24186
24286
  }
@@ -24246,7 +24346,10 @@ var OMISSION_ATTRIBUTE_BY_REASON = {
24246
24346
  unsupported_key: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_OMITTED_UNSUPPORTED_KEY,
24247
24347
  value_too_long: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_OMITTED_VALUE_TOO_LONG,
24248
24348
  not_emitted: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_OMITTED_NOT_EMITTED,
24249
- capture_disabled: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_OMITTED_CAPTURE_DISABLED
24349
+ capture_disabled: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_OMITTED_CAPTURE_DISABLED,
24350
+ raw_timestamp: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_OMITTED_RAW_TIMESTAMP,
24351
+ unhashed_id: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_OMITTED_UNHASHED_ID,
24352
+ non_finite: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_OMITTED_NON_FINITE
24250
24353
  };
24251
24354
  var FIELD_ATTRIBUTE_BY_KEY = {
24252
24355
  templateKey: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_FIELD_TEMPLATE_KEY,
@@ -24305,6 +24408,12 @@ function attachField(span, key, value) {
24305
24408
  } catch {
24306
24409
  }
24307
24410
  }
24411
+ function attachScalar(span, key, value) {
24412
+ try {
24413
+ span.setAttribute(`${SIDE_EFFECT_SCALAR_PREFIX}${key}`, value);
24414
+ } catch {
24415
+ }
24416
+ }
24308
24417
  function recordOmission(span, reason) {
24309
24418
  recordOmissionOnSpan(span, reason);
24310
24419
  }
@@ -24435,6 +24544,23 @@ function runRecordSideEffect(input) {
24435
24544
  attachField(outcome.span, rawKey, valueOutcome.value);
24436
24545
  }
24437
24546
  }
24547
+ const scalars = candidate.scalars;
24548
+ if (scalars && typeof scalars === "object") {
24549
+ let scalarCount = 0;
24550
+ for (const [rawKey, rawValue] of Object.entries(scalars)) {
24551
+ if (scalarCount >= MAX_SIDE_EFFECT_SCALARS_PER_OPERATION) {
24552
+ recordOmission(outcome.span, "value_too_long");
24553
+ break;
24554
+ }
24555
+ scalarCount += 1;
24556
+ const scalarOutcome = checkScalarField(rawKey, rawValue);
24557
+ if (!scalarOutcome.accepted) {
24558
+ recordOmission(outcome.span, scalarOutcome.reason);
24559
+ continue;
24560
+ }
24561
+ attachScalar(outcome.span, rawKey, scalarOutcome.value);
24562
+ }
24563
+ }
24438
24564
  }
24439
24565
 
24440
24566
  // src/runtime-state.ts
@@ -24737,11 +24863,11 @@ function registerGlasstrace(options) {
24737
24863
  setCoreState(CoreState.REGISTERING);
24738
24864
  maybeWarnStaleAgentInstructions({
24739
24865
  projectRoot: process.cwd(),
24740
- sdkVersion: "1.15.1"
24866
+ sdkVersion: "1.16.0"
24741
24867
  });
24742
24868
  startRuntimeStateWriter({
24743
24869
  projectRoot: process.cwd(),
24744
- sdkVersion: "1.15.1"
24870
+ sdkVersion: "1.16.0"
24745
24871
  });
24746
24872
  const config2 = resolveConfig(options);
24747
24873
  setSideEffectVerboseFlag(config2.verbose);
@@ -24909,8 +25035,8 @@ async function backgroundInit(config2, anonKeyForInit, generation) {
24909
25035
  if (config2.verbose) {
24910
25036
  console.info("[glasstrace] Background init firing.");
24911
25037
  }
24912
- const healthReport = collectHealthReport("1.15.1");
24913
- const initResult = await performInit(config2, anonKeyForInit, "1.15.1", healthReport);
25038
+ const healthReport = collectHealthReport("1.16.0");
25039
+ const initResult = await performInit(config2, anonKeyForInit, "1.16.0", healthReport);
24914
25040
  if (generation !== registrationGeneration) return;
24915
25041
  const currentState = getCoreState();
24916
25042
  if (currentState === CoreState.SHUTTING_DOWN || currentState === CoreState.SHUTDOWN) {
@@ -24933,7 +25059,7 @@ async function backgroundInit(config2, anonKeyForInit, generation) {
24933
25059
  }
24934
25060
  maybeInstallConsoleCapture();
24935
25061
  if (didLastInitSucceed()) {
24936
- startHeartbeat(config2, anonKeyForInit, "1.15.1", generation, (newApiKey, accountId) => {
25062
+ startHeartbeat(config2, anonKeyForInit, "1.16.0", generation, (newApiKey, accountId) => {
24937
25063
  setAuthState(AuthState.CLAIMING);
24938
25064
  emitLifecycleEvent("auth:claim_started", { accountId });
24939
25065
  setResolvedApiKey(newApiKey);