@glasstrace/sdk 1.3.1 → 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-X4IK6KES.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-USLH3OTM.js → chunk-E62DL2H4.js} +3 -3
  6. package/dist/{chunk-DW2UJUNB.js → chunk-LQKJ27LO.js} +11 -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-5PFPEA4C.js → chunk-XNKG4WNQ.js} +35 -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 +135 -68
  31. package/dist/index.cjs.map +1 -1
  32. package/dist/index.js +6 -6
  33. package/dist/node-entry.cjs +135 -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-5PFPEA4C.js.map +0 -1
  43. package/dist/chunk-DW2UJUNB.js.map +0 -1
  44. package/dist/chunk-X4IK6KES.js.map +0 -1
  45. /package/dist/{chunk-XS3BO7RY.js.map → chunk-BQKPRFLF.js.map} +0 -0
  46. /package/dist/{chunk-USLH3OTM.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
@@ -2,9 +2,9 @@ import {
2
2
  GlasstraceSpanProcessor,
3
3
  SdkError,
4
4
  captureCorrelationId
5
- } from "./chunk-CRM3EYOL.js";
5
+ } from "./chunk-WKOQJCFN.js";
6
6
  import "./chunk-DQ25VOKK.js";
7
- import "./chunk-MQHLWSIX.js";
7
+ import "./chunk-M4ZI7J3N.js";
8
8
  import "./chunk-NSBPE2FW.js";
9
9
  export {
10
10
  GlasstraceSpanProcessor,
package/dist/index.cjs CHANGED
@@ -14563,7 +14563,7 @@ function deriveSessionId(apiKey, origin, date5, windowIndex) {
14563
14563
  const digest = sha256Hex(input).slice(0, 16);
14564
14564
  return SessionIdSchema.parse(digest);
14565
14565
  }
14566
- 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;
14566
+ 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;
14567
14567
  var init_dist = __esm({
14568
14568
  "../protocol/dist/index.js"() {
14569
14569
  "use strict";
@@ -14614,6 +14614,59 @@ var init_dist = __esm({
14614
14614
  NODE_ENV: external_exports.string().optional(),
14615
14615
  VERCEL_ENV: external_exports.string().optional()
14616
14616
  });
14617
+ GLASSTRACE_ATTRIBUTE_NAMES = {
14618
+ // Server-side attributes
14619
+ TRACE_TYPE: "glasstrace.trace.type",
14620
+ SESSION_ID: "glasstrace.session.id",
14621
+ CORRELATION_ID: "glasstrace.correlation.id",
14622
+ ENVIRONMENT: "glasstrace.environment",
14623
+ ROUTE: "glasstrace.route",
14624
+ HTTP_METHOD: "glasstrace.http.method",
14625
+ HTTP_STATUS_CODE: "glasstrace.http.status_code",
14626
+ HTTP_DURATION_MS: "glasstrace.http.duration_ms",
14627
+ ERROR_MESSAGE: "glasstrace.error.message",
14628
+ ERROR_CODE: "glasstrace.error.code",
14629
+ ERROR_CATEGORY: "glasstrace.error.category",
14630
+ ERROR_FIELD: "glasstrace.error.field",
14631
+ ORM_PROVIDER: "glasstrace.orm.provider",
14632
+ ORM_MODEL: "glasstrace.orm.model",
14633
+ ORM_OPERATION: "glasstrace.orm.operation",
14634
+ ORM_DURATION_MS: "glasstrace.orm.duration_ms",
14635
+ FETCH_URL: "glasstrace.fetch.url",
14636
+ FETCH_METHOD: "glasstrace.fetch.method",
14637
+ FETCH_STATUS_CODE: "glasstrace.fetch.status_code",
14638
+ FETCH_DURATION_MS: "glasstrace.fetch.duration_ms",
14639
+ FETCH_TARGET: "glasstrace.fetch.target",
14640
+ ENV_REFERENCED: "glasstrace.env.referenced",
14641
+ BUILD_HASH: "glasstrace.build.hash",
14642
+ SOURCE_FILE: "glasstrace.source.file",
14643
+ SOURCE_LINE: "glasstrace.source.line",
14644
+ SOURCE_MAPPED: "glasstrace.source.mapped",
14645
+ TRPC_PROCEDURE: "glasstrace.trpc.procedure",
14646
+ ERROR_RESPONSE_BODY: "glasstrace.error.response_body",
14647
+ NEXT_ACTION_DETECTED: "glasstrace.next.action.detected",
14648
+ // Client-side attributes
14649
+ PLATFORM: "glasstrace.platform",
14650
+ GESTURE_TYPE: "glasstrace.gesture.type",
14651
+ TRIGGER_TYPE: "glasstrace.trigger.type",
14652
+ ELEMENT_FINGERPRINT: "glasstrace.element.fingerprint",
14653
+ ELEMENT_CONFIDENCE: "glasstrace.element.confidence",
14654
+ TAB_ID: "glasstrace.tab.id"
14655
+ };
14656
+ DEFAULT_CAPTURE_CONFIG = {
14657
+ requestBodies: false,
14658
+ queryParamValues: false,
14659
+ envVarValues: false,
14660
+ fullConsoleOutput: false,
14661
+ importGraph: false,
14662
+ consoleErrors: false,
14663
+ errorResponseBodies: false
14664
+ };
14665
+ MAX_SOURCE_MAP_FILE_PATH_LENGTH = 512;
14666
+ MAX_SOURCE_MAP_FILE_SIZE = 50 * 1024 * 1024;
14667
+ MAX_SOURCE_MAP_FILE_COUNT = 100;
14668
+ MAX_PRESIGNED_CLIENT_TOKEN_LENGTH = 2048;
14669
+ MAX_PRESIGNED_PATHNAME_LENGTH = 1024;
14617
14670
  ImportGraphPayloadSchema = external_exports.object({
14618
14671
  buildHash: BuildHashSchema,
14619
14672
  graph: external_exports.record(external_exports.string(), external_exports.array(external_exports.string()))
@@ -14660,35 +14713,68 @@ var init_dist = __esm({
14660
14713
  buildHash: BuildHashSchema,
14661
14714
  files: external_exports.array(
14662
14715
  external_exports.object({
14663
- filePath: external_exports.string().min(1),
14664
- sizeBytes: external_exports.number().int().positive()
14716
+ filePath: external_exports.string().min(1).max(
14717
+ MAX_SOURCE_MAP_FILE_PATH_LENGTH,
14718
+ `filePath length exceeds maximum of ${MAX_SOURCE_MAP_FILE_PATH_LENGTH} characters`
14719
+ ),
14720
+ sizeBytes: external_exports.number().int().positive().max(
14721
+ MAX_SOURCE_MAP_FILE_SIZE,
14722
+ `sizeBytes exceeds maximum of ${MAX_SOURCE_MAP_FILE_SIZE} bytes (${MAX_SOURCE_MAP_FILE_SIZE / (1024 * 1024)} MiB)`
14723
+ )
14665
14724
  })
14666
- ).min(1).max(100)
14725
+ ).min(1).max(
14726
+ MAX_SOURCE_MAP_FILE_COUNT,
14727
+ `files array exceeds maximum of ${MAX_SOURCE_MAP_FILE_COUNT} entries`
14728
+ )
14667
14729
  });
14668
14730
  PresignedUploadResponseSchema = external_exports.object({
14669
14731
  uploadId: external_exports.string().uuid(),
14670
14732
  expiresAt: external_exports.number().int().nonnegative(),
14671
14733
  files: external_exports.array(
14672
14734
  external_exports.object({
14673
- filePath: external_exports.string().min(1),
14674
- clientToken: external_exports.string().min(1),
14675
- pathname: external_exports.string().min(1),
14676
- maxBytes: external_exports.number().int().positive(),
14735
+ filePath: external_exports.string().min(1).max(
14736
+ MAX_SOURCE_MAP_FILE_PATH_LENGTH,
14737
+ `filePath length exceeds maximum of ${MAX_SOURCE_MAP_FILE_PATH_LENGTH} characters`
14738
+ ),
14739
+ clientToken: external_exports.string().min(1).max(
14740
+ MAX_PRESIGNED_CLIENT_TOKEN_LENGTH,
14741
+ `clientToken length exceeds maximum of ${MAX_PRESIGNED_CLIENT_TOKEN_LENGTH} characters`
14742
+ ),
14743
+ pathname: external_exports.string().min(1).max(
14744
+ MAX_PRESIGNED_PATHNAME_LENGTH,
14745
+ `pathname length exceeds maximum of ${MAX_PRESIGNED_PATHNAME_LENGTH} characters`
14746
+ ),
14747
+ maxBytes: external_exports.number().int().positive().max(
14748
+ MAX_SOURCE_MAP_FILE_SIZE,
14749
+ `maxBytes exceeds maximum of ${MAX_SOURCE_MAP_FILE_SIZE} bytes (${MAX_SOURCE_MAP_FILE_SIZE / (1024 * 1024)} MiB)`
14750
+ ),
14677
14751
  /** Vercel Blob access mode — explicit in the contract per DISC-756. */
14678
14752
  access: external_exports.enum(["public"])
14679
14753
  })
14680
- ).min(1).max(100)
14754
+ ).min(1).max(
14755
+ MAX_SOURCE_MAP_FILE_COUNT,
14756
+ `files array exceeds maximum of ${MAX_SOURCE_MAP_FILE_COUNT} entries`
14757
+ )
14681
14758
  });
14682
14759
  SourceMapManifestRequestSchema = external_exports.object({
14683
14760
  uploadId: external_exports.string().uuid(),
14684
14761
  buildHash: BuildHashSchema,
14685
14762
  files: external_exports.array(
14686
14763
  external_exports.object({
14687
- filePath: external_exports.string().min(1),
14688
- sizeBytes: external_exports.number().int().positive(),
14764
+ filePath: external_exports.string().min(1).max(
14765
+ MAX_SOURCE_MAP_FILE_PATH_LENGTH,
14766
+ `filePath length exceeds maximum of ${MAX_SOURCE_MAP_FILE_PATH_LENGTH} characters`
14767
+ ),
14768
+ sizeBytes: external_exports.number().int().positive().max(
14769
+ MAX_SOURCE_MAP_FILE_SIZE,
14770
+ `sizeBytes exceeds maximum of ${MAX_SOURCE_MAP_FILE_SIZE} bytes (${MAX_SOURCE_MAP_FILE_SIZE / (1024 * 1024)} MiB)`
14771
+ ),
14689
14772
  blobUrl: external_exports.string().url()
14690
14773
  })
14691
- ).min(1).max(100)
14774
+ ).min(1).max(
14775
+ MAX_SOURCE_MAP_FILE_COUNT,
14776
+ `files array exceeds maximum of ${MAX_SOURCE_MAP_FILE_COUNT} entries`
14777
+ )
14692
14778
  });
14693
14779
  SourceMapManifestResponseSchema = external_exports.object({
14694
14780
  success: external_exports.literal(true),
@@ -14697,54 +14783,6 @@ var init_dist = __esm({
14697
14783
  totalSizeBytes: external_exports.number().int().nonnegative(),
14698
14784
  activatedAt: external_exports.number().int().positive()
14699
14785
  });
14700
- GLASSTRACE_ATTRIBUTE_NAMES = {
14701
- // Server-side attributes
14702
- TRACE_TYPE: "glasstrace.trace.type",
14703
- SESSION_ID: "glasstrace.session.id",
14704
- CORRELATION_ID: "glasstrace.correlation.id",
14705
- ENVIRONMENT: "glasstrace.environment",
14706
- ROUTE: "glasstrace.route",
14707
- HTTP_METHOD: "glasstrace.http.method",
14708
- HTTP_STATUS_CODE: "glasstrace.http.status_code",
14709
- HTTP_DURATION_MS: "glasstrace.http.duration_ms",
14710
- ERROR_MESSAGE: "glasstrace.error.message",
14711
- ERROR_CODE: "glasstrace.error.code",
14712
- ERROR_CATEGORY: "glasstrace.error.category",
14713
- ERROR_FIELD: "glasstrace.error.field",
14714
- ORM_PROVIDER: "glasstrace.orm.provider",
14715
- ORM_MODEL: "glasstrace.orm.model",
14716
- ORM_OPERATION: "glasstrace.orm.operation",
14717
- ORM_DURATION_MS: "glasstrace.orm.duration_ms",
14718
- FETCH_URL: "glasstrace.fetch.url",
14719
- FETCH_METHOD: "glasstrace.fetch.method",
14720
- FETCH_STATUS_CODE: "glasstrace.fetch.status_code",
14721
- FETCH_DURATION_MS: "glasstrace.fetch.duration_ms",
14722
- FETCH_TARGET: "glasstrace.fetch.target",
14723
- ENV_REFERENCED: "glasstrace.env.referenced",
14724
- BUILD_HASH: "glasstrace.build.hash",
14725
- SOURCE_FILE: "glasstrace.source.file",
14726
- SOURCE_LINE: "glasstrace.source.line",
14727
- SOURCE_MAPPED: "glasstrace.source.mapped",
14728
- TRPC_PROCEDURE: "glasstrace.trpc.procedure",
14729
- ERROR_RESPONSE_BODY: "glasstrace.error.response_body",
14730
- NEXT_ACTION_DETECTED: "glasstrace.next.action.detected",
14731
- // Client-side attributes
14732
- PLATFORM: "glasstrace.platform",
14733
- GESTURE_TYPE: "glasstrace.gesture.type",
14734
- TRIGGER_TYPE: "glasstrace.trigger.type",
14735
- ELEMENT_FINGERPRINT: "glasstrace.element.fingerprint",
14736
- ELEMENT_CONFIDENCE: "glasstrace.element.confidence",
14737
- TAB_ID: "glasstrace.tab.id"
14738
- };
14739
- DEFAULT_CAPTURE_CONFIG = {
14740
- requestBodies: false,
14741
- queryParamValues: false,
14742
- envVarValues: false,
14743
- fullConsoleOutput: false,
14744
- importGraph: false,
14745
- consoleErrors: false,
14746
- errorResponseBodies: false
14747
- };
14748
14786
  K = new Uint32Array([
14749
14787
  1116352408,
14750
14788
  1899447441,
@@ -17601,6 +17639,14 @@ function fsyncParentDirSyncWithFs(targetPath, fs3) {
17601
17639
  }
17602
17640
  }
17603
17641
  }
17642
+ function isSyncFsAvailable() {
17643
+ try {
17644
+ loadFsSync();
17645
+ return true;
17646
+ } catch {
17647
+ return false;
17648
+ }
17649
+ }
17604
17650
 
17605
17651
  // src/mcp-runtime.ts
17606
17652
  var MCP_ENDPOINT = "https://api.glasstrace.dev/mcp";
@@ -18348,15 +18394,32 @@ function prepareErrorResponseBody(body) {
18348
18394
  }
18349
18395
 
18350
18396
  // src/build-info.ts
18397
+ init_console_capture();
18351
18398
  var UNSET = "";
18399
+ var SHA_SHAPE = /^[0-9a-f]{7,64}$/i;
18400
+ function redactBuildHash(value) {
18401
+ const sanitize2 = (s) => s.replace(/[\x00-\x1F\x7F]/g, "?");
18402
+ if (value.length <= 12) return sanitize2(value.slice(0, 4)) + "...";
18403
+ return sanitize2(value.slice(0, 8)) + "..." + sanitize2(value.slice(-4));
18404
+ }
18352
18405
  function readBuildHashFromEnv() {
18353
18406
  const raw = process.env.GLASSTRACE_BUILD_HASH;
18354
18407
  if (typeof raw !== "string") return UNSET;
18355
18408
  const trimmed = raw.trim();
18356
- return trimmed.length > 0 ? trimmed : UNSET;
18409
+ if (trimmed.length === 0) return UNSET;
18410
+ if (!SHA_SHAPE.test(trimmed)) {
18411
+ sdkLog(
18412
+ "warn",
18413
+ `[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.`
18414
+ );
18415
+ }
18416
+ return trimmed;
18357
18417
  }
18358
- var cachedBuildHash = readBuildHashFromEnv();
18418
+ var cachedBuildHash = null;
18359
18419
  function getBuildHash() {
18420
+ if (cachedBuildHash === null) {
18421
+ cachedBuildHash = readBuildHashFromEnv();
18422
+ }
18360
18423
  return cachedBuildHash === UNSET ? void 0 : cachedBuildHash;
18361
18424
  }
18362
18425
 
@@ -22426,6 +22489,10 @@ var _debounceTimer = null;
22426
22489
  var _started = false;
22427
22490
  function startRuntimeStateWriter(options) {
22428
22491
  if (_started) return;
22492
+ if (!isSyncFsAvailable()) {
22493
+ _started = true;
22494
+ return;
22495
+ }
22429
22496
  _started = true;
22430
22497
  _projectRoot = options.projectRoot;
22431
22498
  _sdkVersion = options.sdkVersion;
@@ -22511,7 +22578,7 @@ function registerGlasstrace(options) {
22511
22578
  setCoreState(CoreState.REGISTERING);
22512
22579
  startRuntimeStateWriter({
22513
22580
  projectRoot: process.cwd(),
22514
- sdkVersion: "1.3.1"
22581
+ sdkVersion: "1.3.3"
22515
22582
  });
22516
22583
  const config2 = resolveConfig(options);
22517
22584
  if (config2.verbose) {
@@ -22677,8 +22744,8 @@ async function backgroundInit(config2, anonKeyForInit, generation) {
22677
22744
  if (config2.verbose) {
22678
22745
  console.info("[glasstrace] Background init firing.");
22679
22746
  }
22680
- const healthReport = collectHealthReport("1.3.1");
22681
- const initResult = await performInit(config2, anonKeyForInit, "1.3.1", healthReport);
22747
+ const healthReport = collectHealthReport("1.3.3");
22748
+ const initResult = await performInit(config2, anonKeyForInit, "1.3.3", healthReport);
22682
22749
  if (generation !== registrationGeneration) return;
22683
22750
  const currentState = getCoreState();
22684
22751
  if (currentState === CoreState.SHUTTING_DOWN || currentState === CoreState.SHUTDOWN) {
@@ -22701,7 +22768,7 @@ async function backgroundInit(config2, anonKeyForInit, generation) {
22701
22768
  }
22702
22769
  maybeInstallConsoleCapture();
22703
22770
  if (didLastInitSucceed()) {
22704
- startHeartbeat(config2, anonKeyForInit, "1.3.1", generation, (newApiKey, accountId) => {
22771
+ startHeartbeat(config2, anonKeyForInit, "1.3.3", generation, (newApiKey, accountId) => {
22705
22772
  setAuthState(AuthState.CLAIMING);
22706
22773
  emitLifecycleEvent("auth:claim_started", { accountId });
22707
22774
  setResolvedApiKey(newApiKey);
@@ -22863,8 +22930,8 @@ init_dist();
22863
22930
  init_error_nudge();
22864
22931
 
22865
22932
  // src/stack-frame.ts
22866
- var PAREN_FRAME = /^\s*at\s+(?:[^()]+\s+)?\(([^()\s]+):(\d+):(\d+)\)\s*$/;
22867
- var BARE_FRAME = /^\s*at\s+(?:async\s+)?([^()\s]+):(\d+):(\d+)\s*$/;
22933
+ var PAREN_FRAME = /^\s*at\s+(?!eval\s+\(eval\s+at\b)(?:[^()]+\s+)?\(([^()\s]+(?:\([A-Za-z0-9_.-]+\)[^()\s]*)*):(\d+):(\d+)\)\s*$/;
22934
+ var BARE_FRAME = /^\s*at\s+(?:async\s+)?([^()\s]+(?:\([A-Za-z0-9_.-]+\)[^()\s]*)*):(\d+):(\d+)\s*$/;
22868
22935
  var INTERNAL_FRAME_PATTERNS = [
22869
22936
  /^node:/,
22870
22937
  /^node:internal\//,