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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/README.md +11 -10
  2. package/dist/anthropic/index.cjs +11 -11
  3. package/dist/anthropic/index.d.cts +1 -1
  4. package/dist/anthropic/index.d.ts +1 -1
  5. package/dist/anthropic/index.js +4 -4
  6. package/dist/anthropic-agent-sdk/index.cjs +44 -40
  7. package/dist/anthropic-agent-sdk/index.cjs.map +1 -1
  8. package/dist/anthropic-agent-sdk/index.d.cts +1 -1
  9. package/dist/anthropic-agent-sdk/index.d.ts +1 -1
  10. package/dist/anthropic-agent-sdk/index.js +10 -6
  11. package/dist/anthropic-agent-sdk/index.js.map +1 -1
  12. package/dist/browser/anthropic/index.cjs +11 -11
  13. package/dist/browser/anthropic/index.js +4 -4
  14. package/dist/browser/anthropic-agent-sdk/index.cjs +44 -40
  15. package/dist/browser/anthropic-agent-sdk/index.cjs.map +1 -1
  16. package/dist/browser/anthropic-agent-sdk/index.js +10 -6
  17. package/dist/browser/anthropic-agent-sdk/index.js.map +1 -1
  18. package/dist/browser/{chunk-ELQ4LGAS.cjs → chunk-33WDUUKZ.cjs} +18 -18
  19. package/dist/browser/{chunk-ELQ4LGAS.cjs.map → chunk-33WDUUKZ.cjs.map} +1 -1
  20. package/dist/browser/{chunk-TV7TRP5O.cjs → chunk-3I7IGP3P.cjs} +5 -5
  21. package/dist/browser/chunk-3I7IGP3P.cjs.map +1 -0
  22. package/dist/browser/{chunk-YYUDZTHI.js → chunk-3OYHDDOJ.js} +27 -5
  23. package/dist/browser/chunk-3OYHDDOJ.js.map +1 -0
  24. package/dist/browser/{chunk-6BNMYEMW.cjs → chunk-4IUHXUCJ.cjs} +49 -9
  25. package/dist/browser/chunk-4IUHXUCJ.cjs.map +1 -0
  26. package/dist/browser/{chunk-BUCIE3DR.js → chunk-5TYTCLKA.js} +4 -4
  27. package/dist/browser/{chunk-BUCIE3DR.js.map → chunk-5TYTCLKA.js.map} +1 -1
  28. package/dist/browser/{chunk-VIOT3AOP.js → chunk-6JHMFFPE.js} +3 -3
  29. package/dist/browser/chunk-6JHMFFPE.js.map +1 -0
  30. package/dist/browser/{chunk-BIP66M44.cjs → chunk-FKYI3N5N.cjs} +7 -7
  31. package/dist/browser/{chunk-BIP66M44.cjs.map → chunk-FKYI3N5N.cjs.map} +1 -1
  32. package/dist/browser/{chunk-NU74H55W.js → chunk-FPTUHYDJ.js} +3 -3
  33. package/dist/browser/{chunk-NU74H55W.js.map → chunk-FPTUHYDJ.js.map} +1 -1
  34. package/dist/browser/{chunk-52JTU4LH.cjs → chunk-IDKQZ4X5.cjs} +38 -15
  35. package/dist/browser/chunk-IDKQZ4X5.cjs.map +1 -0
  36. package/dist/browser/{chunk-2X64OY2L.cjs → chunk-LIP3XCTK.cjs} +12 -12
  37. package/dist/browser/{chunk-2X64OY2L.cjs.map → chunk-LIP3XCTK.cjs.map} +1 -1
  38. package/dist/browser/{chunk-T6Z6UIBN.js → chunk-OUQAH27A.js} +3 -3
  39. package/dist/browser/{chunk-T6Z6UIBN.js.map → chunk-OUQAH27A.js.map} +1 -1
  40. package/dist/browser/{chunk-4CMVMTFB.cjs → chunk-PSNZZBQJ.cjs} +6 -6
  41. package/dist/browser/{chunk-4CMVMTFB.cjs.map → chunk-PSNZZBQJ.cjs.map} +1 -1
  42. package/dist/browser/{chunk-6T6ZPOKZ.js → chunk-PXHTLCEU.js} +49 -10
  43. package/dist/browser/chunk-PXHTLCEU.js.map +1 -0
  44. package/dist/browser/{chunk-KZFG23MO.js → chunk-TRVACYUN.js} +5 -5
  45. package/dist/browser/{chunk-KZFG23MO.js.map → chunk-TRVACYUN.js.map} +1 -1
  46. package/dist/browser/index.cjs +189 -124
  47. package/dist/browser/index.cjs.map +1 -1
  48. package/dist/browser/index.js +111 -46
  49. package/dist/browser/index.js.map +1 -1
  50. package/dist/browser/integrations/pino.cjs +4 -4
  51. package/dist/browser/integrations/pino.js +3 -3
  52. package/dist/browser/langchain/index.cjs +28 -26
  53. package/dist/browser/langchain/index.cjs.map +1 -1
  54. package/dist/browser/langchain/index.js +13 -11
  55. package/dist/browser/langchain/index.js.map +1 -1
  56. package/dist/browser/langgraph/index.cjs +32 -30
  57. package/dist/browser/langgraph/index.cjs.map +1 -1
  58. package/dist/browser/langgraph/index.js +10 -8
  59. package/dist/browser/langgraph/index.js.map +1 -1
  60. package/dist/browser/openai/index.cjs +11 -11
  61. package/dist/browser/openai/index.js +2 -2
  62. package/dist/browser/openai-agents/index.cjs +63 -35
  63. package/dist/browser/openai-agents/index.cjs.map +1 -1
  64. package/dist/browser/openai-agents/index.js +33 -5
  65. package/dist/browser/openai-agents/index.js.map +1 -1
  66. package/dist/browser/vercel-ai/index.cjs +14 -14
  67. package/dist/browser/vercel-ai/index.js +3 -3
  68. package/dist/{chunk-KMBKZLXH.cjs → chunk-7DALGJL2.cjs} +100 -25
  69. package/dist/chunk-7DALGJL2.cjs.map +1 -0
  70. package/dist/{chunk-D5NTF54A.cjs → chunk-B7TGG62X.cjs} +12 -12
  71. package/dist/{chunk-D5NTF54A.cjs.map → chunk-B7TGG62X.cjs.map} +1 -1
  72. package/dist/{chunk-LPLL2OXI.cjs → chunk-COZFARLL.cjs} +5 -5
  73. package/dist/chunk-COZFARLL.cjs.map +1 -0
  74. package/dist/{chunk-GTPKPUAV.cjs → chunk-DXTNU2KT.cjs} +38 -15
  75. package/dist/chunk-DXTNU2KT.cjs.map +1 -0
  76. package/dist/{chunk-6FLGLD72.js → chunk-ERH3TNXZ.js} +3 -3
  77. package/dist/{chunk-6FLGLD72.js.map → chunk-ERH3TNXZ.js.map} +1 -1
  78. package/dist/{chunk-7HYFOHM3.cjs → chunk-ESJJXXB6.cjs} +6 -6
  79. package/dist/{chunk-7HYFOHM3.cjs.map → chunk-ESJJXXB6.cjs.map} +1 -1
  80. package/dist/{chunk-SUEBUMHL.cjs → chunk-ETRNCI5Z.cjs} +18 -18
  81. package/dist/{chunk-SUEBUMHL.cjs.map → chunk-ETRNCI5Z.cjs.map} +1 -1
  82. package/dist/{chunk-KWOSUW7B.js → chunk-GULJAURY.js} +27 -5
  83. package/dist/chunk-GULJAURY.js.map +1 -0
  84. package/dist/{chunk-ZIMGB7IT.js → chunk-HJV35HWL.js} +100 -26
  85. package/dist/chunk-HJV35HWL.js.map +1 -0
  86. package/dist/{chunk-3ONFIKKC.js → chunk-L7AD4KUD.js} +3 -3
  87. package/dist/chunk-L7AD4KUD.js.map +1 -0
  88. package/dist/{chunk-SFI36VWW.js → chunk-QBDTQTMN.js} +3 -3
  89. package/dist/{chunk-SFI36VWW.js.map → chunk-QBDTQTMN.js.map} +1 -1
  90. package/dist/{chunk-NMARCV3R.cjs → chunk-WG4H5JC6.cjs} +7 -7
  91. package/dist/{chunk-NMARCV3R.cjs.map → chunk-WG4H5JC6.cjs.map} +1 -1
  92. package/dist/{chunk-J5FEPM7L.js → chunk-XS4P7XPV.js} +5 -5
  93. package/dist/{chunk-J5FEPM7L.js.map → chunk-XS4P7XPV.js.map} +1 -1
  94. package/dist/{chunk-ZZSVPAXM.js → chunk-YVLEDBN7.js} +4 -4
  95. package/dist/{chunk-ZZSVPAXM.js.map → chunk-YVLEDBN7.js.map} +1 -1
  96. package/dist/index.cjs +199 -134
  97. package/dist/index.cjs.map +1 -1
  98. package/dist/index.d.cts +13 -2
  99. package/dist/index.d.ts +13 -2
  100. package/dist/index.js +112 -47
  101. package/dist/index.js.map +1 -1
  102. package/dist/integrations/pino.cjs +4 -4
  103. package/dist/integrations/pino.js +3 -3
  104. package/dist/langchain/index.cjs +28 -26
  105. package/dist/langchain/index.cjs.map +1 -1
  106. package/dist/langchain/index.d.cts +3 -3
  107. package/dist/langchain/index.d.ts +3 -3
  108. package/dist/langchain/index.js +13 -11
  109. package/dist/langchain/index.js.map +1 -1
  110. package/dist/langgraph/index.cjs +32 -30
  111. package/dist/langgraph/index.cjs.map +1 -1
  112. package/dist/langgraph/index.d.cts +3 -3
  113. package/dist/langgraph/index.d.ts +3 -3
  114. package/dist/langgraph/index.js +10 -8
  115. package/dist/langgraph/index.js.map +1 -1
  116. package/dist/openai/index.cjs +11 -11
  117. package/dist/openai/index.js +2 -2
  118. package/dist/openai-agents/index.cjs +63 -35
  119. package/dist/openai-agents/index.cjs.map +1 -1
  120. package/dist/openai-agents/index.d.cts +13 -4
  121. package/dist/openai-agents/index.d.ts +13 -4
  122. package/dist/openai-agents/index.js +33 -5
  123. package/dist/openai-agents/index.js.map +1 -1
  124. package/dist/{spans-DZtMuBvc.d.cts → spans-CBMWNg2C.d.cts} +1 -0
  125. package/dist/{spans-DZtMuBvc.d.ts → spans-CBMWNg2C.d.ts} +1 -0
  126. package/dist/{tracing-J8ZgxVzU.d.ts → tracing-BMWTyexr.d.ts} +1 -1
  127. package/dist/{tracing-CNlre8TK.d.cts → tracing-Bh-cbvr6.d.cts} +1 -1
  128. package/dist/vercel-ai/index.cjs +14 -14
  129. package/dist/vercel-ai/index.js +3 -3
  130. package/package.json +1 -1
  131. package/dist/browser/chunk-52JTU4LH.cjs.map +0 -1
  132. package/dist/browser/chunk-6BNMYEMW.cjs.map +0 -1
  133. package/dist/browser/chunk-6T6ZPOKZ.js.map +0 -1
  134. package/dist/browser/chunk-TV7TRP5O.cjs.map +0 -1
  135. package/dist/browser/chunk-VIOT3AOP.js.map +0 -1
  136. package/dist/browser/chunk-YYUDZTHI.js.map +0 -1
  137. package/dist/chunk-3ONFIKKC.js.map +0 -1
  138. package/dist/chunk-GTPKPUAV.cjs.map +0 -1
  139. package/dist/chunk-KMBKZLXH.cjs.map +0 -1
  140. package/dist/chunk-KWOSUW7B.js.map +0 -1
  141. package/dist/chunk-LPLL2OXI.cjs.map +0 -1
  142. package/dist/chunk-ZIMGB7IT.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/langchain/callback-handler.ts"],"names":["init_tracing","tokenUsage","model","startSpan","absorbErrorsSync","decomposeOpenAiMessages"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * `@morsehq-dev/sdk/langchain` — `MorseCallbackHandler` for plain LangChain\n * (chains, LLMs, tools, retrievers). Port of\n * `apps/sdk/python/src/morse_ai/adapters/langchain.py` (MHQ-482).\n *\n * Usage:\n *\n * ```ts\n * import { MorseCallbackHandler } from \"@morsehq-dev/sdk/langchain\";\n * import { runAsync } from \"@morsehq-dev/sdk\"; // or morse.run()\n *\n * const handler = new MorseCallbackHandler({ agentName: \"my-agent\" });\n * await runAsync({ agentName: \"my-agent\" }, async () => {\n * await chain.invoke(input, { callbacks: [handler] });\n * });\n * ```\n *\n * Span mapping (mirrors the Python adapter):\n * - handleChainStart / handleChainEnd / handleChainError → `type=agent`\n * - handleLLMStart / handleChatModelStart / handleLLMEnd / handleLLMError → `type=llm`\n * - handleToolStart / handleToolEnd / handleToolError → `type=tool`\n * - handleRetrieverStart / handleRetrieverEnd / handleRetrieverError (@beta)\n * → `type=retriever`\n *\n * ## Deviations from the Python adapter (see PR report for full rationale)\n *\n * 1. **No auto-trace creation.** Python's `MorseCallbackHandler` calls\n * `morse_ai.tracing.run(...)` itself when no trace is active (contextvars\n * support manually entering/exiting a context across independent callback\n * invocations). The TS SDK's trace context is `AsyncLocalStorage`-based\n * (`_internal/tracing.ts`), which only supports the `als.run(store, fn)`\n * callback shape — there is no way to open a trace and leave it open\n * across separate, unwrapped callback calls. Callers MUST wrap the\n * LangChain invocation in `morse.run()` / `runAsync()`. This mirrors the\n * constraint the existing `../langgraph/` adapter already operates under\n * (see its file-header comments) — every span helper silently no-ops\n * (returns `null`) when there is no active trace, exactly like this file.\n * 2. **No structural subclass relationship with `../langgraph/`.** The task\n * brief notes that Python's `langgraph.py::LangGraphCallbackHandler`\n * subclasses `langchain.py::MorseCallbackHandler`. `@langchain/core`'s\n * `BaseCallbackHandler` surface is identical for plain chains and for\n * LangGraph graphs (LangGraph JS is built on `@langchain/core`\n * callbacks), so structurally the two TS adapters COULD share a base.\n * But the existing `../langgraph/` files are off-limits for this task\n * (a separate, already-shipped gap) and refactoring them to extract a\n * shared base is out of scope / higher risk than the value it buys right\n * now. This adapter is therefore a structural sibling, not a subclass —\n * same conventions (span-emission via `startSpan`, `absorbErrorsSync`\n * everywhere, `metadata.adapter` tagging), independently implemented.\n * 3. **No cost computation.** Python's `on_llm_end` calls\n * `morse_ai.pricing.calculate_cost` and `merge_provider_reported_cost`.\n * Neither has a TS port yet (owned by a separate parallel MHQ-482 gap).\n * Token counts/model are still captured; `cost_usd` is left unset until\n * the pricing gap lands.\n * 4. **`type=retriever` uses a real, added `SpanType` variant** (see\n * `_internal/spans.ts`) rather than the `type=tool` +\n * `metadata.tool_kind` fallback pattern used for `hook`/`subagent` — the\n * backend already accepts `\"retriever\"` (Python's `SpanType.RETRIEVER`\n * has shipped since the Python adapter), so no fallback is needed.\n *\n * All public methods absorb internal errors (never throw into the LangChain\n * runtime) — mirrors Python's `try/except Exception: logger.debug(...)`\n * wrapping on every callback.\n */\n\nimport { absorbErrorsSync } from \"../_internal/errors\";\nimport type { SpanHandle } from \"../_internal/tracing\";\nimport { startSpan } from \"../_internal/tracing\";\nimport { decomposeOpenAiMessages } from \"../_agent-sdk-common/context-decomposer\";\nimport type {\n BaseMessageLike,\n CallbackHandlerSurface,\n DocumentLike,\n LangChainCoreCallbacksModuleLike,\n LLMResultLike,\n SerializedLike,\n} from \"./types\";\n\n/* ------------------------------------------------------------------------ */\n/* Constants */\n/* ------------------------------------------------------------------------ */\n\nconst ADAPTER = \"langchain-js\" as const;\nconst HANDLER_NAME = \"morse_callback_handler\";\nconst DEFAULT_AGENT_NAME = \"langchain-agent\";\n\n// AGE-260 port: cap on the JSON-serialized size of any single input_data /\n// output_data payload. Mirrors the Python adapter's `_MAX_STATE_PAYLOAD_BYTES`.\nconst MAX_STATE_PAYLOAD_BYTES = 64 * 1024; // 64 KB JSON\n\n/* ------------------------------------------------------------------------ */\n/* Public options */\n/* ------------------------------------------------------------------------ */\n\nexport interface MorseCallbackHandlerOptions {\n /** Falls back to `\"langchain-agent\"` when unset. Only used for documentation\n * purposes on this handler instance — the actual trace's agent name is set\n * by whatever `morse.run()` / `runAsync()` call wraps the invocation. */\n agentName?: string;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Name resolution helpers */\n/* ------------------------------------------------------------------------ */\n\n/** chain/llm: prefer `id` path tail, then `name`, then `fallback`. */\nfunction resolveNameIdFirst(\n serialized: SerializedLike | null | undefined,\n fallback: string,\n): string {\n const s = serialized ?? {};\n const idPath = s.id;\n if (Array.isArray(idPath) && idPath.length > 0) {\n const last = idPath[idPath.length - 1];\n if (typeof last === \"string\" && last.length > 0) return last;\n }\n if (typeof s.name === \"string\" && s.name.length > 0) return s.name;\n return fallback;\n}\n\n/** tool: prefer `name`, then `id` path tail, then `fallback`. */\nfunction resolveNameNameFirst(\n serialized: SerializedLike | null | undefined,\n fallback: string,\n): string {\n const s = serialized ?? {};\n if (typeof s.name === \"string\" && s.name.length > 0) return s.name;\n const idPath = s.id;\n if (Array.isArray(idPath) && idPath.length > 0) {\n const last = idPath[idPath.length - 1];\n if (typeof last === \"string\" && last.length > 0) return last;\n }\n return fallback;\n}\n\n/* ------------------------------------------------------------------------ */\n/* State coercion — port of Python's `_ensure_dict` */\n/* ------------------------------------------------------------------------ */\n\nfunction utf8ByteLength(s: string): number {\n if (typeof TextEncoder !== \"undefined\") return new TextEncoder().encode(s).length;\n // Rough fallback — good enough for a soft cap, never load-bearing for\n // correctness (only used to decide whether to truncate).\n return s.length;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return false;\n const proto: unknown = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Coerce arbitrary LangChain chain/tool/retriever input or output into a\n * dict payload the wire schema requires (`SpanData.input_data` /\n * `output_data`). Port of Python's `MorseCallbackHandler._ensure_dict`:\n *\n * - `null` / `undefined` → `undefined` (legitimately absent)\n * - plain object → unchanged\n * - object with a callable `toJSON()` returning a plain object → that result\n * (JS analogue of Python's Pydantic `model_dump()` / `dict()` duck typing)\n * - other (string / number / array / class instance) → `{ value: String(x) }`\n *\n * Oversized payloads (JSON > `MAX_STATE_PAYLOAD_BYTES`) are replaced with a\n * truncation marker so the transport queue stays bounded but the dashboard\n * still shows a usable preview — never silently dropped to `undefined`.\n */\nexport function coerceStateValue(data: unknown): Record<string, unknown> | undefined {\n if (data === null || data === undefined) return undefined;\n\n let coerced: Record<string, unknown>;\n if (isPlainObject(data)) {\n coerced = data;\n } else {\n const toJSON = (data as { toJSON?: unknown }).toJSON;\n let viaToJSON: Record<string, unknown> | null = null;\n if (typeof toJSON === \"function\") {\n try {\n const result: unknown = (toJSON as () => unknown).call(data);\n if (isPlainObject(result)) viaToJSON = result;\n } catch {\n viaToJSON = null;\n }\n }\n if (viaToJSON !== null) {\n coerced = viaToJSON;\n } else if (Array.isArray(data)) {\n coerced = { value: safeStringify(data) };\n } else {\n coerced = { value: String(data) };\n }\n }\n\n let encoded: string;\n try {\n encoded = JSON.stringify(coerced) ?? \"null\";\n } catch {\n return {\n _truncated: true,\n _reason: \"unserializable\",\n value: String(coerced).slice(0, 1024),\n };\n }\n\n const byteLen = utf8ByteLength(encoded);\n if (byteLen > MAX_STATE_PAYLOAD_BYTES) {\n const preview = encoded.slice(0, Math.floor(MAX_STATE_PAYLOAD_BYTES / 2));\n return {\n _truncated: true,\n _reason: \"payload_too_large\",\n _original_size_bytes: byteLen,\n _max_bytes: MAX_STATE_PAYLOAD_BYTES,\n preview,\n };\n }\n\n return coerced;\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* LLM response extraction — port of `_extract_token_usage` / `_extract_model` */\n/* ------------------------------------------------------------------------ */\n\nexport interface TokenUsage {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n cachedInputTokens?: number;\n}\n\nfunction numOrUndef(v: unknown): number | undefined {\n return typeof v === \"number\" && Number.isFinite(v) ? v : undefined;\n}\n\nfunction firstGenerationMessage(\n response: LLMResultLike | null | undefined,\n): BaseMessageLike | undefined {\n const gens = response?.generations;\n if (Array.isArray(gens) && gens.length > 0 && Array.isArray(gens[0]) && gens[0]!.length > 0) {\n return gens[0]![0]!.message;\n }\n return undefined;\n}\n\n/**\n * Returns token usage across the provider shapes LangChain JS integrations\n * use in practice. Field names below are snake_case because — unlike most\n * of the JS ecosystem — `@langchain/core`'s `usage_metadata` /\n * `response_metadata` fields ARE snake_case (verified against\n * `@langchain/core/dist/messages/ai.d.ts`), matching the Python SDK 1:1.\n * `llmOutput` is a free-form provider bag; we also check the camelCase\n * `tokenUsage` key the existing `../langgraph/` adapter established.\n */\nexport function extractTokenUsage(response: LLMResultLike | null | undefined): TokenUsage {\n try {\n const msg = firstGenerationMessage(response);\n if (msg) {\n const um = msg.usage_metadata;\n if (um && (um.input_tokens !== undefined || um.output_tokens !== undefined)) {\n const details = um.input_token_details ?? {};\n const cached = details.cache_read ?? details.cache_creation;\n return {\n inputTokens: numOrUndef(um.input_tokens),\n outputTokens: numOrUndef(um.output_tokens),\n totalTokens: numOrUndef(um.total_tokens),\n cachedInputTokens: numOrUndef(cached),\n };\n }\n const tokenUsage = msg.response_metadata?.token_usage;\n if (tokenUsage) {\n return {\n inputTokens: numOrUndef(tokenUsage.prompt_tokens ?? tokenUsage.input_tokens),\n outputTokens: numOrUndef(tokenUsage.completion_tokens ?? tokenUsage.output_tokens),\n totalTokens: numOrUndef(tokenUsage.total_tokens),\n };\n }\n }\n } catch {\n // fall through to llmOutput-based extraction\n }\n\n const llmOutput = response?.llmOutput ?? {};\n const tokenUsage = (llmOutput.tokenUsage ?? llmOutput.token_usage) as\n | Record<string, unknown>\n | undefined;\n if (tokenUsage && Object.keys(tokenUsage).length > 0) {\n return {\n inputTokens: numOrUndef(\n tokenUsage.promptTokens ??\n tokenUsage.prompt_tokens ??\n tokenUsage.inputTokens ??\n tokenUsage.input_tokens,\n ),\n outputTokens: numOrUndef(\n tokenUsage.completionTokens ??\n tokenUsage.completion_tokens ??\n tokenUsage.outputTokens ??\n tokenUsage.output_tokens,\n ),\n totalTokens: numOrUndef(tokenUsage.totalTokens ?? tokenUsage.total_tokens),\n };\n }\n\n const usage = llmOutput.usage as Record<string, unknown> | undefined;\n if (usage && Object.keys(usage).length > 0) {\n return {\n inputTokens: numOrUndef(usage.input_tokens),\n outputTokens: numOrUndef(usage.output_tokens),\n totalTokens: numOrUndef(usage.total_tokens),\n cachedInputTokens: numOrUndef(usage.cache_read_input_tokens),\n };\n }\n\n return {};\n}\n\n/** Best-effort model-name extraction from an `LLMResult`. */\nexport function extractModel(response: LLMResultLike | null | undefined): string | undefined {\n try {\n const msg = firstGenerationMessage(response);\n const meta = msg?.response_metadata;\n const model = meta?.model_name ?? meta?.model;\n if (typeof model === \"string\" && model.length > 0) return model;\n } catch {\n // fall through\n }\n const llmOutput = response?.llmOutput ?? {};\n const model = llmOutput.model_name ?? llmOutput.model;\n return typeof model === \"string\" && model.length > 0 ? model : undefined;\n}\n\n/** Best-effort output-text extraction from an `LLMResult`, for `output_data.text`. */\nexport function extractOutputText(response: LLMResultLike | null | undefined): string {\n try {\n const gens = response?.generations;\n if (Array.isArray(gens) && gens.length > 0 && Array.isArray(gens[0]) && gens[0]!.length > 0) {\n const first = gens[0]![0]!;\n if (typeof first.text === \"string\" && first.text.length > 0) return first.text;\n const content = first.message?.content;\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n const parts: string[] = [];\n for (const block of content) {\n if (typeof block === \"string\") {\n parts.push(block);\n } else if (\n block &&\n typeof block === \"object\" &&\n typeof (block as Record<string, unknown>).text === \"string\"\n ) {\n parts.push((block as Record<string, unknown>).text as string);\n }\n }\n return parts.join(\"\\n\");\n }\n }\n } catch {\n // fall through\n }\n return \"\";\n}\n\n/* ------------------------------------------------------------------------ */\n/* MorseCallbackHandler */\n/* ------------------------------------------------------------------------ */\n\nexport class MorseCallbackHandler implements CallbackHandlerSurface {\n /** Required by LangChain's `BaseCallbackHandler` interface. */\n public readonly name: string = HANDLER_NAME;\n\n public readonly agentName: string;\n\n /** Map of `runId` → open `SpanHandle`, spanning chain/llm/tool/retriever\n * spans together (mirrors Python's single `_span_stack` dict). */\n private readonly spanStack: Map<string, SpanHandle> = new Map();\n\n constructor(options?: MorseCallbackHandlerOptions) {\n this.agentName =\n options?.agentName && options.agentName.length > 0 ? options.agentName : DEFAULT_AGENT_NAME;\n }\n\n /* ---------------------------------------------------------------------- */\n /* Internal helpers */\n /* ---------------------------------------------------------------------- */\n\n private openSpan(\n runId: string,\n name: string,\n type: \"agent\" | \"llm\" | \"tool\" | \"retriever\",\n inputData?: unknown,\n extraMetadata?: Record<string, unknown>,\n ): SpanHandle | null {\n if (typeof runId !== \"string\" || runId.length === 0) return null;\n const metadata: Record<string, unknown> = { ...(extraMetadata ?? {}), adapter: ADAPTER };\n const handle = startSpan({ name, type, metadata });\n if (handle === null) return null;\n const wrapped = coerceStateValue(inputData);\n if (wrapped !== undefined) handle.span.input_data = wrapped;\n this.spanStack.set(runId, handle);\n return handle;\n }\n\n private closeSpan(runId: string, outputData?: unknown, error?: unknown): void {\n const handle = this.spanStack.get(runId);\n if (handle === undefined) return;\n this.spanStack.delete(runId);\n if (outputData !== undefined) {\n const wrapped = coerceStateValue(outputData);\n if (wrapped !== undefined) handle.span.output_data = wrapped;\n }\n if (error !== undefined) {\n handle.end(error);\n } else {\n handle.end();\n }\n }\n\n /* ---------------------------------------------------------------------- */\n /* Chain callbacks */\n /* ---------------------------------------------------------------------- */\n\n // NOTE: trailing `parentRunId`/`tags`/`metadata`/`runType`/`runName`\n // parameters from `CallbackHandlerSurface` are intentionally omitted below\n // (not just underscore-prefixed) — this adapter doesn't use them, and\n // TypeScript structural typing allows an implementing function to declare\n // fewer parameters than its interface signature. Declaring-then-ignoring\n // trailing unused params trips `@typescript-eslint/no-unused-vars`'s\n // default `args: \"after-used\"` mode (only params before the last *used*\n // one are exempt); omitting them entirely is both lint-clean and reads\n // as \"these truly aren't consulted.\"\n\n handleChainStart(chain: SerializedLike, inputs: Record<string, unknown>, runId: string): void {\n _handleChainStart(this, chain, inputs, runId);\n }\n\n handleChainEnd(outputs: Record<string, unknown>, runId: string): void {\n _handleChainEnd(this, outputs, runId);\n }\n\n handleChainError(err: unknown, runId: string): void {\n _handleChainError(this, err, runId);\n }\n\n /* ---------------------------------------------------------------------- */\n /* LLM callbacks */\n /* ---------------------------------------------------------------------- */\n\n handleLLMStart(\n llm: SerializedLike,\n prompts: string[],\n runId: string,\n _parentRunId?: string,\n extraParams?: Record<string, unknown>,\n ): void {\n _handleLLMStart(this, llm, prompts, runId, extraParams);\n }\n\n handleChatModelStart(\n llm: SerializedLike,\n messages: BaseMessageLike[][],\n runId: string,\n _parentRunId?: string,\n extraParams?: Record<string, unknown>,\n ): void {\n // Chat models ARE LLMs — same span type as handleLLMStart (mirrors\n // Python's LangGraph override; the plain-LangChain adapter treats both\n // identically since it has no chat-model-specific behavior to add).\n // MHQ-750: also decompose the flattened messages (+ bound tools, if\n // any) into context_segments — mirrors `../langgraph/`'s\n // handleChatModelStart wiring via the same shared decomposer.\n _handleChatModelStart(this, llm, messages, runId, extraParams);\n }\n\n handleLLMEnd(output: LLMResultLike, runId: string): void {\n _handleLLMEnd(this, output, runId);\n }\n\n handleLLMError(err: unknown, runId: string): void {\n _handleLLMError(this, err, runId);\n }\n\n /* ---------------------------------------------------------------------- */\n /* Tool callbacks */\n /* ---------------------------------------------------------------------- */\n\n handleToolStart(tool: SerializedLike, input: string, runId: string): void {\n _handleToolStart(this, tool, input, runId);\n }\n\n handleToolEnd(output: unknown, runId: string): void {\n _handleToolEnd(this, output, runId);\n }\n\n handleToolError(err: unknown, runId: string): void {\n _handleToolError(this, err, runId);\n }\n\n /* ---------------------------------------------------------------------- */\n /* Retriever callbacks (@beta — subject to change before SDK v1.0) */\n /* ---------------------------------------------------------------------- */\n\n handleRetrieverStart(retriever: SerializedLike, query: string, runId: string): void {\n _handleRetrieverStart(this, retriever, query, runId);\n }\n\n handleRetrieverEnd(documents: DocumentLike[], runId: string): void {\n _handleRetrieverEnd(this, documents, runId);\n }\n\n handleRetrieverError(err: unknown, runId: string): void {\n _handleRetrieverError(this, err, runId);\n }\n\n /* ---------------------------------------------------------------------- */\n /* Internal accessors used by the absorbErrorsSync-wrapped impls */\n /* ---------------------------------------------------------------------- */\n\n /** @internal */\n _openSpan(\n runId: string,\n name: string,\n type: \"agent\" | \"llm\" | \"tool\" | \"retriever\",\n inputData?: unknown,\n extraMetadata?: Record<string, unknown>,\n ): SpanHandle | null {\n return this.openSpan(runId, name, type, inputData, extraMetadata);\n }\n\n /** @internal */\n _closeSpan(runId: string, outputData?: unknown, error?: unknown): void {\n this.closeSpan(runId, outputData, error);\n }\n\n /** @internal */\n _getSpan(runId: string): SpanHandle | undefined {\n return this.spanStack.get(runId);\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* Implementation bodies (wrapped in absorbErrorsSync) */\n/* ------------------------------------------------------------------------ */\n\nconst _handleChainStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n chain: SerializedLike | null | undefined,\n inputs: Record<string, unknown>,\n runId: string,\n ): void => {\n const chainName = resolveNameIdFirst(chain, \"chain\");\n self._openSpan(runId, chainName, \"agent\", inputs);\n },\n { fingerprint: \"morse.langchain.handleChainStart\" },\n) as (\n self: MorseCallbackHandler,\n chain: SerializedLike | null | undefined,\n inputs: Record<string, unknown>,\n runId: string,\n) => void;\n\nconst _handleChainEnd = absorbErrorsSync(\n (self: MorseCallbackHandler, outputs: Record<string, unknown>, runId: string): void => {\n self._closeSpan(runId, outputs);\n },\n { fingerprint: \"morse.langchain.handleChainEnd\" },\n) as (self: MorseCallbackHandler, outputs: Record<string, unknown>, runId: string) => void;\n\nconst _handleChainError = absorbErrorsSync(\n (self: MorseCallbackHandler, err: unknown, runId: string): void => {\n self._closeSpan(runId, undefined, err ?? new Error(\"langchain chain error\"));\n },\n { fingerprint: \"morse.langchain.handleChainError\" },\n) as (self: MorseCallbackHandler, err: unknown, runId: string) => void;\n\nconst _handleLLMStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n llm: SerializedLike | null | undefined,\n prompts: string[],\n runId: string,\n extraParams: Record<string, unknown> | undefined,\n ): void => {\n const llmName = resolveNameIdFirst(llm, \"llm\");\n const invocationParams = extraParams?.invocation_params as Record<string, unknown> | undefined;\n const modelName =\n (typeof invocationParams?.model_name === \"string\"\n ? invocationParams.model_name\n : undefined) ??\n (typeof invocationParams?.model === \"string\" ? invocationParams.model : undefined);\n const handle = self._openSpan(\n runId,\n llmName,\n \"llm\",\n prompts && prompts.length > 0 ? { prompts } : undefined,\n );\n if (handle !== null && modelName) {\n handle.span.model = modelName;\n }\n },\n { fingerprint: \"morse.langchain.handleLLMStart\" },\n) as (\n self: MorseCallbackHandler,\n llm: SerializedLike | null | undefined,\n prompts: string[],\n runId: string,\n extraParams: Record<string, unknown> | undefined,\n) => void;\n\n/**\n * `@langchain/core` passes `handleChatModelStart` a nested\n * `BaseMessage[][]` — one array per \"prompt\" in a batch call. The\n * decomposer expects a flat list, so flatten one level (mirrors\n * `../langgraph/llm-and-tool-callbacks.ts`'s `flattenMessages`, itself a\n * port of Python's `_flatten_messages` in `adapters/langgraph.py`).\n */\nfunction flattenMessages(messages: BaseMessageLike[][] | undefined): BaseMessageLike[] {\n if (!Array.isArray(messages)) return [];\n const flat: BaseMessageLike[] = [];\n for (const item of messages) {\n if (Array.isArray(item)) {\n flat.push(...item);\n } else if (item !== undefined && item !== null) {\n flat.push(item as unknown as BaseMessageLike);\n }\n }\n return flat;\n}\n\n/** Extract the bound `tools` array from `handleChatModelStart`'s `extraParams.invocation_params`. */\nfunction toolsFromExtra(extra: Record<string, unknown> | undefined): unknown {\n const invocationParams = extra?.invocation_params as Record<string, unknown> | undefined;\n return invocationParams?.tools;\n}\n\nconst _handleChatModelStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n llm: SerializedLike | null | undefined,\n messages: BaseMessageLike[][],\n runId: string,\n extraParams: Record<string, unknown> | undefined,\n ): void => {\n const llmName = resolveNameIdFirst(llm, \"llm\");\n const invocationParams = extraParams?.invocation_params as Record<string, unknown> | undefined;\n const modelName =\n (typeof invocationParams?.model_name === \"string\"\n ? invocationParams.model_name\n : undefined) ??\n (typeof invocationParams?.model === \"string\" ? invocationParams.model : undefined);\n const flatMessages = flattenMessages(messages);\n const contextSegments = decomposeOpenAiMessages(flatMessages, toolsFromExtra(extraParams));\n const handle = self._openSpan(runId, llmName, \"llm\", undefined);\n if (handle !== null) {\n if (modelName) handle.span.model = modelName;\n if (contextSegments.length > 0) handle.span.context_segments = contextSegments;\n }\n },\n { fingerprint: \"morse.langchain.handleChatModelStart\" },\n) as (\n self: MorseCallbackHandler,\n llm: SerializedLike | null | undefined,\n messages: BaseMessageLike[][],\n runId: string,\n extraParams: Record<string, unknown> | undefined,\n) => void;\n\nconst _handleLLMEnd = absorbErrorsSync(\n (self: MorseCallbackHandler, response: LLMResultLike, runId: string): void => {\n const handle = self._getSpan(runId);\n const outputText = extractOutputText(response);\n\n if (handle !== undefined) {\n const usage = extractTokenUsage(response);\n if (usage.inputTokens !== undefined || usage.outputTokens !== undefined) {\n handle.span.input_tokens = usage.inputTokens;\n handle.span.output_tokens = usage.outputTokens;\n handle.span.total_tokens =\n usage.totalTokens !== undefined\n ? usage.totalTokens\n : (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0) || undefined;\n if (usage.cachedInputTokens) {\n handle.span.cached_input_tokens = usage.cachedInputTokens;\n }\n }\n // Response model wins over the invocation-param model set in\n // handleLLMStart — the response carries the fully-resolved version\n // string. Mirrors Python's on_llm_end behavior.\n const resolvedModel = extractModel(response);\n if (resolvedModel) {\n handle.span.model = resolvedModel;\n }\n // NOTE: cost computation (calculate_cost / merge_provider_reported_cost\n // in the Python adapter) intentionally omitted — no TS pricing module\n // exists yet (separate MHQ-482 gap). See file-header deviation notes.\n }\n\n self._closeSpan(runId, { text: outputText });\n },\n { fingerprint: \"morse.langchain.handleLLMEnd\" },\n) as (self: MorseCallbackHandler, response: LLMResultLike, runId: string) => void;\n\nconst _handleLLMError = absorbErrorsSync(\n (self: MorseCallbackHandler, err: unknown, runId: string): void => {\n self._closeSpan(runId, undefined, err ?? new Error(\"langchain llm error\"));\n },\n { fingerprint: \"morse.langchain.handleLLMError\" },\n) as (self: MorseCallbackHandler, err: unknown, runId: string) => void;\n\nconst _handleToolStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n tool: SerializedLike | null | undefined,\n input: string,\n runId: string,\n ): void => {\n const toolName = resolveNameNameFirst(tool, \"tool\");\n self._openSpan(runId, toolName, \"tool\", { input });\n },\n { fingerprint: \"morse.langchain.handleToolStart\" },\n) as (\n self: MorseCallbackHandler,\n tool: SerializedLike | null | undefined,\n input: string,\n runId: string,\n) => void;\n\nconst _handleToolEnd = absorbErrorsSync(\n (self: MorseCallbackHandler, output: unknown, runId: string): void => {\n self._closeSpan(runId, { output: String(output) });\n },\n { fingerprint: \"morse.langchain.handleToolEnd\" },\n) as (self: MorseCallbackHandler, output: unknown, runId: string) => void;\n\nconst _handleToolError = absorbErrorsSync(\n (self: MorseCallbackHandler, err: unknown, runId: string): void => {\n self._closeSpan(runId, undefined, err ?? new Error(\"langchain tool error\"));\n },\n { fingerprint: \"morse.langchain.handleToolError\" },\n) as (self: MorseCallbackHandler, err: unknown, runId: string) => void;\n\nconst _handleRetrieverStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n retriever: SerializedLike | null | undefined,\n query: string,\n runId: string,\n ): void => {\n const idPath = retriever?.id;\n const retrieverName =\n (Array.isArray(idPath) && idPath.length > 0 ? idPath[idPath.length - 1] : undefined) ||\n \"retriever\";\n self._openSpan(runId, String(retrieverName), \"retriever\", { query });\n },\n { fingerprint: \"morse.langchain.handleRetrieverStart\" },\n) as (\n self: MorseCallbackHandler,\n retriever: SerializedLike | null | undefined,\n query: string,\n runId: string,\n) => void;\n\nconst _handleRetrieverEnd = absorbErrorsSync(\n (self: MorseCallbackHandler, documents: DocumentLike[], runId: string): void => {\n const docsOut: Array<{ content_preview: string; source?: string; score?: number }> = [];\n for (const doc of documents ?? []) {\n if (doc && typeof doc === \"object\" && typeof doc.pageContent === \"string\") {\n const entry: { content_preview: string; source?: string; score?: number } = {\n content_preview: doc.pageContent.slice(0, 200),\n };\n const meta = doc.metadata;\n if (meta) {\n if (typeof meta.source === \"string\") entry.source = meta.source;\n const score = meta.score ?? meta.relevance_score;\n if (typeof score === \"number\") entry.score = score;\n }\n docsOut.push(entry);\n } else if (doc && typeof doc === \"object\") {\n docsOut.push(\n doc as unknown as { content_preview: string; source?: string; score?: number },\n );\n }\n }\n self._closeSpan(runId, {\n docs_count: documents?.length ?? 0,\n top_score: docsOut.length > 0 ? (docsOut[0]?.score ?? null) : null,\n sources: docsOut\n .map((d) => d.source)\n .filter((s): s is string => typeof s === \"string\" && s.length > 0),\n documents: docsOut.slice(0, 10),\n });\n },\n { fingerprint: \"morse.langchain.handleRetrieverEnd\" },\n) as (self: MorseCallbackHandler, documents: DocumentLike[], runId: string) => void;\n\nconst _handleRetrieverError = absorbErrorsSync(\n (self: MorseCallbackHandler, err: unknown, runId: string): void => {\n self._closeSpan(runId, undefined, err ?? new Error(\"langchain retriever error\"));\n },\n { fingerprint: \"morse.langchain.handleRetrieverError\" },\n) as (self: MorseCallbackHandler, err: unknown, runId: string) => void;\n\n/* ------------------------------------------------------------------------ */\n/* Optional peer-dep: real BaseCallbackHandler */\n/* ------------------------------------------------------------------------ */\n\nasync function loadLangChainCoreCallbacks(): Promise<LangChainCoreCallbacksModuleLike | null> {\n try {\n // Function-eval'd dynamic import keeps bundlers from trying to resolve\n // `@langchain/core/callbacks/base` at build time when the dep isn't installed.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mod = (await (Function(\"m\", \"return import(m)\") as any)(\n \"@langchain/core/callbacks/base\",\n )) as LangChainCoreCallbacksModuleLike;\n return mod ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Best-effort: if `@langchain/core/callbacks/base` is installed at runtime,\n * return a `MorseCallbackHandler`-shaped class whose prototype chain\n * includes the real `BaseCallbackHandler` (for users relying on\n * `instanceof BaseCallbackHandler` checks). Otherwise return the duck-typed\n * `MorseCallbackHandler` defined above. Mirrors `../langgraph/callback-handler.ts`'s\n * `getCallbackHandlerClass()`.\n */\nexport async function getCallbackHandlerClass(): Promise<typeof MorseCallbackHandler> {\n const mod = await loadLangChainCoreCallbacks();\n const Base = mod?.BaseCallbackHandler;\n if (!Base) return MorseCallbackHandler;\n\n class MorseCallbackHandlerWithBase extends (Base as unknown as {\n new (...args: unknown[]): object;\n }) {\n public readonly name: string = HANDLER_NAME;\n private readonly _av: MorseCallbackHandler;\n constructor(options?: MorseCallbackHandlerOptions) {\n super();\n this._av = new MorseCallbackHandler(options);\n }\n handleChainStart(chain: SerializedLike, inputs: Record<string, unknown>, runId: string): void {\n this._av.handleChainStart(chain, inputs, runId);\n }\n handleChainEnd(outputs: Record<string, unknown>, runId: string): void {\n this._av.handleChainEnd(outputs, runId);\n }\n handleChainError(err: unknown, runId: string): void {\n this._av.handleChainError(err, runId);\n }\n handleLLMStart(\n llm: SerializedLike,\n prompts: string[],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, unknown>,\n ): void {\n this._av.handleLLMStart(llm, prompts, runId, parentRunId, extraParams);\n }\n handleChatModelStart(\n llm: SerializedLike,\n messages: BaseMessageLike[][],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, unknown>,\n ): void {\n this._av.handleChatModelStart(llm, messages, runId, parentRunId, extraParams);\n }\n handleLLMEnd(output: LLMResultLike, runId: string): void {\n this._av.handleLLMEnd(output, runId);\n }\n handleLLMError(err: unknown, runId: string): void {\n this._av.handleLLMError(err, runId);\n }\n handleToolStart(tool: SerializedLike, input: string, runId: string): void {\n this._av.handleToolStart(tool, input, runId);\n }\n handleToolEnd(output: unknown, runId: string): void {\n this._av.handleToolEnd(output, runId);\n }\n handleToolError(err: unknown, runId: string): void {\n this._av.handleToolError(err, runId);\n }\n handleRetrieverStart(retriever: SerializedLike, query: string, runId: string): void {\n this._av.handleRetrieverStart(retriever, query, runId);\n }\n handleRetrieverEnd(documents: DocumentLike[], runId: string): void {\n this._av.handleRetrieverEnd(documents, runId);\n }\n handleRetrieverError(err: unknown, runId: string): void {\n this._av.handleRetrieverError(err, runId);\n }\n }\n return MorseCallbackHandlerWithBase as unknown as typeof MorseCallbackHandler;\n}\n"]}
1
+ {"version":3,"sources":["../../../src/langchain/callback-handler.ts"],"names":["init_tracing","tokenUsage","model","startSpan","absorbErrorsSync","adoptThreadId","decomposeOpenAiMessages"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * `@morsehq-dev/sdk/langchain` — `MorseCallbackHandler` for plain LangChain\n * (chains, LLMs, tools, retrievers). Port of\n * `apps/sdk/python/src/morse_ai/adapters/langchain.py` (MHQ-482).\n *\n * Usage:\n *\n * ```ts\n * import { MorseCallbackHandler } from \"@morsehq-dev/sdk/langchain\";\n * import { runAsync } from \"@morsehq-dev/sdk\"; // or morse.run()\n *\n * const handler = new MorseCallbackHandler({ agentName: \"my-agent\" });\n * await runAsync({ agentName: \"my-agent\" }, async () => {\n * await chain.invoke(input, { callbacks: [handler] });\n * });\n * ```\n *\n * Span mapping (mirrors the Python adapter):\n * - handleChainStart / handleChainEnd / handleChainError → `type=agent`\n * - handleLLMStart / handleChatModelStart / handleLLMEnd / handleLLMError → `type=llm`\n * - handleToolStart / handleToolEnd / handleToolError → `type=tool`\n * - handleRetrieverStart / handleRetrieverEnd / handleRetrieverError (@beta)\n * → `type=retriever`\n *\n * ## Deviations from the Python adapter (see PR report for full rationale)\n *\n * 1. **No auto-trace creation.** Python's `MorseCallbackHandler` calls\n * `morse_ai.tracing.run(...)` itself when no trace is active (contextvars\n * support manually entering/exiting a context across independent callback\n * invocations). The TS SDK's trace context is `AsyncLocalStorage`-based\n * (`_internal/tracing.ts`), which only supports the `als.run(store, fn)`\n * callback shape — there is no way to open a trace and leave it open\n * across separate, unwrapped callback calls. Callers MUST wrap the\n * LangChain invocation in `morse.run()` / `runAsync()`. This mirrors the\n * constraint the existing `../langgraph/` adapter already operates under\n * (see its file-header comments) — every span helper silently no-ops\n * (returns `null`) when there is no active trace, exactly like this file.\n * 2. **No structural subclass relationship with `../langgraph/`.** The task\n * brief notes that Python's `langgraph.py::LangGraphCallbackHandler`\n * subclasses `langchain.py::MorseCallbackHandler`. `@langchain/core`'s\n * `BaseCallbackHandler` surface is identical for plain chains and for\n * LangGraph graphs (LangGraph JS is built on `@langchain/core`\n * callbacks), so structurally the two TS adapters COULD share a base.\n * But the existing `../langgraph/` files are off-limits for this task\n * (a separate, already-shipped gap) and refactoring them to extract a\n * shared base is out of scope / higher risk than the value it buys right\n * now. This adapter is therefore a structural sibling, not a subclass —\n * same conventions (span-emission via `startSpan`, `absorbErrorsSync`\n * everywhere, `metadata.adapter` tagging), independently implemented.\n * 3. **No cost computation.** Python's `on_llm_end` calls\n * `morse_ai.pricing.calculate_cost` and `merge_provider_reported_cost`.\n * Neither has a TS port yet (owned by a separate parallel MHQ-482 gap).\n * Token counts/model are still captured; `cost_usd` is left unset until\n * the pricing gap lands.\n * 4. **`type=retriever` uses a real, added `SpanType` variant** (see\n * `_internal/spans.ts`) rather than the `type=tool` +\n * `metadata.tool_kind` fallback pattern used for `hook`/`subagent` — the\n * backend already accepts `\"retriever\"` (Python's `SpanType.RETRIEVER`\n * has shipped since the Python adapter), so no fallback is needed.\n *\n * All public methods absorb internal errors (never throw into the LangChain\n * runtime) — mirrors Python's `try/except Exception: logger.debug(...)`\n * wrapping on every callback.\n */\n\nimport { absorbErrorsSync } from \"../_internal/errors\";\nimport type { SpanHandle } from \"../_internal/tracing\";\nimport { adoptThreadId, startSpan } from \"../_internal/tracing\";\nimport { decomposeOpenAiMessages } from \"../_agent-sdk-common/context-decomposer\";\nimport type {\n BaseMessageLike,\n CallbackHandlerSurface,\n DocumentLike,\n LangChainCoreCallbacksModuleLike,\n LLMResultLike,\n SerializedLike,\n} from \"./types\";\n\n/* ------------------------------------------------------------------------ */\n/* Constants */\n/* ------------------------------------------------------------------------ */\n\nconst ADAPTER = \"langchain-js\" as const;\nconst HANDLER_NAME = \"morse_callback_handler\";\nconst DEFAULT_AGENT_NAME = \"langchain-agent\";\n\n// AGE-260 port: cap on the JSON-serialized size of any single input_data /\n// output_data payload. Mirrors the Python adapter's `_MAX_STATE_PAYLOAD_BYTES`.\nconst MAX_STATE_PAYLOAD_BYTES = 64 * 1024; // 64 KB JSON\n\n/* ------------------------------------------------------------------------ */\n/* Public options */\n/* ------------------------------------------------------------------------ */\n\nexport interface MorseCallbackHandlerOptions {\n /** Falls back to `\"langchain-agent\"` when unset. Only used for documentation\n * purposes on this handler instance — the actual trace's agent name is set\n * by whatever `morse.run()` / `runAsync()` call wraps the invocation. */\n agentName?: string;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Name resolution helpers */\n/* ------------------------------------------------------------------------ */\n\n/** chain/llm: prefer `id` path tail, then `name`, then `fallback`. */\nfunction resolveNameIdFirst(\n serialized: SerializedLike | null | undefined,\n fallback: string,\n): string {\n const s = serialized ?? {};\n const idPath = s.id;\n if (Array.isArray(idPath) && idPath.length > 0) {\n const last = idPath[idPath.length - 1];\n if (typeof last === \"string\" && last.length > 0) return last;\n }\n if (typeof s.name === \"string\" && s.name.length > 0) return s.name;\n return fallback;\n}\n\n/** tool: prefer `name`, then `id` path tail, then `fallback`. */\nfunction resolveNameNameFirst(\n serialized: SerializedLike | null | undefined,\n fallback: string,\n): string {\n const s = serialized ?? {};\n if (typeof s.name === \"string\" && s.name.length > 0) return s.name;\n const idPath = s.id;\n if (Array.isArray(idPath) && idPath.length > 0) {\n const last = idPath[idPath.length - 1];\n if (typeof last === \"string\" && last.length > 0) return last;\n }\n return fallback;\n}\n\n/* ------------------------------------------------------------------------ */\n/* State coercion — port of Python's `_ensure_dict` */\n/* ------------------------------------------------------------------------ */\n\nfunction utf8ByteLength(s: string): number {\n if (typeof TextEncoder !== \"undefined\") return new TextEncoder().encode(s).length;\n // Rough fallback — good enough for a soft cap, never load-bearing for\n // correctness (only used to decide whether to truncate).\n return s.length;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return false;\n const proto: unknown = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Coerce arbitrary LangChain chain/tool/retriever input or output into a\n * dict payload the wire schema requires (`SpanData.input_data` /\n * `output_data`). Port of Python's `MorseCallbackHandler._ensure_dict`:\n *\n * - `null` / `undefined` → `undefined` (legitimately absent)\n * - plain object → unchanged\n * - object with a callable `toJSON()` returning a plain object → that result\n * (JS analogue of Python's Pydantic `model_dump()` / `dict()` duck typing)\n * - other (string / number / array / class instance) → `{ value: String(x) }`\n *\n * Oversized payloads (JSON > `MAX_STATE_PAYLOAD_BYTES`) are replaced with a\n * truncation marker so the transport queue stays bounded but the dashboard\n * still shows a usable preview — never silently dropped to `undefined`.\n */\nexport function coerceStateValue(data: unknown): Record<string, unknown> | undefined {\n if (data === null || data === undefined) return undefined;\n\n let coerced: Record<string, unknown>;\n if (isPlainObject(data)) {\n coerced = data;\n } else {\n const toJSON = (data as { toJSON?: unknown }).toJSON;\n let viaToJSON: Record<string, unknown> | null = null;\n if (typeof toJSON === \"function\") {\n try {\n const result: unknown = (toJSON as () => unknown).call(data);\n if (isPlainObject(result)) viaToJSON = result;\n } catch {\n viaToJSON = null;\n }\n }\n if (viaToJSON !== null) {\n coerced = viaToJSON;\n } else if (Array.isArray(data)) {\n coerced = { value: safeStringify(data) };\n } else {\n coerced = { value: String(data) };\n }\n }\n\n let encoded: string;\n try {\n encoded = JSON.stringify(coerced) ?? \"null\";\n } catch {\n return {\n _truncated: true,\n _reason: \"unserializable\",\n value: String(coerced).slice(0, 1024),\n };\n }\n\n const byteLen = utf8ByteLength(encoded);\n if (byteLen > MAX_STATE_PAYLOAD_BYTES) {\n const preview = encoded.slice(0, Math.floor(MAX_STATE_PAYLOAD_BYTES / 2));\n return {\n _truncated: true,\n _reason: \"payload_too_large\",\n _original_size_bytes: byteLen,\n _max_bytes: MAX_STATE_PAYLOAD_BYTES,\n preview,\n };\n }\n\n return coerced;\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* LLM response extraction — port of `_extract_token_usage` / `_extract_model` */\n/* ------------------------------------------------------------------------ */\n\nexport interface TokenUsage {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n cachedInputTokens?: number;\n}\n\nfunction numOrUndef(v: unknown): number | undefined {\n return typeof v === \"number\" && Number.isFinite(v) ? v : undefined;\n}\n\nfunction firstGenerationMessage(\n response: LLMResultLike | null | undefined,\n): BaseMessageLike | undefined {\n const gens = response?.generations;\n if (Array.isArray(gens) && gens.length > 0 && Array.isArray(gens[0]) && gens[0]!.length > 0) {\n return gens[0]![0]!.message;\n }\n return undefined;\n}\n\n/**\n * Returns token usage across the provider shapes LangChain JS integrations\n * use in practice. Field names below are snake_case because — unlike most\n * of the JS ecosystem — `@langchain/core`'s `usage_metadata` /\n * `response_metadata` fields ARE snake_case (verified against\n * `@langchain/core/dist/messages/ai.d.ts`), matching the Python SDK 1:1.\n * `llmOutput` is a free-form provider bag; we also check the camelCase\n * `tokenUsage` key the existing `../langgraph/` adapter established.\n */\nexport function extractTokenUsage(response: LLMResultLike | null | undefined): TokenUsage {\n try {\n const msg = firstGenerationMessage(response);\n if (msg) {\n const um = msg.usage_metadata;\n if (um && (um.input_tokens !== undefined || um.output_tokens !== undefined)) {\n const details = um.input_token_details ?? {};\n const cached = details.cache_read ?? details.cache_creation;\n return {\n inputTokens: numOrUndef(um.input_tokens),\n outputTokens: numOrUndef(um.output_tokens),\n totalTokens: numOrUndef(um.total_tokens),\n cachedInputTokens: numOrUndef(cached),\n };\n }\n const tokenUsage = msg.response_metadata?.token_usage;\n if (tokenUsage) {\n return {\n inputTokens: numOrUndef(tokenUsage.prompt_tokens ?? tokenUsage.input_tokens),\n outputTokens: numOrUndef(tokenUsage.completion_tokens ?? tokenUsage.output_tokens),\n totalTokens: numOrUndef(tokenUsage.total_tokens),\n };\n }\n }\n } catch {\n // fall through to llmOutput-based extraction\n }\n\n const llmOutput = response?.llmOutput ?? {};\n const tokenUsage = (llmOutput.tokenUsage ?? llmOutput.token_usage) as\n | Record<string, unknown>\n | undefined;\n if (tokenUsage && Object.keys(tokenUsage).length > 0) {\n return {\n inputTokens: numOrUndef(\n tokenUsage.promptTokens ??\n tokenUsage.prompt_tokens ??\n tokenUsage.inputTokens ??\n tokenUsage.input_tokens,\n ),\n outputTokens: numOrUndef(\n tokenUsage.completionTokens ??\n tokenUsage.completion_tokens ??\n tokenUsage.outputTokens ??\n tokenUsage.output_tokens,\n ),\n totalTokens: numOrUndef(tokenUsage.totalTokens ?? tokenUsage.total_tokens),\n };\n }\n\n const usage = llmOutput.usage as Record<string, unknown> | undefined;\n if (usage && Object.keys(usage).length > 0) {\n return {\n inputTokens: numOrUndef(usage.input_tokens),\n outputTokens: numOrUndef(usage.output_tokens),\n totalTokens: numOrUndef(usage.total_tokens),\n cachedInputTokens: numOrUndef(usage.cache_read_input_tokens),\n };\n }\n\n return {};\n}\n\n/** Best-effort model-name extraction from an `LLMResult`. */\nexport function extractModel(response: LLMResultLike | null | undefined): string | undefined {\n try {\n const msg = firstGenerationMessage(response);\n const meta = msg?.response_metadata;\n const model = meta?.model_name ?? meta?.model;\n if (typeof model === \"string\" && model.length > 0) return model;\n } catch {\n // fall through\n }\n const llmOutput = response?.llmOutput ?? {};\n const model = llmOutput.model_name ?? llmOutput.model;\n return typeof model === \"string\" && model.length > 0 ? model : undefined;\n}\n\n/** Best-effort output-text extraction from an `LLMResult`, for `output_data.text`. */\nexport function extractOutputText(response: LLMResultLike | null | undefined): string {\n try {\n const gens = response?.generations;\n if (Array.isArray(gens) && gens.length > 0 && Array.isArray(gens[0]) && gens[0]!.length > 0) {\n const first = gens[0]![0]!;\n if (typeof first.text === \"string\" && first.text.length > 0) return first.text;\n const content = first.message?.content;\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n const parts: string[] = [];\n for (const block of content) {\n if (typeof block === \"string\") {\n parts.push(block);\n } else if (\n block &&\n typeof block === \"object\" &&\n typeof (block as Record<string, unknown>).text === \"string\"\n ) {\n parts.push((block as Record<string, unknown>).text as string);\n }\n }\n return parts.join(\"\\n\");\n }\n }\n } catch {\n // fall through\n }\n return \"\";\n}\n\n/* ------------------------------------------------------------------------ */\n/* MorseCallbackHandler */\n/* ------------------------------------------------------------------------ */\n\nexport class MorseCallbackHandler implements CallbackHandlerSurface {\n /** Required by LangChain's `BaseCallbackHandler` interface. */\n public readonly name: string = HANDLER_NAME;\n\n public readonly agentName: string;\n\n /** Map of `runId` → open `SpanHandle`, spanning chain/llm/tool/retriever\n * spans together (mirrors Python's single `_span_stack` dict). */\n private readonly spanStack: Map<string, SpanHandle> = new Map();\n\n constructor(options?: MorseCallbackHandlerOptions) {\n this.agentName =\n options?.agentName && options.agentName.length > 0 ? options.agentName : DEFAULT_AGENT_NAME;\n }\n\n /* ---------------------------------------------------------------------- */\n /* Internal helpers */\n /* ---------------------------------------------------------------------- */\n\n private openSpan(\n runId: string,\n name: string,\n type: \"agent\" | \"llm\" | \"tool\" | \"retriever\",\n inputData?: unknown,\n extraMetadata?: Record<string, unknown>,\n ): SpanHandle | null {\n if (typeof runId !== \"string\" || runId.length === 0) return null;\n const metadata: Record<string, unknown> = { ...(extraMetadata ?? {}), adapter: ADAPTER };\n const handle = startSpan({ name, type, metadata });\n if (handle === null) return null;\n const wrapped = coerceStateValue(inputData);\n if (wrapped !== undefined) handle.span.input_data = wrapped;\n this.spanStack.set(runId, handle);\n return handle;\n }\n\n private closeSpan(runId: string, outputData?: unknown, error?: unknown): void {\n const handle = this.spanStack.get(runId);\n if (handle === undefined) return;\n this.spanStack.delete(runId);\n if (outputData !== undefined) {\n const wrapped = coerceStateValue(outputData);\n if (wrapped !== undefined) handle.span.output_data = wrapped;\n }\n if (error !== undefined) {\n handle.end(error);\n } else {\n handle.end();\n }\n }\n\n /* ---------------------------------------------------------------------- */\n /* Chain callbacks */\n /* ---------------------------------------------------------------------- */\n\n // NOTE: trailing `runType`/`runName` parameters from\n // `CallbackHandlerSurface` are intentionally omitted below (not just\n // underscore-prefixed) — this adapter doesn't use them, and TypeScript\n // structural typing allows an implementing function to declare fewer\n // parameters than its interface signature. Declaring-then-ignoring\n // trailing unused params trips `@typescript-eslint/no-unused-vars`'s\n // default `args: \"after-used\"` mode (only params before the last *used*\n // one are exempt); omitting them entirely is both lint-clean and reads\n // as \"these truly aren't consulted.\" `metadata` IS consulted as of\n // MHQ-1029, so it and the params before it are declared.\n\n handleChainStart(\n chain: SerializedLike,\n inputs: Record<string, unknown>,\n runId: string,\n _parentRunId?: string,\n _tags?: string[],\n metadata?: Record<string, unknown>,\n ): void {\n _handleChainStart(this, chain, inputs, runId, metadata);\n }\n\n handleChainEnd(outputs: Record<string, unknown>, runId: string): void {\n _handleChainEnd(this, outputs, runId);\n }\n\n handleChainError(err: unknown, runId: string): void {\n _handleChainError(this, err, runId);\n }\n\n /* ---------------------------------------------------------------------- */\n /* LLM callbacks */\n /* ---------------------------------------------------------------------- */\n\n handleLLMStart(\n llm: SerializedLike,\n prompts: string[],\n runId: string,\n _parentRunId?: string,\n extraParams?: Record<string, unknown>,\n ): void {\n _handleLLMStart(this, llm, prompts, runId, extraParams);\n }\n\n handleChatModelStart(\n llm: SerializedLike,\n messages: BaseMessageLike[][],\n runId: string,\n _parentRunId?: string,\n extraParams?: Record<string, unknown>,\n ): void {\n // Chat models ARE LLMs — same span type as handleLLMStart (mirrors\n // Python's LangGraph override; the plain-LangChain adapter treats both\n // identically since it has no chat-model-specific behavior to add).\n // MHQ-750: also decompose the flattened messages (+ bound tools, if\n // any) into context_segments — mirrors `../langgraph/`'s\n // handleChatModelStart wiring via the same shared decomposer.\n _handleChatModelStart(this, llm, messages, runId, extraParams);\n }\n\n handleLLMEnd(output: LLMResultLike, runId: string): void {\n _handleLLMEnd(this, output, runId);\n }\n\n handleLLMError(err: unknown, runId: string): void {\n _handleLLMError(this, err, runId);\n }\n\n /* ---------------------------------------------------------------------- */\n /* Tool callbacks */\n /* ---------------------------------------------------------------------- */\n\n handleToolStart(tool: SerializedLike, input: string, runId: string): void {\n _handleToolStart(this, tool, input, runId);\n }\n\n handleToolEnd(output: unknown, runId: string): void {\n _handleToolEnd(this, output, runId);\n }\n\n handleToolError(err: unknown, runId: string): void {\n _handleToolError(this, err, runId);\n }\n\n /* ---------------------------------------------------------------------- */\n /* Retriever callbacks (@beta — subject to change before SDK v1.0) */\n /* ---------------------------------------------------------------------- */\n\n handleRetrieverStart(retriever: SerializedLike, query: string, runId: string): void {\n _handleRetrieverStart(this, retriever, query, runId);\n }\n\n handleRetrieverEnd(documents: DocumentLike[], runId: string): void {\n _handleRetrieverEnd(this, documents, runId);\n }\n\n handleRetrieverError(err: unknown, runId: string): void {\n _handleRetrieverError(this, err, runId);\n }\n\n /* ---------------------------------------------------------------------- */\n /* Internal accessors used by the absorbErrorsSync-wrapped impls */\n /* ---------------------------------------------------------------------- */\n\n /** @internal */\n _openSpan(\n runId: string,\n name: string,\n type: \"agent\" | \"llm\" | \"tool\" | \"retriever\",\n inputData?: unknown,\n extraMetadata?: Record<string, unknown>,\n ): SpanHandle | null {\n return this.openSpan(runId, name, type, inputData, extraMetadata);\n }\n\n /** @internal */\n _closeSpan(runId: string, outputData?: unknown, error?: unknown): void {\n this.closeSpan(runId, outputData, error);\n }\n\n /** @internal */\n _getSpan(runId: string): SpanHandle | undefined {\n return this.spanStack.get(runId);\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* Implementation bodies (wrapped in absorbErrorsSync) */\n/* ------------------------------------------------------------------------ */\n\nconst _handleChainStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n chain: SerializedLike | null | undefined,\n inputs: Record<string, unknown>,\n runId: string,\n metadata?: Record<string, unknown>,\n ): void => {\n const chainName = resolveNameIdFirst(chain, \"chain\");\n self._openSpan(runId, chainName, \"agent\", inputs);\n // MHQ-1029: LangGraph copies `configurable.thread_id` onto the run\n // metadata, which is the only place a checkpointed conversation's\n // identity reaches a callback handler.\n if (metadata) adoptThreadId(metadata.thread_id ?? metadata.threadId);\n },\n { fingerprint: \"morse.langchain.handleChainStart\" },\n) as (\n self: MorseCallbackHandler,\n chain: SerializedLike | null | undefined,\n inputs: Record<string, unknown>,\n runId: string,\n metadata?: Record<string, unknown>,\n) => void;\n\nconst _handleChainEnd = absorbErrorsSync(\n (self: MorseCallbackHandler, outputs: Record<string, unknown>, runId: string): void => {\n self._closeSpan(runId, outputs);\n },\n { fingerprint: \"morse.langchain.handleChainEnd\" },\n) as (self: MorseCallbackHandler, outputs: Record<string, unknown>, runId: string) => void;\n\nconst _handleChainError = absorbErrorsSync(\n (self: MorseCallbackHandler, err: unknown, runId: string): void => {\n self._closeSpan(runId, undefined, err ?? new Error(\"langchain chain error\"));\n },\n { fingerprint: \"morse.langchain.handleChainError\" },\n) as (self: MorseCallbackHandler, err: unknown, runId: string) => void;\n\nconst _handleLLMStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n llm: SerializedLike | null | undefined,\n prompts: string[],\n runId: string,\n extraParams: Record<string, unknown> | undefined,\n ): void => {\n const llmName = resolveNameIdFirst(llm, \"llm\");\n const invocationParams = extraParams?.invocation_params as Record<string, unknown> | undefined;\n const modelName =\n (typeof invocationParams?.model_name === \"string\"\n ? invocationParams.model_name\n : undefined) ??\n (typeof invocationParams?.model === \"string\" ? invocationParams.model : undefined);\n const handle = self._openSpan(\n runId,\n llmName,\n \"llm\",\n prompts && prompts.length > 0 ? { prompts } : undefined,\n );\n if (handle !== null && modelName) {\n handle.span.model = modelName;\n }\n },\n { fingerprint: \"morse.langchain.handleLLMStart\" },\n) as (\n self: MorseCallbackHandler,\n llm: SerializedLike | null | undefined,\n prompts: string[],\n runId: string,\n extraParams: Record<string, unknown> | undefined,\n) => void;\n\n/**\n * `@langchain/core` passes `handleChatModelStart` a nested\n * `BaseMessage[][]` — one array per \"prompt\" in a batch call. The\n * decomposer expects a flat list, so flatten one level (mirrors\n * `../langgraph/llm-and-tool-callbacks.ts`'s `flattenMessages`, itself a\n * port of Python's `_flatten_messages` in `adapters/langgraph.py`).\n */\nfunction flattenMessages(messages: BaseMessageLike[][] | undefined): BaseMessageLike[] {\n if (!Array.isArray(messages)) return [];\n const flat: BaseMessageLike[] = [];\n for (const item of messages) {\n if (Array.isArray(item)) {\n flat.push(...item);\n } else if (item !== undefined && item !== null) {\n flat.push(item as unknown as BaseMessageLike);\n }\n }\n return flat;\n}\n\n/** Extract the bound `tools` array from `handleChatModelStart`'s `extraParams.invocation_params`. */\nfunction toolsFromExtra(extra: Record<string, unknown> | undefined): unknown {\n const invocationParams = extra?.invocation_params as Record<string, unknown> | undefined;\n return invocationParams?.tools;\n}\n\nconst _handleChatModelStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n llm: SerializedLike | null | undefined,\n messages: BaseMessageLike[][],\n runId: string,\n extraParams: Record<string, unknown> | undefined,\n ): void => {\n const llmName = resolveNameIdFirst(llm, \"llm\");\n const invocationParams = extraParams?.invocation_params as Record<string, unknown> | undefined;\n const modelName =\n (typeof invocationParams?.model_name === \"string\"\n ? invocationParams.model_name\n : undefined) ??\n (typeof invocationParams?.model === \"string\" ? invocationParams.model : undefined);\n const flatMessages = flattenMessages(messages);\n const contextSegments = decomposeOpenAiMessages(flatMessages, toolsFromExtra(extraParams));\n const handle = self._openSpan(runId, llmName, \"llm\", undefined);\n if (handle !== null) {\n if (modelName) handle.span.model = modelName;\n if (contextSegments.length > 0) handle.span.context_segments = contextSegments;\n }\n },\n { fingerprint: \"morse.langchain.handleChatModelStart\" },\n) as (\n self: MorseCallbackHandler,\n llm: SerializedLike | null | undefined,\n messages: BaseMessageLike[][],\n runId: string,\n extraParams: Record<string, unknown> | undefined,\n) => void;\n\nconst _handleLLMEnd = absorbErrorsSync(\n (self: MorseCallbackHandler, response: LLMResultLike, runId: string): void => {\n const handle = self._getSpan(runId);\n const outputText = extractOutputText(response);\n\n if (handle !== undefined) {\n const usage = extractTokenUsage(response);\n if (usage.inputTokens !== undefined || usage.outputTokens !== undefined) {\n handle.span.input_tokens = usage.inputTokens;\n handle.span.output_tokens = usage.outputTokens;\n handle.span.total_tokens =\n usage.totalTokens !== undefined\n ? usage.totalTokens\n : (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0) || undefined;\n if (usage.cachedInputTokens) {\n handle.span.cached_input_tokens = usage.cachedInputTokens;\n }\n }\n // Response model wins over the invocation-param model set in\n // handleLLMStart — the response carries the fully-resolved version\n // string. Mirrors Python's on_llm_end behavior.\n const resolvedModel = extractModel(response);\n if (resolvedModel) {\n handle.span.model = resolvedModel;\n }\n // NOTE: cost computation (calculate_cost / merge_provider_reported_cost\n // in the Python adapter) intentionally omitted — no TS pricing module\n // exists yet (separate MHQ-482 gap). See file-header deviation notes.\n }\n\n self._closeSpan(runId, { text: outputText });\n },\n { fingerprint: \"morse.langchain.handleLLMEnd\" },\n) as (self: MorseCallbackHandler, response: LLMResultLike, runId: string) => void;\n\nconst _handleLLMError = absorbErrorsSync(\n (self: MorseCallbackHandler, err: unknown, runId: string): void => {\n self._closeSpan(runId, undefined, err ?? new Error(\"langchain llm error\"));\n },\n { fingerprint: \"morse.langchain.handleLLMError\" },\n) as (self: MorseCallbackHandler, err: unknown, runId: string) => void;\n\nconst _handleToolStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n tool: SerializedLike | null | undefined,\n input: string,\n runId: string,\n ): void => {\n const toolName = resolveNameNameFirst(tool, \"tool\");\n self._openSpan(runId, toolName, \"tool\", { input });\n },\n { fingerprint: \"morse.langchain.handleToolStart\" },\n) as (\n self: MorseCallbackHandler,\n tool: SerializedLike | null | undefined,\n input: string,\n runId: string,\n) => void;\n\nconst _handleToolEnd = absorbErrorsSync(\n (self: MorseCallbackHandler, output: unknown, runId: string): void => {\n self._closeSpan(runId, { output: String(output) });\n },\n { fingerprint: \"morse.langchain.handleToolEnd\" },\n) as (self: MorseCallbackHandler, output: unknown, runId: string) => void;\n\nconst _handleToolError = absorbErrorsSync(\n (self: MorseCallbackHandler, err: unknown, runId: string): void => {\n self._closeSpan(runId, undefined, err ?? new Error(\"langchain tool error\"));\n },\n { fingerprint: \"morse.langchain.handleToolError\" },\n) as (self: MorseCallbackHandler, err: unknown, runId: string) => void;\n\nconst _handleRetrieverStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n retriever: SerializedLike | null | undefined,\n query: string,\n runId: string,\n ): void => {\n const idPath = retriever?.id;\n const retrieverName =\n (Array.isArray(idPath) && idPath.length > 0 ? idPath[idPath.length - 1] : undefined) ||\n \"retriever\";\n self._openSpan(runId, String(retrieverName), \"retriever\", { query });\n },\n { fingerprint: \"morse.langchain.handleRetrieverStart\" },\n) as (\n self: MorseCallbackHandler,\n retriever: SerializedLike | null | undefined,\n query: string,\n runId: string,\n) => void;\n\nconst _handleRetrieverEnd = absorbErrorsSync(\n (self: MorseCallbackHandler, documents: DocumentLike[], runId: string): void => {\n const docsOut: Array<{ content_preview: string; source?: string; score?: number }> = [];\n for (const doc of documents ?? []) {\n if (doc && typeof doc === \"object\" && typeof doc.pageContent === \"string\") {\n const entry: { content_preview: string; source?: string; score?: number } = {\n content_preview: doc.pageContent.slice(0, 200),\n };\n const meta = doc.metadata;\n if (meta) {\n if (typeof meta.source === \"string\") entry.source = meta.source;\n const score = meta.score ?? meta.relevance_score;\n if (typeof score === \"number\") entry.score = score;\n }\n docsOut.push(entry);\n } else if (doc && typeof doc === \"object\") {\n docsOut.push(\n doc as unknown as { content_preview: string; source?: string; score?: number },\n );\n }\n }\n self._closeSpan(runId, {\n docs_count: documents?.length ?? 0,\n top_score: docsOut.length > 0 ? (docsOut[0]?.score ?? null) : null,\n sources: docsOut\n .map((d) => d.source)\n .filter((s): s is string => typeof s === \"string\" && s.length > 0),\n documents: docsOut.slice(0, 10),\n });\n },\n { fingerprint: \"morse.langchain.handleRetrieverEnd\" },\n) as (self: MorseCallbackHandler, documents: DocumentLike[], runId: string) => void;\n\nconst _handleRetrieverError = absorbErrorsSync(\n (self: MorseCallbackHandler, err: unknown, runId: string): void => {\n self._closeSpan(runId, undefined, err ?? new Error(\"langchain retriever error\"));\n },\n { fingerprint: \"morse.langchain.handleRetrieverError\" },\n) as (self: MorseCallbackHandler, err: unknown, runId: string) => void;\n\n/* ------------------------------------------------------------------------ */\n/* Optional peer-dep: real BaseCallbackHandler */\n/* ------------------------------------------------------------------------ */\n\nasync function loadLangChainCoreCallbacks(): Promise<LangChainCoreCallbacksModuleLike | null> {\n try {\n // Function-eval'd dynamic import keeps bundlers from trying to resolve\n // `@langchain/core/callbacks/base` at build time when the dep isn't installed.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mod = (await (Function(\"m\", \"return import(m)\") as any)(\n \"@langchain/core/callbacks/base\",\n )) as LangChainCoreCallbacksModuleLike;\n return mod ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Best-effort: if `@langchain/core/callbacks/base` is installed at runtime,\n * return a `MorseCallbackHandler`-shaped class whose prototype chain\n * includes the real `BaseCallbackHandler` (for users relying on\n * `instanceof BaseCallbackHandler` checks). Otherwise return the duck-typed\n * `MorseCallbackHandler` defined above. Mirrors `../langgraph/callback-handler.ts`'s\n * `getCallbackHandlerClass()`.\n */\nexport async function getCallbackHandlerClass(): Promise<typeof MorseCallbackHandler> {\n const mod = await loadLangChainCoreCallbacks();\n const Base = mod?.BaseCallbackHandler;\n if (!Base) return MorseCallbackHandler;\n\n class MorseCallbackHandlerWithBase extends (Base as unknown as {\n new (...args: unknown[]): object;\n }) {\n public readonly name: string = HANDLER_NAME;\n private readonly _av: MorseCallbackHandler;\n constructor(options?: MorseCallbackHandlerOptions) {\n super();\n this._av = new MorseCallbackHandler(options);\n }\n handleChainStart(chain: SerializedLike, inputs: Record<string, unknown>, runId: string): void {\n this._av.handleChainStart(chain, inputs, runId);\n }\n handleChainEnd(outputs: Record<string, unknown>, runId: string): void {\n this._av.handleChainEnd(outputs, runId);\n }\n handleChainError(err: unknown, runId: string): void {\n this._av.handleChainError(err, runId);\n }\n handleLLMStart(\n llm: SerializedLike,\n prompts: string[],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, unknown>,\n ): void {\n this._av.handleLLMStart(llm, prompts, runId, parentRunId, extraParams);\n }\n handleChatModelStart(\n llm: SerializedLike,\n messages: BaseMessageLike[][],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, unknown>,\n ): void {\n this._av.handleChatModelStart(llm, messages, runId, parentRunId, extraParams);\n }\n handleLLMEnd(output: LLMResultLike, runId: string): void {\n this._av.handleLLMEnd(output, runId);\n }\n handleLLMError(err: unknown, runId: string): void {\n this._av.handleLLMError(err, runId);\n }\n handleToolStart(tool: SerializedLike, input: string, runId: string): void {\n this._av.handleToolStart(tool, input, runId);\n }\n handleToolEnd(output: unknown, runId: string): void {\n this._av.handleToolEnd(output, runId);\n }\n handleToolError(err: unknown, runId: string): void {\n this._av.handleToolError(err, runId);\n }\n handleRetrieverStart(retriever: SerializedLike, query: string, runId: string): void {\n this._av.handleRetrieverStart(retriever, query, runId);\n }\n handleRetrieverEnd(documents: DocumentLike[], runId: string): void {\n this._av.handleRetrieverEnd(documents, runId);\n }\n handleRetrieverError(err: unknown, runId: string): void {\n this._av.handleRetrieverError(err, runId);\n }\n }\n return MorseCallbackHandlerWithBase as unknown as typeof MorseCallbackHandler;\n}\n"]}
@@ -1,6 +1,6 @@
1
- import { absorbErrorsSync } from '../chunk-T6Z6UIBN.js';
1
+ import { absorbErrorsSync } from '../chunk-OUQAH27A.js';
2
2
  import { decomposeOpenAiMessages } from '../chunk-MLDVXMQD.js';
3
- import { init_tracing, startSpan } from '../chunk-6T6ZPOKZ.js';
3
+ import { init_tracing, adoptThreadId, startSpan } from '../chunk-PXHTLCEU.js';
4
4
 
5
5
  // src/langchain/callback-handler.ts
6
6
  init_tracing();
@@ -227,17 +227,18 @@ var MorseCallbackHandler = class {
227
227
  /* ---------------------------------------------------------------------- */
228
228
  /* Chain callbacks */
229
229
  /* ---------------------------------------------------------------------- */
230
- // NOTE: trailing `parentRunId`/`tags`/`metadata`/`runType`/`runName`
231
- // parameters from `CallbackHandlerSurface` are intentionally omitted below
232
- // (not just underscore-prefixed) — this adapter doesn't use them, and
233
- // TypeScript structural typing allows an implementing function to declare
234
- // fewer parameters than its interface signature. Declaring-then-ignoring
230
+ // NOTE: trailing `runType`/`runName` parameters from
231
+ // `CallbackHandlerSurface` are intentionally omitted below (not just
232
+ // underscore-prefixed) — this adapter doesn't use them, and TypeScript
233
+ // structural typing allows an implementing function to declare fewer
234
+ // parameters than its interface signature. Declaring-then-ignoring
235
235
  // trailing unused params trips `@typescript-eslint/no-unused-vars`'s
236
236
  // default `args: "after-used"` mode (only params before the last *used*
237
237
  // one are exempt); omitting them entirely is both lint-clean and reads
238
- // as "these truly aren't consulted."
239
- handleChainStart(chain, inputs, runId) {
240
- _handleChainStart(this, chain, inputs, runId);
238
+ // as "these truly aren't consulted." `metadata` IS consulted as of
239
+ // MHQ-1029, so it and the params before it are declared.
240
+ handleChainStart(chain, inputs, runId, _parentRunId, _tags, metadata) {
241
+ _handleChainStart(this, chain, inputs, runId, metadata);
241
242
  }
242
243
  handleChainEnd(outputs, runId) {
243
244
  _handleChainEnd(this, outputs, runId);
@@ -301,9 +302,10 @@ var MorseCallbackHandler = class {
301
302
  }
302
303
  };
303
304
  var _handleChainStart = absorbErrorsSync(
304
- (self, chain, inputs, runId) => {
305
+ (self, chain, inputs, runId, metadata) => {
305
306
  const chainName = resolveNameIdFirst(chain, "chain");
306
307
  self._openSpan(runId, chainName, "agent", inputs);
308
+ if (metadata) adoptThreadId(metadata.thread_id ?? metadata.threadId);
307
309
  },
308
310
  { fingerprint: "morse.langchain.handleChainStart" }
309
311
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/langchain/callback-handler.ts"],"names":["tokenUsage","model"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * `@morsehq-dev/sdk/langchain` — `MorseCallbackHandler` for plain LangChain\n * (chains, LLMs, tools, retrievers). Port of\n * `apps/sdk/python/src/morse_ai/adapters/langchain.py` (MHQ-482).\n *\n * Usage:\n *\n * ```ts\n * import { MorseCallbackHandler } from \"@morsehq-dev/sdk/langchain\";\n * import { runAsync } from \"@morsehq-dev/sdk\"; // or morse.run()\n *\n * const handler = new MorseCallbackHandler({ agentName: \"my-agent\" });\n * await runAsync({ agentName: \"my-agent\" }, async () => {\n * await chain.invoke(input, { callbacks: [handler] });\n * });\n * ```\n *\n * Span mapping (mirrors the Python adapter):\n * - handleChainStart / handleChainEnd / handleChainError → `type=agent`\n * - handleLLMStart / handleChatModelStart / handleLLMEnd / handleLLMError → `type=llm`\n * - handleToolStart / handleToolEnd / handleToolError → `type=tool`\n * - handleRetrieverStart / handleRetrieverEnd / handleRetrieverError (@beta)\n * → `type=retriever`\n *\n * ## Deviations from the Python adapter (see PR report for full rationale)\n *\n * 1. **No auto-trace creation.** Python's `MorseCallbackHandler` calls\n * `morse_ai.tracing.run(...)` itself when no trace is active (contextvars\n * support manually entering/exiting a context across independent callback\n * invocations). The TS SDK's trace context is `AsyncLocalStorage`-based\n * (`_internal/tracing.ts`), which only supports the `als.run(store, fn)`\n * callback shape — there is no way to open a trace and leave it open\n * across separate, unwrapped callback calls. Callers MUST wrap the\n * LangChain invocation in `morse.run()` / `runAsync()`. This mirrors the\n * constraint the existing `../langgraph/` adapter already operates under\n * (see its file-header comments) — every span helper silently no-ops\n * (returns `null`) when there is no active trace, exactly like this file.\n * 2. **No structural subclass relationship with `../langgraph/`.** The task\n * brief notes that Python's `langgraph.py::LangGraphCallbackHandler`\n * subclasses `langchain.py::MorseCallbackHandler`. `@langchain/core`'s\n * `BaseCallbackHandler` surface is identical for plain chains and for\n * LangGraph graphs (LangGraph JS is built on `@langchain/core`\n * callbacks), so structurally the two TS adapters COULD share a base.\n * But the existing `../langgraph/` files are off-limits for this task\n * (a separate, already-shipped gap) and refactoring them to extract a\n * shared base is out of scope / higher risk than the value it buys right\n * now. This adapter is therefore a structural sibling, not a subclass —\n * same conventions (span-emission via `startSpan`, `absorbErrorsSync`\n * everywhere, `metadata.adapter` tagging), independently implemented.\n * 3. **No cost computation.** Python's `on_llm_end` calls\n * `morse_ai.pricing.calculate_cost` and `merge_provider_reported_cost`.\n * Neither has a TS port yet (owned by a separate parallel MHQ-482 gap).\n * Token counts/model are still captured; `cost_usd` is left unset until\n * the pricing gap lands.\n * 4. **`type=retriever` uses a real, added `SpanType` variant** (see\n * `_internal/spans.ts`) rather than the `type=tool` +\n * `metadata.tool_kind` fallback pattern used for `hook`/`subagent` — the\n * backend already accepts `\"retriever\"` (Python's `SpanType.RETRIEVER`\n * has shipped since the Python adapter), so no fallback is needed.\n *\n * All public methods absorb internal errors (never throw into the LangChain\n * runtime) — mirrors Python's `try/except Exception: logger.debug(...)`\n * wrapping on every callback.\n */\n\nimport { absorbErrorsSync } from \"../_internal/errors\";\nimport type { SpanHandle } from \"../_internal/tracing\";\nimport { startSpan } from \"../_internal/tracing\";\nimport { decomposeOpenAiMessages } from \"../_agent-sdk-common/context-decomposer\";\nimport type {\n BaseMessageLike,\n CallbackHandlerSurface,\n DocumentLike,\n LangChainCoreCallbacksModuleLike,\n LLMResultLike,\n SerializedLike,\n} from \"./types\";\n\n/* ------------------------------------------------------------------------ */\n/* Constants */\n/* ------------------------------------------------------------------------ */\n\nconst ADAPTER = \"langchain-js\" as const;\nconst HANDLER_NAME = \"morse_callback_handler\";\nconst DEFAULT_AGENT_NAME = \"langchain-agent\";\n\n// AGE-260 port: cap on the JSON-serialized size of any single input_data /\n// output_data payload. Mirrors the Python adapter's `_MAX_STATE_PAYLOAD_BYTES`.\nconst MAX_STATE_PAYLOAD_BYTES = 64 * 1024; // 64 KB JSON\n\n/* ------------------------------------------------------------------------ */\n/* Public options */\n/* ------------------------------------------------------------------------ */\n\nexport interface MorseCallbackHandlerOptions {\n /** Falls back to `\"langchain-agent\"` when unset. Only used for documentation\n * purposes on this handler instance — the actual trace's agent name is set\n * by whatever `morse.run()` / `runAsync()` call wraps the invocation. */\n agentName?: string;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Name resolution helpers */\n/* ------------------------------------------------------------------------ */\n\n/** chain/llm: prefer `id` path tail, then `name`, then `fallback`. */\nfunction resolveNameIdFirst(\n serialized: SerializedLike | null | undefined,\n fallback: string,\n): string {\n const s = serialized ?? {};\n const idPath = s.id;\n if (Array.isArray(idPath) && idPath.length > 0) {\n const last = idPath[idPath.length - 1];\n if (typeof last === \"string\" && last.length > 0) return last;\n }\n if (typeof s.name === \"string\" && s.name.length > 0) return s.name;\n return fallback;\n}\n\n/** tool: prefer `name`, then `id` path tail, then `fallback`. */\nfunction resolveNameNameFirst(\n serialized: SerializedLike | null | undefined,\n fallback: string,\n): string {\n const s = serialized ?? {};\n if (typeof s.name === \"string\" && s.name.length > 0) return s.name;\n const idPath = s.id;\n if (Array.isArray(idPath) && idPath.length > 0) {\n const last = idPath[idPath.length - 1];\n if (typeof last === \"string\" && last.length > 0) return last;\n }\n return fallback;\n}\n\n/* ------------------------------------------------------------------------ */\n/* State coercion — port of Python's `_ensure_dict` */\n/* ------------------------------------------------------------------------ */\n\nfunction utf8ByteLength(s: string): number {\n if (typeof TextEncoder !== \"undefined\") return new TextEncoder().encode(s).length;\n // Rough fallback — good enough for a soft cap, never load-bearing for\n // correctness (only used to decide whether to truncate).\n return s.length;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return false;\n const proto: unknown = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Coerce arbitrary LangChain chain/tool/retriever input or output into a\n * dict payload the wire schema requires (`SpanData.input_data` /\n * `output_data`). Port of Python's `MorseCallbackHandler._ensure_dict`:\n *\n * - `null` / `undefined` → `undefined` (legitimately absent)\n * - plain object → unchanged\n * - object with a callable `toJSON()` returning a plain object → that result\n * (JS analogue of Python's Pydantic `model_dump()` / `dict()` duck typing)\n * - other (string / number / array / class instance) → `{ value: String(x) }`\n *\n * Oversized payloads (JSON > `MAX_STATE_PAYLOAD_BYTES`) are replaced with a\n * truncation marker so the transport queue stays bounded but the dashboard\n * still shows a usable preview — never silently dropped to `undefined`.\n */\nexport function coerceStateValue(data: unknown): Record<string, unknown> | undefined {\n if (data === null || data === undefined) return undefined;\n\n let coerced: Record<string, unknown>;\n if (isPlainObject(data)) {\n coerced = data;\n } else {\n const toJSON = (data as { toJSON?: unknown }).toJSON;\n let viaToJSON: Record<string, unknown> | null = null;\n if (typeof toJSON === \"function\") {\n try {\n const result: unknown = (toJSON as () => unknown).call(data);\n if (isPlainObject(result)) viaToJSON = result;\n } catch {\n viaToJSON = null;\n }\n }\n if (viaToJSON !== null) {\n coerced = viaToJSON;\n } else if (Array.isArray(data)) {\n coerced = { value: safeStringify(data) };\n } else {\n coerced = { value: String(data) };\n }\n }\n\n let encoded: string;\n try {\n encoded = JSON.stringify(coerced) ?? \"null\";\n } catch {\n return {\n _truncated: true,\n _reason: \"unserializable\",\n value: String(coerced).slice(0, 1024),\n };\n }\n\n const byteLen = utf8ByteLength(encoded);\n if (byteLen > MAX_STATE_PAYLOAD_BYTES) {\n const preview = encoded.slice(0, Math.floor(MAX_STATE_PAYLOAD_BYTES / 2));\n return {\n _truncated: true,\n _reason: \"payload_too_large\",\n _original_size_bytes: byteLen,\n _max_bytes: MAX_STATE_PAYLOAD_BYTES,\n preview,\n };\n }\n\n return coerced;\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* LLM response extraction — port of `_extract_token_usage` / `_extract_model` */\n/* ------------------------------------------------------------------------ */\n\nexport interface TokenUsage {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n cachedInputTokens?: number;\n}\n\nfunction numOrUndef(v: unknown): number | undefined {\n return typeof v === \"number\" && Number.isFinite(v) ? v : undefined;\n}\n\nfunction firstGenerationMessage(\n response: LLMResultLike | null | undefined,\n): BaseMessageLike | undefined {\n const gens = response?.generations;\n if (Array.isArray(gens) && gens.length > 0 && Array.isArray(gens[0]) && gens[0]!.length > 0) {\n return gens[0]![0]!.message;\n }\n return undefined;\n}\n\n/**\n * Returns token usage across the provider shapes LangChain JS integrations\n * use in practice. Field names below are snake_case because — unlike most\n * of the JS ecosystem — `@langchain/core`'s `usage_metadata` /\n * `response_metadata` fields ARE snake_case (verified against\n * `@langchain/core/dist/messages/ai.d.ts`), matching the Python SDK 1:1.\n * `llmOutput` is a free-form provider bag; we also check the camelCase\n * `tokenUsage` key the existing `../langgraph/` adapter established.\n */\nexport function extractTokenUsage(response: LLMResultLike | null | undefined): TokenUsage {\n try {\n const msg = firstGenerationMessage(response);\n if (msg) {\n const um = msg.usage_metadata;\n if (um && (um.input_tokens !== undefined || um.output_tokens !== undefined)) {\n const details = um.input_token_details ?? {};\n const cached = details.cache_read ?? details.cache_creation;\n return {\n inputTokens: numOrUndef(um.input_tokens),\n outputTokens: numOrUndef(um.output_tokens),\n totalTokens: numOrUndef(um.total_tokens),\n cachedInputTokens: numOrUndef(cached),\n };\n }\n const tokenUsage = msg.response_metadata?.token_usage;\n if (tokenUsage) {\n return {\n inputTokens: numOrUndef(tokenUsage.prompt_tokens ?? tokenUsage.input_tokens),\n outputTokens: numOrUndef(tokenUsage.completion_tokens ?? tokenUsage.output_tokens),\n totalTokens: numOrUndef(tokenUsage.total_tokens),\n };\n }\n }\n } catch {\n // fall through to llmOutput-based extraction\n }\n\n const llmOutput = response?.llmOutput ?? {};\n const tokenUsage = (llmOutput.tokenUsage ?? llmOutput.token_usage) as\n | Record<string, unknown>\n | undefined;\n if (tokenUsage && Object.keys(tokenUsage).length > 0) {\n return {\n inputTokens: numOrUndef(\n tokenUsage.promptTokens ??\n tokenUsage.prompt_tokens ??\n tokenUsage.inputTokens ??\n tokenUsage.input_tokens,\n ),\n outputTokens: numOrUndef(\n tokenUsage.completionTokens ??\n tokenUsage.completion_tokens ??\n tokenUsage.outputTokens ??\n tokenUsage.output_tokens,\n ),\n totalTokens: numOrUndef(tokenUsage.totalTokens ?? tokenUsage.total_tokens),\n };\n }\n\n const usage = llmOutput.usage as Record<string, unknown> | undefined;\n if (usage && Object.keys(usage).length > 0) {\n return {\n inputTokens: numOrUndef(usage.input_tokens),\n outputTokens: numOrUndef(usage.output_tokens),\n totalTokens: numOrUndef(usage.total_tokens),\n cachedInputTokens: numOrUndef(usage.cache_read_input_tokens),\n };\n }\n\n return {};\n}\n\n/** Best-effort model-name extraction from an `LLMResult`. */\nexport function extractModel(response: LLMResultLike | null | undefined): string | undefined {\n try {\n const msg = firstGenerationMessage(response);\n const meta = msg?.response_metadata;\n const model = meta?.model_name ?? meta?.model;\n if (typeof model === \"string\" && model.length > 0) return model;\n } catch {\n // fall through\n }\n const llmOutput = response?.llmOutput ?? {};\n const model = llmOutput.model_name ?? llmOutput.model;\n return typeof model === \"string\" && model.length > 0 ? model : undefined;\n}\n\n/** Best-effort output-text extraction from an `LLMResult`, for `output_data.text`. */\nexport function extractOutputText(response: LLMResultLike | null | undefined): string {\n try {\n const gens = response?.generations;\n if (Array.isArray(gens) && gens.length > 0 && Array.isArray(gens[0]) && gens[0]!.length > 0) {\n const first = gens[0]![0]!;\n if (typeof first.text === \"string\" && first.text.length > 0) return first.text;\n const content = first.message?.content;\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n const parts: string[] = [];\n for (const block of content) {\n if (typeof block === \"string\") {\n parts.push(block);\n } else if (\n block &&\n typeof block === \"object\" &&\n typeof (block as Record<string, unknown>).text === \"string\"\n ) {\n parts.push((block as Record<string, unknown>).text as string);\n }\n }\n return parts.join(\"\\n\");\n }\n }\n } catch {\n // fall through\n }\n return \"\";\n}\n\n/* ------------------------------------------------------------------------ */\n/* MorseCallbackHandler */\n/* ------------------------------------------------------------------------ */\n\nexport class MorseCallbackHandler implements CallbackHandlerSurface {\n /** Required by LangChain's `BaseCallbackHandler` interface. */\n public readonly name: string = HANDLER_NAME;\n\n public readonly agentName: string;\n\n /** Map of `runId` → open `SpanHandle`, spanning chain/llm/tool/retriever\n * spans together (mirrors Python's single `_span_stack` dict). */\n private readonly spanStack: Map<string, SpanHandle> = new Map();\n\n constructor(options?: MorseCallbackHandlerOptions) {\n this.agentName =\n options?.agentName && options.agentName.length > 0 ? options.agentName : DEFAULT_AGENT_NAME;\n }\n\n /* ---------------------------------------------------------------------- */\n /* Internal helpers */\n /* ---------------------------------------------------------------------- */\n\n private openSpan(\n runId: string,\n name: string,\n type: \"agent\" | \"llm\" | \"tool\" | \"retriever\",\n inputData?: unknown,\n extraMetadata?: Record<string, unknown>,\n ): SpanHandle | null {\n if (typeof runId !== \"string\" || runId.length === 0) return null;\n const metadata: Record<string, unknown> = { ...(extraMetadata ?? {}), adapter: ADAPTER };\n const handle = startSpan({ name, type, metadata });\n if (handle === null) return null;\n const wrapped = coerceStateValue(inputData);\n if (wrapped !== undefined) handle.span.input_data = wrapped;\n this.spanStack.set(runId, handle);\n return handle;\n }\n\n private closeSpan(runId: string, outputData?: unknown, error?: unknown): void {\n const handle = this.spanStack.get(runId);\n if (handle === undefined) return;\n this.spanStack.delete(runId);\n if (outputData !== undefined) {\n const wrapped = coerceStateValue(outputData);\n if (wrapped !== undefined) handle.span.output_data = wrapped;\n }\n if (error !== undefined) {\n handle.end(error);\n } else {\n handle.end();\n }\n }\n\n /* ---------------------------------------------------------------------- */\n /* Chain callbacks */\n /* ---------------------------------------------------------------------- */\n\n // NOTE: trailing `parentRunId`/`tags`/`metadata`/`runType`/`runName`\n // parameters from `CallbackHandlerSurface` are intentionally omitted below\n // (not just underscore-prefixed) — this adapter doesn't use them, and\n // TypeScript structural typing allows an implementing function to declare\n // fewer parameters than its interface signature. Declaring-then-ignoring\n // trailing unused params trips `@typescript-eslint/no-unused-vars`'s\n // default `args: \"after-used\"` mode (only params before the last *used*\n // one are exempt); omitting them entirely is both lint-clean and reads\n // as \"these truly aren't consulted.\"\n\n handleChainStart(chain: SerializedLike, inputs: Record<string, unknown>, runId: string): void {\n _handleChainStart(this, chain, inputs, runId);\n }\n\n handleChainEnd(outputs: Record<string, unknown>, runId: string): void {\n _handleChainEnd(this, outputs, runId);\n }\n\n handleChainError(err: unknown, runId: string): void {\n _handleChainError(this, err, runId);\n }\n\n /* ---------------------------------------------------------------------- */\n /* LLM callbacks */\n /* ---------------------------------------------------------------------- */\n\n handleLLMStart(\n llm: SerializedLike,\n prompts: string[],\n runId: string,\n _parentRunId?: string,\n extraParams?: Record<string, unknown>,\n ): void {\n _handleLLMStart(this, llm, prompts, runId, extraParams);\n }\n\n handleChatModelStart(\n llm: SerializedLike,\n messages: BaseMessageLike[][],\n runId: string,\n _parentRunId?: string,\n extraParams?: Record<string, unknown>,\n ): void {\n // Chat models ARE LLMs — same span type as handleLLMStart (mirrors\n // Python's LangGraph override; the plain-LangChain adapter treats both\n // identically since it has no chat-model-specific behavior to add).\n // MHQ-750: also decompose the flattened messages (+ bound tools, if\n // any) into context_segments — mirrors `../langgraph/`'s\n // handleChatModelStart wiring via the same shared decomposer.\n _handleChatModelStart(this, llm, messages, runId, extraParams);\n }\n\n handleLLMEnd(output: LLMResultLike, runId: string): void {\n _handleLLMEnd(this, output, runId);\n }\n\n handleLLMError(err: unknown, runId: string): void {\n _handleLLMError(this, err, runId);\n }\n\n /* ---------------------------------------------------------------------- */\n /* Tool callbacks */\n /* ---------------------------------------------------------------------- */\n\n handleToolStart(tool: SerializedLike, input: string, runId: string): void {\n _handleToolStart(this, tool, input, runId);\n }\n\n handleToolEnd(output: unknown, runId: string): void {\n _handleToolEnd(this, output, runId);\n }\n\n handleToolError(err: unknown, runId: string): void {\n _handleToolError(this, err, runId);\n }\n\n /* ---------------------------------------------------------------------- */\n /* Retriever callbacks (@beta — subject to change before SDK v1.0) */\n /* ---------------------------------------------------------------------- */\n\n handleRetrieverStart(retriever: SerializedLike, query: string, runId: string): void {\n _handleRetrieverStart(this, retriever, query, runId);\n }\n\n handleRetrieverEnd(documents: DocumentLike[], runId: string): void {\n _handleRetrieverEnd(this, documents, runId);\n }\n\n handleRetrieverError(err: unknown, runId: string): void {\n _handleRetrieverError(this, err, runId);\n }\n\n /* ---------------------------------------------------------------------- */\n /* Internal accessors used by the absorbErrorsSync-wrapped impls */\n /* ---------------------------------------------------------------------- */\n\n /** @internal */\n _openSpan(\n runId: string,\n name: string,\n type: \"agent\" | \"llm\" | \"tool\" | \"retriever\",\n inputData?: unknown,\n extraMetadata?: Record<string, unknown>,\n ): SpanHandle | null {\n return this.openSpan(runId, name, type, inputData, extraMetadata);\n }\n\n /** @internal */\n _closeSpan(runId: string, outputData?: unknown, error?: unknown): void {\n this.closeSpan(runId, outputData, error);\n }\n\n /** @internal */\n _getSpan(runId: string): SpanHandle | undefined {\n return this.spanStack.get(runId);\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* Implementation bodies (wrapped in absorbErrorsSync) */\n/* ------------------------------------------------------------------------ */\n\nconst _handleChainStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n chain: SerializedLike | null | undefined,\n inputs: Record<string, unknown>,\n runId: string,\n ): void => {\n const chainName = resolveNameIdFirst(chain, \"chain\");\n self._openSpan(runId, chainName, \"agent\", inputs);\n },\n { fingerprint: \"morse.langchain.handleChainStart\" },\n) as (\n self: MorseCallbackHandler,\n chain: SerializedLike | null | undefined,\n inputs: Record<string, unknown>,\n runId: string,\n) => void;\n\nconst _handleChainEnd = absorbErrorsSync(\n (self: MorseCallbackHandler, outputs: Record<string, unknown>, runId: string): void => {\n self._closeSpan(runId, outputs);\n },\n { fingerprint: \"morse.langchain.handleChainEnd\" },\n) as (self: MorseCallbackHandler, outputs: Record<string, unknown>, runId: string) => void;\n\nconst _handleChainError = absorbErrorsSync(\n (self: MorseCallbackHandler, err: unknown, runId: string): void => {\n self._closeSpan(runId, undefined, err ?? new Error(\"langchain chain error\"));\n },\n { fingerprint: \"morse.langchain.handleChainError\" },\n) as (self: MorseCallbackHandler, err: unknown, runId: string) => void;\n\nconst _handleLLMStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n llm: SerializedLike | null | undefined,\n prompts: string[],\n runId: string,\n extraParams: Record<string, unknown> | undefined,\n ): void => {\n const llmName = resolveNameIdFirst(llm, \"llm\");\n const invocationParams = extraParams?.invocation_params as Record<string, unknown> | undefined;\n const modelName =\n (typeof invocationParams?.model_name === \"string\"\n ? invocationParams.model_name\n : undefined) ??\n (typeof invocationParams?.model === \"string\" ? invocationParams.model : undefined);\n const handle = self._openSpan(\n runId,\n llmName,\n \"llm\",\n prompts && prompts.length > 0 ? { prompts } : undefined,\n );\n if (handle !== null && modelName) {\n handle.span.model = modelName;\n }\n },\n { fingerprint: \"morse.langchain.handleLLMStart\" },\n) as (\n self: MorseCallbackHandler,\n llm: SerializedLike | null | undefined,\n prompts: string[],\n runId: string,\n extraParams: Record<string, unknown> | undefined,\n) => void;\n\n/**\n * `@langchain/core` passes `handleChatModelStart` a nested\n * `BaseMessage[][]` — one array per \"prompt\" in a batch call. The\n * decomposer expects a flat list, so flatten one level (mirrors\n * `../langgraph/llm-and-tool-callbacks.ts`'s `flattenMessages`, itself a\n * port of Python's `_flatten_messages` in `adapters/langgraph.py`).\n */\nfunction flattenMessages(messages: BaseMessageLike[][] | undefined): BaseMessageLike[] {\n if (!Array.isArray(messages)) return [];\n const flat: BaseMessageLike[] = [];\n for (const item of messages) {\n if (Array.isArray(item)) {\n flat.push(...item);\n } else if (item !== undefined && item !== null) {\n flat.push(item as unknown as BaseMessageLike);\n }\n }\n return flat;\n}\n\n/** Extract the bound `tools` array from `handleChatModelStart`'s `extraParams.invocation_params`. */\nfunction toolsFromExtra(extra: Record<string, unknown> | undefined): unknown {\n const invocationParams = extra?.invocation_params as Record<string, unknown> | undefined;\n return invocationParams?.tools;\n}\n\nconst _handleChatModelStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n llm: SerializedLike | null | undefined,\n messages: BaseMessageLike[][],\n runId: string,\n extraParams: Record<string, unknown> | undefined,\n ): void => {\n const llmName = resolveNameIdFirst(llm, \"llm\");\n const invocationParams = extraParams?.invocation_params as Record<string, unknown> | undefined;\n const modelName =\n (typeof invocationParams?.model_name === \"string\"\n ? invocationParams.model_name\n : undefined) ??\n (typeof invocationParams?.model === \"string\" ? invocationParams.model : undefined);\n const flatMessages = flattenMessages(messages);\n const contextSegments = decomposeOpenAiMessages(flatMessages, toolsFromExtra(extraParams));\n const handle = self._openSpan(runId, llmName, \"llm\", undefined);\n if (handle !== null) {\n if (modelName) handle.span.model = modelName;\n if (contextSegments.length > 0) handle.span.context_segments = contextSegments;\n }\n },\n { fingerprint: \"morse.langchain.handleChatModelStart\" },\n) as (\n self: MorseCallbackHandler,\n llm: SerializedLike | null | undefined,\n messages: BaseMessageLike[][],\n runId: string,\n extraParams: Record<string, unknown> | undefined,\n) => void;\n\nconst _handleLLMEnd = absorbErrorsSync(\n (self: MorseCallbackHandler, response: LLMResultLike, runId: string): void => {\n const handle = self._getSpan(runId);\n const outputText = extractOutputText(response);\n\n if (handle !== undefined) {\n const usage = extractTokenUsage(response);\n if (usage.inputTokens !== undefined || usage.outputTokens !== undefined) {\n handle.span.input_tokens = usage.inputTokens;\n handle.span.output_tokens = usage.outputTokens;\n handle.span.total_tokens =\n usage.totalTokens !== undefined\n ? usage.totalTokens\n : (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0) || undefined;\n if (usage.cachedInputTokens) {\n handle.span.cached_input_tokens = usage.cachedInputTokens;\n }\n }\n // Response model wins over the invocation-param model set in\n // handleLLMStart — the response carries the fully-resolved version\n // string. Mirrors Python's on_llm_end behavior.\n const resolvedModel = extractModel(response);\n if (resolvedModel) {\n handle.span.model = resolvedModel;\n }\n // NOTE: cost computation (calculate_cost / merge_provider_reported_cost\n // in the Python adapter) intentionally omitted — no TS pricing module\n // exists yet (separate MHQ-482 gap). See file-header deviation notes.\n }\n\n self._closeSpan(runId, { text: outputText });\n },\n { fingerprint: \"morse.langchain.handleLLMEnd\" },\n) as (self: MorseCallbackHandler, response: LLMResultLike, runId: string) => void;\n\nconst _handleLLMError = absorbErrorsSync(\n (self: MorseCallbackHandler, err: unknown, runId: string): void => {\n self._closeSpan(runId, undefined, err ?? new Error(\"langchain llm error\"));\n },\n { fingerprint: \"morse.langchain.handleLLMError\" },\n) as (self: MorseCallbackHandler, err: unknown, runId: string) => void;\n\nconst _handleToolStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n tool: SerializedLike | null | undefined,\n input: string,\n runId: string,\n ): void => {\n const toolName = resolveNameNameFirst(tool, \"tool\");\n self._openSpan(runId, toolName, \"tool\", { input });\n },\n { fingerprint: \"morse.langchain.handleToolStart\" },\n) as (\n self: MorseCallbackHandler,\n tool: SerializedLike | null | undefined,\n input: string,\n runId: string,\n) => void;\n\nconst _handleToolEnd = absorbErrorsSync(\n (self: MorseCallbackHandler, output: unknown, runId: string): void => {\n self._closeSpan(runId, { output: String(output) });\n },\n { fingerprint: \"morse.langchain.handleToolEnd\" },\n) as (self: MorseCallbackHandler, output: unknown, runId: string) => void;\n\nconst _handleToolError = absorbErrorsSync(\n (self: MorseCallbackHandler, err: unknown, runId: string): void => {\n self._closeSpan(runId, undefined, err ?? new Error(\"langchain tool error\"));\n },\n { fingerprint: \"morse.langchain.handleToolError\" },\n) as (self: MorseCallbackHandler, err: unknown, runId: string) => void;\n\nconst _handleRetrieverStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n retriever: SerializedLike | null | undefined,\n query: string,\n runId: string,\n ): void => {\n const idPath = retriever?.id;\n const retrieverName =\n (Array.isArray(idPath) && idPath.length > 0 ? idPath[idPath.length - 1] : undefined) ||\n \"retriever\";\n self._openSpan(runId, String(retrieverName), \"retriever\", { query });\n },\n { fingerprint: \"morse.langchain.handleRetrieverStart\" },\n) as (\n self: MorseCallbackHandler,\n retriever: SerializedLike | null | undefined,\n query: string,\n runId: string,\n) => void;\n\nconst _handleRetrieverEnd = absorbErrorsSync(\n (self: MorseCallbackHandler, documents: DocumentLike[], runId: string): void => {\n const docsOut: Array<{ content_preview: string; source?: string; score?: number }> = [];\n for (const doc of documents ?? []) {\n if (doc && typeof doc === \"object\" && typeof doc.pageContent === \"string\") {\n const entry: { content_preview: string; source?: string; score?: number } = {\n content_preview: doc.pageContent.slice(0, 200),\n };\n const meta = doc.metadata;\n if (meta) {\n if (typeof meta.source === \"string\") entry.source = meta.source;\n const score = meta.score ?? meta.relevance_score;\n if (typeof score === \"number\") entry.score = score;\n }\n docsOut.push(entry);\n } else if (doc && typeof doc === \"object\") {\n docsOut.push(\n doc as unknown as { content_preview: string; source?: string; score?: number },\n );\n }\n }\n self._closeSpan(runId, {\n docs_count: documents?.length ?? 0,\n top_score: docsOut.length > 0 ? (docsOut[0]?.score ?? null) : null,\n sources: docsOut\n .map((d) => d.source)\n .filter((s): s is string => typeof s === \"string\" && s.length > 0),\n documents: docsOut.slice(0, 10),\n });\n },\n { fingerprint: \"morse.langchain.handleRetrieverEnd\" },\n) as (self: MorseCallbackHandler, documents: DocumentLike[], runId: string) => void;\n\nconst _handleRetrieverError = absorbErrorsSync(\n (self: MorseCallbackHandler, err: unknown, runId: string): void => {\n self._closeSpan(runId, undefined, err ?? new Error(\"langchain retriever error\"));\n },\n { fingerprint: \"morse.langchain.handleRetrieverError\" },\n) as (self: MorseCallbackHandler, err: unknown, runId: string) => void;\n\n/* ------------------------------------------------------------------------ */\n/* Optional peer-dep: real BaseCallbackHandler */\n/* ------------------------------------------------------------------------ */\n\nasync function loadLangChainCoreCallbacks(): Promise<LangChainCoreCallbacksModuleLike | null> {\n try {\n // Function-eval'd dynamic import keeps bundlers from trying to resolve\n // `@langchain/core/callbacks/base` at build time when the dep isn't installed.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mod = (await (Function(\"m\", \"return import(m)\") as any)(\n \"@langchain/core/callbacks/base\",\n )) as LangChainCoreCallbacksModuleLike;\n return mod ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Best-effort: if `@langchain/core/callbacks/base` is installed at runtime,\n * return a `MorseCallbackHandler`-shaped class whose prototype chain\n * includes the real `BaseCallbackHandler` (for users relying on\n * `instanceof BaseCallbackHandler` checks). Otherwise return the duck-typed\n * `MorseCallbackHandler` defined above. Mirrors `../langgraph/callback-handler.ts`'s\n * `getCallbackHandlerClass()`.\n */\nexport async function getCallbackHandlerClass(): Promise<typeof MorseCallbackHandler> {\n const mod = await loadLangChainCoreCallbacks();\n const Base = mod?.BaseCallbackHandler;\n if (!Base) return MorseCallbackHandler;\n\n class MorseCallbackHandlerWithBase extends (Base as unknown as {\n new (...args: unknown[]): object;\n }) {\n public readonly name: string = HANDLER_NAME;\n private readonly _av: MorseCallbackHandler;\n constructor(options?: MorseCallbackHandlerOptions) {\n super();\n this._av = new MorseCallbackHandler(options);\n }\n handleChainStart(chain: SerializedLike, inputs: Record<string, unknown>, runId: string): void {\n this._av.handleChainStart(chain, inputs, runId);\n }\n handleChainEnd(outputs: Record<string, unknown>, runId: string): void {\n this._av.handleChainEnd(outputs, runId);\n }\n handleChainError(err: unknown, runId: string): void {\n this._av.handleChainError(err, runId);\n }\n handleLLMStart(\n llm: SerializedLike,\n prompts: string[],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, unknown>,\n ): void {\n this._av.handleLLMStart(llm, prompts, runId, parentRunId, extraParams);\n }\n handleChatModelStart(\n llm: SerializedLike,\n messages: BaseMessageLike[][],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, unknown>,\n ): void {\n this._av.handleChatModelStart(llm, messages, runId, parentRunId, extraParams);\n }\n handleLLMEnd(output: LLMResultLike, runId: string): void {\n this._av.handleLLMEnd(output, runId);\n }\n handleLLMError(err: unknown, runId: string): void {\n this._av.handleLLMError(err, runId);\n }\n handleToolStart(tool: SerializedLike, input: string, runId: string): void {\n this._av.handleToolStart(tool, input, runId);\n }\n handleToolEnd(output: unknown, runId: string): void {\n this._av.handleToolEnd(output, runId);\n }\n handleToolError(err: unknown, runId: string): void {\n this._av.handleToolError(err, runId);\n }\n handleRetrieverStart(retriever: SerializedLike, query: string, runId: string): void {\n this._av.handleRetrieverStart(retriever, query, runId);\n }\n handleRetrieverEnd(documents: DocumentLike[], runId: string): void {\n this._av.handleRetrieverEnd(documents, runId);\n }\n handleRetrieverError(err: unknown, runId: string): void {\n this._av.handleRetrieverError(err, runId);\n }\n }\n return MorseCallbackHandlerWithBase as unknown as typeof MorseCallbackHandler;\n}\n"]}
1
+ {"version":3,"sources":["../../../src/langchain/callback-handler.ts"],"names":["tokenUsage","model"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * `@morsehq-dev/sdk/langchain` — `MorseCallbackHandler` for plain LangChain\n * (chains, LLMs, tools, retrievers). Port of\n * `apps/sdk/python/src/morse_ai/adapters/langchain.py` (MHQ-482).\n *\n * Usage:\n *\n * ```ts\n * import { MorseCallbackHandler } from \"@morsehq-dev/sdk/langchain\";\n * import { runAsync } from \"@morsehq-dev/sdk\"; // or morse.run()\n *\n * const handler = new MorseCallbackHandler({ agentName: \"my-agent\" });\n * await runAsync({ agentName: \"my-agent\" }, async () => {\n * await chain.invoke(input, { callbacks: [handler] });\n * });\n * ```\n *\n * Span mapping (mirrors the Python adapter):\n * - handleChainStart / handleChainEnd / handleChainError → `type=agent`\n * - handleLLMStart / handleChatModelStart / handleLLMEnd / handleLLMError → `type=llm`\n * - handleToolStart / handleToolEnd / handleToolError → `type=tool`\n * - handleRetrieverStart / handleRetrieverEnd / handleRetrieverError (@beta)\n * → `type=retriever`\n *\n * ## Deviations from the Python adapter (see PR report for full rationale)\n *\n * 1. **No auto-trace creation.** Python's `MorseCallbackHandler` calls\n * `morse_ai.tracing.run(...)` itself when no trace is active (contextvars\n * support manually entering/exiting a context across independent callback\n * invocations). The TS SDK's trace context is `AsyncLocalStorage`-based\n * (`_internal/tracing.ts`), which only supports the `als.run(store, fn)`\n * callback shape — there is no way to open a trace and leave it open\n * across separate, unwrapped callback calls. Callers MUST wrap the\n * LangChain invocation in `morse.run()` / `runAsync()`. This mirrors the\n * constraint the existing `../langgraph/` adapter already operates under\n * (see its file-header comments) — every span helper silently no-ops\n * (returns `null`) when there is no active trace, exactly like this file.\n * 2. **No structural subclass relationship with `../langgraph/`.** The task\n * brief notes that Python's `langgraph.py::LangGraphCallbackHandler`\n * subclasses `langchain.py::MorseCallbackHandler`. `@langchain/core`'s\n * `BaseCallbackHandler` surface is identical for plain chains and for\n * LangGraph graphs (LangGraph JS is built on `@langchain/core`\n * callbacks), so structurally the two TS adapters COULD share a base.\n * But the existing `../langgraph/` files are off-limits for this task\n * (a separate, already-shipped gap) and refactoring them to extract a\n * shared base is out of scope / higher risk than the value it buys right\n * now. This adapter is therefore a structural sibling, not a subclass —\n * same conventions (span-emission via `startSpan`, `absorbErrorsSync`\n * everywhere, `metadata.adapter` tagging), independently implemented.\n * 3. **No cost computation.** Python's `on_llm_end` calls\n * `morse_ai.pricing.calculate_cost` and `merge_provider_reported_cost`.\n * Neither has a TS port yet (owned by a separate parallel MHQ-482 gap).\n * Token counts/model are still captured; `cost_usd` is left unset until\n * the pricing gap lands.\n * 4. **`type=retriever` uses a real, added `SpanType` variant** (see\n * `_internal/spans.ts`) rather than the `type=tool` +\n * `metadata.tool_kind` fallback pattern used for `hook`/`subagent` — the\n * backend already accepts `\"retriever\"` (Python's `SpanType.RETRIEVER`\n * has shipped since the Python adapter), so no fallback is needed.\n *\n * All public methods absorb internal errors (never throw into the LangChain\n * runtime) — mirrors Python's `try/except Exception: logger.debug(...)`\n * wrapping on every callback.\n */\n\nimport { absorbErrorsSync } from \"../_internal/errors\";\nimport type { SpanHandle } from \"../_internal/tracing\";\nimport { adoptThreadId, startSpan } from \"../_internal/tracing\";\nimport { decomposeOpenAiMessages } from \"../_agent-sdk-common/context-decomposer\";\nimport type {\n BaseMessageLike,\n CallbackHandlerSurface,\n DocumentLike,\n LangChainCoreCallbacksModuleLike,\n LLMResultLike,\n SerializedLike,\n} from \"./types\";\n\n/* ------------------------------------------------------------------------ */\n/* Constants */\n/* ------------------------------------------------------------------------ */\n\nconst ADAPTER = \"langchain-js\" as const;\nconst HANDLER_NAME = \"morse_callback_handler\";\nconst DEFAULT_AGENT_NAME = \"langchain-agent\";\n\n// AGE-260 port: cap on the JSON-serialized size of any single input_data /\n// output_data payload. Mirrors the Python adapter's `_MAX_STATE_PAYLOAD_BYTES`.\nconst MAX_STATE_PAYLOAD_BYTES = 64 * 1024; // 64 KB JSON\n\n/* ------------------------------------------------------------------------ */\n/* Public options */\n/* ------------------------------------------------------------------------ */\n\nexport interface MorseCallbackHandlerOptions {\n /** Falls back to `\"langchain-agent\"` when unset. Only used for documentation\n * purposes on this handler instance — the actual trace's agent name is set\n * by whatever `morse.run()` / `runAsync()` call wraps the invocation. */\n agentName?: string;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Name resolution helpers */\n/* ------------------------------------------------------------------------ */\n\n/** chain/llm: prefer `id` path tail, then `name`, then `fallback`. */\nfunction resolveNameIdFirst(\n serialized: SerializedLike | null | undefined,\n fallback: string,\n): string {\n const s = serialized ?? {};\n const idPath = s.id;\n if (Array.isArray(idPath) && idPath.length > 0) {\n const last = idPath[idPath.length - 1];\n if (typeof last === \"string\" && last.length > 0) return last;\n }\n if (typeof s.name === \"string\" && s.name.length > 0) return s.name;\n return fallback;\n}\n\n/** tool: prefer `name`, then `id` path tail, then `fallback`. */\nfunction resolveNameNameFirst(\n serialized: SerializedLike | null | undefined,\n fallback: string,\n): string {\n const s = serialized ?? {};\n if (typeof s.name === \"string\" && s.name.length > 0) return s.name;\n const idPath = s.id;\n if (Array.isArray(idPath) && idPath.length > 0) {\n const last = idPath[idPath.length - 1];\n if (typeof last === \"string\" && last.length > 0) return last;\n }\n return fallback;\n}\n\n/* ------------------------------------------------------------------------ */\n/* State coercion — port of Python's `_ensure_dict` */\n/* ------------------------------------------------------------------------ */\n\nfunction utf8ByteLength(s: string): number {\n if (typeof TextEncoder !== \"undefined\") return new TextEncoder().encode(s).length;\n // Rough fallback — good enough for a soft cap, never load-bearing for\n // correctness (only used to decide whether to truncate).\n return s.length;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return false;\n const proto: unknown = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Coerce arbitrary LangChain chain/tool/retriever input or output into a\n * dict payload the wire schema requires (`SpanData.input_data` /\n * `output_data`). Port of Python's `MorseCallbackHandler._ensure_dict`:\n *\n * - `null` / `undefined` → `undefined` (legitimately absent)\n * - plain object → unchanged\n * - object with a callable `toJSON()` returning a plain object → that result\n * (JS analogue of Python's Pydantic `model_dump()` / `dict()` duck typing)\n * - other (string / number / array / class instance) → `{ value: String(x) }`\n *\n * Oversized payloads (JSON > `MAX_STATE_PAYLOAD_BYTES`) are replaced with a\n * truncation marker so the transport queue stays bounded but the dashboard\n * still shows a usable preview — never silently dropped to `undefined`.\n */\nexport function coerceStateValue(data: unknown): Record<string, unknown> | undefined {\n if (data === null || data === undefined) return undefined;\n\n let coerced: Record<string, unknown>;\n if (isPlainObject(data)) {\n coerced = data;\n } else {\n const toJSON = (data as { toJSON?: unknown }).toJSON;\n let viaToJSON: Record<string, unknown> | null = null;\n if (typeof toJSON === \"function\") {\n try {\n const result: unknown = (toJSON as () => unknown).call(data);\n if (isPlainObject(result)) viaToJSON = result;\n } catch {\n viaToJSON = null;\n }\n }\n if (viaToJSON !== null) {\n coerced = viaToJSON;\n } else if (Array.isArray(data)) {\n coerced = { value: safeStringify(data) };\n } else {\n coerced = { value: String(data) };\n }\n }\n\n let encoded: string;\n try {\n encoded = JSON.stringify(coerced) ?? \"null\";\n } catch {\n return {\n _truncated: true,\n _reason: \"unserializable\",\n value: String(coerced).slice(0, 1024),\n };\n }\n\n const byteLen = utf8ByteLength(encoded);\n if (byteLen > MAX_STATE_PAYLOAD_BYTES) {\n const preview = encoded.slice(0, Math.floor(MAX_STATE_PAYLOAD_BYTES / 2));\n return {\n _truncated: true,\n _reason: \"payload_too_large\",\n _original_size_bytes: byteLen,\n _max_bytes: MAX_STATE_PAYLOAD_BYTES,\n preview,\n };\n }\n\n return coerced;\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* LLM response extraction — port of `_extract_token_usage` / `_extract_model` */\n/* ------------------------------------------------------------------------ */\n\nexport interface TokenUsage {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n cachedInputTokens?: number;\n}\n\nfunction numOrUndef(v: unknown): number | undefined {\n return typeof v === \"number\" && Number.isFinite(v) ? v : undefined;\n}\n\nfunction firstGenerationMessage(\n response: LLMResultLike | null | undefined,\n): BaseMessageLike | undefined {\n const gens = response?.generations;\n if (Array.isArray(gens) && gens.length > 0 && Array.isArray(gens[0]) && gens[0]!.length > 0) {\n return gens[0]![0]!.message;\n }\n return undefined;\n}\n\n/**\n * Returns token usage across the provider shapes LangChain JS integrations\n * use in practice. Field names below are snake_case because — unlike most\n * of the JS ecosystem — `@langchain/core`'s `usage_metadata` /\n * `response_metadata` fields ARE snake_case (verified against\n * `@langchain/core/dist/messages/ai.d.ts`), matching the Python SDK 1:1.\n * `llmOutput` is a free-form provider bag; we also check the camelCase\n * `tokenUsage` key the existing `../langgraph/` adapter established.\n */\nexport function extractTokenUsage(response: LLMResultLike | null | undefined): TokenUsage {\n try {\n const msg = firstGenerationMessage(response);\n if (msg) {\n const um = msg.usage_metadata;\n if (um && (um.input_tokens !== undefined || um.output_tokens !== undefined)) {\n const details = um.input_token_details ?? {};\n const cached = details.cache_read ?? details.cache_creation;\n return {\n inputTokens: numOrUndef(um.input_tokens),\n outputTokens: numOrUndef(um.output_tokens),\n totalTokens: numOrUndef(um.total_tokens),\n cachedInputTokens: numOrUndef(cached),\n };\n }\n const tokenUsage = msg.response_metadata?.token_usage;\n if (tokenUsage) {\n return {\n inputTokens: numOrUndef(tokenUsage.prompt_tokens ?? tokenUsage.input_tokens),\n outputTokens: numOrUndef(tokenUsage.completion_tokens ?? tokenUsage.output_tokens),\n totalTokens: numOrUndef(tokenUsage.total_tokens),\n };\n }\n }\n } catch {\n // fall through to llmOutput-based extraction\n }\n\n const llmOutput = response?.llmOutput ?? {};\n const tokenUsage = (llmOutput.tokenUsage ?? llmOutput.token_usage) as\n | Record<string, unknown>\n | undefined;\n if (tokenUsage && Object.keys(tokenUsage).length > 0) {\n return {\n inputTokens: numOrUndef(\n tokenUsage.promptTokens ??\n tokenUsage.prompt_tokens ??\n tokenUsage.inputTokens ??\n tokenUsage.input_tokens,\n ),\n outputTokens: numOrUndef(\n tokenUsage.completionTokens ??\n tokenUsage.completion_tokens ??\n tokenUsage.outputTokens ??\n tokenUsage.output_tokens,\n ),\n totalTokens: numOrUndef(tokenUsage.totalTokens ?? tokenUsage.total_tokens),\n };\n }\n\n const usage = llmOutput.usage as Record<string, unknown> | undefined;\n if (usage && Object.keys(usage).length > 0) {\n return {\n inputTokens: numOrUndef(usage.input_tokens),\n outputTokens: numOrUndef(usage.output_tokens),\n totalTokens: numOrUndef(usage.total_tokens),\n cachedInputTokens: numOrUndef(usage.cache_read_input_tokens),\n };\n }\n\n return {};\n}\n\n/** Best-effort model-name extraction from an `LLMResult`. */\nexport function extractModel(response: LLMResultLike | null | undefined): string | undefined {\n try {\n const msg = firstGenerationMessage(response);\n const meta = msg?.response_metadata;\n const model = meta?.model_name ?? meta?.model;\n if (typeof model === \"string\" && model.length > 0) return model;\n } catch {\n // fall through\n }\n const llmOutput = response?.llmOutput ?? {};\n const model = llmOutput.model_name ?? llmOutput.model;\n return typeof model === \"string\" && model.length > 0 ? model : undefined;\n}\n\n/** Best-effort output-text extraction from an `LLMResult`, for `output_data.text`. */\nexport function extractOutputText(response: LLMResultLike | null | undefined): string {\n try {\n const gens = response?.generations;\n if (Array.isArray(gens) && gens.length > 0 && Array.isArray(gens[0]) && gens[0]!.length > 0) {\n const first = gens[0]![0]!;\n if (typeof first.text === \"string\" && first.text.length > 0) return first.text;\n const content = first.message?.content;\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n const parts: string[] = [];\n for (const block of content) {\n if (typeof block === \"string\") {\n parts.push(block);\n } else if (\n block &&\n typeof block === \"object\" &&\n typeof (block as Record<string, unknown>).text === \"string\"\n ) {\n parts.push((block as Record<string, unknown>).text as string);\n }\n }\n return parts.join(\"\\n\");\n }\n }\n } catch {\n // fall through\n }\n return \"\";\n}\n\n/* ------------------------------------------------------------------------ */\n/* MorseCallbackHandler */\n/* ------------------------------------------------------------------------ */\n\nexport class MorseCallbackHandler implements CallbackHandlerSurface {\n /** Required by LangChain's `BaseCallbackHandler` interface. */\n public readonly name: string = HANDLER_NAME;\n\n public readonly agentName: string;\n\n /** Map of `runId` → open `SpanHandle`, spanning chain/llm/tool/retriever\n * spans together (mirrors Python's single `_span_stack` dict). */\n private readonly spanStack: Map<string, SpanHandle> = new Map();\n\n constructor(options?: MorseCallbackHandlerOptions) {\n this.agentName =\n options?.agentName && options.agentName.length > 0 ? options.agentName : DEFAULT_AGENT_NAME;\n }\n\n /* ---------------------------------------------------------------------- */\n /* Internal helpers */\n /* ---------------------------------------------------------------------- */\n\n private openSpan(\n runId: string,\n name: string,\n type: \"agent\" | \"llm\" | \"tool\" | \"retriever\",\n inputData?: unknown,\n extraMetadata?: Record<string, unknown>,\n ): SpanHandle | null {\n if (typeof runId !== \"string\" || runId.length === 0) return null;\n const metadata: Record<string, unknown> = { ...(extraMetadata ?? {}), adapter: ADAPTER };\n const handle = startSpan({ name, type, metadata });\n if (handle === null) return null;\n const wrapped = coerceStateValue(inputData);\n if (wrapped !== undefined) handle.span.input_data = wrapped;\n this.spanStack.set(runId, handle);\n return handle;\n }\n\n private closeSpan(runId: string, outputData?: unknown, error?: unknown): void {\n const handle = this.spanStack.get(runId);\n if (handle === undefined) return;\n this.spanStack.delete(runId);\n if (outputData !== undefined) {\n const wrapped = coerceStateValue(outputData);\n if (wrapped !== undefined) handle.span.output_data = wrapped;\n }\n if (error !== undefined) {\n handle.end(error);\n } else {\n handle.end();\n }\n }\n\n /* ---------------------------------------------------------------------- */\n /* Chain callbacks */\n /* ---------------------------------------------------------------------- */\n\n // NOTE: trailing `runType`/`runName` parameters from\n // `CallbackHandlerSurface` are intentionally omitted below (not just\n // underscore-prefixed) — this adapter doesn't use them, and TypeScript\n // structural typing allows an implementing function to declare fewer\n // parameters than its interface signature. Declaring-then-ignoring\n // trailing unused params trips `@typescript-eslint/no-unused-vars`'s\n // default `args: \"after-used\"` mode (only params before the last *used*\n // one are exempt); omitting them entirely is both lint-clean and reads\n // as \"these truly aren't consulted.\" `metadata` IS consulted as of\n // MHQ-1029, so it and the params before it are declared.\n\n handleChainStart(\n chain: SerializedLike,\n inputs: Record<string, unknown>,\n runId: string,\n _parentRunId?: string,\n _tags?: string[],\n metadata?: Record<string, unknown>,\n ): void {\n _handleChainStart(this, chain, inputs, runId, metadata);\n }\n\n handleChainEnd(outputs: Record<string, unknown>, runId: string): void {\n _handleChainEnd(this, outputs, runId);\n }\n\n handleChainError(err: unknown, runId: string): void {\n _handleChainError(this, err, runId);\n }\n\n /* ---------------------------------------------------------------------- */\n /* LLM callbacks */\n /* ---------------------------------------------------------------------- */\n\n handleLLMStart(\n llm: SerializedLike,\n prompts: string[],\n runId: string,\n _parentRunId?: string,\n extraParams?: Record<string, unknown>,\n ): void {\n _handleLLMStart(this, llm, prompts, runId, extraParams);\n }\n\n handleChatModelStart(\n llm: SerializedLike,\n messages: BaseMessageLike[][],\n runId: string,\n _parentRunId?: string,\n extraParams?: Record<string, unknown>,\n ): void {\n // Chat models ARE LLMs — same span type as handleLLMStart (mirrors\n // Python's LangGraph override; the plain-LangChain adapter treats both\n // identically since it has no chat-model-specific behavior to add).\n // MHQ-750: also decompose the flattened messages (+ bound tools, if\n // any) into context_segments — mirrors `../langgraph/`'s\n // handleChatModelStart wiring via the same shared decomposer.\n _handleChatModelStart(this, llm, messages, runId, extraParams);\n }\n\n handleLLMEnd(output: LLMResultLike, runId: string): void {\n _handleLLMEnd(this, output, runId);\n }\n\n handleLLMError(err: unknown, runId: string): void {\n _handleLLMError(this, err, runId);\n }\n\n /* ---------------------------------------------------------------------- */\n /* Tool callbacks */\n /* ---------------------------------------------------------------------- */\n\n handleToolStart(tool: SerializedLike, input: string, runId: string): void {\n _handleToolStart(this, tool, input, runId);\n }\n\n handleToolEnd(output: unknown, runId: string): void {\n _handleToolEnd(this, output, runId);\n }\n\n handleToolError(err: unknown, runId: string): void {\n _handleToolError(this, err, runId);\n }\n\n /* ---------------------------------------------------------------------- */\n /* Retriever callbacks (@beta — subject to change before SDK v1.0) */\n /* ---------------------------------------------------------------------- */\n\n handleRetrieverStart(retriever: SerializedLike, query: string, runId: string): void {\n _handleRetrieverStart(this, retriever, query, runId);\n }\n\n handleRetrieverEnd(documents: DocumentLike[], runId: string): void {\n _handleRetrieverEnd(this, documents, runId);\n }\n\n handleRetrieverError(err: unknown, runId: string): void {\n _handleRetrieverError(this, err, runId);\n }\n\n /* ---------------------------------------------------------------------- */\n /* Internal accessors used by the absorbErrorsSync-wrapped impls */\n /* ---------------------------------------------------------------------- */\n\n /** @internal */\n _openSpan(\n runId: string,\n name: string,\n type: \"agent\" | \"llm\" | \"tool\" | \"retriever\",\n inputData?: unknown,\n extraMetadata?: Record<string, unknown>,\n ): SpanHandle | null {\n return this.openSpan(runId, name, type, inputData, extraMetadata);\n }\n\n /** @internal */\n _closeSpan(runId: string, outputData?: unknown, error?: unknown): void {\n this.closeSpan(runId, outputData, error);\n }\n\n /** @internal */\n _getSpan(runId: string): SpanHandle | undefined {\n return this.spanStack.get(runId);\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* Implementation bodies (wrapped in absorbErrorsSync) */\n/* ------------------------------------------------------------------------ */\n\nconst _handleChainStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n chain: SerializedLike | null | undefined,\n inputs: Record<string, unknown>,\n runId: string,\n metadata?: Record<string, unknown>,\n ): void => {\n const chainName = resolveNameIdFirst(chain, \"chain\");\n self._openSpan(runId, chainName, \"agent\", inputs);\n // MHQ-1029: LangGraph copies `configurable.thread_id` onto the run\n // metadata, which is the only place a checkpointed conversation's\n // identity reaches a callback handler.\n if (metadata) adoptThreadId(metadata.thread_id ?? metadata.threadId);\n },\n { fingerprint: \"morse.langchain.handleChainStart\" },\n) as (\n self: MorseCallbackHandler,\n chain: SerializedLike | null | undefined,\n inputs: Record<string, unknown>,\n runId: string,\n metadata?: Record<string, unknown>,\n) => void;\n\nconst _handleChainEnd = absorbErrorsSync(\n (self: MorseCallbackHandler, outputs: Record<string, unknown>, runId: string): void => {\n self._closeSpan(runId, outputs);\n },\n { fingerprint: \"morse.langchain.handleChainEnd\" },\n) as (self: MorseCallbackHandler, outputs: Record<string, unknown>, runId: string) => void;\n\nconst _handleChainError = absorbErrorsSync(\n (self: MorseCallbackHandler, err: unknown, runId: string): void => {\n self._closeSpan(runId, undefined, err ?? new Error(\"langchain chain error\"));\n },\n { fingerprint: \"morse.langchain.handleChainError\" },\n) as (self: MorseCallbackHandler, err: unknown, runId: string) => void;\n\nconst _handleLLMStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n llm: SerializedLike | null | undefined,\n prompts: string[],\n runId: string,\n extraParams: Record<string, unknown> | undefined,\n ): void => {\n const llmName = resolveNameIdFirst(llm, \"llm\");\n const invocationParams = extraParams?.invocation_params as Record<string, unknown> | undefined;\n const modelName =\n (typeof invocationParams?.model_name === \"string\"\n ? invocationParams.model_name\n : undefined) ??\n (typeof invocationParams?.model === \"string\" ? invocationParams.model : undefined);\n const handle = self._openSpan(\n runId,\n llmName,\n \"llm\",\n prompts && prompts.length > 0 ? { prompts } : undefined,\n );\n if (handle !== null && modelName) {\n handle.span.model = modelName;\n }\n },\n { fingerprint: \"morse.langchain.handleLLMStart\" },\n) as (\n self: MorseCallbackHandler,\n llm: SerializedLike | null | undefined,\n prompts: string[],\n runId: string,\n extraParams: Record<string, unknown> | undefined,\n) => void;\n\n/**\n * `@langchain/core` passes `handleChatModelStart` a nested\n * `BaseMessage[][]` — one array per \"prompt\" in a batch call. The\n * decomposer expects a flat list, so flatten one level (mirrors\n * `../langgraph/llm-and-tool-callbacks.ts`'s `flattenMessages`, itself a\n * port of Python's `_flatten_messages` in `adapters/langgraph.py`).\n */\nfunction flattenMessages(messages: BaseMessageLike[][] | undefined): BaseMessageLike[] {\n if (!Array.isArray(messages)) return [];\n const flat: BaseMessageLike[] = [];\n for (const item of messages) {\n if (Array.isArray(item)) {\n flat.push(...item);\n } else if (item !== undefined && item !== null) {\n flat.push(item as unknown as BaseMessageLike);\n }\n }\n return flat;\n}\n\n/** Extract the bound `tools` array from `handleChatModelStart`'s `extraParams.invocation_params`. */\nfunction toolsFromExtra(extra: Record<string, unknown> | undefined): unknown {\n const invocationParams = extra?.invocation_params as Record<string, unknown> | undefined;\n return invocationParams?.tools;\n}\n\nconst _handleChatModelStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n llm: SerializedLike | null | undefined,\n messages: BaseMessageLike[][],\n runId: string,\n extraParams: Record<string, unknown> | undefined,\n ): void => {\n const llmName = resolveNameIdFirst(llm, \"llm\");\n const invocationParams = extraParams?.invocation_params as Record<string, unknown> | undefined;\n const modelName =\n (typeof invocationParams?.model_name === \"string\"\n ? invocationParams.model_name\n : undefined) ??\n (typeof invocationParams?.model === \"string\" ? invocationParams.model : undefined);\n const flatMessages = flattenMessages(messages);\n const contextSegments = decomposeOpenAiMessages(flatMessages, toolsFromExtra(extraParams));\n const handle = self._openSpan(runId, llmName, \"llm\", undefined);\n if (handle !== null) {\n if (modelName) handle.span.model = modelName;\n if (contextSegments.length > 0) handle.span.context_segments = contextSegments;\n }\n },\n { fingerprint: \"morse.langchain.handleChatModelStart\" },\n) as (\n self: MorseCallbackHandler,\n llm: SerializedLike | null | undefined,\n messages: BaseMessageLike[][],\n runId: string,\n extraParams: Record<string, unknown> | undefined,\n) => void;\n\nconst _handleLLMEnd = absorbErrorsSync(\n (self: MorseCallbackHandler, response: LLMResultLike, runId: string): void => {\n const handle = self._getSpan(runId);\n const outputText = extractOutputText(response);\n\n if (handle !== undefined) {\n const usage = extractTokenUsage(response);\n if (usage.inputTokens !== undefined || usage.outputTokens !== undefined) {\n handle.span.input_tokens = usage.inputTokens;\n handle.span.output_tokens = usage.outputTokens;\n handle.span.total_tokens =\n usage.totalTokens !== undefined\n ? usage.totalTokens\n : (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0) || undefined;\n if (usage.cachedInputTokens) {\n handle.span.cached_input_tokens = usage.cachedInputTokens;\n }\n }\n // Response model wins over the invocation-param model set in\n // handleLLMStart — the response carries the fully-resolved version\n // string. Mirrors Python's on_llm_end behavior.\n const resolvedModel = extractModel(response);\n if (resolvedModel) {\n handle.span.model = resolvedModel;\n }\n // NOTE: cost computation (calculate_cost / merge_provider_reported_cost\n // in the Python adapter) intentionally omitted — no TS pricing module\n // exists yet (separate MHQ-482 gap). See file-header deviation notes.\n }\n\n self._closeSpan(runId, { text: outputText });\n },\n { fingerprint: \"morse.langchain.handleLLMEnd\" },\n) as (self: MorseCallbackHandler, response: LLMResultLike, runId: string) => void;\n\nconst _handleLLMError = absorbErrorsSync(\n (self: MorseCallbackHandler, err: unknown, runId: string): void => {\n self._closeSpan(runId, undefined, err ?? new Error(\"langchain llm error\"));\n },\n { fingerprint: \"morse.langchain.handleLLMError\" },\n) as (self: MorseCallbackHandler, err: unknown, runId: string) => void;\n\nconst _handleToolStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n tool: SerializedLike | null | undefined,\n input: string,\n runId: string,\n ): void => {\n const toolName = resolveNameNameFirst(tool, \"tool\");\n self._openSpan(runId, toolName, \"tool\", { input });\n },\n { fingerprint: \"morse.langchain.handleToolStart\" },\n) as (\n self: MorseCallbackHandler,\n tool: SerializedLike | null | undefined,\n input: string,\n runId: string,\n) => void;\n\nconst _handleToolEnd = absorbErrorsSync(\n (self: MorseCallbackHandler, output: unknown, runId: string): void => {\n self._closeSpan(runId, { output: String(output) });\n },\n { fingerprint: \"morse.langchain.handleToolEnd\" },\n) as (self: MorseCallbackHandler, output: unknown, runId: string) => void;\n\nconst _handleToolError = absorbErrorsSync(\n (self: MorseCallbackHandler, err: unknown, runId: string): void => {\n self._closeSpan(runId, undefined, err ?? new Error(\"langchain tool error\"));\n },\n { fingerprint: \"morse.langchain.handleToolError\" },\n) as (self: MorseCallbackHandler, err: unknown, runId: string) => void;\n\nconst _handleRetrieverStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n retriever: SerializedLike | null | undefined,\n query: string,\n runId: string,\n ): void => {\n const idPath = retriever?.id;\n const retrieverName =\n (Array.isArray(idPath) && idPath.length > 0 ? idPath[idPath.length - 1] : undefined) ||\n \"retriever\";\n self._openSpan(runId, String(retrieverName), \"retriever\", { query });\n },\n { fingerprint: \"morse.langchain.handleRetrieverStart\" },\n) as (\n self: MorseCallbackHandler,\n retriever: SerializedLike | null | undefined,\n query: string,\n runId: string,\n) => void;\n\nconst _handleRetrieverEnd = absorbErrorsSync(\n (self: MorseCallbackHandler, documents: DocumentLike[], runId: string): void => {\n const docsOut: Array<{ content_preview: string; source?: string; score?: number }> = [];\n for (const doc of documents ?? []) {\n if (doc && typeof doc === \"object\" && typeof doc.pageContent === \"string\") {\n const entry: { content_preview: string; source?: string; score?: number } = {\n content_preview: doc.pageContent.slice(0, 200),\n };\n const meta = doc.metadata;\n if (meta) {\n if (typeof meta.source === \"string\") entry.source = meta.source;\n const score = meta.score ?? meta.relevance_score;\n if (typeof score === \"number\") entry.score = score;\n }\n docsOut.push(entry);\n } else if (doc && typeof doc === \"object\") {\n docsOut.push(\n doc as unknown as { content_preview: string; source?: string; score?: number },\n );\n }\n }\n self._closeSpan(runId, {\n docs_count: documents?.length ?? 0,\n top_score: docsOut.length > 0 ? (docsOut[0]?.score ?? null) : null,\n sources: docsOut\n .map((d) => d.source)\n .filter((s): s is string => typeof s === \"string\" && s.length > 0),\n documents: docsOut.slice(0, 10),\n });\n },\n { fingerprint: \"morse.langchain.handleRetrieverEnd\" },\n) as (self: MorseCallbackHandler, documents: DocumentLike[], runId: string) => void;\n\nconst _handleRetrieverError = absorbErrorsSync(\n (self: MorseCallbackHandler, err: unknown, runId: string): void => {\n self._closeSpan(runId, undefined, err ?? new Error(\"langchain retriever error\"));\n },\n { fingerprint: \"morse.langchain.handleRetrieverError\" },\n) as (self: MorseCallbackHandler, err: unknown, runId: string) => void;\n\n/* ------------------------------------------------------------------------ */\n/* Optional peer-dep: real BaseCallbackHandler */\n/* ------------------------------------------------------------------------ */\n\nasync function loadLangChainCoreCallbacks(): Promise<LangChainCoreCallbacksModuleLike | null> {\n try {\n // Function-eval'd dynamic import keeps bundlers from trying to resolve\n // `@langchain/core/callbacks/base` at build time when the dep isn't installed.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mod = (await (Function(\"m\", \"return import(m)\") as any)(\n \"@langchain/core/callbacks/base\",\n )) as LangChainCoreCallbacksModuleLike;\n return mod ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Best-effort: if `@langchain/core/callbacks/base` is installed at runtime,\n * return a `MorseCallbackHandler`-shaped class whose prototype chain\n * includes the real `BaseCallbackHandler` (for users relying on\n * `instanceof BaseCallbackHandler` checks). Otherwise return the duck-typed\n * `MorseCallbackHandler` defined above. Mirrors `../langgraph/callback-handler.ts`'s\n * `getCallbackHandlerClass()`.\n */\nexport async function getCallbackHandlerClass(): Promise<typeof MorseCallbackHandler> {\n const mod = await loadLangChainCoreCallbacks();\n const Base = mod?.BaseCallbackHandler;\n if (!Base) return MorseCallbackHandler;\n\n class MorseCallbackHandlerWithBase extends (Base as unknown as {\n new (...args: unknown[]): object;\n }) {\n public readonly name: string = HANDLER_NAME;\n private readonly _av: MorseCallbackHandler;\n constructor(options?: MorseCallbackHandlerOptions) {\n super();\n this._av = new MorseCallbackHandler(options);\n }\n handleChainStart(chain: SerializedLike, inputs: Record<string, unknown>, runId: string): void {\n this._av.handleChainStart(chain, inputs, runId);\n }\n handleChainEnd(outputs: Record<string, unknown>, runId: string): void {\n this._av.handleChainEnd(outputs, runId);\n }\n handleChainError(err: unknown, runId: string): void {\n this._av.handleChainError(err, runId);\n }\n handleLLMStart(\n llm: SerializedLike,\n prompts: string[],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, unknown>,\n ): void {\n this._av.handleLLMStart(llm, prompts, runId, parentRunId, extraParams);\n }\n handleChatModelStart(\n llm: SerializedLike,\n messages: BaseMessageLike[][],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, unknown>,\n ): void {\n this._av.handleChatModelStart(llm, messages, runId, parentRunId, extraParams);\n }\n handleLLMEnd(output: LLMResultLike, runId: string): void {\n this._av.handleLLMEnd(output, runId);\n }\n handleLLMError(err: unknown, runId: string): void {\n this._av.handleLLMError(err, runId);\n }\n handleToolStart(tool: SerializedLike, input: string, runId: string): void {\n this._av.handleToolStart(tool, input, runId);\n }\n handleToolEnd(output: unknown, runId: string): void {\n this._av.handleToolEnd(output, runId);\n }\n handleToolError(err: unknown, runId: string): void {\n this._av.handleToolError(err, runId);\n }\n handleRetrieverStart(retriever: SerializedLike, query: string, runId: string): void {\n this._av.handleRetrieverStart(retriever, query, runId);\n }\n handleRetrieverEnd(documents: DocumentLike[], runId: string): void {\n this._av.handleRetrieverEnd(documents, runId);\n }\n handleRetrieverError(err: unknown, runId: string): void {\n this._av.handleRetrieverError(err, runId);\n }\n }\n return MorseCallbackHandlerWithBase as unknown as typeof MorseCallbackHandler;\n}\n"]}