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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/dist/anthropic/index.cjs +12 -10
  2. package/dist/anthropic/index.js +5 -3
  3. package/dist/anthropic-agent-sdk/index.cjs +52 -34
  4. package/dist/anthropic-agent-sdk/index.cjs.map +1 -1
  5. package/dist/anthropic-agent-sdk/index.js +25 -7
  6. package/dist/anthropic-agent-sdk/index.js.map +1 -1
  7. package/dist/browser/anthropic/index.cjs +12 -10
  8. package/dist/browser/anthropic/index.js +5 -3
  9. package/dist/browser/anthropic-agent-sdk/index.cjs +52 -34
  10. package/dist/browser/anthropic-agent-sdk/index.cjs.map +1 -1
  11. package/dist/browser/anthropic-agent-sdk/index.js +25 -7
  12. package/dist/browser/anthropic-agent-sdk/index.js.map +1 -1
  13. package/dist/browser/chunk-32U547L3.js +118 -0
  14. package/dist/browser/chunk-32U547L3.js.map +1 -0
  15. package/dist/{chunk-SBGY5NS4.js → browser/chunk-454FDWBM.js} +6 -4
  16. package/dist/browser/chunk-454FDWBM.js.map +1 -0
  17. package/dist/browser/{chunk-EFUQVASI.cjs → chunk-5EFKNOO7.cjs} +17 -15
  18. package/dist/browser/chunk-5EFKNOO7.cjs.map +1 -0
  19. package/dist/browser/{chunk-DOLWR7LD.js → chunk-5IWGFPKQ.js} +4 -4
  20. package/dist/browser/{chunk-DOLWR7LD.js.map → chunk-5IWGFPKQ.js.map} +1 -1
  21. package/dist/browser/{chunk-F3B4UR64.js → chunk-6DOP3MTY.js} +386 -53
  22. package/dist/browser/chunk-6DOP3MTY.js.map +1 -0
  23. package/dist/browser/{chunk-GWJYOQNC.js → chunk-A7P3ZBZX.js} +10 -4
  24. package/dist/browser/chunk-A7P3ZBZX.js.map +1 -0
  25. package/dist/browser/{chunk-M2GZJ3RS.cjs → chunk-AV35EOER.cjs} +20 -14
  26. package/dist/browser/chunk-AV35EOER.cjs.map +1 -0
  27. package/dist/browser/{chunk-AYNX24P5.js → chunk-AZ3SVK3K.js} +3 -3
  28. package/dist/browser/{chunk-AYNX24P5.js.map → chunk-AZ3SVK3K.js.map} +1 -1
  29. package/dist/browser/chunk-FNZWJU64.cjs +31 -0
  30. package/dist/browser/chunk-FNZWJU64.cjs.map +1 -0
  31. package/dist/browser/chunk-HZZK2EMO.cjs +126 -0
  32. package/dist/browser/chunk-HZZK2EMO.cjs.map +1 -0
  33. package/dist/browser/{chunk-QWRQJO57.js → chunk-MLDVXMQD.js} +3 -3
  34. package/dist/browser/{chunk-QWRQJO57.js.map → chunk-MLDVXMQD.js.map} +1 -1
  35. package/dist/{chunk-Y7SVGUKY.cjs → browser/chunk-NT37C2TK.cjs} +7 -7
  36. package/dist/browser/{chunk-YNUZGKUA.cjs.map → chunk-NT37C2TK.cjs.map} +1 -1
  37. package/dist/browser/{chunk-3643DC7K.cjs → chunk-RBNCTHK3.cjs} +5 -2
  38. package/dist/browser/{chunk-3643DC7K.cjs.map → chunk-RBNCTHK3.cjs.map} +1 -1
  39. package/dist/browser/chunk-VFNNU3AX.js +28 -0
  40. package/dist/browser/chunk-VFNNU3AX.js.map +1 -0
  41. package/dist/browser/{chunk-HGN7J3EU.cjs → chunk-WY2VLKRR.cjs} +12 -12
  42. package/dist/browser/{chunk-HGN7J3EU.cjs.map → chunk-WY2VLKRR.cjs.map} +1 -1
  43. package/dist/browser/{chunk-DXWHT3HK.cjs → chunk-ZGYZZCUK.cjs} +391 -55
  44. package/dist/browser/chunk-ZGYZZCUK.cjs.map +1 -0
  45. package/dist/browser/index.cjs +112 -82
  46. package/dist/browser/index.cjs.map +1 -1
  47. package/dist/browser/index.js +40 -10
  48. package/dist/browser/index.js.map +1 -1
  49. package/dist/browser/integrations/pino.cjs +4 -4
  50. package/dist/browser/integrations/pino.js +3 -3
  51. package/dist/browser/langchain/index.cjs +19 -19
  52. package/dist/browser/langchain/index.js +3 -3
  53. package/dist/browser/langgraph/index.cjs +34 -26
  54. package/dist/browser/langgraph/index.cjs.map +1 -1
  55. package/dist/browser/langgraph/index.js +16 -8
  56. package/dist/browser/langgraph/index.js.map +1 -1
  57. package/dist/browser/openai/index.cjs +22 -8
  58. package/dist/browser/openai/index.cjs.map +1 -1
  59. package/dist/browser/openai/index.js +17 -3
  60. package/dist/browser/openai/index.js.map +1 -1
  61. package/dist/browser/openai-agents/index.cjs +42 -34
  62. package/dist/browser/openai-agents/index.cjs.map +1 -1
  63. package/dist/browser/openai-agents/index.js +13 -5
  64. package/dist/browser/openai-agents/index.js.map +1 -1
  65. package/dist/browser/vercel-ai/index.cjs +16 -16
  66. package/dist/browser/vercel-ai/index.js +4 -4
  67. package/dist/{chunk-4R4SHGOK.js → chunk-4JPZV2VZ.js} +3 -3
  68. package/dist/{chunk-4R4SHGOK.js.map → chunk-4JPZV2VZ.js.map} +1 -1
  69. package/dist/{chunk-HNCWTENX.cjs → chunk-5B3IUESN.cjs} +415 -70
  70. package/dist/chunk-5B3IUESN.cjs.map +1 -0
  71. package/dist/chunk-5RXSICEJ.js +118 -0
  72. package/dist/chunk-5RXSICEJ.js.map +1 -0
  73. package/dist/chunk-7A2EWXZK.cjs +31 -0
  74. package/dist/chunk-7A2EWXZK.cjs.map +1 -0
  75. package/dist/{chunk-STK4KJQ6.js → chunk-AAR4FYFO.js} +10 -4
  76. package/dist/chunk-AAR4FYFO.js.map +1 -0
  77. package/dist/{chunk-LQI63FHF.cjs → chunk-ADRVMGAW.cjs} +20 -14
  78. package/dist/chunk-ADRVMGAW.cjs.map +1 -0
  79. package/dist/{chunk-V5J6J4ZR.js → chunk-CECVNM7R.js} +4 -4
  80. package/dist/{chunk-V5J6J4ZR.js.map → chunk-CECVNM7R.js.map} +1 -1
  81. package/dist/{chunk-KJEO52QS.cjs → chunk-HICEJ4LV.cjs} +5 -2
  82. package/dist/{chunk-KJEO52QS.cjs.map → chunk-HICEJ4LV.cjs.map} +1 -1
  83. package/dist/{chunk-QXRJUPDP.cjs → chunk-HSY7V4RG.cjs} +12 -12
  84. package/dist/{chunk-QXRJUPDP.cjs.map → chunk-HSY7V4RG.cjs.map} +1 -1
  85. package/dist/chunk-LB6ZLJUR.js +28 -0
  86. package/dist/chunk-LB6ZLJUR.js.map +1 -0
  87. package/dist/{browser/chunk-F7BGQ26H.js → chunk-O3Q5L2HY.js} +6 -4
  88. package/dist/chunk-O3Q5L2HY.js.map +1 -0
  89. package/dist/{chunk-5D6SBSEI.cjs → chunk-RF7NI5VN.cjs} +17 -15
  90. package/dist/chunk-RF7NI5VN.cjs.map +1 -0
  91. package/dist/{chunk-AEFUXEKV.js → chunk-TP3N3S2D.js} +3 -3
  92. package/dist/{chunk-AEFUXEKV.js.map → chunk-TP3N3S2D.js.map} +1 -1
  93. package/dist/{chunk-LTKGLXAE.js → chunk-UEKQIRRA.js} +410 -68
  94. package/dist/chunk-UEKQIRRA.js.map +1 -0
  95. package/dist/{browser/chunk-YNUZGKUA.cjs → chunk-UWQPOWJQ.cjs} +7 -7
  96. package/dist/{chunk-Y7SVGUKY.cjs.map → chunk-UWQPOWJQ.cjs.map} +1 -1
  97. package/dist/chunk-VD3KRXSP.cjs +126 -0
  98. package/dist/chunk-VD3KRXSP.cjs.map +1 -0
  99. package/dist/index.cjs +119 -89
  100. package/dist/index.cjs.map +1 -1
  101. package/dist/index.d.cts +2 -2
  102. package/dist/index.d.ts +2 -2
  103. package/dist/index.js +41 -11
  104. package/dist/index.js.map +1 -1
  105. package/dist/integrations/pino.cjs +4 -4
  106. package/dist/integrations/pino.js +3 -3
  107. package/dist/langchain/index.cjs +19 -19
  108. package/dist/langchain/index.d.cts +1 -1
  109. package/dist/langchain/index.d.ts +1 -1
  110. package/dist/langchain/index.js +3 -3
  111. package/dist/langgraph/index.cjs +34 -26
  112. package/dist/langgraph/index.cjs.map +1 -1
  113. package/dist/langgraph/index.d.cts +1 -1
  114. package/dist/langgraph/index.d.ts +1 -1
  115. package/dist/langgraph/index.js +16 -8
  116. package/dist/langgraph/index.js.map +1 -1
  117. package/dist/openai/index.cjs +22 -8
  118. package/dist/openai/index.cjs.map +1 -1
  119. package/dist/openai/index.js +17 -3
  120. package/dist/openai/index.js.map +1 -1
  121. package/dist/openai-agents/index.cjs +42 -34
  122. package/dist/openai-agents/index.cjs.map +1 -1
  123. package/dist/openai-agents/index.js +13 -5
  124. package/dist/openai-agents/index.js.map +1 -1
  125. package/dist/{tracing-BYAqjT5Q.d.cts → tracing-CNlre8TK.d.cts} +1 -0
  126. package/dist/{tracing-rz9cWQ8d.d.ts → tracing-J8ZgxVzU.d.ts} +1 -0
  127. package/dist/vercel-ai/index.cjs +16 -16
  128. package/dist/vercel-ai/index.js +4 -4
  129. package/package.json +1 -9
  130. package/dist/browser/chunk-3BGG7GH3.cjs +0 -183
  131. package/dist/browser/chunk-3BGG7GH3.cjs.map +0 -1
  132. package/dist/browser/chunk-DXWHT3HK.cjs.map +0 -1
  133. package/dist/browser/chunk-EFUQVASI.cjs.map +0 -1
  134. package/dist/browser/chunk-F3B4UR64.js.map +0 -1
  135. package/dist/browser/chunk-F7BGQ26H.js.map +0 -1
  136. package/dist/browser/chunk-GWJYOQNC.js.map +0 -1
  137. package/dist/browser/chunk-M2GZJ3RS.cjs.map +0 -1
  138. package/dist/browser/chunk-YHV5GL32.js +0 -178
  139. package/dist/browser/chunk-YHV5GL32.js.map +0 -1
  140. package/dist/chunk-5D6SBSEI.cjs.map +0 -1
  141. package/dist/chunk-HNCWTENX.cjs.map +0 -1
  142. package/dist/chunk-LQI63FHF.cjs.map +0 -1
  143. package/dist/chunk-LTKGLXAE.js.map +0 -1
  144. package/dist/chunk-POCQNSVD.js +0 -178
  145. package/dist/chunk-POCQNSVD.js.map +0 -1
  146. package/dist/chunk-SBGY5NS4.js.map +0 -1
  147. package/dist/chunk-STK4KJQ6.js.map +0 -1
  148. package/dist/chunk-T2KW3P23.cjs +0 -183
  149. package/dist/chunk-T2KW3P23.cjs.map +0 -1
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var chunkT2KW3P23_cjs = require('../chunk-T2KW3P23.cjs');
4
- var chunkKJEO52QS_cjs = require('../chunk-KJEO52QS.cjs');
5
- var chunkHNCWTENX_cjs = require('../chunk-HNCWTENX.cjs');
3
+ var chunk7A2EWXZK_cjs = require('../chunk-7A2EWXZK.cjs');
4
+ var chunkHICEJ4LV_cjs = require('../chunk-HICEJ4LV.cjs');
5
+ var chunk5B3IUESN_cjs = require('../chunk-5B3IUESN.cjs');
6
6
 
7
7
  // src/langchain/callback-handler.ts
8
- chunkHNCWTENX_cjs.init_tracing();
8
+ chunk5B3IUESN_cjs.init_tracing();
9
9
  var ADAPTER = "langchain-js";
10
10
  var HANDLER_NAME = "morse_callback_handler";
11
11
  var DEFAULT_AGENT_NAME = "langchain-agent";
@@ -205,7 +205,7 @@ var MorseCallbackHandler = class {
205
205
  openSpan(runId, name, type, inputData, extraMetadata) {
206
206
  if (typeof runId !== "string" || runId.length === 0) return null;
207
207
  const metadata = { ...extraMetadata ?? {}, adapter: ADAPTER };
208
- const handle = chunkHNCWTENX_cjs.startSpan({ name, type, metadata });
208
+ const handle = chunk5B3IUESN_cjs.startSpan({ name, type, metadata });
209
209
  if (handle === null) return null;
210
210
  const wrapped = coerceStateValue(inputData);
211
211
  if (wrapped !== void 0) handle.span.input_data = wrapped;
@@ -302,26 +302,26 @@ var MorseCallbackHandler = class {
302
302
  return this.spanStack.get(runId);
303
303
  }
304
304
  };
305
- var _handleChainStart = chunkT2KW3P23_cjs.absorbErrorsSync(
305
+ var _handleChainStart = chunk7A2EWXZK_cjs.absorbErrorsSync(
306
306
  (self, chain, inputs, runId) => {
307
307
  const chainName = resolveNameIdFirst(chain, "chain");
308
308
  self._openSpan(runId, chainName, "agent", inputs);
309
309
  },
310
310
  { fingerprint: "morse.langchain.handleChainStart" }
311
311
  );
312
- var _handleChainEnd = chunkT2KW3P23_cjs.absorbErrorsSync(
312
+ var _handleChainEnd = chunk7A2EWXZK_cjs.absorbErrorsSync(
313
313
  (self, outputs, runId) => {
314
314
  self._closeSpan(runId, outputs);
315
315
  },
316
316
  { fingerprint: "morse.langchain.handleChainEnd" }
317
317
  );
318
- var _handleChainError = chunkT2KW3P23_cjs.absorbErrorsSync(
318
+ var _handleChainError = chunk7A2EWXZK_cjs.absorbErrorsSync(
319
319
  (self, err, runId) => {
320
320
  self._closeSpan(runId, void 0, err ?? new Error("langchain chain error"));
321
321
  },
322
322
  { fingerprint: "morse.langchain.handleChainError" }
323
323
  );
324
- var _handleLLMStart = chunkT2KW3P23_cjs.absorbErrorsSync(
324
+ var _handleLLMStart = chunk7A2EWXZK_cjs.absorbErrorsSync(
325
325
  (self, llm, prompts, runId, extraParams) => {
326
326
  const llmName = resolveNameIdFirst(llm, "llm");
327
327
  const invocationParams = extraParams?.invocation_params;
@@ -354,13 +354,13 @@ function toolsFromExtra(extra) {
354
354
  const invocationParams = extra?.invocation_params;
355
355
  return invocationParams?.tools;
356
356
  }
357
- var _handleChatModelStart = chunkT2KW3P23_cjs.absorbErrorsSync(
357
+ var _handleChatModelStart = chunk7A2EWXZK_cjs.absorbErrorsSync(
358
358
  (self, llm, messages, runId, extraParams) => {
359
359
  const llmName = resolveNameIdFirst(llm, "llm");
360
360
  const invocationParams = extraParams?.invocation_params;
361
361
  const modelName = (typeof invocationParams?.model_name === "string" ? invocationParams.model_name : void 0) ?? (typeof invocationParams?.model === "string" ? invocationParams.model : void 0);
362
362
  const flatMessages = flattenMessages(messages);
363
- const contextSegments = chunkKJEO52QS_cjs.decomposeOpenAiMessages(flatMessages, toolsFromExtra(extraParams));
363
+ const contextSegments = chunkHICEJ4LV_cjs.decomposeOpenAiMessages(flatMessages, toolsFromExtra(extraParams));
364
364
  const handle = self._openSpan(runId, llmName, "llm", void 0);
365
365
  if (handle !== null) {
366
366
  if (modelName) handle.span.model = modelName;
@@ -369,7 +369,7 @@ var _handleChatModelStart = chunkT2KW3P23_cjs.absorbErrorsSync(
369
369
  },
370
370
  { fingerprint: "morse.langchain.handleChatModelStart" }
371
371
  );
372
- var _handleLLMEnd = chunkT2KW3P23_cjs.absorbErrorsSync(
372
+ var _handleLLMEnd = chunk7A2EWXZK_cjs.absorbErrorsSync(
373
373
  (self, response, runId) => {
374
374
  const handle = self._getSpan(runId);
375
375
  const outputText = extractOutputText(response);
@@ -392,32 +392,32 @@ var _handleLLMEnd = chunkT2KW3P23_cjs.absorbErrorsSync(
392
392
  },
393
393
  { fingerprint: "morse.langchain.handleLLMEnd" }
394
394
  );
395
- var _handleLLMError = chunkT2KW3P23_cjs.absorbErrorsSync(
395
+ var _handleLLMError = chunk7A2EWXZK_cjs.absorbErrorsSync(
396
396
  (self, err, runId) => {
397
397
  self._closeSpan(runId, void 0, err ?? new Error("langchain llm error"));
398
398
  },
399
399
  { fingerprint: "morse.langchain.handleLLMError" }
400
400
  );
401
- var _handleToolStart = chunkT2KW3P23_cjs.absorbErrorsSync(
401
+ var _handleToolStart = chunk7A2EWXZK_cjs.absorbErrorsSync(
402
402
  (self, tool, input, runId) => {
403
403
  const toolName = resolveNameNameFirst(tool, "tool");
404
404
  self._openSpan(runId, toolName, "tool", { input });
405
405
  },
406
406
  { fingerprint: "morse.langchain.handleToolStart" }
407
407
  );
408
- var _handleToolEnd = chunkT2KW3P23_cjs.absorbErrorsSync(
408
+ var _handleToolEnd = chunk7A2EWXZK_cjs.absorbErrorsSync(
409
409
  (self, output, runId) => {
410
410
  self._closeSpan(runId, { output: String(output) });
411
411
  },
412
412
  { fingerprint: "morse.langchain.handleToolEnd" }
413
413
  );
414
- var _handleToolError = chunkT2KW3P23_cjs.absorbErrorsSync(
414
+ var _handleToolError = chunk7A2EWXZK_cjs.absorbErrorsSync(
415
415
  (self, err, runId) => {
416
416
  self._closeSpan(runId, void 0, err ?? new Error("langchain tool error"));
417
417
  },
418
418
  { fingerprint: "morse.langchain.handleToolError" }
419
419
  );
420
- var _handleRetrieverStart = chunkT2KW3P23_cjs.absorbErrorsSync(
420
+ var _handleRetrieverStart = chunk7A2EWXZK_cjs.absorbErrorsSync(
421
421
  (self, retriever, query, runId) => {
422
422
  const idPath = retriever?.id;
423
423
  const retrieverName = (Array.isArray(idPath) && idPath.length > 0 ? idPath[idPath.length - 1] : void 0) || "retriever";
@@ -425,7 +425,7 @@ var _handleRetrieverStart = chunkT2KW3P23_cjs.absorbErrorsSync(
425
425
  },
426
426
  { fingerprint: "morse.langchain.handleRetrieverStart" }
427
427
  );
428
- var _handleRetrieverEnd = chunkT2KW3P23_cjs.absorbErrorsSync(
428
+ var _handleRetrieverEnd = chunk7A2EWXZK_cjs.absorbErrorsSync(
429
429
  (self, documents, runId) => {
430
430
  const docsOut = [];
431
431
  for (const doc of documents ?? []) {
@@ -455,7 +455,7 @@ var _handleRetrieverEnd = chunkT2KW3P23_cjs.absorbErrorsSync(
455
455
  },
456
456
  { fingerprint: "morse.langchain.handleRetrieverEnd" }
457
457
  );
458
- var _handleRetrieverError = chunkT2KW3P23_cjs.absorbErrorsSync(
458
+ var _handleRetrieverError = chunk7A2EWXZK_cjs.absorbErrorsSync(
459
459
  (self, err, runId) => {
460
460
  self._closeSpan(runId, void 0, err ?? new Error("langchain retriever error"));
461
461
  },
@@ -1,4 +1,4 @@
1
- import { S as SpanHandle } from '../tracing-BYAqjT5Q.cjs';
1
+ import { S as SpanHandle } from '../tracing-CNlre8TK.cjs';
2
2
  import '../spans-DZtMuBvc.cjs';
3
3
 
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { S as SpanHandle } from '../tracing-rz9cWQ8d.js';
1
+ import { S as SpanHandle } from '../tracing-J8ZgxVzU.js';
2
2
  import '../spans-DZtMuBvc.js';
3
3
 
4
4
  /**
@@ -1,6 +1,6 @@
1
- import { absorbErrorsSync } from '../chunk-POCQNSVD.js';
2
- import { decomposeOpenAiMessages } from '../chunk-4R4SHGOK.js';
3
- import { init_tracing, startSpan } from '../chunk-LTKGLXAE.js';
1
+ import { absorbErrorsSync } from '../chunk-LB6ZLJUR.js';
2
+ import { decomposeOpenAiMessages } from '../chunk-4JPZV2VZ.js';
3
+ import { init_tracing, startSpan } from '../chunk-UEKQIRRA.js';
4
4
 
5
5
  // src/langchain/callback-handler.ts
6
6
  init_tracing();
@@ -1,11 +1,12 @@
1
1
  'use strict';
2
2
 
3
- var chunkY7SVGUKY_cjs = require('../chunk-Y7SVGUKY.cjs');
4
- var chunk5D6SBSEI_cjs = require('../chunk-5D6SBSEI.cjs');
5
- var chunkT2KW3P23_cjs = require('../chunk-T2KW3P23.cjs');
3
+ var chunkVD3KRXSP_cjs = require('../chunk-VD3KRXSP.cjs');
4
+ var chunkUWQPOWJQ_cjs = require('../chunk-UWQPOWJQ.cjs');
5
+ var chunkRF7NI5VN_cjs = require('../chunk-RF7NI5VN.cjs');
6
+ var chunk7A2EWXZK_cjs = require('../chunk-7A2EWXZK.cjs');
6
7
  var chunkKBWPNIH4_cjs = require('../chunk-KBWPNIH4.cjs');
7
- var chunkKJEO52QS_cjs = require('../chunk-KJEO52QS.cjs');
8
- require('../chunk-HNCWTENX.cjs');
8
+ var chunkHICEJ4LV_cjs = require('../chunk-HICEJ4LV.cjs');
9
+ require('../chunk-5B3IUESN.cjs');
9
10
 
10
11
  // src/langgraph/callback-handler.ts
11
12
  var ADAPTER = "langgraph-js";
@@ -48,24 +49,24 @@ var MorseCallbackHandler = class {
48
49
  return DEFAULT_AGENT_NAME_FALLBACK;
49
50
  }
50
51
  };
51
- var _handleChainStartImpl = chunkT2KW3P23_cjs.absorbErrorsSync(
52
+ var _handleChainStartImpl = chunk7A2EWXZK_cjs.absorbErrorsSync(
52
53
  (self, chain, runId, runName) => {
53
54
  if (typeof runId !== "string" || runId.length === 0) return;
54
55
  if (self._takeSpan(runId)) ;
55
56
  const agentName = self._resolveAgentName(chain, runName);
56
- const handle = chunk5D6SBSEI_cjs.emitAgentSpan({ adapter: ADAPTER, agentName });
57
+ const handle = chunkRF7NI5VN_cjs.emitAgentSpan({ adapter: ADAPTER, agentName });
57
58
  if (handle) self._setSpan(runId, handle);
58
59
  },
59
60
  { fingerprint: "morse.langgraph.handleChainStart" }
60
61
  );
61
- var _handleChainEndImpl = chunkT2KW3P23_cjs.absorbErrorsSync(
62
+ var _handleChainEndImpl = chunk7A2EWXZK_cjs.absorbErrorsSync(
62
63
  (self, runId) => {
63
64
  const handle = self._takeSpan(runId);
64
65
  if (handle) handle.end();
65
66
  },
66
67
  { fingerprint: "morse.langgraph.handleChainEnd" }
67
68
  );
68
- var _handleChainErrorImpl = chunkT2KW3P23_cjs.absorbErrorsSync(
69
+ var _handleChainErrorImpl = chunk7A2EWXZK_cjs.absorbErrorsSync(
69
70
  (self, err, runId) => {
70
71
  const handle = self._takeSpan(runId);
71
72
  if (handle) handle.end(err ?? new Error("langgraph chain error"));
@@ -117,6 +118,7 @@ async function getCallbackHandlerClass() {
117
118
 
118
119
  // src/langgraph/llm-and-tool-callbacks.ts
119
120
  var ADAPTER2 = "langgraph-js";
121
+ var FRAMEWORK = "langgraph";
120
122
  function extractProvider(id) {
121
123
  if (!Array.isArray(id) || id.length === 0) return void 0;
122
124
  const first = id[0];
@@ -202,11 +204,13 @@ function popAndEnd(map, runId, err, mutate) {
202
204
  function createLlmAndToolHandlers(state, options = {}) {
203
205
  const toolInputOpts = options.toolInputMaxBytes ? { maxBytes: options.toolInputMaxBytes } : void 0;
204
206
  const toolOutputOpts = options.toolOutputMaxBytes ? { maxBytes: options.toolOutputMaxBytes } : void 0;
205
- const _handleLLMStart = (llm, _prompts, runId, _parentRunId, extraParams) => {
206
- const handle = chunk5D6SBSEI_cjs.emitLlmSpan({
207
+ const _handleLLMStart = (llm, prompts, runId, _parentRunId, extraParams) => {
208
+ chunkVD3KRXSP_cjs.setActiveFramework(FRAMEWORK);
209
+ const handle = chunkRF7NI5VN_cjs.emitLlmSpan({
207
210
  adapter: ADAPTER2,
208
211
  model: llmModelOf(llm, extraParams),
209
- provider: extractProvider(llm?.id)
212
+ provider: extractProvider(llm?.id),
213
+ inputData: chunkVD3KRXSP_cjs.capturePrompts(prompts)
210
214
  });
211
215
  if (handle !== null) {
212
216
  state.llmSpans.set(runId, handle);
@@ -214,12 +218,14 @@ function createLlmAndToolHandlers(state, options = {}) {
214
218
  };
215
219
  const _handleChatModelStart = (llm, messages, runId, _parentRunId, extraParams) => {
216
220
  const flatMessages = flattenMessages(messages);
217
- const contextSegments = chunkKJEO52QS_cjs.decomposeOpenAiMessages(flatMessages, toolsFromExtra(extraParams));
218
- const handle = chunk5D6SBSEI_cjs.emitLlmSpan({
221
+ const contextSegments = chunkHICEJ4LV_cjs.decomposeOpenAiMessages(flatMessages, toolsFromExtra(extraParams));
222
+ chunkVD3KRXSP_cjs.setActiveFramework(FRAMEWORK);
223
+ const handle = chunkRF7NI5VN_cjs.emitLlmSpan({
219
224
  adapter: ADAPTER2,
220
225
  model: llmModelOf(llm, extraParams),
221
226
  provider: extractProvider(llm?.id),
222
- contextSegments: contextSegments.length > 0 ? contextSegments : void 0
227
+ contextSegments: contextSegments.length > 0 ? contextSegments : void 0,
228
+ inputData: chunkVD3KRXSP_cjs.captureLangChainMessages(flatMessages)
223
229
  });
224
230
  if (handle !== null) {
225
231
  state.llmSpans.set(runId, handle);
@@ -228,16 +234,18 @@ function createLlmAndToolHandlers(state, options = {}) {
228
234
  const _handleLLMEnd = (output, runId) => {
229
235
  popAndEnd(state.llmSpans, runId, void 0, (handle) => {
230
236
  applyTokenUsage(handle, output);
237
+ const outputText = chunkVD3KRXSP_cjs.extractLangChainOutputText(output?.generations);
238
+ if (outputText !== void 0) handle.span.output_data = { content: outputText };
231
239
  });
232
240
  };
233
241
  const _handleLLMError = (err, runId) => {
234
242
  popAndEnd(state.llmSpans, runId, err);
235
243
  };
236
244
  const _handleToolStart = (tool, input, runId) => {
237
- const handle = chunk5D6SBSEI_cjs.emitToolSpan({
245
+ const handle = chunkRF7NI5VN_cjs.emitToolSpan({
238
246
  adapter: ADAPTER2,
239
247
  toolName: toolNameOf(tool),
240
- inputSummary: chunkY7SVGUKY_cjs.summarizeToolInput(input, toolInputOpts)
248
+ inputSummary: chunkUWQPOWJQ_cjs.summarizeToolInput(input, toolInputOpts)
241
249
  });
242
250
  if (handle !== null) {
243
251
  state.toolSpans.set(runId, handle);
@@ -246,7 +254,7 @@ function createLlmAndToolHandlers(state, options = {}) {
246
254
  const _handleToolEnd = (output, runId) => {
247
255
  popAndEnd(state.toolSpans, runId, void 0, (handle) => {
248
256
  const md = handle.span.metadata ??= {};
249
- md.tool_output_summary = chunkY7SVGUKY_cjs.summarizeToolOutput(output, toolOutputOpts);
257
+ md.tool_output_summary = chunkUWQPOWJQ_cjs.summarizeToolOutput(output, toolOutputOpts);
250
258
  md.success = true;
251
259
  });
252
260
  };
@@ -258,15 +266,15 @@ function createLlmAndToolHandlers(state, options = {}) {
258
266
  };
259
267
  const fp = "morse.adapters.langgraph.llm-and-tool";
260
268
  return {
261
- handleLLMStart: chunkT2KW3P23_cjs.absorbErrorsSync(_handleLLMStart, { fingerprint: `${fp}.handleLLMStart` }),
262
- handleChatModelStart: chunkT2KW3P23_cjs.absorbErrorsSync(_handleChatModelStart, {
269
+ handleLLMStart: chunk7A2EWXZK_cjs.absorbErrorsSync(_handleLLMStart, { fingerprint: `${fp}.handleLLMStart` }),
270
+ handleChatModelStart: chunk7A2EWXZK_cjs.absorbErrorsSync(_handleChatModelStart, {
263
271
  fingerprint: `${fp}.handleChatModelStart`
264
272
  }),
265
- handleLLMEnd: chunkT2KW3P23_cjs.absorbErrorsSync(_handleLLMEnd, { fingerprint: `${fp}.handleLLMEnd` }),
266
- handleLLMError: chunkT2KW3P23_cjs.absorbErrorsSync(_handleLLMError, { fingerprint: `${fp}.handleLLMError` }),
267
- handleToolStart: chunkT2KW3P23_cjs.absorbErrorsSync(_handleToolStart, { fingerprint: `${fp}.handleToolStart` }),
268
- handleToolEnd: chunkT2KW3P23_cjs.absorbErrorsSync(_handleToolEnd, { fingerprint: `${fp}.handleToolEnd` }),
269
- handleToolError: chunkT2KW3P23_cjs.absorbErrorsSync(_handleToolError, { fingerprint: `${fp}.handleToolError` })
273
+ handleLLMEnd: chunk7A2EWXZK_cjs.absorbErrorsSync(_handleLLMEnd, { fingerprint: `${fp}.handleLLMEnd` }),
274
+ handleLLMError: chunk7A2EWXZK_cjs.absorbErrorsSync(_handleLLMError, { fingerprint: `${fp}.handleLLMError` }),
275
+ handleToolStart: chunk7A2EWXZK_cjs.absorbErrorsSync(_handleToolStart, { fingerprint: `${fp}.handleToolStart` }),
276
+ handleToolEnd: chunk7A2EWXZK_cjs.absorbErrorsSync(_handleToolEnd, { fingerprint: `${fp}.handleToolEnd` }),
277
+ handleToolError: chunk7A2EWXZK_cjs.absorbErrorsSync(_handleToolError, { fingerprint: `${fp}.handleToolError` })
270
278
  };
271
279
  }
272
280
 
@@ -274,7 +282,7 @@ function createLlmAndToolHandlers(state, options = {}) {
274
282
  var ADAPTER_FINGERPRINT = "langgraph.streaming";
275
283
  function createStreamingHandlers(state, options) {
276
284
  const trackStreamingTokens = options?.trackStreamingTokens ?? true;
277
- const handleLLMNewToken = chunkT2KW3P23_cjs.absorbErrorsSync(
285
+ const handleLLMNewToken = chunk7A2EWXZK_cjs.absorbErrorsSync(
278
286
  (_token, _idx, runId) => {
279
287
  if (!trackStreamingTokens) return;
280
288
  const handle = state.llmSpans.get(runId);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/langgraph/callback-handler.ts","../../src/langgraph/llm-and-tool-callbacks.ts","../../src/langgraph/streaming-and-checkpoint.ts","../../src/langgraph/index.ts"],"names":["absorbErrorsSync","emitAgentSpan","ADAPTER","calculateCost","emitLlmSpan","decomposeOpenAiMessages","emitToolSpan","summarizeToolInput","summarizeToolOutput","MorseCallbackHandler"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * `@morsehq-dev/sdk/langgraph` — `MorseCallbackHandler` (W2-L.1).\n *\n * The handler is registered by LangGraph users via:\n *\n * ```ts\n * import { MorseCallbackHandler } from \"@morsehq-dev/sdk/langgraph\";\n * await app.invoke(input, { callbacks: [new MorseCallbackHandler()] });\n * ```\n *\n * LangGraph type-checks handlers structurally (by method presence on the\n * instance), not via `instanceof BaseCallbackHandler`. We therefore:\n *\n * 1. Always export a duck-typed class implementing `CallbackHandlerSurface`\n * — works without `@langchain/core` installed.\n * 2. Provide `getCallbackHandlerClass()` for users who rely on\n * `instanceof BaseCallbackHandler` — it dynamically loads\n * `@langchain/core/callbacks/base` (optional peer dep) and returns a\n * subclass whose prototype chain includes the real base class.\n *\n * Scope of THIS file (W2-L.1): chain spans only. `handleChainStart` opens\n * an `agent` span (the LangGraph chain IS the agent run); `handleChainEnd`\n * / `handleChainError` closes it. Nested chains nest via the per-runId\n * span map — LangGraph guarantees well-ordered start/end pairs so the\n * tracing-state span stack handles `parent_span_id` linkage for us.\n *\n * `handleLLMStart/End`, `handleToolStart/End`, and streaming callbacks\n * are implemented in W2-L.2 / W2-L.3 as separate methods on the same\n * class (composed in Wave 3-L).\n */\n\nimport { absorbErrorsSync } from \"../_internal/errors\";\nimport type { SpanHandle } from \"../_internal/tracing\";\nimport { emitAgentSpan } from \"../_agent-sdk-common/span-emitter\";\nimport type {\n CallbackHandlerSurface,\n LangChainCoreCallbacksModuleLike,\n SerializedLike,\n} from \"./types\";\n\n/* ------------------------------------------------------------------------ */\n/* Public surface */\n/* ------------------------------------------------------------------------ */\n\nexport interface MorseCallbackHandlerOptions {\n /**\n * Override the agent name on the outer chain span. Falls back, in order,\n * to: `runName` (LangGraph-supplied per-invocation name), `chain.name`\n * (the serialized class name), then `\"langgraph-agent\"`.\n */\n defaultAgentName?: string;\n}\n\nconst ADAPTER = \"langgraph-js\";\nconst HANDLER_NAME = \"morse_callback_handler\";\nconst DEFAULT_AGENT_NAME_FALLBACK = \"langgraph-agent\";\n\n/**\n * Duck-typed LangGraph `BaseCallbackHandler`. Implements `CallbackHandlerSurface`\n * with chain-start / chain-end / chain-error wired to the Morse trace.\n *\n * LangGraph routes callbacks to instance methods by name; it does NOT require\n * an `instanceof` check against the real `BaseCallbackHandler`. Users who\n * need that (rare; `instanceof` checks in custom middleware) should obtain\n * the class via `getCallbackHandlerClass()` instead.\n */\nexport class MorseCallbackHandler implements CallbackHandlerSurface {\n /** Required by LangGraph's `BaseCallbackHandler` interface. */\n public readonly name: string = HANDLER_NAME;\n\n private readonly defaultAgentName: string | undefined;\n\n /** Open chain spans, keyed by LangGraph `runId`. */\n private readonly chainSpans: Map<string, SpanHandle> = new Map();\n\n constructor(options?: MorseCallbackHandlerOptions) {\n this.defaultAgentName = options?.defaultAgentName;\n }\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 _runType?: string,\n runName?: string,\n ): void {\n _handleChainStartImpl(this, chain, runId, runName);\n }\n\n handleChainEnd(_outputs: Record<string, unknown>, runId: string, parentRunId?: string): void {\n void parentRunId;\n _handleChainEndImpl(this, runId);\n }\n\n handleChainError(err: unknown, runId: string, parentRunId?: string): void {\n void parentRunId;\n _handleChainErrorImpl(this, err, runId);\n }\n\n /* ------ Internal accessors used by the absorbErrorsSync-wrapped impls ----- */\n\n /** @internal */\n _setSpan(runId: string, handle: SpanHandle): void {\n this.chainSpans.set(runId, handle);\n }\n\n /** @internal */\n _takeSpan(runId: string): SpanHandle | undefined {\n const handle = this.chainSpans.get(runId);\n if (handle) this.chainSpans.delete(runId);\n return handle;\n }\n\n /** @internal */\n _resolveAgentName(chain: SerializedLike | undefined, runName: string | undefined): string {\n if (typeof runName === \"string\" && runName.length > 0) return runName;\n if (chain && typeof chain.name === \"string\" && chain.name.length > 0) return chain.name;\n if (this.defaultAgentName && this.defaultAgentName.length > 0) return this.defaultAgentName;\n return DEFAULT_AGENT_NAME_FALLBACK;\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* Implementation bodies (wrapped in absorbErrorsSync) */\n/* ------------------------------------------------------------------------ */\n\nconst _handleChainStartImpl: (\n self: MorseCallbackHandler,\n chain: SerializedLike | undefined,\n runId: string,\n runName: string | undefined,\n) => void = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n chain: SerializedLike | undefined,\n runId: string,\n runName: string | undefined,\n ) => {\n if (typeof runId !== \"string\" || runId.length === 0) return;\n // Defensive: if LangGraph re-fires start for the same runId, leak nothing.\n if (self._takeSpan(runId)) {\n // (we just popped it — drop on the floor; the dangling end will be a no-op)\n }\n const agentName = self._resolveAgentName(chain, runName);\n const handle = emitAgentSpan({ adapter: ADAPTER, agentName });\n if (handle) self._setSpan(runId, handle);\n },\n { fingerprint: \"morse.langgraph.handleChainStart\" },\n) as (\n self: MorseCallbackHandler,\n chain: SerializedLike | undefined,\n runId: string,\n runName: string | undefined,\n) => void;\n\nconst _handleChainEndImpl: (self: MorseCallbackHandler, runId: string) => void = absorbErrorsSync(\n (self: MorseCallbackHandler, runId: string) => {\n const handle = self._takeSpan(runId);\n if (handle) handle.end();\n },\n { fingerprint: \"morse.langgraph.handleChainEnd\" },\n) as (self: MorseCallbackHandler, runId: string) => void;\n\nconst _handleChainErrorImpl: (self: MorseCallbackHandler, err: unknown, runId: string) => void =\n absorbErrorsSync(\n (self: MorseCallbackHandler, err: unknown, runId: string) => {\n const handle = self._takeSpan(runId);\n if (handle) handle.end(err ?? new Error(\"langgraph chain error\"));\n },\n { fingerprint: \"morse.langgraph.handleChainError\" },\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 an `MorseCallbackHandler`-shaped class whose prototype chain\n * includes the real `BaseCallbackHandler` (for users relying on\n * `instanceof BaseCallbackHandler` checks). Otherwise return the\n * duck-typed `MorseCallbackHandler` defined above.\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 // Build a subclass that mixes the real Base class into the prototype chain\n // while preserving the chain-span behavior. We do this lazily so that\n // simply importing this module does NOT require `@langchain/core`.\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(\n chain: SerializedLike,\n inputs: Record<string, unknown>,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n runType?: string,\n runName?: string,\n ): void {\n this._av.handleChainStart(\n chain,\n inputs,\n runId,\n parentRunId,\n tags,\n metadata,\n runType,\n runName,\n );\n }\n handleChainEnd(outputs: Record<string, unknown>, runId: string, parentRunId?: string): void {\n this._av.handleChainEnd(outputs, runId, parentRunId);\n }\n handleChainError(err: unknown, runId: string, parentRunId?: string): void {\n this._av.handleChainError(err, runId, parentRunId);\n }\n }\n return MorseCallbackHandlerWithBase as unknown as typeof MorseCallbackHandler;\n}\n","/**\n * `langgraph/llm-and-tool-callbacks.ts` — W2-L.2.\n *\n * LangGraph JS callback handler fragment that owns the llm + tool surface\n * of `BaseCallbackHandler`. The class shell (constructor + chain methods)\n * is owned by W2-L.1 (`callback-handler.ts`); streaming + checkpoint by\n * W2-L.3 (`streaming-and-checkpoint.ts`). All three are composed together\n * by W3-L (`langgraph/index.ts`).\n *\n * To stay file-disjoint across the three W2-L tasks, each fragment exports\n * a `createX` factory that returns plain method implementations operating\n * on a shared mutable `LangGraphRunState`. The host class threads its\n * `state` reference through each factory in its constructor and copies the\n * methods onto its prototype/instance.\n *\n * Logical span mapping (per design.md §LangGraph JS):\n * handleLLMStart / handleChatModelStart → open `type=llm` span\n * handleLLMEnd / handleLLMError → close active llm span\n * handleToolStart → open `type=tool` span\n * handleToolEnd / handleToolError → close active tool span\n *\n * MHQ-750: `handleChatModelStart` also decomposes the flattened messages\n * (+ any bound `tools`) into `context_segments` via the shared\n * `_agent-sdk-common/context-decomposer`, mirroring the Python adapter's\n * `on_chat_model_start` (`adapters/langgraph.py`), which calls the same\n * `decompose_openai_messages` for the same reason: LangGraph JS messages\n * are `@langchain/core` `BaseMessage`s, which decompose cleanly under the\n * OpenAI-chat-format decomposer's `_getType()`/`.type` duck-typing.\n *\n * All bodies are wrapped in `absorbErrorsSync` so telemetry can never\n * throw at the host LangGraph runtime.\n */\n\nimport { absorbErrorsSync } from \"../_internal/errors\";\nimport { calculateCost } from \"../_internal/pricing\";\nimport type { SpanHandle } from \"../_internal/tracing\";\nimport { emitLlmSpan, emitToolSpan } from \"../_agent-sdk-common/span-emitter\";\nimport { summarizeToolInput, summarizeToolOutput } from \"../_agent-sdk-common/redaction\";\nimport { decomposeOpenAiMessages } from \"../_agent-sdk-common/context-decomposer\";\nimport type {\n BaseMessageLike,\n CallbackHandlerSurface,\n LLMResultLike,\n SerializedLike,\n} from \"./types\";\n\nconst ADAPTER = \"langgraph-js\" as const;\n\n/* ------------------------------------------------------------------------ */\n/* Shared run state */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Shared per-instance state for the composed `MorseCallbackHandler`.\n * Owned/instantiated by W3-L (`langgraph/index.ts`); each W2-L fragment\n * mutates it in place.\n */\nexport interface LangGraphRunState {\n /** Map of runId → SpanHandle for open llm spans. */\n llmSpans: Map<string, SpanHandle>;\n /** Map of runId → SpanHandle for open tool spans. */\n toolSpans: Map<string, SpanHandle>;\n /** Map of runId → SpanHandle for open chain spans (populated by W2-L.1). */\n chainSpans: Map<string, SpanHandle>;\n}\n\nexport interface LlmAndToolHandlerOptions {\n /** Max bytes for tool input summary. Falls through to module default if unset. */\n toolInputMaxBytes?: number;\n /** Max bytes for tool output summary. Falls through to module default if unset. */\n toolOutputMaxBytes?: number;\n}\n\n/** Convenient public type alias for the slice of methods this file owns. */\nexport type LlmAndToolHandlers = Pick<\n CallbackHandlerSurface,\n | \"handleLLMStart\"\n | \"handleChatModelStart\"\n | \"handleLLMEnd\"\n | \"handleLLMError\"\n | \"handleToolStart\"\n | \"handleToolEnd\"\n | \"handleToolError\"\n>;\n\n/* ------------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Extract a provider hint from the `id` path produced by LangChain's\n * `Serializable` machinery. The first segment is usually the package name\n * (`langchain_openai`, `langchain_anthropic`, `langchain_google_vertexai`,\n * etc.). We strip the `langchain_` prefix when present and return the\n * remainder; otherwise we return the first segment verbatim. Returns\n * `undefined` when no identifying segment is available.\n */\nfunction extractProvider(id: string[] | undefined): string | undefined {\n if (!Array.isArray(id) || id.length === 0) return undefined;\n const first = id[0];\n if (typeof first !== \"string\" || first.length === 0) return undefined;\n if (first.startsWith(\"langchain_\")) {\n const tail = first.slice(\"langchain_\".length);\n return tail.length > 0 ? tail : undefined;\n }\n return first;\n}\n\n/**\n * MHQ-788: `llm.name` is LangChain's `Serializable` class name (e.g.\n * `\"ChatOpenAI\"`), never the actual model string — it was always the wrong\n * field, and empty in practice for the real `@langchain/openai` callback\n * invocation this bug was found against. The real model lives in\n * `extraParams.invocation_params.model` (see `chat_models.cjs`'s\n * `invocationParams()` — every provider's chat model puts its model field\n * there before calling `handleChatModelStart`/`handleLLMStart`).\n * `llm.name` is kept only as a last-resort fallback for providers that\n * don't populate `invocation_params.model` for some reason.\n */\nfunction llmModelOf(\n llm: SerializedLike | undefined,\n extraParams?: Record<string, unknown>,\n): string {\n const invocationParams = extraParams?.invocation_params;\n if (invocationParams && typeof invocationParams === \"object\") {\n const model =\n (invocationParams as { model?: unknown; model_name?: unknown }).model ??\n (invocationParams as { model?: unknown; model_name?: unknown }).model_name;\n if (typeof model === \"string\" && model.length > 0) return model;\n }\n if (llm !== undefined && typeof llm.name === \"string\" && llm.name.length > 0) {\n return llm.name;\n }\n return \"unknown\";\n}\n\nfunction toolNameOf(tool: SerializedLike | undefined): string {\n if (tool !== undefined && typeof tool.name === \"string\" && tool.name.length > 0) {\n return tool.name;\n }\n return \"unknown\";\n}\n\n/**\n * LangChain JS passes `handleChatModelStart` a nested `BaseMessage[][]` —\n * one array per \"prompt\" in a batch call. The decomposer expects a flat\n * list of message objects, so flatten one level (mirrors Python's\n * `_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 `extra.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\nfunction applyTokenUsage(handle: SpanHandle, output: LLMResultLike | undefined): void {\n const usage = output?.llmOutput?.tokenUsage;\n if (!usage || typeof usage !== \"object\") return;\n const prompt = (usage as Record<string, unknown>).promptTokens;\n const completion = (usage as Record<string, unknown>).completionTokens;\n const total = (usage as Record<string, unknown>).totalTokens;\n if (typeof prompt === \"number\" && Number.isFinite(prompt)) {\n handle.span.input_tokens = prompt;\n }\n if (typeof completion === \"number\" && Number.isFinite(completion)) {\n handle.span.output_tokens = completion;\n }\n if (typeof total === \"number\" && Number.isFinite(total)) {\n handle.span.total_tokens = total;\n } else if (\n typeof handle.span.input_tokens === \"number\" &&\n typeof handle.span.output_tokens === \"number\"\n ) {\n handle.span.total_tokens = handle.span.input_tokens + handle.span.output_tokens;\n }\n if (\n handle.span.cost_usd === undefined &&\n handle.span.model &&\n (typeof handle.span.input_tokens === \"number\" || typeof handle.span.output_tokens === \"number\")\n ) {\n const cost = calculateCost({\n inputTokens: handle.span.input_tokens ?? 0,\n outputTokens: handle.span.output_tokens ?? 0,\n model: handle.span.model,\n });\n if (cost !== undefined) handle.span.cost_usd = cost;\n }\n}\n\nfunction popAndEnd(\n map: Map<string, SpanHandle>,\n runId: string,\n err?: unknown,\n mutate?: (handle: SpanHandle) => void,\n): void {\n const handle = map.get(runId);\n if (handle === undefined) return;\n map.delete(runId);\n if (mutate !== undefined) {\n mutate(handle);\n }\n if (err !== undefined) {\n handle.end(err);\n } else {\n handle.end();\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* Factory */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Build the llm + tool slice of an `MorseCallbackHandler`. The\n * returned object can be merged onto the host class instance (W3-L); each\n * method mutates `state` in place so all three fragments share the same\n * `runId → SpanHandle` maps.\n *\n * Every method body is wrapped in `absorbErrorsSync` — telemetry never\n * throws into the LangGraph runtime.\n */\nexport function createLlmAndToolHandlers(\n state: LangGraphRunState,\n options: LlmAndToolHandlerOptions = {},\n): LlmAndToolHandlers {\n const toolInputOpts = options.toolInputMaxBytes\n ? { maxBytes: options.toolInputMaxBytes }\n : undefined;\n const toolOutputOpts = options.toolOutputMaxBytes\n ? { maxBytes: options.toolOutputMaxBytes }\n : undefined;\n\n const _handleLLMStart = (\n llm: SerializedLike,\n _prompts: string[],\n runId: string,\n _parentRunId?: string,\n extraParams?: Record<string, unknown>,\n ): void => {\n const handle = emitLlmSpan({\n adapter: ADAPTER,\n model: llmModelOf(llm, extraParams),\n provider: extractProvider(llm?.id),\n });\n if (handle !== null) {\n state.llmSpans.set(runId, handle);\n }\n };\n\n const _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 — emit a `type=llm` span, same as handleLLMStart.\n // MHQ-750: also decompose the flattened messages (+ bound tools, if\n // any) into context_segments so the dashboard shows context\n // composition for LangGraph JS spans without extra customer config.\n const flatMessages = flattenMessages(messages);\n const contextSegments = decomposeOpenAiMessages(flatMessages, toolsFromExtra(extraParams));\n const handle = emitLlmSpan({\n adapter: ADAPTER,\n model: llmModelOf(llm, extraParams),\n provider: extractProvider(llm?.id),\n contextSegments: contextSegments.length > 0 ? contextSegments : undefined,\n });\n if (handle !== null) {\n state.llmSpans.set(runId, handle);\n }\n };\n\n const _handleLLMEnd = (output: LLMResultLike, runId: string): void => {\n popAndEnd(state.llmSpans, runId, undefined, (handle) => {\n applyTokenUsage(handle, output);\n });\n };\n\n const _handleLLMError = (err: unknown, runId: string): void => {\n popAndEnd(state.llmSpans, runId, err);\n };\n\n const _handleToolStart = (tool: SerializedLike, input: string, runId: string): void => {\n const handle = emitToolSpan({\n adapter: ADAPTER,\n toolName: toolNameOf(tool),\n inputSummary: summarizeToolInput(input, toolInputOpts),\n });\n if (handle !== null) {\n state.toolSpans.set(runId, handle);\n }\n };\n\n const _handleToolEnd = (output: string, runId: string): void => {\n popAndEnd(state.toolSpans, runId, undefined, (handle) => {\n const md = (handle.span.metadata ??= {} as Record<string, unknown>);\n md.tool_output_summary = summarizeToolOutput(output, toolOutputOpts);\n md.success = true;\n });\n };\n\n const _handleToolError = (err: unknown, runId: string): void => {\n popAndEnd(state.toolSpans, runId, err, (handle) => {\n const md = (handle.span.metadata ??= {} as Record<string, unknown>);\n md.success = false;\n });\n };\n\n const fp = \"morse.adapters.langgraph.llm-and-tool\";\n\n return {\n handleLLMStart: absorbErrorsSync(_handleLLMStart, { fingerprint: `${fp}.handleLLMStart` }),\n handleChatModelStart: absorbErrorsSync(_handleChatModelStart, {\n fingerprint: `${fp}.handleChatModelStart`,\n }),\n handleLLMEnd: absorbErrorsSync(_handleLLMEnd, { fingerprint: `${fp}.handleLLMEnd` }),\n handleLLMError: absorbErrorsSync(_handleLLMError, { fingerprint: `${fp}.handleLLMError` }),\n handleToolStart: absorbErrorsSync(_handleToolStart, { fingerprint: `${fp}.handleToolStart` }),\n handleToolEnd: absorbErrorsSync(_handleToolEnd, { fingerprint: `${fp}.handleToolEnd` }),\n handleToolError: absorbErrorsSync(_handleToolError, { fingerprint: `${fp}.handleToolError` }),\n };\n}\n","/**\n * `langgraph/streaming-and-checkpoint.ts` — Phase 13 W2-L.3.\n *\n * Implements streaming-token aggregation for LangGraph JS. Per the design\n * doc, streaming tokens fire `handleLLMNewToken` at very high frequency —\n * we do NOT emit a span per token (would explode volume). Instead we\n * aggregate them onto the parent llm span's `metadata.tokens_streamed`\n * counter so downstream consumers can observe streaming activity without\n * the cardinality blowup.\n *\n * Checkpoint hooks (PostgresSaver / SqliteSaver / MemorySaver) are\n * deferred to v1.5 per the design doc. The surface is left empty here;\n * W3-L composes this module with the others and may add checkpoint\n * instrumentation in a follow-up wave without touching the wiring.\n *\n * All wrappers route through `absorbErrorsSync` — telemetry MUST NOT\n * throw at the caller.\n */\n\nimport { absorbErrorsSync } from \"../_internal/errors\";\nimport type { SpanHandle } from \"../_internal/tracing\";\nimport type { CallbackHandlerSurface } from \"./types\";\n\nconst ADAPTER_FINGERPRINT = \"langgraph.streaming\" as const;\n\n/** State carried across streaming-token events for an in-flight chain run. */\nexport interface StreamingState {\n /** Map of `runId` → SpanHandle (the in-flight llm span W2-L.2 opened). */\n llmSpans: Map<string, SpanHandle>;\n}\n\nexport interface StreamingHandlerOptions {\n /**\n * If true, emit a single `tokens_streamed` metadata count on the parent\n * llm span; default true. If false, the handler is a no-op (useful when\n * the host already tracks streaming elsewhere or wants to minimise\n * mutation under hot streaming loops).\n */\n trackStreamingTokens?: boolean;\n}\n\n/**\n * Returns the streaming-related callback method implementations.\n *\n * Currently exposes only `handleLLMNewToken`. Checkpoint methods\n * (`handleCheckpointStart` / `handleCheckpointEnd`) are not on the\n * `CallbackHandlerSurface` for v1 — they will land in v1.5 when we wire\n * the PostgresSaver/SqliteSaver hooks. Keeping this module in place\n * means W3-L's composition does not change shape when those land.\n */\nexport function createStreamingHandlers(\n state: StreamingState,\n options?: StreamingHandlerOptions,\n): Pick<CallbackHandlerSurface, \"handleLLMNewToken\"> {\n const trackStreamingTokens = options?.trackStreamingTokens ?? true;\n\n const handleLLMNewToken = absorbErrorsSync(\n (_token: string, _idx: { prompt: number; completion: number }, runId: string): void => {\n if (!trackStreamingTokens) return;\n const handle = state.llmSpans.get(runId);\n if (handle === undefined) {\n // No matching llm span — happens when the host fires tokens\n // before `handleLLMStart` or after `handleLLMEnd`, or when the\n // runId is unknown (orphan event). Drop silently.\n return;\n }\n const md = (handle.span.metadata ?? {}) as Record<string, unknown>;\n const prev = typeof md.tokens_streamed === \"number\" ? md.tokens_streamed : 0;\n md.tokens_streamed = prev + 1;\n handle.span.metadata = md;\n },\n { fingerprint: ADAPTER_FINGERPRINT },\n );\n\n return { handleLLMNewToken };\n}\n","/**\n * `@morsehq-dev/sdk/langgraph` — adapter for `@langchain/langgraph` (langgraphjs).\n *\n * W3-L: composes the three W2-L surfaces into a single\n * `MorseCallbackHandler` class exposing the full\n * `BaseCallbackHandler` shape LangGraph requires:\n *\n * - chain start/end/error — from W2-L.1 (`callback-handler.ts`)\n * - llm + tool start/end/error — from W2-L.2 (`llm-and-tool-callbacks.ts`)\n * - llm new-token streaming — from W2-L.3 (`streaming-and-checkpoint.ts`)\n *\n * Users get a single class to register with LangGraph:\n *\n * ```ts\n * import { MorseCallbackHandler } from \"@morsehq-dev/sdk/langgraph\";\n * await app.invoke(input, { callbacks: [new MorseCallbackHandler()] });\n * ```\n *\n * The W2-L.1 base class keeps its own private map of open chain spans\n * (since it predates the shared `LangGraphRunState`). To keep things\n * coherent for advanced consumers reading `state`, the composed class\n * overrides `handleChainStart` / `handleChainEnd` / `handleChainError`\n * to ALSO maintain `state.chainSpans` in addition to calling the\n * super-class method. The base-class behavior is unchanged.\n */\n\nimport type { SpanHandle } from \"../_internal/tracing\";\nimport {\n MorseCallbackHandler as BaseMorseCallbackHandler,\n type MorseCallbackHandlerOptions,\n getCallbackHandlerClass,\n} from \"./callback-handler\";\nimport {\n createLlmAndToolHandlers,\n type LangGraphRunState,\n type LlmAndToolHandlerOptions,\n} from \"./llm-and-tool-callbacks\";\nimport { createStreamingHandlers, type StreamingHandlerOptions } from \"./streaming-and-checkpoint\";\nimport type { CallbackHandlerSurface, SerializedLike } from \"./types\";\n\n/** Combined options for the composed handler. */\nexport type ComposedMorseCallbackHandlerOptions = MorseCallbackHandlerOptions &\n LlmAndToolHandlerOptions &\n StreamingHandlerOptions;\n\n/**\n * Composed `MorseCallbackHandler` — the user-facing class.\n *\n * Inherits chain handlers from `BaseMorseCallbackHandler` (W2-L.1)\n * and attaches the W2-L.2 llm/tool methods and W2-L.3 streaming method\n * onto each instance. All four sources share a single\n * `LangGraphRunState` so future cross-method correlation can read\n * llm/tool/chain maps from one place.\n */\nexport class MorseCallbackHandler\n extends BaseMorseCallbackHandler\n implements CallbackHandlerSurface\n{\n private readonly _state: LangGraphRunState;\n\n // The slotted methods from W2-L.2 / W2-L.3 — `!` because they are\n // assigned in the constructor via `Object.assign`-style copy.\n public handleLLMStart!: NonNullable<CallbackHandlerSurface[\"handleLLMStart\"]>;\n public handleChatModelStart!: NonNullable<CallbackHandlerSurface[\"handleChatModelStart\"]>;\n public handleLLMEnd!: NonNullable<CallbackHandlerSurface[\"handleLLMEnd\"]>;\n public handleLLMError!: NonNullable<CallbackHandlerSurface[\"handleLLMError\"]>;\n public handleToolStart!: NonNullable<CallbackHandlerSurface[\"handleToolStart\"]>;\n public handleToolEnd!: NonNullable<CallbackHandlerSurface[\"handleToolEnd\"]>;\n public handleToolError!: NonNullable<CallbackHandlerSurface[\"handleToolError\"]>;\n public handleLLMNewToken!: NonNullable<CallbackHandlerSurface[\"handleLLMNewToken\"]>;\n\n constructor(options?: ComposedMorseCallbackHandlerOptions) {\n super(options);\n\n this._state = {\n llmSpans: new Map<string, SpanHandle>(),\n toolSpans: new Map<string, SpanHandle>(),\n chainSpans: new Map<string, SpanHandle>(),\n };\n\n const llmAndTool = createLlmAndToolHandlers(this._state, {\n toolInputMaxBytes: options?.toolInputMaxBytes,\n toolOutputMaxBytes: options?.toolOutputMaxBytes,\n });\n const streaming = createStreamingHandlers(this._state, {\n trackStreamingTokens: options?.trackStreamingTokens,\n });\n\n // Copy method implementations onto the instance so LangGraph (which\n // looks up handlers via `typeof handler[method] === \"function\"` on\n // the instance) sees them. Use non-null assertions because the\n // factories always return defined methods.\n this.handleLLMStart = llmAndTool.handleLLMStart!;\n this.handleChatModelStart = llmAndTool.handleChatModelStart!;\n this.handleLLMEnd = llmAndTool.handleLLMEnd!;\n this.handleLLMError = llmAndTool.handleLLMError!;\n this.handleToolStart = llmAndTool.handleToolStart!;\n this.handleToolEnd = llmAndTool.handleToolEnd!;\n this.handleToolError = llmAndTool.handleToolError!;\n this.handleLLMNewToken = streaming.handleLLMNewToken!;\n }\n\n /**\n * The W2-L.1 base maintains its own private chain-span map. We\n * mirror chain handles into the shared `LangGraphRunState` so future\n * cross-fragment logic can correlate by runId. Never throws — the\n * map mutation is in-process and the super method already absorbs\n * errors via `absorbErrorsSync`.\n */\n override handleChainStart(\n chain: SerializedLike,\n inputs: Record<string, unknown>,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n runType?: string,\n runName?: string,\n ): void {\n super.handleChainStart(chain, inputs, runId, parentRunId, tags, metadata, runType, runName);\n // Mirror — read the now-open span from the base via the internal\n // accessor used in tests, then re-insert it (the base `_takeSpan`\n // deletes on read, so we'd break the base if we used it here).\n // Instead reach into the base via the public-ish `_setSpan` would\n // double-insert; safer to keep our own shadow keyed off the same\n // runId.\n this._shadowSetChainSpan(runId);\n }\n\n override handleChainEnd(\n outputs: Record<string, unknown>,\n runId: string,\n parentRunId?: string,\n ): void {\n super.handleChainEnd(outputs, runId, parentRunId);\n this._state.chainSpans.delete(runId);\n }\n\n override handleChainError(err: unknown, runId: string, parentRunId?: string): void {\n super.handleChainError(err, runId, parentRunId);\n this._state.chainSpans.delete(runId);\n }\n\n /**\n * Marker insertion for the shared chainSpans map. The W2-L.1 base\n * holds the real `SpanHandle` privately; for the shared map we just\n * need *presence* keyed by runId so downstream fragments can detect\n * an in-flight chain. We stash a sentinel handle whose `end()` is a\n * no-op — the base owns the real lifecycle.\n */\n private _shadowSetChainSpan(runId: string): void {\n if (typeof runId !== \"string\" || runId.length === 0) return;\n const sentinel: SpanHandle = {\n // The base owns the real SpanData — for the shadow we use a\n // minimal stand-in. Downstream readers only check map membership,\n // not field access on this object.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n span: {} as any,\n end(): void {\n /* no-op */\n },\n };\n this._state.chainSpans.set(runId, sentinel);\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* Re-exports */\n/* ------------------------------------------------------------------------ */\n\n// Low-level pieces for advanced users who want to compose their own\n// handler shape.\nexport { BaseMorseCallbackHandler };\nexport { getCallbackHandlerClass };\nexport { createLlmAndToolHandlers } from \"./llm-and-tool-callbacks\";\nexport { createStreamingHandlers } from \"./streaming-and-checkpoint\";\n\nexport type {\n MorseCallbackHandlerOptions,\n LangGraphRunState,\n LlmAndToolHandlerOptions,\n StreamingHandlerOptions,\n};\n\nexport type {\n BaseMessageLike,\n CallbackHandlerSurface,\n LangChainCoreCallbacksModuleLike,\n LLMResultLike,\n SerializedLike,\n} from \"./types\";\n"]}
1
+ {"version":3,"sources":["../../src/langgraph/callback-handler.ts","../../src/langgraph/llm-and-tool-callbacks.ts","../../src/langgraph/streaming-and-checkpoint.ts","../../src/langgraph/index.ts"],"names":["absorbErrorsSync","emitAgentSpan","ADAPTER","calculateCost","setActiveFramework","emitLlmSpan","capturePrompts","decomposeOpenAiMessages","captureLangChainMessages","extractLangChainOutputText","emitToolSpan","summarizeToolInput","summarizeToolOutput","MorseCallbackHandler"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * `@morsehq-dev/sdk/langgraph` — `MorseCallbackHandler` (W2-L.1).\n *\n * The handler is registered by LangGraph users via:\n *\n * ```ts\n * import { MorseCallbackHandler } from \"@morsehq-dev/sdk/langgraph\";\n * await app.invoke(input, { callbacks: [new MorseCallbackHandler()] });\n * ```\n *\n * LangGraph type-checks handlers structurally (by method presence on the\n * instance), not via `instanceof BaseCallbackHandler`. We therefore:\n *\n * 1. Always export a duck-typed class implementing `CallbackHandlerSurface`\n * — works without `@langchain/core` installed.\n * 2. Provide `getCallbackHandlerClass()` for users who rely on\n * `instanceof BaseCallbackHandler` — it dynamically loads\n * `@langchain/core/callbacks/base` (optional peer dep) and returns a\n * subclass whose prototype chain includes the real base class.\n *\n * Scope of THIS file (W2-L.1): chain spans only. `handleChainStart` opens\n * an `agent` span (the LangGraph chain IS the agent run); `handleChainEnd`\n * / `handleChainError` closes it. Nested chains nest via the per-runId\n * span map — LangGraph guarantees well-ordered start/end pairs so the\n * tracing-state span stack handles `parent_span_id` linkage for us.\n *\n * `handleLLMStart/End`, `handleToolStart/End`, and streaming callbacks\n * are implemented in W2-L.2 / W2-L.3 as separate methods on the same\n * class (composed in Wave 3-L).\n */\n\nimport { absorbErrorsSync } from \"../_internal/errors\";\nimport type { SpanHandle } from \"../_internal/tracing\";\nimport { emitAgentSpan } from \"../_agent-sdk-common/span-emitter\";\nimport type {\n CallbackHandlerSurface,\n LangChainCoreCallbacksModuleLike,\n SerializedLike,\n} from \"./types\";\n\n/* ------------------------------------------------------------------------ */\n/* Public surface */\n/* ------------------------------------------------------------------------ */\n\nexport interface MorseCallbackHandlerOptions {\n /**\n * Override the agent name on the outer chain span. Falls back, in order,\n * to: `runName` (LangGraph-supplied per-invocation name), `chain.name`\n * (the serialized class name), then `\"langgraph-agent\"`.\n */\n defaultAgentName?: string;\n}\n\nconst ADAPTER = \"langgraph-js\";\nconst HANDLER_NAME = \"morse_callback_handler\";\nconst DEFAULT_AGENT_NAME_FALLBACK = \"langgraph-agent\";\n\n/**\n * Duck-typed LangGraph `BaseCallbackHandler`. Implements `CallbackHandlerSurface`\n * with chain-start / chain-end / chain-error wired to the Morse trace.\n *\n * LangGraph routes callbacks to instance methods by name; it does NOT require\n * an `instanceof` check against the real `BaseCallbackHandler`. Users who\n * need that (rare; `instanceof` checks in custom middleware) should obtain\n * the class via `getCallbackHandlerClass()` instead.\n */\nexport class MorseCallbackHandler implements CallbackHandlerSurface {\n /** Required by LangGraph's `BaseCallbackHandler` interface. */\n public readonly name: string = HANDLER_NAME;\n\n private readonly defaultAgentName: string | undefined;\n\n /** Open chain spans, keyed by LangGraph `runId`. */\n private readonly chainSpans: Map<string, SpanHandle> = new Map();\n\n constructor(options?: MorseCallbackHandlerOptions) {\n this.defaultAgentName = options?.defaultAgentName;\n }\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 _runType?: string,\n runName?: string,\n ): void {\n _handleChainStartImpl(this, chain, runId, runName);\n }\n\n handleChainEnd(_outputs: Record<string, unknown>, runId: string, parentRunId?: string): void {\n void parentRunId;\n _handleChainEndImpl(this, runId);\n }\n\n handleChainError(err: unknown, runId: string, parentRunId?: string): void {\n void parentRunId;\n _handleChainErrorImpl(this, err, runId);\n }\n\n /* ------ Internal accessors used by the absorbErrorsSync-wrapped impls ----- */\n\n /** @internal */\n _setSpan(runId: string, handle: SpanHandle): void {\n this.chainSpans.set(runId, handle);\n }\n\n /** @internal */\n _takeSpan(runId: string): SpanHandle | undefined {\n const handle = this.chainSpans.get(runId);\n if (handle) this.chainSpans.delete(runId);\n return handle;\n }\n\n /** @internal */\n _resolveAgentName(chain: SerializedLike | undefined, runName: string | undefined): string {\n if (typeof runName === \"string\" && runName.length > 0) return runName;\n if (chain && typeof chain.name === \"string\" && chain.name.length > 0) return chain.name;\n if (this.defaultAgentName && this.defaultAgentName.length > 0) return this.defaultAgentName;\n return DEFAULT_AGENT_NAME_FALLBACK;\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* Implementation bodies (wrapped in absorbErrorsSync) */\n/* ------------------------------------------------------------------------ */\n\nconst _handleChainStartImpl: (\n self: MorseCallbackHandler,\n chain: SerializedLike | undefined,\n runId: string,\n runName: string | undefined,\n) => void = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n chain: SerializedLike | undefined,\n runId: string,\n runName: string | undefined,\n ) => {\n if (typeof runId !== \"string\" || runId.length === 0) return;\n // Defensive: if LangGraph re-fires start for the same runId, leak nothing.\n if (self._takeSpan(runId)) {\n // (we just popped it — drop on the floor; the dangling end will be a no-op)\n }\n const agentName = self._resolveAgentName(chain, runName);\n const handle = emitAgentSpan({ adapter: ADAPTER, agentName });\n if (handle) self._setSpan(runId, handle);\n },\n { fingerprint: \"morse.langgraph.handleChainStart\" },\n) as (\n self: MorseCallbackHandler,\n chain: SerializedLike | undefined,\n runId: string,\n runName: string | undefined,\n) => void;\n\nconst _handleChainEndImpl: (self: MorseCallbackHandler, runId: string) => void = absorbErrorsSync(\n (self: MorseCallbackHandler, runId: string) => {\n const handle = self._takeSpan(runId);\n if (handle) handle.end();\n },\n { fingerprint: \"morse.langgraph.handleChainEnd\" },\n) as (self: MorseCallbackHandler, runId: string) => void;\n\nconst _handleChainErrorImpl: (self: MorseCallbackHandler, err: unknown, runId: string) => void =\n absorbErrorsSync(\n (self: MorseCallbackHandler, err: unknown, runId: string) => {\n const handle = self._takeSpan(runId);\n if (handle) handle.end(err ?? new Error(\"langgraph chain error\"));\n },\n { fingerprint: \"morse.langgraph.handleChainError\" },\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 an `MorseCallbackHandler`-shaped class whose prototype chain\n * includes the real `BaseCallbackHandler` (for users relying on\n * `instanceof BaseCallbackHandler` checks). Otherwise return the\n * duck-typed `MorseCallbackHandler` defined above.\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 // Build a subclass that mixes the real Base class into the prototype chain\n // while preserving the chain-span behavior. We do this lazily so that\n // simply importing this module does NOT require `@langchain/core`.\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(\n chain: SerializedLike,\n inputs: Record<string, unknown>,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n runType?: string,\n runName?: string,\n ): void {\n this._av.handleChainStart(\n chain,\n inputs,\n runId,\n parentRunId,\n tags,\n metadata,\n runType,\n runName,\n );\n }\n handleChainEnd(outputs: Record<string, unknown>, runId: string, parentRunId?: string): void {\n this._av.handleChainEnd(outputs, runId, parentRunId);\n }\n handleChainError(err: unknown, runId: string, parentRunId?: string): void {\n this._av.handleChainError(err, runId, parentRunId);\n }\n }\n return MorseCallbackHandlerWithBase as unknown as typeof MorseCallbackHandler;\n}\n","/**\n * `langgraph/llm-and-tool-callbacks.ts` — W2-L.2.\n *\n * LangGraph JS callback handler fragment that owns the llm + tool surface\n * of `BaseCallbackHandler`. The class shell (constructor + chain methods)\n * is owned by W2-L.1 (`callback-handler.ts`); streaming + checkpoint by\n * W2-L.3 (`streaming-and-checkpoint.ts`). All three are composed together\n * by W3-L (`langgraph/index.ts`).\n *\n * To stay file-disjoint across the three W2-L tasks, each fragment exports\n * a `createX` factory that returns plain method implementations operating\n * on a shared mutable `LangGraphRunState`. The host class threads its\n * `state` reference through each factory in its constructor and copies the\n * methods onto its prototype/instance.\n *\n * Logical span mapping (per design.md §LangGraph JS):\n * handleLLMStart / handleChatModelStart → open `type=llm` span\n * handleLLMEnd / handleLLMError → close active llm span\n * handleToolStart → open `type=tool` span\n * handleToolEnd / handleToolError → close active tool span\n *\n * MHQ-750: `handleChatModelStart` also decomposes the flattened messages\n * (+ any bound `tools`) into `context_segments` via the shared\n * `_agent-sdk-common/context-decomposer`, mirroring the Python adapter's\n * `on_chat_model_start` (`adapters/langgraph.py`), which calls the same\n * `decompose_openai_messages` for the same reason: LangGraph JS messages\n * are `@langchain/core` `BaseMessage`s, which decompose cleanly under the\n * OpenAI-chat-format decomposer's `_getType()`/`.type` duck-typing.\n *\n * All bodies are wrapped in `absorbErrorsSync` so telemetry can never\n * throw at the host LangGraph runtime.\n */\n\nimport { absorbErrorsSync } from \"../_internal/errors\";\nimport { calculateCost } from \"../_internal/pricing\";\nimport type { SpanHandle } from \"../_internal/tracing\";\nimport { emitLlmSpan, emitToolSpan } from \"../_agent-sdk-common/span-emitter\";\nimport { setActiveFramework } from \"../_internal/active-framework\";\nimport {\n captureLangChainMessages,\n capturePrompts,\n extractLangChainOutputText,\n} from \"../_internal/llm-io\";\nimport { summarizeToolInput, summarizeToolOutput } from \"../_agent-sdk-common/redaction\";\nimport { decomposeOpenAiMessages } from \"../_agent-sdk-common/context-decomposer\";\nimport type {\n BaseMessageLike,\n CallbackHandlerSurface,\n LLMResultLike,\n SerializedLike,\n} from \"./types\";\n\nconst ADAPTER = \"langgraph-js\" as const;\n// MHQ-859: the framework label is cross-language and must match Python's\n// `langgraph.py::_framework_name` exactly — it is what the server groups on,\n// so \"langgraph-js\" here would split one framework into two.\nconst FRAMEWORK = \"langgraph\" as const;\n\n/* ------------------------------------------------------------------------ */\n/* Shared run state */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Shared per-instance state for the composed `MorseCallbackHandler`.\n * Owned/instantiated by W3-L (`langgraph/index.ts`); each W2-L fragment\n * mutates it in place.\n */\nexport interface LangGraphRunState {\n /** Map of runId → SpanHandle for open llm spans. */\n llmSpans: Map<string, SpanHandle>;\n /** Map of runId → SpanHandle for open tool spans. */\n toolSpans: Map<string, SpanHandle>;\n /** Map of runId → SpanHandle for open chain spans (populated by W2-L.1). */\n chainSpans: Map<string, SpanHandle>;\n}\n\nexport interface LlmAndToolHandlerOptions {\n /** Max bytes for tool input summary. Falls through to module default if unset. */\n toolInputMaxBytes?: number;\n /** Max bytes for tool output summary. Falls through to module default if unset. */\n toolOutputMaxBytes?: number;\n}\n\n/** Convenient public type alias for the slice of methods this file owns. */\nexport type LlmAndToolHandlers = Pick<\n CallbackHandlerSurface,\n | \"handleLLMStart\"\n | \"handleChatModelStart\"\n | \"handleLLMEnd\"\n | \"handleLLMError\"\n | \"handleToolStart\"\n | \"handleToolEnd\"\n | \"handleToolError\"\n>;\n\n/* ------------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Extract a provider hint from the `id` path produced by LangChain's\n * `Serializable` machinery. The first segment is usually the package name\n * (`langchain_openai`, `langchain_anthropic`, `langchain_google_vertexai`,\n * etc.). We strip the `langchain_` prefix when present and return the\n * remainder; otherwise we return the first segment verbatim. Returns\n * `undefined` when no identifying segment is available.\n */\nfunction extractProvider(id: string[] | undefined): string | undefined {\n if (!Array.isArray(id) || id.length === 0) return undefined;\n const first = id[0];\n if (typeof first !== \"string\" || first.length === 0) return undefined;\n if (first.startsWith(\"langchain_\")) {\n const tail = first.slice(\"langchain_\".length);\n return tail.length > 0 ? tail : undefined;\n }\n return first;\n}\n\n/**\n * MHQ-788: `llm.name` is LangChain's `Serializable` class name (e.g.\n * `\"ChatOpenAI\"`), never the actual model string — it was always the wrong\n * field, and empty in practice for the real `@langchain/openai` callback\n * invocation this bug was found against. The real model lives in\n * `extraParams.invocation_params.model` (see `chat_models.cjs`'s\n * `invocationParams()` — every provider's chat model puts its model field\n * there before calling `handleChatModelStart`/`handleLLMStart`).\n * `llm.name` is kept only as a last-resort fallback for providers that\n * don't populate `invocation_params.model` for some reason.\n */\nfunction llmModelOf(\n llm: SerializedLike | undefined,\n extraParams?: Record<string, unknown>,\n): string {\n const invocationParams = extraParams?.invocation_params;\n if (invocationParams && typeof invocationParams === \"object\") {\n const model =\n (invocationParams as { model?: unknown; model_name?: unknown }).model ??\n (invocationParams as { model?: unknown; model_name?: unknown }).model_name;\n if (typeof model === \"string\" && model.length > 0) return model;\n }\n if (llm !== undefined && typeof llm.name === \"string\" && llm.name.length > 0) {\n return llm.name;\n }\n return \"unknown\";\n}\n\nfunction toolNameOf(tool: SerializedLike | undefined): string {\n if (tool !== undefined && typeof tool.name === \"string\" && tool.name.length > 0) {\n return tool.name;\n }\n return \"unknown\";\n}\n\n/**\n * LangChain JS passes `handleChatModelStart` a nested `BaseMessage[][]` —\n * one array per \"prompt\" in a batch call. The decomposer expects a flat\n * list of message objects, so flatten one level (mirrors Python's\n * `_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 `extra.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\nfunction applyTokenUsage(handle: SpanHandle, output: LLMResultLike | undefined): void {\n const usage = output?.llmOutput?.tokenUsage;\n if (!usage || typeof usage !== \"object\") return;\n const prompt = (usage as Record<string, unknown>).promptTokens;\n const completion = (usage as Record<string, unknown>).completionTokens;\n const total = (usage as Record<string, unknown>).totalTokens;\n if (typeof prompt === \"number\" && Number.isFinite(prompt)) {\n handle.span.input_tokens = prompt;\n }\n if (typeof completion === \"number\" && Number.isFinite(completion)) {\n handle.span.output_tokens = completion;\n }\n if (typeof total === \"number\" && Number.isFinite(total)) {\n handle.span.total_tokens = total;\n } else if (\n typeof handle.span.input_tokens === \"number\" &&\n typeof handle.span.output_tokens === \"number\"\n ) {\n handle.span.total_tokens = handle.span.input_tokens + handle.span.output_tokens;\n }\n if (\n handle.span.cost_usd === undefined &&\n handle.span.model &&\n (typeof handle.span.input_tokens === \"number\" || typeof handle.span.output_tokens === \"number\")\n ) {\n const cost = calculateCost({\n inputTokens: handle.span.input_tokens ?? 0,\n outputTokens: handle.span.output_tokens ?? 0,\n model: handle.span.model,\n });\n if (cost !== undefined) handle.span.cost_usd = cost;\n }\n}\n\nfunction popAndEnd(\n map: Map<string, SpanHandle>,\n runId: string,\n err?: unknown,\n mutate?: (handle: SpanHandle) => void,\n): void {\n const handle = map.get(runId);\n if (handle === undefined) return;\n map.delete(runId);\n if (mutate !== undefined) {\n mutate(handle);\n }\n if (err !== undefined) {\n handle.end(err);\n } else {\n handle.end();\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* Factory */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Build the llm + tool slice of an `MorseCallbackHandler`. The\n * returned object can be merged onto the host class instance (W3-L); each\n * method mutates `state` in place so all three fragments share the same\n * `runId → SpanHandle` maps.\n *\n * Every method body is wrapped in `absorbErrorsSync` — telemetry never\n * throws into the LangGraph runtime.\n */\nexport function createLlmAndToolHandlers(\n state: LangGraphRunState,\n options: LlmAndToolHandlerOptions = {},\n): LlmAndToolHandlers {\n const toolInputOpts = options.toolInputMaxBytes\n ? { maxBytes: options.toolInputMaxBytes }\n : undefined;\n const toolOutputOpts = options.toolOutputMaxBytes\n ? { maxBytes: options.toolOutputMaxBytes }\n : undefined;\n\n const _handleLLMStart = (\n llm: SerializedLike,\n prompts: string[],\n runId: string,\n _parentRunId?: string,\n extraParams?: Record<string, unknown>,\n ): void => {\n setActiveFramework(FRAMEWORK);\n const handle = emitLlmSpan({\n adapter: ADAPTER,\n model: llmModelOf(llm, extraParams),\n provider: extractProvider(llm?.id),\n inputData: capturePrompts(prompts),\n });\n if (handle !== null) {\n state.llmSpans.set(runId, handle);\n }\n };\n\n const _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 — emit a `type=llm` span, same as handleLLMStart.\n // MHQ-750: also decompose the flattened messages (+ bound tools, if\n // any) into context_segments so the dashboard shows context\n // composition for LangGraph JS spans without extra customer config.\n const flatMessages = flattenMessages(messages);\n const contextSegments = decomposeOpenAiMessages(flatMessages, toolsFromExtra(extraParams));\n setActiveFramework(FRAMEWORK);\n const handle = emitLlmSpan({\n adapter: ADAPTER,\n model: llmModelOf(llm, extraParams),\n provider: extractProvider(llm?.id),\n contextSegments: contextSegments.length > 0 ? contextSegments : undefined,\n inputData: captureLangChainMessages(flatMessages),\n });\n if (handle !== null) {\n state.llmSpans.set(runId, handle);\n }\n };\n\n const _handleLLMEnd = (output: LLMResultLike, runId: string): void => {\n popAndEnd(state.llmSpans, runId, undefined, (handle) => {\n applyTokenUsage(handle, output);\n // MHQ-858: the response text is only available at end-of-call, so\n // output_data is set here rather than on the emitLlmSpan above.\n const outputText = extractLangChainOutputText(output?.generations);\n if (outputText !== undefined) handle.span.output_data = { content: outputText };\n });\n };\n\n const _handleLLMError = (err: unknown, runId: string): void => {\n popAndEnd(state.llmSpans, runId, err);\n };\n\n const _handleToolStart = (tool: SerializedLike, input: string, runId: string): void => {\n const handle = emitToolSpan({\n adapter: ADAPTER,\n toolName: toolNameOf(tool),\n inputSummary: summarizeToolInput(input, toolInputOpts),\n });\n if (handle !== null) {\n state.toolSpans.set(runId, handle);\n }\n };\n\n const _handleToolEnd = (output: string, runId: string): void => {\n popAndEnd(state.toolSpans, runId, undefined, (handle) => {\n const md = (handle.span.metadata ??= {} as Record<string, unknown>);\n md.tool_output_summary = summarizeToolOutput(output, toolOutputOpts);\n md.success = true;\n });\n };\n\n const _handleToolError = (err: unknown, runId: string): void => {\n popAndEnd(state.toolSpans, runId, err, (handle) => {\n const md = (handle.span.metadata ??= {} as Record<string, unknown>);\n md.success = false;\n });\n };\n\n const fp = \"morse.adapters.langgraph.llm-and-tool\";\n\n return {\n handleLLMStart: absorbErrorsSync(_handleLLMStart, { fingerprint: `${fp}.handleLLMStart` }),\n handleChatModelStart: absorbErrorsSync(_handleChatModelStart, {\n fingerprint: `${fp}.handleChatModelStart`,\n }),\n handleLLMEnd: absorbErrorsSync(_handleLLMEnd, { fingerprint: `${fp}.handleLLMEnd` }),\n handleLLMError: absorbErrorsSync(_handleLLMError, { fingerprint: `${fp}.handleLLMError` }),\n handleToolStart: absorbErrorsSync(_handleToolStart, { fingerprint: `${fp}.handleToolStart` }),\n handleToolEnd: absorbErrorsSync(_handleToolEnd, { fingerprint: `${fp}.handleToolEnd` }),\n handleToolError: absorbErrorsSync(_handleToolError, { fingerprint: `${fp}.handleToolError` }),\n };\n}\n","/**\n * `langgraph/streaming-and-checkpoint.ts` — Phase 13 W2-L.3.\n *\n * Implements streaming-token aggregation for LangGraph JS. Per the design\n * doc, streaming tokens fire `handleLLMNewToken` at very high frequency —\n * we do NOT emit a span per token (would explode volume). Instead we\n * aggregate them onto the parent llm span's `metadata.tokens_streamed`\n * counter so downstream consumers can observe streaming activity without\n * the cardinality blowup.\n *\n * Checkpoint hooks (PostgresSaver / SqliteSaver / MemorySaver) are\n * deferred to v1.5 per the design doc. The surface is left empty here;\n * W3-L composes this module with the others and may add checkpoint\n * instrumentation in a follow-up wave without touching the wiring.\n *\n * All wrappers route through `absorbErrorsSync` — telemetry MUST NOT\n * throw at the caller.\n */\n\nimport { absorbErrorsSync } from \"../_internal/errors\";\nimport type { SpanHandle } from \"../_internal/tracing\";\nimport type { CallbackHandlerSurface } from \"./types\";\n\nconst ADAPTER_FINGERPRINT = \"langgraph.streaming\" as const;\n\n/** State carried across streaming-token events for an in-flight chain run. */\nexport interface StreamingState {\n /** Map of `runId` → SpanHandle (the in-flight llm span W2-L.2 opened). */\n llmSpans: Map<string, SpanHandle>;\n}\n\nexport interface StreamingHandlerOptions {\n /**\n * If true, emit a single `tokens_streamed` metadata count on the parent\n * llm span; default true. If false, the handler is a no-op (useful when\n * the host already tracks streaming elsewhere or wants to minimise\n * mutation under hot streaming loops).\n */\n trackStreamingTokens?: boolean;\n}\n\n/**\n * Returns the streaming-related callback method implementations.\n *\n * Currently exposes only `handleLLMNewToken`. Checkpoint methods\n * (`handleCheckpointStart` / `handleCheckpointEnd`) are not on the\n * `CallbackHandlerSurface` for v1 — they will land in v1.5 when we wire\n * the PostgresSaver/SqliteSaver hooks. Keeping this module in place\n * means W3-L's composition does not change shape when those land.\n */\nexport function createStreamingHandlers(\n state: StreamingState,\n options?: StreamingHandlerOptions,\n): Pick<CallbackHandlerSurface, \"handleLLMNewToken\"> {\n const trackStreamingTokens = options?.trackStreamingTokens ?? true;\n\n const handleLLMNewToken = absorbErrorsSync(\n (_token: string, _idx: { prompt: number; completion: number }, runId: string): void => {\n if (!trackStreamingTokens) return;\n const handle = state.llmSpans.get(runId);\n if (handle === undefined) {\n // No matching llm span — happens when the host fires tokens\n // before `handleLLMStart` or after `handleLLMEnd`, or when the\n // runId is unknown (orphan event). Drop silently.\n return;\n }\n const md = (handle.span.metadata ?? {}) as Record<string, unknown>;\n const prev = typeof md.tokens_streamed === \"number\" ? md.tokens_streamed : 0;\n md.tokens_streamed = prev + 1;\n handle.span.metadata = md;\n },\n { fingerprint: ADAPTER_FINGERPRINT },\n );\n\n return { handleLLMNewToken };\n}\n","/**\n * `@morsehq-dev/sdk/langgraph` — adapter for `@langchain/langgraph` (langgraphjs).\n *\n * W3-L: composes the three W2-L surfaces into a single\n * `MorseCallbackHandler` class exposing the full\n * `BaseCallbackHandler` shape LangGraph requires:\n *\n * - chain start/end/error — from W2-L.1 (`callback-handler.ts`)\n * - llm + tool start/end/error — from W2-L.2 (`llm-and-tool-callbacks.ts`)\n * - llm new-token streaming — from W2-L.3 (`streaming-and-checkpoint.ts`)\n *\n * Users get a single class to register with LangGraph:\n *\n * ```ts\n * import { MorseCallbackHandler } from \"@morsehq-dev/sdk/langgraph\";\n * await app.invoke(input, { callbacks: [new MorseCallbackHandler()] });\n * ```\n *\n * The W2-L.1 base class keeps its own private map of open chain spans\n * (since it predates the shared `LangGraphRunState`). To keep things\n * coherent for advanced consumers reading `state`, the composed class\n * overrides `handleChainStart` / `handleChainEnd` / `handleChainError`\n * to ALSO maintain `state.chainSpans` in addition to calling the\n * super-class method. The base-class behavior is unchanged.\n */\n\nimport type { SpanHandle } from \"../_internal/tracing\";\nimport {\n MorseCallbackHandler as BaseMorseCallbackHandler,\n type MorseCallbackHandlerOptions,\n getCallbackHandlerClass,\n} from \"./callback-handler\";\nimport {\n createLlmAndToolHandlers,\n type LangGraphRunState,\n type LlmAndToolHandlerOptions,\n} from \"./llm-and-tool-callbacks\";\nimport { createStreamingHandlers, type StreamingHandlerOptions } from \"./streaming-and-checkpoint\";\nimport type { CallbackHandlerSurface, SerializedLike } from \"./types\";\n\n/** Combined options for the composed handler. */\nexport type ComposedMorseCallbackHandlerOptions = MorseCallbackHandlerOptions &\n LlmAndToolHandlerOptions &\n StreamingHandlerOptions;\n\n/**\n * Composed `MorseCallbackHandler` — the user-facing class.\n *\n * Inherits chain handlers from `BaseMorseCallbackHandler` (W2-L.1)\n * and attaches the W2-L.2 llm/tool methods and W2-L.3 streaming method\n * onto each instance. All four sources share a single\n * `LangGraphRunState` so future cross-method correlation can read\n * llm/tool/chain maps from one place.\n */\nexport class MorseCallbackHandler\n extends BaseMorseCallbackHandler\n implements CallbackHandlerSurface\n{\n private readonly _state: LangGraphRunState;\n\n // The slotted methods from W2-L.2 / W2-L.3 — `!` because they are\n // assigned in the constructor via `Object.assign`-style copy.\n public handleLLMStart!: NonNullable<CallbackHandlerSurface[\"handleLLMStart\"]>;\n public handleChatModelStart!: NonNullable<CallbackHandlerSurface[\"handleChatModelStart\"]>;\n public handleLLMEnd!: NonNullable<CallbackHandlerSurface[\"handleLLMEnd\"]>;\n public handleLLMError!: NonNullable<CallbackHandlerSurface[\"handleLLMError\"]>;\n public handleToolStart!: NonNullable<CallbackHandlerSurface[\"handleToolStart\"]>;\n public handleToolEnd!: NonNullable<CallbackHandlerSurface[\"handleToolEnd\"]>;\n public handleToolError!: NonNullable<CallbackHandlerSurface[\"handleToolError\"]>;\n public handleLLMNewToken!: NonNullable<CallbackHandlerSurface[\"handleLLMNewToken\"]>;\n\n constructor(options?: ComposedMorseCallbackHandlerOptions) {\n super(options);\n\n this._state = {\n llmSpans: new Map<string, SpanHandle>(),\n toolSpans: new Map<string, SpanHandle>(),\n chainSpans: new Map<string, SpanHandle>(),\n };\n\n const llmAndTool = createLlmAndToolHandlers(this._state, {\n toolInputMaxBytes: options?.toolInputMaxBytes,\n toolOutputMaxBytes: options?.toolOutputMaxBytes,\n });\n const streaming = createStreamingHandlers(this._state, {\n trackStreamingTokens: options?.trackStreamingTokens,\n });\n\n // Copy method implementations onto the instance so LangGraph (which\n // looks up handlers via `typeof handler[method] === \"function\"` on\n // the instance) sees them. Use non-null assertions because the\n // factories always return defined methods.\n this.handleLLMStart = llmAndTool.handleLLMStart!;\n this.handleChatModelStart = llmAndTool.handleChatModelStart!;\n this.handleLLMEnd = llmAndTool.handleLLMEnd!;\n this.handleLLMError = llmAndTool.handleLLMError!;\n this.handleToolStart = llmAndTool.handleToolStart!;\n this.handleToolEnd = llmAndTool.handleToolEnd!;\n this.handleToolError = llmAndTool.handleToolError!;\n this.handleLLMNewToken = streaming.handleLLMNewToken!;\n }\n\n /**\n * The W2-L.1 base maintains its own private chain-span map. We\n * mirror chain handles into the shared `LangGraphRunState` so future\n * cross-fragment logic can correlate by runId. Never throws — the\n * map mutation is in-process and the super method already absorbs\n * errors via `absorbErrorsSync`.\n */\n override handleChainStart(\n chain: SerializedLike,\n inputs: Record<string, unknown>,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n runType?: string,\n runName?: string,\n ): void {\n super.handleChainStart(chain, inputs, runId, parentRunId, tags, metadata, runType, runName);\n // Mirror — read the now-open span from the base via the internal\n // accessor used in tests, then re-insert it (the base `_takeSpan`\n // deletes on read, so we'd break the base if we used it here).\n // Instead reach into the base via the public-ish `_setSpan` would\n // double-insert; safer to keep our own shadow keyed off the same\n // runId.\n this._shadowSetChainSpan(runId);\n }\n\n override handleChainEnd(\n outputs: Record<string, unknown>,\n runId: string,\n parentRunId?: string,\n ): void {\n super.handleChainEnd(outputs, runId, parentRunId);\n this._state.chainSpans.delete(runId);\n }\n\n override handleChainError(err: unknown, runId: string, parentRunId?: string): void {\n super.handleChainError(err, runId, parentRunId);\n this._state.chainSpans.delete(runId);\n }\n\n /**\n * Marker insertion for the shared chainSpans map. The W2-L.1 base\n * holds the real `SpanHandle` privately; for the shared map we just\n * need *presence* keyed by runId so downstream fragments can detect\n * an in-flight chain. We stash a sentinel handle whose `end()` is a\n * no-op — the base owns the real lifecycle.\n */\n private _shadowSetChainSpan(runId: string): void {\n if (typeof runId !== \"string\" || runId.length === 0) return;\n const sentinel: SpanHandle = {\n // The base owns the real SpanData — for the shadow we use a\n // minimal stand-in. Downstream readers only check map membership,\n // not field access on this object.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n span: {} as any,\n end(): void {\n /* no-op */\n },\n };\n this._state.chainSpans.set(runId, sentinel);\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* Re-exports */\n/* ------------------------------------------------------------------------ */\n\n// Low-level pieces for advanced users who want to compose their own\n// handler shape.\nexport { BaseMorseCallbackHandler };\nexport { getCallbackHandlerClass };\nexport { createLlmAndToolHandlers } from \"./llm-and-tool-callbacks\";\nexport { createStreamingHandlers } from \"./streaming-and-checkpoint\";\n\nexport type {\n MorseCallbackHandlerOptions,\n LangGraphRunState,\n LlmAndToolHandlerOptions,\n StreamingHandlerOptions,\n};\n\nexport type {\n BaseMessageLike,\n CallbackHandlerSurface,\n LangChainCoreCallbacksModuleLike,\n LLMResultLike,\n SerializedLike,\n} from \"./types\";\n"]}
@@ -1,4 +1,4 @@
1
- import { S as SpanHandle } from '../tracing-BYAqjT5Q.cjs';
1
+ import { S as SpanHandle } from '../tracing-CNlre8TK.cjs';
2
2
  import '../spans-DZtMuBvc.cjs';
3
3
 
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { S as SpanHandle } from '../tracing-rz9cWQ8d.js';
1
+ import { S as SpanHandle } from '../tracing-J8ZgxVzU.js';
2
2
  import '../spans-DZtMuBvc.js';
3
3
 
4
4
  /**
@@ -1,9 +1,10 @@
1
- import { summarizeToolInput, summarizeToolOutput } from '../chunk-AEFUXEKV.js';
2
- import { emitAgentSpan, emitLlmSpan, emitToolSpan } from '../chunk-SBGY5NS4.js';
3
- import { absorbErrorsSync } from '../chunk-POCQNSVD.js';
1
+ import { setActiveFramework, capturePrompts, captureLangChainMessages, extractLangChainOutputText } from '../chunk-5RXSICEJ.js';
2
+ import { summarizeToolInput, summarizeToolOutput } from '../chunk-TP3N3S2D.js';
3
+ import { emitAgentSpan, emitLlmSpan, emitToolSpan } from '../chunk-O3Q5L2HY.js';
4
+ import { absorbErrorsSync } from '../chunk-LB6ZLJUR.js';
4
5
  import { calculateCost } from '../chunk-XTKMUJWI.js';
5
- import { decomposeOpenAiMessages } from '../chunk-4R4SHGOK.js';
6
- import '../chunk-LTKGLXAE.js';
6
+ import { decomposeOpenAiMessages } from '../chunk-4JPZV2VZ.js';
7
+ import '../chunk-UEKQIRRA.js';
7
8
 
8
9
  // src/langgraph/callback-handler.ts
9
10
  var ADAPTER = "langgraph-js";
@@ -115,6 +116,7 @@ async function getCallbackHandlerClass() {
115
116
 
116
117
  // src/langgraph/llm-and-tool-callbacks.ts
117
118
  var ADAPTER2 = "langgraph-js";
119
+ var FRAMEWORK = "langgraph";
118
120
  function extractProvider(id) {
119
121
  if (!Array.isArray(id) || id.length === 0) return void 0;
120
122
  const first = id[0];
@@ -200,11 +202,13 @@ function popAndEnd(map, runId, err, mutate) {
200
202
  function createLlmAndToolHandlers(state, options = {}) {
201
203
  const toolInputOpts = options.toolInputMaxBytes ? { maxBytes: options.toolInputMaxBytes } : void 0;
202
204
  const toolOutputOpts = options.toolOutputMaxBytes ? { maxBytes: options.toolOutputMaxBytes } : void 0;
203
- const _handleLLMStart = (llm, _prompts, runId, _parentRunId, extraParams) => {
205
+ const _handleLLMStart = (llm, prompts, runId, _parentRunId, extraParams) => {
206
+ setActiveFramework(FRAMEWORK);
204
207
  const handle = emitLlmSpan({
205
208
  adapter: ADAPTER2,
206
209
  model: llmModelOf(llm, extraParams),
207
- provider: extractProvider(llm?.id)
210
+ provider: extractProvider(llm?.id),
211
+ inputData: capturePrompts(prompts)
208
212
  });
209
213
  if (handle !== null) {
210
214
  state.llmSpans.set(runId, handle);
@@ -213,11 +217,13 @@ function createLlmAndToolHandlers(state, options = {}) {
213
217
  const _handleChatModelStart = (llm, messages, runId, _parentRunId, extraParams) => {
214
218
  const flatMessages = flattenMessages(messages);
215
219
  const contextSegments = decomposeOpenAiMessages(flatMessages, toolsFromExtra(extraParams));
220
+ setActiveFramework(FRAMEWORK);
216
221
  const handle = emitLlmSpan({
217
222
  adapter: ADAPTER2,
218
223
  model: llmModelOf(llm, extraParams),
219
224
  provider: extractProvider(llm?.id),
220
- contextSegments: contextSegments.length > 0 ? contextSegments : void 0
225
+ contextSegments: contextSegments.length > 0 ? contextSegments : void 0,
226
+ inputData: captureLangChainMessages(flatMessages)
221
227
  });
222
228
  if (handle !== null) {
223
229
  state.llmSpans.set(runId, handle);
@@ -226,6 +232,8 @@ function createLlmAndToolHandlers(state, options = {}) {
226
232
  const _handleLLMEnd = (output, runId) => {
227
233
  popAndEnd(state.llmSpans, runId, void 0, (handle) => {
228
234
  applyTokenUsage(handle, output);
235
+ const outputText = extractLangChainOutputText(output?.generations);
236
+ if (outputText !== void 0) handle.span.output_data = { content: outputText };
229
237
  });
230
238
  };
231
239
  const _handleLLMError = (err, runId) => {