@glasstrace/sdk 1.3.2 → 1.3.3

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 (49) hide show
  1. package/README.md +38 -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-XNKG4WNQ.js} +30 -14
  13. package/dist/chunk-XNKG4WNQ.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 +123 -68
  31. package/dist/index.cjs.map +1 -1
  32. package/dist/index.js +6 -6
  33. package/dist/node-entry.cjs +123 -68
  34. package/dist/node-entry.cjs.map +1 -1
  35. package/dist/node-entry.js +8 -8
  36. package/dist/node-subpath.cjs +49 -11
  37. package/dist/node-subpath.cjs.map +1 -1
  38. package/dist/node-subpath.js +4 -4
  39. package/dist/{source-map-uploader-LACAGKIW.js → source-map-uploader-JAD3XM4F.js} +4 -4
  40. package/package.json +1 -1
  41. package/dist/chunk-3TU62WD6.js.map +0 -1
  42. package/dist/chunk-DQGNUENK.js.map +0 -1
  43. package/dist/chunk-REEU6CNO.js.map +0 -1
  44. package/dist/chunk-UFZEISZB.js.map +0 -1
  45. /package/dist/{chunk-XS3BO7RY.js.map → chunk-BQKPRFLF.js.map} +0 -0
  46. /package/dist/{chunk-GCFOY7T2.js.map → chunk-E62DL2H4.js.map} +0 -0
  47. /package/dist/{chunk-JFR42QG5.js.map → chunk-QJVAKVQJ.js.map} +0 -0
  48. /package/dist/{chunk-CRM3EYOL.js.map → chunk-WKOQJCFN.js.map} +0 -0
  49. /package/dist/{source-map-uploader-LACAGKIW.js.map → source-map-uploader-JAD3XM4F.js.map} +0 -0
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-XNKG4WNQ.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
 
@@ -22599,7 +22654,7 @@ function registerGlasstrace(options) {
22599
22654
  setCoreState(CoreState.REGISTERING);
22600
22655
  startRuntimeStateWriter({
22601
22656
  projectRoot: process.cwd(),
22602
- sdkVersion: "1.3.2"
22657
+ sdkVersion: "1.3.3"
22603
22658
  });
22604
22659
  const config2 = resolveConfig(options);
22605
22660
  if (config2.verbose) {
@@ -22765,8 +22820,8 @@ async function backgroundInit(config2, anonKeyForInit, generation) {
22765
22820
  if (config2.verbose) {
22766
22821
  console.info("[glasstrace] Background init firing.");
22767
22822
  }
22768
- const healthReport = collectHealthReport("1.3.2");
22769
- const initResult = await performInit(config2, anonKeyForInit, "1.3.2", healthReport);
22823
+ const healthReport = collectHealthReport("1.3.3");
22824
+ const initResult = await performInit(config2, anonKeyForInit, "1.3.3", healthReport);
22770
22825
  if (generation !== registrationGeneration) return;
22771
22826
  const currentState = getCoreState();
22772
22827
  if (currentState === CoreState.SHUTTING_DOWN || currentState === CoreState.SHUTDOWN) {
@@ -22789,7 +22844,7 @@ async function backgroundInit(config2, anonKeyForInit, generation) {
22789
22844
  }
22790
22845
  maybeInstallConsoleCapture();
22791
22846
  if (didLastInitSucceed()) {
22792
- startHeartbeat(config2, anonKeyForInit, "1.3.2", generation, (newApiKey, accountId) => {
22847
+ startHeartbeat(config2, anonKeyForInit, "1.3.3", generation, (newApiKey, accountId) => {
22793
22848
  setAuthState(AuthState.CLAIMING);
22794
22849
  emitLifecycleEvent("auth:claim_started", { accountId });
22795
22850
  setResolvedApiKey(newApiKey);
@@ -22951,8 +23006,8 @@ init_dist();
22951
23006
  init_error_nudge();
22952
23007
 
22953
23008
  // 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*$/;
23009
+ var PAREN_FRAME = /^\s*at\s+(?!eval\s+\(eval\s+at\b)(?:[^()]+\s+)?\(([^()\s]+(?:\([A-Za-z0-9_.-]+\)[^()\s]*)*):(\d+):(\d+)\)\s*$/;
23010
+ var BARE_FRAME = /^\s*at\s+(?:async\s+)?([^()\s]+(?:\([A-Za-z0-9_.-]+\)[^()\s]*)*):(\d+):(\d+)\s*$/;
22956
23011
  var INTERNAL_FRAME_PATTERNS = [
22957
23012
  /^node:/,
22958
23013
  /^node:internal\//,