@glasstrace/sdk 1.3.2 → 1.3.4

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 (51) hide show
  1. package/README.md +126 -0
  2. package/dist/{chunk-REEU6CNO.js → chunk-3HWBR7XM.js} +3 -3
  3. package/dist/chunk-3HWBR7XM.js.map +1 -0
  4. package/dist/{chunk-XS3BO7RY.js → chunk-BQKPRFLF.js} +3 -3
  5. package/dist/{chunk-GCFOY7T2.js → chunk-E62DL2H4.js} +3 -3
  6. package/dist/{chunk-UFZEISZB.js → chunk-LQKJ27LO.js} +2 -2
  7. package/dist/chunk-LQKJ27LO.js.map +1 -0
  8. package/dist/{chunk-MQHLWSIX.js → chunk-M4ZI7J3N.js} +100 -62
  9. package/dist/{chunk-MQHLWSIX.js.map → chunk-M4ZI7J3N.js.map} +1 -1
  10. package/dist/{chunk-JFR42QG5.js → chunk-QJVAKVQJ.js} +2 -2
  11. package/dist/{chunk-CRM3EYOL.js → chunk-WKOQJCFN.js} +2 -2
  12. package/dist/{chunk-DQGNUENK.js → chunk-XFNK4YEW.js} +58 -16
  13. package/dist/chunk-XFNK4YEW.js.map +1 -0
  14. package/dist/{chunk-3TU62WD6.js → chunk-YG3X7TUI.js} +1 -1
  15. package/dist/chunk-YG3X7TUI.js.map +1 -0
  16. package/dist/cli/init.cjs +51 -13
  17. package/dist/cli/init.cjs.map +1 -1
  18. package/dist/cli/init.js +6 -6
  19. package/dist/cli/mcp-add.cjs +49 -11
  20. package/dist/cli/mcp-add.cjs.map +1 -1
  21. package/dist/cli/mcp-add.js +2 -2
  22. package/dist/cli/uninit.cjs.map +1 -1
  23. package/dist/cli/uninit.js +3 -3
  24. package/dist/cli/validate.cjs +49 -11
  25. package/dist/cli/validate.cjs.map +1 -1
  26. package/dist/cli/validate.js +2 -2
  27. package/dist/edge-entry.cjs +88 -50
  28. package/dist/edge-entry.cjs.map +1 -1
  29. package/dist/edge-entry.js +2 -2
  30. package/dist/index.cjs +151 -70
  31. package/dist/index.cjs.map +1 -1
  32. package/dist/index.d.cts +19 -0
  33. package/dist/index.d.ts +19 -0
  34. package/dist/index.js +6 -6
  35. package/dist/node-entry.cjs +151 -70
  36. package/dist/node-entry.cjs.map +1 -1
  37. package/dist/node-entry.js +8 -8
  38. package/dist/node-subpath.cjs +49 -11
  39. package/dist/node-subpath.cjs.map +1 -1
  40. package/dist/node-subpath.js +4 -4
  41. package/dist/{source-map-uploader-LACAGKIW.js → source-map-uploader-JAD3XM4F.js} +4 -4
  42. package/package.json +1 -1
  43. package/dist/chunk-3TU62WD6.js.map +0 -1
  44. package/dist/chunk-DQGNUENK.js.map +0 -1
  45. package/dist/chunk-REEU6CNO.js.map +0 -1
  46. package/dist/chunk-UFZEISZB.js.map +0 -1
  47. /package/dist/{chunk-XS3BO7RY.js.map → chunk-BQKPRFLF.js.map} +0 -0
  48. /package/dist/{chunk-GCFOY7T2.js.map → chunk-E62DL2H4.js.map} +0 -0
  49. /package/dist/{chunk-JFR42QG5.js.map → chunk-QJVAKVQJ.js.map} +0 -0
  50. /package/dist/{chunk-CRM3EYOL.js.map → chunk-WKOQJCFN.js.map} +0 -0
  51. /package/dist/{source-map-uploader-LACAGKIW.js.map → source-map-uploader-JAD3XM4F.js.map} +0 -0
package/dist/index.d.cts CHANGED
@@ -351,6 +351,25 @@ declare function waitForReady(timeoutMs?: number): Promise<void>;
351
351
  /**
352
352
  * Simplified public state query for external consumers.
353
353
  * Hides implementation details like coexistence scenarios.
354
+ *
355
+ * The returned `tracing` field is the canonical user-observable signal
356
+ * for OTel coexistence outcomes:
357
+ *
358
+ * - `"active"` — the SDK owns the OTel provider and is exporting spans.
359
+ * - `"coexistence"` — another OTel provider was detected and the SDK
360
+ * either auto-attached its span processor or found one already
361
+ * present. Spans are exported through the existing pipeline.
362
+ * - `"degraded"` — the SDK is exporting but the core lifecycle entered
363
+ * `ACTIVE_DEGRADED` (e.g., a non-fatal export failure).
364
+ * - `"not-configured"` — the SDK could not configure tracing. Covers
365
+ * `OtelState.UNCONFIGURED`, `OtelState.CONFIGURING`, and
366
+ * `OtelState.COEXISTENCE_FAILED` (the DISC-1556 Next 16 production
367
+ * "auto-attach returned null" path). When the value is
368
+ * `"not-configured"` after `registerGlasstrace()` has resolved,
369
+ * spans are NOT reaching the Glasstrace exporter and the manual
370
+ * `createGlasstraceSpanProcessor()` workaround should be applied.
371
+ * See `runtime-state.json`'s `lastError` field for the structured
372
+ * failure record.
354
373
  */
355
374
  declare function getStatus(): {
356
375
  ready: boolean;
package/dist/index.d.ts CHANGED
@@ -351,6 +351,25 @@ declare function waitForReady(timeoutMs?: number): Promise<void>;
351
351
  /**
352
352
  * Simplified public state query for external consumers.
353
353
  * Hides implementation details like coexistence scenarios.
354
+ *
355
+ * The returned `tracing` field is the canonical user-observable signal
356
+ * for OTel coexistence outcomes:
357
+ *
358
+ * - `"active"` — the SDK owns the OTel provider and is exporting spans.
359
+ * - `"coexistence"` — another OTel provider was detected and the SDK
360
+ * either auto-attached its span processor or found one already
361
+ * present. Spans are exported through the existing pipeline.
362
+ * - `"degraded"` — the SDK is exporting but the core lifecycle entered
363
+ * `ACTIVE_DEGRADED` (e.g., a non-fatal export failure).
364
+ * - `"not-configured"` — the SDK could not configure tracing. Covers
365
+ * `OtelState.UNCONFIGURED`, `OtelState.CONFIGURING`, and
366
+ * `OtelState.COEXISTENCE_FAILED` (the DISC-1556 Next 16 production
367
+ * "auto-attach returned null" path). When the value is
368
+ * `"not-configured"` after `registerGlasstrace()` has resolved,
369
+ * spans are NOT reaching the Glasstrace exporter and the manual
370
+ * `createGlasstraceSpanProcessor()` workaround should be applied.
371
+ * See `runtime-state.json`'s `lastError` field for the structured
372
+ * failure record.
354
373
  */
355
374
  declare function getStatus(): {
356
375
  ready: boolean;
package/dist/index.js CHANGED
@@ -12,14 +12,14 @@ import {
12
12
  registerGlasstrace,
13
13
  waitForReady,
14
14
  withGlasstraceConfig
15
- } from "./chunk-DQGNUENK.js";
15
+ } from "./chunk-XFNK4YEW.js";
16
16
  import {
17
17
  GlasstraceSpanProcessor,
18
18
  SdkError,
19
19
  captureCorrelationId
20
- } from "./chunk-CRM3EYOL.js";
20
+ } from "./chunk-WKOQJCFN.js";
21
21
  import "./chunk-DQ25VOKK.js";
22
- import "./chunk-3TU62WD6.js";
22
+ import "./chunk-YG3X7TUI.js";
23
23
  import {
24
24
  getActiveConfig,
25
25
  getLinkedAccountId,
@@ -27,7 +27,7 @@ import {
27
27
  performInit,
28
28
  saveCachedConfig,
29
29
  sendInitRequest
30
- } from "./chunk-REEU6CNO.js";
30
+ } from "./chunk-3HWBR7XM.js";
31
31
  import {
32
32
  isAnonymousMode,
33
33
  isProductionDisabled,
@@ -37,10 +37,10 @@ import {
37
37
  import {
38
38
  getOrCreateAnonKey,
39
39
  readAnonKey
40
- } from "./chunk-UFZEISZB.js";
40
+ } from "./chunk-LQKJ27LO.js";
41
41
  import {
42
42
  deriveSessionId
43
- } from "./chunk-MQHLWSIX.js";
43
+ } from "./chunk-M4ZI7J3N.js";
44
44
  import "./chunk-NSBPE2FW.js";
45
45
  export {
46
46
  GlasstraceExporter,
@@ -14566,7 +14566,7 @@ function deriveSessionId(apiKey, origin, date5, windowIndex) {
14566
14566
  const digest = sha256Hex(input).slice(0, 16);
14567
14567
  return SessionIdSchema.parse(digest);
14568
14568
  }
14569
- var DevApiKeySchema, AnonApiKeySchema, SessionIdSchema, BuildHashSchema, SdkDiagnosticCodeSchema, CaptureConfigSchema, SdkCachedConfigSchema, GlasstraceOptionsSchema, GlasstraceEnvVarsSchema, ImportGraphPayloadSchema, SdkHealthReportSchema, TierLimitsSchema, SdkInitResponseSchema, DiscoveryResponseSchema, SourceMapUploadResponseSchema, PresignedUploadRequestSchema, PresignedUploadResponseSchema, SourceMapManifestRequestSchema, SourceMapManifestResponseSchema, GLASSTRACE_ATTRIBUTE_NAMES, DEFAULT_CAPTURE_CONFIG, K;
14569
+ 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;
14570
14570
  var init_dist = __esm({
14571
14571
  "../protocol/dist/index.js"() {
14572
14572
  "use strict";
@@ -14617,6 +14617,59 @@ var init_dist = __esm({
14617
14617
  NODE_ENV: external_exports.string().optional(),
14618
14618
  VERCEL_ENV: external_exports.string().optional()
14619
14619
  });
14620
+ GLASSTRACE_ATTRIBUTE_NAMES = {
14621
+ // Server-side attributes
14622
+ TRACE_TYPE: "glasstrace.trace.type",
14623
+ SESSION_ID: "glasstrace.session.id",
14624
+ CORRELATION_ID: "glasstrace.correlation.id",
14625
+ ENVIRONMENT: "glasstrace.environment",
14626
+ ROUTE: "glasstrace.route",
14627
+ HTTP_METHOD: "glasstrace.http.method",
14628
+ HTTP_STATUS_CODE: "glasstrace.http.status_code",
14629
+ HTTP_DURATION_MS: "glasstrace.http.duration_ms",
14630
+ ERROR_MESSAGE: "glasstrace.error.message",
14631
+ ERROR_CODE: "glasstrace.error.code",
14632
+ ERROR_CATEGORY: "glasstrace.error.category",
14633
+ ERROR_FIELD: "glasstrace.error.field",
14634
+ ORM_PROVIDER: "glasstrace.orm.provider",
14635
+ ORM_MODEL: "glasstrace.orm.model",
14636
+ ORM_OPERATION: "glasstrace.orm.operation",
14637
+ ORM_DURATION_MS: "glasstrace.orm.duration_ms",
14638
+ FETCH_URL: "glasstrace.fetch.url",
14639
+ FETCH_METHOD: "glasstrace.fetch.method",
14640
+ FETCH_STATUS_CODE: "glasstrace.fetch.status_code",
14641
+ FETCH_DURATION_MS: "glasstrace.fetch.duration_ms",
14642
+ FETCH_TARGET: "glasstrace.fetch.target",
14643
+ ENV_REFERENCED: "glasstrace.env.referenced",
14644
+ BUILD_HASH: "glasstrace.build.hash",
14645
+ SOURCE_FILE: "glasstrace.source.file",
14646
+ SOURCE_LINE: "glasstrace.source.line",
14647
+ SOURCE_MAPPED: "glasstrace.source.mapped",
14648
+ TRPC_PROCEDURE: "glasstrace.trpc.procedure",
14649
+ ERROR_RESPONSE_BODY: "glasstrace.error.response_body",
14650
+ NEXT_ACTION_DETECTED: "glasstrace.next.action.detected",
14651
+ // Client-side attributes
14652
+ PLATFORM: "glasstrace.platform",
14653
+ GESTURE_TYPE: "glasstrace.gesture.type",
14654
+ TRIGGER_TYPE: "glasstrace.trigger.type",
14655
+ ELEMENT_FINGERPRINT: "glasstrace.element.fingerprint",
14656
+ ELEMENT_CONFIDENCE: "glasstrace.element.confidence",
14657
+ TAB_ID: "glasstrace.tab.id"
14658
+ };
14659
+ DEFAULT_CAPTURE_CONFIG = {
14660
+ requestBodies: false,
14661
+ queryParamValues: false,
14662
+ envVarValues: false,
14663
+ fullConsoleOutput: false,
14664
+ importGraph: false,
14665
+ consoleErrors: false,
14666
+ errorResponseBodies: false
14667
+ };
14668
+ MAX_SOURCE_MAP_FILE_PATH_LENGTH = 512;
14669
+ MAX_SOURCE_MAP_FILE_SIZE = 50 * 1024 * 1024;
14670
+ MAX_SOURCE_MAP_FILE_COUNT = 100;
14671
+ MAX_PRESIGNED_CLIENT_TOKEN_LENGTH = 2048;
14672
+ MAX_PRESIGNED_PATHNAME_LENGTH = 1024;
14620
14673
  ImportGraphPayloadSchema = external_exports.object({
14621
14674
  buildHash: BuildHashSchema,
14622
14675
  graph: external_exports.record(external_exports.string(), external_exports.array(external_exports.string()))
@@ -14663,35 +14716,68 @@ var init_dist = __esm({
14663
14716
  buildHash: BuildHashSchema,
14664
14717
  files: external_exports.array(
14665
14718
  external_exports.object({
14666
- filePath: external_exports.string().min(1),
14667
- sizeBytes: external_exports.number().int().positive()
14719
+ filePath: external_exports.string().min(1).max(
14720
+ MAX_SOURCE_MAP_FILE_PATH_LENGTH,
14721
+ `filePath length exceeds maximum of ${MAX_SOURCE_MAP_FILE_PATH_LENGTH} characters`
14722
+ ),
14723
+ sizeBytes: external_exports.number().int().positive().max(
14724
+ MAX_SOURCE_MAP_FILE_SIZE,
14725
+ `sizeBytes exceeds maximum of ${MAX_SOURCE_MAP_FILE_SIZE} bytes (${MAX_SOURCE_MAP_FILE_SIZE / (1024 * 1024)} MiB)`
14726
+ )
14668
14727
  })
14669
- ).min(1).max(100)
14728
+ ).min(1).max(
14729
+ MAX_SOURCE_MAP_FILE_COUNT,
14730
+ `files array exceeds maximum of ${MAX_SOURCE_MAP_FILE_COUNT} entries`
14731
+ )
14670
14732
  });
14671
14733
  PresignedUploadResponseSchema = external_exports.object({
14672
14734
  uploadId: external_exports.string().uuid(),
14673
14735
  expiresAt: external_exports.number().int().nonnegative(),
14674
14736
  files: external_exports.array(
14675
14737
  external_exports.object({
14676
- filePath: external_exports.string().min(1),
14677
- clientToken: external_exports.string().min(1),
14678
- pathname: external_exports.string().min(1),
14679
- maxBytes: external_exports.number().int().positive(),
14738
+ filePath: external_exports.string().min(1).max(
14739
+ MAX_SOURCE_MAP_FILE_PATH_LENGTH,
14740
+ `filePath length exceeds maximum of ${MAX_SOURCE_MAP_FILE_PATH_LENGTH} characters`
14741
+ ),
14742
+ clientToken: external_exports.string().min(1).max(
14743
+ MAX_PRESIGNED_CLIENT_TOKEN_LENGTH,
14744
+ `clientToken length exceeds maximum of ${MAX_PRESIGNED_CLIENT_TOKEN_LENGTH} characters`
14745
+ ),
14746
+ pathname: external_exports.string().min(1).max(
14747
+ MAX_PRESIGNED_PATHNAME_LENGTH,
14748
+ `pathname length exceeds maximum of ${MAX_PRESIGNED_PATHNAME_LENGTH} characters`
14749
+ ),
14750
+ maxBytes: external_exports.number().int().positive().max(
14751
+ MAX_SOURCE_MAP_FILE_SIZE,
14752
+ `maxBytes exceeds maximum of ${MAX_SOURCE_MAP_FILE_SIZE} bytes (${MAX_SOURCE_MAP_FILE_SIZE / (1024 * 1024)} MiB)`
14753
+ ),
14680
14754
  /** Vercel Blob access mode — explicit in the contract per DISC-756. */
14681
14755
  access: external_exports.enum(["public"])
14682
14756
  })
14683
- ).min(1).max(100)
14757
+ ).min(1).max(
14758
+ MAX_SOURCE_MAP_FILE_COUNT,
14759
+ `files array exceeds maximum of ${MAX_SOURCE_MAP_FILE_COUNT} entries`
14760
+ )
14684
14761
  });
14685
14762
  SourceMapManifestRequestSchema = external_exports.object({
14686
14763
  uploadId: external_exports.string().uuid(),
14687
14764
  buildHash: BuildHashSchema,
14688
14765
  files: external_exports.array(
14689
14766
  external_exports.object({
14690
- filePath: external_exports.string().min(1),
14691
- sizeBytes: external_exports.number().int().positive(),
14767
+ filePath: external_exports.string().min(1).max(
14768
+ MAX_SOURCE_MAP_FILE_PATH_LENGTH,
14769
+ `filePath length exceeds maximum of ${MAX_SOURCE_MAP_FILE_PATH_LENGTH} characters`
14770
+ ),
14771
+ sizeBytes: external_exports.number().int().positive().max(
14772
+ MAX_SOURCE_MAP_FILE_SIZE,
14773
+ `sizeBytes exceeds maximum of ${MAX_SOURCE_MAP_FILE_SIZE} bytes (${MAX_SOURCE_MAP_FILE_SIZE / (1024 * 1024)} MiB)`
14774
+ ),
14692
14775
  blobUrl: external_exports.string().url()
14693
14776
  })
14694
- ).min(1).max(100)
14777
+ ).min(1).max(
14778
+ MAX_SOURCE_MAP_FILE_COUNT,
14779
+ `files array exceeds maximum of ${MAX_SOURCE_MAP_FILE_COUNT} entries`
14780
+ )
14695
14781
  });
14696
14782
  SourceMapManifestResponseSchema = external_exports.object({
14697
14783
  success: external_exports.literal(true),
@@ -14700,54 +14786,6 @@ var init_dist = __esm({
14700
14786
  totalSizeBytes: external_exports.number().int().nonnegative(),
14701
14787
  activatedAt: external_exports.number().int().positive()
14702
14788
  });
14703
- GLASSTRACE_ATTRIBUTE_NAMES = {
14704
- // Server-side attributes
14705
- TRACE_TYPE: "glasstrace.trace.type",
14706
- SESSION_ID: "glasstrace.session.id",
14707
- CORRELATION_ID: "glasstrace.correlation.id",
14708
- ENVIRONMENT: "glasstrace.environment",
14709
- ROUTE: "glasstrace.route",
14710
- HTTP_METHOD: "glasstrace.http.method",
14711
- HTTP_STATUS_CODE: "glasstrace.http.status_code",
14712
- HTTP_DURATION_MS: "glasstrace.http.duration_ms",
14713
- ERROR_MESSAGE: "glasstrace.error.message",
14714
- ERROR_CODE: "glasstrace.error.code",
14715
- ERROR_CATEGORY: "glasstrace.error.category",
14716
- ERROR_FIELD: "glasstrace.error.field",
14717
- ORM_PROVIDER: "glasstrace.orm.provider",
14718
- ORM_MODEL: "glasstrace.orm.model",
14719
- ORM_OPERATION: "glasstrace.orm.operation",
14720
- ORM_DURATION_MS: "glasstrace.orm.duration_ms",
14721
- FETCH_URL: "glasstrace.fetch.url",
14722
- FETCH_METHOD: "glasstrace.fetch.method",
14723
- FETCH_STATUS_CODE: "glasstrace.fetch.status_code",
14724
- FETCH_DURATION_MS: "glasstrace.fetch.duration_ms",
14725
- FETCH_TARGET: "glasstrace.fetch.target",
14726
- ENV_REFERENCED: "glasstrace.env.referenced",
14727
- BUILD_HASH: "glasstrace.build.hash",
14728
- SOURCE_FILE: "glasstrace.source.file",
14729
- SOURCE_LINE: "glasstrace.source.line",
14730
- SOURCE_MAPPED: "glasstrace.source.mapped",
14731
- TRPC_PROCEDURE: "glasstrace.trpc.procedure",
14732
- ERROR_RESPONSE_BODY: "glasstrace.error.response_body",
14733
- NEXT_ACTION_DETECTED: "glasstrace.next.action.detected",
14734
- // Client-side attributes
14735
- PLATFORM: "glasstrace.platform",
14736
- GESTURE_TYPE: "glasstrace.gesture.type",
14737
- TRIGGER_TYPE: "glasstrace.trigger.type",
14738
- ELEMENT_FINGERPRINT: "glasstrace.element.fingerprint",
14739
- ELEMENT_CONFIDENCE: "glasstrace.element.confidence",
14740
- TAB_ID: "glasstrace.tab.id"
14741
- };
14742
- DEFAULT_CAPTURE_CONFIG = {
14743
- requestBodies: false,
14744
- queryParamValues: false,
14745
- envVarValues: false,
14746
- fullConsoleOutput: false,
14747
- importGraph: false,
14748
- consoleErrors: false,
14749
- errorResponseBodies: false
14750
- };
14751
14789
  K = new Uint32Array([
14752
14790
  1116352408,
14753
14791
  1899447441,
@@ -18432,15 +18470,32 @@ function prepareErrorResponseBody(body) {
18432
18470
  }
18433
18471
 
18434
18472
  // src/build-info.ts
18473
+ init_console_capture();
18435
18474
  var UNSET = "";
18475
+ var SHA_SHAPE = /^[0-9a-f]{7,64}$/i;
18476
+ function redactBuildHash(value) {
18477
+ const sanitize2 = (s) => s.replace(/[\x00-\x1F\x7F]/g, "?");
18478
+ if (value.length <= 12) return sanitize2(value.slice(0, 4)) + "...";
18479
+ return sanitize2(value.slice(0, 8)) + "..." + sanitize2(value.slice(-4));
18480
+ }
18436
18481
  function readBuildHashFromEnv() {
18437
18482
  const raw = process.env.GLASSTRACE_BUILD_HASH;
18438
18483
  if (typeof raw !== "string") return UNSET;
18439
18484
  const trimmed = raw.trim();
18440
- return trimmed.length > 0 ? trimmed : UNSET;
18485
+ if (trimmed.length === 0) return UNSET;
18486
+ if (!SHA_SHAPE.test(trimmed)) {
18487
+ sdkLog(
18488
+ "warn",
18489
+ `[glasstrace] warning: GLASSTRACE_BUILD_HASH=${redactBuildHash(trimmed)} does not match expected SHA shape (7-64 hex characters); source-map enrichment may not work as expected.`
18490
+ );
18491
+ }
18492
+ return trimmed;
18441
18493
  }
18442
- var cachedBuildHash = readBuildHashFromEnv();
18494
+ var cachedBuildHash = null;
18443
18495
  function getBuildHash() {
18496
+ if (cachedBuildHash === null) {
18497
+ cachedBuildHash = readBuildHashFromEnv();
18498
+ }
18444
18499
  return cachedBuildHash === UNSET ? void 0 : cachedBuildHash;
18445
18500
  }
18446
18501
 
@@ -22057,9 +22112,11 @@ This message will not appear once Glasstrace is added to your provider config.`
22057
22112
  }
22058
22113
  function emitGuidanceMessage() {
22059
22114
  const isSentry = detectSentry();
22115
+ const isProduction = typeof process !== "undefined" && process.env?.NODE_ENV === "production";
22116
+ const level = isProduction ? "error" : "warn";
22060
22117
  if (isSentry) {
22061
22118
  sdkLog(
22062
- "warn",
22119
+ level,
22063
22120
  `[glasstrace] An existing OTel TracerProvider is registered but Glasstrace could not auto-attach its span processor.
22064
22121
  Add Glasstrace to your Sentry config:
22065
22122
 
@@ -22072,7 +22129,7 @@ Add Glasstrace to your Sentry config:
22072
22129
  );
22073
22130
  } else {
22074
22131
  sdkLog(
22075
- "warn",
22132
+ level,
22076
22133
  `[glasstrace] An existing OTel TracerProvider is registered but Glasstrace could not auto-attach its span processor.
22077
22134
  Add Glasstrace to your provider configuration:
22078
22135
 
@@ -22199,11 +22256,27 @@ async function runCoexistencePath(existingProvider, config2) {
22199
22256
  setOtelState(OtelState.COEXISTENCE_FAILED);
22200
22257
  emitLifecycleEvent("otel:configured", { state: OtelState.COEXISTENCE_FAILED, scenario: "C/F" });
22201
22258
  emitLifecycleEvent("otel:injection_failed", { reason: "provider internals inaccessible" });
22259
+ emitLifecycleEvent("otel:failed", {
22260
+ category: "auto-attach-returned-null",
22261
+ message: "tryAutoAttachGlasstraceProcessor returned null \u2014 the existing OTel TracerProvider exposed no injection point. Spans are not reaching the Glasstrace exporter. Apply the manual createGlasstraceSpanProcessor() workaround documented in the SDK README.",
22262
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
22263
+ providerClass: readProviderClass(existingProvider)
22264
+ });
22202
22265
  const coreState = getCoreState();
22203
22266
  if (coreState === CoreState.ACTIVE || coreState === CoreState.KEY_RESOLVED) {
22204
22267
  setCoreState(CoreState.ACTIVE_DEGRADED);
22205
22268
  }
22206
22269
  }
22270
+ function readProviderClass(tracerProvider) {
22271
+ try {
22272
+ const proxy = tracerProvider;
22273
+ const delegate = typeof proxy.getDelegate === "function" ? proxy.getDelegate() : tracerProvider;
22274
+ const name = delegate?.constructor?.name;
22275
+ return typeof name === "string" && name.length > 0 ? name : void 0;
22276
+ } catch {
22277
+ return void 0;
22278
+ }
22279
+ }
22207
22280
  async function runRegistrationPath(config2, sessionManager) {
22208
22281
  const exporterUrl = `${config2.endpoint}/v1/traces`;
22209
22282
  const createOtlpExporter = (url2, headers) => new OTLPTraceExporter({ url: url2, headers });
@@ -22506,6 +22579,7 @@ init_console_capture();
22506
22579
  var _projectRoot = null;
22507
22580
  var _sdkVersion = "unknown";
22508
22581
  var _lastScenario;
22582
+ var _lastError;
22509
22583
  var _debounceTimer = null;
22510
22584
  var _started = false;
22511
22585
  function startRuntimeStateWriter(options) {
@@ -22528,6 +22602,10 @@ function startRuntimeStateWriter(options) {
22528
22602
  _lastScenario = scenario;
22529
22603
  debouncedWrite();
22530
22604
  });
22605
+ onLifecycleEvent("otel:failed", (payload) => {
22606
+ _lastError = { ...payload };
22607
+ debouncedWrite();
22608
+ });
22531
22609
  onLifecycleEvent("auth:key_resolved", () => debouncedWrite());
22532
22610
  onLifecycleEvent("auth:claim_started", () => debouncedWrite());
22533
22611
  onLifecycleEvent("auth:claim_completed", () => debouncedWrite());
@@ -22555,6 +22633,9 @@ function writeStateNow() {
22555
22633
  auth: { state: state.auth },
22556
22634
  otel: { state: state.otel, scenario: _lastScenario }
22557
22635
  };
22636
+ if (_lastError) {
22637
+ runtimeState.lastError = _lastError;
22638
+ }
22558
22639
  const dir = (0, import_node_path.join)(_projectRoot, ".glasstrace");
22559
22640
  const filePath = (0, import_node_path.join)(dir, "runtime-state.json");
22560
22641
  (0, import_node_fs.mkdirSync)(dir, { recursive: true, mode: 448 });
@@ -22599,7 +22680,7 @@ function registerGlasstrace(options) {
22599
22680
  setCoreState(CoreState.REGISTERING);
22600
22681
  startRuntimeStateWriter({
22601
22682
  projectRoot: process.cwd(),
22602
- sdkVersion: "1.3.2"
22683
+ sdkVersion: "1.3.4"
22603
22684
  });
22604
22685
  const config2 = resolveConfig(options);
22605
22686
  if (config2.verbose) {
@@ -22765,8 +22846,8 @@ async function backgroundInit(config2, anonKeyForInit, generation) {
22765
22846
  if (config2.verbose) {
22766
22847
  console.info("[glasstrace] Background init firing.");
22767
22848
  }
22768
- const healthReport = collectHealthReport("1.3.2");
22769
- const initResult = await performInit(config2, anonKeyForInit, "1.3.2", healthReport);
22849
+ const healthReport = collectHealthReport("1.3.4");
22850
+ const initResult = await performInit(config2, anonKeyForInit, "1.3.4", healthReport);
22770
22851
  if (generation !== registrationGeneration) return;
22771
22852
  const currentState = getCoreState();
22772
22853
  if (currentState === CoreState.SHUTTING_DOWN || currentState === CoreState.SHUTDOWN) {
@@ -22789,7 +22870,7 @@ async function backgroundInit(config2, anonKeyForInit, generation) {
22789
22870
  }
22790
22871
  maybeInstallConsoleCapture();
22791
22872
  if (didLastInitSucceed()) {
22792
- startHeartbeat(config2, anonKeyForInit, "1.3.2", generation, (newApiKey, accountId) => {
22873
+ startHeartbeat(config2, anonKeyForInit, "1.3.4", generation, (newApiKey, accountId) => {
22793
22874
  setAuthState(AuthState.CLAIMING);
22794
22875
  emitLifecycleEvent("auth:claim_started", { accountId });
22795
22876
  setResolvedApiKey(newApiKey);
@@ -22951,8 +23032,8 @@ init_dist();
22951
23032
  init_error_nudge();
22952
23033
 
22953
23034
  // src/stack-frame.ts
22954
- var PAREN_FRAME = /^\s*at\s+(?:[^()]+\s+)?\(([^()\s]+):(\d+):(\d+)\)\s*$/;
22955
- var BARE_FRAME = /^\s*at\s+(?:async\s+)?([^()\s]+):(\d+):(\d+)\s*$/;
23035
+ var PAREN_FRAME = /^\s*at\s+(?!eval\s+\(eval\s+at\b)(?:[^()]+\s+)?\(([^()\s]+(?:\([A-Za-z0-9_.-]+\)[^()\s]*)*):(\d+):(\d+)\)\s*$/;
23036
+ var BARE_FRAME = /^\s*at\s+(?:async\s+)?([^()\s]+(?:\([A-Za-z0-9_.-]+\)[^()\s]*)*):(\d+):(\d+)\s*$/;
22956
23037
  var INTERNAL_FRAME_PATTERNS = [
22957
23038
  /^node:/,
22958
23039
  /^node:internal\//,