@morsehq-dev/sdk 0.4.1 → 0.5.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/anthropic/index.cjs +12 -10
- package/dist/anthropic/index.js +5 -3
- package/dist/anthropic-agent-sdk/index.cjs +52 -34
- package/dist/anthropic-agent-sdk/index.cjs.map +1 -1
- package/dist/anthropic-agent-sdk/index.js +25 -7
- package/dist/anthropic-agent-sdk/index.js.map +1 -1
- package/dist/browser/anthropic/index.cjs +12 -10
- package/dist/browser/anthropic/index.js +5 -3
- package/dist/browser/anthropic-agent-sdk/index.cjs +52 -34
- package/dist/browser/anthropic-agent-sdk/index.cjs.map +1 -1
- package/dist/browser/anthropic-agent-sdk/index.js +25 -7
- package/dist/browser/anthropic-agent-sdk/index.js.map +1 -1
- package/dist/browser/chunk-32U547L3.js +118 -0
- package/dist/browser/chunk-32U547L3.js.map +1 -0
- package/dist/{chunk-SBGY5NS4.js → browser/chunk-454FDWBM.js} +6 -4
- package/dist/browser/chunk-454FDWBM.js.map +1 -0
- package/dist/browser/{chunk-EFUQVASI.cjs → chunk-5EFKNOO7.cjs} +17 -15
- package/dist/browser/chunk-5EFKNOO7.cjs.map +1 -0
- package/dist/browser/{chunk-DOLWR7LD.js → chunk-5IWGFPKQ.js} +4 -4
- package/dist/browser/{chunk-DOLWR7LD.js.map → chunk-5IWGFPKQ.js.map} +1 -1
- package/dist/browser/{chunk-F3B4UR64.js → chunk-6DOP3MTY.js} +386 -53
- package/dist/browser/chunk-6DOP3MTY.js.map +1 -0
- package/dist/browser/{chunk-GWJYOQNC.js → chunk-A7P3ZBZX.js} +10 -4
- package/dist/browser/chunk-A7P3ZBZX.js.map +1 -0
- package/dist/browser/{chunk-M2GZJ3RS.cjs → chunk-AV35EOER.cjs} +20 -14
- package/dist/browser/chunk-AV35EOER.cjs.map +1 -0
- package/dist/browser/{chunk-AYNX24P5.js → chunk-AZ3SVK3K.js} +3 -3
- package/dist/browser/{chunk-AYNX24P5.js.map → chunk-AZ3SVK3K.js.map} +1 -1
- package/dist/browser/chunk-FNZWJU64.cjs +31 -0
- package/dist/browser/chunk-FNZWJU64.cjs.map +1 -0
- package/dist/browser/chunk-HZZK2EMO.cjs +126 -0
- package/dist/browser/chunk-HZZK2EMO.cjs.map +1 -0
- package/dist/browser/{chunk-QWRQJO57.js → chunk-MLDVXMQD.js} +3 -3
- package/dist/browser/{chunk-QWRQJO57.js.map → chunk-MLDVXMQD.js.map} +1 -1
- package/dist/{chunk-Y7SVGUKY.cjs → browser/chunk-NT37C2TK.cjs} +7 -7
- package/dist/browser/{chunk-YNUZGKUA.cjs.map → chunk-NT37C2TK.cjs.map} +1 -1
- package/dist/browser/{chunk-3643DC7K.cjs → chunk-RBNCTHK3.cjs} +5 -2
- package/dist/browser/{chunk-3643DC7K.cjs.map → chunk-RBNCTHK3.cjs.map} +1 -1
- package/dist/browser/chunk-VFNNU3AX.js +28 -0
- package/dist/browser/chunk-VFNNU3AX.js.map +1 -0
- package/dist/browser/{chunk-HGN7J3EU.cjs → chunk-WY2VLKRR.cjs} +12 -12
- package/dist/browser/{chunk-HGN7J3EU.cjs.map → chunk-WY2VLKRR.cjs.map} +1 -1
- package/dist/browser/{chunk-DXWHT3HK.cjs → chunk-ZGYZZCUK.cjs} +391 -55
- package/dist/browser/chunk-ZGYZZCUK.cjs.map +1 -0
- package/dist/browser/index.cjs +112 -82
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +40 -10
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/integrations/pino.cjs +4 -4
- package/dist/browser/integrations/pino.js +3 -3
- package/dist/browser/langchain/index.cjs +19 -19
- package/dist/browser/langchain/index.js +3 -3
- package/dist/browser/langgraph/index.cjs +34 -26
- package/dist/browser/langgraph/index.cjs.map +1 -1
- package/dist/browser/langgraph/index.js +16 -8
- package/dist/browser/langgraph/index.js.map +1 -1
- package/dist/browser/openai/index.cjs +22 -8
- package/dist/browser/openai/index.cjs.map +1 -1
- package/dist/browser/openai/index.js +17 -3
- package/dist/browser/openai/index.js.map +1 -1
- package/dist/browser/openai-agents/index.cjs +42 -34
- package/dist/browser/openai-agents/index.cjs.map +1 -1
- package/dist/browser/openai-agents/index.js +13 -5
- package/dist/browser/openai-agents/index.js.map +1 -1
- package/dist/browser/vercel-ai/index.cjs +16 -16
- package/dist/browser/vercel-ai/index.js +4 -4
- package/dist/{chunk-4R4SHGOK.js → chunk-4JPZV2VZ.js} +3 -3
- package/dist/{chunk-4R4SHGOK.js.map → chunk-4JPZV2VZ.js.map} +1 -1
- package/dist/{chunk-HNCWTENX.cjs → chunk-5B3IUESN.cjs} +415 -70
- package/dist/chunk-5B3IUESN.cjs.map +1 -0
- package/dist/chunk-5RXSICEJ.js +118 -0
- package/dist/chunk-5RXSICEJ.js.map +1 -0
- package/dist/chunk-7A2EWXZK.cjs +31 -0
- package/dist/chunk-7A2EWXZK.cjs.map +1 -0
- package/dist/{chunk-STK4KJQ6.js → chunk-AAR4FYFO.js} +10 -4
- package/dist/chunk-AAR4FYFO.js.map +1 -0
- package/dist/{chunk-LQI63FHF.cjs → chunk-ADRVMGAW.cjs} +20 -14
- package/dist/chunk-ADRVMGAW.cjs.map +1 -0
- package/dist/{chunk-V5J6J4ZR.js → chunk-CECVNM7R.js} +4 -4
- package/dist/{chunk-V5J6J4ZR.js.map → chunk-CECVNM7R.js.map} +1 -1
- package/dist/{chunk-KJEO52QS.cjs → chunk-HICEJ4LV.cjs} +5 -2
- package/dist/{chunk-KJEO52QS.cjs.map → chunk-HICEJ4LV.cjs.map} +1 -1
- package/dist/{chunk-QXRJUPDP.cjs → chunk-HSY7V4RG.cjs} +12 -12
- package/dist/{chunk-QXRJUPDP.cjs.map → chunk-HSY7V4RG.cjs.map} +1 -1
- package/dist/chunk-LB6ZLJUR.js +28 -0
- package/dist/chunk-LB6ZLJUR.js.map +1 -0
- package/dist/{browser/chunk-F7BGQ26H.js → chunk-O3Q5L2HY.js} +6 -4
- package/dist/chunk-O3Q5L2HY.js.map +1 -0
- package/dist/{chunk-5D6SBSEI.cjs → chunk-RF7NI5VN.cjs} +17 -15
- package/dist/chunk-RF7NI5VN.cjs.map +1 -0
- package/dist/{chunk-AEFUXEKV.js → chunk-TP3N3S2D.js} +3 -3
- package/dist/{chunk-AEFUXEKV.js.map → chunk-TP3N3S2D.js.map} +1 -1
- package/dist/{chunk-LTKGLXAE.js → chunk-UEKQIRRA.js} +410 -68
- package/dist/chunk-UEKQIRRA.js.map +1 -0
- package/dist/{browser/chunk-YNUZGKUA.cjs → chunk-UWQPOWJQ.cjs} +7 -7
- package/dist/{chunk-Y7SVGUKY.cjs.map → chunk-UWQPOWJQ.cjs.map} +1 -1
- package/dist/chunk-VD3KRXSP.cjs +126 -0
- package/dist/chunk-VD3KRXSP.cjs.map +1 -0
- package/dist/index.cjs +119 -89
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +41 -11
- package/dist/index.js.map +1 -1
- package/dist/integrations/pino.cjs +4 -4
- package/dist/integrations/pino.js +3 -3
- package/dist/langchain/index.cjs +19 -19
- package/dist/langchain/index.d.cts +1 -1
- package/dist/langchain/index.d.ts +1 -1
- package/dist/langchain/index.js +3 -3
- package/dist/langgraph/index.cjs +34 -26
- package/dist/langgraph/index.cjs.map +1 -1
- package/dist/langgraph/index.d.cts +1 -1
- package/dist/langgraph/index.d.ts +1 -1
- package/dist/langgraph/index.js +16 -8
- package/dist/langgraph/index.js.map +1 -1
- package/dist/openai/index.cjs +22 -8
- package/dist/openai/index.cjs.map +1 -1
- package/dist/openai/index.js +17 -3
- package/dist/openai/index.js.map +1 -1
- package/dist/openai-agents/index.cjs +42 -34
- package/dist/openai-agents/index.cjs.map +1 -1
- package/dist/openai-agents/index.js +13 -5
- package/dist/openai-agents/index.js.map +1 -1
- package/dist/{tracing-BYAqjT5Q.d.cts → tracing-CNlre8TK.d.cts} +1 -0
- package/dist/{tracing-rz9cWQ8d.d.ts → tracing-J8ZgxVzU.d.ts} +1 -0
- package/dist/vercel-ai/index.cjs +16 -16
- package/dist/vercel-ai/index.js +4 -4
- package/package.json +1 -9
- package/dist/browser/chunk-3BGG7GH3.cjs +0 -183
- package/dist/browser/chunk-3BGG7GH3.cjs.map +0 -1
- package/dist/browser/chunk-DXWHT3HK.cjs.map +0 -1
- package/dist/browser/chunk-EFUQVASI.cjs.map +0 -1
- package/dist/browser/chunk-F3B4UR64.js.map +0 -1
- package/dist/browser/chunk-F7BGQ26H.js.map +0 -1
- package/dist/browser/chunk-GWJYOQNC.js.map +0 -1
- package/dist/browser/chunk-M2GZJ3RS.cjs.map +0 -1
- package/dist/browser/chunk-YHV5GL32.js +0 -178
- package/dist/browser/chunk-YHV5GL32.js.map +0 -1
- package/dist/chunk-5D6SBSEI.cjs.map +0 -1
- package/dist/chunk-HNCWTENX.cjs.map +0 -1
- package/dist/chunk-LQI63FHF.cjs.map +0 -1
- package/dist/chunk-LTKGLXAE.js.map +0 -1
- package/dist/chunk-POCQNSVD.js +0 -178
- package/dist/chunk-POCQNSVD.js.map +0 -1
- package/dist/chunk-SBGY5NS4.js.map +0 -1
- package/dist/chunk-STK4KJQ6.js.map +0 -1
- package/dist/chunk-T2KW3P23.cjs +0 -183
- package/dist/chunk-T2KW3P23.cjs.map +0 -1
package/dist/langchain/index.cjs
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
},
|
package/dist/langchain/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { absorbErrorsSync } from '../chunk-
|
|
2
|
-
import { decomposeOpenAiMessages } from '../chunk-
|
|
3
|
-
import { init_tracing, startSpan } from '../chunk-
|
|
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();
|
package/dist/langgraph/index.cjs
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
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
|
|
8
|
-
require('../chunk-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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,
|
|
206
|
-
|
|
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 =
|
|
218
|
-
|
|
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 =
|
|
245
|
+
const handle = chunkRF7NI5VN_cjs.emitToolSpan({
|
|
238
246
|
adapter: ADAPTER2,
|
|
239
247
|
toolName: toolNameOf(tool),
|
|
240
|
-
inputSummary:
|
|
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 =
|
|
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:
|
|
262
|
-
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:
|
|
266
|
-
handleLLMError:
|
|
267
|
-
handleToolStart:
|
|
268
|
-
handleToolEnd:
|
|
269
|
-
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 =
|
|
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"]}
|
package/dist/langgraph/index.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
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-
|
|
6
|
-
import '../chunk-
|
|
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,
|
|
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) => {
|