@brizz/sdk 0.1.22 → 0.1.26

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/dist/index.js CHANGED
@@ -164,10 +164,134 @@ var init_logger = __esm({
164
164
  }
165
165
  });
166
166
 
167
+ // src/internal/instrumentation/mcp/semantic-conventions.ts
168
+ var MCP_TOOL_NAME, MCP_TOOL_ARGUMENTS, MCP_TOOL_RESULT, MCP_COMPONENT_TYPE, MCP_COMPONENT_TOOL, MCP_COMPONENT_TOOL_SCHEMA, MCP_TOOL_SCHEMA_PARAMETERS, MCP_TOOL_SCHEMA_OUTPUT, MCP_TOOL_DESCRIPTION, SPAN_NAME_TOOL_REGISTER, MCP_METHOD_NAME, MCP_REQUEST_ID, MCP_SESSION_ID, MCP_PROTOCOL_VERSION, MCP_RESOURCE_URI, RPC_SYSTEM, RPC_SYSTEM_MCP, RPC_RESPONSE_STATUS_CODE, GEN_AI_TOOL_NAME, GEN_AI_PROMPT_NAME, GEN_AI_OPERATION_NAME, GEN_AI_OPERATION_EXECUTE_TOOL, NETWORK_TRANSPORT, ERROR_TYPE, ERROR_TYPE_TOOL, JSONRPC_REQUEST_ID, SPAN_NAME_TOOLS_CALL, MAX_ATTRIBUTE_LENGTH, TRUNCATION_SUFFIX, METHOD_TOOLS_CALL, METHOD_TOOLS_LIST, METHOD_RESOURCES_READ, METHOD_PROMPTS_GET, METHOD_INITIALIZE;
169
+ var init_semantic_conventions = __esm({
170
+ "src/internal/instrumentation/mcp/semantic-conventions.ts"() {
171
+ "use strict";
172
+ MCP_TOOL_NAME = "mcp.tool.name";
173
+ MCP_TOOL_ARGUMENTS = "mcp.tool.arguments";
174
+ MCP_TOOL_RESULT = "mcp.tool.result";
175
+ MCP_COMPONENT_TYPE = "mcp.component.type";
176
+ MCP_COMPONENT_TOOL = "tool";
177
+ MCP_COMPONENT_TOOL_SCHEMA = "tool_schema";
178
+ MCP_TOOL_SCHEMA_PARAMETERS = "mcp.tool.schema.parameters";
179
+ MCP_TOOL_SCHEMA_OUTPUT = "mcp.tool.schema.output";
180
+ MCP_TOOL_DESCRIPTION = "mcp.tool.description";
181
+ SPAN_NAME_TOOL_REGISTER = "mcp.tool.register";
182
+ MCP_METHOD_NAME = "mcp.method.name";
183
+ MCP_REQUEST_ID = "mcp.request.id";
184
+ MCP_SESSION_ID = "mcp.session.id";
185
+ MCP_PROTOCOL_VERSION = "mcp.protocol.version";
186
+ MCP_RESOURCE_URI = "mcp.resource.uri";
187
+ RPC_SYSTEM = "rpc.system";
188
+ RPC_SYSTEM_MCP = "mcp";
189
+ RPC_RESPONSE_STATUS_CODE = "rpc.response.status_code";
190
+ GEN_AI_TOOL_NAME = "gen_ai.tool.name";
191
+ GEN_AI_PROMPT_NAME = "gen_ai.prompt.name";
192
+ GEN_AI_OPERATION_NAME = "gen_ai.operation.name";
193
+ GEN_AI_OPERATION_EXECUTE_TOOL = "execute_tool";
194
+ NETWORK_TRANSPORT = "network.transport";
195
+ ERROR_TYPE = "error.type";
196
+ ERROR_TYPE_TOOL = "tool_error";
197
+ JSONRPC_REQUEST_ID = "jsonrpc.request.id";
198
+ SPAN_NAME_TOOLS_CALL = "tools/call";
199
+ MAX_ATTRIBUTE_LENGTH = 32 * 1024;
200
+ TRUNCATION_SUFFIX = "\u2026(truncated)";
201
+ METHOD_TOOLS_CALL = "tools/call";
202
+ METHOD_TOOLS_LIST = "tools/list";
203
+ METHOD_RESOURCES_READ = "resources/read";
204
+ METHOD_PROMPTS_GET = "prompts/get";
205
+ METHOD_INITIALIZE = "initialize";
206
+ }
207
+ });
208
+
209
+ // src/internal/instrumentation/mcp/schemas.ts
210
+ import { SpanKind, SpanStatusCode } from "@opentelemetry/api";
211
+ function truncateSchemaAttr(value) {
212
+ if (value.length <= _MAX_SCHEMA_ATTR_BYTES) {
213
+ return value;
214
+ }
215
+ return `{"_truncated":true,"original_length":${value.length}}`;
216
+ }
217
+ function safeStringify(value) {
218
+ if (value === null || value === void 0) {
219
+ return "";
220
+ }
221
+ try {
222
+ return JSON.stringify(value);
223
+ } catch {
224
+ return "";
225
+ }
226
+ }
227
+ function emitSchemaSpansFromListResponse(result, transportSessionId, tracer) {
228
+ if (!transportSessionId) {
229
+ return;
230
+ }
231
+ const tools = extractTools(result);
232
+ if (tools === void 0) {
233
+ return;
234
+ }
235
+ for (const tool of tools) {
236
+ const name = typeof tool.name === "string" ? tool.name : void 0;
237
+ if (!name) {
238
+ continue;
239
+ }
240
+ const span = tracer.startSpan(`${SPAN_NAME_TOOL_REGISTER} ${name}`, {
241
+ kind: SpanKind.INTERNAL
242
+ });
243
+ try {
244
+ stampSchemaAttributes(span, name, transportSessionId, tool);
245
+ span.setStatus({ code: SpanStatusCode.OK });
246
+ } finally {
247
+ span.end();
248
+ }
249
+ }
250
+ }
251
+ function stampSchemaAttributes(span, toolName, transportSessionId, tool) {
252
+ if (!span.isRecording()) {
253
+ logger.warn(
254
+ `Brizz MCP: schema span is not recording; dropping attributes for ${toolName}`
255
+ );
256
+ return;
257
+ }
258
+ const description = typeof tool.description === "string" ? tool.description : "";
259
+ const parameters = truncateSchemaAttr(safeStringify(tool.inputSchema));
260
+ const outputSchema = tool.outputSchema !== void 0 && tool.outputSchema !== null ? truncateSchemaAttr(safeStringify(tool.outputSchema)) : "";
261
+ span.setAttribute(RPC_SYSTEM, RPC_SYSTEM_MCP);
262
+ span.setAttribute(MCP_COMPONENT_TYPE, MCP_COMPONENT_TOOL_SCHEMA);
263
+ span.setAttribute(MCP_SESSION_ID, transportSessionId);
264
+ span.setAttribute(MCP_TOOL_NAME, toolName);
265
+ span.setAttribute(MCP_TOOL_SCHEMA_PARAMETERS, parameters);
266
+ span.setAttribute(MCP_TOOL_SCHEMA_OUTPUT, outputSchema);
267
+ span.setAttribute(MCP_TOOL_DESCRIPTION, description);
268
+ }
269
+ function extractTools(result) {
270
+ if (!result || typeof result !== "object") {
271
+ return void 0;
272
+ }
273
+ const tools = result.tools;
274
+ if (!Array.isArray(tools)) {
275
+ return void 0;
276
+ }
277
+ return tools.filter(
278
+ (t) => t !== null && typeof t === "object"
279
+ );
280
+ }
281
+ var _MAX_SCHEMA_ATTR_BYTES;
282
+ var init_schemas = __esm({
283
+ "src/internal/instrumentation/mcp/schemas.ts"() {
284
+ "use strict";
285
+ init_logger();
286
+ init_semantic_conventions();
287
+ _MAX_SCHEMA_ATTR_BYTES = 4e3;
288
+ }
289
+ });
290
+
167
291
  // src/internal/semantic-conventions.ts
168
292
  import { createContextKey } from "@opentelemetry/api";
169
293
  var BRIZZ, PROPERTIES, SESSION_ID, PROPERTIES_CONTEXT_KEY, SESSION_OBJECT_CONTEXT_KEY, SESSION_INPUT, SESSION_OUTPUT, SESSION_INPUT_CONTEXT, SESSION_OUTPUT_CONTEXT, SESSION_SPAN_NAME, SESSION_TITLE_SPAN_NAME, SESSION_TITLE_GENERATION, SESSION_TITLE;
170
- var init_semantic_conventions = __esm({
294
+ var init_semantic_conventions2 = __esm({
171
295
  "src/internal/semantic-conventions.ts"() {
172
296
  "use strict";
173
297
  BRIZZ = "brizz";
@@ -217,48 +341,12 @@ var init_session = __esm({
217
341
  "src/internal/instrumentation/mcp/session.ts"() {
218
342
  "use strict";
219
343
  init_logger();
220
- init_semantic_conventions();
221
- }
222
- });
223
-
224
- // src/internal/instrumentation/mcp/semantic-conventions.ts
225
- var MCP_TOOL_NAME, MCP_TOOL_ARGUMENTS, MCP_TOOL_RESULT, MCP_COMPONENT_TYPE, MCP_COMPONENT_TOOL, MCP_METHOD_NAME, MCP_REQUEST_ID, MCP_SESSION_ID, MCP_PROTOCOL_VERSION, MCP_RESOURCE_URI, RPC_SYSTEM, RPC_SYSTEM_MCP, RPC_RESPONSE_STATUS_CODE, GEN_AI_TOOL_NAME, GEN_AI_PROMPT_NAME, GEN_AI_OPERATION_NAME, GEN_AI_OPERATION_EXECUTE_TOOL, NETWORK_TRANSPORT, ERROR_TYPE, ERROR_TYPE_TOOL, JSONRPC_REQUEST_ID, SPAN_NAME_TOOLS_CALL, MAX_ATTRIBUTE_LENGTH, TRUNCATION_SUFFIX, METHOD_TOOLS_CALL, METHOD_RESOURCES_READ, METHOD_PROMPTS_GET, METHOD_INITIALIZE;
226
- var init_semantic_conventions2 = __esm({
227
- "src/internal/instrumentation/mcp/semantic-conventions.ts"() {
228
- "use strict";
229
- MCP_TOOL_NAME = "mcp.tool.name";
230
- MCP_TOOL_ARGUMENTS = "mcp.tool.arguments";
231
- MCP_TOOL_RESULT = "mcp.tool.result";
232
- MCP_COMPONENT_TYPE = "mcp.component.type";
233
- MCP_COMPONENT_TOOL = "tool";
234
- MCP_METHOD_NAME = "mcp.method.name";
235
- MCP_REQUEST_ID = "mcp.request.id";
236
- MCP_SESSION_ID = "mcp.session.id";
237
- MCP_PROTOCOL_VERSION = "mcp.protocol.version";
238
- MCP_RESOURCE_URI = "mcp.resource.uri";
239
- RPC_SYSTEM = "rpc.system";
240
- RPC_SYSTEM_MCP = "mcp";
241
- RPC_RESPONSE_STATUS_CODE = "rpc.response.status_code";
242
- GEN_AI_TOOL_NAME = "gen_ai.tool.name";
243
- GEN_AI_PROMPT_NAME = "gen_ai.prompt.name";
244
- GEN_AI_OPERATION_NAME = "gen_ai.operation.name";
245
- GEN_AI_OPERATION_EXECUTE_TOOL = "execute_tool";
246
- NETWORK_TRANSPORT = "network.transport";
247
- ERROR_TYPE = "error.type";
248
- ERROR_TYPE_TOOL = "tool_error";
249
- JSONRPC_REQUEST_ID = "jsonrpc.request.id";
250
- SPAN_NAME_TOOLS_CALL = "tools/call";
251
- MAX_ATTRIBUTE_LENGTH = 32 * 1024;
252
- TRUNCATION_SUFFIX = "\u2026(truncated)";
253
- METHOD_TOOLS_CALL = "tools/call";
254
- METHOD_RESOURCES_READ = "resources/read";
255
- METHOD_PROMPTS_GET = "prompts/get";
256
- METHOD_INITIALIZE = "initialize";
344
+ init_semantic_conventions2();
257
345
  }
258
346
  });
259
347
 
260
348
  // src/internal/instrumentation/mcp/patches/attributes.ts
261
- import { SpanStatusCode } from "@opentelemetry/api";
349
+ import { SpanStatusCode as SpanStatusCode2 } from "@opentelemetry/api";
262
350
  function deriveSpanName(method, params) {
263
351
  try {
264
352
  if (method === METHOD_TOOLS_CALL) {
@@ -361,7 +449,7 @@ function applyResultAttributes(span, method, result) {
361
449
  if (obj && obj["isError"] === true) {
362
450
  span.setAttribute(ERROR_TYPE, ERROR_TYPE_TOOL);
363
451
  const message = extractToolErrorMessage(obj);
364
- span.setStatus({ code: SpanStatusCode.ERROR, message });
452
+ span.setStatus({ code: SpanStatusCode2.ERROR, message });
365
453
  }
366
454
  }
367
455
  function applyErrorAttributes(span, err) {
@@ -385,7 +473,7 @@ function applyErrorAttributes(span, err) {
385
473
  } catch {
386
474
  }
387
475
  span.setStatus({
388
- code: SpanStatusCode.ERROR,
476
+ code: SpanStatusCode2.ERROR,
389
477
  message: typeof error?.message === "string" ? error.message : void 0
390
478
  });
391
479
  }
@@ -450,12 +538,12 @@ function normalizeTransport(ctorName) {
450
538
  var init_attributes = __esm({
451
539
  "src/internal/instrumentation/mcp/patches/attributes.ts"() {
452
540
  "use strict";
453
- init_semantic_conventions2();
541
+ init_semantic_conventions();
454
542
  }
455
543
  });
456
544
 
457
545
  // src/internal/instrumentation/mcp/patches/protocol.ts
458
- import { context as context2, propagation, SpanKind, trace } from "@opentelemetry/api";
546
+ import { context as context2, propagation, SpanKind as SpanKind2, trace } from "@opentelemetry/api";
459
547
  function patchProtocolPrototype(prototype, tracer) {
460
548
  if (!prototype || typeof prototype !== "object") {
461
549
  return false;
@@ -523,7 +611,20 @@ function wrapOnRequest(original, tracer) {
523
611
  return original.apply(this, args);
524
612
  }
525
613
  const { span, spanCtx } = started;
526
- const wrappedHandler = (req, extra) => context2.with(spanCtx, () => executeHandler(span, method, handler, req, extra));
614
+ const transportSessionId = this.sessionId ?? this._transport?.sessionId;
615
+ const postResult = method === METHOD_TOOLS_LIST ? (result) => {
616
+ try {
617
+ emitSchemaSpansFromListResponse(result, transportSessionId, tracer);
618
+ } catch (error) {
619
+ logger.warn(
620
+ `Brizz MCP: failed to emit tools/list schema spans: ${String(error)}`
621
+ );
622
+ }
623
+ } : void 0;
624
+ const wrappedHandler = (req, extra) => context2.with(
625
+ spanCtx,
626
+ () => executeHandler(span, method, handler, req, extra, postResult)
627
+ );
527
628
  const hadEntry = handlers.has(method);
528
629
  const prev = handlers.get(method);
529
630
  handlers.set(method, wrappedHandler);
@@ -546,7 +647,7 @@ function wrapOnRequest(original, tracer) {
546
647
  }
547
648
  };
548
649
  }
549
- function executeAroundSpan(span, method, run) {
650
+ function executeAroundSpan(span, method, run, postResult) {
550
651
  let result;
551
652
  try {
552
653
  result = run();
@@ -557,12 +658,18 @@ function executeAroundSpan(span, method, run) {
557
658
  }
558
659
  if (!isThenable(result)) {
559
660
  safeApplyResultAttributes(span, method, result);
661
+ if (postResult) {
662
+ postResult(result);
663
+ }
560
664
  safeEnd(span);
561
665
  return result;
562
666
  }
563
667
  return result.then(
564
668
  (value) => {
565
669
  safeApplyResultAttributes(span, method, value);
670
+ if (postResult) {
671
+ postResult(value);
672
+ }
566
673
  safeEnd(span);
567
674
  return value;
568
675
  },
@@ -573,13 +680,13 @@ function executeAroundSpan(span, method, run) {
573
680
  }
574
681
  );
575
682
  }
576
- function executeHandler(span, method, handler, req, extra) {
577
- return executeAroundSpan(span, method, () => handler(req, extra));
683
+ function executeHandler(span, method, handler, req, extra, postResult) {
684
+ return executeAroundSpan(span, method, () => handler(req, extra), postResult);
578
685
  }
579
686
  function safeStartClientSpan(tracer, request, protocol) {
580
687
  try {
581
688
  const spanName = deriveSpanName(request.method, request.params);
582
- const span = tracer.startSpan(spanName, { kind: SpanKind.CLIENT });
689
+ const span = tracer.startSpan(spanName, { kind: SpanKind2.CLIENT });
583
690
  applyClientRequestAttributes(
584
691
  span,
585
692
  request,
@@ -597,7 +704,7 @@ function safeStartServerSpan(tracer, request, protocol) {
597
704
  const spanName = deriveSpanName(request.method, request.params);
598
705
  const span = tracer.startSpan(
599
706
  spanName,
600
- { kind: SpanKind.SERVER },
707
+ { kind: SpanKind2.SERVER },
601
708
  parentCtx
602
709
  );
603
710
  applyServerRequestAttributes(span, request, protocol);
@@ -655,6 +762,8 @@ var init_protocol = __esm({
655
762
  "src/internal/instrumentation/mcp/patches/protocol.ts"() {
656
763
  "use strict";
657
764
  init_logger();
765
+ init_schemas();
766
+ init_semantic_conventions();
658
767
  init_session();
659
768
  init_attributes();
660
769
  PATCHED_FLAG = /* @__PURE__ */ Symbol("brizz.mcp.protocol-patched");
@@ -663,7 +772,7 @@ var init_protocol = __esm({
663
772
 
664
773
  // src/internal/version.ts
665
774
  function getSDKVersion() {
666
- return "0.1.22";
775
+ return "0.1.26";
667
776
  }
668
777
  var init_version = __esm({
669
778
  "src/internal/version.ts"() {
@@ -948,6 +1057,38 @@ autoInitializeInstrumentations();
948
1057
  import { resourceFromAttributes as resourceFromAttributes3 } from "@opentelemetry/resources";
949
1058
  import { NodeSDK } from "@opentelemetry/sdk-node";
950
1059
 
1060
+ // src/internal/dsn.ts
1061
+ var PLACEHOLDER_SERVICE = "<service-name>";
1062
+ var SERVICE_NAME_HEADER = "X-Brizz-Service-Name";
1063
+ function parseDSN(dsn) {
1064
+ let parsed;
1065
+ try {
1066
+ parsed = new globalThis.URL(dsn);
1067
+ } catch {
1068
+ return null;
1069
+ }
1070
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:" || !parsed.username || !parsed.host) {
1071
+ return null;
1072
+ }
1073
+ const scheme = parsed.protocol === "https:" ? "https" : "http";
1074
+ let service;
1075
+ try {
1076
+ service = decodeURIComponent(parsed.pathname.replace(/^\//, ""));
1077
+ } catch {
1078
+ return null;
1079
+ }
1080
+ if (service === "" || service === PLACEHOLDER_SERVICE) {
1081
+ return null;
1082
+ }
1083
+ return {
1084
+ scheme,
1085
+ host: parsed.host,
1086
+ bearer: decodeURIComponent(parsed.username),
1087
+ service,
1088
+ baseUrl: `${scheme}://${parsed.host}`
1089
+ };
1090
+ }
1091
+
951
1092
  // src/internal/config.ts
952
1093
  init_logger();
953
1094
  function resolveConfig(options) {
@@ -975,6 +1116,7 @@ function resolveConfig(options) {
975
1116
  appName: options.appName,
976
1117
  baseUrl: options.baseUrl,
977
1118
  hasApiKey: !!options.apiKey,
1119
+ dsnProvided: !!(process.env["BRIZZ_DSN"] || options.dsn),
978
1120
  disableBatch: options.disableBatch,
979
1121
  logLevel: resolvedLogLevel,
980
1122
  headersCount: Object.keys(options.headers || {}).length,
@@ -1002,7 +1144,42 @@ function resolveConfig(options) {
1002
1144
  logLevel: resolvedLogLevel,
1003
1145
  masking: resolvedMasking
1004
1146
  };
1005
- if (resolvedConfig.apiKey) {
1147
+ const dsnInput = process.env["BRIZZ_DSN"] || options.dsn;
1148
+ let parsedDSN = null;
1149
+ if (dsnInput) {
1150
+ const kwargConflicts = [];
1151
+ if (options.apiKey !== void 0) {
1152
+ kwargConflicts.push("apiKey");
1153
+ }
1154
+ if (options.baseUrl !== void 0) {
1155
+ kwargConflicts.push("baseUrl");
1156
+ }
1157
+ if (options.appName !== void 0) {
1158
+ kwargConflicts.push("appName");
1159
+ }
1160
+ if (kwargConflicts.length > 0) {
1161
+ throw new Error(
1162
+ `dsn cannot be combined with kwargs ${kwargConflicts.join(", ")}. The DSN bundles bearer, gateway URL, and service name \u2014 choose one configuration style.`
1163
+ );
1164
+ }
1165
+ const envConflicts = ["BRIZZ_API_KEY", "BRIZZ_BASE_URL", "BRIZZ_APP_NAME"].filter(
1166
+ (name) => process.env[name] !== void 0
1167
+ );
1168
+ if (envConflicts.length > 0) {
1169
+ logger.warn(
1170
+ `Ignoring ${envConflicts.join(", ")} \u2014 dsn / BRIZZ_DSN takes precedence.`
1171
+ );
1172
+ }
1173
+ resolvedConfig.apiKey = void 0;
1174
+ resolvedConfig.baseUrl = "https://telemetry.brizz.dev";
1175
+ resolvedConfig.appName = "unknown-app";
1176
+ parsedDSN = parseDSN(dsnInput);
1177
+ if (parsedDSN) {
1178
+ resolvedConfig.appName = parsedDSN.service;
1179
+ resolvedConfig.baseUrl = parsedDSN.baseUrl;
1180
+ resolvedConfig.apiKey = parsedDSN.bearer;
1181
+ }
1182
+ } else if (resolvedConfig.apiKey) {
1006
1183
  resolvedConfig.headers["Authorization"] = `Bearer ${resolvedConfig.apiKey}`;
1007
1184
  }
1008
1185
  if (process.env["BRIZZ_HEADERS"]) {
@@ -1017,14 +1194,28 @@ function resolveConfig(options) {
1017
1194
  throw new Error("Invalid JSON in BRIZZ_HEADERS environment variable", { cause: error });
1018
1195
  }
1019
1196
  }
1197
+ if (dsnInput) {
1198
+ const authHeaderKeys = /* @__PURE__ */ new Set(["authorization", SERVICE_NAME_HEADER.toLowerCase()]);
1199
+ resolvedConfig.headers = Object.fromEntries(
1200
+ Object.entries(resolvedConfig.headers).filter(
1201
+ ([key]) => !authHeaderKeys.has(key.toLowerCase())
1202
+ )
1203
+ );
1204
+ if (parsedDSN) {
1205
+ resolvedConfig.headers["Authorization"] = `Bearer ${parsedDSN.bearer}`;
1206
+ resolvedConfig.headers[SERVICE_NAME_HEADER] = parsedDSN.service;
1207
+ }
1208
+ }
1020
1209
  logger.debug("Configuration resolved with environment variables", {
1021
1210
  appName: resolvedConfig.appName,
1022
1211
  baseUrl: resolvedConfig.baseUrl,
1023
1212
  hasApiKey: !!resolvedConfig.apiKey,
1213
+ dsnProvided: !!dsnInput,
1024
1214
  disableBatch: resolvedConfig.disableBatch,
1025
1215
  envOverrides: {
1026
1216
  hasEnvApiKey: !!process.env["BRIZZ_API_KEY"],
1027
1217
  hasEnvBaseUrl: !!process.env["BRIZZ_BASE_URL"],
1218
+ hasEnvDsn: !!process.env["BRIZZ_DSN"],
1028
1219
  hasEnvBatch: !!process.env["BRIZZ_DISABLE_BATCH"],
1029
1220
  hasEnvHeaders: !!process.env["BRIZZ_HEADERS"]
1030
1221
  }
@@ -1182,21 +1373,11 @@ import { BatchLogRecordProcessor, SimpleLogRecordProcessor } from "@opentelemetr
1182
1373
 
1183
1374
  // src/internal/masking/patterns.ts
1184
1375
  var DEFAULT_PII_PATTERNS = [
1185
- // Email addresses
1186
- {
1187
- name: "email_addresses",
1188
- pattern: String.raw`\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b`
1189
- },
1190
1376
  // Phone numbers (US format)
1191
1377
  {
1192
1378
  name: "us_phone_numbers",
1193
1379
  pattern: String.raw`(?:^|[\s])(?:\+?1[-.\s]*)?(?:\([0-9]{3}\)\s?[0-9]{3}[-.\s]?[0-9]{4}|[0-9]{3}[-.\s]?[0-9]{3}[-.\s]?[0-9]{4}|[0-9]{10})(?=[\s]|$)`
1194
1380
  },
1195
- // Social Security Numbers
1196
- {
1197
- name: "ssn",
1198
- pattern: String.raw`\b(?!000|666|9\d{2})\d{3}[-\s]?(?!00)\d{2}[-\s]?(?!0000)\d{4}\b`
1199
- },
1200
1381
  // Credit card numbers
1201
1382
  {
1202
1383
  name: "credit_cards",
@@ -1220,19 +1401,11 @@ var DEFAULT_PII_PATTERNS = [
1220
1401
  name: "openai_keys",
1221
1402
  pattern: String.raw`\bsk[-_][a-zA-Z0-9]{20,}\b`
1222
1403
  },
1223
- {
1224
- name: "base64_secrets",
1225
- pattern: String.raw`\b[A-Za-z0-9+/]{64,}={0,2}\b`
1226
- },
1227
1404
  // AWS Keys
1228
1405
  {
1229
1406
  name: "aws_access_keys",
1230
1407
  pattern: String.raw`\b(?:AKIA|ABIA|ACCA|ASIA)[0-9A-Z]{16}\b`
1231
1408
  },
1232
- {
1233
- name: "aws_secret_keys",
1234
- pattern: String.raw`\b[A-Za-z0-9/+=]*[A-Z][A-Za-z0-9/+=]*[a-z][A-Za-z0-9/+=]*[/+=][A-Za-z0-9/+=]{30,}\b`
1235
- },
1236
1409
  // GitHub tokens
1237
1410
  {
1238
1411
  name: "github_tokens",
@@ -1263,11 +1436,6 @@ var DEFAULT_PII_PATTERNS = [
1263
1436
  name: "ipv6_addresses",
1264
1437
  pattern: String.raw`\b(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\b`
1265
1438
  },
1266
- // Medical records
1267
- {
1268
- name: "medical_record_numbers",
1269
- pattern: String.raw`\b(?:[Mm][Rr][Nn])[-\s]?\d{6,10}\b`
1270
- },
1271
1439
  // Bitcoin addresses
1272
1440
  {
1273
1441
  name: "bitcoin_addresses",
@@ -1278,11 +1446,6 @@ var DEFAULT_PII_PATTERNS = [
1278
1446
  name: "ethereum_addresses",
1279
1447
  pattern: String.raw`\b0x[a-fA-F0-9]{40}(?![a-fA-F0-9])\b`
1280
1448
  },
1281
- // UUIDs
1282
- {
1283
- name: "uuids",
1284
- pattern: String.raw`\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}(?![0-9a-fA-F-])\b`
1285
- },
1286
1449
  // Database connection strings
1287
1450
  {
1288
1451
  name: "database_connections",
@@ -1301,90 +1464,6 @@ var DEFAULT_PII_PATTERNS = [
1301
1464
  name: "certificates",
1302
1465
  pattern: "-----BEGIN CERTIFICATE-----"
1303
1466
  },
1304
- // Date of birth patterns
1305
- {
1306
- name: "date_of_birth_us",
1307
- pattern: String.raw`\b(?:0[1-9]|1[0-2])[-/](?:0[1-9]|[12]\\d|3[01])[-/](?:19|20)\\d{2}\b`
1308
- },
1309
- {
1310
- name: "date_of_birth_iso",
1311
- pattern: String.raw`\b(?:19|20)\\d{2}[-/](?:0[1-9]|1[0-2])[-/](?:0[1-9]|[12]\\d|3[01])\b`
1312
- },
1313
- // US Identification Numbers
1314
- {
1315
- name: "us_passport_numbers",
1316
- pattern: String.raw`\b[A-Z]?\\d{6,9}\b`
1317
- },
1318
- {
1319
- name: "drivers_license",
1320
- pattern: String.raw`\b[A-Z]{1,2}\\d{3,8}[-\s]?\\d{2,5}[-\s]?\\d{2,5}[-\s]?\\d{1,5}[-\s]?\\d?\b`
1321
- },
1322
- {
1323
- name: "bank_account_numbers",
1324
- pattern: String.raw`\b\\d{10,17}\b`
1325
- },
1326
- {
1327
- name: "aba_routing_numbers",
1328
- pattern: String.raw`\b((0[0-9])|(1[0-2])|(2[1-9])|(3[0-2])|(6[1-9])|(7[0-2])|80)([0-9]{7})\b`
1329
- },
1330
- {
1331
- name: "health_insurance_numbers",
1332
- pattern: String.raw`\b\\d{10}[A-Z]\b`
1333
- },
1334
- {
1335
- name: "employee_ids",
1336
- pattern: String.raw`\b(?:[Ee][Mm][Pp]|[Ee][Mm][Pp][Ll][Oo][Yy][Ee][Ee]|[Ee])[-\s]?\\d{5,8}\b`
1337
- },
1338
- {
1339
- name: "tax_ein",
1340
- pattern: String.raw`\b\\d{2}-\\d{7}\b`
1341
- },
1342
- {
1343
- name: "medicare_beneficiary_id",
1344
- pattern: String.raw`\b[1-9][A-Z][A-Z0-9]\\d-[A-Z][A-Z0-9]\\d-[A-Z][A-Z0-9]\\d{2}\b`
1345
- },
1346
- {
1347
- name: "national_provider_id",
1348
- pattern: String.raw`\b1\\d{9}\b`
1349
- },
1350
- {
1351
- name: "dea_numbers",
1352
- pattern: String.raw`\b[A-Z]{2}\\d{7}\b`
1353
- },
1354
- {
1355
- name: "itin",
1356
- pattern: String.raw`\b9\\d{2}(?:[ \\-]?)[7,8]\\d(?:[ \\-]?)\\d{4}\b`
1357
- },
1358
- // Vehicle and Location
1359
- {
1360
- name: "vin_numbers",
1361
- pattern: String.raw`\b[A-HJ-NPR-Z0-9]{17}\b`
1362
- },
1363
- {
1364
- name: "coordinates",
1365
- pattern: String.raw`\b[-+]?(?:[0-8]?\\d(?:\\.\\d+)?|90(?:\\.0+)?),\\s*[-+]?(?:1[0-7]\\d(?:\\.\\d+)?|180(?:\\.0+)?|[0-9]?\\d(?:\\.\\d+)?)\b`
1366
- },
1367
- {
1368
- name: "us_license_plates",
1369
- pattern: String.raw`\b[A-Z]{1,3}[-\s]\\d{1,4}[A-Z]?\b|\b\\d{1,2}[A-Z]{1,3}\\d{1,4}\b`
1370
- },
1371
- {
1372
- name: "us_zip_codes",
1373
- pattern: String.raw`\b(\\d{5}-\\d{4}|\\d{5})\b`
1374
- },
1375
- {
1376
- name: "us_street_addresses",
1377
- pattern: String.raw`\b\\d{1,8}\b[\\s\\S]{10,100}?\b(AK|AL|AR|AZ|CA|CO|CT|DC|DE|FL|GA|HI|IA|ID|IL|IN|KS|KY|LA|MA|MD|ME|MI|MN|MO|MS|MT|NC|ND|NE|NH|NJ|NM|NV|NY|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VA|VT|WA|WI|WV|WY)\b\\s\\d{5}\b`
1378
- },
1379
- // International Banking
1380
- {
1381
- name: "iban",
1382
- pattern: String.raw`\b[A-Z]{2}\d{2}[A-Z0-9]{4}\d{7}([A-Z0-9]?){0,16}\b`
1383
- },
1384
- {
1385
- name: "swift_bic",
1386
- pattern: String.raw`\b[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?\b`
1387
- },
1388
1467
  // Additional API Keys and Tokens
1389
1468
  {
1390
1469
  name: "google_oauth",
@@ -1447,73 +1526,6 @@ var DEFAULT_PII_PATTERNS = [
1447
1526
  name: "putty_ssh_keys",
1448
1527
  pattern: String.raw`PuTTY-User-Key-File-2: ssh-(?:rsa|dss)\s*Encryption: none(?:.|\s?)*?Private-MAC:`
1449
1528
  },
1450
- // International Phone Numbers
1451
- {
1452
- name: "france_phone_numbers",
1453
- pattern: String.raw`\b([0O]?[1lI][1lI])?[3E][3E][0O]?[\\dOIlZEASB]{9}\b`
1454
- },
1455
- {
1456
- name: "german_phone_numbers",
1457
- pattern: String.raw`\b[\d\w]\d{2}[\d\w]{6}\d[\d\w]\b`
1458
- },
1459
- {
1460
- name: "uk_phone_numbers",
1461
- pattern: String.raw`\b([0O]?[1lI][1lI])?[4A][4A][\\dOIlZEASB]{10,11}\b`
1462
- },
1463
- // International IDs
1464
- {
1465
- name: "uk_drivers_license",
1466
- pattern: String.raw`\b[A-Z]{5}\d{6}[A-Z]{2}\d{1}[A-Z]{2}\b`
1467
- },
1468
- {
1469
- name: "uk_passport",
1470
- pattern: String.raw`\b\\d{10}GB[RP]\\d{7}[UMF]{1}\\d{9}\b`
1471
- },
1472
- {
1473
- name: "argentina_dni",
1474
- pattern: String.raw`\b\\d{2}\\.\\d{3}\\.\\d{3}\b`
1475
- },
1476
- {
1477
- name: "australia_tfn",
1478
- pattern: String.raw`\b[Tt][Ff][Nn](:|:\\s|\\s|)(\\d{8,9})\b`
1479
- },
1480
- {
1481
- name: "canada_passport",
1482
- pattern: String.raw`\b[\\w]{2}[\\d]{6}\b`
1483
- },
1484
- {
1485
- name: "croatia_vat",
1486
- pattern: String.raw`\bHR\\d{11}\b`
1487
- },
1488
- {
1489
- name: "czech_vat",
1490
- pattern: String.raw`\bCZ\\d{8,10}\b`
1491
- },
1492
- {
1493
- name: "denmark_personal_id",
1494
- pattern: String.raw`\b(?:\\d{10}|\\d{6}[-\\s]\\d{4})\b`
1495
- },
1496
- {
1497
- name: "france_national_id",
1498
- pattern: String.raw`\b\\d{12}\b`
1499
- },
1500
- {
1501
- name: "france_ssn",
1502
- pattern: String.raw`\b(?:\\d{13}|\\d{13}\\s\\d{2})\b`
1503
- },
1504
- {
1505
- name: "france_passport",
1506
- pattern: String.raw`\b\\d{2}11\\d{5}\b`
1507
- },
1508
- {
1509
- name: "california_drivers_license",
1510
- pattern: String.raw`\b[A-Z]{1}\\d{7}\b`
1511
- },
1512
- // Medical and Healthcare
1513
- {
1514
- name: "hipaa_ndc",
1515
- pattern: String.raw`\b\\d{4,5}-\\d{3,4}-\\d{1,2}\b`
1516
- },
1517
1529
  // Security and Network
1518
1530
  {
1519
1531
  name: "cve_numbers",
@@ -1547,44 +1559,6 @@ var DEFAULT_PII_PATTERNS = [
1547
1559
  {
1548
1560
  name: "discover_cards",
1549
1561
  pattern: String.raw`\b65[4-9][0-9]{13}|64[4-9][0-9]{13}|6011[0-9]{12}\b`
1550
- },
1551
- {
1552
- name: "enhanced_credit_cards",
1553
- pattern: String.raw`\b((4\\d{3}|5[1-5]\\d{2}|2\\d{3}|3[47]\\d{1,2})[\\s\\-]?\\d{4,6}[\\s\\-]?\\d{4,6}?([\\s\\-]\\d{3,4})?(\\d{3})?)\b`
1554
- },
1555
- // Bank Routing Numbers (US specific)
1556
- {
1557
- name: "bbva_routing_ca",
1558
- pattern: String.raw`\\b321170538\\b`
1559
- },
1560
- {
1561
- name: "boa_routing_ca",
1562
- pattern: String.raw`\\b(?:121|026)00(?:0|9)(?:358|593)\\b`
1563
- },
1564
- {
1565
- name: "chase_routing_ca",
1566
- pattern: String.raw`\\b322271627\\b`
1567
- },
1568
- {
1569
- name: "citibank_routing_ca",
1570
- pattern: String.raw`\\b32(?:11|22)71(?:18|72)4\\b`
1571
- },
1572
- {
1573
- name: "usbank_routing_ca",
1574
- pattern: String.raw`\\b12(?:1122676|2235821)\\b`
1575
- },
1576
- {
1577
- name: "united_bank_routing_ca",
1578
- pattern: String.raw`\\b122243350\\b`
1579
- },
1580
- {
1581
- name: "wells_fargo_routing_ca",
1582
- pattern: String.raw`\\b121042882\\b`
1583
- },
1584
- // Unrealistic alphanumeric identifiers
1585
- {
1586
- name: "generic_non_usual",
1587
- pattern: String.raw`(?:^|\s)(?=[A-Za-z0-9_\)\*\=@]*[A-Za-z])(?=[A-Za-z0-9_\)\*\=@]*[0-9])([A-Za-z0-9_\)\*\=@]{5,})(?=\s|$)`
1588
1562
  }
1589
1563
  ];
1590
1564
 
@@ -1806,7 +1780,7 @@ function maskAttributes(attributes, rules, outputOriginalValue = false) {
1806
1780
  }
1807
1781
 
1808
1782
  // src/internal/log/processors/log-processor.ts
1809
- init_semantic_conventions();
1783
+ init_semantic_conventions2();
1810
1784
  var DEFAULT_LOG_MASKING_RULES = [
1811
1785
  {
1812
1786
  mode: "partial",
@@ -2251,7 +2225,7 @@ import {
2251
2225
  BatchSpanProcessor,
2252
2226
  SimpleSpanProcessor
2253
2227
  } from "@opentelemetry/sdk-trace-base";
2254
- init_semantic_conventions();
2228
+ init_semantic_conventions2();
2255
2229
  function applyContextAttributes(span) {
2256
2230
  const sessionProperties = context4.active().getValue(PROPERTIES_CONTEXT_KEY);
2257
2231
  if (sessionProperties) {
@@ -2263,12 +2237,6 @@ function applyContextAttributes(span) {
2263
2237
  var DEFAULT_MASKING_RULES = [
2264
2238
  {
2265
2239
  mode: "partial",
2266
- attributePattern: "gen_ai.prompt",
2267
- patterns: DEFAULT_PII_PATTERNS
2268
- },
2269
- {
2270
- mode: "partial",
2271
- attributePattern: "gen_ai.completion",
2272
2240
  patterns: DEFAULT_PII_PATTERNS
2273
2241
  }
2274
2242
  ];
@@ -2278,24 +2246,16 @@ var BrizzSimpleSpanProcessor = class extends SimpleSpanProcessor {
2278
2246
  super(spanExporter);
2279
2247
  this.config = config;
2280
2248
  }
2281
- // Will work with the following code:
2282
- // const span = tracer.startSpan('sensitive-operation',{attributes:{
2283
- // 'user.password': 'secret123',
2284
- // 'user.email': 'user@example.com',
2285
- // }});
2286
- //
2287
- // Won't work because onStart is called before attributes are set:
2288
- // span.setAttributes({
2289
- // 'user.password': 'secret123',
2290
- // 'user.email': 'user@example.com'
2291
- // });
2292
2249
  onStart(span, parentContext) {
2250
+ applyContextAttributes(span);
2251
+ super.onStart(span, parentContext);
2252
+ }
2253
+ onEnd(span) {
2293
2254
  const maskingConfig = this.config.masking?.spanMasking;
2294
2255
  if (maskingConfig) {
2295
- maskSpan(span, maskingConfig);
2256
+ maskReadableSpan(span, maskingConfig);
2296
2257
  }
2297
- applyContextAttributes(span);
2298
- super.onStart(span, parentContext);
2258
+ super.onEnd(span);
2299
2259
  }
2300
2260
  };
2301
2261
  var BrizzBatchSpanProcessor = class extends BatchSpanProcessor {
@@ -2305,39 +2265,39 @@ var BrizzBatchSpanProcessor = class extends BatchSpanProcessor {
2305
2265
  this.config = config;
2306
2266
  }
2307
2267
  onStart(span, parentContext) {
2268
+ applyContextAttributes(span);
2269
+ super.onStart(span, parentContext);
2270
+ }
2271
+ onEnd(span) {
2308
2272
  const maskingConfig = this.config.masking?.spanMasking;
2309
2273
  if (maskingConfig) {
2310
- maskSpan(span, maskingConfig);
2274
+ maskReadableSpan(span, maskingConfig);
2311
2275
  }
2312
- applyContextAttributes(span);
2313
- super.onStart(span, parentContext);
2276
+ super.onEnd(span);
2314
2277
  }
2315
2278
  };
2316
- function maskSpan(span, config) {
2317
- if (!span.attributes || Object.keys(span.attributes).length === 0) {
2318
- return span;
2279
+ function maskReadableSpan(span, config) {
2280
+ const attrs = span.attributes;
2281
+ if (!attrs || Object.keys(attrs).length === 0) {
2282
+ return;
2319
2283
  }
2320
- let rules = config.rules || [];
2284
+ let rules = config.rules ? [...config.rules] : [];
2321
2285
  if (!config.disableDefaultRules) {
2322
- rules = [...DEFAULT_MASKING_RULES, ...rules];
2286
+ rules = [...rules, ...DEFAULT_MASKING_RULES];
2323
2287
  }
2324
2288
  try {
2325
- const attributesRecord = {};
2326
- for (const [key, value] of Object.entries(span.attributes)) {
2327
- attributesRecord[key] = value;
2328
- }
2329
- const maskedAttributes = maskAttributes(attributesRecord, rules);
2330
- if (maskedAttributes && Object.keys(maskedAttributes).length > 0) {
2331
- const merged = { ...span.attributes };
2332
- for (const [key, value] of Object.entries(maskedAttributes)) {
2333
- merged[key] = value;
2289
+ const input = {};
2290
+ for (const [k, v] of Object.entries(attrs)) {
2291
+ input[k] = v;
2292
+ }
2293
+ const masked = maskAttributes(input, rules);
2294
+ for (const [k, v] of Object.entries(masked ?? {})) {
2295
+ if (attrs[k] !== v) {
2296
+ attrs[k] = v;
2334
2297
  }
2335
- span.setAttributes(merged);
2336
2298
  }
2337
- return span;
2338
2299
  } catch (error) {
2339
- logger.error("Error masking span:", error);
2340
- return span;
2300
+ logger.error("Error masking span", { err: error });
2341
2301
  }
2342
2302
  }
2343
2303
 
@@ -2453,8 +2413,8 @@ function getSpanProcessor() {
2453
2413
  }
2454
2414
 
2455
2415
  // src/internal/trace/session.ts
2456
- init_semantic_conventions();
2457
- import { context as context5, trace as trace3, SpanStatusCode as SpanStatusCode2 } from "@opentelemetry/api";
2416
+ init_semantic_conventions2();
2417
+ import { context as context5, trace as trace3, SpanStatusCode as SpanStatusCode3 } from "@opentelemetry/api";
2458
2418
  function setCurrentSpanCustomProperties(properties) {
2459
2419
  const current = trace3.getActiveSpan();
2460
2420
  if (!current || !current.isRecording()) {
@@ -2605,7 +2565,7 @@ function startSession(sessionId, callback, extraProperties, options) {
2605
2565
  return value;
2606
2566
  }).catch((error) => {
2607
2567
  span.recordException(error);
2608
- span.setStatus({ code: SpanStatusCode2.ERROR });
2568
+ span.setStatus({ code: SpanStatusCode3.ERROR });
2609
2569
  span.end();
2610
2570
  throw error;
2611
2571
  });
@@ -2614,7 +2574,7 @@ function startSession(sessionId, callback, extraProperties, options) {
2614
2574
  return result;
2615
2575
  } catch (error) {
2616
2576
  span.recordException(error);
2617
- span.setStatus({ code: SpanStatusCode2.ERROR });
2577
+ span.setStatus({ code: SpanStatusCode3.ERROR });
2618
2578
  span.end();
2619
2579
  throw error;
2620
2580
  }
@@ -2643,7 +2603,7 @@ function startSessionTitle(callback, options) {
2643
2603
  return value;
2644
2604
  }).catch((error) => {
2645
2605
  span.recordException(error);
2646
- span.setStatus({ code: SpanStatusCode2.ERROR });
2606
+ span.setStatus({ code: SpanStatusCode3.ERROR });
2647
2607
  span.end();
2648
2608
  throw error;
2649
2609
  });
@@ -2652,7 +2612,7 @@ function startSessionTitle(callback, options) {
2652
2612
  return result;
2653
2613
  } catch (error) {
2654
2614
  span.recordException(error);
2655
- span.setStatus({ code: SpanStatusCode2.ERROR });
2615
+ span.setStatus({ code: SpanStatusCode3.ERROR });
2656
2616
  span.end();
2657
2617
  throw error;
2658
2618
  }
@@ -2939,4 +2899,3 @@ export {
2939
2899
  withProperties,
2940
2900
  withSessionId
2941
2901
  };
2942
- //# sourceMappingURL=index.js.map