@glasstrace/sdk 1.12.0 → 1.14.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 (67) hide show
  1. package/README.md +55 -20
  2. package/dist/async-context/index.cjs.map +1 -1
  3. package/dist/async-context/index.js +2 -2
  4. package/dist/{capture-error-CRQSqKgd.d.cts → capture-error-03qDnC5v.d.cts} +2 -2
  5. package/dist/{capture-error-CqCbjoMq.d.ts → capture-error-CAfFUyIU.d.ts} +2 -2
  6. package/dist/{chunk-6NKMAKMI.js → chunk-6ST4QV7T.js} +3 -3
  7. package/dist/{chunk-BN5DVIUO.js → chunk-7LE2O4ZJ.js} +12 -7
  8. package/dist/{chunk-BN5DVIUO.js.map → chunk-7LE2O4ZJ.js.map} +1 -1
  9. package/dist/{chunk-CZQN6G4I.js → chunk-E2F4S5IJ.js} +362 -11
  10. package/dist/chunk-E2F4S5IJ.js.map +1 -0
  11. package/dist/{chunk-J3ZCVE67.js → chunk-F7A3QXCT.js} +2 -2
  12. package/dist/{chunk-M3ZTG4P5.js → chunk-HMEHYSTS.js} +2 -2
  13. package/dist/{chunk-4YRYR32D.js → chunk-LQZRGBN5.js} +2 -2
  14. package/dist/{chunk-ZIL2IY4C.js → chunk-MP3QNDXQ.js} +2 -2
  15. package/dist/{chunk-FFNGE5RR.js → chunk-VMK2G6QR.js} +2 -2
  16. package/dist/{chunk-KBHGPQZ2.js → chunk-XMD5OYD6.js} +2 -2
  17. package/dist/{chunk-V75ZB4G4.js → chunk-ZIYT2Y4B.js} +3 -3
  18. package/dist/cli/init.cjs +4 -4
  19. package/dist/cli/init.cjs.map +1 -1
  20. package/dist/cli/init.js +7 -7
  21. package/dist/cli/mcp-add.cjs +1 -1
  22. package/dist/cli/mcp-add.cjs.map +1 -1
  23. package/dist/cli/mcp-add.js +3 -3
  24. package/dist/cli/uninit.js +3 -3
  25. package/dist/cli/upgrade-instructions.cjs +1 -1
  26. package/dist/cli/upgrade-instructions.js +3 -3
  27. package/dist/cli/validate.cjs.map +1 -1
  28. package/dist/cli/validate.js +2 -2
  29. package/dist/{correlation-id-CFpyJsKv.d.cts → correlation-id-CZ2bstzA.d.cts} +1 -1
  30. package/dist/{correlation-id-DPXyY9-3.d.ts → correlation-id-YcfcqOru.d.ts} +1 -1
  31. package/dist/edge-entry.cjs.map +1 -1
  32. package/dist/edge-entry.d.cts +2 -2
  33. package/dist/edge-entry.d.ts +2 -2
  34. package/dist/edge-entry.js +4 -4
  35. package/dist/index.cjs +1033 -960
  36. package/dist/index.cjs.map +1 -1
  37. package/dist/{index.d-D-jdiIPU.d.cts → index.d-BQIJ5Dvc.d.cts} +44 -9
  38. package/dist/{index.d-D-jdiIPU.d.ts → index.d-BQIJ5Dvc.d.ts} +44 -9
  39. package/dist/index.d.cts +4 -4
  40. package/dist/index.d.ts +4 -4
  41. package/dist/index.js +10 -297
  42. package/dist/index.js.map +1 -1
  43. package/dist/middleware/index.cjs.map +1 -1
  44. package/dist/middleware/index.js +2 -2
  45. package/dist/node-entry.cjs +12 -5
  46. package/dist/node-entry.cjs.map +1 -1
  47. package/dist/node-entry.d.cts +3 -3
  48. package/dist/node-entry.d.ts +3 -3
  49. package/dist/node-entry.js +7 -7
  50. package/dist/node-subpath.cjs.map +1 -1
  51. package/dist/node-subpath.d.cts +1 -1
  52. package/dist/node-subpath.d.ts +1 -1
  53. package/dist/node-subpath.js +3 -3
  54. package/dist/{source-map-uploader-K67LTPBG.js → source-map-uploader-NUONOEJG.js} +3 -3
  55. package/dist/trpc/index.cjs.map +1 -1
  56. package/dist/trpc/index.js +1 -1
  57. package/package.json +1 -1
  58. package/dist/chunk-CZQN6G4I.js.map +0 -1
  59. /package/dist/{chunk-6NKMAKMI.js.map → chunk-6ST4QV7T.js.map} +0 -0
  60. /package/dist/{chunk-J3ZCVE67.js.map → chunk-F7A3QXCT.js.map} +0 -0
  61. /package/dist/{chunk-M3ZTG4P5.js.map → chunk-HMEHYSTS.js.map} +0 -0
  62. /package/dist/{chunk-4YRYR32D.js.map → chunk-LQZRGBN5.js.map} +0 -0
  63. /package/dist/{chunk-ZIL2IY4C.js.map → chunk-MP3QNDXQ.js.map} +0 -0
  64. /package/dist/{chunk-FFNGE5RR.js.map → chunk-VMK2G6QR.js.map} +0 -0
  65. /package/dist/{chunk-KBHGPQZ2.js.map → chunk-XMD5OYD6.js.map} +0 -0
  66. /package/dist/{chunk-V75ZB4G4.js.map → chunk-ZIYT2Y4B.js.map} +0 -0
  67. /package/dist/{source-map-uploader-K67LTPBG.js.map → source-map-uploader-NUONOEJG.js.map} +0 -0
@@ -54,7 +54,7 @@ import {
54
54
  performInit,
55
55
  recordSpansDropped,
56
56
  recordSpansExported
57
- } from "./chunk-6NKMAKMI.js";
57
+ } from "./chunk-6ST4QV7T.js";
58
58
  import {
59
59
  isAnonymousMode,
60
60
  isProductionDisabled,
@@ -65,11 +65,16 @@ import {
65
65
  getOrCreateAnonKey,
66
66
  isSyncFsAvailable,
67
67
  readAnonKey
68
- } from "./chunk-J3ZCVE67.js";
68
+ } from "./chunk-F7A3QXCT.js";
69
69
  import {
70
70
  GLASSTRACE_ATTRIBUTE_NAMES,
71
- deriveSessionId
72
- } from "./chunk-BN5DVIUO.js";
71
+ SIDE_EFFECT_OMISSION_REASONS,
72
+ SIDE_EFFECT_OPERATION_KINDS,
73
+ SIDE_EFFECT_OPERATION_PHASES,
74
+ SIDE_EFFECT_OPERATION_STATUSES,
75
+ deriveSessionId,
76
+ isSideEffectSemanticFieldKey
77
+ } from "./chunk-7LE2O4ZJ.js";
73
78
  import {
74
79
  isEndMarkerLine,
75
80
  parseStartMarkerLine
@@ -4348,6 +4353,350 @@ function registerHeartbeatShutdownHook(config, anonKey, sdkVersion) {
4348
4353
  });
4349
4354
  }
4350
4355
 
4356
+ // src/side-effect/allowlist.ts
4357
+ var MAX_SIDE_EFFECT_OPERATION_LABEL_LENGTH = 96;
4358
+ var MAX_SIDE_EFFECT_FIELD_VALUE_LENGTH = 80;
4359
+ var MAX_SIDE_EFFECT_FIELD_COUNT_VALUE_LENGTH = 16;
4360
+ var MAX_SIDE_EFFECT_OPERATIONS_PER_SPAN = 5;
4361
+ var OPERATION_KIND_SET = new Set(
4362
+ SIDE_EFFECT_OPERATION_KINDS
4363
+ );
4364
+ var OPERATION_STATUS_SET = new Set(
4365
+ SIDE_EFFECT_OPERATION_STATUSES
4366
+ );
4367
+ var OPERATION_PHASE_SET = new Set(
4368
+ SIDE_EFFECT_OPERATION_PHASES
4369
+ );
4370
+ var OMISSION_REASON_SET = new Set(
4371
+ SIDE_EFFECT_OMISSION_REASONS
4372
+ );
4373
+ var TOKEN_REGEX = /^[A-Za-z0-9][A-Za-z0-9_.:-]*$/;
4374
+ var LOCALE_REGEX = /^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8}){0,3}$/;
4375
+ var TIMEZONE_REGEX = /^(?:UTC|GMT|[A-Za-z][A-Za-z0-9_+-]*(?:\/[A-Za-z0-9_+-]+){1,3})$/;
4376
+ var DIGIT_REGEX = /^[0-9]+$/;
4377
+ var URL_SCHEME = /:\/\//;
4378
+ var URL_SCHEME_RELATIVE = /^\/\//;
4379
+ var EMAIL_LIKE = /[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/i;
4380
+ var QUERY_LIKE = /\?/;
4381
+ var FRAGMENT_LIKE = /#/;
4382
+ var HEADER_LIKE = /\b(authorization|set-cookie|cookie)\b\s*[:=]/i;
4383
+ var HEADER_TOKEN_LIKE = /\b(authorization|set-cookie|cookie)\b\s+\S+=/i;
4384
+ var BEARER_LIKE = /bearer\s+\S+/i;
4385
+ var TOKEN_KV_LIKE = /["']?(password|passwd|token|api[_-]?key|secret|client_secret)["']?\s*[:=]/i;
4386
+ var PROSE_LIKE = /[\r\n\t]|\s{2,}/;
4387
+ var UUID_LIKE = /[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/i;
4388
+ var GT_KEY_LIKE = /gt_(dev|anon|live)_[A-Za-z0-9_-]+/;
4389
+ function detectUnsafePattern(value) {
4390
+ if (value.trim() !== value) return "raw_payload";
4391
+ if (PROSE_LIKE.test(value)) return "raw_payload";
4392
+ if (URL_SCHEME.test(value)) return "raw_payload";
4393
+ if (URL_SCHEME_RELATIVE.test(value)) return "raw_payload";
4394
+ if (QUERY_LIKE.test(value)) return "raw_payload";
4395
+ if (FRAGMENT_LIKE.test(value)) return "raw_payload";
4396
+ if (BEARER_LIKE.test(value)) return "secret";
4397
+ if (HEADER_TOKEN_LIKE.test(value)) return "secret";
4398
+ if (TOKEN_KV_LIKE.test(value)) return "secret";
4399
+ if (HEADER_LIKE.test(value)) return "secret";
4400
+ if (UUID_LIKE.test(value)) return "secret";
4401
+ if (GT_KEY_LIKE.test(value)) return "secret";
4402
+ if (EMAIL_LIKE.test(value)) return "pii";
4403
+ return null;
4404
+ }
4405
+ function passesFieldValidator(key, value) {
4406
+ if (key === "locale") return LOCALE_REGEX.test(value);
4407
+ if (key === "timezone") return TIMEZONE_REGEX.test(value);
4408
+ if (typeof key === "string" && key.endsWith("Count")) {
4409
+ return DIGIT_REGEX.test(value);
4410
+ }
4411
+ return TOKEN_REGEX.test(value);
4412
+ }
4413
+ function checkOperationLabel(value) {
4414
+ if (typeof value !== "string" || value.length === 0) {
4415
+ return { accepted: false, reason: "raw_payload" };
4416
+ }
4417
+ if (value.length > MAX_SIDE_EFFECT_OPERATION_LABEL_LENGTH) {
4418
+ return { accepted: false, reason: "value_too_long" };
4419
+ }
4420
+ const unsafe = detectUnsafePattern(value);
4421
+ if (unsafe) {
4422
+ return { accepted: false, reason: unsafe };
4423
+ }
4424
+ if (!TOKEN_REGEX.test(value)) {
4425
+ return { accepted: false, reason: "raw_payload" };
4426
+ }
4427
+ return { accepted: true, value };
4428
+ }
4429
+ function checkSemanticFieldValue(key, value) {
4430
+ if (typeof value !== "string" || value.length === 0) {
4431
+ return { accepted: false, reason: "raw_payload" };
4432
+ }
4433
+ const maxLength = typeof key === "string" && key.endsWith("Count") ? MAX_SIDE_EFFECT_FIELD_COUNT_VALUE_LENGTH : MAX_SIDE_EFFECT_FIELD_VALUE_LENGTH;
4434
+ if (value.length > maxLength) {
4435
+ return { accepted: false, reason: "value_too_long" };
4436
+ }
4437
+ const unsafe = detectUnsafePattern(value);
4438
+ if (unsafe) {
4439
+ return { accepted: false, reason: unsafe };
4440
+ }
4441
+ if (!passesFieldValidator(key, value)) {
4442
+ return { accepted: false, reason: "raw_payload" };
4443
+ }
4444
+ return { accepted: true, value };
4445
+ }
4446
+ function checkSemanticFieldKey(key) {
4447
+ return typeof key === "string" && isSideEffectSemanticFieldKey(key);
4448
+ }
4449
+ function checkOperationKind(kind) {
4450
+ return typeof kind === "string" && OPERATION_KIND_SET.has(kind);
4451
+ }
4452
+ function checkOperationStatus(status) {
4453
+ return typeof status === "string" && OPERATION_STATUS_SET.has(status);
4454
+ }
4455
+ function checkOperationPhase(phase) {
4456
+ return typeof phase === "string" && OPERATION_PHASE_SET.has(phase);
4457
+ }
4458
+
4459
+ // src/side-effect/emit.ts
4460
+ var spanState = /* @__PURE__ */ new WeakMap();
4461
+ function getOrCreateState(span) {
4462
+ let state = spanState.get(span);
4463
+ if (!state) {
4464
+ state = { operationsRecorded: 0, omissions: /* @__PURE__ */ new Map() };
4465
+ spanState.set(span, state);
4466
+ }
4467
+ return state;
4468
+ }
4469
+ function getRecordingActiveSpan() {
4470
+ let span;
4471
+ try {
4472
+ span = trace.getActiveSpan();
4473
+ } catch {
4474
+ return void 0;
4475
+ }
4476
+ if (!span) return void 0;
4477
+ try {
4478
+ if (typeof span.isRecording === "function" && !span.isRecording()) {
4479
+ return void 0;
4480
+ }
4481
+ } catch {
4482
+ return void 0;
4483
+ }
4484
+ return span;
4485
+ }
4486
+ function recordOmissionOnActiveSpan(reason) {
4487
+ const span = getRecordingActiveSpan();
4488
+ if (!span) return;
4489
+ recordOmissionOnSpan(span, reason);
4490
+ }
4491
+ function recordOmissionOnSpan(span, reason) {
4492
+ const state = getOrCreateState(span);
4493
+ const previous = state.omissions.get(reason) ?? 0;
4494
+ const next = previous + 1;
4495
+ state.omissions.set(reason, next);
4496
+ const attribute = OMISSION_ATTRIBUTE_BY_REASON[reason];
4497
+ try {
4498
+ span.setAttribute(attribute, next);
4499
+ } catch {
4500
+ }
4501
+ }
4502
+ var OMISSION_ATTRIBUTE_BY_REASON = {
4503
+ pii: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_OMITTED_PII,
4504
+ secret: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_OMITTED_SECRET,
4505
+ raw_payload: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_OMITTED_RAW_PAYLOAD,
4506
+ unsupported_key: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_OMITTED_UNSUPPORTED_KEY,
4507
+ value_too_long: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_OMITTED_VALUE_TOO_LONG,
4508
+ not_emitted: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_OMITTED_NOT_EMITTED,
4509
+ capture_disabled: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_OMITTED_CAPTURE_DISABLED
4510
+ };
4511
+ var FIELD_ATTRIBUTE_BY_KEY = {
4512
+ templateKey: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_FIELD_TEMPLATE_KEY,
4513
+ providerOperation: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_FIELD_PROVIDER_OPERATION,
4514
+ role: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_FIELD_ROLE,
4515
+ locale: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_FIELD_LOCALE,
4516
+ timezone: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_FIELD_TIMEZONE,
4517
+ status: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_FIELD_STATUS,
4518
+ phase: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_FIELD_PHASE,
4519
+ recipientClass: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_FIELD_RECIPIENT_CLASS,
4520
+ participantCount: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_FIELD_PARTICIPANT_COUNT,
4521
+ activeParticipantCount: GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_FIELD_ACTIVE_PARTICIPANT_COUNT
4522
+ };
4523
+ function resolveFieldAttribute(key) {
4524
+ const explicit = FIELD_ATTRIBUTE_BY_KEY[key];
4525
+ if (explicit !== void 0) return explicit;
4526
+ return `glasstrace.side_effect.field.${key}`;
4527
+ }
4528
+ function hasExplicitFieldAttribute(key) {
4529
+ return FIELD_ATTRIBUTE_BY_KEY[key] !== void 0;
4530
+ }
4531
+ function attachOperation(input) {
4532
+ const span = getRecordingActiveSpan();
4533
+ if (!span) return { kind: "no_active_span" };
4534
+ const state = getOrCreateState(span);
4535
+ if (state.operationsRecorded >= MAX_SIDE_EFFECT_OPERATIONS_PER_SPAN) {
4536
+ return { kind: "over_budget", span };
4537
+ }
4538
+ state.operationsRecorded += 1;
4539
+ try {
4540
+ span.setAttribute(GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_KIND, input.kind);
4541
+ span.setAttribute(
4542
+ GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_OPERATION,
4543
+ input.operation
4544
+ );
4545
+ if (input.status !== void 0) {
4546
+ span.setAttribute(
4547
+ GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_STATUS,
4548
+ input.status
4549
+ );
4550
+ }
4551
+ if (input.phase !== void 0) {
4552
+ span.setAttribute(
4553
+ GLASSTRACE_ATTRIBUTE_NAMES.SIDE_EFFECT_PHASE,
4554
+ input.phase
4555
+ );
4556
+ }
4557
+ } catch {
4558
+ }
4559
+ return { kind: "attached", span };
4560
+ }
4561
+ function attachField(span, key, value) {
4562
+ const attribute = resolveFieldAttribute(key);
4563
+ try {
4564
+ span.setAttribute(attribute, value);
4565
+ } catch {
4566
+ }
4567
+ }
4568
+ function recordOmission(span, reason) {
4569
+ recordOmissionOnSpan(span, reason);
4570
+ }
4571
+
4572
+ // src/side-effect/index.ts
4573
+ var _verbose = false;
4574
+ function setSideEffectVerboseFlag(verbose) {
4575
+ _verbose = verbose;
4576
+ }
4577
+ var _casingWarnSeen = /* @__PURE__ */ new Map();
4578
+ var _CASING_DEDUP_MAX_KEYS = 100;
4579
+ var _patternKeysSeen = /* @__PURE__ */ new Set();
4580
+ var _recentPatternKeys = [];
4581
+ var _proliferationWarned = false;
4582
+ var _PROLIFERATION_THRESHOLD = 50;
4583
+ var _RECENT_KEYS_IN_WARN = 5;
4584
+ function shouldCheckCasingConvention(key) {
4585
+ return key.endsWith("Class") || key.endsWith("Role");
4586
+ }
4587
+ function casingPattern(value) {
4588
+ return value === value.toUpperCase() ? "uppercase" : "mixed";
4589
+ }
4590
+ function maybeWarnMixedCasing(key, value) {
4591
+ if (!shouldCheckCasingConvention(key)) return;
4592
+ if (value === value.toLowerCase()) return;
4593
+ const pattern = casingPattern(value);
4594
+ let seenPatterns = _casingWarnSeen.get(key);
4595
+ if (!seenPatterns) {
4596
+ if (_casingWarnSeen.size >= _CASING_DEDUP_MAX_KEYS) return;
4597
+ seenPatterns = /* @__PURE__ */ new Set();
4598
+ _casingWarnSeen.set(key, seenPatterns);
4599
+ }
4600
+ if (seenPatterns.has(pattern)) return;
4601
+ seenPatterns.add(pattern);
4602
+ console.warn(
4603
+ `[glasstrace] side-effect field "${key}" value has ${pattern} casing; convention is lowercase-kebab. Producer should normalize.`
4604
+ );
4605
+ }
4606
+ function maybeWarnPatternKeyProliferation(key) {
4607
+ if (!_verbose) return;
4608
+ if (_proliferationWarned) return;
4609
+ if (hasExplicitFieldAttribute(key)) return;
4610
+ if (_patternKeysSeen.has(key)) return;
4611
+ _patternKeysSeen.add(key);
4612
+ _recentPatternKeys.push(key);
4613
+ if (_recentPatternKeys.length > _RECENT_KEYS_IN_WARN) {
4614
+ _recentPatternKeys.shift();
4615
+ }
4616
+ if (_patternKeysSeen.size >= _PROLIFERATION_THRESHOLD) {
4617
+ _proliferationWarned = true;
4618
+ console.warn(
4619
+ `[glasstrace] side-effect emission has used ${_patternKeysSeen.size} distinct pattern-admitted field keys this process; recent: ${_recentPatternKeys.join(", ")}. Consider producer-side vocabulary review (lowercase-kebab convention; Class/Count/Kind/Role suffixes).`
4620
+ );
4621
+ }
4622
+ }
4623
+ function recordSideEffect(input) {
4624
+ try {
4625
+ runRecordSideEffect(input);
4626
+ } catch {
4627
+ }
4628
+ }
4629
+ function runRecordSideEffect(input) {
4630
+ if (!input || typeof input !== "object") return;
4631
+ let captureEnabled;
4632
+ try {
4633
+ captureEnabled = getActiveConfig().sideEffectEvidence === true;
4634
+ } catch {
4635
+ captureEnabled = false;
4636
+ }
4637
+ if (!captureEnabled) {
4638
+ return;
4639
+ }
4640
+ const candidate = input;
4641
+ if (!checkOperationKind(candidate.kind)) {
4642
+ return;
4643
+ }
4644
+ const labelOutcome = checkOperationLabel(candidate.operation);
4645
+ if (!labelOutcome.accepted) {
4646
+ recordOmissionOnActiveSpan(labelOutcome.reason);
4647
+ return;
4648
+ }
4649
+ let acceptedStatus;
4650
+ if (candidate.status !== void 0) {
4651
+ if (checkOperationStatus(candidate.status)) {
4652
+ acceptedStatus = candidate.status;
4653
+ } else {
4654
+ recordOmissionOnActiveSpan("unsupported_key");
4655
+ }
4656
+ }
4657
+ let acceptedPhase;
4658
+ if (candidate.phase !== void 0) {
4659
+ if (checkOperationPhase(candidate.phase)) {
4660
+ acceptedPhase = candidate.phase;
4661
+ } else {
4662
+ recordOmissionOnActiveSpan("unsupported_key");
4663
+ }
4664
+ }
4665
+ const outcome = attachOperation({
4666
+ kind: candidate.kind,
4667
+ operation: labelOutcome.value,
4668
+ status: acceptedStatus,
4669
+ phase: acceptedPhase
4670
+ });
4671
+ if (outcome.kind === "no_active_span") {
4672
+ return;
4673
+ }
4674
+ if (outcome.kind === "over_budget") {
4675
+ recordOmission(outcome.span, "value_too_long");
4676
+ return;
4677
+ }
4678
+ const fields = candidate.fields;
4679
+ if (fields && typeof fields === "object") {
4680
+ for (const [rawKey, rawValue] of Object.entries(fields)) {
4681
+ if (!checkSemanticFieldKey(rawKey)) {
4682
+ recordOmission(outcome.span, "unsupported_key");
4683
+ continue;
4684
+ }
4685
+ const valueOutcome = checkSemanticFieldValue(rawKey, rawValue);
4686
+ if (!valueOutcome.accepted) {
4687
+ recordOmission(outcome.span, valueOutcome.reason);
4688
+ continue;
4689
+ }
4690
+ try {
4691
+ maybeWarnMixedCasing(rawKey, valueOutcome.value);
4692
+ maybeWarnPatternKeyProliferation(rawKey);
4693
+ } catch {
4694
+ }
4695
+ attachField(outcome.span, rawKey, valueOutcome.value);
4696
+ }
4697
+ }
4698
+ }
4699
+
4351
4700
  // src/runtime-state.ts
4352
4701
  var fsSync = null;
4353
4702
  var pathSync = null;
@@ -4620,13 +4969,14 @@ function registerGlasstrace(options) {
4620
4969
  setCoreState(CoreState.REGISTERING);
4621
4970
  maybeWarnStaleAgentInstructions({
4622
4971
  projectRoot: process.cwd(),
4623
- sdkVersion: "1.12.0"
4972
+ sdkVersion: "1.14.0"
4624
4973
  });
4625
4974
  startRuntimeStateWriter({
4626
4975
  projectRoot: process.cwd(),
4627
- sdkVersion: "1.12.0"
4976
+ sdkVersion: "1.14.0"
4628
4977
  });
4629
4978
  const config = resolveConfig(options);
4979
+ setSideEffectVerboseFlag(config.verbose);
4630
4980
  if (config.verbose) {
4631
4981
  console.info("[glasstrace] Config resolved.");
4632
4982
  }
@@ -4791,8 +5141,8 @@ async function backgroundInit(config, anonKeyForInit, generation) {
4791
5141
  if (config.verbose) {
4792
5142
  console.info("[glasstrace] Background init firing.");
4793
5143
  }
4794
- const healthReport = collectHealthReport("1.12.0");
4795
- const initResult = await performInit(config, anonKeyForInit, "1.12.0", healthReport);
5144
+ const healthReport = collectHealthReport("1.14.0");
5145
+ const initResult = await performInit(config, anonKeyForInit, "1.14.0", healthReport);
4796
5146
  if (generation !== registrationGeneration) return;
4797
5147
  const currentState = getCoreState();
4798
5148
  if (currentState === CoreState.SHUTTING_DOWN || currentState === CoreState.SHUTDOWN) {
@@ -4815,7 +5165,7 @@ async function backgroundInit(config, anonKeyForInit, generation) {
4815
5165
  }
4816
5166
  maybeInstallConsoleCapture();
4817
5167
  if (didLastInitSucceed()) {
4818
- startHeartbeat(config, anonKeyForInit, "1.12.0", generation, (newApiKey, accountId) => {
5168
+ startHeartbeat(config, anonKeyForInit, "1.14.0", generation, (newApiKey, accountId) => {
4819
5169
  setAuthState(AuthState.CLAIMING);
4820
5170
  emitLifecycleEvent("auth:claim_started", { accountId });
4821
5171
  setResolvedApiKey(newApiKey);
@@ -5112,7 +5462,7 @@ async function handleSourceMapUpload(distDir) {
5112
5462
  );
5113
5463
  return;
5114
5464
  }
5115
- const { discoverSourceMapFiles, computeBuildHash, uploadSourceMaps } = await import("./source-map-uploader-K67LTPBG.js");
5465
+ const { discoverSourceMapFiles, computeBuildHash, uploadSourceMaps } = await import("./source-map-uploader-NUONOEJG.js");
5116
5466
  const files = await discoverSourceMapFiles(distDir);
5117
5467
  if (files.length === 0) {
5118
5468
  console.info("[glasstrace] No source map files found. Skipping upload.");
@@ -5207,9 +5557,10 @@ export {
5207
5557
  classifyFetchTarget,
5208
5558
  GlasstraceExporter,
5209
5559
  createGlasstraceSpanProcessor,
5560
+ recordSideEffect,
5210
5561
  registerGlasstrace,
5211
5562
  getDiscoveryHandler,
5212
5563
  withGlasstraceConfig,
5213
5564
  captureError
5214
5565
  };
5215
- //# sourceMappingURL=chunk-CZQN6G4I.js.map
5566
+ //# sourceMappingURL=chunk-E2F4S5IJ.js.map