@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.
- package/README.md +55 -20
- package/dist/async-context/index.cjs.map +1 -1
- package/dist/async-context/index.js +2 -2
- package/dist/{capture-error-CRQSqKgd.d.cts → capture-error-03qDnC5v.d.cts} +2 -2
- package/dist/{capture-error-CqCbjoMq.d.ts → capture-error-CAfFUyIU.d.ts} +2 -2
- package/dist/{chunk-6NKMAKMI.js → chunk-6ST4QV7T.js} +3 -3
- package/dist/{chunk-BN5DVIUO.js → chunk-7LE2O4ZJ.js} +12 -7
- package/dist/{chunk-BN5DVIUO.js.map → chunk-7LE2O4ZJ.js.map} +1 -1
- package/dist/{chunk-CZQN6G4I.js → chunk-E2F4S5IJ.js} +362 -11
- package/dist/chunk-E2F4S5IJ.js.map +1 -0
- package/dist/{chunk-J3ZCVE67.js → chunk-F7A3QXCT.js} +2 -2
- package/dist/{chunk-M3ZTG4P5.js → chunk-HMEHYSTS.js} +2 -2
- package/dist/{chunk-4YRYR32D.js → chunk-LQZRGBN5.js} +2 -2
- package/dist/{chunk-ZIL2IY4C.js → chunk-MP3QNDXQ.js} +2 -2
- package/dist/{chunk-FFNGE5RR.js → chunk-VMK2G6QR.js} +2 -2
- package/dist/{chunk-KBHGPQZ2.js → chunk-XMD5OYD6.js} +2 -2
- package/dist/{chunk-V75ZB4G4.js → chunk-ZIYT2Y4B.js} +3 -3
- package/dist/cli/init.cjs +4 -4
- package/dist/cli/init.cjs.map +1 -1
- package/dist/cli/init.js +7 -7
- package/dist/cli/mcp-add.cjs +1 -1
- package/dist/cli/mcp-add.cjs.map +1 -1
- package/dist/cli/mcp-add.js +3 -3
- package/dist/cli/uninit.js +3 -3
- package/dist/cli/upgrade-instructions.cjs +1 -1
- package/dist/cli/upgrade-instructions.js +3 -3
- package/dist/cli/validate.cjs.map +1 -1
- package/dist/cli/validate.js +2 -2
- package/dist/{correlation-id-CFpyJsKv.d.cts → correlation-id-CZ2bstzA.d.cts} +1 -1
- package/dist/{correlation-id-DPXyY9-3.d.ts → correlation-id-YcfcqOru.d.ts} +1 -1
- package/dist/edge-entry.cjs.map +1 -1
- package/dist/edge-entry.d.cts +2 -2
- package/dist/edge-entry.d.ts +2 -2
- package/dist/edge-entry.js +4 -4
- package/dist/index.cjs +1033 -960
- package/dist/index.cjs.map +1 -1
- package/dist/{index.d-D-jdiIPU.d.cts → index.d-BQIJ5Dvc.d.cts} +44 -9
- package/dist/{index.d-D-jdiIPU.d.ts → index.d-BQIJ5Dvc.d.ts} +44 -9
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +10 -297
- package/dist/index.js.map +1 -1
- package/dist/middleware/index.cjs.map +1 -1
- package/dist/middleware/index.js +2 -2
- package/dist/node-entry.cjs +12 -5
- package/dist/node-entry.cjs.map +1 -1
- package/dist/node-entry.d.cts +3 -3
- package/dist/node-entry.d.ts +3 -3
- package/dist/node-entry.js +7 -7
- package/dist/node-subpath.cjs.map +1 -1
- package/dist/node-subpath.d.cts +1 -1
- package/dist/node-subpath.d.ts +1 -1
- package/dist/node-subpath.js +3 -3
- package/dist/{source-map-uploader-K67LTPBG.js → source-map-uploader-NUONOEJG.js} +3 -3
- package/dist/trpc/index.cjs.map +1 -1
- package/dist/trpc/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-CZQN6G4I.js.map +0 -1
- /package/dist/{chunk-6NKMAKMI.js.map → chunk-6ST4QV7T.js.map} +0 -0
- /package/dist/{chunk-J3ZCVE67.js.map → chunk-F7A3QXCT.js.map} +0 -0
- /package/dist/{chunk-M3ZTG4P5.js.map → chunk-HMEHYSTS.js.map} +0 -0
- /package/dist/{chunk-4YRYR32D.js.map → chunk-LQZRGBN5.js.map} +0 -0
- /package/dist/{chunk-ZIL2IY4C.js.map → chunk-MP3QNDXQ.js.map} +0 -0
- /package/dist/{chunk-FFNGE5RR.js.map → chunk-VMK2G6QR.js.map} +0 -0
- /package/dist/{chunk-KBHGPQZ2.js.map → chunk-XMD5OYD6.js.map} +0 -0
- /package/dist/{chunk-V75ZB4G4.js.map → chunk-ZIYT2Y4B.js.map} +0 -0
- /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-
|
|
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-
|
|
68
|
+
} from "./chunk-F7A3QXCT.js";
|
|
69
69
|
import {
|
|
70
70
|
GLASSTRACE_ATTRIBUTE_NAMES,
|
|
71
|
-
|
|
72
|
-
|
|
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.
|
|
4972
|
+
sdkVersion: "1.14.0"
|
|
4624
4973
|
});
|
|
4625
4974
|
startRuntimeStateWriter({
|
|
4626
4975
|
projectRoot: process.cwd(),
|
|
4627
|
-
sdkVersion: "1.
|
|
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.
|
|
4795
|
-
const initResult = await performInit(config, anonKeyForInit, "1.
|
|
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.
|
|
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-
|
|
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-
|
|
5566
|
+
//# sourceMappingURL=chunk-E2F4S5IJ.js.map
|