@morsehq-dev/sdk 0.4.1 → 0.5.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 (149) hide show
  1. package/dist/anthropic/index.cjs +12 -10
  2. package/dist/anthropic/index.js +5 -3
  3. package/dist/anthropic-agent-sdk/index.cjs +52 -34
  4. package/dist/anthropic-agent-sdk/index.cjs.map +1 -1
  5. package/dist/anthropic-agent-sdk/index.js +25 -7
  6. package/dist/anthropic-agent-sdk/index.js.map +1 -1
  7. package/dist/browser/anthropic/index.cjs +12 -10
  8. package/dist/browser/anthropic/index.js +5 -3
  9. package/dist/browser/anthropic-agent-sdk/index.cjs +52 -34
  10. package/dist/browser/anthropic-agent-sdk/index.cjs.map +1 -1
  11. package/dist/browser/anthropic-agent-sdk/index.js +25 -7
  12. package/dist/browser/anthropic-agent-sdk/index.js.map +1 -1
  13. package/dist/browser/chunk-32U547L3.js +118 -0
  14. package/dist/browser/chunk-32U547L3.js.map +1 -0
  15. package/dist/{chunk-SBGY5NS4.js → browser/chunk-454FDWBM.js} +6 -4
  16. package/dist/browser/chunk-454FDWBM.js.map +1 -0
  17. package/dist/browser/{chunk-EFUQVASI.cjs → chunk-5EFKNOO7.cjs} +17 -15
  18. package/dist/browser/chunk-5EFKNOO7.cjs.map +1 -0
  19. package/dist/browser/{chunk-DOLWR7LD.js → chunk-5IWGFPKQ.js} +4 -4
  20. package/dist/browser/{chunk-DOLWR7LD.js.map → chunk-5IWGFPKQ.js.map} +1 -1
  21. package/dist/browser/{chunk-F3B4UR64.js → chunk-6DOP3MTY.js} +386 -53
  22. package/dist/browser/chunk-6DOP3MTY.js.map +1 -0
  23. package/dist/browser/{chunk-GWJYOQNC.js → chunk-A7P3ZBZX.js} +10 -4
  24. package/dist/browser/chunk-A7P3ZBZX.js.map +1 -0
  25. package/dist/browser/{chunk-M2GZJ3RS.cjs → chunk-AV35EOER.cjs} +20 -14
  26. package/dist/browser/chunk-AV35EOER.cjs.map +1 -0
  27. package/dist/browser/{chunk-AYNX24P5.js → chunk-AZ3SVK3K.js} +3 -3
  28. package/dist/browser/{chunk-AYNX24P5.js.map → chunk-AZ3SVK3K.js.map} +1 -1
  29. package/dist/browser/chunk-FNZWJU64.cjs +31 -0
  30. package/dist/browser/chunk-FNZWJU64.cjs.map +1 -0
  31. package/dist/browser/chunk-HZZK2EMO.cjs +126 -0
  32. package/dist/browser/chunk-HZZK2EMO.cjs.map +1 -0
  33. package/dist/browser/{chunk-QWRQJO57.js → chunk-MLDVXMQD.js} +3 -3
  34. package/dist/browser/{chunk-QWRQJO57.js.map → chunk-MLDVXMQD.js.map} +1 -1
  35. package/dist/{chunk-Y7SVGUKY.cjs → browser/chunk-NT37C2TK.cjs} +7 -7
  36. package/dist/browser/{chunk-YNUZGKUA.cjs.map → chunk-NT37C2TK.cjs.map} +1 -1
  37. package/dist/browser/{chunk-3643DC7K.cjs → chunk-RBNCTHK3.cjs} +5 -2
  38. package/dist/browser/{chunk-3643DC7K.cjs.map → chunk-RBNCTHK3.cjs.map} +1 -1
  39. package/dist/browser/chunk-VFNNU3AX.js +28 -0
  40. package/dist/browser/chunk-VFNNU3AX.js.map +1 -0
  41. package/dist/browser/{chunk-HGN7J3EU.cjs → chunk-WY2VLKRR.cjs} +12 -12
  42. package/dist/browser/{chunk-HGN7J3EU.cjs.map → chunk-WY2VLKRR.cjs.map} +1 -1
  43. package/dist/browser/{chunk-DXWHT3HK.cjs → chunk-ZGYZZCUK.cjs} +391 -55
  44. package/dist/browser/chunk-ZGYZZCUK.cjs.map +1 -0
  45. package/dist/browser/index.cjs +112 -82
  46. package/dist/browser/index.cjs.map +1 -1
  47. package/dist/browser/index.js +40 -10
  48. package/dist/browser/index.js.map +1 -1
  49. package/dist/browser/integrations/pino.cjs +4 -4
  50. package/dist/browser/integrations/pino.js +3 -3
  51. package/dist/browser/langchain/index.cjs +19 -19
  52. package/dist/browser/langchain/index.js +3 -3
  53. package/dist/browser/langgraph/index.cjs +34 -26
  54. package/dist/browser/langgraph/index.cjs.map +1 -1
  55. package/dist/browser/langgraph/index.js +16 -8
  56. package/dist/browser/langgraph/index.js.map +1 -1
  57. package/dist/browser/openai/index.cjs +22 -8
  58. package/dist/browser/openai/index.cjs.map +1 -1
  59. package/dist/browser/openai/index.js +17 -3
  60. package/dist/browser/openai/index.js.map +1 -1
  61. package/dist/browser/openai-agents/index.cjs +42 -34
  62. package/dist/browser/openai-agents/index.cjs.map +1 -1
  63. package/dist/browser/openai-agents/index.js +13 -5
  64. package/dist/browser/openai-agents/index.js.map +1 -1
  65. package/dist/browser/vercel-ai/index.cjs +16 -16
  66. package/dist/browser/vercel-ai/index.js +4 -4
  67. package/dist/{chunk-4R4SHGOK.js → chunk-4JPZV2VZ.js} +3 -3
  68. package/dist/{chunk-4R4SHGOK.js.map → chunk-4JPZV2VZ.js.map} +1 -1
  69. package/dist/{chunk-HNCWTENX.cjs → chunk-5B3IUESN.cjs} +415 -70
  70. package/dist/chunk-5B3IUESN.cjs.map +1 -0
  71. package/dist/chunk-5RXSICEJ.js +118 -0
  72. package/dist/chunk-5RXSICEJ.js.map +1 -0
  73. package/dist/chunk-7A2EWXZK.cjs +31 -0
  74. package/dist/chunk-7A2EWXZK.cjs.map +1 -0
  75. package/dist/{chunk-STK4KJQ6.js → chunk-AAR4FYFO.js} +10 -4
  76. package/dist/chunk-AAR4FYFO.js.map +1 -0
  77. package/dist/{chunk-LQI63FHF.cjs → chunk-ADRVMGAW.cjs} +20 -14
  78. package/dist/chunk-ADRVMGAW.cjs.map +1 -0
  79. package/dist/{chunk-V5J6J4ZR.js → chunk-CECVNM7R.js} +4 -4
  80. package/dist/{chunk-V5J6J4ZR.js.map → chunk-CECVNM7R.js.map} +1 -1
  81. package/dist/{chunk-KJEO52QS.cjs → chunk-HICEJ4LV.cjs} +5 -2
  82. package/dist/{chunk-KJEO52QS.cjs.map → chunk-HICEJ4LV.cjs.map} +1 -1
  83. package/dist/{chunk-QXRJUPDP.cjs → chunk-HSY7V4RG.cjs} +12 -12
  84. package/dist/{chunk-QXRJUPDP.cjs.map → chunk-HSY7V4RG.cjs.map} +1 -1
  85. package/dist/chunk-LB6ZLJUR.js +28 -0
  86. package/dist/chunk-LB6ZLJUR.js.map +1 -0
  87. package/dist/{browser/chunk-F7BGQ26H.js → chunk-O3Q5L2HY.js} +6 -4
  88. package/dist/chunk-O3Q5L2HY.js.map +1 -0
  89. package/dist/{chunk-5D6SBSEI.cjs → chunk-RF7NI5VN.cjs} +17 -15
  90. package/dist/chunk-RF7NI5VN.cjs.map +1 -0
  91. package/dist/{chunk-AEFUXEKV.js → chunk-TP3N3S2D.js} +3 -3
  92. package/dist/{chunk-AEFUXEKV.js.map → chunk-TP3N3S2D.js.map} +1 -1
  93. package/dist/{chunk-LTKGLXAE.js → chunk-UEKQIRRA.js} +410 -68
  94. package/dist/chunk-UEKQIRRA.js.map +1 -0
  95. package/dist/{browser/chunk-YNUZGKUA.cjs → chunk-UWQPOWJQ.cjs} +7 -7
  96. package/dist/{chunk-Y7SVGUKY.cjs.map → chunk-UWQPOWJQ.cjs.map} +1 -1
  97. package/dist/chunk-VD3KRXSP.cjs +126 -0
  98. package/dist/chunk-VD3KRXSP.cjs.map +1 -0
  99. package/dist/index.cjs +119 -89
  100. package/dist/index.cjs.map +1 -1
  101. package/dist/index.d.cts +2 -2
  102. package/dist/index.d.ts +2 -2
  103. package/dist/index.js +41 -11
  104. package/dist/index.js.map +1 -1
  105. package/dist/integrations/pino.cjs +4 -4
  106. package/dist/integrations/pino.js +3 -3
  107. package/dist/langchain/index.cjs +19 -19
  108. package/dist/langchain/index.d.cts +1 -1
  109. package/dist/langchain/index.d.ts +1 -1
  110. package/dist/langchain/index.js +3 -3
  111. package/dist/langgraph/index.cjs +34 -26
  112. package/dist/langgraph/index.cjs.map +1 -1
  113. package/dist/langgraph/index.d.cts +1 -1
  114. package/dist/langgraph/index.d.ts +1 -1
  115. package/dist/langgraph/index.js +16 -8
  116. package/dist/langgraph/index.js.map +1 -1
  117. package/dist/openai/index.cjs +22 -8
  118. package/dist/openai/index.cjs.map +1 -1
  119. package/dist/openai/index.js +17 -3
  120. package/dist/openai/index.js.map +1 -1
  121. package/dist/openai-agents/index.cjs +42 -34
  122. package/dist/openai-agents/index.cjs.map +1 -1
  123. package/dist/openai-agents/index.js +13 -5
  124. package/dist/openai-agents/index.js.map +1 -1
  125. package/dist/{tracing-BYAqjT5Q.d.cts → tracing-CNlre8TK.d.cts} +1 -0
  126. package/dist/{tracing-rz9cWQ8d.d.ts → tracing-J8ZgxVzU.d.ts} +1 -0
  127. package/dist/vercel-ai/index.cjs +16 -16
  128. package/dist/vercel-ai/index.js +4 -4
  129. package/package.json +1 -9
  130. package/dist/browser/chunk-3BGG7GH3.cjs +0 -183
  131. package/dist/browser/chunk-3BGG7GH3.cjs.map +0 -1
  132. package/dist/browser/chunk-DXWHT3HK.cjs.map +0 -1
  133. package/dist/browser/chunk-EFUQVASI.cjs.map +0 -1
  134. package/dist/browser/chunk-F3B4UR64.js.map +0 -1
  135. package/dist/browser/chunk-F7BGQ26H.js.map +0 -1
  136. package/dist/browser/chunk-GWJYOQNC.js.map +0 -1
  137. package/dist/browser/chunk-M2GZJ3RS.cjs.map +0 -1
  138. package/dist/browser/chunk-YHV5GL32.js +0 -178
  139. package/dist/browser/chunk-YHV5GL32.js.map +0 -1
  140. package/dist/chunk-5D6SBSEI.cjs.map +0 -1
  141. package/dist/chunk-HNCWTENX.cjs.map +0 -1
  142. package/dist/chunk-LQI63FHF.cjs.map +0 -1
  143. package/dist/chunk-LTKGLXAE.js.map +0 -1
  144. package/dist/chunk-POCQNSVD.js +0 -178
  145. package/dist/chunk-POCQNSVD.js.map +0 -1
  146. package/dist/chunk-SBGY5NS4.js.map +0 -1
  147. package/dist/chunk-STK4KJQ6.js.map +0 -1
  148. package/dist/chunk-T2KW3P23.cjs +0 -183
  149. package/dist/chunk-T2KW3P23.cjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/anthropic/index.ts"],"names":["init_spans","init_tracing","absorbErrorsAsync","opts","absorbErrorsSync","getActiveTraceState","startSpan","calculateCost","runAsync","nowIso","generateSpanId"],"mappings":"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","file":"chunk-LQI63FHF.cjs","sourcesContent":["/**\n * `@morsehq-dev/sdk/anthropic` — Anthropic SDK instrumentation.\n *\n * Wraps `@anthropic-ai/sdk` `client.messages.create` so every Claude call\n * emits an `llm` span carrying pre-segmented `context_segments`. The\n * server-side classifier then skips its own messages-array partitioning\n * and persists the SDK-supplied segments verbatim.\n *\n * Two entry points:\n *\n * - `wrapAnthropic(client)` — returns a Proxy-like wrapper that\n * intercepts `messages.create`. Always succeeds. The customer keeps\n * using the wrapper as if it were the real client.\n *\n * - `instrumentAnthropic(client?)` — top-level helper. If a client is\n * passed, returns the wrapped form. If no client is passed AND the\n * `@anthropic-ai/sdk` package can be loaded, attempts to patch\n * `Messages.prototype.create` so every fresh `new Anthropic()` is\n * instrumented automatically. The prototype path is best-effort —\n * it is documented as fragile across Anthropic SDK versions, and\n * `wrapAnthropic` is the recommended public entry.\n *\n * Idempotent. `uninstallAnthropic()` restores the prototype and clears\n * the install sentinel.\n *\n * Wrapped under `absorbErrors*` so a tracing failure can never break the\n * customer's Anthropic call — at worst, calls go untraced.\n *\n * Mirrors `apps/sdk/typescript/src/vercel-ai/index.ts` in shape and\n * `openspec/changes/.../specs/observability/spec.md` (CTX-08) in\n * segmentation contract.\n */\n\nimport { absorbErrorsAsync, absorbErrorsSync } from \"../_internal/errors\";\nimport { calculateCost } from \"../_internal/pricing\";\nimport type { ContextSegment, SpanData } from \"../_internal/spans\";\nimport { generateSpanId, nowIso } from \"../_internal/spans\";\nimport { getActiveTraceState, runAsync as _runAsync, startSpan } from \"../_internal/tracing\";\n\n/* ------------------------------------------------------------------------ */\n/* Public types — minimal structural shapes, NOT a hard dep on `@anthropic-ai/sdk` */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Subset of `@anthropic-ai/sdk`'s `MessageCreateParams` we read from. We\n * deliberately decline to import the real types so the SDK works even when\n * `@anthropic-ai/sdk` isn't installed (it's an optional peer dep).\n */\nexport interface AnthropicMessageCreateParams {\n model: string;\n max_tokens?: number;\n system?: string | AnthropicTextBlockParam[];\n messages: AnthropicMessageParam[];\n tools?: AnthropicToolParam[];\n tool_choice?: unknown;\n // Allow forward-compat fields without complaint.\n [key: string]: unknown;\n}\n\nexport interface AnthropicTextBlockParam {\n type: \"text\";\n text: string;\n cache_control?: { type: \"ephemeral\" } | null;\n}\n\nexport interface AnthropicToolUseBlockParam {\n type: \"tool_use\";\n id: string;\n name: string;\n input: unknown;\n}\n\nexport interface AnthropicToolResultBlockParam {\n type: \"tool_result\";\n tool_use_id: string;\n content: string | Array<{ type: string; text?: string; [k: string]: unknown }>;\n is_error?: boolean;\n}\n\nexport type AnthropicContentBlockParam =\n | AnthropicTextBlockParam\n | AnthropicToolUseBlockParam\n | AnthropicToolResultBlockParam\n | { type: string; [k: string]: unknown };\n\nexport interface AnthropicMessageParam {\n role: \"user\" | \"assistant\" | string;\n content: string | AnthropicContentBlockParam[];\n}\n\nexport interface AnthropicToolParam {\n name: string;\n description?: string;\n input_schema?: unknown;\n // Anthropic supports custom tool types — let through.\n [key: string]: unknown;\n}\n\nexport interface AnthropicUsage {\n input_tokens?: number;\n output_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n [key: string]: unknown;\n}\n\nexport interface AnthropicMessageResponse {\n id?: string;\n model?: string;\n usage?: AnthropicUsage;\n content?: Array<{ type: string; text?: string; [k: string]: unknown }>;\n [key: string]: unknown;\n}\n\n/**\n * Structural shape of the Anthropic client we wrap. We only require that\n * `client.messages.create` is a function returning a Promise.\n */\nexport interface AnthropicClientLike {\n messages: {\n create(\n params: AnthropicMessageCreateParams,\n options?: unknown,\n ): Promise<AnthropicMessageResponse>;\n [key: string]: unknown;\n };\n [key: string]: unknown;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Module-level install sentinels */\n/* ------------------------------------------------------------------------ */\n\nconst WRAPPED_CLIENT = Symbol.for(\"morse.anthropic.wrapped\");\nconst INSTALL_SENTINEL = Symbol.for(\"morse.anthropic.installed\");\nconst ORIGINALS_SENTINEL = Symbol.for(\"morse.anthropic.originals\");\n\n/**\n * True once `instrumentAnthropic()` has successfully patched\n * `Messages.prototype.create` globally (called directly, or via\n * `_internal/auto-detect.ts`'s zero-config scan). Mirrors the Python SDK's\n * `wrap()` check on `anthropic._morse_ai_installed` (AGE-240 dogfood fix):\n * without this guard, a customer who lets auto-detect patch the prototype\n * AND then calls `wrapAnthropic(client)` manually on an instance would\n * record every `messages.create` call twice — once via the global patch,\n * once via the per-instance Proxy. `wrapAnthropic()` checks this flag and\n * returns the client unmodified when a global install is already active,\n * leaving the global patch as the sole recorder.\n */\nlet globalInstallActive = false;\n\ninterface OriginalsBag {\n protoCreate?: unknown;\n protoCarrier?: { prototype: { create: unknown } };\n}\n\ninterface InstalledModule {\n [INSTALL_SENTINEL]?: boolean;\n [ORIGINALS_SENTINEL]?: OriginalsBag;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Public API */\n/* ------------------------------------------------------------------------ */\n\nexport interface InstrumentAnthropicOptions {\n /**\n * When provided, used as the parent agent span's name. Defaults to\n * `\"anthropic.messages.create\"`.\n */\n defaultAgentName?: string;\n /**\n * If a fresh Anthropic *module* import is passed (e.g.,\n * `await import(\"@anthropic-ai/sdk\")`), the adapter will best-effort\n * patch `Messages.prototype.create`. Most users should prefer\n * `wrapAnthropic(client)` instead.\n */\n anthropicModule?: unknown;\n /**\n * When `true` (MEM-11), every wrapped `messages.create` call also\n * emits a sibling `memory`-type span with\n * `metadata.memory_op_type=\"consolidate\"`, `parent_span_id` linking\n * back to the LLM span (server treats this as `producer_span_id`),\n * `metadata.summary_token_count` from the response's output_tokens,\n * and `metadata.summary_content_hash` (SHA-256 of the response's\n * first text block).\n *\n * Use this flag when the customer is calling Claude to summarize\n * their own conversation context (the customer-side compaction\n * pattern). Default `false` — existing callers see zero behavior change.\n *\n * Opt-in only. The adapter never auto-detects summarization from\n * system-prompt content (too many false positives).\n */\n summarize?: boolean;\n}\n\n/**\n * Wrap an Anthropic client so every `messages.create` call records an\n * `llm` span with `context_segments`. The wrapper preserves the rest of\n * the client's surface (other resources, helpers, etc.) via a Proxy.\n *\n * Idempotent — a previously wrapped client is returned as-is.\n */\nexport function wrapAnthropic<C extends AnthropicClientLike>(\n client: C,\n options: InstrumentAnthropicOptions = {},\n): C {\n if (!client || typeof client !== \"object\") return client;\n // Already wrapped? Pass through.\n if ((client as Record<string | symbol, unknown>)[WRAPPED_CLIENT]) return client;\n // A global install (manual `instrumentAnthropic()` or auto-detect) is\n // already recording every call at the prototype level — see\n // `globalInstallActive` doc comment above.\n if (globalInstallActive) return client;\n\n const originalCreate = client.messages?.create?.bind(client.messages);\n if (typeof originalCreate !== \"function\") return client;\n\n const patchedCreate = buildPatchedCreate(originalCreate, options);\n\n // We construct a new `messages` object that proxies to the original\n // for any non-`create` access, then a top-level proxy that returns\n // our patched `messages` while passing every other property through.\n const patchedMessages = new Proxy(client.messages, {\n get(target, prop, receiver) {\n if (prop === \"create\") return patchedCreate;\n const value = Reflect.get(target, prop, receiver);\n // Bind methods so `this` continues to point at the original.\n if (typeof value === \"function\") return (value as (...a: unknown[]) => unknown).bind(target);\n return value;\n },\n });\n\n const wrapper = new Proxy(client, {\n get(target, prop, receiver) {\n if (prop === WRAPPED_CLIENT) return true;\n if (prop === \"messages\") return patchedMessages;\n const value = Reflect.get(target, prop, receiver);\n if (typeof value === \"function\") return (value as (...a: unknown[]) => unknown).bind(target);\n return value;\n },\n });\n\n return wrapper as C;\n}\n\n/**\n * Top-level installer. Two modes:\n *\n * - `instrumentAnthropic(client)` — equivalent to `wrapAnthropic(client)`.\n * - `instrumentAnthropic({ anthropicModule: mod })` — best-effort\n * prototype patch. Prefer the wrap form when possible.\n *\n * Always returns the wrapped client, or `undefined` if patching failed.\n * Errors are absorbed; this function never throws back at the caller.\n */\nexport const instrumentAnthropic = absorbErrorsAsync(\n async <C extends AnthropicClientLike>(\n clientOrOptions?: C | InstrumentAnthropicOptions,\n maybeOptions?: InstrumentAnthropicOptions,\n ): Promise<C | boolean> => {\n // Disambiguate the overloads.\n if (clientOrOptions && isClient(clientOrOptions)) {\n const opts = maybeOptions ?? {};\n return wrapAnthropic(clientOrOptions as C, opts);\n }\n const opts = (clientOrOptions as InstrumentAnthropicOptions | undefined) ?? {};\n const mod = await loadAnthropicModule(opts.anthropicModule);\n if (!mod) return false;\n const installed = (mod as InstalledModule)[INSTALL_SENTINEL] === true;\n if (installed) {\n globalInstallActive = true;\n return true;\n }\n\n const carrier = findMessagesPrototypeCarrier(mod);\n if (!carrier) return false;\n const originalCreate = carrier.prototype.create;\n if (typeof originalCreate !== \"function\") return false;\n\n const patchedCreate = buildPatchedCreate(function (\n this: unknown,\n params: AnthropicMessageCreateParams,\n callOptions?: unknown,\n ) {\n return (originalCreate as (...args: unknown[]) => Promise<AnthropicMessageResponse>).call(\n this,\n params,\n callOptions,\n );\n }, opts);\n carrier.prototype.create = patchedCreate as unknown as typeof carrier.prototype.create;\n (mod as InstalledModule)[ORIGINALS_SENTINEL] = {\n protoCreate: originalCreate,\n protoCarrier: carrier,\n };\n (mod as InstalledModule)[INSTALL_SENTINEL] = true;\n globalInstallActive = true;\n return true;\n },\n { fingerprint: \"morse.adapters.anthropic.install\" },\n);\n\n/**\n * Restore the prototype patch and clear the install sentinel.\n *\n * Pass the same module reference that was given to `instrumentAnthropic`\n * (or omit and the function will try to dynamic-import it). Calling\n * `uninstallAnthropic()` on a wrapped client (vs. a module) is a no-op —\n * just discard the wrapped client.\n */\nexport const uninstallAnthropic = absorbErrorsSync(\n (anthropicModule?: unknown): void => {\n if (!anthropicModule || typeof anthropicModule !== \"object\") return;\n const mod = anthropicModule as InstalledModule;\n if (!mod[INSTALL_SENTINEL]) return;\n const originals = mod[ORIGINALS_SENTINEL];\n if (originals?.protoCarrier && originals.protoCreate !== undefined) {\n originals.protoCarrier.prototype.create =\n originals.protoCreate as typeof originals.protoCarrier.prototype.create;\n }\n mod[ORIGINALS_SENTINEL] = undefined;\n mod[INSTALL_SENTINEL] = false;\n globalInstallActive = false;\n },\n { fingerprint: \"morse.adapters.anthropic.uninstall\" },\n);\n\n/**\n * Reset module-level install state for tests. Not part of the public API.\n * @internal\n */\nexport function _resetAnthropicInstallStateForTesting(): void {\n globalInstallActive = false;\n}\n\n/** True when a wrapped Anthropic client is passed in. */\nexport function isAnthropicWrapped(client: unknown): boolean {\n if (!client || typeof client !== \"object\") return false;\n return (client as Record<string | symbol, unknown>)[WRAPPED_CLIENT] === true;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Internals — module discovery */\n/* ------------------------------------------------------------------------ */\n\nfunction isClient(x: unknown): x is AnthropicClientLike {\n if (!x || typeof x !== \"object\") return false;\n const messages = (x as { messages?: { create?: unknown } }).messages;\n return !!messages && typeof messages.create === \"function\";\n}\n\nasync function loadAnthropicModule(explicit?: unknown): Promise<unknown | null> {\n if (explicit && typeof explicit === \"object\") return explicit;\n try {\n // Function-eval'd dynamic import keeps bundlers from trying to resolve\n // `@anthropic-ai/sdk` at build time when the dep isn't installed.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return await (Function(\"m\", \"return import(m)\") as any)(\"@anthropic-ai/sdk\");\n } catch {\n return null;\n }\n}\n\n/**\n * Locate the Messages class prototype on the Anthropic SDK module.\n * The SDK has historically exposed it at slightly different paths across\n * versions; we try the most common shapes.\n */\nfunction findMessagesPrototypeCarrier(mod: unknown): { prototype: { create: unknown } } | null {\n if (!mod || typeof mod !== \"object\") return null;\n const m = mod as Record<string, unknown>;\n\n // Strategy 1: `mod.Anthropic.Messages` (default-export class with static).\n const Default = m.default ?? m.Anthropic ?? m;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const candidates: any[] = [\n (Default as Record<string, unknown> | undefined)?.Messages,\n (m as Record<string, unknown>).Messages,\n (Default as { resources?: { Messages?: unknown } } | undefined)?.resources?.Messages,\n ];\n for (const c of candidates) {\n if (c && typeof c === \"function\" && c.prototype && typeof c.prototype.create === \"function\") {\n return c as { prototype: { create: unknown } };\n }\n }\n return null;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Internals — wrapper that records an `llm` span */\n/* ------------------------------------------------------------------------ */\n\nfunction buildPatchedCreate(\n original: (\n params: AnthropicMessageCreateParams,\n options?: unknown,\n ) => Promise<AnthropicMessageResponse>,\n options: InstrumentAnthropicOptions,\n): (params: AnthropicMessageCreateParams, options?: unknown) => Promise<AnthropicMessageResponse> {\n const agentName = options.defaultAgentName ?? \"anthropic.messages.create\";\n const summarizeMode = options.summarize === true;\n\n return async function patchedCreate(\n this: unknown,\n params: AnthropicMessageCreateParams,\n callOptions?: unknown,\n ): Promise<AnthropicMessageResponse> {\n const inTrace = getActiveTraceState() !== null;\n\n const work = async (): Promise<AnthropicMessageResponse> => {\n const handle = startSpan({\n name: \"anthropic.messages.create\",\n type: \"llm\",\n metadata: { model: params?.model, max_tokens: params?.max_tokens },\n });\n let response: AnthropicMessageResponse | undefined;\n try {\n response = await original.call(this, params, callOptions);\n } catch (err) {\n handle?.end(err);\n throw err;\n }\n\n // Recording is best-effort — never let it throw at the caller.\n try {\n if (handle) {\n const segments = safeExtractSegments(params, response);\n const usage = response?.usage ?? {};\n const inputTokens =\n (usage.input_tokens ?? 0) +\n (usage.cache_creation_input_tokens ?? 0) +\n (usage.cache_read_input_tokens ?? 0);\n const outputTokens = usage.output_tokens ?? 0;\n handle.span.model = response?.model ?? params?.model;\n if (inputTokens > 0) handle.span.input_tokens = inputTokens;\n if (outputTokens > 0) handle.span.output_tokens = outputTokens;\n const cacheWrite = usage.cache_creation_input_tokens ?? 0;\n const cacheRead = usage.cache_read_input_tokens ?? 0;\n if (cacheWrite > 0) handle.span.cache_write_tokens = cacheWrite;\n if (cacheRead > 0) handle.span.cached_input_tokens = cacheRead;\n if (inputTokens > 0 || outputTokens > 0) {\n handle.span.total_tokens = inputTokens + outputTokens;\n }\n if (\n handle.span.cost_usd === undefined &&\n handle.span.model &&\n (inputTokens > 0 || outputTokens > 0)\n ) {\n const cost = calculateCost({\n inputTokens,\n outputTokens,\n model: handle.span.model,\n cachedInputTokens: cacheRead,\n cacheWriteTokens: cacheWrite,\n });\n if (cost !== undefined) handle.span.cost_usd = cost;\n }\n handle.span.context_segments = segments;\n }\n } catch {\n // swallow — telemetry must never break the caller\n }\n handle?.end();\n\n // MEM-11: emit sibling memory span when summarize mode is enabled.\n // Sequenced AFTER the LLM span closes so its span_id is final.\n if (summarizeMode && handle) {\n try {\n emitSummarizeMemorySpan(handle.span, response);\n } catch {\n // swallow — telemetry must never break the caller\n }\n }\n return response;\n };\n\n if (inTrace) {\n return work();\n }\n\n // No active trace — open a fresh agent span around the call so the\n // llm span has a parent. We can't return work()'s Promise from inside\n // _runAsync's callback while preserving the LLM result's typing AND\n // having the fresh trace own the lifecycle, so we wrap explicitly.\n let result: AnthropicMessageResponse | undefined;\n let thrown: unknown;\n await _runAsync({ agentName }, async (runHandle) => {\n runHandle.setOutcome(true);\n try {\n result = await work();\n } catch (err) {\n thrown = err;\n throw err;\n }\n return null;\n });\n if (thrown !== undefined) throw thrown;\n // result is set unless work() threw, in which case we already rethrew.\n return result as AnthropicMessageResponse;\n };\n}\n\n/* ------------------------------------------------------------------------ */\n/* Public: deterministic segment extraction */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Maximum bytes of `content` we ship per segment. Long blobs are truncated\n * with `content_truncated: true`. The server further enforces its own\n * cap; we keep the SDK floor lower to stay friendly to mobile networks.\n */\nexport const MAX_SEGMENT_CONTENT_BYTES = 4096;\n\n/**\n * Extract `ContextSegment[]` from an Anthropic `messages.create` request\n * + response. The ordering is:\n *\n * 1. `tools` → one `tool_descriptions` segment, position 0.\n * 2. `system` → `system_prompt` segment.\n * 3. Each prior `user` / `assistant` message → `chat_history` segment.\n * `tool_result` blocks (always inside `user.content`) become their\n * own `tool_observation` segments.\n * `tool_use` blocks (assistant-emitted) roll into the parent\n * assistant `chat_history` segment as part of the JSON content.\n * 4. The final `user` message → `current_input`.\n *\n * Cache state heuristic:\n * - `system` blocks with `cache_control.type === \"ephemeral\"` →\n * `cache_write`.\n * - If the response reports `cache_read_input_tokens > 0`, mark the\n * `system_prompt` and `tool_descriptions` segments as `cache_hit`\n * (overrides `cache_write` — the cache HIT is more informative\n * than the cache write attempt).\n *\n * `tokens` is intentionally left undefined — the server tokenizes.\n */\nexport function extractAnthropicSegments(\n params: AnthropicMessageCreateParams,\n response?: AnthropicMessageResponse,\n): ContextSegment[] {\n const segments: ContextSegment[] = [];\n let position = 0;\n\n // 1. Tools → tool_descriptions.\n if (Array.isArray(params.tools) && params.tools.length > 0) {\n const content = canonicalJsonStringify(params.tools);\n segments.push(makeSegment(position++, \"tool_descriptions\", content));\n }\n\n // 2. System.\n let systemHadEphemeral = false;\n if (params.system !== undefined && params.system !== null) {\n let text = \"\";\n if (typeof params.system === \"string\") {\n text = params.system;\n } else if (Array.isArray(params.system)) {\n const parts: string[] = [];\n for (const block of params.system) {\n if (block && typeof block === \"object\" && block.type === \"text\") {\n parts.push(typeof block.text === \"string\" ? block.text : \"\");\n if (\n block.cache_control &&\n typeof block.cache_control === \"object\" &&\n (block.cache_control as { type?: string }).type === \"ephemeral\"\n ) {\n systemHadEphemeral = true;\n }\n }\n }\n text = parts.join(\"\\n\");\n }\n const seg = makeSegment(position++, \"system_prompt\", text);\n if (systemHadEphemeral) seg.cache_state = \"cache_write\";\n segments.push(seg);\n }\n\n // 3 + 4. Walk messages.\n const messages = Array.isArray(params.messages) ? params.messages : [];\n // Identify the index of the LAST user message so we can route only it\n // to current_input. Earlier user messages are chat_history.\n let lastUserIdx = -1;\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i]?.role === \"user\") {\n lastUserIdx = i;\n break;\n }\n }\n\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n if (!msg) continue;\n const blocks = normalizeContent(msg.content);\n // Tool-result blocks always emit their own tool_observation segments.\n const toolResults = blocks.filter(\n (b) => b.type === \"tool_result\",\n ) as AnthropicToolResultBlockParam[];\n const nonToolResults = blocks.filter((b) => b.type !== \"tool_result\");\n\n // The non-tool-result remainder belongs to either current_input,\n // chat_history, or, if empty, nothing.\n if (nonToolResults.length > 0) {\n const text = renderBlocksAsText(nonToolResults, msg.role);\n let source: string;\n if (msg.role === \"user\" && i === lastUserIdx) {\n source = \"current_input\";\n } else {\n source = \"chat_history\";\n }\n segments.push(makeSegment(position++, source, text));\n } else if (\n typeof msg.content === \"string\" &&\n msg.role === \"user\" &&\n i === lastUserIdx &&\n msg.content.length > 0\n ) {\n // Edge case: pure-string user message that's also the last user.\n segments.push(makeSegment(position++, \"current_input\", msg.content));\n }\n\n // Each tool_result emits its own segment, in order.\n for (const tr of toolResults) {\n const text = renderToolResult(tr);\n const seg = makeSegment(position++, \"tool_observation\", text);\n seg.attrs = { tool_use_id: tr.tool_use_id };\n if (tr.is_error) {\n (seg.attrs as Record<string, unknown>).is_error = true;\n }\n segments.push(seg);\n }\n }\n\n // Cache hit override.\n const cacheRead = response?.usage?.cache_read_input_tokens ?? 0;\n if (cacheRead > 0) {\n for (const seg of segments) {\n if (seg.source === \"system_prompt\" || seg.source === \"tool_descriptions\") {\n seg.cache_state = \"cache_hit\";\n }\n }\n }\n\n return segments;\n}\n\nfunction safeExtractSegments(\n params: AnthropicMessageCreateParams,\n response?: AnthropicMessageResponse,\n): ContextSegment[] {\n try {\n return extractAnthropicSegments(params, response);\n } catch {\n return [];\n }\n}\n\n/**\n * MEM-11 — emit a sibling `memory`-type span linked to the given LLM span.\n *\n * The memory span:\n * - `type = \"memory\"`\n * - `parent_span_id = llmSpan.span_id` (server stores as producer_span_id)\n * - `metadata.memory_op_type = \"consolidate\"`\n * - `metadata.summary_token_count = response.usage.output_tokens`\n * - `metadata.summary_content_hash = SHA-256 of response.content[0].text`\n *\n * Caller is responsible for catching exceptions — telemetry must never\n * break the customer's Anthropic call.\n */\nfunction emitSummarizeMemorySpan(llmSpan: SpanData, response?: AnthropicMessageResponse): void {\n const state = getActiveTraceState();\n if (state === null) return;\n\n const summaryText = extractFirstTextBlock(response);\n const summaryHash = sha256Hex(summaryText);\n const summaryTokens = response?.usage?.output_tokens ?? 0;\n\n const startedAt = llmSpan.ended_at ?? llmSpan.started_at ?? nowIso();\n const memorySpan: SpanData = {\n trace_id: state.traceId,\n span_id: generateSpanId(),\n type: \"memory\",\n name: \"anthropic.summarize\",\n parent_span_id: llmSpan.span_id,\n started_at: startedAt,\n ended_at: startedAt,\n duration_ms: 0,\n status: \"completed\",\n metadata: {\n memory_op_type: \"consolidate\",\n summary_token_count: summaryTokens,\n summary_content_hash: summaryHash,\n },\n };\n state.completedSpans.push(memorySpan);\n}\n\n/**\n * Return the first text block of an Anthropic message response, or \"\" if\n * there is none. Best-effort; never throws.\n */\nfunction extractFirstTextBlock(response?: AnthropicMessageResponse): string {\n try {\n const content = response?.content;\n if (!Array.isArray(content)) return \"\";\n for (const block of content) {\n if (block && typeof block === \"object\" && block.type === \"text\") {\n const t = (block as { text?: unknown }).text;\n if (typeof t === \"string\" && t.length > 0) return t;\n }\n }\n return \"\";\n } catch {\n return \"\";\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* Helpers — segment construction */\n/* ------------------------------------------------------------------------ */\n\nfunction makeSegment(position: number, source: string, rawContent: string): ContextSegment {\n const fullHash = sha256Hex(rawContent);\n const truncated = truncateToBytes(rawContent, MAX_SEGMENT_CONTENT_BYTES);\n const seg: ContextSegment = {\n position,\n source,\n content_hash: fullHash,\n content: truncated.text,\n cache_state: \"cold\",\n };\n if (truncated.truncated) seg.content_truncated = true;\n return seg;\n}\n\nfunction normalizeContent(content: AnthropicMessageParam[\"content\"]): AnthropicContentBlockParam[] {\n if (typeof content === \"string\") {\n return [{ type: \"text\", text: content }];\n }\n if (Array.isArray(content)) {\n return content.filter((b): b is AnthropicContentBlockParam => !!b && typeof b === \"object\");\n }\n return [];\n}\n\nfunction renderBlocksAsText(blocks: AnthropicContentBlockParam[], role: string): string {\n // For chat_history / current_input we want a deterministic, hashable\n // string. Plain `text` blocks render as their text. `tool_use` blocks\n // render as a stable JSON marker so two equivalent calls hash the same.\n const out: string[] = [];\n for (const b of blocks) {\n if (!b || typeof b !== \"object\") continue;\n if (b.type === \"text\") {\n const text = (b as AnthropicTextBlockParam).text;\n if (typeof text === \"string\") out.push(text);\n } else if (b.type === \"tool_use\") {\n const tu = b as AnthropicToolUseBlockParam;\n out.push(`[tool_use:${tu.name}:${tu.id}] ${canonicalJsonStringify(tu.input ?? null)}`);\n } else {\n // Unknown block type — best-effort serialize.\n out.push(canonicalJsonStringify(b));\n }\n }\n // Prefix with role for disambiguation in chat_history; keeps the\n // segment self-describing without bloating the hash too much.\n if (role === \"assistant\") {\n return out.length === 1 && out[0] !== undefined ? out[0] : out.join(\"\\n\");\n }\n return out.length === 1 && out[0] !== undefined ? out[0] : out.join(\"\\n\");\n}\n\nfunction renderToolResult(tr: AnthropicToolResultBlockParam): string {\n if (typeof tr.content === \"string\") return tr.content;\n if (Array.isArray(tr.content)) {\n const parts: string[] = [];\n for (const b of tr.content) {\n if (b && typeof b === \"object\") {\n if (b.type === \"text\" && typeof b.text === \"string\") parts.push(b.text);\n else parts.push(canonicalJsonStringify(b));\n }\n }\n return parts.join(\"\\n\");\n }\n return \"\";\n}\n\n/* ------------------------------------------------------------------------ */\n/* Helpers — hashing + JSON canonicalization + byte truncation */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Stringify with stable key ordering so equivalent objects hash to the\n * same content_hash regardless of property insertion order.\n */\nfunction canonicalJsonStringify(value: unknown): string {\n return JSON.stringify(value, function replacer(_key, val) {\n if (val && typeof val === \"object\" && !Array.isArray(val)) {\n const obj = val as Record<string, unknown>;\n const sorted: Record<string, unknown> = {};\n for (const k of Object.keys(obj).sort()) {\n sorted[k] = obj[k];\n }\n return sorted;\n }\n return val;\n });\n}\n\n/**\n * Compute SHA-256 of `text` and return it hex-encoded. Tries Node's\n * `node:crypto` first (synchronous + zero-dep), falls back to a tiny\n * pure-TS impl when neither Node nor a Web Crypto sync API is available.\n *\n * NOTE: Web Crypto's `digest()` is async, but the segment-construction\n * path is sync. We therefore only use the Node sync API here. On the\n * browser we fall back to the pure-TS impl, which is fine for the\n * relatively short strings we hash (system prompts, tool defs, single\n * messages).\n */\nfunction sha256Hex(text: string): string {\n // Strategy 1: Node's crypto.createHash. Sync and dep-free.\n try {\n if (typeof process !== \"undefined\" && process.versions?.node) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const dynamicRequire = Function(\"m\", \"return require(m)\") as any as (m: string) => unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cryptoMod = dynamicRequire(\"node:crypto\") as any;\n if (cryptoMod?.createHash) {\n return cryptoMod.createHash(\"sha256\").update(text).digest(\"hex\");\n }\n }\n } catch {\n // fall through\n }\n // Strategy 2: pure-TS sha256 (used in browsers).\n return purejsSha256(text);\n}\n\nfunction truncateToBytes(text: string, maxBytes: number): { text: string; truncated: boolean } {\n // Fast path: cheap upper bound. 1 char ≤ 4 bytes UTF-8.\n if (text.length <= maxBytes / 4) return { text, truncated: false };\n // Build the encoded bytes once.\n const bytes = utf8Encode(text);\n if (bytes.length <= maxBytes) return { text, truncated: false };\n // Find the largest character boundary <= maxBytes.\n let cut = maxBytes;\n // Don't split a multi-byte sequence: walk back until we're at a\n // codepoint boundary (a byte where the top two bits aren't `10`).\n while (cut > 0 && (bytes[cut]! & 0xc0) === 0x80) {\n cut--;\n }\n return { text: utf8Decode(bytes.subarray(0, cut)), truncated: true };\n}\n\nfunction utf8Encode(text: string): Uint8Array {\n if (typeof TextEncoder !== \"undefined\") {\n return new TextEncoder().encode(text);\n }\n // Pure-JS fallback. Should never trigger on Node 18+ or modern browsers.\n const out: number[] = [];\n for (let i = 0; i < text.length; i++) {\n const code = text.charCodeAt(i);\n if (code < 0x80) {\n out.push(code);\n } else if (code < 0x800) {\n out.push(0xc0 | (code >> 6), 0x80 | (code & 0x3f));\n } else {\n out.push(0xe0 | (code >> 12), 0x80 | ((code >> 6) & 0x3f), 0x80 | (code & 0x3f));\n }\n }\n return new Uint8Array(out);\n}\n\nfunction utf8Decode(bytes: Uint8Array): string {\n if (typeof TextDecoder !== \"undefined\") {\n return new TextDecoder(\"utf-8\").decode(bytes);\n }\n let out = \"\";\n for (let i = 0; i < bytes.length; ) {\n const b = bytes[i]!;\n if (b < 0x80) {\n out += String.fromCharCode(b);\n i++;\n } else if (b < 0xe0) {\n out += String.fromCharCode(((b & 0x1f) << 6) | (bytes[i + 1]! & 0x3f));\n i += 2;\n } else {\n out += String.fromCharCode(\n ((b & 0x0f) << 12) | ((bytes[i + 1]! & 0x3f) << 6) | (bytes[i + 2]! & 0x3f),\n );\n i += 3;\n }\n }\n return out;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Pure-JS SHA-256 (used only when node:crypto is unavailable) */\n/* ------------------------------------------------------------------------ */\n\nfunction purejsSha256(text: string): string {\n const K = [\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n ];\n const H = [\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n ];\n\n // Pad message.\n const msg = utf8Encode(text);\n const msgLen = msg.length;\n const bitLen = msgLen * 8;\n const padded = new Uint8Array(((msgLen + 9 + 63) >> 6) << 6);\n padded.set(msg);\n padded[msgLen] = 0x80;\n // 64-bit big-endian length. JS bitwise ops are 32-bit, so split lo/hi via /.\n const lo = (bitLen & 0xffffffff) >>> 0;\n const hi = Math.floor(bitLen / 0x100000000) >>> 0;\n padded[padded.length - 8] = (hi >>> 24) & 0xff;\n padded[padded.length - 7] = (hi >>> 16) & 0xff;\n padded[padded.length - 6] = (hi >>> 8) & 0xff;\n padded[padded.length - 5] = hi & 0xff;\n padded[padded.length - 4] = (lo >>> 24) & 0xff;\n padded[padded.length - 3] = (lo >>> 16) & 0xff;\n padded[padded.length - 2] = (lo >>> 8) & 0xff;\n padded[padded.length - 1] = lo & 0xff;\n\n const W = new Uint32Array(64);\n for (let chunk = 0; chunk < padded.length; chunk += 64) {\n for (let i = 0; i < 16; i++) {\n // `>>> 0` forces unsigned — `(byte << 24)` otherwise produces a signed\n // int when the high bit is set, which corrupts the schedule on bytes ≥ 0x80.\n W[i] =\n ((padded[chunk + i * 4]! << 24) |\n (padded[chunk + i * 4 + 1]! << 16) |\n (padded[chunk + i * 4 + 2]! << 8) |\n padded[chunk + i * 4 + 3]!) >>>\n 0;\n }\n for (let i = 16; i < 64; i++) {\n const s0 = rotr(W[i - 15]!, 7) ^ rotr(W[i - 15]!, 18) ^ (W[i - 15]! >>> 3);\n const s1 = rotr(W[i - 2]!, 17) ^ rotr(W[i - 2]!, 19) ^ (W[i - 2]! >>> 10);\n W[i] = (W[i - 16]! + s0 + W[i - 7]! + s1) >>> 0;\n }\n\n let [a, b, c, d, e, f, g, h] = H;\n\n for (let i = 0; i < 64; i++) {\n const S1 = rotr(e!, 6) ^ rotr(e!, 11) ^ rotr(e!, 25);\n const ch = (e! & f!) ^ (~e! & g!);\n const temp1 = (h! + S1 + ch + K[i]! + W[i]!) >>> 0;\n const S0 = rotr(a!, 2) ^ rotr(a!, 13) ^ rotr(a!, 22);\n const maj = (a! & b!) ^ (a! & c!) ^ (b! & c!);\n const temp2 = (S0 + maj) >>> 0;\n h = g;\n g = f;\n f = e;\n e = (d! + temp1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (temp1 + temp2) >>> 0;\n }\n\n H[0] = (H[0]! + a!) >>> 0;\n H[1] = (H[1]! + b!) >>> 0;\n H[2] = (H[2]! + c!) >>> 0;\n H[3] = (H[3]! + d!) >>> 0;\n H[4] = (H[4]! + e!) >>> 0;\n H[5] = (H[5]! + f!) >>> 0;\n H[6] = (H[6]! + g!) >>> 0;\n H[7] = (H[7]! + h!) >>> 0;\n }\n\n let hex = \"\";\n for (const v of H) {\n hex += v.toString(16).padStart(8, \"0\");\n }\n return hex;\n}\n\nfunction rotr(x: number, n: number): number {\n return ((x >>> n) | (x << (32 - n))) >>> 0;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/_internal/env.ts","../src/_internal/spans.ts","../src/_internal/redaction.ts","../src/_internal/otel-provider.ts","../src/_internal/tracing.ts","../src/propagation.ts"],"names":["otelContext","traceApi","redactionConfig","out","extractTraceparent"],"mappings":"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","file":"chunk-LTKGLXAE.js","sourcesContent":["/**\n * Environment variable resolution for SDK auto-init.\n *\n * The V2 TS SDK supports zero-setup integration: the customer sets\n * `MORSE_API_KEY` in their process environment (Node) or supplies\n * it via build-time replacement (browser bundler), and the SDK\n * auto-initializes on first use. This module centralises the env-var\n * contract so the rules stay in one place.\n *\n * Env vars (all optional unless noted) — must mirror the Python SDK's\n * `_internal/env.py`:\n *\n * - `MORSE_API_KEY` — triggers auto-init when set; absent = SDK dormant\n * - `MORSE_ENDPOINT` — override default ingestion URL\n * - `MORSE_FLUSH_INTERVAL_SECONDS` — override default 2.0s flush interval\n * - `MORSE_DISABLED` — \"1\"/\"true\" makes all SDK calls no-op\n * - `MORSE_SDK_DEBUG` — \"1\"/\"true\" raises internal-error log level\n * - `MORSE_SDK_DISABLE_TELEMETRY` — \"1\"/\"true\" suppresses out-of-band Sentry reports\n * - `MORSE_DISABLE_AUTO_DETECT` — (MHQ-482, mirrors Python's `MORSE_DISABLE_AUTO_DETECT`)\n * \"1\"/\"true\" skips the zero-config adapter auto-detect scan\n * - `MORSE_SAMPLE_RATE` — (MHQ-482, mirrors Python MHQ-668/671) deterministic\n * trace-ID head sampling rate in [0.0, 1.0], default 1.0.\n * - `MORSE_MAX_FIELD_BYTES` — (MHQ-482) byte cap applied to input_data / output_data /\n * context_segments / custom metadata at attribute-set\n * time, default 65536.\n * - `MORSE_MAX_QUEUE_SIZE` — (MHQ-482) OTel BatchSpanProcessor queue size, default\n * 2048 (OTel SDK default).\n * - `MORSE_MAX_BATCH_SIZE` — (MHQ-482) OTel BatchSpanProcessor max export batch\n * size, default 512 (OTel SDK default).\n * - `MORSE_LEGACY_TRANSPORT` — (MHQ-482) \"1\"/\"true\" reverts run()/span()/runTraced()\n * to the pre-OTel JSON batch transport instead of OTLP.\n * Escape hatch for the migration window only;\n * record()/log() always use the JSON path.\n * - `MORSE_CAPTURE_DB` — (MHQ-482, mirrors Python's `infra_capture.py`)\n * \"1\"/\"true\" enables zero-config `db` span\n * auto-capture (pg / mysql2 / better-sqlite3).\n * Opt-in, same as the Python SDK.\n * - `MORSE_CAPTURE_INFRA` — (MHQ-482) \"1\"/\"true\" convenience alias that enables\n * ALL infra auto-capture (currently just DB — mirrors\n * Python's combined flag; HTTP capture is a separate\n * port not yet landed in the TS SDK).\n */\n\n/**\n * Default ingestion endpoint.\n *\n * Phase 6c targets the Railway dev URL until the custom domain is wired up\n * in Phase 6d. Mirrors the Python SDK constant in\n * `apps/sdk/python/src/morse/client.py`.\n */\nexport const DEFAULT_ENDPOINT = \"https://api.morsehq.dev/api/v1/traces/batch\";\n\n/**\n * Read an env var in a runtime-agnostic way.\n *\n * Handles Node (`process.env`), Deno (`Deno.env`), and browser\n * environments where `process` is undefined. In the browser the value\n * typically comes from a bundler-time replacement (Next.js inlines\n * `process.env.MORSE_API_KEY` at build time when the var is\n * exposed via `next.config.ts`).\n */\nfunction readEnv(key: string): string | undefined {\n // Node / Next.js (server / build-time replaced)\n if (typeof process !== \"undefined\" && process.env) {\n const v = process.env[key];\n if (typeof v === \"string\") return v;\n }\n // Deno\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const denoGlobal = (globalThis as any).Deno as\n | { env: { get(k: string): string | undefined } }\n | undefined;\n if (denoGlobal?.env?.get) {\n try {\n const v = denoGlobal.env.get(key);\n if (typeof v === \"string\") return v;\n } catch {\n // Permission denied — fall through.\n }\n }\n return undefined;\n}\n\nfunction truthy(value: string | undefined): boolean {\n if (!value) return false;\n return [\"1\", \"true\", \"yes\", \"on\"].includes(value.trim().toLowerCase());\n}\n\nexport function getApiKey(): string | undefined {\n const raw = readEnv(\"MORSE_API_KEY\");\n if (!raw) return undefined;\n const trimmed = raw.trim();\n return trimmed || undefined;\n}\n\nexport function getEndpoint(): string | undefined {\n const raw = readEnv(\"MORSE_ENDPOINT\");\n if (!raw) return undefined;\n const trimmed = raw.trim();\n return trimmed || undefined;\n}\n\nexport function getFlushIntervalSeconds(defaultSeconds = 2.0): number {\n const raw = readEnv(\"MORSE_FLUSH_INTERVAL_SECONDS\");\n if (!raw) return defaultSeconds;\n const parsed = Number.parseFloat(raw.trim());\n if (!Number.isFinite(parsed) || parsed <= 0) return defaultSeconds;\n return parsed;\n}\n\nexport function isDisabled(): boolean {\n return truthy(readEnv(\"MORSE_DISABLED\"));\n}\n\nexport function isDebug(): boolean {\n return truthy(readEnv(\"MORSE_SDK_DEBUG\"));\n}\n\nexport function isTelemetryDisabled(): boolean {\n return truthy(readEnv(\"MORSE_SDK_DISABLE_TELEMETRY\"));\n}\n\n/**\n * True when `MORSE_DISABLE_AUTO_DETECT=1` — the zero-config adapter scan\n * (`_internal/auto-detect.ts`) is skipped entirely. Mirrors the Python SDK's\n * `is_auto_detect_disabled()`. Customers can still call the adapter\n * `wrapX()` / `instrumentX()` functions directly.\n */\nexport function isAutoDetectDisabled(): boolean {\n return truthy(readEnv(\"MORSE_DISABLE_AUTO_DETECT\"));\n}\n\n/**\n * Resource-level \"source\" label for Morse's own dogfood emitters.\n *\n * Mirrors the Python SDK's `get_internal_source()` (PR #90). Only the\n * accepted whitelist values are honoured — any other value is treated\n * as unset so a typo in a customer's environment never accidentally\n * tags their data as internal.\n */\nconst VALID_INTERNAL_SOURCES = new Set([\"copilot\", \"investigator\", \"refagent\", \"ui-bot\"]);\n\nexport function getInternalSource(): string | undefined {\n const raw = readEnv(\"MORSE_INTERNAL_SOURCE\");\n if (!raw) return undefined;\n const trimmed = raw.trim().toLowerCase();\n if (!trimmed) return undefined;\n return VALID_INTERNAL_SOURCES.has(trimmed) ? trimmed : undefined;\n}\n\nexport function isValidInternalSource(value: string | null | undefined): boolean {\n return typeof value === \"string\" && VALID_INTERNAL_SOURCES.has(value);\n}\n\n/**\n * Deterministic trace-ID head sampling rate for the OTel export pipeline\n * (MHQ-482, mirrors Python `_internal/env.py::get_sample_rate`). Out-of-range\n * or unparseable values fall back to `default`.\n */\nexport function getSampleRate(defaultRate = 1.0): number {\n const raw = readEnv(\"MORSE_SAMPLE_RATE\");\n if (!raw) return defaultRate;\n const parsed = Number.parseFloat(raw.trim());\n if (!Number.isFinite(parsed) || parsed < 0.0 || parsed > 1.0) return defaultRate;\n return parsed;\n}\n\n/** Byte cap for input_data/output_data/context_segments/metadata attribute values. */\nexport function getMaxFieldBytes(defaultBytes = 65536): number {\n const raw = readEnv(\"MORSE_MAX_FIELD_BYTES\");\n if (!raw) return defaultBytes;\n const parsed = Number.parseInt(raw.trim(), 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : defaultBytes;\n}\n\n/** OTel BatchSpanProcessor queue size (OTel SDK default: 2048). */\nexport function getMaxQueueSize(defaultSize = 2048): number {\n const raw = readEnv(\"MORSE_MAX_QUEUE_SIZE\");\n if (!raw) return defaultSize;\n const parsed = Number.parseInt(raw.trim(), 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : defaultSize;\n}\n\n/** OTel BatchSpanProcessor max export batch size (OTel SDK default: 512). */\nexport function getMaxBatchSize(defaultSize = 512): number {\n const raw = readEnv(\"MORSE_MAX_BATCH_SIZE\");\n if (!raw) return defaultSize;\n const parsed = Number.parseInt(raw.trim(), 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : defaultSize;\n}\n\n/**\n * Escape hatch: `run()`/`span()`/`runTraced()` revert to the pre-OTel JSON\n * batch transport instead of OTLP when set. `record()`/`log()` always use\n * the JSON path regardless of this flag.\n */\nexport function isLegacyTransport(): boolean {\n return truthy(readEnv(\"MORSE_LEGACY_TRANSPORT\"));\n}\n\n/**\n * DB auto-capture opt-in (MHQ-482, mirrors Python's `infra_capture.py`'s\n * `MORSE_CAPTURE_DB` / `MORSE_CAPTURE_INFRA` env flags — see\n * `maybe_enable_from_env`). Opt-in while the approach is proven across\n * drivers, same posture as the Python SDK.\n */\nexport function isDbCaptureEnabled(): boolean {\n return truthy(readEnv(\"MORSE_CAPTURE_DB\")) || truthy(readEnv(\"MORSE_CAPTURE_INFRA\"));\n}\n","/**\n * Span model — the wire format the SDK sends to Morse.\n *\n * Mirrors `apps/sdk/python/src/morse/spans.py` field-for-field. The\n * backend's `SpanType` choices are the source of truth.\n */\n\nexport const SpanType = {\n AGENT: \"agent\",\n LLM: \"llm\",\n TOOL: \"tool\",\n HTTP: \"http\",\n DB: \"db\",\n CUSTOM: \"custom\",\n MEMORY: \"memory\",\n // MHQ-482: matches Python's `SpanType.RETRIEVER` (apps/sdk/python/src/morse_ai/spans.py).\n // @beta — retriever span type is subject to change before SDK v1.0 (see\n // the plain-LangChain adapter's on_retriever_* callbacks in src/langchain/).\n RETRIEVER: \"retriever\",\n} as const;\n\nexport type SpanType = (typeof SpanType)[keyof typeof SpanType];\n\nexport type SpanStatus = \"completed\" | \"failed\" | \"timed_out\";\n\n/**\n * Wire-format shape of one context segment carried on an LLM span.\n *\n * Mirrors the Python `morse.context.ContextSegmentDict` — keep both\n * sides in lockstep with the backend `ContextSegmentIn` Pydantic schema.\n *\n * - `tokens` is intentionally optional on the wire; the server tokenizes\n * when omitted to keep client-side cost and dependency surface small.\n * - `source` accepts either underscored DB enum values (`memory_vector`)\n * or the dotted public-API form (`memory.vector`); the server\n * `normalize_segment_source` helper translates dots → underscores.\n */\nexport interface ContextSegment {\n position: number;\n source: string;\n content_hash: string;\n content?: string;\n content_truncated?: boolean;\n tokens?: number;\n tokens_estimated?: boolean;\n cache_state?: \"cold\" | \"cache_write\" | \"cache_hit\";\n attrs?: Record<string, unknown>;\n producer_span_id?: string;\n}\n\nexport interface SpanData {\n trace_id: string;\n span_id: string;\n type: SpanType;\n name: string;\n parent_span_id?: string;\n started_at: string;\n ended_at?: string;\n duration_ms?: number;\n status: SpanStatus;\n // LLM-specific\n model?: string;\n input_tokens?: number;\n output_tokens?: number;\n cached_input_tokens?: number;\n cache_write_tokens?: number;\n total_tokens?: number;\n cost_usd?: number;\n // Payload\n input_data?: unknown;\n output_data?: unknown;\n error_message?: string;\n metadata?: Record<string, unknown>;\n /**\n * Pre-segmented context profile (Anthropic / LangGraph adapters populate this).\n * `undefined` → server runs its messages-array classifier.\n * `[]` → SDK explicitly says no segments (server skips classifier).\n * Populated → server skips classification and persists as-is.\n */\n context_segments?: ContextSegment[];\n}\n\nexport interface TraceFields {\n trace_id: string;\n /** Backend `TracePayloadIn.agent` — matches Python SDK + Pydantic schema. */\n agent: string;\n status: SpanStatus;\n started_at: string;\n ended_at?: string;\n duration_ms?: number;\n error_message?: string;\n success?: boolean;\n outcome?: string;\n}\n\nexport interface TraceEntry {\n trace: TraceFields;\n spans: SpanData[];\n}\n\n/** 32-char hex (128-bit). Compatible with W3C trace_id format. */\nexport function generateTraceId(): string {\n return randomHex(32);\n}\n\n/**\n * 32-char hex (UUID4-style, 128-bit). Matches the backend's UUID-typed\n * `span_id` column and the sibling Python SDK (`uuid.uuid4().hex`).\n *\n * When the SDK emits a W3C traceparent header (see `src/propagation.ts`),\n * the first 16 hex chars are sliced off to fit the W3C `span_id` slot —\n * that interop is handled at the header-formatting layer, not here.\n *\n * Was 16 hex chars historically (W3C span_id format) until Phase 13\n * Option A dogfood surfaced silent backend rejection: the dev ingest\n * `TracePayloadIn` schema requires UUID-shaped span_ids and was tossing\n * every TS-emitted span with `Invalid span_id format (expected UUID)`.\n */\nexport function generateSpanId(): string {\n return randomHex(32);\n}\n\nfunction randomHex(chars: number): string {\n const bytes = new Uint8Array(Math.ceil(chars / 2));\n // Use Web Crypto when available (Node 19+, all browsers).\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cryptoObj = (globalThis as any).crypto as Crypto | undefined;\n if (cryptoObj?.getRandomValues) {\n cryptoObj.getRandomValues(bytes);\n } else {\n // Fallback: Math.random — non-cryptographic but acceptable for trace IDs.\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n }\n let hex = \"\";\n for (const b of bytes) {\n hex += b.toString(16).padStart(2, \"0\");\n }\n return hex.slice(0, chars);\n}\n\nexport function nowIso(): string {\n return new Date().toISOString();\n}\n\n/** Serialize a SpanData, dropping undefined fields, matching Python's to_dict(). */\nexport function spanToWire(span: SpanData): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(span)) {\n if (v !== undefined && v !== null) {\n out[k] = v;\n }\n }\n return out;\n}\n\nexport function buildTraceEntry(\n fields: TraceFields,\n spans: SpanData[],\n): { trace: TraceFields; spans: Record<string, unknown>[] } {\n return {\n trace: fields,\n spans: spans.map(spanToWire),\n };\n}\n","/**\n * Client-side PII redaction for the TypeScript SDK.\n *\n * Phase 6f Wave B G-02. Mirrors:\n * - `apps/sdk/python/src/morse/redaction.py` (Python SDK)\n * - `apps/api/apps/core/redaction/patterns.py` (server-side floor)\n *\n * The eight pattern catalogue is canonical across all three implementations.\n * The parity corpus at\n * `openspec/changes/phase-6f-g02-pii-redaction/tests/parity_corpus.json`\n * pins identical input → output behaviour on every row.\n *\n * Redaction runs default-on inside the SDK process so that sensitive strings\n * never leave the customer's runtime. Customers can:\n * - disable the whole SDK layer (`redaction.enabled = false`),\n * - turn off non-mandatory built-ins (`disabledPatterns`),\n * - inject custom regexes (`extraPatterns`).\n *\n * The four mandatory keys (`api_key_prefixed`, `jwt`, `credit_card`,\n * `ssn_us`) cannot be disabled at the SDK — attempting to do so throws at\n * `init()`. Disabling everything at the SDK still leaves the server-side\n * mandatory floor in place.\n */\n\n/* ------------------------------------------------------------------------ */\n/* Pattern catalogue */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Canonical pattern keys. The redactor walks them in this order; once a\n * substring is replaced by a `[REDACTED:...]` marker, later patterns see\n * the replacement and don't re-match digit/word fragments inside it.\n *\n * Order MUST match `apps/api/apps/core/redaction/patterns.py` and\n * `apps/sdk/python/.../redaction.py` so the parity corpus produces\n * identical output across implementations.\n */\nexport const PATTERN_ORDER: readonly string[] = [\n \"api_key_prefixed\",\n \"jwt\",\n \"credit_card\",\n \"email\",\n \"phone_us\",\n \"phone_e164\",\n \"ssn_us\",\n \"ip_address\",\n] as const;\n\n/** Patterns that customers cannot disable at the SDK layer. */\nexport const MANDATORY_PATTERNS: ReadonlySet<string> = new Set([\n \"api_key_prefixed\",\n \"jwt\",\n \"credit_card\",\n \"ssn_us\",\n]);\n\n/** Patterns that ship disabled by default (opt-in). */\nexport const DEFAULT_OFF_PATTERNS: ReadonlySet<string> = new Set([\"ip_address\"]);\n\n/**\n * Short replacement keys. The replacement format is `[REDACTED:<short>]`.\n * `phone_us` and `phone_e164` collapse to `phone`.\n */\nconst SHORT_KEYS: Record<string, string> = {\n api_key_prefixed: \"api_key\",\n jwt: \"jwt\",\n credit_card: \"credit_card\",\n email: \"email\",\n phone_us: \"phone\",\n phone_e164: \"phone\",\n ssn_us: \"ssn\",\n ip_address: \"ip\",\n};\n\n/**\n * Compiled regexes for each pattern. The `g` flag is required so the\n * `String.replace(regex, ...)` call walks the whole string. `i` flag is\n * applied where the canonical Python form is case-insensitive (email,\n * ip_address) for lowercase IPv6 + uppercase email parity.\n *\n * NB: the Luhn-validating credit_card pattern returns *candidate* matches;\n * `redactString` runs Luhn before deciding to replace.\n */\nconst PATTERNS: Record<string, RegExp> = {\n api_key_prefixed: new RegExp(\n \"\\\\b(?:\" +\n \"sk-[A-Za-z0-9_-]{20,}\" +\n \"|sk_(?:live|test)_[A-Za-z0-9]{20,}\" +\n \"|mhq_[A-Za-z0-9]{20,}\" +\n \"|av_[A-Za-z0-9]{20,}\" +\n \"|ghp_[A-Za-z0-9]{36}\" +\n \"|gho_[A-Za-z0-9]{36}\" +\n \"|ghu_[A-Za-z0-9]{36}\" +\n \"|ghs_[A-Za-z0-9]{36}\" +\n \"|ghr_[A-Za-z0-9]{36}\" +\n \"|xox[bopsa]-[0-9A-Za-z\\\\-]{10,}\" +\n \"|(?:AKIA|ASIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASCA)[0-9A-Z]{16}\" +\n \")\\\\b\",\n \"g\",\n ),\n jwt: new RegExp(\n \"\\\\beyJ[A-Za-z0-9_=-]{16,}\\\\.eyJ[A-Za-z0-9_=-]{16,}\\\\.[A-Za-z0-9_=-]{16,}\\\\b\",\n \"g\",\n ),\n credit_card: new RegExp(\"\\\\b(?:\\\\d[ -]?){12,18}\\\\d\\\\b\", \"g\"),\n email: new RegExp(\"\\\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}\\\\b\", \"gi\"),\n // The leading `(?<!\\d)` and trailing `(?!\\d)` lookarounds prevent\n // the phone matcher from carving a 10-digit substring out of a longer\n // continuous digit run (e.g., a 16-digit credit-card-shaped number that\n // failed Luhn). Without them, `1234567890123456` would emit a\n // `[REDACTED:phone]` for digits 7-16 even though the whole run was\n // never a real phone number. The canonical Python regex needs the same\n // shim — see redaction.py.\n phone_us: new RegExp(\n \"(?<!\\\\d)(?:\\\\+?1[ \\\\-.])?\\\\(?[2-9]\\\\d{2}\\\\)?[ \\\\-.]?\\\\d{3}[ \\\\-.]?\\\\d{4}(?!\\\\d)\",\n \"g\",\n ),\n phone_e164: new RegExp(\"(?<!\\\\d)\\\\+(?:[0-9][ \\\\-.]?){8,14}[0-9](?!\\\\d)\", \"g\"),\n ssn_us: new RegExp(\n \"\\\\b(?!000|666|9\\\\d{2})\\\\d{3}[ \\\\-.](?!00)\\\\d{2}[ \\\\-.](?!0000)\\\\d{4}\\\\b\",\n \"g\",\n ),\n ip_address: new RegExp(\n \"\\\\b(?:\" +\n \"(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)\" +\n \"(?:\\\\.(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}\" +\n \"|(?:[A-F0-9]{1,4}:){2,7}[A-F0-9]{1,4}\" +\n \")\\\\b\",\n \"gi\",\n ),\n};\n\n/* ------------------------------------------------------------------------ */\n/* Configuration */\n/* ------------------------------------------------------------------------ */\n\n/** Public SDK option. Mirrors `redaction` in `init()`. */\nexport interface RedactionOptions {\n /** Master switch. Default: `true`. */\n enabled?: boolean;\n /** Pattern keys to selectively disable (mandatory keys rejected). */\n disabledPatterns?: string[];\n /** Customer-supplied regex strings (ECMAScript syntax). */\n extraPatterns?: string[];\n}\n\n/** Validated, frozen config fed into `redactString` / `redactValue`. */\nexport interface RedactionConfig {\n enabled: boolean;\n /** Keys actually applied, in stable order. */\n enabledPatterns: ReadonlySet<string>;\n /** Custom compiled regexes — applied last, with `[REDACTED:custom]`. */\n extraCompiled: readonly RegExp[];\n}\n\n/** Hard caps mirroring server-side validation. */\nconst EXTRA_PATTERN_CAP = 10;\nconst EXTRA_PATTERN_CHAR_CAP = 256;\n\n/**\n * Validate raw user options and return a normalised config. Throws on:\n * - disabling a mandatory pattern,\n * - more than 10 extra patterns,\n * - any extra pattern over 256 chars,\n * - any extra pattern that fails to compile via `new RegExp(...)`.\n *\n * `enabled = false` short-circuits — no patterns are applied.\n */\nexport function buildRedactionConfig(options?: RedactionOptions): RedactionConfig {\n const opts = options ?? {};\n const enabled = opts.enabled !== false;\n\n if (!enabled) {\n return {\n enabled: false,\n enabledPatterns: new Set<string>(),\n extraCompiled: [],\n };\n }\n\n // Mandatory-pattern lock-down.\n const disabled = new Set(opts.disabledPatterns ?? []);\n for (const key of disabled) {\n if (MANDATORY_PATTERNS.has(key)) {\n throw new Error(`redaction pattern '${key}' cannot be disabled (server-side mandatory)`);\n }\n }\n\n // Active set: every catalogue key NOT in default-off NOT in disabled.\n const active = new Set<string>();\n for (const key of PATTERN_ORDER) {\n if (DEFAULT_OFF_PATTERNS.has(key)) continue;\n if (disabled.has(key)) continue;\n active.add(key);\n }\n // Re-add any default-off pattern the user explicitly opted in to via a\n // `disabledPatterns` membership check is the wrong direction — the only\n // way to enable `ip_address` from the SDK today is through a future\n // `enabledPatterns` option. The spec keeps it default-off; tests pass\n // an explicit `enabledPatterns` set via the lower-level `redactString`.\n\n // Custom regex validation.\n const extraInput = opts.extraPatterns ?? [];\n if (extraInput.length > EXTRA_PATTERN_CAP) {\n throw new Error(\n `too many redaction extra patterns: ${extraInput.length} (max ${EXTRA_PATTERN_CAP})`,\n );\n }\n const extraCompiled: RegExp[] = [];\n for (const raw of extraInput) {\n if (typeof raw !== \"string\") {\n throw new Error(`redaction extra pattern must be a string, got ${typeof raw}`);\n }\n if (raw.length > EXTRA_PATTERN_CHAR_CAP) {\n throw new Error(`redaction extra pattern exceeds ${EXTRA_PATTERN_CHAR_CAP} chars`);\n }\n let compiled: RegExp;\n try {\n compiled = new RegExp(raw, \"g\");\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new Error(`redaction extra pattern failed to compile: ${JSON.stringify(raw)} — ${msg}`);\n }\n extraCompiled.push(compiled);\n }\n\n return {\n enabled: true,\n enabledPatterns: active,\n extraCompiled,\n };\n}\n\n/* ------------------------------------------------------------------------ */\n/* Luhn check */\n/* ------------------------------------------------------------------------ */\n\n/** Standard mod-10 Luhn check on the digits of `s` (ignores spaces/dashes). */\nfunction luhnValid(s: string): boolean {\n let sum = 0;\n let alt = false;\n let digits = 0;\n for (let i = s.length - 1; i >= 0; i--) {\n const ch = s.charCodeAt(i);\n if (ch < 48 || ch > 57) continue; // skip non-digits (spaces, dashes)\n let n = ch - 48;\n if (alt) {\n n *= 2;\n if (n > 9) n -= 9;\n }\n sum += n;\n alt = !alt;\n digits++;\n }\n if (digits < 13 || digits > 19) return false;\n return sum % 10 === 0;\n}\n\n/* ------------------------------------------------------------------------ */\n/* String redactor */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Internal: compute the active enabled set when callers pass an explicit\n * `enabledPatterns` (parity-corpus tests do this) vs. defaults.\n */\nfunction resolveEnabled(\n config: RedactionConfig,\n override?: ReadonlySet<string>,\n): ReadonlySet<string> {\n if (override !== undefined) return override;\n return config.enabledPatterns;\n}\n\n/**\n * Core redactor: walk patterns in canonical order, replace matches.\n *\n * `enabledOverride` allows tests (and the parity corpus) to specify an\n * exact enabled set, bypassing the config's default-on/off decisions.\n *\n * Customers calling through the SDK never see the override path — they\n * always pass through `RedactionConfig.enabledPatterns`.\n */\nexport function redactString(\n s: string,\n config: RedactionConfig,\n enabledOverride?: ReadonlySet<string>,\n): string {\n if (!config.enabled && enabledOverride === undefined) {\n return s;\n }\n if (s.length === 0) return s;\n\n const enabled = resolveEnabled(config, enabledOverride);\n let out = s;\n\n for (const key of PATTERN_ORDER) {\n if (!enabled.has(key)) continue;\n const re = PATTERNS[key];\n if (re === undefined) continue;\n // Reset `lastIndex` defensively (shared global regex state).\n re.lastIndex = 0;\n const replacement = `[REDACTED:${SHORT_KEYS[key]}]`;\n if (key === \"credit_card\") {\n out = out.replace(re, (m) => (luhnValid(m) ? replacement : m));\n } else {\n out = out.replace(re, replacement);\n }\n }\n\n // Custom patterns last.\n for (const re of config.extraCompiled) {\n re.lastIndex = 0;\n out = out.replace(re, \"[REDACTED:custom]\");\n }\n\n return out;\n}\n\n/* ------------------------------------------------------------------------ */\n/* JSON walker */\n/* ------------------------------------------------------------------------ */\n\nconst MAX_DEPTH = 10;\n\n/**\n * Recursively redact string leaves inside an arbitrary JSON-like value.\n * Booleans, numbers, nulls, undefined are passed through untouched.\n * Recursion is bounded at `MAX_DEPTH` to defend against pathological\n * payloads — beyond that, sub-trees are returned as-is.\n *\n * Arrays return new arrays; plain objects return new shallow-cloned\n * objects; non-plain objects (Date, Map, etc.) are returned as-is so we\n * don't accidentally serialise customer-internal types.\n */\nexport function redactValue(value: unknown, config: RedactionConfig, depth = 0): unknown {\n if (!config.enabled) return value;\n if (value === null || value === undefined) return value;\n if (typeof value === \"string\") return redactString(value, config);\n if (typeof value === \"number\" || typeof value === \"boolean\") return value;\n if (depth >= MAX_DEPTH) return value;\n\n if (Array.isArray(value)) {\n return value.map((item) => redactValue(item, config, depth + 1));\n }\n\n // Only walk plain objects (prototype is Object.prototype or null).\n if (typeof value === \"object\") {\n const proto = Object.getPrototypeOf(value);\n if (proto === Object.prototype || proto === null) {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = redactValue(v, config, depth + 1);\n }\n return out;\n }\n }\n\n return value;\n}\n","/**\n * OTel-backed transport engine for the v2 tracing primitives (MHQ-482 —\n * TypeScript SDK parity port of the Python SDK's `otel_provider.py`,\n * MHQ-668).\n *\n * Architecture\n * ------------\n * `run()` / `span()` / `runTraced()` still build the same in-memory\n * `TraceState` / `SpanData` structures they always have (see\n * `tracing.ts` — nothing there changed for adapters). What changed is what\n * happens to that data once a trace closes: instead of JSON-encoding it and\n * handing it to the hand-rolled queue + `setInterval` HTTP sender\n * (`transport.ts`, now used only by `track()` / `batchTrack()` / `record()`\n * / `log()` — see their call sites), the trace's already-built wire dict\n * (the same shape `getLastTrace()` returns) is converted into real\n * `@opentelemetry/sdk-trace-base` `Span` objects and handed to a standard\n * OTel pipeline:\n *\n * tracer.startSpan() / span.end()\n * -> BatchSpanProcessor (stdlib OTel: 512 batch / 5s / 2048 queue\n * defaults, overridable via env)\n * -> RedactingSpanExporter (this module — delegating wrapper)\n * -> OTLPTraceExporter (@opentelemetry/exporter-trace-otlp-proto,\n * protobuf + gzip, POSTs to `<endpoint>/api/v1/otlp/v1/traces`)\n *\n * Why convert at trace-close time rather than incrementally as each span\n * enters/exits: mirrors the Python design so both SDKs share one mental\n * model, and leaves room for future adapters that build `SpanData` objects\n * directly (bypassing the `startSpan`/`span()` helpers) to keep working\n * unmodified — they only ever touch `tracing.ts`'s `completedSpans` list,\n * never this module or `transport.ts`.\n *\n * Trace/span identifiers\n * -----------------------\n * Morse's own `trace_id` (32 hex chars / 128 bits, see `spans.ts`) maps 1:1\n * onto OTel's 128-bit `TraceId`. Morse's `span_id` is ALSO a 32-hex value —\n * but OTel's `SpanId` is only 64 bits (16 hex chars). There is no lossless\n * mapping, and none is needed: span ids are wire-protocol-local\n * identifiers, not semantic content, and the server already round-trips\n * OTel's 64-bit span ids by zero-extending them into the 128-bit UUID\n * column (mirrors `adapters/otlp.py::_hex_span_id_to_uuid` server-side).\n * This module lets OTel's own `RandomIdGenerator` mint the (random, valid)\n * span ids for each emitted span; it only forces the *trace* id, via the\n * same \"synthetic remote parent\" technique used for W3C traceparent\n * continuation (see `propagation.ts`): a non-recording `Span` wrapping a\n * `SpanContext` with the desired `traceId` and a pre-computed `sampled`\n * flag is set as the parent context for `tracer.startSpan()`, so every span\n * in the trace (root included) inherits the same trace id and the same\n * sampling decision.\n *\n * Node-only: unlike the rest of the TS SDK (which has to tolerate a\n * browser runtime for the module-level singleton), this module is only\n * ever loaded from `tracing.ts`'s Node-only `sendTrace()` path (guarded the\n * same way `_internal/tracing.ts`'s `AsyncLocalStorage` require is) and\n * imports Node-only OTel packages (`@opentelemetry/sdk-trace-node`,\n * `@opentelemetry/exporter-trace-otlp-proto`'s Node build). No browser\n * build target is provided for this module.\n */\n\nimport { createHash } from \"node:crypto\";\n\nimport {\n context as otelContext,\n ROOT_CONTEXT,\n SpanKind,\n SpanStatusCode,\n TraceFlags,\n trace as traceApi,\n type Span as OtelSpan,\n type SpanContext,\n type Tracer as OtelTracer,\n} from \"@opentelemetry/api\";\nimport type { ExportResult } from \"@opentelemetry/core\";\nimport { ExportResultCode } from \"@opentelemetry/core\";\nimport { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-proto\";\nimport { CompressionAlgorithm } from \"@opentelemetry/otlp-exporter-base\";\nimport {\n BatchSpanProcessor,\n ParentBasedSampler,\n TraceIdRatioBasedSampler,\n type ReadableSpan,\n type Sampler,\n type SpanExporter,\n type SpanProcessor,\n} from \"@opentelemetry/sdk-trace-base\";\nimport { NodeTracerProvider } from \"@opentelemetry/sdk-trace-node\";\nimport type { Instrumentation } from \"@opentelemetry/instrumentation\";\nimport { registerInstrumentations } from \"@opentelemetry/instrumentation\";\nimport { AsyncHooksContextManager } from \"@opentelemetry/context-async-hooks\";\n\nimport { redactString, type RedactionConfig } from \"./redaction\";\n\nconst INSTRUMENTATION_NAME = \"morse-typescript\";\nexport const DEFAULT_MAX_FIELD_BYTES = 65536;\nexport const TRUNCATION_MARKER = \"…[truncated]\";\n\n/* ------------------------------------------------------------------------ */\n/* Global OTel context propagation (MHQ-482 db-capture correlation) */\n/* ------------------------------------------------------------------------ */\n\nlet contextManagerRegistered = false;\n\n/**\n * Register a real, async-hooks-backed `ContextManager` on the GLOBAL\n * `@opentelemetry/api` context API, once per process.\n *\n * Why this is needed: `emitTraceEntry` never calls\n * `NodeTracerProvider.register()` (deliberately — see the module docstring;\n * registering would hijack the process's global tracer provider, forcing\n * every OTel-instrumented library in the host app through Morse's\n * exporter). But community DB-driver instrumentation packages (MHQ-482,\n * `./db-capture.ts`) read the *global* `context.active()` to find their\n * parent span — with no `ContextManager` registered, `@opentelemetry/api`\n * defaults to a no-op manager and `context.active()` is always\n * `ROOT_CONTEXT`, so DB spans would never nest under an active\n * `morse.span()` block.\n *\n * Registering a `ContextManager` (unlike `register()`) does NOT swap the\n * global tracer provider or propagator — it only makes `context.with()` /\n * `context.active()` actually track the active context across async\n * boundaries via `async_hooks`, which is exactly what\n * `withOtelSpanContext` below and the instrumentation packages both need.\n * `setGlobalContextManager` is itself idempotent/best-effort: if the host\n * app already registered its own (e.g., via `@opentelemetry/sdk-node`),\n * this call is a documented no-op (the API logs a diag warning and keeps\n * the existing one) — never a crash.\n */\nfunction ensureGlobalContextManager(): void {\n if (contextManagerRegistered) return;\n contextManagerRegistered = true;\n try {\n otelContext.setGlobalContextManager(new AsyncHooksContextManager().enable());\n } catch {\n // Best-effort — DB span *export* still succeeds either way; only\n // parent/child nesting via `context.active()` degrades (each DB span\n // becomes its own root instead of nesting under the active\n // `morse.span()`).\n }\n}\n\n/**\n * Set the OTel-global active context to a synthetic `SpanContext` carrying\n * `traceIdHex`/`spanIdHex`, then run `fn` inside it. Used by\n * `tracing.ts::spanSync`/`spanAsync`/`runSync`/`runAsync` (MHQ-482) so\n * community DB instrumentation invoked inside a `morse.span()`/`morse.run()`\n * block picks up the right trace id and nests under the right parent span\n * id via the normal OTel context-propagation `context.active()` path — the\n * same correlation mechanism `emitTraceEntry`'s synthetic-parent technique\n * uses for Morse's own deferred spans, applied live instead of at\n * trace-close time.\n *\n * No-op passthrough (just calls `fn()`) if the engine hasn't been\n * configured yet, mirroring the rest of this module's silent-no-transport\n * contract.\n */\nexport function withOtelSpanContext<T>(traceIdHex: string, spanIdHex: string, fn: () => T): T {\n const eng = getEngine();\n if (eng.provider === null) return fn();\n ensureGlobalContextManager();\n const sampled = eng.resolveSampled(traceIdHex);\n const spanCtx: SpanContext = {\n traceId: traceIdHex,\n spanId: spanIdHex,\n isRemote: true,\n traceFlags: sampled ? TraceFlags.SAMPLED : TraceFlags.NONE,\n };\n const withCtx = traceApi.setSpanContext(otelContext.active(), spanCtx);\n return otelContext.with(withCtx, fn);\n}\n\n// OTel BatchSpanProcessor stock defaults — documented here for readers;\n// the actual defaults are baked into `_internal/env.ts`'s\n// `getMaxQueueSize()` (2048) / `getMaxBatchSize()` (512), and the schedule\n// delay is derived from `flushIntervalSeconds` at the `init()` call site\n// (`index.ts`), not read directly by this module. Mirrors the Python\n// module's `_DEFAULT_*` constants.\n\n/* ------------------------------------------------------------------------ */\n/* Byte-cap helpers (applied at attribute-set time — MORSE_MAX_FIELD_BYTES) */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Truncate `value` to `maxBytes` (UTF-8), appending the truncation marker.\n * No-op if already within the cap. Never splits a multi-byte UTF-8\n * codepoint.\n */\nexport function capBytes(value: string, maxBytes: number): string {\n if (maxBytes <= 0) return value;\n const encoded = Buffer.from(value, \"utf-8\");\n if (encoded.length <= maxBytes) return value;\n const markerBytes = Buffer.byteLength(TRUNCATION_MARKER, \"utf-8\");\n const budget = Math.max(maxBytes - markerBytes, 0);\n let truncated = encoded.subarray(0, budget);\n const decoder = new TextDecoder(\"utf-8\", { fatal: true });\n while (truncated.length > 0) {\n try {\n return decoder.decode(truncated) + TRUNCATION_MARKER;\n } catch {\n truncated = truncated.subarray(0, truncated.length - 1);\n }\n }\n return TRUNCATION_MARKER;\n}\n\n/**\n * JSON-encode `value` and byte-cap the result.\n *\n * `null`/`undefined` in -> `null` out (caller omits the attribute\n * entirely). String values are capped BEFORE encoding so the result stays\n * valid JSON. Structured (object/array) values are encoded fully, then\n * capped as a raw string if oversized — on the rare oversized-structured-\n * payload path this can produce a value that no longer parses as JSON\n * server side; the server's tolerant-JSON adapters already drop\n * unparseable blobs as a whole, so this is a safety valve against\n * unbounded payload growth, not a guarantee of partial preservation\n * (mirrors Python's `json_capped`).\n */\nexport function jsonCapped(value: unknown, maxBytes: number): string | null {\n if (value === null || value === undefined) return null;\n if (typeof value === \"string\") {\n return JSON.stringify(capBytes(value, maxBytes));\n }\n let encoded: string;\n try {\n encoded = JSON.stringify(value, (_k, v) => (typeof v === \"bigint\" ? String(v) : v)) ?? \"null\";\n } catch {\n encoded = JSON.stringify(String(value));\n }\n return capBytes(encoded, maxBytes);\n}\n\n/* ------------------------------------------------------------------------ */\n/* Sampler — deterministic trace-ID ratio, whole-trace, decorrelated */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Return a value uniformly distributed over the full 128-bit range for\n * sampling purposes, decorrelated from `traceIdHex`'s UUIDv4 variant bits.\n * See `OtelEngine.resolveSampled` for why this exists — feeding a raw\n * uuid4 straight to a ratio-based sampler produces a hard 0%/100% step\n * function instead of a ratio (mirrors Python's\n * `_decorrelate_trace_id_for_sampling`).\n */\nfunction decorrelateTraceIdForSampling(traceIdHex: string): Buffer {\n const traceIdBytes = Buffer.from(traceIdHex.padStart(32, \"0\").slice(0, 32), \"hex\");\n return createHash(\"sha256\").update(traceIdBytes).digest();\n}\n\nconst MAX_U64 = (1n << 64n) - 1n;\n\n/**\n * Deterministic ratio-based sample decision, matching the standard OTel\n * `TraceIdRatioBased` algorithm (compare the low 64 bits of the id against\n * `round(rate * 2**64 - 1)`), but fed a SHA-256-decorrelated id instead of\n * the raw trace id — see `decorrelateTraceIdForSampling`.\n */\nexport function ratioSample(traceIdHex: string, rate: number): boolean {\n if (rate <= 0) return false;\n if (rate >= 1) return true;\n const digest = decorrelateTraceIdForSampling(traceIdHex);\n // Low 64 bits of the 128-bit decorrelated id: bytes [8:16) of the digest\n // prefix (digest[0:16] is what Python treats as the 128-bit decorrelated\n // int; its low 64 bits are its last 8 bytes).\n const low64 = digest.subarray(8, 16).readBigUInt64BE();\n const threshold = BigInt(Math.round(rate * Number(MAX_U64)));\n return low64 < threshold;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Redacting exporter — single redaction pass, off the hot path */\n/* ------------------------------------------------------------------------ */\n\nfunction redactAttrValue(value: unknown, config: RedactionConfig): unknown {\n if (typeof value === \"string\") return redactString(value, config);\n if (Array.isArray(value)) {\n return value.map((v) => (typeof v === \"string\" ? redactString(v, config) : v));\n }\n return value;\n}\n\n/**\n * Delegating `SpanExporter`: redacts span attribute string values in\n * `export()` (called on the `BatchSpanProcessor`'s background flush —\n * never on the caller's hot path), then forwards to the real OTLP\n * exporter. This is the SDK's single PII-redaction pass for the tracing\n * pipeline; nothing upstream of this (`tracing.ts`,\n * `otel-provider.ts::emitTraceEntry`) redacts anything for THIS pipeline\n * (see the module-level deviation note in the PR report re: `tracing.ts`'s\n * pre-existing `buildTraceDict`-time redaction, kept for `_getLastTrace()`\n * parity and harmless to double-apply).\n *\n * Mutates `ReadableSpan.attributes` in place — safe because\n * `@opentelemetry/sdk-trace-base`'s `Span` class does not freeze\n * `attributes` on `.end()` (unlike Python's `BoundedAttributes`, which\n * requires reassigning the whole backing dict via a private field).\n */\nclass RedactingSpanExporter implements SpanExporter {\n constructor(\n private readonly inner: SpanExporter,\n private readonly redactionConfig: RedactionConfig | null,\n ) {}\n\n export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {\n const config = this.redactionConfig;\n if (config && (config.enabled || config.extraCompiled.length > 0)) {\n for (const span of spans) {\n const attrs = span.attributes;\n if (!attrs) continue;\n for (const key of Object.keys(attrs)) {\n attrs[key] = redactAttrValue(attrs[key], config) as never;\n }\n }\n }\n this.inner.export(spans, resultCallback);\n }\n\n shutdown(): Promise<void> {\n return this.inner.shutdown();\n }\n\n forceFlush(): Promise<void> {\n return this.inner.forceFlush ? this.inner.forceFlush() : Promise.resolve();\n }\n}\n\n/**\n * Test-only in-memory exporter: mirrors whatever the redacting exporter\n * saw (i.e. POST-redaction data) so tests can inspect exported spans\n * without a live collector. Wrapped BEHIND the redacting exporter so it\n * observes the same redacted values the wire would carry.\n */\nexport class RecordingSpanExporter implements SpanExporter {\n spans: ReadableSpan[] = [];\n\n export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {\n this.spans.push(...spans);\n resultCallback({ code: ExportResultCode.SUCCESS });\n }\n\n shutdown(): Promise<void> {\n return Promise.resolve();\n }\n\n forceFlush(): Promise<void> {\n return Promise.resolve();\n }\n\n clear(): void {\n this.spans = [];\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* Provider singleton */\n/* ------------------------------------------------------------------------ */\n\nexport interface OtelEngineConfigureOptions {\n endpoint: string;\n apiKey: string;\n sampleRate: number;\n scheduleDelayMillis: number;\n maxQueueSize: number;\n maxExportBatchSize: number;\n maxFieldBytes: number;\n timeoutMillis: number;\n redactionConfig: RedactionConfig | null;\n captureForTests?: boolean;\n /**\n * Observe the real OTLP exporter's `ExportResult` for every flush, without\n * altering delivery. Used by `dogfood/smoke.ts` to assert the live dev-api\n * OTLP endpoint actually accepted the wire payload — the same class of\n * check `transport.ts`'s wire-format smoke coverage does for the legacy\n * JSON path (see `apps/sdk/typescript/CLAUDE.md`'s wire-format contract\n * rule). Not used by production `init()`.\n */\n resultSink?: (result: ExportResult) => void;\n}\n\n/**\n * Delegating `SpanExporter`: forwards to `inner`, calling `sink` with each\n * `ExportResult` before invoking the caller's callback. Purely an\n * observability tap — never alters the result or delays delivery.\n */\nclass ResultCapturingExporter implements SpanExporter {\n constructor(\n private readonly inner: SpanExporter,\n private readonly sink: (result: ExportResult) => void,\n ) {}\n\n export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {\n this.inner.export(spans, (result) => {\n this.sink(result);\n resultCallback(result);\n });\n }\n\n shutdown(): Promise<void> {\n return this.inner.shutdown();\n }\n\n forceFlush(): Promise<void> {\n return this.inner.forceFlush ? this.inner.forceFlush() : Promise.resolve();\n }\n}\n\n/** Lazily-built TracerProvider + exporter chain. One per process. */\nexport class OtelEngine {\n provider: NodeTracerProvider | null = null;\n tracer: OtelTracer | null = null;\n sampleRate = 1.0;\n recorder: RecordingSpanExporter | null = null;\n maxFieldBytes: number = DEFAULT_MAX_FIELD_BYTES;\n private exitHookRegistered = false;\n\n /**\n * (Re)build the provider. Mirrors Python's `_Client.__init__` semantics:\n * calling this again (e.g. a second `init()`) tears down the previous\n * provider first (fire-and-forget — Node has no synchronous blocking\n * shutdown equivalent to Python's `atexit`).\n */\n configure(opts: OtelEngineConfigureOptions): void {\n if (this.provider !== null) {\n const prior = this.provider;\n void prior.shutdown().catch(() => {\n // Swallowed — mirrors Python's best-effort prior-provider teardown.\n });\n }\n\n this.maxFieldBytes = opts.maxFieldBytes;\n this.sampleRate = Math.min(1, Math.max(0, opts.sampleRate));\n\n const sampler: Sampler = new ParentBasedSampler({\n root: new TraceIdRatioBasedSampler(this.sampleRate),\n });\n // No explicit `resource` — the provider falls back to its own bundled\n // `@opentelemetry/resources` default. Deliberately NOT constructing a\n // `Resource` here: doing so would pull `@opentelemetry/resources` in\n // as a direct runtime dependency of this module, and in a monorepo\n // where other packages (e.g. `@sentry/node`, `langsmith`) pin their\n // own OTel v2 patch versions, a directly-constructed `Resource`\n // instance can end up from a different installed copy than the one\n // `sdk-trace-node` itself uses internally — see the PR report's\n // deviation note.\n\n const otlpExporter = new OTLPTraceExporter({\n url: opts.endpoint,\n headers: { Authorization: `Bearer ${opts.apiKey}` },\n compression: CompressionAlgorithm.GZIP,\n timeoutMillis: opts.timeoutMillis,\n });\n let exporter: SpanExporter = new RedactingSpanExporter(otlpExporter, opts.redactionConfig);\n if (opts.resultSink) {\n exporter = new ResultCapturingExporter(exporter, opts.resultSink);\n }\n\n this.recorder = opts.captureForTests ? new RecordingSpanExporter() : null;\n\n const spanProcessors: SpanProcessor[] = [\n new BatchSpanProcessor(exporter, {\n maxQueueSize: opts.maxQueueSize,\n scheduledDelayMillis: opts.scheduleDelayMillis,\n maxExportBatchSize: opts.maxExportBatchSize,\n }),\n ];\n if (this.recorder !== null) {\n // Second processor: independent in-memory capture so tests can\n // inspect exported spans without a live collector. Runs its own\n // BatchSpanProcessor so it doesn't share queue pressure with the\n // real exporter.\n spanProcessors.push(new BatchSpanProcessor(this.recorder));\n }\n\n this.provider = new NodeTracerProvider({ sampler, spanProcessors });\n this.tracer = this.provider.getTracer(INSTRUMENTATION_NAME);\n\n if (!this.exitHookRegistered) {\n process.once(\"beforeExit\", () => {\n this.shutdown();\n });\n this.exitHookRegistered = true;\n }\n }\n\n shutdown(): void {\n if (this.provider !== null) {\n const provider = this.provider;\n void provider.shutdown().catch(() => {\n // Swallowed — best-effort on process exit.\n });\n this.provider = null;\n this.tracer = null;\n }\n }\n\n /**\n * Test-only fast reset: drop the provider reference WITHOUT blocking on\n * `shutdown()`. Mirrors Python's `reset_for_testing` — the OTLP\n * exporter's retry-with-backoff behavior against an unreachable test\n * endpoint would otherwise make every test file's teardown slow. The\n * queued background work is not awaited; it either finishes or is\n * abandoned with the process, same trade-off as Python's daemon worker\n * thread.\n */\n resetForTesting(): void {\n this.provider = null;\n this.tracer = null;\n this.recorder = null;\n }\n\n /** Block until in-flight exports finish (or the timeout elapses). */\n async flush(): Promise<void> {\n const provider = this.provider;\n if (provider !== null) {\n try {\n await provider.forceFlush();\n } catch {\n // Swallowed — mirrors Python's force_flush() debug-log-and-continue.\n }\n }\n }\n\n /**\n * Run the deterministic ratio sampler directly for a trace id with no\n * real parent. See `ratioSample` for the decorrelation rationale — feeding\n * a raw uuid4 trace id straight to a ratio sampler produces a hard\n * 0%/100% step function because of uuid4's fixed variant bits.\n */\n resolveSampled(traceIdHex: string): boolean {\n return ratioSample(traceIdHex, this.sampleRate);\n }\n\n /**\n * Register OTel `Instrumentation` instances (e.g. the community DB-driver\n * auto-instrumentation packages, see `./db-capture.ts`, MHQ-482) against\n * THIS engine's `NodeTracerProvider` — so spans they emit flow through\n * the same `BatchSpanProcessor` -> `RedactingSpanExporter` ->\n * `OTLPTraceExporter` pipeline `configure()` built, landing in the same\n * OTLP stream (and, when nested inside an active OTel context, the same\n * trace) as the rest of the SDK's spans.\n *\n * No-op (silently, returns `null`) if `configure()` hasn't run yet —\n * mirrors `emitTraceEntry`'s \"no transport configured -> silent\"\n * contract. Callers (`index.ts::buildSingleton`) must call this AFTER\n * `configure()`.\n */\n registerInstrumentations(instrumentations: Instrumentation[]): (() => void) | null {\n if (this.provider === null) return null;\n return registerInstrumentations({\n tracerProvider: this.provider,\n instrumentations,\n });\n }\n}\n\nlet engine: OtelEngine | null = null;\n\nexport function getEngine(): OtelEngine {\n if (engine === null) engine = new OtelEngine();\n return engine;\n}\n\n/**\n * True in the Node build. The browser build\n * (`otel-provider.browser.ts`, selected by package.json's `\"browser\"`\n * export condition) returns false, which routes `tracing.ts::sendTrace`\n * down the JSON transport instead of the OTLP pipeline that cannot exist\n * there. Kept as a function rather than a const so both modules present an\n * identical shape.\n */\nexport function isOtelAvailable(): boolean {\n return true;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Attribute mapping — trace-entry dict -> OTel attributes */\n/* ------------------------------------------------------------------------ */\n\ntype AttrValue = string | number | boolean;\n\nfunction spanDictToOtelAttributes(\n spanDict: Record<string, unknown>,\n traceDict: Record<string, unknown>,\n resourceDict: Record<string, unknown>,\n opts: { isRoot: boolean; maxFieldBytes: number },\n): Record<string, AttrValue> {\n const attrs: Record<string, AttrValue> = {};\n\n const spanType = spanDict.type;\n if (typeof spanType === \"string\" && spanType) attrs[\"av.span_type\"] = spanType;\n\n const model = spanDict.model;\n if (model !== undefined && model !== null) attrs[\"gen_ai.request.model\"] = String(model);\n\n const tokenFields: ReadonlyArray<readonly [string, string]> = [\n [\"input_tokens\", \"gen_ai.usage.input_tokens\"],\n [\"output_tokens\", \"gen_ai.usage.output_tokens\"],\n [\"cached_input_tokens\", \"gen_ai.usage.cache_read_input_tokens\"],\n [\"cache_write_tokens\", \"gen_ai.usage.cache_creation_input_tokens\"],\n [\"reasoning_tokens\", \"gen_ai.usage.reasoning_tokens\"],\n ];\n for (const [src, otelKey] of tokenFields) {\n const v = spanDict[src];\n if (v !== undefined && v !== null) {\n const n = Number(v);\n if (Number.isFinite(n)) attrs[otelKey] = Math.trunc(n);\n }\n }\n\n const costUsd = spanDict.cost_usd;\n if (costUsd !== undefined && costUsd !== null) {\n // av.cost_usd: direct SDK/adapter-computed cost (pricing-table based) —\n // distinct from gen_ai.usage.cost (provider-billing-reported).\n // Stringify to preserve precision across the wire.\n attrs[\"av.cost_usd\"] = String(costUsd);\n }\n\n for (const [src, otelKey] of [\n [\"input_data\", \"av.input_data\"],\n [\"output_data\", \"av.output_data\"],\n [\"context_segments\", \"av.context_segments\"],\n ] as const) {\n const v = spanDict[src];\n if (v !== undefined && v !== null) {\n const encoded = jsonCapped(v, opts.maxFieldBytes);\n if (encoded !== null) attrs[otelKey] = encoded;\n }\n }\n\n // Arbitrary custom metadata. Each top-level key is namespaced under\n // `av.metadata.<key>` so the server's OTLP translation layer can pop +\n // un-prefix + JSON-decode them back into a clean metadata dict.\n const metadata = spanDict.metadata;\n if (metadata && typeof metadata === \"object\") {\n for (const [key, value] of Object.entries(metadata as Record<string, unknown>)) {\n const encoded = jsonCapped(value, opts.maxFieldBytes);\n if (encoded !== null) attrs[`av.metadata.${key}`] = encoded;\n }\n }\n\n const errorMessage = spanDict.error_message;\n // Trace-level fields only travel on the root span.\n if (opts.isRoot) {\n const threadId = traceDict.thread_id;\n if (threadId !== undefined && threadId !== null) attrs[\"av.thread_id\"] = String(threadId);\n const userId = traceDict.user_id;\n if (userId !== undefined && userId !== null) attrs[\"av.user_id\"] = String(userId);\n const userMetadata = traceDict.user_metadata;\n if (userMetadata && typeof userMetadata === \"object\") {\n const entries = Object.entries(userMetadata as Record<string, unknown>);\n if (entries.length > 0) {\n attrs[\"av.user_metadata\"] = JSON.stringify(\n Object.fromEntries(entries.map(([k, v]) => [k, String(v)])),\n );\n }\n }\n const success = traceDict.success;\n if (success !== undefined && success !== null) attrs[\"av.outcome.success\"] = Boolean(success);\n const outcome = traceDict.outcome;\n if (outcome !== undefined && outcome !== null) attrs[\"av.outcome.label\"] = String(outcome);\n const framework = resourceDict[\"morse_ai.framework\"];\n if (typeof framework === \"string\" && framework) attrs[\"av.framework\"] = framework;\n const source = resourceDict[\"morse_ai.source\"];\n if (typeof source === \"string\" && source) attrs[\"av.source\"] = source;\n }\n\n if (errorMessage && spanDict.status === \"failed\") {\n attrs[\"av.error_message\"] = String(errorMessage);\n }\n\n return attrs;\n}\n\nfunction isoToTimeInputMillis(value: unknown): number | undefined {\n if (typeof value !== \"string\" || !value) return undefined;\n const ms = Date.parse(value);\n return Number.isNaN(ms) ? undefined : ms;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Public entry point */\n/* ------------------------------------------------------------------------ */\n\nexport interface TraceEntryLike {\n trace?: Record<string, unknown>;\n spans?: Array<Record<string, unknown>>;\n resource?: Record<string, unknown>;\n}\n\n/**\n * Convert one already-built wire-format trace entry (the same shape\n * `tracing.ts::buildTraceDict` produces / `getLastTrace()` returns) into\n * real OTel spans and hand them to the configured pipeline.\n *\n * No-op (silently) if the engine hasn't been configured yet — mirrors the\n * \"no transport configured -> silent\" contract the rest of the SDK\n * follows.\n */\nexport function emitTraceEntry(entry: TraceEntryLike): void {\n const eng = getEngine();\n const tracer = eng.tracer;\n if (tracer === null) return;\n\n const traceDict = entry.trace ?? {};\n const spanDicts = entry.spans ?? [];\n const resourceDict = entry.resource ?? {};\n if (spanDicts.length === 0) return;\n\n const traceIdHexRaw = traceDict.trace_id;\n if (typeof traceIdHexRaw !== \"string\" || traceIdHexRaw.length === 0) return;\n const traceIdHex = traceIdHexRaw.toLowerCase().padStart(32, \"0\").slice(0, 32);\n if (!/^[0-9a-f]{32}$/.test(traceIdHex) || /^0+$/.test(traceIdHex)) return;\n\n const sampled = eng.resolveSampled(traceIdHex);\n const syntheticParentContext: SpanContext = {\n traceId: traceIdHex,\n // Placeholder — only traceId/traceFlags matter here; every real span\n // in the trace gets its own OTel-minted spanId via startSpan().\n spanId: \"0000000000000001\",\n isRemote: true,\n traceFlags: sampled ? TraceFlags.SAMPLED : TraceFlags.NONE,\n };\n const rootParentCtx = traceApi.setSpanContext(ROOT_CONTEXT, syntheticParentContext);\n\n let rootSpanId: unknown;\n for (const s of spanDicts) {\n if (!s.parent_span_id) {\n rootSpanId = s.span_id;\n break;\n }\n }\n if (rootSpanId === undefined && spanDicts.length > 0) {\n rootSpanId = spanDicts[0]!.span_id;\n }\n\n // Root first, then children — so a child's parent SpanContext is always\n // available by the time we process it.\n const ordered = [...spanDicts].sort((a, b) => {\n const aIsRoot = a.span_id === rootSpanId ? 0 : 1;\n const bIsRoot = b.span_id === rootSpanId ? 0 : 1;\n return aIsRoot - bIsRoot;\n });\n\n const spanCtxById = new Map<string, SpanContext>();\n const maxFieldBytes = eng.maxFieldBytes;\n\n for (const spanDict of ordered) {\n const spanIdHex = typeof spanDict.span_id === \"string\" ? spanDict.span_id : undefined;\n const parentIdHex =\n typeof spanDict.parent_span_id === \"string\" ? spanDict.parent_span_id : undefined;\n\n let parentCtx = rootParentCtx;\n if (parentIdHex && spanCtxById.has(parentIdHex)) {\n parentCtx = traceApi.setSpanContext(ROOT_CONTEXT, spanCtxById.get(parentIdHex)!);\n }\n\n const attributes = spanDictToOtelAttributes(spanDict, traceDict, resourceDict, {\n isRoot: spanDict.span_id === rootSpanId,\n maxFieldBytes,\n });\n const startTime = isoToTimeInputMillis(spanDict.started_at);\n const endTime = isoToTimeInputMillis(spanDict.ended_at) ?? startTime;\n\n try {\n const otelSpan: OtelSpan = tracer.startSpan(\n typeof spanDict.name === \"string\" && spanDict.name ? spanDict.name : \"span\",\n {\n kind: SpanKind.INTERNAL,\n attributes,\n startTime,\n },\n parentCtx,\n );\n if (spanIdHex) {\n spanCtxById.set(spanIdHex, otelSpan.spanContext());\n }\n if (spanDict.status === \"failed\") {\n otelSpan.setStatus({\n code: SpanStatusCode.ERROR,\n message: String(spanDict.error_message ?? \"\"),\n });\n }\n otelSpan.end(endTime);\n } catch {\n // Never break the host app — mirrors Python's blanket except+debug-log.\n }\n }\n}\n","/**\n * SDK V2 tracing core — TraceState, run(), span() context-manager-likes.\n *\n * Mirrors `apps/sdk/python/src/morse/tracing.py`. Key differences:\n *\n * - Python uses `contextvars.ContextVar` for async/coroutine isolation.\n * In Node we use `node:async_hooks.AsyncLocalStorage` when available\n * (server-side, including Next.js API routes). On the browser there\n * is no equivalent; we fall back to a module-global slot. This is\n * acceptable because in the browser there is exactly one event loop\n * and one user — no parallel traces.\n *\n * - \"Context manager\" idioms in TS use callback-style: `run(name, fn)`\n * and `span(name, type, fn)` accept a function and invoke it with\n * the active state on the stack. We keep an explicit `start/end`\n * pair on the public surface for callers who can't use callbacks\n * (e.g., when the work spans an SSE stream).\n *\n * - MHQ-482: `run()`/`span()`/`runTraced()`'s emission path now goes\n * through `./otel-provider` (real OTel spans over OTLP, Node-only —\n * mirrors the Python SDK's MHQ-668 `otel_provider.py`). This is a\n * deliberate Node-only deviation from this module's own browser\n * fallback for `AsyncLocalStorage` above: `otel-provider.ts` statically\n * imports `@opentelemetry/sdk-trace-node`, which pulls in Node built-ins\n * (`node:crypto`, `node:http`/`https`) that don't exist in a browser\n * bundle. A future browser-targeted build would need either a\n * browser-flavored OTel exporter swapped in at this call site or to\n * keep `MORSE_LEGACY_TRANSPORT=1`'s JSON path as the browser default —\n * out of scope for this port (see the PR report's deviation notes).\n *\n * - MHQ-482 (db-capture follow-up): `runSync`/`runAsync`/`spanSync`/\n * `spanAsync` now ALSO wrap `fn()` in a live OTel context via\n * `otel-provider.ts::withOtelSpanContext` (Node only — a no-op\n * passthrough everywhere else, including the browser fallback path,\n * since that helper itself no-ops when the OTel engine isn't\n * configured). This is what lets community DB-driver instrumentation\n * (`./db-capture.ts`) — which reads OTel's *global*\n * `context.active()`, not this module's `TraceState` — see the right\n * trace id and nest under the right parent span id when a query runs\n * inside an active `morse.span()`/`morse.run()` block. It's a\n * deliberately separate mechanism from `emitTraceEntry`'s\n * synthetic-parent trick: that one runs once at trace-close time over\n * already-built `SpanData`; this one runs live, for spans this module\n * never sees (they're built entirely inside the instrumentation\n * package and exported directly to the same `NodeTracerProvider`).\n */\n\nimport { isLegacyTransport, isValidInternalSource } from \"./env\";\nimport { emitTraceEntry, isOtelAvailable, withOtelSpanContext } from \"./otel-provider\";\nimport { buildRedactionConfig, type RedactionConfig, redactValue } from \"./redaction\";\nimport type { SpanData, SpanStatus, SpanType } from \"./spans\";\nimport { generateSpanId, generateTraceId, nowIso } from \"./spans\";\n\n/* ------------------------------------------------------------------------ */\n/* Internal state */\n/* ------------------------------------------------------------------------ */\n\nexport interface TraceState {\n traceId: string;\n agentName: string;\n spanStack: SpanData[];\n completedSpans: SpanData[];\n // Mutable outcome fields — set by `run()` callers via the returned handle.\n success?: boolean;\n outcome?: string;\n errorMessage?: string;\n // Multi-turn attribution (MHQ-748). threadId groups traces in the same\n // conversation; userId is the app-layer end-user identifier. Both\n // optional — mirrors Python's `_TraceState.thread_id`/`user_id`.\n threadId?: string;\n userId?: string;\n // Cost-attribution dimensions — set via `run({ userMetadata })` at\n // trace-creation time, or mutated mid-trace via `setContext()` (MHQ-751).\n // Keys/values are always strings at the SDK boundary — mirrors Python's\n // `_TraceState.user_metadata`.\n userMetadata?: Record<string, string>;\n // Per-trace override of the resource-level `morse_ai.source` tag. Wins\n // over the process-level `_source` when set — mirrors Python's\n // `_TraceState.source_override`.\n sourceOverride?: string;\n}\n\ntype AlsLike<T> = {\n getStore(): T | undefined;\n run<R>(value: T, fn: () => R): R;\n};\n\nlet als: AlsLike<TraceState> | null = null;\nlet alsLoaded = false;\nlet browserState: TraceState | null = null;\n\nfunction tryLoadAls(): AlsLike<TraceState> | null {\n if (alsLoaded) return als;\n alsLoaded = true;\n // Skip in the browser.\n if (typeof process === \"undefined\" || !process.versions?.node) {\n als = null;\n return als;\n }\n try {\n // Use a runtime-eval'd require so the browser bundler doesn't try\n // to resolve `node:async_hooks`.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const dynamicRequire = Function(\"m\", \"return require(m)\") as any as (m: string) => unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mod = dynamicRequire(\"node:async_hooks\") as any;\n if (mod?.AsyncLocalStorage) {\n als = new mod.AsyncLocalStorage() as AlsLike<TraceState>;\n return als;\n }\n } catch {\n // Fall through to browser fallback.\n }\n als = null;\n return als;\n}\n\nexport function getActiveTraceState(): TraceState | null {\n const store = tryLoadAls();\n if (store) {\n return store.getStore() ?? null;\n }\n return browserState;\n}\n\nfunction setActiveTraceState(state: TraceState | null): () => void {\n // Returns a \"reset\" callback. Used only on the browser path. On Node,\n // `als.run()` handles the lifecycle.\n const previous = browserState;\n browserState = state;\n return () => {\n browserState = previous;\n };\n}\n\n/* ------------------------------------------------------------------------ */\n/* Transport injection */\n/* ------------------------------------------------------------------------ */\n\nexport interface TransportLike {\n track(event: { traces: unknown[] } | Record<string, unknown>): boolean;\n}\n\nlet transport: TransportLike | null = null;\n\nexport function setTransport(t: TransportLike | null): void {\n transport = t;\n}\n\nexport function getTransport(): TransportLike | null {\n return transport;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Redaction config — module-level, replaceable on init() */\n/* ------------------------------------------------------------------------ */\n\n// Default-on with the canonical catalogue. Replaced when `init()` runs\n// with explicit redaction options. Customers calling SDK helpers before\n// `init()` still get the default redaction floor.\nlet redactionConfig: RedactionConfig = buildRedactionConfig();\n\nexport function setRedactionConfig(config: RedactionConfig): void {\n redactionConfig = config;\n}\n\nexport function getRedactionConfig(): RedactionConfig {\n return redactionConfig;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Resource-level \"source\" label (dogfood emitter discrimination) */\n/* ------------------------------------------------------------------------ */\n\n// Process-level source tag. Lifted into each outgoing trace's `resource`\n// dict so the backend can discriminate Morse's own dogfood emitters\n// from customer traces. Mirrors the Python SDK's module-level `_source`.\nlet _source: string | null = null;\n\nexport function setSource(value: string | null | undefined): void {\n _source = value && value.length > 0 ? value : null;\n}\n\nexport function getSource(): string | null {\n return _source;\n}\n\nlet lastTrace: { trace: unknown; spans: unknown[] } | null = null;\n\nexport function getLastTrace(): { trace: unknown; spans: unknown[] } | null {\n return lastTrace;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Trace lifecycle helpers */\n/* ------------------------------------------------------------------------ */\n\nfunction nowMonotonic(): number {\n // performance.now() is available in Node >= 16 globally and in all browsers.\n if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n return performance.now();\n }\n return Date.now();\n}\n\nfunction elapsedMs(startMonotonic: number): number {\n return Math.max(0, Math.round(nowMonotonic() - startMonotonic));\n}\n\nfunction finalizeSpan(\n span: SpanData,\n startMono: number,\n status: SpanStatus = \"completed\",\n errorMessage?: string,\n): void {\n span.ended_at = nowIso();\n span.duration_ms = elapsedMs(startMono);\n span.status = status;\n if (errorMessage !== undefined) {\n span.error_message = errorMessage;\n }\n}\n\n/**\n * Field allowlist for span-level redaction. Identifiers, timestamps,\n * counts, and types pass through untouched; user-supplied strings and\n * JSON blobs route through `redactValue`.\n */\nconst SPAN_REDACTABLE_FIELDS: ReadonlySet<string> = new Set([\n \"name\",\n \"input_data\",\n \"output_data\",\n \"error_message\",\n \"metadata\",\n]);\n\nconst TRACE_REDACTABLE_FIELDS: ReadonlySet<string> = new Set([\"agent\", \"outcome\", \"error_message\"]);\n\nfunction redactSpanDict(\n raw: Record<string, unknown>,\n config: RedactionConfig,\n): Record<string, unknown> {\n if (!config.enabled) return raw;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(raw)) {\n if (SPAN_REDACTABLE_FIELDS.has(k)) {\n out[k] = redactValue(v, config);\n } else {\n out[k] = v;\n }\n }\n return out;\n}\n\nfunction redactTraceDict(\n raw: Record<string, unknown>,\n config: RedactionConfig,\n): Record<string, unknown> {\n if (!config.enabled) return raw;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(raw)) {\n if (TRACE_REDACTABLE_FIELDS.has(k)) {\n out[k] = redactValue(v, config);\n } else {\n out[k] = v;\n }\n }\n return out;\n}\n\nfunction buildTraceDict(\n state: TraceState,\n rootSpan: SpanData,\n): {\n trace: Record<string, unknown>;\n spans: Record<string, unknown>[];\n} {\n const trace: Record<string, unknown> = {\n trace_id: state.traceId,\n // Wire-format field is `agent` (matches backend TracePayloadIn schema +\n // sibling Python SDK). Was `agent_name` historically — the mismatch\n // caused dev ingest to reject every TS-emitted trace with a 422\n // until Phase 13 Option A dogfood surfaced it.\n agent: state.agentName,\n status: rootSpan.status,\n started_at: rootSpan.started_at,\n };\n if (rootSpan.ended_at) trace.ended_at = rootSpan.ended_at;\n if (rootSpan.duration_ms !== undefined) trace.duration_ms = rootSpan.duration_ms;\n if (rootSpan.error_message) trace.error_message = rootSpan.error_message;\n if (state.success !== undefined) trace.success = state.success;\n if (state.outcome !== undefined) trace.outcome = state.outcome;\n // MHQ-748/MHQ-751: multi-turn + cost-attribution dimensions. Field names\n // (`thread_id`/`user_id`/`user_metadata`) match the backend's\n // `TracePayloadIn` schema exactly (apps/api/apps/traces/schemas.py) and\n // the sibling Python SDK's `_build_trace_dict` — do not camelCase these.\n if (state.threadId !== undefined) trace.thread_id = state.threadId;\n if (state.userId !== undefined) trace.user_id = state.userId;\n if (state.userMetadata && Object.keys(state.userMetadata).length > 0) {\n trace.user_metadata = state.userMetadata;\n }\n\n const allSpans = [rootSpan, ...state.completedSpans];\n const spans = allSpans.map((s) => {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(s)) {\n if (v !== undefined && v !== null) {\n out[k] = v;\n }\n }\n return out;\n });\n\n const config = redactionConfig;\n const out = {\n trace: redactTraceDict(trace, config),\n spans: spans.map((s) => redactSpanDict(s, config)),\n };\n // Per-trace `sourceOverride` wins over the process-level `_source` —\n // mirrors Python's `_build_trace_dict`'s `effective_source = state.source_override or _source`.\n const effectiveSource = state.sourceOverride || _source;\n if (effectiveSource) {\n // Lift the source label onto the trace envelope so the backend can\n // route dogfood-emitter traces to the internal dashboards. Mirrors\n // Python's `resource[\"morse_ai.source\"]`.\n (out as Record<string, unknown>).resource = { \"morse_ai.source\": effectiveSource };\n }\n return out;\n}\n\n/**\n * `run()` / `span()` / `runTraced()`'s emission path: real OTel spans over\n * OTLP (MHQ-482, mirrors Python's `tracing.py::_finish_trace`, MHQ-668).\n * Always updates `lastTrace` (test/debug introspection — same bookkeeping\n * regardless of which pipeline actually ships the trace), then hands the\n * dict to `otel-provider.ts::emitTraceEntry()` — unless\n * `MORSE_LEGACY_TRANSPORT=1`, in which case it falls back to the old JSON\n * queue path instead (rollback escape hatch; never both, to avoid\n * double-ingesting the same trace).\n *\n * Exported (MHQ-746) so `index.ts::record()` can submit a synthetic\n * single-span trace through this same pipeline instead of the defunct\n * `runs`-shaped `state.transport.track()` path — mirrors the Python SDK's\n * `client.py::record()`, which builds a trace + span dict and calls this\n * module's `_send_trace()` directly rather than going through `track()`.\n */\nexport function sendTrace(entry: {\n trace: Record<string, unknown>;\n spans: Record<string, unknown>[];\n}): void {\n lastTrace = entry;\n\n // `!isOtelAvailable()` is the browser build (see `otel-provider.browser.ts`):\n // the OTLP pipeline is Node-only, so browser traces take the same JSON path\n // the legacy escape hatch uses rather than being dropped. Still never both.\n if (isLegacyTransport() || !isOtelAvailable()) {\n if (transport !== null) {\n try {\n transport.track({ traces: [entry] });\n } catch {\n // never propagate\n }\n }\n return;\n }\n\n try {\n emitTraceEntry(entry);\n } catch {\n // never propagate — mirrors the rest of the SDK's non-invasive guarantee\n }\n}\n\n/**\n * Run `fn` with the OTel-global active context set to a synthetic\n * `SpanContext` for `spanIdHex` under `traceId` (MHQ-482 db-capture\n * correlation — see the module docstring). No-op passthrough if the OTel\n * engine isn't configured (browser, uninitialized SDK, or\n * `otel-provider.ts` import failure) — never throws, mirrors the rest of\n * this module's non-invasive guarantee.\n */\nfunction withDbCaptureContext<T>(traceId: string, spanIdHex: string, fn: () => T): T {\n try {\n // OTel SpanId is 64-bit (16 hex chars); Morse's span_id is 128-bit\n // (32 hex chars) — same truncation convention `spans.ts::generateSpanId`\n // documents for W3C traceparent interop.\n return withOtelSpanContext(traceId, spanIdHex.slice(0, 16), fn);\n } catch {\n return fn();\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* Public-ish run() and span() — wrapped at the module surface */\n/* ------------------------------------------------------------------------ */\n\nexport interface RunOptions {\n agentName: string;\n /** W3C traceparent value to continue an upstream trace, when available. */\n incomingTraceparent?: string | null;\n /**\n * Application-layer conversation/thread identifier (MHQ-748). Groups all\n * traces from the same multi-turn session so the dashboard can show the\n * full conversation history for a thread. Mirrors Python's\n * `run(thread_id=...)`.\n */\n threadId?: string;\n /**\n * Application-layer end-user identifier (e.g. a user primary key or\n * email) (MHQ-748). Enables per-user filtering in the dashboard. Mirrors\n * Python's `run(user_id=...)`.\n */\n userId?: string;\n /**\n * Cost-attribution dimensions attached to this trace at creation time\n * (e.g. `customer_id`, `feature`, `env`, `team`) (MHQ-748). Values are\n * coerced to strings. Can also be set/merged mid-trace via\n * `setContext()` (MHQ-751). Mirrors Python's `run(user_metadata=...)`.\n */\n userMetadata?: Record<string, unknown>;\n /**\n * INTERNAL USE ONLY — per-trace override for the resource-level\n * `morse_ai.source` tag. Wins over the process-level source set at\n * `init({ source })`. Accepted values: `\"copilot\" | \"investigator\" |\n * \"refagent\" | \"ui-bot\"`; anything else is silently ignored and the\n * process-level source is used. Customer code should leave this unset.\n * Mirrors Python's `run(source=...)`.\n */\n source?: string;\n}\n\nexport interface RunHandle {\n setOutcome(success: boolean, outcome?: string): void;\n setError(message: string): void;\n /** Internal — set by `runSync`/`runAsync`. */\n _state: TraceState;\n}\n\nfunction buildRunHandle(state: TraceState): RunHandle {\n return {\n setOutcome(success, outcome) {\n state.success = success;\n if (outcome !== undefined) state.outcome = outcome;\n },\n setError(message) {\n state.errorMessage = message;\n state.success = false;\n },\n _state: state,\n };\n}\n\nfunction startTrace(opts: RunOptions): {\n state: TraceState;\n rootSpan: SpanData;\n startMono: number;\n} {\n let traceId: string | undefined;\n if (opts.incomingTraceparent) {\n // Lazy import to avoid a cycle.\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { extractTraceparent } = require(\"../propagation\") as typeof import(\"../propagation\");\n const ctx = extractTraceparent(opts.incomingTraceparent);\n if (ctx) {\n traceId = ctx.traceId;\n }\n }\n if (!traceId) traceId = generateTraceId();\n\n const state: TraceState = {\n traceId,\n agentName: opts.agentName,\n spanStack: [],\n completedSpans: [],\n };\n if (opts.threadId !== undefined) state.threadId = opts.threadId;\n if (opts.userId !== undefined) state.userId = opts.userId;\n if (opts.userMetadata) {\n state.userMetadata = Object.fromEntries(\n Object.entries(opts.userMetadata).map(([k, v]) => [k, String(v)]),\n );\n }\n // Validate against the same whitelist as `init({ source })` — an invalid\n // value falls through to whatever the process has set (never throws).\n if (isValidInternalSource(opts.source)) {\n state.sourceOverride = opts.source;\n }\n const rootSpan: SpanData = {\n trace_id: traceId,\n span_id: generateSpanId(),\n type: \"agent\" as SpanType,\n name: opts.agentName,\n started_at: nowIso(),\n status: \"completed\",\n };\n state.spanStack.push(rootSpan);\n return { state, rootSpan, startMono: nowMonotonic() };\n}\n\nfunction endTrace(\n state: TraceState,\n rootSpan: SpanData,\n startMono: number,\n threwError: unknown,\n): void {\n state.spanStack.pop();\n if (threwError !== undefined) {\n const msg = state.errorMessage ?? errToString(threwError);\n finalizeSpan(rootSpan, startMono, \"failed\", msg);\n if (state.success === undefined) state.success = false;\n } else if (state.errorMessage !== undefined) {\n finalizeSpan(rootSpan, startMono, \"failed\", state.errorMessage);\n // setError() already set state.success = false.\n } else {\n finalizeSpan(rootSpan, startMono);\n if (state.success === undefined) state.success = true;\n }\n const dict = buildTraceDict(state, rootSpan);\n sendTrace(dict);\n}\n\nfunction errToString(e: unknown): string {\n if (e instanceof Error) return e.message;\n return String(e);\n}\n\n/* ------------------------------------------------------------------------ */\n/* Sync + async run() wrappers */\n/* ------------------------------------------------------------------------ */\n\nexport function runSync<T>(opts: RunOptions, fn: (handle: RunHandle) => T): T | undefined {\n const { state, rootSpan, startMono } = startTrace(opts);\n const handle = buildRunHandle(state);\n const store = tryLoadAls();\n\n const runFn = (): T => withDbCaptureContext(state.traceId, rootSpan.span_id, () => fn(handle));\n\n if (store) {\n try {\n const result = store.run(state, runFn);\n endTrace(state, rootSpan, startMono, undefined);\n return result;\n } catch (err) {\n endTrace(state, rootSpan, startMono, err);\n throw err;\n }\n } else {\n const reset = setActiveTraceState(state);\n try {\n const result = runFn();\n endTrace(state, rootSpan, startMono, undefined);\n return result;\n } catch (err) {\n endTrace(state, rootSpan, startMono, err);\n throw err;\n } finally {\n reset();\n }\n }\n}\n\nexport async function runAsync<T>(\n opts: RunOptions,\n fn: (handle: RunHandle) => Promise<T>,\n): Promise<T | undefined> {\n const { state, rootSpan, startMono } = startTrace(opts);\n const handle = buildRunHandle(state);\n const store = tryLoadAls();\n\n const runFn = (): Promise<T> =>\n withDbCaptureContext(state.traceId, rootSpan.span_id, () => fn(handle));\n\n if (store) {\n try {\n const result = await store.run(state, runFn);\n endTrace(state, rootSpan, startMono, undefined);\n return result;\n } catch (err) {\n endTrace(state, rootSpan, startMono, err);\n throw err;\n }\n } else {\n const reset = setActiveTraceState(state);\n try {\n const result = await runFn();\n endTrace(state, rootSpan, startMono, undefined);\n return result;\n } catch (err) {\n endTrace(state, rootSpan, startMono, err);\n throw err;\n } finally {\n reset();\n }\n }\n}\n\n/**\n * Attach cost-attribution dimensions to the active trace (MHQ-751).\n *\n * Call once per request (e.g. in Express/Next.js middleware) to propagate\n * `customer_id`, `feature`, `env`, `team`, etc. to all child spans\n * automatically. Mirrors Python's `morse_ai.set_context(**dims)`.\n *\n * morse.setContext({ customerId: request.customerId, feature: \"doc-qa\" });\n *\n * Values are coerced to strings via `String(v)` — mirrors Python's `str()`\n * coercion. Merges into any dimensions already set (e.g. via\n * `run({ userMetadata })`) rather than replacing them. No-op outside an\n * active trace — never throws.\n */\nexport function setContext(dims: Record<string, unknown>): void {\n const state = getActiveTraceState();\n if (state === null) return;\n if (state.userMetadata === undefined) state.userMetadata = {};\n for (const [k, v] of Object.entries(dims)) {\n state.userMetadata[k] = String(v);\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* span() child-span helpers */\n/* ------------------------------------------------------------------------ */\n\nexport interface SpanOptions {\n name: string;\n type?: SpanType;\n metadata?: Record<string, unknown>;\n}\n\nexport interface SpanHandle {\n /** Mutate the underlying span data (e.g., set tokens / cost). */\n span: SpanData;\n end(error?: unknown): void;\n}\n\n// MHQ-806. Latches the \"no active trace\" warning to once per process — see\n// startSpan for why it warns at all, and why not on every call.\nlet spanOutsideTraceWarningEmitted = false;\n\n/** Test hook — clears the once-per-process latch. */\nexport function _resetSpanOutsideTraceWarning(): void {\n spanOutsideTraceWarningEmitted = false;\n}\n\n/** Start a child span under the active trace, returning a handle to close it. */\nexport function startSpan(opts: SpanOptions): SpanHandle | null {\n const state = getActiveTraceState();\n if (state === null) {\n // No active trace — returns null rather than throwing, because library\n // code may be instrumented but reached from an untraced path.\n //\n // The null is visible in the type here, unlike Python's context-manager\n // form, but callers routinely ignore it (`span({...}, () => { ... })`\n // never touches the handle), so the outcome is the same: no error, no\n // spans, nothing distinguishing it from working instrumentation.\n //\n // Warned once per process, matching the existing not-initialized warning\n // in index.ts — this sits inside request and agent loops, so per-call\n // logging would bury the signal. This is the single choke point for\n // startSpan / spanSync / spanAsync.\n if (!spanOutsideTraceWarningEmitted) {\n spanOutsideTraceWarningEmitted = true;\n console.warn(\n `morse: span(${JSON.stringify(opts.name)}) was called with no active trace, so nothing ` +\n `was recorded. Wrap the work in morse.run('<agent-name>', () => { ... }) — run() opens ` +\n `the trace that span() attaches to. This warning prints once per process.`,\n );\n }\n return null;\n }\n const parent = state.spanStack[state.spanStack.length - 1];\n const span: SpanData = {\n trace_id: state.traceId,\n span_id: generateSpanId(),\n type: opts.type ?? \"custom\",\n name: opts.name,\n parent_span_id: parent?.span_id,\n started_at: nowIso(),\n status: \"completed\",\n metadata: opts.metadata,\n };\n const startMono = nowMonotonic();\n state.spanStack.push(span);\n return {\n span,\n end(error?: unknown): void {\n // Pop only if still on top — defensive against out-of-order ends.\n if (state.spanStack[state.spanStack.length - 1] === span) {\n state.spanStack.pop();\n }\n if (error !== undefined) {\n finalizeSpan(span, startMono, \"failed\", errToString(error));\n } else {\n finalizeSpan(span, startMono);\n }\n state.completedSpans.push(span);\n },\n };\n}\n\n/** Sync callback wrapper for `startSpan` / `end`. No-op if no active trace. */\nexport function spanSync<T>(opts: SpanOptions, fn: (handle: SpanHandle | null) => T): T {\n const handle = startSpan(opts);\n try {\n const result = handle\n ? withDbCaptureContext(handle.span.trace_id, handle.span.span_id, () => fn(handle))\n : fn(handle);\n handle?.end();\n return result;\n } catch (err) {\n handle?.end(err);\n throw err;\n }\n}\n\n/** Async callback wrapper for `startSpan` / `end`. No-op if no active trace. */\nexport async function spanAsync<T>(\n opts: SpanOptions,\n fn: (handle: SpanHandle | null) => Promise<T>,\n): Promise<T> {\n const handle = startSpan(opts);\n try {\n const result = handle\n ? await withDbCaptureContext(handle.span.trace_id, handle.span.span_id, () => fn(handle))\n : await fn(handle);\n handle?.end();\n return result;\n } catch (err) {\n handle?.end(err);\n throw err;\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* Test helpers */\n/* ------------------------------------------------------------------------ */\n\nexport function _resetForTesting(): void {\n browserState = null;\n lastTrace = null;\n redactionConfig = buildRedactionConfig();\n // We do not reset `als` because re-loading it is expensive and the\n // store is process-scoped anyway.\n}\n","/**\n * W3C Trace Context propagation — inject and extract `traceparent` headers.\n *\n * W3C traceparent format: `{version}-{trace_id}-{span_id}-{flags}`\n * - version : \"00\" (fixed)\n * - trace_id : 32 lowercase hex chars (128-bit)\n * - span_id : 16 lowercase hex chars (64-bit)\n * - flags : \"01\" (sampled, always set for Morse)\n *\n * Example: `00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01`\n *\n * References:\n * https://www.w3.org/TR/trace-context/\n */\n\nimport { getActiveTraceState } from \"./_internal/tracing\";\n\nexport const W3C_TRACEPARENT_HEADER = \"traceparent\";\nexport const W3C_VERSION = \"00\";\nexport const W3C_FLAGS_SAMPLED = \"01\";\n\nconst TRACE_ID_LEN = 32;\nconst SPAN_ID_LEN = 16;\n\n/**\n * Build a W3C traceparent value from explicit IDs.\n *\n * Useful when you have a trace_id / span_id from somewhere other than\n * the active context (e.g., re-emitting an upstream trace's IDs).\n */\nexport function formatTraceparent(traceId: string, spanId: string): string {\n // We trust the caller; the \"build then validate\" assumption is documented.\n const tid = traceId.slice(0, TRACE_ID_LEN).padStart(TRACE_ID_LEN, \"0\").toLowerCase();\n const sid = spanId.slice(0, SPAN_ID_LEN).padStart(SPAN_ID_LEN, \"0\").toLowerCase();\n return `${W3C_VERSION}-${tid}-${sid}-${W3C_FLAGS_SAMPLED}`;\n}\n\n/**\n * Inject the W3C `traceparent` header derived from the active trace\n * context into the supplied headers object. Mutates and returns the\n * object for convenience.\n *\n * No-op (returns headers unchanged) if no trace is active.\n *\n * Accepts both `Headers` (from fetch) and a plain dict.\n */\nexport function injectTraceparent<T extends HeadersLike>(headers: T): T {\n const state = getActiveTraceState();\n if (state === null) return headers;\n\n const traceId = state.traceId;\n const span =\n state.spanStack.length > 0\n ? state.spanStack[state.spanStack.length - 1]\n : state.completedSpans[state.completedSpans.length - 1];\n const rawSpanId = span?.span_id ?? traceId;\n const spanId = rawSpanId.slice(0, SPAN_ID_LEN);\n\n const value = formatTraceparent(traceId, spanId);\n setHeader(headers, W3C_TRACEPARENT_HEADER, value);\n return headers;\n}\n\nexport interface ExtractedContext {\n traceId: string;\n parentSpanId: string;\n}\n\n/**\n * Parse a W3C traceparent header and return `{ traceId, parentSpanId }`,\n * or `null` if the header is missing or malformed.\n *\n * Validation per W3C §3.2.3:\n * - exactly 4 dash-separated fields\n * - version === \"00\"\n * - trace_id is 32 lowercase hex chars (and not all-zero)\n * - span_id is 16 lowercase hex chars (and not all-zero)\n */\nexport function extractTraceparent(\n headers: HeadersLike | string | null | undefined,\n): ExtractedContext | null {\n if (headers === null || headers === undefined) return null;\n const raw = typeof headers === \"string\" ? headers : getHeader(headers, W3C_TRACEPARENT_HEADER);\n if (!raw) return null;\n const parts = raw.split(\"-\");\n if (parts.length !== 4) return null;\n const [version, traceId, spanId] = parts as [string, string, string, string];\n if (version !== W3C_VERSION) return null;\n if (traceId.length !== TRACE_ID_LEN) return null;\n if (spanId.length !== SPAN_ID_LEN) return null;\n if (!/^[0-9a-f]+$/.test(traceId)) return null;\n if (!/^[0-9a-f]+$/.test(spanId)) return null;\n if (/^0+$/.test(traceId)) return null;\n if (/^0+$/.test(spanId)) return null;\n return { traceId, parentSpanId: spanId };\n}\n\n/**\n * Convenience for Next.js API routes / generic HTTP servers: pull the\n * traceparent off an incoming Request (or a header bag).\n */\nexport function extractFromRequest(req: { headers: HeadersLike }): ExtractedContext | null {\n return extractTraceparent(req.headers);\n}\n\n/**\n * Convenience for outbound `fetch`: build a fresh `Headers` object with\n * the traceparent injected, layered on top of the caller's input.\n */\nexport function injectIntoRequestInit(init?: RequestInit): RequestInit {\n const merged = new Headers(init?.headers ?? {});\n injectTraceparent(merged);\n return { ...(init ?? {}), headers: merged };\n}\n\n/* ------------------------------------------------------------------------ */\n/* Header polymorphism helpers */\n/* ------------------------------------------------------------------------ */\n\nexport type HeadersLike =\n | Headers\n | Record<string, string | string[] | undefined>\n | { get(name: string): string | null }\n | { [key: string]: unknown };\n\nfunction getHeader(headers: HeadersLike, name: string): string | null {\n if (headers instanceof Headers) {\n return headers.get(name);\n }\n // Object that exposes get() — e.g., Node's IncomingMessage doesn't, but\n // Next.js's headers() does.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const maybeGet = (headers as any).get;\n if (typeof maybeGet === \"function\") {\n const v = maybeGet.call(headers, name);\n if (typeof v === \"string\") return v;\n if (v === null || v === undefined) return null;\n }\n // Plain dict: case-insensitive lookup.\n const lower = name.toLowerCase();\n for (const [k, v] of Object.entries(headers as Record<string, unknown>)) {\n if (k.toLowerCase() === lower) {\n if (typeof v === \"string\") return v;\n if (Array.isArray(v) && v.length > 0 && typeof v[0] === \"string\") return v[0] as string;\n return null;\n }\n }\n return null;\n}\n\nfunction setHeader(headers: HeadersLike, name: string, value: string): void {\n if (headers instanceof Headers) {\n headers.set(name, value);\n return;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const maybeSet = (headers as any).set;\n if (typeof maybeSet === \"function\") {\n maybeSet.call(headers, name, value);\n return;\n }\n (headers as Record<string, string>)[name] = value;\n}\n"]}