@morsehq-dev/sdk 0.5.0 → 0.6.0-rc.1

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 (142) hide show
  1. package/README.md +11 -10
  2. package/dist/anthropic/index.cjs +11 -11
  3. package/dist/anthropic/index.d.cts +1 -1
  4. package/dist/anthropic/index.d.ts +1 -1
  5. package/dist/anthropic/index.js +4 -4
  6. package/dist/anthropic-agent-sdk/index.cjs +44 -40
  7. package/dist/anthropic-agent-sdk/index.cjs.map +1 -1
  8. package/dist/anthropic-agent-sdk/index.d.cts +1 -1
  9. package/dist/anthropic-agent-sdk/index.d.ts +1 -1
  10. package/dist/anthropic-agent-sdk/index.js +10 -6
  11. package/dist/anthropic-agent-sdk/index.js.map +1 -1
  12. package/dist/browser/anthropic/index.cjs +11 -11
  13. package/dist/browser/anthropic/index.js +4 -4
  14. package/dist/browser/anthropic-agent-sdk/index.cjs +44 -40
  15. package/dist/browser/anthropic-agent-sdk/index.cjs.map +1 -1
  16. package/dist/browser/anthropic-agent-sdk/index.js +10 -6
  17. package/dist/browser/anthropic-agent-sdk/index.js.map +1 -1
  18. package/dist/browser/{chunk-ELQ4LGAS.cjs → chunk-33WDUUKZ.cjs} +18 -18
  19. package/dist/browser/{chunk-ELQ4LGAS.cjs.map → chunk-33WDUUKZ.cjs.map} +1 -1
  20. package/dist/browser/{chunk-TV7TRP5O.cjs → chunk-3I7IGP3P.cjs} +5 -5
  21. package/dist/browser/chunk-3I7IGP3P.cjs.map +1 -0
  22. package/dist/browser/{chunk-YYUDZTHI.js → chunk-3OYHDDOJ.js} +27 -5
  23. package/dist/browser/chunk-3OYHDDOJ.js.map +1 -0
  24. package/dist/browser/{chunk-6BNMYEMW.cjs → chunk-4IUHXUCJ.cjs} +49 -9
  25. package/dist/browser/chunk-4IUHXUCJ.cjs.map +1 -0
  26. package/dist/browser/{chunk-BUCIE3DR.js → chunk-5TYTCLKA.js} +4 -4
  27. package/dist/browser/{chunk-BUCIE3DR.js.map → chunk-5TYTCLKA.js.map} +1 -1
  28. package/dist/browser/{chunk-VIOT3AOP.js → chunk-6JHMFFPE.js} +3 -3
  29. package/dist/browser/chunk-6JHMFFPE.js.map +1 -0
  30. package/dist/browser/{chunk-BIP66M44.cjs → chunk-FKYI3N5N.cjs} +7 -7
  31. package/dist/browser/{chunk-BIP66M44.cjs.map → chunk-FKYI3N5N.cjs.map} +1 -1
  32. package/dist/browser/{chunk-NU74H55W.js → chunk-FPTUHYDJ.js} +3 -3
  33. package/dist/browser/{chunk-NU74H55W.js.map → chunk-FPTUHYDJ.js.map} +1 -1
  34. package/dist/browser/{chunk-52JTU4LH.cjs → chunk-IDKQZ4X5.cjs} +38 -15
  35. package/dist/browser/chunk-IDKQZ4X5.cjs.map +1 -0
  36. package/dist/browser/{chunk-2X64OY2L.cjs → chunk-LIP3XCTK.cjs} +12 -12
  37. package/dist/browser/{chunk-2X64OY2L.cjs.map → chunk-LIP3XCTK.cjs.map} +1 -1
  38. package/dist/browser/{chunk-T6Z6UIBN.js → chunk-OUQAH27A.js} +3 -3
  39. package/dist/browser/{chunk-T6Z6UIBN.js.map → chunk-OUQAH27A.js.map} +1 -1
  40. package/dist/browser/{chunk-4CMVMTFB.cjs → chunk-PSNZZBQJ.cjs} +6 -6
  41. package/dist/browser/{chunk-4CMVMTFB.cjs.map → chunk-PSNZZBQJ.cjs.map} +1 -1
  42. package/dist/browser/{chunk-6T6ZPOKZ.js → chunk-PXHTLCEU.js} +49 -10
  43. package/dist/browser/chunk-PXHTLCEU.js.map +1 -0
  44. package/dist/browser/{chunk-KZFG23MO.js → chunk-TRVACYUN.js} +5 -5
  45. package/dist/browser/{chunk-KZFG23MO.js.map → chunk-TRVACYUN.js.map} +1 -1
  46. package/dist/browser/index.cjs +189 -124
  47. package/dist/browser/index.cjs.map +1 -1
  48. package/dist/browser/index.js +111 -46
  49. package/dist/browser/index.js.map +1 -1
  50. package/dist/browser/integrations/pino.cjs +4 -4
  51. package/dist/browser/integrations/pino.js +3 -3
  52. package/dist/browser/langchain/index.cjs +28 -26
  53. package/dist/browser/langchain/index.cjs.map +1 -1
  54. package/dist/browser/langchain/index.js +13 -11
  55. package/dist/browser/langchain/index.js.map +1 -1
  56. package/dist/browser/langgraph/index.cjs +32 -30
  57. package/dist/browser/langgraph/index.cjs.map +1 -1
  58. package/dist/browser/langgraph/index.js +10 -8
  59. package/dist/browser/langgraph/index.js.map +1 -1
  60. package/dist/browser/openai/index.cjs +11 -11
  61. package/dist/browser/openai/index.js +2 -2
  62. package/dist/browser/openai-agents/index.cjs +63 -35
  63. package/dist/browser/openai-agents/index.cjs.map +1 -1
  64. package/dist/browser/openai-agents/index.js +33 -5
  65. package/dist/browser/openai-agents/index.js.map +1 -1
  66. package/dist/browser/vercel-ai/index.cjs +14 -14
  67. package/dist/browser/vercel-ai/index.js +3 -3
  68. package/dist/{chunk-KMBKZLXH.cjs → chunk-7DALGJL2.cjs} +100 -25
  69. package/dist/chunk-7DALGJL2.cjs.map +1 -0
  70. package/dist/{chunk-D5NTF54A.cjs → chunk-B7TGG62X.cjs} +12 -12
  71. package/dist/{chunk-D5NTF54A.cjs.map → chunk-B7TGG62X.cjs.map} +1 -1
  72. package/dist/{chunk-LPLL2OXI.cjs → chunk-COZFARLL.cjs} +5 -5
  73. package/dist/chunk-COZFARLL.cjs.map +1 -0
  74. package/dist/{chunk-GTPKPUAV.cjs → chunk-DXTNU2KT.cjs} +38 -15
  75. package/dist/chunk-DXTNU2KT.cjs.map +1 -0
  76. package/dist/{chunk-6FLGLD72.js → chunk-ERH3TNXZ.js} +3 -3
  77. package/dist/{chunk-6FLGLD72.js.map → chunk-ERH3TNXZ.js.map} +1 -1
  78. package/dist/{chunk-7HYFOHM3.cjs → chunk-ESJJXXB6.cjs} +6 -6
  79. package/dist/{chunk-7HYFOHM3.cjs.map → chunk-ESJJXXB6.cjs.map} +1 -1
  80. package/dist/{chunk-SUEBUMHL.cjs → chunk-ETRNCI5Z.cjs} +18 -18
  81. package/dist/{chunk-SUEBUMHL.cjs.map → chunk-ETRNCI5Z.cjs.map} +1 -1
  82. package/dist/{chunk-KWOSUW7B.js → chunk-GULJAURY.js} +27 -5
  83. package/dist/chunk-GULJAURY.js.map +1 -0
  84. package/dist/{chunk-ZIMGB7IT.js → chunk-HJV35HWL.js} +100 -26
  85. package/dist/chunk-HJV35HWL.js.map +1 -0
  86. package/dist/{chunk-3ONFIKKC.js → chunk-L7AD4KUD.js} +3 -3
  87. package/dist/chunk-L7AD4KUD.js.map +1 -0
  88. package/dist/{chunk-SFI36VWW.js → chunk-QBDTQTMN.js} +3 -3
  89. package/dist/{chunk-SFI36VWW.js.map → chunk-QBDTQTMN.js.map} +1 -1
  90. package/dist/{chunk-NMARCV3R.cjs → chunk-WG4H5JC6.cjs} +7 -7
  91. package/dist/{chunk-NMARCV3R.cjs.map → chunk-WG4H5JC6.cjs.map} +1 -1
  92. package/dist/{chunk-J5FEPM7L.js → chunk-XS4P7XPV.js} +5 -5
  93. package/dist/{chunk-J5FEPM7L.js.map → chunk-XS4P7XPV.js.map} +1 -1
  94. package/dist/{chunk-ZZSVPAXM.js → chunk-YVLEDBN7.js} +4 -4
  95. package/dist/{chunk-ZZSVPAXM.js.map → chunk-YVLEDBN7.js.map} +1 -1
  96. package/dist/index.cjs +199 -134
  97. package/dist/index.cjs.map +1 -1
  98. package/dist/index.d.cts +13 -2
  99. package/dist/index.d.ts +13 -2
  100. package/dist/index.js +112 -47
  101. package/dist/index.js.map +1 -1
  102. package/dist/integrations/pino.cjs +4 -4
  103. package/dist/integrations/pino.js +3 -3
  104. package/dist/langchain/index.cjs +28 -26
  105. package/dist/langchain/index.cjs.map +1 -1
  106. package/dist/langchain/index.d.cts +3 -3
  107. package/dist/langchain/index.d.ts +3 -3
  108. package/dist/langchain/index.js +13 -11
  109. package/dist/langchain/index.js.map +1 -1
  110. package/dist/langgraph/index.cjs +32 -30
  111. package/dist/langgraph/index.cjs.map +1 -1
  112. package/dist/langgraph/index.d.cts +3 -3
  113. package/dist/langgraph/index.d.ts +3 -3
  114. package/dist/langgraph/index.js +10 -8
  115. package/dist/langgraph/index.js.map +1 -1
  116. package/dist/openai/index.cjs +11 -11
  117. package/dist/openai/index.js +2 -2
  118. package/dist/openai-agents/index.cjs +63 -35
  119. package/dist/openai-agents/index.cjs.map +1 -1
  120. package/dist/openai-agents/index.d.cts +13 -4
  121. package/dist/openai-agents/index.d.ts +13 -4
  122. package/dist/openai-agents/index.js +33 -5
  123. package/dist/openai-agents/index.js.map +1 -1
  124. package/dist/{spans-DZtMuBvc.d.cts → spans-CBMWNg2C.d.cts} +1 -0
  125. package/dist/{spans-DZtMuBvc.d.ts → spans-CBMWNg2C.d.ts} +1 -0
  126. package/dist/{tracing-J8ZgxVzU.d.ts → tracing-BMWTyexr.d.ts} +1 -1
  127. package/dist/{tracing-CNlre8TK.d.cts → tracing-Bh-cbvr6.d.cts} +1 -1
  128. package/dist/vercel-ai/index.cjs +14 -14
  129. package/dist/vercel-ai/index.js +3 -3
  130. package/package.json +1 -1
  131. package/dist/browser/chunk-52JTU4LH.cjs.map +0 -1
  132. package/dist/browser/chunk-6BNMYEMW.cjs.map +0 -1
  133. package/dist/browser/chunk-6T6ZPOKZ.js.map +0 -1
  134. package/dist/browser/chunk-TV7TRP5O.cjs.map +0 -1
  135. package/dist/browser/chunk-VIOT3AOP.js.map +0 -1
  136. package/dist/browser/chunk-YYUDZTHI.js.map +0 -1
  137. package/dist/chunk-3ONFIKKC.js.map +0 -1
  138. package/dist/chunk-GTPKPUAV.cjs.map +0 -1
  139. package/dist/chunk-KMBKZLXH.cjs.map +0 -1
  140. package/dist/chunk-KWOSUW7B.js.map +0 -1
  141. package/dist/chunk-LPLL2OXI.cjs.map +0 -1
  142. package/dist/chunk-ZIMGB7IT.js.map +0 -1
@@ -256,7 +256,7 @@ function redactValue(value, config, depth = 0) {
256
256
  }
257
257
  return value;
258
258
  }
259
- var PATTERN_ORDER, MANDATORY_PATTERNS, DEFAULT_OFF_PATTERNS, SHORT_KEYS, PATTERNS, EXTRA_PATTERN_CAP, EXTRA_PATTERN_CHAR_CAP, MAX_DEPTH;
259
+ var PATTERN_ORDER, MANDATORY_PATTERNS, DEFAULT_OFF_PATTERNS, SHORT_KEYS, SECRET_ASSIGNMENT_SOURCE, PATTERNS, EXTRA_PATTERN_CAP, EXTRA_PATTERN_CHAR_CAP, MAX_DEPTH;
260
260
  var init_redaction = __esm({
261
261
  "src/_internal/redaction.ts"() {
262
262
  PATTERN_ORDER = [
@@ -267,7 +267,10 @@ var init_redaction = __esm({
267
267
  "phone_us",
268
268
  "phone_e164",
269
269
  "ssn_us",
270
- "ip_address"
270
+ "ip_address",
271
+ // Last: the value-shaped patterns above are more specific, so a JWT inside
272
+ // `authorization: Bearer eyJ...` gets its own tag before this one runs.
273
+ "secret_assignment"
271
274
  ];
272
275
  MANDATORY_PATTERNS = /* @__PURE__ */ new Set([
273
276
  "api_key_prefixed",
@@ -284,8 +287,13 @@ var init_redaction = __esm({
284
287
  phone_us: "phone",
285
288
  phone_e164: "phone",
286
289
  ssn_us: "ssn",
287
- ip_address: "ip"
290
+ ip_address: "ip",
291
+ secret_assignment: "secret"
292
+ // pragma: allowlist secret — a label, not a value
288
293
  };
294
+ SECRET_ASSIGNMENT_SOURCE = // Compound keys accept `=` or `:`; bare `secret` requires `=`, because with
295
+ // `:` it is more often a marker (`k8s-secret: mounted`) than an assignment.
296
+ `(?:(?:password|passwd|pwd|client[-_]?secret|secret[-_]?key|private[-_]?key|access[-_]?key|api[-_]?key|auth[-_]?token|access[-_]?token|refresh[-_]?token|id[-_]?token|session[-_]?token|authorization|credentials?)["']?\\s*[=:]|\\bsecret["']?\\s*=)\\s*(?:bearer\\s+)?(?:"[^"]*"|'[^']*'|\\S+)`;
289
297
  PATTERNS = {
290
298
  api_key_prefixed: new RegExp(
291
299
  "\\b(?:sk-[A-Za-z0-9_-]{20,}|sk_(?:live|test)_[A-Za-z0-9]{20,}|mhq_[A-Za-z0-9]{20,}|av_[A-Za-z0-9]{20,}|ghp_[A-Za-z0-9]{36}|gho_[A-Za-z0-9]{36}|ghu_[A-Za-z0-9]{36}|ghs_[A-Za-z0-9]{36}|ghr_[A-Za-z0-9]{36}|xox[bopsa]-[0-9A-Za-z\\-]{10,}|(?:AKIA|ASIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASCA)[0-9A-Z]{16})\\b",
@@ -316,7 +324,17 @@ var init_redaction = __esm({
316
324
  ip_address: new RegExp(
317
325
  "\\b(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}|(?:[A-F0-9]{1,4}:){2,7}[A-F0-9]{1,4})\\b",
318
326
  "gi"
319
- )
327
+ ),
328
+ // MHQ-973 — key-context secret assignment. Every pattern above is
329
+ // VALUE-shaped: it recognises a credential by its own format. That cannot
330
+ // catch `password=hunter2` — `hunter2` is an ordinary word, and only the KEY
331
+ // marks it as a secret.
332
+ //
333
+ // Deliberately excludes a bare `token`: this is an LLM-observability SDK, and
334
+ // `input_tokens=100` / `max_tokens=4096` are core telemetry. Only unambiguous
335
+ // `*_token` compounds match. No leading `\\b` either, so `PGPASSWORD=` and
336
+ // `MYSQL_PWD=` are caught; the `[=:]` anchor is what prevents false positives.
337
+ secret_assignment: new RegExp(SECRET_ASSIGNMENT_SOURCE, "gi")
320
338
  };
321
339
  EXTRA_PATTERN_CAP = 10;
322
340
  EXTRA_PATTERN_CHAR_CAP = 256;
@@ -411,6 +429,7 @@ function redactedMessage(error) {
411
429
  const out = redactValue(raw, activeRedactionConfig);
412
430
  raw = typeof out === "string" ? out : String(out);
413
431
  }
432
+ raw = raw.replace(new RegExp(SECRET_ASSIGNMENT_SOURCE, "gi"), "[REDACTED:secret]");
414
433
  } catch {
415
434
  return "<redaction unavailable>";
416
435
  }
@@ -436,6 +455,7 @@ function recordDrop(reason, category, quantity = 1) {
436
455
  if (checkBucket(localLogBuckets, `drop:${key}`, LOCAL_LOG_LIMIT_PER_WINDOW, LOCAL_LOG_WINDOW_MS)) {
437
456
  console.warn(`morse: dropped ${quantity} ${category} (${reason}) \u2014 telemetry is being lost`);
438
457
  }
458
+ if (transmissionAllowed()) ensureTimer();
439
459
  } catch {
440
460
  }
441
461
  }
@@ -604,12 +624,12 @@ function _resetForTesting() {
604
624
  level = LEVEL_ERROR;
605
625
  activeRedactionConfig = null;
606
626
  }
607
- var SDK_VERSION, LEVEL_OFF, LEVEL_ERROR, LEVEL_DEBUG, VALID_LEVELS, level, RATE_WINDOW_MS, RATE_LIMIT_PER_WINDOW, RATE_LIMIT_PER_WINDOW_DEBUG, rateBuckets, LOCAL_LOG_WINDOW_MS, LOCAL_LOG_LIMIT_PER_WINDOW, localLogBuckets, MAX_STACK_ENTRIES, MAX_MESSAGE_CHARS, MAX_BATCH_EVENTS, ALLOWED_EXTRA_KEYS, DIAGNOSTICS_PATH, MAX_PENDING, FLUSH_INTERVAL_MS, BREAKER_THRESHOLD, BREAKER_COOLDOWN_MS; exports.REASON_QUEUE_FULL = void 0; exports.REASON_RETRY_EXHAUSTED = void 0; exports.REASON_QUOTA_REJECTED = void 0; exports.REASON_SHUTDOWN_DROP = void 0; var counters, activeRedactionConfig, pending, timer, consecutiveFailures, breakerOpenUntil, reporting, MORSE_PATH_MARKERS, clientConfig;
627
+ var SDK_VERSION, LEVEL_OFF, LEVEL_ERROR, LEVEL_DEBUG, VALID_LEVELS, level, RATE_WINDOW_MS, RATE_LIMIT_PER_WINDOW, RATE_LIMIT_PER_WINDOW_DEBUG, rateBuckets, LOCAL_LOG_WINDOW_MS, LOCAL_LOG_LIMIT_PER_WINDOW, localLogBuckets, MAX_STACK_ENTRIES, MAX_MESSAGE_CHARS, MAX_BATCH_EVENTS, ALLOWED_EXTRA_KEYS, DIAGNOSTICS_PATH, MAX_PENDING, FLUSH_INTERVAL_MS, BREAKER_THRESHOLD, BREAKER_COOLDOWN_MS; exports.REASON_QUEUE_FULL = void 0; exports.REASON_RETRY_EXHAUSTED = void 0; exports.REASON_QUOTA_REJECTED = void 0; exports.REASON_ENCODE_FAILED = void 0; exports.REASON_SHUTDOWN_DROP = void 0; exports.REASON_AUTH_REJECTED = void 0; exports.REASON_ENDPOINT_REJECTED = void 0; exports.REASON_SEND_FAILED = void 0; var counters, activeRedactionConfig, pending, timer, consecutiveFailures, breakerOpenUntil, reporting, MORSE_PATH_MARKERS, clientConfig;
608
628
  var init_diagnostics = __esm({
609
629
  "src/_internal/diagnostics.ts"() {
610
630
  init_env();
611
631
  init_redaction();
612
- SDK_VERSION = "0.5.0" ;
632
+ SDK_VERSION = "0.6.0-rc.1" ;
613
633
  LEVEL_OFF = "off";
614
634
  LEVEL_ERROR = "error";
615
635
  LEVEL_DEBUG = "debug";
@@ -640,7 +660,11 @@ var init_diagnostics = __esm({
640
660
  exports.REASON_QUEUE_FULL = "queue_full";
641
661
  exports.REASON_RETRY_EXHAUSTED = "retry_exhausted";
642
662
  exports.REASON_QUOTA_REJECTED = "quota_rejected";
663
+ exports.REASON_ENCODE_FAILED = "encode_failed";
643
664
  exports.REASON_SHUTDOWN_DROP = "shutdown_drop";
665
+ exports.REASON_AUTH_REJECTED = "auth_rejected";
666
+ exports.REASON_ENDPOINT_REJECTED = "endpoint_rejected";
667
+ exports.REASON_SEND_FAILED = "send_failed";
644
668
  counters = /* @__PURE__ */ new Map();
645
669
  activeRedactionConfig = null;
646
670
  pending = [];
@@ -708,7 +732,10 @@ var init_spans = __esm({
708
732
  // MHQ-482: matches Python's `SpanType.RETRIEVER` (apps/sdk/python/src/morse_ai/spans.py).
709
733
  // @beta — retriever span type is subject to change before SDK v1.0 (see
710
734
  // the plain-LangChain adapter's on_retriever_* callbacks in src/langchain/).
711
- RETRIEVER: "retriever"
735
+ RETRIEVER: "retriever",
736
+ // MHQ-1025: matches Python's `SpanType.HANDOFF`. One span per routing
737
+ // decision between two agents, with `from_agent` / `to_agent` metadata.
738
+ HANDOFF: "handoff"
712
739
  };
713
740
  }
714
741
  });
@@ -783,6 +810,14 @@ function redactAttrValue(value, config) {
783
810
  }
784
811
  return value;
785
812
  }
813
+ function dropReasonForExportError(error) {
814
+ const code = error?.code;
815
+ if (typeof code !== "number") return exports.REASON_RETRY_EXHAUSTED;
816
+ if (code === 429) return exports.REASON_QUOTA_REJECTED;
817
+ if (code === 401 || code === 403) return exports.REASON_AUTH_REJECTED;
818
+ if (code >= 400 && code < 500) return exports.REASON_ENDPOINT_REJECTED;
819
+ return exports.REASON_SEND_FAILED;
820
+ }
786
821
  function getEngine() {
787
822
  if (engine === null) engine = new OtelEngine();
788
823
  return engine;
@@ -790,7 +825,7 @@ function getEngine() {
790
825
  function spanDictToOtelAttributes(spanDict, traceDict, resourceDict, opts) {
791
826
  const attrs = {};
792
827
  const spanType = spanDict.type;
793
- if (typeof spanType === "string" && spanType) attrs["av.span_type"] = spanType;
828
+ if (typeof spanType === "string" && spanType) attrs["morse.span_type"] = spanType;
794
829
  const model = spanDict.model;
795
830
  if (model !== void 0 && model !== null) attrs["gen_ai.request.model"] = String(model);
796
831
  const tokenFields = [
@@ -809,12 +844,12 @@ function spanDictToOtelAttributes(spanDict, traceDict, resourceDict, opts) {
809
844
  }
810
845
  const costUsd = spanDict.cost_usd;
811
846
  if (costUsd !== void 0 && costUsd !== null) {
812
- attrs["av.cost_usd"] = String(costUsd);
847
+ attrs["morse.cost_usd"] = String(costUsd);
813
848
  }
814
849
  for (const [src, otelKey] of [
815
- ["input_data", "av.input_data"],
816
- ["output_data", "av.output_data"],
817
- ["context_segments", "av.context_segments"]
850
+ ["input_data", "morse.input_data"],
851
+ ["output_data", "morse.output_data"],
852
+ ["context_segments", "morse.context_segments"]
818
853
  ]) {
819
854
  const v = spanDict[src];
820
855
  if (v !== void 0 && v !== null) {
@@ -826,35 +861,36 @@ function spanDictToOtelAttributes(spanDict, traceDict, resourceDict, opts) {
826
861
  if (metadata && typeof metadata === "object") {
827
862
  for (const [key, value] of Object.entries(metadata)) {
828
863
  const encoded = jsonCapped(value, opts.maxFieldBytes);
829
- if (encoded !== null) attrs[`av.metadata.${key}`] = encoded;
864
+ if (encoded !== null) attrs[`morse.metadata.${key}`] = encoded;
830
865
  }
831
866
  }
832
867
  const errorMessage = spanDict.error_message;
833
868
  if (opts.isRoot) {
834
869
  const threadId = traceDict.thread_id;
835
- if (threadId !== void 0 && threadId !== null) attrs["av.thread_id"] = String(threadId);
870
+ if (threadId !== void 0 && threadId !== null) attrs["morse.thread_id"] = String(threadId);
836
871
  const userId = traceDict.user_id;
837
- if (userId !== void 0 && userId !== null) attrs["av.user_id"] = String(userId);
872
+ if (userId !== void 0 && userId !== null) attrs["morse.user_id"] = String(userId);
838
873
  const userMetadata = traceDict.user_metadata;
839
874
  if (userMetadata && typeof userMetadata === "object") {
840
875
  const entries = Object.entries(userMetadata);
841
876
  if (entries.length > 0) {
842
- attrs["av.user_metadata"] = JSON.stringify(
877
+ attrs["morse.user_metadata"] = JSON.stringify(
843
878
  Object.fromEntries(entries.map(([k, v]) => [k, String(v)]))
844
879
  );
845
880
  }
846
881
  }
847
882
  const success = traceDict.success;
848
- if (success !== void 0 && success !== null) attrs["av.outcome.success"] = Boolean(success);
883
+ if (success !== void 0 && success !== null)
884
+ attrs["morse.outcome.success"] = Boolean(success);
849
885
  const outcome = traceDict.outcome;
850
- if (outcome !== void 0 && outcome !== null) attrs["av.outcome.label"] = String(outcome);
886
+ if (outcome !== void 0 && outcome !== null) attrs["morse.outcome.label"] = String(outcome);
851
887
  const framework = resourceDict["morse_ai.framework"];
852
- if (typeof framework === "string" && framework) attrs["av.framework"] = framework;
888
+ if (typeof framework === "string" && framework) attrs["morse.framework"] = framework;
853
889
  const source = resourceDict["morse_ai.source"];
854
- if (typeof source === "string" && source) attrs["av.source"] = source;
890
+ if (typeof source === "string" && source) attrs["morse.source"] = source;
855
891
  }
856
892
  if (errorMessage && spanDict.status === "failed") {
857
- attrs["av.error_message"] = String(errorMessage);
893
+ attrs["morse.error_message"] = String(errorMessage);
858
894
  }
859
895
  return attrs;
860
896
  }
@@ -946,7 +982,7 @@ function reportSwallowed(err, fingerprint) {
946
982
  } catch {
947
983
  }
948
984
  }
949
- var INSTRUMENTATION_NAME, DEFAULT_MAX_FIELD_BYTES, TRUNCATION_MARKER, contextManagerRegistered, MAX_U64, RedactingSpanExporter, RecordingSpanExporter, ResultCapturingExporter, OtelEngine, engine;
985
+ var INSTRUMENTATION_NAME, DEFAULT_MAX_FIELD_BYTES, TRUNCATION_MARKER, contextManagerRegistered, MAX_U64, RedactingSpanExporter, DropReportingExporter, RecordingSpanExporter, ResultCapturingExporter, OtelEngine, engine;
950
986
  var init_otel_provider = __esm({
951
987
  "src/_internal/otel-provider.ts"() {
952
988
  init_diagnostics();
@@ -983,6 +1019,29 @@ var init_otel_provider = __esm({
983
1019
  return this.inner.forceFlush ? this.inner.forceFlush() : Promise.resolve();
984
1020
  }
985
1021
  };
1022
+ DropReportingExporter = class {
1023
+ constructor(inner) {
1024
+ this.inner = inner;
1025
+ }
1026
+ inner;
1027
+ export(spans, resultCallback) {
1028
+ this.inner.export(spans, (result) => {
1029
+ if (result.code === core.ExportResultCode.FAILED) {
1030
+ try {
1031
+ recordDrop(dropReasonForExportError(result.error), "span", spans.length);
1032
+ } catch {
1033
+ }
1034
+ }
1035
+ resultCallback(result);
1036
+ });
1037
+ }
1038
+ shutdown() {
1039
+ return this.inner.shutdown();
1040
+ }
1041
+ forceFlush() {
1042
+ return this.inner.forceFlush ? this.inner.forceFlush() : Promise.resolve();
1043
+ }
1044
+ };
986
1045
  RecordingSpanExporter = class {
987
1046
  spans = [];
988
1047
  export(spans, resultCallback) {
@@ -1049,7 +1108,10 @@ var init_otel_provider = __esm({
1049
1108
  compression: otlpExporterBase.CompressionAlgorithm.GZIP,
1050
1109
  timeoutMillis: opts.timeoutMillis
1051
1110
  });
1052
- let exporter = new RedactingSpanExporter(otlpExporter, opts.redactionConfig);
1111
+ let exporter = new RedactingSpanExporter(
1112
+ new DropReportingExporter(otlpExporter),
1113
+ opts.redactionConfig
1114
+ );
1053
1115
  if (opts.resultSink) {
1054
1116
  exporter = new ResultCapturingExporter(exporter, opts.resultSink);
1055
1117
  }
@@ -1467,6 +1529,18 @@ function setContext(dims) {
1467
1529
  if (state.userMetadata === void 0) state.userMetadata = {};
1468
1530
  Object.assign(state.userMetadata, coerceDims(dims, "morse.tracing.set_context"));
1469
1531
  }
1532
+ function adoptThreadId(value) {
1533
+ const state = getActiveTraceState();
1534
+ if (state === null || state.threadId !== void 0 || value === null || value === void 0) {
1535
+ return;
1536
+ }
1537
+ try {
1538
+ const s = String(value);
1539
+ if (s !== "") state.threadId = s;
1540
+ } catch (err) {
1541
+ report(err, { fingerprint: "morse.tracing.adopt_thread_id" });
1542
+ }
1543
+ }
1470
1544
  function coerceDims(dims, fingerprint) {
1471
1545
  const out = {};
1472
1546
  for (const k of Object.keys(dims)) {
@@ -1669,6 +1743,7 @@ var init_propagation = __esm({
1669
1743
 
1670
1744
  exports._resetForTesting = _resetForTesting;
1671
1745
  exports._resetForTesting2 = _resetForTesting2;
1746
+ exports.adoptThreadId = adoptThreadId;
1672
1747
  exports.buildRedactionConfig = buildRedactionConfig;
1673
1748
  exports.buildTraceEntry = buildTraceEntry;
1674
1749
  exports.extractTraceparent = extractTraceparent;
@@ -1718,5 +1793,5 @@ exports.setTransport = setTransport;
1718
1793
  exports.spanAsync = spanAsync;
1719
1794
  exports.spanSync = spanSync;
1720
1795
  exports.startSpan = startSpan;
1721
- //# sourceMappingURL=chunk-KMBKZLXH.cjs.map
1722
- //# sourceMappingURL=chunk-KMBKZLXH.cjs.map
1796
+ //# sourceMappingURL=chunk-7DALGJL2.cjs.map
1797
+ //# sourceMappingURL=chunk-7DALGJL2.cjs.map