@langchain/langgraph-sdk 1.6.5 → 1.7.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/_virtual/_rolldown/runtime.cjs +7 -13
- package/dist/auth/error.cjs +1 -2
- package/dist/auth/error.cjs.map +1 -1
- package/dist/auth/error.js +1 -1
- package/dist/auth/index.cjs +3 -4
- package/dist/auth/index.cjs.map +1 -1
- package/dist/auth/index.js +1 -2
- package/dist/auth/index.js.map +1 -1
- package/dist/client.cjs +9 -9
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts.map +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +3 -3
- package/dist/client.js.map +1 -1
- package/dist/index.cjs +5 -6
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +1 -2
- package/dist/logging/index.cjs +2 -3
- package/dist/logging/index.cjs.map +1 -1
- package/dist/logging/index.js +1 -1
- package/dist/react/index.cjs +46 -11
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.cts +14 -11
- package/dist/react/index.d.cts.map +1 -0
- package/dist/react/index.d.ts +14 -11
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +13 -4
- package/dist/react/index.js.map +1 -0
- package/dist/react-ui/index.cjs +39 -15
- package/dist/react-ui/index.d.cts +1 -2
- package/dist/react-ui/index.d.ts +1 -2
- package/dist/react-ui/index.js +1 -8
- package/dist/react-ui/server/index.cjs +15 -6
- package/dist/react-ui/server/index.d.cts +1 -2
- package/dist/react-ui/server/index.d.ts +1 -2
- package/dist/react-ui/server/index.js +2 -4
- package/dist/singletons/fetch.cjs +1 -2
- package/dist/singletons/fetch.cjs.map +1 -1
- package/dist/singletons/fetch.js +1 -1
- package/dist/singletons/fetch.js.map +1 -1
- package/dist/types.messages.d.cts +5 -3
- package/dist/types.messages.d.cts.map +1 -1
- package/dist/types.messages.d.ts +5 -3
- package/dist/types.messages.d.ts.map +1 -1
- package/dist/ui/branching.cjs +25 -2
- package/dist/ui/branching.cjs.map +1 -1
- package/dist/ui/branching.d.cts +26 -1
- package/dist/ui/branching.d.cts.map +1 -1
- package/dist/ui/branching.d.ts +26 -1
- package/dist/ui/branching.d.ts.map +1 -1
- package/dist/ui/branching.js +25 -2
- package/dist/ui/branching.js.map +1 -1
- package/dist/ui/errors.cjs +1 -2
- package/dist/ui/errors.cjs.map +1 -1
- package/dist/ui/errors.js +1 -1
- package/dist/ui/index.cjs +30 -0
- package/dist/ui/index.d.cts +15 -0
- package/dist/ui/index.d.ts +15 -0
- package/dist/ui/index.js +10 -0
- package/dist/ui/interrupts.cjs +20 -0
- package/dist/ui/interrupts.cjs.map +1 -0
- package/dist/ui/interrupts.d.cts +11 -0
- package/dist/ui/interrupts.d.cts.map +1 -0
- package/dist/ui/interrupts.d.ts +11 -0
- package/dist/ui/interrupts.d.ts.map +1 -0
- package/dist/ui/interrupts.js +20 -0
- package/dist/ui/interrupts.js.map +1 -0
- package/dist/ui/manager.cjs +13 -15
- package/dist/ui/manager.cjs.map +1 -1
- package/dist/ui/manager.d.cts +224 -0
- package/dist/ui/manager.d.cts.map +1 -0
- package/dist/ui/manager.d.ts +224 -0
- package/dist/ui/manager.d.ts.map +1 -0
- package/dist/ui/manager.js +10 -12
- package/dist/ui/manager.js.map +1 -1
- package/dist/ui/messages.cjs +40 -3
- package/dist/ui/messages.cjs.map +1 -1
- package/dist/ui/messages.d.cts +56 -0
- package/dist/ui/messages.d.cts.map +1 -0
- package/dist/ui/messages.d.ts +56 -0
- package/dist/ui/messages.d.ts.map +1 -0
- package/dist/ui/messages.js +37 -3
- package/dist/ui/messages.js.map +1 -1
- package/dist/ui/queue.cjs +74 -0
- package/dist/ui/queue.cjs.map +1 -0
- package/dist/ui/queue.d.cts +72 -0
- package/dist/ui/queue.d.cts.map +1 -0
- package/dist/ui/queue.d.ts +72 -0
- package/dist/ui/queue.d.ts.map +1 -0
- package/dist/ui/queue.js +74 -0
- package/dist/ui/queue.js.map +1 -0
- package/dist/ui/stream/base.d.cts +11 -0
- package/dist/ui/stream/base.d.cts.map +1 -1
- package/dist/ui/stream/base.d.ts +11 -0
- package/dist/ui/stream/base.d.ts.map +1 -1
- package/dist/ui/stream/index.d.cts +4 -4
- package/dist/ui/stream/index.d.cts.map +1 -1
- package/dist/ui/stream/index.d.ts +4 -4
- package/dist/ui/stream/index.d.ts.map +1 -1
- package/dist/ui/subagents.cjs +7 -5
- package/dist/ui/subagents.cjs.map +1 -1
- package/dist/ui/subagents.d.cts +7 -0
- package/dist/ui/subagents.d.cts.map +1 -1
- package/dist/ui/subagents.d.ts +7 -0
- package/dist/ui/subagents.d.ts.map +1 -1
- package/dist/ui/subagents.js +5 -3
- package/dist/ui/subagents.js.map +1 -1
- package/dist/ui/transport.cjs +30 -0
- package/dist/ui/transport.cjs.map +1 -0
- package/dist/{react/stream.custom.d.cts → ui/transport.d.cts} +3 -3
- package/dist/ui/transport.d.cts.map +1 -0
- package/dist/{react/stream.custom.d.ts → ui/transport.d.ts} +3 -3
- package/dist/ui/transport.d.ts.map +1 -0
- package/dist/ui/transport.js +30 -0
- package/dist/ui/transport.js.map +1 -0
- package/dist/ui/types.d.cts +125 -16
- package/dist/ui/types.d.cts.map +1 -1
- package/dist/ui/types.d.ts +125 -16
- package/dist/ui/types.d.ts.map +1 -1
- package/dist/ui/utils.cjs +1 -2
- package/dist/ui/utils.cjs.map +1 -1
- package/dist/ui/utils.d.cts +7 -0
- package/dist/ui/utils.d.cts.map +1 -0
- package/dist/ui/utils.d.ts +7 -0
- package/dist/ui/utils.d.ts.map +1 -0
- package/dist/ui/utils.js +1 -1
- package/dist/utils/async_caller.cjs +3 -4
- package/dist/utils/async_caller.cjs.map +1 -1
- package/dist/utils/async_caller.js +1 -2
- package/dist/utils/async_caller.js.map +1 -1
- package/dist/utils/env.cjs +1 -2
- package/dist/utils/env.cjs.map +1 -1
- package/dist/utils/env.js +1 -1
- package/dist/utils/env.js.map +1 -1
- package/dist/utils/error.cjs +1 -2
- package/dist/utils/error.cjs.map +1 -1
- package/dist/utils/error.js +1 -1
- package/dist/utils/index.cjs +8 -0
- package/dist/utils/index.d.cts +4 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/signals.cjs +1 -2
- package/dist/utils/signals.cjs.map +1 -1
- package/dist/utils/signals.js +1 -1
- package/dist/utils/signals.js.map +1 -1
- package/dist/utils/sse.cjs +1 -2
- package/dist/utils/sse.cjs.map +1 -1
- package/dist/utils/sse.d.cts +11 -0
- package/dist/utils/sse.d.cts.map +1 -0
- package/dist/utils/sse.d.ts +11 -0
- package/dist/utils/sse.d.ts.map +1 -0
- package/dist/utils/sse.js +1 -1
- package/dist/utils/sse.js.map +1 -1
- package/dist/utils/stream.cjs +2 -3
- package/dist/utils/stream.cjs.map +1 -1
- package/dist/utils/stream.d.cts +19 -0
- package/dist/utils/stream.d.cts.map +1 -0
- package/dist/utils/stream.d.ts +19 -0
- package/dist/utils/stream.d.ts.map +1 -0
- package/dist/utils/stream.js +1 -2
- package/dist/utils/stream.js.map +1 -1
- package/dist/utils/tools.cjs +27 -19
- package/dist/utils/tools.cjs.map +1 -1
- package/dist/utils/tools.d.cts +7 -0
- package/dist/utils/tools.d.cts.map +1 -0
- package/dist/utils/tools.d.ts +7 -0
- package/dist/utils/tools.d.ts.map +1 -0
- package/dist/utils/tools.js +27 -18
- package/dist/utils/tools.js.map +1 -1
- package/package.json +41 -12
- package/dist/react/stream.cjs +0 -18
- package/dist/react/stream.cjs.map +0 -1
- package/dist/react/stream.custom.cjs +0 -164
- package/dist/react/stream.custom.cjs.map +0 -1
- package/dist/react/stream.custom.d.cts.map +0 -1
- package/dist/react/stream.custom.d.ts.map +0 -1
- package/dist/react/stream.custom.js +0 -162
- package/dist/react/stream.custom.js.map +0 -1
- package/dist/react/stream.d.cts +0 -174
- package/dist/react/stream.d.cts.map +0 -1
- package/dist/react/stream.d.ts +0 -174
- package/dist/react/stream.d.ts.map +0 -1
- package/dist/react/stream.js +0 -17
- package/dist/react/stream.js.map +0 -1
- package/dist/react/stream.lgp.cjs +0 -544
- package/dist/react/stream.lgp.cjs.map +0 -1
- package/dist/react/stream.lgp.js +0 -543
- package/dist/react/stream.lgp.js.map +0 -1
- package/dist/react/thread.cjs +0 -21
- package/dist/react/thread.cjs.map +0 -1
- package/dist/react/thread.js +0 -20
- package/dist/react/thread.js.map +0 -1
- package/dist/react/types.d.cts +0 -79
- package/dist/react/types.d.cts.map +0 -1
- package/dist/react/types.d.ts +0 -79
- package/dist/react/types.d.ts.map +0 -1
- package/dist/react-ui/client.cjs +0 -138
- package/dist/react-ui/client.cjs.map +0 -1
- package/dist/react-ui/client.d.cts +0 -76
- package/dist/react-ui/client.d.cts.map +0 -1
- package/dist/react-ui/client.d.ts +0 -76
- package/dist/react-ui/client.d.ts.map +0 -1
- package/dist/react-ui/client.js +0 -132
- package/dist/react-ui/client.js.map +0 -1
- package/dist/react-ui/index.cjs.map +0 -1
- package/dist/react-ui/index.js.map +0 -1
- package/dist/react-ui/server/server.cjs +0 -57
- package/dist/react-ui/server/server.cjs.map +0 -1
- package/dist/react-ui/server/server.d.cts +0 -54
- package/dist/react-ui/server/server.d.cts.map +0 -1
- package/dist/react-ui/server/server.d.ts +0 -54
- package/dist/react-ui/server/server.d.ts.map +0 -1
- package/dist/react-ui/server/server.js +0 -56
- package/dist/react-ui/server/server.js.map +0 -1
- package/dist/react-ui/types.cjs +0 -38
- package/dist/react-ui/types.cjs.map +0 -1
- package/dist/react-ui/types.d.cts +0 -25
- package/dist/react-ui/types.d.cts.map +0 -1
- package/dist/react-ui/types.d.ts +0 -25
- package/dist/react-ui/types.d.ts.map +0 -1
- package/dist/react-ui/types.js +0 -35
- package/dist/react-ui/types.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagents.d.ts","names":[],"sources":["../../src/ui/subagents.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"subagents.d.ts","names":[],"sources":["../../src/ui/subagents.ts"],"mappings":";;;;;;;AA8BA;;;;;AAuBA;;iBAvBgB,mBAAA,CACd,SAAA;;;AA4CF;;;;;AAgBA;;iBAtCgB,8BAAA,CACd,SAAA;;;AAoDF;;;;;iBA/BgB,2BAAA,CACd,SAAA;;;;;;;;;;iBAec,4BAAA,CACd,SAAA;;AA6DF;;UA/CiB,sBAAA;EA+CuB;;;;EA1CtC,iBAAA;EAkUgB;;;EA7ThB,gBAAA;EA+V2B;;;;EAzV3B,SAAA,IAAa,KAAA,EAAO,WAAA,KAAgB,OAAA,GAAU,WAAA;AAAA;;;;;;;cA+BnC,eAAA,YAA2B,eAAA;EAAA,QAC9B,SAAA;EAimBE;;;;;EAAA,QA1lBF,qBAAA;EAR8B;;;;EAAA,QAc9B,cAAA;EASA;;;;;EAAA,QAFA,eAAA;EAAA,QAEA,iBAAA;EAAA,QAEA,gBAAA;EAAA,QAEA,SAAA;EAER,WAAA,CAAY,OAAA,GAAU,sBAAA;EAqFK;;;EAAA,QA1EnB,iBAAA;EA0KR;;;;EAAA,QA7JQ,sBAAA;EAmOR;;;;EAAA,QAlNQ,oBAAA;EAsOR;;;;EA1LA,0BAAA,CAA2B,WAAA;EAuMzB;;;;;;;;;;;;;EAtLF,uBAAA,CACE,WAAA,UACA,WAAA;EAuNM;;;EA1IR,kBAAA,CAAmB,QAAA;EAoKf;;;;EAAA,QA5JI,mBAAA;EA+PA;;;;;;;;;;;;EAAA,QA1NA,eAAA;EAwSK;;;;EAAA,QA9RL,cAAA;EAyVN;;;;EA1UF,YAAA,CAAA,GAAgB,GAAA,SAEd,uBAAA,CAAwB,MAAA,mBAAyB,QAAA;EA2XnD;;;;EAzWA,kBAAA,CAAA,GAAsB,uBAAA,CACpB,MAAA,mBACA,QAAA;EA2ZF;;;EAjZA,WAAA,CACE,UAAA,WACC,uBAAA,CAAwB,MAAA,mBAAyB,QAAA;EAiZtC;;;EAzYd,kBAAA,CACE,IAAA,WACC,uBAAA,CAAwB,MAAA,mBAAyB,QAAA;EAgfxC;;;;;;EApeZ,qBAAA,CACE,SAAA,WACC,uBAAA,CAAwB,MAAA,mBAAyB,QAAA;;;;;UAU5C,SAAA;;;;;;;;;;EAuBR,qBAAA,CACE,SAAA,EAAW,KAAA;IACT,EAAA;IACA,IAAA;IACA,IAAA,EAAM,MAAA;EAAA,IAER,WAAA;;;;UAgGM,mBAAA;;;;;;;;;;EA4BR,WAAA,CACE,UAAA,UACA,OAAA;IACE,SAAA;EAAA;;;;;;;;EA4BJ,wBAAA,CAAyB,WAAA,UAAqB,SAAA;;;;;;;;;;;;EAgB9C,oBAAA,CACE,WAAA,UACA,UAAA,EAAY,OAAA,CAAQ,eAAA,GACpB,QAAA,GAAW,MAAA;;;;;;;;;;;EAyDb,oBAAA,CACE,WAAA,UACA,MAAA,EAAQ,MAAA;;;;;;;;;;EA6BV,QAAA,CACE,UAAA,UACA,MAAA,UACA,MAAA;;;;EAmBF,KAAA,CAAA;;;;;;;;EAeA,kBAAA,CACE,UAAA,UACA,OAAA,UACA,MAAA;;;;;;;;;;;;;;;;;;;;;;;EAkCF,uBAAA,CACE,QAAA,EAAU,OAAA,CAAQ,eAAA,KAClB,OAAA;IAAY,eAAA;EAAA;;;;EAyGd,YAAA,CAAA;AAAA"}
|
package/dist/ui/subagents.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { MessageTupleManager, toMessageDict } from "./messages.js";
|
|
2
2
|
import { getToolCallsWithResults } from "../utils/tools.js";
|
|
3
|
-
|
|
4
3
|
//#region src/ui/subagents.ts
|
|
5
4
|
/**
|
|
6
5
|
* Default tool names that indicate subagent invocation.
|
|
@@ -87,9 +86,11 @@ var SubagentManager = class {
|
|
|
87
86
|
messageManagers = /* @__PURE__ */ new Map();
|
|
88
87
|
subagentToolNames;
|
|
89
88
|
onSubagentChange;
|
|
89
|
+
toMessage;
|
|
90
90
|
constructor(options) {
|
|
91
91
|
this.subagentToolNames = new Set(options?.subagentToolNames ?? DEFAULT_SUBAGENT_TOOL_NAMES);
|
|
92
92
|
this.onSubagentChange = options?.onSubagentChange;
|
|
93
|
+
this.toMessage = options?.toMessage ?? toMessageDict;
|
|
93
94
|
}
|
|
94
95
|
/**
|
|
95
96
|
* Get or create a MessageTupleManager for a subagent.
|
|
@@ -110,7 +111,7 @@ var SubagentManager = class {
|
|
|
110
111
|
const manager = this.messageManagers.get(toolCallId);
|
|
111
112
|
if (!manager) return [];
|
|
112
113
|
const messages = [];
|
|
113
|
-
for (const entry of Object.values(manager.chunks)) if (entry.chunk) messages.push(
|
|
114
|
+
for (const entry of Object.values(manager.chunks)) if (entry.chunk) messages.push(this.toMessage(entry.chunk));
|
|
114
115
|
return messages;
|
|
115
116
|
}
|
|
116
117
|
/**
|
|
@@ -129,6 +130,7 @@ var SubagentManager = class {
|
|
|
129
130
|
},
|
|
130
131
|
interrupt: void 0,
|
|
131
132
|
interrupts: [],
|
|
133
|
+
switchThread: () => {},
|
|
132
134
|
subagents: /* @__PURE__ */ new Map(),
|
|
133
135
|
activeSubagents: [],
|
|
134
136
|
getSubagent: () => void 0,
|
|
@@ -583,7 +585,7 @@ var SubagentManager = class {
|
|
|
583
585
|
return this.subagents.size > 0;
|
|
584
586
|
}
|
|
585
587
|
};
|
|
586
|
-
|
|
587
588
|
//#endregion
|
|
588
589
|
export { SubagentManager, calculateDepthFromNamespace, extractParentIdFromNamespace, extractToolCallIdFromNamespace, isSubagentNamespace };
|
|
590
|
+
|
|
589
591
|
//# sourceMappingURL=subagents.js.map
|
package/dist/ui/subagents.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagents.js","names":[],"sources":["../../src/ui/subagents.ts"],"sourcesContent":["import type {\n Message,\n DefaultToolCall,\n AIMessage,\n ToolCallWithResult,\n} from \"../types.messages.js\";\nimport type {\n SubagentStreamInterface,\n SubagentToolCall,\n SubagentStatus,\n} from \"./types.js\";\nimport { MessageTupleManager, toMessageDict } from \"./messages.js\";\nimport { getToolCallsWithResults } from \"../utils/tools.js\";\n\n/**\n * Default tool names that indicate subagent invocation.\n * Can be customized via SubagentManager options.\n */\nconst DEFAULT_SUBAGENT_TOOL_NAMES = [\"task\"];\n\n/**\n * Checks if a namespace indicates a subagent/subgraph message.\n *\n * Subagent namespaces contain a \"tools:\" segment indicating they\n * originate from a tool call that spawned a subgraph.\n *\n * @param namespace - The namespace array from stream events (or checkpoint_ns string)\n * @returns True if this is a subagent namespace\n */\nexport function isSubagentNamespace(\n namespace: string[] | string | undefined\n): boolean {\n if (!namespace) return false;\n\n // Handle string namespace (from checkpoint_ns)\n if (typeof namespace === \"string\") {\n return namespace.includes(\"tools:\");\n }\n\n // Handle array namespace\n return namespace.some((s) => s.startsWith(\"tools:\"));\n}\n\n/**\n * Extracts the tool call ID from a namespace path.\n *\n * Namespaces follow the pattern: [\"tools:call_abc123\", \"model_request:xyz\", ...]\n * This function extracts \"call_abc123\" from the first \"tools:\" segment.\n *\n * @param namespace - The namespace array from stream events\n * @returns The tool call ID, or undefined if not found\n */\nexport function extractToolCallIdFromNamespace(\n namespace: string[] | undefined\n): string | undefined {\n if (!namespace || namespace.length === 0) return undefined;\n\n // Find the first namespace segment that starts with \"tools:\"\n for (const segment of namespace) {\n if (segment.startsWith(\"tools:\")) {\n return segment.slice(6); // Remove \"tools:\" prefix\n }\n }\n\n return undefined;\n}\n\n/**\n * Calculates the depth of a subagent based on its namespace.\n * Counts the number of \"tools:\" segments in the namespace.\n *\n * @param namespace - The namespace array\n * @returns The depth (0 for main agent, 1+ for subagents)\n */\nexport function calculateDepthFromNamespace(\n namespace: string[] | undefined\n): number {\n if (!namespace) return 0;\n return namespace.filter((s) => s.startsWith(\"tools:\")).length;\n}\n\n/**\n * Extracts the parent tool call ID from a namespace.\n *\n * For nested subagents, the namespace looks like:\n * [\"tools:parent_id\", \"tools:child_id\", ...]\n *\n * @param namespace - The namespace array\n * @returns The parent tool call ID, or null if this is a top-level subagent\n */\nexport function extractParentIdFromNamespace(\n namespace: string[] | undefined\n): string | null {\n if (!namespace || namespace.length < 2) return null;\n\n const toolSegments = namespace.filter((s) => s.startsWith(\"tools:\"));\n if (toolSegments.length < 2) return null;\n\n // The second-to-last \"tools:\" segment is the parent\n return toolSegments[toolSegments.length - 2]?.slice(6) ?? null;\n}\n\n/**\n * Options for SubagentManager.\n */\nexport interface SubagentManagerOptions {\n /**\n * Tool names that indicate subagent invocation.\n * Defaults to [\"task\"].\n */\n subagentToolNames?: string[];\n\n /**\n * Callback when subagent state changes.\n */\n onSubagentChange?: () => void;\n}\n\n/**\n * Internal base type for SubagentStream storage.\n * Excludes derived properties that are computed on retrieval.\n */\ntype SubagentStreamBase<ToolCall> = Omit<\n SubagentStreamInterface<Record<string, unknown>, ToolCall>,\n | \"isLoading\"\n | \"toolCalls\"\n | \"getToolCalls\"\n | \"interrupt\"\n | \"interrupts\"\n | \"subagents\"\n | \"activeSubagents\"\n | \"getSubagent\"\n | \"getSubagentsByType\"\n | \"getSubagentsByMessage\"\n | \"nodes\"\n | \"activeNodes\"\n | \"getNodeStream\"\n | \"getNodeStreamsByName\"\n> & {\n /** Internal: ID of the AI message that triggered this subagent */\n aiMessageId: string | null;\n};\n\n/**\n * Manages subagent execution state.\n *\n * Tracks subagents from the moment they are invoked (AI message with tool calls)\n * through streaming to completion (tool message result).\n */\nexport class SubagentManager<ToolCall = DefaultToolCall> {\n private subagents = new Map<string, SubagentStreamBase<ToolCall>>();\n\n /**\n * Maps namespace IDs (pregel task IDs) to tool call IDs.\n * LangGraph subgraphs use internal pregel task IDs in their namespace,\n * which are different from the tool_call_id used to invoke them.\n */\n private namespaceToToolCallId = new Map<string, string>();\n\n /**\n * Pending namespace matches that couldn't be resolved immediately.\n * These are retried when new tool calls are registered.\n */\n private pendingMatches = new Map<string, string>(); // namespaceId -> description\n\n /**\n * Message managers for each subagent.\n * Uses the same MessageTupleManager as the main stream for proper\n * message chunk concatenation.\n */\n private messageManagers = new Map<string, MessageTupleManager>();\n\n private subagentToolNames: Set<string>;\n\n private onSubagentChange?: () => void;\n\n constructor(options?: SubagentManagerOptions) {\n this.subagentToolNames = new Set(\n options?.subagentToolNames ?? DEFAULT_SUBAGENT_TOOL_NAMES\n );\n this.onSubagentChange = options?.onSubagentChange;\n }\n\n /**\n * Get or create a MessageTupleManager for a subagent.\n */\n private getMessageManager(toolCallId: string): MessageTupleManager {\n let manager = this.messageManagers.get(toolCallId);\n if (!manager) {\n manager = new MessageTupleManager();\n this.messageManagers.set(toolCallId, manager);\n }\n return manager;\n }\n\n /**\n * Get messages for a subagent with proper chunk concatenation.\n * This mirrors how the main stream handles messages.\n */\n private getMessagesForSubagent(toolCallId: string): Message<ToolCall>[] {\n const manager = this.messageManagers.get(toolCallId);\n if (!manager) return [];\n\n // Convert chunks to messages in order\n const messages: Message<ToolCall>[] = [];\n for (const entry of Object.values(manager.chunks)) {\n if (entry.chunk) {\n messages.push(toMessageDict(entry.chunk) as Message<ToolCall>);\n }\n }\n return messages;\n }\n\n /**\n * Create a complete SubagentStream object with all derived properties.\n * This ensures consistency with UseStream interface.\n */\n private createSubagentStream(\n base: SubagentStreamBase<ToolCall>\n ): SubagentStreamInterface<Record<string, unknown>, ToolCall> {\n const { messages } = base;\n const allToolCalls = getToolCallsWithResults<ToolCall>(messages);\n\n return {\n ...base,\n // Derived from status for UseStream consistency\n isLoading: base.status === \"running\",\n\n // Tool calls derived from messages\n toolCalls: allToolCalls,\n\n // Method to get tool calls for a specific message\n getToolCalls: (\n message: AIMessage<ToolCall>\n ): ToolCallWithResult<ToolCall>[] => {\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n },\n\n // Subagents don't have interrupts yet (future enhancement)\n interrupt: undefined,\n interrupts: [],\n\n // Nested subagent tracking (empty for now, future enhancement)\n subagents: new Map<\n string,\n SubagentStreamInterface<Record<string, unknown>, ToolCall>\n >(),\n activeSubagents: [],\n getSubagent: () => undefined,\n getSubagentsByType: () => [],\n getSubagentsByMessage: () => [],\n };\n }\n\n /**\n * Get the tool call ID for a given namespace ID.\n * Returns the namespace ID itself if no mapping exists.\n */\n getToolCallIdFromNamespace(namespaceId: string): string {\n return this.namespaceToToolCallId.get(namespaceId) ?? namespaceId;\n }\n\n /**\n * Try to match a subgraph to a pending subagent by description.\n * Creates a mapping from namespace ID to tool call ID if a match is found.\n *\n * Uses a multi-pass matching strategy:\n * 1. Exact description match\n * 2. Description contains/partial match\n * 3. Any unmapped pending subagent (fallback)\n *\n * @param namespaceId - The namespace ID (pregel task ID) from the subgraph\n * @param description - The description from the subgraph's initial message\n * @returns The matched tool call ID, or undefined if no match\n */\n matchSubgraphToSubagent(\n namespaceId: string,\n description: string\n ): string | undefined {\n // Skip if we already have a mapping\n if (this.namespaceToToolCallId.has(namespaceId)) {\n return this.namespaceToToolCallId.get(namespaceId);\n }\n\n // Get all already-mapped tool call IDs\n const mappedToolCallIds = new Set(this.namespaceToToolCallId.values());\n\n // Helper to establish mapping and mark as running\n const establishMapping = (toolCallId: string): string => {\n this.namespaceToToolCallId.set(namespaceId, toolCallId);\n // Also mark the subagent as running since we now have its namespace\n const subagent = this.subagents.get(toolCallId);\n if (subagent && subagent.status === \"pending\") {\n this.subagents.set(toolCallId, {\n ...subagent,\n status: \"running\",\n namespace: [namespaceId],\n startedAt: new Date(),\n });\n this.onSubagentChange?.();\n }\n return toolCallId;\n };\n\n // Pass 1: Find a pending subagent with exact description match\n for (const [toolCallId, subagent] of this.subagents) {\n if (\n (subagent.status === \"pending\" || subagent.status === \"running\") &&\n !mappedToolCallIds.has(toolCallId) &&\n subagent.toolCall.args.description === description\n ) {\n return establishMapping(toolCallId);\n }\n }\n\n // Pass 2: Find a pending subagent where description contains or is contained\n for (const [toolCallId, subagent] of this.subagents) {\n if (\n (subagent.status === \"pending\" || subagent.status === \"running\") &&\n !mappedToolCallIds.has(toolCallId)\n ) {\n const subagentDesc = subagent.toolCall.args.description || \"\";\n if (\n (subagentDesc && description.includes(subagentDesc)) ||\n (subagentDesc && subagentDesc.includes(description))\n ) {\n // Update the description if the new one is longer\n if (description.length > subagentDesc.length) {\n this.subagents.set(toolCallId, {\n ...subagent,\n toolCall: {\n ...subagent.toolCall,\n args: {\n ...subagent.toolCall.args,\n description,\n },\n },\n });\n }\n return establishMapping(toolCallId);\n }\n }\n }\n\n // No match found - store for retry when more tool calls are registered\n if (description) {\n this.pendingMatches.set(namespaceId, description);\n }\n return undefined;\n }\n\n /**\n * Check if a tool call is a subagent invocation.\n */\n isSubagentToolCall(toolName: string): boolean {\n return this.subagentToolNames.has(toolName);\n }\n\n /**\n * Check if a subagent_type value is valid.\n * Valid types are proper identifiers like \"weather-scout\", \"experience-curator\".\n */\n private isValidSubagentType(type: unknown): boolean {\n // Must be a non-empty string\n if (!type || typeof type !== \"string\") {\n return false;\n }\n\n // Must be at least 3 characters (avoids partial streaming like \"ex\")\n if (type.length < 3) {\n return false;\n }\n\n // Must look like a valid identifier (letters, numbers, hyphens, underscores)\n // Examples: \"weather-scout\", \"experience_curator\", \"budget-optimizer\"\n if (!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(type)) {\n return false;\n }\n\n // Must not be unreasonably long (corruption indicator)\n if (type.length > 50) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Check if a subagent should be shown to the user.\n * Subagents are only shown once they've actually started running.\n *\n * This filters out:\n * - Pending subagents that haven't been matched to a namespace yet\n * - Streaming artifacts with partial/corrupted data\n *\n * The idea is: we register subagents internally when we see tool calls,\n * but we only show them to the user once LangGraph confirms they're\n * actually executing (via namespace events).\n */\n private isValidSubagent(subagent: SubagentStreamBase<ToolCall>): boolean {\n // Only show subagents that have started running or completed\n // This ensures we don't show partial/pending subagents\n return subagent.status === \"running\" || subagent.status === \"complete\";\n }\n\n /**\n * Build a complete SubagentStream from internal state.\n * Adds messages and derived properties.\n */\n private buildExecution(\n base: SubagentStreamBase<ToolCall>\n ): SubagentStreamInterface<Record<string, unknown>, ToolCall> {\n // Get fresh messages from the manager\n const messages = this.getMessagesForSubagent(base.id);\n return this.createSubagentStream({\n ...base,\n messages,\n });\n }\n\n /**\n * Get all subagents as a Map.\n * Filters out incomplete/phantom subagents that lack subagent_type.\n */\n getSubagents(): Map<\n string,\n SubagentStreamInterface<Record<string, unknown>, ToolCall>\n > {\n const result = new Map<\n string,\n SubagentStreamInterface<Record<string, unknown>, ToolCall>\n >();\n for (const [id, subagent] of this.subagents) {\n if (this.isValidSubagent(subagent)) {\n result.set(id, this.buildExecution(subagent));\n }\n }\n return result;\n }\n\n /**\n * Get all currently running subagents.\n * Filters out incomplete/phantom subagents.\n */\n getActiveSubagents(): SubagentStreamInterface<\n Record<string, unknown>,\n ToolCall\n >[] {\n return [...this.subagents.values()]\n .filter((s) => s.status === \"running\" && this.isValidSubagent(s))\n .map((s) => this.buildExecution(s));\n }\n\n /**\n * Get a specific subagent by tool call ID.\n */\n getSubagent(\n toolCallId: string\n ): SubagentStreamInterface<Record<string, unknown>, ToolCall> | undefined {\n const subagent = this.subagents.get(toolCallId);\n return subagent ? this.buildExecution(subagent) : undefined;\n }\n\n /**\n * Get all subagents of a specific type.\n */\n getSubagentsByType(\n type: string\n ): SubagentStreamInterface<Record<string, unknown>, ToolCall>[] {\n return [...this.subagents.values()]\n .filter((s) => s.toolCall.args.subagent_type === type)\n .map((s) => this.buildExecution(s));\n }\n\n /**\n * Get all subagents triggered by a specific AI message.\n *\n * @param messageId - The ID of the AI message.\n * @returns Array of subagent streams triggered by that message.\n */\n getSubagentsByMessage(\n messageId: string\n ): SubagentStreamInterface<Record<string, unknown>, ToolCall>[] {\n return [...this.subagents.values()]\n .filter((s) => s.aiMessageId === messageId && this.isValidSubagent(s))\n .map((s) => this.buildExecution(s));\n }\n\n /**\n * Parse tool call args, handling both object and string formats.\n * During streaming, args might come as a string that needs parsing.\n */\n private parseArgs(\n args: Record<string, unknown> | string | undefined\n ): Record<string, unknown> {\n if (!args) return {};\n if (typeof args === \"string\") {\n try {\n return JSON.parse(args);\n } catch {\n return {};\n }\n }\n return args;\n }\n\n /**\n * Register new subagent(s) from AI message tool calls.\n *\n * Called when an AI message is received with tool calls.\n * Creates pending subagent entries for each subagent tool call.\n *\n * @param toolCalls - The tool calls from an AI message\n * @param aiMessageId - The ID of the AI message that triggered the tool calls\n */\n registerFromToolCalls(\n toolCalls: Array<{\n id?: string;\n name: string;\n args: Record<string, unknown> | string;\n }>,\n aiMessageId?: string | null\n ): void {\n let hasChanges = false;\n\n for (const toolCall of toolCalls) {\n if (!toolCall.id) continue;\n if (!this.isSubagentToolCall(toolCall.name)) continue;\n\n // Parse args (may be string during streaming)\n const parsedArgs = this.parseArgs(toolCall.args);\n\n // Skip tool calls that have no meaningful info (likely streaming artifacts)\n // We require a valid subagent_type that looks like a proper identifier\n const hasValidType = this.isValidSubagentType(parsedArgs.subagent_type);\n\n // If we already have this subagent, update the args if they're now more complete\n const existing = this.subagents.get(toolCall.id);\n if (existing) {\n // Only update if new values are valid AND longer (more complete)\n const newType = (parsedArgs.subagent_type as string) || \"\";\n const oldType = existing.toolCall.args.subagent_type || \"\";\n const newDesc = (parsedArgs.description as string) || \"\";\n const oldDesc = existing.toolCall.args.description || \"\";\n\n // Only accept new type if it's valid (not corrupted)\n const newTypeIsValid = this.isValidSubagentType(newType);\n const shouldUpdateType =\n newTypeIsValid && newType.length > oldType.length;\n const shouldUpdateDesc = newDesc.length > oldDesc.length;\n\n if (shouldUpdateType || shouldUpdateDesc) {\n this.subagents.set(toolCall.id, {\n ...existing,\n toolCall: {\n ...existing.toolCall,\n args: {\n ...existing.toolCall.args,\n ...parsedArgs,\n description: shouldUpdateDesc ? newDesc : oldDesc,\n subagent_type: shouldUpdateType ? newType : oldType,\n },\n },\n });\n hasChanges = true;\n }\n continue;\n }\n\n // Don't register subagents without at least a valid-looking subagent_type\n // Partial streaming is OK - we filter by status when displaying\n if (!hasValidType) {\n continue;\n }\n\n const subagentToolCall: SubagentToolCall = {\n id: toolCall.id,\n name: toolCall.name,\n args: {\n description: parsedArgs.description as string | undefined,\n subagent_type: parsedArgs.subagent_type as string | undefined,\n ...parsedArgs,\n },\n };\n\n const execution: SubagentStreamBase<ToolCall> = {\n id: toolCall.id,\n toolCall: subagentToolCall,\n status: \"pending\",\n values: {},\n result: null,\n error: null,\n namespace: [],\n messages: [],\n aiMessageId: aiMessageId ?? null,\n parentId: null,\n depth: 0,\n startedAt: null,\n completedAt: null,\n };\n\n this.subagents.set(toolCall.id, execution);\n // Create a message manager for this subagent\n this.getMessageManager(toolCall.id);\n hasChanges = true;\n }\n\n // Retry any pending matches now that we have new/updated tool calls\n if (hasChanges) {\n this.retryPendingMatches();\n this.onSubagentChange?.();\n }\n }\n\n /**\n * Retry matching pending namespaces to newly registered tool calls.\n */\n private retryPendingMatches(): void {\n if (this.pendingMatches.size === 0) return;\n\n // Try to match each pending namespace\n for (const [namespaceId, description] of this.pendingMatches) {\n // Skip if already matched\n if (this.namespaceToToolCallId.has(namespaceId)) {\n this.pendingMatches.delete(namespaceId);\n continue;\n }\n\n // Try to match - this will establish mapping if successful\n const matched = this.matchSubgraphToSubagent(namespaceId, description);\n if (matched) {\n this.pendingMatches.delete(namespaceId);\n }\n }\n }\n\n /**\n * Mark a subagent as running and update its namespace.\n *\n * Called when update events are received with a namespace indicating\n * which subagent is streaming.\n *\n * @param toolCallId - The tool call ID of the subagent\n * @param options - Additional update options\n */\n markRunning(\n toolCallId: string,\n options?: {\n namespace?: string[];\n }\n ): void {\n const existing = this.subagents.get(toolCallId);\n if (!existing) return;\n\n const namespace = options?.namespace ?? existing.namespace;\n\n this.subagents.set(toolCallId, {\n ...existing,\n status: \"running\",\n namespace,\n parentId:\n existing.parentId ?? extractParentIdFromNamespace(namespace) ?? null,\n depth: existing.depth || calculateDepthFromNamespace(namespace),\n startedAt: existing.startedAt ?? new Date(),\n });\n\n this.onSubagentChange?.();\n }\n\n /**\n * Mark a subagent as running using a namespace ID.\n * Resolves the namespace ID to the actual tool call ID via the mapping.\n *\n * @param namespaceId - The namespace ID (pregel task ID) from the subgraph\n * @param namespace - The full namespace array\n */\n markRunningFromNamespace(namespaceId: string, namespace?: string[]): void {\n const toolCallId = this.getToolCallIdFromNamespace(namespaceId);\n this.markRunning(toolCallId, { namespace });\n }\n\n /**\n * Add a serialized message to a subagent from stream events.\n *\n * This method handles the raw serialized message data from SSE events.\n * Uses MessageTupleManager for proper chunk concatenation, matching\n * how the main stream handles messages.\n *\n * @param namespaceId - The namespace ID (pregel task ID) from the stream\n * @param serialized - The serialized message from the stream\n * @param metadata - Optional metadata from the stream event\n */\n addMessageToSubagent(\n namespaceId: string,\n serialized: Message<DefaultToolCall>,\n metadata?: Record<string, unknown>\n ): void {\n // First, try to match this namespace to an existing subagent\n // For human messages (which contain the description), try to establish the mapping\n if (serialized.type === \"human\" && typeof serialized.content === \"string\") {\n this.matchSubgraphToSubagent(namespaceId, serialized.content);\n }\n\n // Resolve the actual tool call ID from the namespace mapping\n const toolCallId = this.getToolCallIdFromNamespace(namespaceId);\n const existing = this.subagents.get(toolCallId);\n\n // If we still don't have a match, the mapping hasn't been established yet.\n // Don't create a placeholder - just skip this message.\n // The values event will establish the mapping, and subsequent messages\n // will be routed correctly.\n if (!existing) {\n return;\n }\n\n // Use MessageTupleManager for proper chunk concatenation\n // This is the same approach used by the main stream\n const manager = this.getMessageManager(toolCallId);\n const messageId = manager.add(serialized, metadata);\n\n if (messageId) {\n // Update the subagent status if this is an AI message with content\n if (serialized.type === \"ai\") {\n this.subagents.set(toolCallId, {\n ...existing,\n status: \"running\",\n startedAt: existing.startedAt ?? new Date(),\n // Messages are derived from the manager, so we update them here\n messages: this.getMessagesForSubagent(toolCallId),\n });\n } else {\n // For other message types, just update the messages\n this.subagents.set(toolCallId, {\n ...existing,\n messages: this.getMessagesForSubagent(toolCallId),\n });\n }\n }\n\n this.onSubagentChange?.();\n }\n\n /**\n * Update subagent values from a values stream event.\n *\n * Called when a values event is received from a subagent's namespace.\n * This populates the subagent's state values, making them accessible\n * via the `values` property.\n *\n * @param namespaceId - The namespace ID (pregel task ID) from the stream\n * @param values - The state values from the stream event\n */\n updateSubagentValues(\n namespaceId: string,\n values: Record<string, unknown>\n ): void {\n // Resolve the actual tool call ID from the namespace mapping\n const toolCallId = this.getToolCallIdFromNamespace(namespaceId);\n const existing = this.subagents.get(toolCallId);\n\n if (!existing) {\n return;\n }\n\n this.subagents.set(toolCallId, {\n ...existing,\n values,\n status: existing.status === \"pending\" ? \"running\" : existing.status,\n startedAt: existing.startedAt ?? new Date(),\n });\n\n this.onSubagentChange?.();\n }\n\n /**\n * Complete a subagent with a result.\n *\n * Called when a tool message is received for the subagent.\n *\n * @param toolCallId - The tool call ID of the subagent\n * @param result - The result content\n * @param status - The final status (complete or error)\n */\n complete(\n toolCallId: string,\n result: string,\n status: \"complete\" | \"error\" = \"complete\"\n ): void {\n const existing = this.subagents.get(toolCallId);\n if (!existing) return;\n\n this.subagents.set(toolCallId, {\n ...existing,\n status,\n result: status === \"complete\" ? result : null,\n error: status === \"error\" ? result : null,\n completedAt: new Date(),\n });\n\n this.onSubagentChange?.();\n }\n\n /**\n * Clear all subagent state.\n */\n clear(): void {\n this.subagents.clear();\n this.namespaceToToolCallId.clear();\n this.messageManagers.clear();\n this.pendingMatches.clear();\n this.onSubagentChange?.();\n }\n\n /**\n * Process a tool message to complete a subagent.\n *\n * @param toolCallId - The tool call ID from the tool message\n * @param content - The result content\n * @param status - Whether the tool execution was successful\n */\n processToolMessage(\n toolCallId: string,\n content: string,\n status: \"success\" | \"error\" = \"success\"\n ): void {\n const existing = this.subagents.get(toolCallId);\n if (!existing) return;\n\n this.complete(\n toolCallId,\n content,\n status === \"success\" ? \"complete\" : \"error\"\n );\n }\n\n /**\n * Reconstruct subagent state from historical messages.\n *\n * This method parses an array of messages (typically from thread history)\n * to identify subagent executions and their results. It's used to restore\n * subagent state after:\n * - Page refresh (when stream has already completed)\n * - Loading thread history\n * - Navigating between threads\n *\n * The reconstruction process:\n * 1. Find AI messages with tool calls matching subagent tool names\n * 2. Find corresponding tool messages with results\n * 3. Create SubagentStream entries with \"complete\" status\n *\n * Note: Internal subagent messages (their streaming conversation) are not\n * reconstructed since they are not persisted in the main thread state.\n *\n * @param messages - Array of messages from thread history\n * @param options - Optional configuration\n * @param options.skipIfPopulated - If true, skip reconstruction if subagents already exist\n */\n reconstructFromMessages(\n messages: Message<DefaultToolCall>[],\n options?: { skipIfPopulated?: boolean }\n ): void {\n // Skip if we already have subagents (from active streaming)\n if (options?.skipIfPopulated && this.subagents.size > 0) {\n return;\n }\n\n // Build a map of tool_call_id -> tool message content for quick lookup\n const toolResults = new Map<\n string,\n { content: string; status: \"success\" | \"error\" }\n >();\n\n for (const message of messages) {\n if (message.type === \"tool\" && \"tool_call_id\" in message) {\n const toolCallId = message.tool_call_id as string;\n const content =\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content);\n const status =\n \"status\" in message && message.status === \"error\"\n ? \"error\"\n : \"success\";\n toolResults.set(toolCallId, { content, status });\n }\n }\n\n // Find AI messages with subagent tool calls\n let hasChanges = false;\n\n for (const message of messages) {\n if (\n message.type !== \"ai\" ||\n !(\"tool_calls\" in message) ||\n !Array.isArray(message.tool_calls)\n ) {\n continue;\n }\n\n for (const toolCall of message.tool_calls) {\n if (!toolCall.id) continue;\n if (!this.isSubagentToolCall(toolCall.name)) continue;\n\n // Skip if we already have this subagent\n if (this.subagents.has(toolCall.id)) continue;\n\n // Parse args\n const parsedArgs = this.parseArgs(toolCall.args);\n\n // Skip if no valid subagent_type\n if (!this.isValidSubagentType(parsedArgs.subagent_type)) continue;\n\n // Create the subagent tool call\n const subagentToolCall: SubagentToolCall = {\n id: toolCall.id,\n name: toolCall.name,\n args: {\n description: parsedArgs.description as string | undefined,\n subagent_type: parsedArgs.subagent_type as string | undefined,\n ...parsedArgs,\n },\n };\n\n // Check if we have a result for this tool call\n const toolResult = toolResults.get(toolCall.id);\n const isComplete = !!toolResult;\n // eslint-disable-next-line no-nested-ternary\n const status: SubagentStatus = isComplete\n ? toolResult.status === \"error\"\n ? \"error\"\n : \"complete\"\n : \"running\";\n\n // Create the subagent execution\n const execution: SubagentStreamBase<ToolCall> = {\n id: toolCall.id,\n toolCall: subagentToolCall,\n status,\n values: {}, // Values not available from history\n result:\n isComplete && status === \"complete\" ? toolResult.content : null,\n error: isComplete && status === \"error\" ? toolResult.content : null,\n namespace: [],\n messages: [], // Internal messages are not available from history\n aiMessageId: (message.id as string) ?? null,\n parentId: null,\n depth: 0,\n startedAt: null,\n completedAt: isComplete ? new Date() : null,\n };\n\n this.subagents.set(toolCall.id, execution);\n hasChanges = true;\n }\n }\n\n if (hasChanges) {\n this.onSubagentChange?.();\n }\n }\n\n /**\n * Check if any subagents are currently tracked.\n */\n hasSubagents(): boolean {\n return this.subagents.size > 0;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"subagents.js","names":[],"sources":["../../src/ui/subagents.ts"],"sourcesContent":["import type { BaseMessage } from \"@langchain/core/messages\";\nimport type {\n Message,\n DefaultToolCall,\n AIMessage,\n ToolCallWithResult,\n} from \"../types.messages.js\";\nimport type {\n SubagentStreamInterface,\n SubagentToolCall,\n SubagentStatus,\n} from \"./types.js\";\nimport { MessageTupleManager, toMessageDict } from \"./messages.js\";\nimport { getToolCallsWithResults } from \"../utils/tools.js\";\n\n/**\n * Default tool names that indicate subagent invocation.\n * Can be customized via SubagentManager options.\n */\nconst DEFAULT_SUBAGENT_TOOL_NAMES = [\"task\"];\n\n/**\n * Checks if a namespace indicates a subagent/subgraph message.\n *\n * Subagent namespaces contain a \"tools:\" segment indicating they\n * originate from a tool call that spawned a subgraph.\n *\n * @param namespace - The namespace array from stream events (or checkpoint_ns string)\n * @returns True if this is a subagent namespace\n */\nexport function isSubagentNamespace(\n namespace: string[] | string | undefined\n): boolean {\n if (!namespace) return false;\n\n // Handle string namespace (from checkpoint_ns)\n if (typeof namespace === \"string\") {\n return namespace.includes(\"tools:\");\n }\n\n // Handle array namespace\n return namespace.some((s) => s.startsWith(\"tools:\"));\n}\n\n/**\n * Extracts the tool call ID from a namespace path.\n *\n * Namespaces follow the pattern: [\"tools:call_abc123\", \"model_request:xyz\", ...]\n * This function extracts \"call_abc123\" from the first \"tools:\" segment.\n *\n * @param namespace - The namespace array from stream events\n * @returns The tool call ID, or undefined if not found\n */\nexport function extractToolCallIdFromNamespace(\n namespace: string[] | undefined\n): string | undefined {\n if (!namespace || namespace.length === 0) return undefined;\n\n // Find the first namespace segment that starts with \"tools:\"\n for (const segment of namespace) {\n if (segment.startsWith(\"tools:\")) {\n return segment.slice(6); // Remove \"tools:\" prefix\n }\n }\n\n return undefined;\n}\n\n/**\n * Calculates the depth of a subagent based on its namespace.\n * Counts the number of \"tools:\" segments in the namespace.\n *\n * @param namespace - The namespace array\n * @returns The depth (0 for main agent, 1+ for subagents)\n */\nexport function calculateDepthFromNamespace(\n namespace: string[] | undefined\n): number {\n if (!namespace) return 0;\n return namespace.filter((s) => s.startsWith(\"tools:\")).length;\n}\n\n/**\n * Extracts the parent tool call ID from a namespace.\n *\n * For nested subagents, the namespace looks like:\n * [\"tools:parent_id\", \"tools:child_id\", ...]\n *\n * @param namespace - The namespace array\n * @returns The parent tool call ID, or null if this is a top-level subagent\n */\nexport function extractParentIdFromNamespace(\n namespace: string[] | undefined\n): string | null {\n if (!namespace || namespace.length < 2) return null;\n\n const toolSegments = namespace.filter((s) => s.startsWith(\"tools:\"));\n if (toolSegments.length < 2) return null;\n\n // The second-to-last \"tools:\" segment is the parent\n return toolSegments[toolSegments.length - 2]?.slice(6) ?? null;\n}\n\n/**\n * Options for SubagentManager.\n */\nexport interface SubagentManagerOptions {\n /**\n * Tool names that indicate subagent invocation.\n * Defaults to [\"task\"].\n */\n subagentToolNames?: string[];\n\n /**\n * Callback when subagent state changes.\n */\n onSubagentChange?: () => void;\n\n /**\n * Converts a @langchain/core BaseMessage to the desired output format.\n * Defaults to `toMessageDict` which produces plain Message objects.\n */\n toMessage?: (chunk: BaseMessage) => Message | BaseMessage;\n}\n\n/**\n * Internal base type for SubagentStream storage.\n * Excludes derived properties that are computed on retrieval.\n */\ntype SubagentStreamBase<ToolCall> = Omit<\n SubagentStreamInterface<Record<string, unknown>, ToolCall>,\n | \"isLoading\"\n | \"toolCalls\"\n | \"getToolCalls\"\n | \"interrupt\"\n | \"interrupts\"\n | \"switchThread\"\n | \"subagents\"\n | \"activeSubagents\"\n | \"getSubagent\"\n | \"getSubagentsByType\"\n | \"getSubagentsByMessage\"\n> & {\n /** Internal: ID of the AI message that triggered this subagent */\n aiMessageId: string | null;\n};\n\n/**\n * Manages subagent execution state.\n *\n * Tracks subagents from the moment they are invoked (AI message with tool calls)\n * through streaming to completion (tool message result).\n */\nexport class SubagentManager<ToolCall = DefaultToolCall> {\n private subagents = new Map<string, SubagentStreamBase<ToolCall>>();\n\n /**\n * Maps namespace IDs (pregel task IDs) to tool call IDs.\n * LangGraph subgraphs use internal pregel task IDs in their namespace,\n * which are different from the tool_call_id used to invoke them.\n */\n private namespaceToToolCallId = new Map<string, string>();\n\n /**\n * Pending namespace matches that couldn't be resolved immediately.\n * These are retried when new tool calls are registered.\n */\n private pendingMatches = new Map<string, string>(); // namespaceId -> description\n\n /**\n * Message managers for each subagent.\n * Uses the same MessageTupleManager as the main stream for proper\n * message chunk concatenation.\n */\n private messageManagers = new Map<string, MessageTupleManager>();\n\n private subagentToolNames: Set<string>;\n\n private onSubagentChange?: () => void;\n\n private toMessage: (chunk: BaseMessage) => Message | BaseMessage;\n\n constructor(options?: SubagentManagerOptions) {\n this.subagentToolNames = new Set(\n options?.subagentToolNames ?? DEFAULT_SUBAGENT_TOOL_NAMES\n );\n this.onSubagentChange = options?.onSubagentChange;\n this.toMessage = options?.toMessage ?? toMessageDict;\n }\n\n /**\n * Get or create a MessageTupleManager for a subagent.\n */\n private getMessageManager(toolCallId: string): MessageTupleManager {\n let manager = this.messageManagers.get(toolCallId);\n if (!manager) {\n manager = new MessageTupleManager();\n this.messageManagers.set(toolCallId, manager);\n }\n return manager;\n }\n\n /**\n * Get messages for a subagent with proper chunk concatenation.\n * This mirrors how the main stream handles messages.\n */\n private getMessagesForSubagent(toolCallId: string): Message<ToolCall>[] {\n const manager = this.messageManagers.get(toolCallId);\n if (!manager) return [];\n\n const messages: Message<ToolCall>[] = [];\n for (const entry of Object.values(manager.chunks)) {\n if (entry.chunk) {\n messages.push(this.toMessage(entry.chunk) as Message<ToolCall>);\n }\n }\n return messages;\n }\n\n /**\n * Create a complete SubagentStream object with all derived properties.\n * This ensures consistency with UseStream interface.\n */\n private createSubagentStream(\n base: SubagentStreamBase<ToolCall>\n ): SubagentStreamInterface<Record<string, unknown>, ToolCall> {\n const { messages } = base;\n const allToolCalls = getToolCallsWithResults<ToolCall>(messages);\n\n return {\n ...base,\n // Derived from status for UseStream consistency\n isLoading: base.status === \"running\",\n\n // Tool calls derived from messages\n toolCalls: allToolCalls,\n\n // Method to get tool calls for a specific message\n getToolCalls: (\n message: AIMessage<ToolCall>\n ): ToolCallWithResult<ToolCall>[] => {\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n },\n\n // Subagents don't have interrupts yet (future enhancement)\n interrupt: undefined,\n interrupts: [],\n\n // Subagents don't support thread switching\n switchThread: () => {},\n\n // Nested subagent tracking (empty for now, future enhancement)\n subagents: new Map<\n string,\n SubagentStreamInterface<Record<string, unknown>, ToolCall>\n >(),\n activeSubagents: [],\n getSubagent: () => undefined,\n getSubagentsByType: () => [],\n getSubagentsByMessage: () => [],\n };\n }\n\n /**\n * Get the tool call ID for a given namespace ID.\n * Returns the namespace ID itself if no mapping exists.\n */\n getToolCallIdFromNamespace(namespaceId: string): string {\n return this.namespaceToToolCallId.get(namespaceId) ?? namespaceId;\n }\n\n /**\n * Try to match a subgraph to a pending subagent by description.\n * Creates a mapping from namespace ID to tool call ID if a match is found.\n *\n * Uses a multi-pass matching strategy:\n * 1. Exact description match\n * 2. Description contains/partial match\n * 3. Any unmapped pending subagent (fallback)\n *\n * @param namespaceId - The namespace ID (pregel task ID) from the subgraph\n * @param description - The description from the subgraph's initial message\n * @returns The matched tool call ID, or undefined if no match\n */\n matchSubgraphToSubagent(\n namespaceId: string,\n description: string\n ): string | undefined {\n // Skip if we already have a mapping\n if (this.namespaceToToolCallId.has(namespaceId)) {\n return this.namespaceToToolCallId.get(namespaceId);\n }\n\n // Get all already-mapped tool call IDs\n const mappedToolCallIds = new Set(this.namespaceToToolCallId.values());\n\n // Helper to establish mapping and mark as running\n const establishMapping = (toolCallId: string): string => {\n this.namespaceToToolCallId.set(namespaceId, toolCallId);\n // Also mark the subagent as running since we now have its namespace\n const subagent = this.subagents.get(toolCallId);\n if (subagent && subagent.status === \"pending\") {\n this.subagents.set(toolCallId, {\n ...subagent,\n status: \"running\",\n namespace: [namespaceId],\n startedAt: new Date(),\n });\n this.onSubagentChange?.();\n }\n return toolCallId;\n };\n\n // Pass 1: Find a pending subagent with exact description match\n for (const [toolCallId, subagent] of this.subagents) {\n if (\n (subagent.status === \"pending\" || subagent.status === \"running\") &&\n !mappedToolCallIds.has(toolCallId) &&\n subagent.toolCall.args.description === description\n ) {\n return establishMapping(toolCallId);\n }\n }\n\n // Pass 2: Find a pending subagent where description contains or is contained\n for (const [toolCallId, subagent] of this.subagents) {\n if (\n (subagent.status === \"pending\" || subagent.status === \"running\") &&\n !mappedToolCallIds.has(toolCallId)\n ) {\n const subagentDesc = subagent.toolCall.args.description || \"\";\n if (\n (subagentDesc && description.includes(subagentDesc)) ||\n (subagentDesc && subagentDesc.includes(description))\n ) {\n // Update the description if the new one is longer\n if (description.length > subagentDesc.length) {\n this.subagents.set(toolCallId, {\n ...subagent,\n toolCall: {\n ...subagent.toolCall,\n args: {\n ...subagent.toolCall.args,\n description,\n },\n },\n });\n }\n return establishMapping(toolCallId);\n }\n }\n }\n\n // No match found - store for retry when more tool calls are registered\n if (description) {\n this.pendingMatches.set(namespaceId, description);\n }\n return undefined;\n }\n\n /**\n * Check if a tool call is a subagent invocation.\n */\n isSubagentToolCall(toolName: string): boolean {\n return this.subagentToolNames.has(toolName);\n }\n\n /**\n * Check if a subagent_type value is valid.\n * Valid types are proper identifiers like \"weather-scout\", \"experience-curator\".\n */\n private isValidSubagentType(type: unknown): boolean {\n // Must be a non-empty string\n if (!type || typeof type !== \"string\") {\n return false;\n }\n\n // Must be at least 3 characters (avoids partial streaming like \"ex\")\n if (type.length < 3) {\n return false;\n }\n\n // Must look like a valid identifier (letters, numbers, hyphens, underscores)\n // Examples: \"weather-scout\", \"experience_curator\", \"budget-optimizer\"\n if (!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(type)) {\n return false;\n }\n\n // Must not be unreasonably long (corruption indicator)\n if (type.length > 50) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Check if a subagent should be shown to the user.\n * Subagents are only shown once they've actually started running.\n *\n * This filters out:\n * - Pending subagents that haven't been matched to a namespace yet\n * - Streaming artifacts with partial/corrupted data\n *\n * The idea is: we register subagents internally when we see tool calls,\n * but we only show them to the user once LangGraph confirms they're\n * actually executing (via namespace events).\n */\n private isValidSubagent(subagent: SubagentStreamBase<ToolCall>): boolean {\n // Only show subagents that have started running or completed\n // This ensures we don't show partial/pending subagents\n return subagent.status === \"running\" || subagent.status === \"complete\";\n }\n\n /**\n * Build a complete SubagentStream from internal state.\n * Adds messages and derived properties.\n */\n private buildExecution(\n base: SubagentStreamBase<ToolCall>\n ): SubagentStreamInterface<Record<string, unknown>, ToolCall> {\n // Get fresh messages from the manager\n const messages = this.getMessagesForSubagent(base.id);\n return this.createSubagentStream({\n ...base,\n messages,\n });\n }\n\n /**\n * Get all subagents as a Map.\n * Filters out incomplete/phantom subagents that lack subagent_type.\n */\n getSubagents(): Map<\n string,\n SubagentStreamInterface<Record<string, unknown>, ToolCall>\n > {\n const result = new Map<\n string,\n SubagentStreamInterface<Record<string, unknown>, ToolCall>\n >();\n for (const [id, subagent] of this.subagents) {\n if (this.isValidSubagent(subagent)) {\n result.set(id, this.buildExecution(subagent));\n }\n }\n return result;\n }\n\n /**\n * Get all currently running subagents.\n * Filters out incomplete/phantom subagents.\n */\n getActiveSubagents(): SubagentStreamInterface<\n Record<string, unknown>,\n ToolCall\n >[] {\n return [...this.subagents.values()]\n .filter((s) => s.status === \"running\" && this.isValidSubagent(s))\n .map((s) => this.buildExecution(s));\n }\n\n /**\n * Get a specific subagent by tool call ID.\n */\n getSubagent(\n toolCallId: string\n ): SubagentStreamInterface<Record<string, unknown>, ToolCall> | undefined {\n const subagent = this.subagents.get(toolCallId);\n return subagent ? this.buildExecution(subagent) : undefined;\n }\n\n /**\n * Get all subagents of a specific type.\n */\n getSubagentsByType(\n type: string\n ): SubagentStreamInterface<Record<string, unknown>, ToolCall>[] {\n return [...this.subagents.values()]\n .filter((s) => s.toolCall.args.subagent_type === type)\n .map((s) => this.buildExecution(s));\n }\n\n /**\n * Get all subagents triggered by a specific AI message.\n *\n * @param messageId - The ID of the AI message.\n * @returns Array of subagent streams triggered by that message.\n */\n getSubagentsByMessage(\n messageId: string\n ): SubagentStreamInterface<Record<string, unknown>, ToolCall>[] {\n return [...this.subagents.values()]\n .filter((s) => s.aiMessageId === messageId && this.isValidSubagent(s))\n .map((s) => this.buildExecution(s));\n }\n\n /**\n * Parse tool call args, handling both object and string formats.\n * During streaming, args might come as a string that needs parsing.\n */\n private parseArgs(\n args: Record<string, unknown> | string | undefined\n ): Record<string, unknown> {\n if (!args) return {};\n if (typeof args === \"string\") {\n try {\n return JSON.parse(args);\n } catch {\n return {};\n }\n }\n return args;\n }\n\n /**\n * Register new subagent(s) from AI message tool calls.\n *\n * Called when an AI message is received with tool calls.\n * Creates pending subagent entries for each subagent tool call.\n *\n * @param toolCalls - The tool calls from an AI message\n * @param aiMessageId - The ID of the AI message that triggered the tool calls\n */\n registerFromToolCalls(\n toolCalls: Array<{\n id?: string;\n name: string;\n args: Record<string, unknown> | string;\n }>,\n aiMessageId?: string | null\n ): void {\n let hasChanges = false;\n\n for (const toolCall of toolCalls) {\n if (!toolCall.id) continue;\n if (!this.isSubagentToolCall(toolCall.name)) continue;\n\n // Parse args (may be string during streaming)\n const parsedArgs = this.parseArgs(toolCall.args);\n\n // Skip tool calls that have no meaningful info (likely streaming artifacts)\n // We require a valid subagent_type that looks like a proper identifier\n const hasValidType = this.isValidSubagentType(parsedArgs.subagent_type);\n\n // If we already have this subagent, update the args if they're now more complete\n const existing = this.subagents.get(toolCall.id);\n if (existing) {\n // Only update if new values are valid AND longer (more complete)\n const newType = (parsedArgs.subagent_type as string) || \"\";\n const oldType = existing.toolCall.args.subagent_type || \"\";\n const newDesc = (parsedArgs.description as string) || \"\";\n const oldDesc = existing.toolCall.args.description || \"\";\n\n // Only accept new type if it's valid (not corrupted)\n const newTypeIsValid = this.isValidSubagentType(newType);\n const shouldUpdateType =\n newTypeIsValid && newType.length > oldType.length;\n const shouldUpdateDesc = newDesc.length > oldDesc.length;\n\n if (shouldUpdateType || shouldUpdateDesc) {\n this.subagents.set(toolCall.id, {\n ...existing,\n toolCall: {\n ...existing.toolCall,\n args: {\n ...existing.toolCall.args,\n ...parsedArgs,\n description: shouldUpdateDesc ? newDesc : oldDesc,\n subagent_type: shouldUpdateType ? newType : oldType,\n },\n },\n });\n hasChanges = true;\n }\n continue;\n }\n\n // Don't register subagents without at least a valid-looking subagent_type\n // Partial streaming is OK - we filter by status when displaying\n if (!hasValidType) {\n continue;\n }\n\n const subagentToolCall: SubagentToolCall = {\n id: toolCall.id,\n name: toolCall.name,\n args: {\n description: parsedArgs.description as string | undefined,\n subagent_type: parsedArgs.subagent_type as string | undefined,\n ...parsedArgs,\n },\n };\n\n const execution: SubagentStreamBase<ToolCall> = {\n id: toolCall.id,\n toolCall: subagentToolCall,\n status: \"pending\",\n values: {},\n result: null,\n error: null,\n namespace: [],\n messages: [],\n aiMessageId: aiMessageId ?? null,\n parentId: null,\n depth: 0,\n startedAt: null,\n completedAt: null,\n };\n\n this.subagents.set(toolCall.id, execution);\n // Create a message manager for this subagent\n this.getMessageManager(toolCall.id);\n hasChanges = true;\n }\n\n // Retry any pending matches now that we have new/updated tool calls\n if (hasChanges) {\n this.retryPendingMatches();\n this.onSubagentChange?.();\n }\n }\n\n /**\n * Retry matching pending namespaces to newly registered tool calls.\n */\n private retryPendingMatches(): void {\n if (this.pendingMatches.size === 0) return;\n\n // Try to match each pending namespace\n for (const [namespaceId, description] of this.pendingMatches) {\n // Skip if already matched\n if (this.namespaceToToolCallId.has(namespaceId)) {\n this.pendingMatches.delete(namespaceId);\n continue;\n }\n\n // Try to match - this will establish mapping if successful\n const matched = this.matchSubgraphToSubagent(namespaceId, description);\n if (matched) {\n this.pendingMatches.delete(namespaceId);\n }\n }\n }\n\n /**\n * Mark a subagent as running and update its namespace.\n *\n * Called when update events are received with a namespace indicating\n * which subagent is streaming.\n *\n * @param toolCallId - The tool call ID of the subagent\n * @param options - Additional update options\n */\n markRunning(\n toolCallId: string,\n options?: {\n namespace?: string[];\n }\n ): void {\n const existing = this.subagents.get(toolCallId);\n if (!existing) return;\n\n const namespace = options?.namespace ?? existing.namespace;\n\n this.subagents.set(toolCallId, {\n ...existing,\n status: \"running\",\n namespace,\n parentId:\n existing.parentId ?? extractParentIdFromNamespace(namespace) ?? null,\n depth: existing.depth || calculateDepthFromNamespace(namespace),\n startedAt: existing.startedAt ?? new Date(),\n });\n\n this.onSubagentChange?.();\n }\n\n /**\n * Mark a subagent as running using a namespace ID.\n * Resolves the namespace ID to the actual tool call ID via the mapping.\n *\n * @param namespaceId - The namespace ID (pregel task ID) from the subgraph\n * @param namespace - The full namespace array\n */\n markRunningFromNamespace(namespaceId: string, namespace?: string[]): void {\n const toolCallId = this.getToolCallIdFromNamespace(namespaceId);\n this.markRunning(toolCallId, { namespace });\n }\n\n /**\n * Add a serialized message to a subagent from stream events.\n *\n * This method handles the raw serialized message data from SSE events.\n * Uses MessageTupleManager for proper chunk concatenation, matching\n * how the main stream handles messages.\n *\n * @param namespaceId - The namespace ID (pregel task ID) from the stream\n * @param serialized - The serialized message from the stream\n * @param metadata - Optional metadata from the stream event\n */\n addMessageToSubagent(\n namespaceId: string,\n serialized: Message<DefaultToolCall>,\n metadata?: Record<string, unknown>\n ): void {\n // First, try to match this namespace to an existing subagent\n // For human messages (which contain the description), try to establish the mapping\n if (serialized.type === \"human\" && typeof serialized.content === \"string\") {\n this.matchSubgraphToSubagent(namespaceId, serialized.content);\n }\n\n // Resolve the actual tool call ID from the namespace mapping\n const toolCallId = this.getToolCallIdFromNamespace(namespaceId);\n const existing = this.subagents.get(toolCallId);\n\n // If we still don't have a match, the mapping hasn't been established yet.\n // Don't create a placeholder - just skip this message.\n // The values event will establish the mapping, and subsequent messages\n // will be routed correctly.\n if (!existing) {\n return;\n }\n\n // Use MessageTupleManager for proper chunk concatenation\n // This is the same approach used by the main stream\n const manager = this.getMessageManager(toolCallId);\n const messageId = manager.add(serialized, metadata);\n\n if (messageId) {\n // Update the subagent status if this is an AI message with content\n if (serialized.type === \"ai\") {\n this.subagents.set(toolCallId, {\n ...existing,\n status: \"running\",\n startedAt: existing.startedAt ?? new Date(),\n // Messages are derived from the manager, so we update them here\n messages: this.getMessagesForSubagent(toolCallId),\n });\n } else {\n // For other message types, just update the messages\n this.subagents.set(toolCallId, {\n ...existing,\n messages: this.getMessagesForSubagent(toolCallId),\n });\n }\n }\n\n this.onSubagentChange?.();\n }\n\n /**\n * Update subagent values from a values stream event.\n *\n * Called when a values event is received from a subagent's namespace.\n * This populates the subagent's state values, making them accessible\n * via the `values` property.\n *\n * @param namespaceId - The namespace ID (pregel task ID) from the stream\n * @param values - The state values from the stream event\n */\n updateSubagentValues(\n namespaceId: string,\n values: Record<string, unknown>\n ): void {\n // Resolve the actual tool call ID from the namespace mapping\n const toolCallId = this.getToolCallIdFromNamespace(namespaceId);\n const existing = this.subagents.get(toolCallId);\n\n if (!existing) {\n return;\n }\n\n this.subagents.set(toolCallId, {\n ...existing,\n values,\n status: existing.status === \"pending\" ? \"running\" : existing.status,\n startedAt: existing.startedAt ?? new Date(),\n });\n\n this.onSubagentChange?.();\n }\n\n /**\n * Complete a subagent with a result.\n *\n * Called when a tool message is received for the subagent.\n *\n * @param toolCallId - The tool call ID of the subagent\n * @param result - The result content\n * @param status - The final status (complete or error)\n */\n complete(\n toolCallId: string,\n result: string,\n status: \"complete\" | \"error\" = \"complete\"\n ): void {\n const existing = this.subagents.get(toolCallId);\n if (!existing) return;\n\n this.subagents.set(toolCallId, {\n ...existing,\n status,\n result: status === \"complete\" ? result : null,\n error: status === \"error\" ? result : null,\n completedAt: new Date(),\n });\n\n this.onSubagentChange?.();\n }\n\n /**\n * Clear all subagent state.\n */\n clear(): void {\n this.subagents.clear();\n this.namespaceToToolCallId.clear();\n this.messageManagers.clear();\n this.pendingMatches.clear();\n this.onSubagentChange?.();\n }\n\n /**\n * Process a tool message to complete a subagent.\n *\n * @param toolCallId - The tool call ID from the tool message\n * @param content - The result content\n * @param status - Whether the tool execution was successful\n */\n processToolMessage(\n toolCallId: string,\n content: string,\n status: \"success\" | \"error\" = \"success\"\n ): void {\n const existing = this.subagents.get(toolCallId);\n if (!existing) return;\n\n this.complete(\n toolCallId,\n content,\n status === \"success\" ? \"complete\" : \"error\"\n );\n }\n\n /**\n * Reconstruct subagent state from historical messages.\n *\n * This method parses an array of messages (typically from thread history)\n * to identify subagent executions and their results. It's used to restore\n * subagent state after:\n * - Page refresh (when stream has already completed)\n * - Loading thread history\n * - Navigating between threads\n *\n * The reconstruction process:\n * 1. Find AI messages with tool calls matching subagent tool names\n * 2. Find corresponding tool messages with results\n * 3. Create SubagentStream entries with \"complete\" status\n *\n * Note: Internal subagent messages (their streaming conversation) are not\n * reconstructed since they are not persisted in the main thread state.\n *\n * @param messages - Array of messages from thread history\n * @param options - Optional configuration\n * @param options.skipIfPopulated - If true, skip reconstruction if subagents already exist\n */\n reconstructFromMessages(\n messages: Message<DefaultToolCall>[],\n options?: { skipIfPopulated?: boolean }\n ): void {\n // Skip if we already have subagents (from active streaming)\n if (options?.skipIfPopulated && this.subagents.size > 0) {\n return;\n }\n\n // Build a map of tool_call_id -> tool message content for quick lookup\n const toolResults = new Map<\n string,\n { content: string; status: \"success\" | \"error\" }\n >();\n\n for (const message of messages) {\n if (message.type === \"tool\" && \"tool_call_id\" in message) {\n const toolCallId = message.tool_call_id as string;\n const content =\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content);\n const status =\n \"status\" in message && message.status === \"error\"\n ? \"error\"\n : \"success\";\n toolResults.set(toolCallId, { content, status });\n }\n }\n\n // Find AI messages with subagent tool calls\n let hasChanges = false;\n\n for (const message of messages) {\n if (\n message.type !== \"ai\" ||\n !(\"tool_calls\" in message) ||\n !Array.isArray(message.tool_calls)\n ) {\n continue;\n }\n\n for (const toolCall of message.tool_calls) {\n if (!toolCall.id) continue;\n if (!this.isSubagentToolCall(toolCall.name)) continue;\n\n // Skip if we already have this subagent\n if (this.subagents.has(toolCall.id)) continue;\n\n // Parse args\n const parsedArgs = this.parseArgs(toolCall.args);\n\n // Skip if no valid subagent_type\n if (!this.isValidSubagentType(parsedArgs.subagent_type)) continue;\n\n // Create the subagent tool call\n const subagentToolCall: SubagentToolCall = {\n id: toolCall.id,\n name: toolCall.name,\n args: {\n description: parsedArgs.description as string | undefined,\n subagent_type: parsedArgs.subagent_type as string | undefined,\n ...parsedArgs,\n },\n };\n\n // Check if we have a result for this tool call\n const toolResult = toolResults.get(toolCall.id);\n const isComplete = !!toolResult;\n // eslint-disable-next-line no-nested-ternary\n const status: SubagentStatus = isComplete\n ? toolResult.status === \"error\"\n ? \"error\"\n : \"complete\"\n : \"running\";\n\n // Create the subagent execution\n const execution: SubagentStreamBase<ToolCall> = {\n id: toolCall.id,\n toolCall: subagentToolCall,\n status,\n values: {}, // Values not available from history\n result:\n isComplete && status === \"complete\" ? toolResult.content : null,\n error: isComplete && status === \"error\" ? toolResult.content : null,\n namespace: [],\n messages: [], // Internal messages are not available from history\n aiMessageId: (message.id as string) ?? null,\n parentId: null,\n depth: 0,\n startedAt: null,\n completedAt: isComplete ? new Date() : null,\n };\n\n this.subagents.set(toolCall.id, execution);\n hasChanges = true;\n }\n }\n\n if (hasChanges) {\n this.onSubagentChange?.();\n }\n }\n\n /**\n * Check if any subagents are currently tracked.\n */\n hasSubagents(): boolean {\n return this.subagents.size > 0;\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const require_sse = require("../utils/sse.cjs");
|
|
2
|
+
const require_stream = require("../utils/stream.cjs");
|
|
3
|
+
//#region src/ui/transport.ts
|
|
4
|
+
var FetchStreamTransport = class {
|
|
5
|
+
constructor(options) {
|
|
6
|
+
this.options = options;
|
|
7
|
+
}
|
|
8
|
+
async stream(payload) {
|
|
9
|
+
const { signal, ...body } = payload;
|
|
10
|
+
let requestInit = {
|
|
11
|
+
method: "POST",
|
|
12
|
+
headers: {
|
|
13
|
+
"Content-Type": "application/json",
|
|
14
|
+
...this.options.defaultHeaders
|
|
15
|
+
},
|
|
16
|
+
body: JSON.stringify(body),
|
|
17
|
+
signal
|
|
18
|
+
};
|
|
19
|
+
if (this.options.onRequest) requestInit = await this.options.onRequest(this.options.apiUrl, requestInit);
|
|
20
|
+
const response = await (this.options.fetch ?? fetch)(this.options.apiUrl, requestInit);
|
|
21
|
+
if (!response.ok) throw new Error(`Failed to stream: ${response.statusText}`);
|
|
22
|
+
if (!response.body) throw new Error("Expected response body from stream endpoint");
|
|
23
|
+
const stream = response.body.pipeThrough(require_sse.BytesLineDecoder()).pipeThrough(require_sse.SSEDecoder());
|
|
24
|
+
return require_stream.IterableReadableStream.fromReadableStream(stream);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
//#endregion
|
|
28
|
+
exports.FetchStreamTransport = FetchStreamTransport;
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=transport.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.cjs","names":["BytesLineDecoder","SSEDecoder","IterableReadableStream"],"sources":["../../src/ui/transport.ts"],"sourcesContent":["import type { BagTemplate } from \"../types.template.js\";\nimport type { Command } from \"../types.js\";\nimport type {\n GetUpdateType,\n GetConfigurableType,\n UseStreamTransport,\n} from \"./types.js\";\nimport { BytesLineDecoder, SSEDecoder } from \"../utils/sse.js\";\nimport { IterableReadableStream } from \"../utils/stream.js\";\n\ninterface FetchStreamTransportOptions {\n /**\n * The URL of the API to use.\n */\n apiUrl: string;\n\n /**\n * Default headers to send with requests.\n */\n defaultHeaders?: HeadersInit;\n\n /**\n * Specify a custom fetch implementation.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fetch?: typeof fetch | ((...args: any[]) => any);\n\n /**\n * Callback that is called before the request is made.\n */\n onRequest?: (\n url: string,\n init: RequestInit\n ) => Promise<RequestInit> | RequestInit;\n}\n\nexport class FetchStreamTransport<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate\n> implements UseStreamTransport<StateType, Bag>\n{\n constructor(private readonly options: FetchStreamTransportOptions) {}\n\n async stream(payload: {\n input: GetUpdateType<Bag, StateType> | null | undefined;\n context: GetConfigurableType<Bag> | undefined;\n command: Command | undefined;\n signal: AbortSignal;\n }): Promise<AsyncGenerator<{ id?: string; event: string; data: unknown }>> {\n const { signal, ...body } = payload;\n\n let requestInit: RequestInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.options.defaultHeaders,\n },\n body: JSON.stringify(body),\n signal,\n };\n\n if (this.options.onRequest) {\n requestInit = await this.options.onRequest(\n this.options.apiUrl,\n requestInit\n );\n }\n const fetchFn = this.options.fetch ?? fetch;\n\n const response = await fetchFn(this.options.apiUrl, requestInit);\n if (!response.ok) {\n throw new Error(`Failed to stream: ${response.statusText}`);\n }\n\n if (!response.body) {\n throw new Error(\"Expected response body from stream endpoint\");\n }\n\n const stream = response.body\n .pipeThrough(BytesLineDecoder())\n .pipeThrough(SSEDecoder());\n\n return IterableReadableStream.fromReadableStream(stream);\n }\n}\n"],"mappings":";;;AAoCA,IAAa,uBAAb,MAIA;CACE,YAAY,SAAuD;AAAtC,OAAA,UAAA;;CAE7B,MAAM,OAAO,SAK8D;EACzE,MAAM,EAAE,QAAQ,GAAG,SAAS;EAE5B,IAAI,cAA2B;GAC7B,QAAQ;GACR,SAAS;IACP,gBAAgB;IAChB,GAAG,KAAK,QAAQ;IACjB;GACD,MAAM,KAAK,UAAU,KAAK;GAC1B;GACD;AAED,MAAI,KAAK,QAAQ,UACf,eAAc,MAAM,KAAK,QAAQ,UAC/B,KAAK,QAAQ,QACb,YACD;EAIH,MAAM,WAAW,OAFD,KAAK,QAAQ,SAAS,OAEP,KAAK,QAAQ,QAAQ,YAAY;AAChE,MAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,qBAAqB,SAAS,aAAa;AAG7D,MAAI,CAAC,SAAS,KACZ,OAAM,IAAI,MAAM,8CAA8C;EAGhE,MAAM,SAAS,SAAS,KACrB,YAAYA,YAAAA,kBAAkB,CAAC,CAC/B,YAAYC,YAAAA,YAAY,CAAC;AAE5B,SAAOC,eAAAA,uBAAuB,mBAAmB,OAAO"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Command } from "../types.cjs";
|
|
2
2
|
import { BagTemplate } from "../types.template.cjs";
|
|
3
|
-
import { GetConfigurableType, GetUpdateType, UseStreamTransport } from "
|
|
3
|
+
import { GetConfigurableType, GetUpdateType, UseStreamTransport } from "./types.cjs";
|
|
4
4
|
|
|
5
|
-
//#region src/
|
|
5
|
+
//#region src/ui/transport.d.ts
|
|
6
6
|
interface FetchStreamTransportOptions {
|
|
7
7
|
/**
|
|
8
8
|
* The URL of the API to use.
|
|
@@ -37,4 +37,4 @@ declare class FetchStreamTransport<StateType extends Record<string, unknown> = R
|
|
|
37
37
|
}
|
|
38
38
|
//#endregion
|
|
39
39
|
export { FetchStreamTransport };
|
|
40
|
-
//# sourceMappingURL=
|
|
40
|
+
//# sourceMappingURL=transport.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.cts","names":[],"sources":["../../src/ui/transport.ts"],"mappings":";;;;;UAUU,2BAAA;;AAJU;;EAQlB,MAAA;EAKiB;;;EAAjB,cAAA,GAAiB,WAAA;EAcZ;;;EARL,KAAA,UAAe,KAAA,QAAa,IAAA;EAX5B;;;EAgBA,SAAA,IACE,GAAA,UACA,IAAA,EAAM,WAAA,KACH,OAAA,CAAQ,WAAA,IAAe,WAAA;AAAA;AAAA,cAGjB,oBAAA,mBACO,MAAA,oBAA0B,MAAA,+BAChC,WAAA,GAAc,WAAA,aACf,kBAAA,CAAmB,SAAA,EAAW,GAAA;EAAA,iBAEZ,OAAA;EAA7B,WAAA,CAA6B,OAAA,EAAS,2BAAA;EAEhC,MAAA,CAAO,OAAA;IACX,KAAA,EAAO,aAAA,CAAc,GAAA,EAAK,SAAA;IAC1B,OAAA,EAAS,mBAAA,CAAoB,GAAA;IAC7B,OAAA,EAAS,OAAA;IACT,MAAA,EAAQ,WAAA;EAAA,IACN,OAAA,CAAQ,cAAA;IAAiB,EAAA;IAAa,KAAA;IAAe,IAAA;EAAA;AAAA"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Command } from "../types.js";
|
|
2
2
|
import { BagTemplate } from "../types.template.js";
|
|
3
|
-
import { GetConfigurableType, GetUpdateType, UseStreamTransport } from "
|
|
3
|
+
import { GetConfigurableType, GetUpdateType, UseStreamTransport } from "./types.js";
|
|
4
4
|
|
|
5
|
-
//#region src/
|
|
5
|
+
//#region src/ui/transport.d.ts
|
|
6
6
|
interface FetchStreamTransportOptions {
|
|
7
7
|
/**
|
|
8
8
|
* The URL of the API to use.
|
|
@@ -37,4 +37,4 @@ declare class FetchStreamTransport<StateType extends Record<string, unknown> = R
|
|
|
37
37
|
}
|
|
38
38
|
//#endregion
|
|
39
39
|
export { FetchStreamTransport };
|
|
40
|
-
//# sourceMappingURL=
|
|
40
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","names":[],"sources":["../../src/ui/transport.ts"],"mappings":";;;;;UAUU,2BAAA;;AAJU;;EAQlB,MAAA;EAKiB;;;EAAjB,cAAA,GAAiB,WAAA;EAcZ;;;EARL,KAAA,UAAe,KAAA,QAAa,IAAA;EAX5B;;;EAgBA,SAAA,IACE,GAAA,UACA,IAAA,EAAM,WAAA,KACH,OAAA,CAAQ,WAAA,IAAe,WAAA;AAAA;AAAA,cAGjB,oBAAA,mBACO,MAAA,oBAA0B,MAAA,+BAChC,WAAA,GAAc,WAAA,aACf,kBAAA,CAAmB,SAAA,EAAW,GAAA;EAAA,iBAEZ,OAAA;EAA7B,WAAA,CAA6B,OAAA,EAAS,2BAAA;EAEhC,MAAA,CAAO,OAAA;IACX,KAAA,EAAO,aAAA,CAAc,GAAA,EAAK,SAAA;IAC1B,OAAA,EAAS,mBAAA,CAAoB,GAAA;IAC7B,OAAA,EAAS,OAAA;IACT,MAAA,EAAQ,WAAA;EAAA,IACN,OAAA,CAAQ,cAAA;IAAiB,EAAA;IAAa,KAAA;IAAe,IAAA;EAAA;AAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { BytesLineDecoder, SSEDecoder } from "../utils/sse.js";
|
|
2
|
+
import { IterableReadableStream } from "../utils/stream.js";
|
|
3
|
+
//#region src/ui/transport.ts
|
|
4
|
+
var FetchStreamTransport = class {
|
|
5
|
+
constructor(options) {
|
|
6
|
+
this.options = options;
|
|
7
|
+
}
|
|
8
|
+
async stream(payload) {
|
|
9
|
+
const { signal, ...body } = payload;
|
|
10
|
+
let requestInit = {
|
|
11
|
+
method: "POST",
|
|
12
|
+
headers: {
|
|
13
|
+
"Content-Type": "application/json",
|
|
14
|
+
...this.options.defaultHeaders
|
|
15
|
+
},
|
|
16
|
+
body: JSON.stringify(body),
|
|
17
|
+
signal
|
|
18
|
+
};
|
|
19
|
+
if (this.options.onRequest) requestInit = await this.options.onRequest(this.options.apiUrl, requestInit);
|
|
20
|
+
const response = await (this.options.fetch ?? fetch)(this.options.apiUrl, requestInit);
|
|
21
|
+
if (!response.ok) throw new Error(`Failed to stream: ${response.statusText}`);
|
|
22
|
+
if (!response.body) throw new Error("Expected response body from stream endpoint");
|
|
23
|
+
const stream = response.body.pipeThrough(BytesLineDecoder()).pipeThrough(SSEDecoder());
|
|
24
|
+
return IterableReadableStream.fromReadableStream(stream);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
//#endregion
|
|
28
|
+
export { FetchStreamTransport };
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","names":[],"sources":["../../src/ui/transport.ts"],"sourcesContent":["import type { BagTemplate } from \"../types.template.js\";\nimport type { Command } from \"../types.js\";\nimport type {\n GetUpdateType,\n GetConfigurableType,\n UseStreamTransport,\n} from \"./types.js\";\nimport { BytesLineDecoder, SSEDecoder } from \"../utils/sse.js\";\nimport { IterableReadableStream } from \"../utils/stream.js\";\n\ninterface FetchStreamTransportOptions {\n /**\n * The URL of the API to use.\n */\n apiUrl: string;\n\n /**\n * Default headers to send with requests.\n */\n defaultHeaders?: HeadersInit;\n\n /**\n * Specify a custom fetch implementation.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fetch?: typeof fetch | ((...args: any[]) => any);\n\n /**\n * Callback that is called before the request is made.\n */\n onRequest?: (\n url: string,\n init: RequestInit\n ) => Promise<RequestInit> | RequestInit;\n}\n\nexport class FetchStreamTransport<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate\n> implements UseStreamTransport<StateType, Bag>\n{\n constructor(private readonly options: FetchStreamTransportOptions) {}\n\n async stream(payload: {\n input: GetUpdateType<Bag, StateType> | null | undefined;\n context: GetConfigurableType<Bag> | undefined;\n command: Command | undefined;\n signal: AbortSignal;\n }): Promise<AsyncGenerator<{ id?: string; event: string; data: unknown }>> {\n const { signal, ...body } = payload;\n\n let requestInit: RequestInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.options.defaultHeaders,\n },\n body: JSON.stringify(body),\n signal,\n };\n\n if (this.options.onRequest) {\n requestInit = await this.options.onRequest(\n this.options.apiUrl,\n requestInit\n );\n }\n const fetchFn = this.options.fetch ?? fetch;\n\n const response = await fetchFn(this.options.apiUrl, requestInit);\n if (!response.ok) {\n throw new Error(`Failed to stream: ${response.statusText}`);\n }\n\n if (!response.body) {\n throw new Error(\"Expected response body from stream endpoint\");\n }\n\n const stream = response.body\n .pipeThrough(BytesLineDecoder())\n .pipeThrough(SSEDecoder());\n\n return IterableReadableStream.fromReadableStream(stream);\n }\n}\n"],"mappings":";;;AAoCA,IAAa,uBAAb,MAIA;CACE,YAAY,SAAuD;AAAtC,OAAA,UAAA;;CAE7B,MAAM,OAAO,SAK8D;EACzE,MAAM,EAAE,QAAQ,GAAG,SAAS;EAE5B,IAAI,cAA2B;GAC7B,QAAQ;GACR,SAAS;IACP,gBAAgB;IAChB,GAAG,KAAK,QAAQ;IACjB;GACD,MAAM,KAAK,UAAU,KAAK;GAC1B;GACD;AAED,MAAI,KAAK,QAAQ,UACf,eAAc,MAAM,KAAK,QAAQ,UAC/B,KAAK,QAAQ,QACb,YACD;EAIH,MAAM,WAAW,OAFD,KAAK,QAAQ,SAAS,OAEP,KAAK,QAAQ,QAAQ,YAAY;AAChE,MAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,qBAAqB,SAAS,aAAa;AAG7D,MAAI,CAAC,SAAS,KACZ,OAAM,IAAI,MAAM,8CAA8C;EAGhE,MAAM,SAAS,SAAS,KACrB,YAAY,kBAAkB,CAAC,CAC/B,YAAY,YAAY,CAAC;AAE5B,SAAO,uBAAuB,mBAAmB,OAAO"}
|
package/dist/ui/types.d.cts
CHANGED
|
@@ -5,6 +5,7 @@ import { Command, DisconnectMode, Durability, MultitaskStrategy, OnCompletionBeh
|
|
|
5
5
|
import { Client, ClientConfig } from "../client.cjs";
|
|
6
6
|
import { BagTemplate } from "../types.template.cjs";
|
|
7
7
|
import { InferInteropZodInput } from "@langchain/core/utils/types";
|
|
8
|
+
import { BaseMessage } from "@langchain/core/messages";
|
|
8
9
|
|
|
9
10
|
//#region src/ui/types.d.ts
|
|
10
11
|
/**
|
|
@@ -161,6 +162,33 @@ interface StreamBase<StateType = Record<string, unknown>, ToolCall = DefaultTool
|
|
|
161
162
|
* ```
|
|
162
163
|
*/
|
|
163
164
|
getSubagentsByMessage: (messageId: string) => SubagentStreamInterface<SubagentStates[keyof SubagentStates], ToolCall, keyof SubagentStates & string>[];
|
|
165
|
+
/**
|
|
166
|
+
* Switch to a different thread, clearing the current stream state.
|
|
167
|
+
* Pass `null` to reset to no thread (a new thread will be created on next submit).
|
|
168
|
+
*
|
|
169
|
+
* @param newThreadId - The thread ID to switch to, or `null` to start fresh.
|
|
170
|
+
*/
|
|
171
|
+
switchThread: (newThreadId: string | null) => void;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Subagent API surface parameterised by the subagent interface type.
|
|
175
|
+
*
|
|
176
|
+
* Framework adapters supply a class-message variant of
|
|
177
|
+
* `SubagentStreamInterface` (where `messages` is `BaseMessage[]`
|
|
178
|
+
* from `@langchain/core`) so that consumers always work with class
|
|
179
|
+
* instances. The default parameter keeps the SDK's plain `Message`
|
|
180
|
+
* interface for direct SDK usage.
|
|
181
|
+
*
|
|
182
|
+
* @template Iface - The subagent stream interface to expose.
|
|
183
|
+
* Defaults to {@link SubagentStreamInterface} with default generic
|
|
184
|
+
* parameters.
|
|
185
|
+
*/
|
|
186
|
+
interface SubagentApi<Iface = SubagentStreamInterface> {
|
|
187
|
+
subagents: Map<string, Iface>;
|
|
188
|
+
activeSubagents: Iface[];
|
|
189
|
+
getSubagent: (toolCallId: string) => Iface | undefined;
|
|
190
|
+
getSubagentsByType: (type: string) => Iface[];
|
|
191
|
+
getSubagentsByMessage: (messageId: string) => Iface[];
|
|
164
192
|
}
|
|
165
193
|
/**
|
|
166
194
|
* Base interface for a single subagent stream.
|
|
@@ -278,9 +306,10 @@ interface AgentMiddlewareLike<TSchema = unknown, TContextSchema = unknown, TFull
|
|
|
278
306
|
* Uses structural matching against AgentMiddleware to extract the state schema
|
|
279
307
|
* type parameter, similar to how langchain's InferMiddlewareState works.
|
|
280
308
|
*/
|
|
281
|
-
type
|
|
309
|
+
type SafeInferInteropZodInput<T> = InferInteropZodInput<T> extends never ? {} : InferInteropZodInput<T>;
|
|
310
|
+
type InferMiddlewareState<T> = T extends AgentMiddlewareLike<infer TSchema, unknown, unknown, unknown> ? TSchema extends Record<string, any> ? SafeInferInteropZodInput<TSchema> : {} : T extends {
|
|
282
311
|
stateSchema: infer S;
|
|
283
|
-
} ?
|
|
312
|
+
} ? SafeInferInteropZodInput<S> : {};
|
|
284
313
|
/**
|
|
285
314
|
* Helper type to detect if a type is `any`.
|
|
286
315
|
* Uses the fact that `any` is both a subtype and supertype of all types.
|
|
@@ -325,23 +354,52 @@ type InferMiddlewareStatesFromArray<T> = IsAny<T> extends true ? {} : T extends
|
|
|
325
354
|
type BaseAgentState<ToolCall = DefaultToolCall> = {
|
|
326
355
|
messages: Message<ToolCall>[];
|
|
327
356
|
};
|
|
357
|
+
/**
|
|
358
|
+
* Conditionally adds `structuredResponse` to the agent state when
|
|
359
|
+
* `responseFormat` is provided to `createAgent`.
|
|
360
|
+
*
|
|
361
|
+
* The sentinel type `ResponseFormatUndefined` (from langchain) has a
|
|
362
|
+
* `__responseFormatUndefined` brand property. When the Response type
|
|
363
|
+
* carries that brand, no `structuredResponse` key is added.
|
|
364
|
+
*/
|
|
365
|
+
type InferStructuredResponse<Response> = Response extends {
|
|
366
|
+
__responseFormatUndefined: true;
|
|
367
|
+
} ? {} : Response extends Record<string, any> ? {
|
|
368
|
+
structuredResponse: Response;
|
|
369
|
+
} : {};
|
|
328
370
|
type InferAgentState<T> = T extends {
|
|
329
371
|
"~agentTypes": unknown;
|
|
330
|
-
} ? ExtractAgentConfig<T> extends never ? {} : BaseAgentState<InferAgentToolCalls<T>> & (ExtractAgentConfig<T>["State"] extends undefined ? {} :
|
|
372
|
+
} ? ExtractAgentConfig<T> extends never ? {} : BaseAgentState<InferAgentToolCalls<T>> & (ExtractAgentConfig<T>["State"] extends undefined ? {} : SafeInferInteropZodInput<ExtractAgentConfig<T>["State"]>) & InferMiddlewareStatesFromArray<ExtractAgentConfig<T>["Middleware"]> & InferStructuredResponse<ExtractAgentConfig<T>["Response"]> : T extends {
|
|
331
373
|
"~RunOutput": infer RunOutput;
|
|
332
374
|
} ? RunOutput : T extends {
|
|
333
375
|
messages: unknown;
|
|
334
376
|
} ? T : {};
|
|
335
377
|
/**
|
|
336
|
-
* Helper type to
|
|
337
|
-
*
|
|
338
|
-
*
|
|
378
|
+
* Helper type to infer schema input type, supporting both Zod v3 and v4.
|
|
379
|
+
* Self-contained to avoid cross-package type resolution issues with
|
|
380
|
+
* InferInteropZodInput from @langchain/core.
|
|
381
|
+
* - Zod v4 uses `_zod.input` property
|
|
382
|
+
* - Zod v3 uses `_input` property
|
|
383
|
+
*/
|
|
384
|
+
type InferToolSchemaInput<S> = S extends {
|
|
385
|
+
_zod: {
|
|
386
|
+
input: infer Args;
|
|
387
|
+
};
|
|
388
|
+
} ? Args : S extends {
|
|
389
|
+
_input: infer Args;
|
|
390
|
+
} ? Args : never;
|
|
391
|
+
/**
|
|
392
|
+
* Helper type to extract the input type from a DynamicStructuredTool.
|
|
393
|
+
*
|
|
394
|
+
* Tries the following in order:
|
|
395
|
+
* 1. `_call` method signature (may fail when `_call` is `protected`)
|
|
396
|
+
* 2. `schema` property with self-contained Zod v3/v4 inference
|
|
339
397
|
*/
|
|
340
398
|
type InferToolInput<T> = T extends {
|
|
341
399
|
_call: (arg: infer Args, ...rest: any[]) => any;
|
|
342
400
|
} ? Args : T extends {
|
|
343
401
|
schema: infer S;
|
|
344
|
-
} ?
|
|
402
|
+
} ? InferToolSchemaInput<S> : never;
|
|
345
403
|
/**
|
|
346
404
|
* Helper type to check if a type is a literal string (not generic `string`).
|
|
347
405
|
* Returns true only for literal types like "get_weather", false for `string`.
|
|
@@ -596,6 +654,17 @@ type MessageMetadata<StateType extends Record<string, unknown>> = {
|
|
|
596
654
|
type GetUpdateType<Bag extends BagTemplate, StateType extends Record<string, unknown>> = Bag extends {
|
|
597
655
|
UpdateType: unknown;
|
|
598
656
|
} ? Bag["UpdateType"] : Partial<StateType>;
|
|
657
|
+
/**
|
|
658
|
+
* Widens an update type so that its `messages` field also accepts
|
|
659
|
+
* `@langchain/core` {@link BaseMessage} class instances (single or array).
|
|
660
|
+
*
|
|
661
|
+
* Framework SDKs apply this to `submit` so callers can write:
|
|
662
|
+
* ```ts
|
|
663
|
+
* stream.submit({ messages: new HumanMessage("hello") });
|
|
664
|
+
* stream.submit({ messages: [new HumanMessage("hello")] });
|
|
665
|
+
* ```
|
|
666
|
+
*/
|
|
667
|
+
type AcceptBaseMessages<T> = T extends Record<string, unknown> ? { [K in keyof T]: K extends "messages" ? T[K] | BaseMessage | BaseMessage[] : T[K] } : T;
|
|
599
668
|
type GetConfigurableType<Bag extends BagTemplate> = Bag extends {
|
|
600
669
|
ConfigurableType: Record<string, unknown>;
|
|
601
670
|
} ? Bag["ConfigurableType"] : Record<string, unknown>;
|
|
@@ -794,6 +863,20 @@ interface UseStreamOptions<StateType extends Record<string, unknown> = Record<st
|
|
|
794
863
|
*/
|
|
795
864
|
throttle?: number | boolean;
|
|
796
865
|
}
|
|
866
|
+
/**
|
|
867
|
+
* Union of all stream options types.
|
|
868
|
+
*
|
|
869
|
+
* Used internally by the implementation to accept any options type.
|
|
870
|
+
* This allows the implementation functions to handle options from
|
|
871
|
+
* any agent type while maintaining type safety at the public API level.
|
|
872
|
+
*
|
|
873
|
+
* @internal
|
|
874
|
+
*/
|
|
875
|
+
type AnyStreamOptions<StateType extends Record<string, unknown> = Record<string, unknown>, Bag extends BagTemplate = BagTemplate> = UseStreamOptions<StateType, Bag> & {
|
|
876
|
+
subagentToolNames?: string[];
|
|
877
|
+
filterSubagentMessages?: boolean;
|
|
878
|
+
toMessage?: (chunk: BaseMessage) => Message | BaseMessage;
|
|
879
|
+
};
|
|
797
880
|
interface RunMetadataStorage {
|
|
798
881
|
getItem(key: `lg:stream:${string}`): string | null;
|
|
799
882
|
setItem(key: `lg:stream:${string}`, value: string): void;
|
|
@@ -844,19 +927,31 @@ interface SubmitOptions<StateType extends Record<string, unknown> = Record<strin
|
|
|
844
927
|
* before the thread is actually created.
|
|
845
928
|
*/
|
|
846
929
|
threadId?: string;
|
|
930
|
+
/**
|
|
931
|
+
* Callback that is called when an error occurs during this specific submit call.
|
|
932
|
+
* Unlike the hook-level `onError`, this allows handling errors on a per-submit basis,
|
|
933
|
+
* e.g. to show a retry button or a specific error message to the user.
|
|
934
|
+
*/
|
|
935
|
+
onError?: (error: unknown, run: RunCallbackMeta | undefined) => void;
|
|
936
|
+
}
|
|
937
|
+
/**
|
|
938
|
+
* Payload for the `stream` method of the `UseStreamTransport` interface.
|
|
939
|
+
* @template StateType - The type of the stream's state values.
|
|
940
|
+
* @template Bag - The type of the stream's bag values.
|
|
941
|
+
*/
|
|
942
|
+
interface UseStreamTransportPayload<StateType extends Record<string, unknown> = Record<string, unknown>, Bag extends BagTemplate = BagTemplate> {
|
|
943
|
+
input: GetUpdateType<Bag, StateType> | null | undefined;
|
|
944
|
+
context: GetConfigurableType<Bag> | undefined;
|
|
945
|
+
command: Command | undefined;
|
|
946
|
+
config: ConfigWithConfigurable<GetConfigurableType<Bag>> | undefined;
|
|
947
|
+
signal: AbortSignal;
|
|
847
948
|
}
|
|
848
949
|
/**
|
|
849
950
|
* Transport used to stream the thread.
|
|
850
951
|
* Only applicable for custom endpoints using `toLangGraphEventStream` or `toLangGraphEventStreamResponse`.
|
|
851
952
|
*/
|
|
852
953
|
interface UseStreamTransport<StateType extends Record<string, unknown> = Record<string, unknown>, Bag extends BagTemplate = BagTemplate> {
|
|
853
|
-
stream: (payload: {
|
|
854
|
-
input: GetUpdateType<Bag, StateType> | null | undefined;
|
|
855
|
-
context: GetConfigurableType<Bag> | undefined;
|
|
856
|
-
command: Command | undefined;
|
|
857
|
-
config: ConfigWithConfigurable<GetConfigurableType<Bag>> | undefined;
|
|
858
|
-
signal: AbortSignal;
|
|
859
|
-
}) => Promise<AsyncGenerator<{
|
|
954
|
+
stream: (payload: UseStreamTransportPayload<StateType, Bag>) => Promise<AsyncGenerator<{
|
|
860
955
|
id?: string;
|
|
861
956
|
event: string;
|
|
862
957
|
data: unknown;
|
|
@@ -865,7 +960,21 @@ interface UseStreamTransport<StateType extends Record<string, unknown> = Record<
|
|
|
865
960
|
type UseStreamCustomOptions<StateType extends Record<string, unknown> = Record<string, unknown>, Bag extends BagTemplate = BagTemplate> = Pick<UseStreamOptions<StateType, Bag>, "messagesKey" | "threadId" | "onThreadId" | "onError" | "onCreated" | "onUpdateEvent" | "onCustomEvent" | "onMetadataEvent" | "onLangChainEvent" | "onDebugEvent" | "onCheckpointEvent" | "onTaskEvent" | "onStop" | "initialValues" | "throttle" | "onToolEvent"> & {
|
|
866
961
|
transport: UseStreamTransport<StateType, Bag>;
|
|
867
962
|
};
|
|
868
|
-
|
|
963
|
+
/**
|
|
964
|
+
* Union of all custom stream options types.
|
|
965
|
+
*
|
|
966
|
+
* Used internally by the implementation to accept any custom options type.
|
|
967
|
+
* This allows the implementation functions to handle options from
|
|
968
|
+
* any agent type while maintaining type safety at the public API level.
|
|
969
|
+
*
|
|
970
|
+
* @internal
|
|
971
|
+
*/
|
|
972
|
+
type AnyStreamCustomOptions<StateType extends Record<string, unknown> = Record<string, unknown>, Bag extends BagTemplate = BagTemplate> = UseStreamCustomOptions<StateType, Bag> & {
|
|
973
|
+
subagentToolNames?: string[];
|
|
974
|
+
filterSubagentMessages?: boolean;
|
|
975
|
+
toMessage?: (chunk: BaseMessage) => Message | BaseMessage;
|
|
976
|
+
};
|
|
977
|
+
type CustomSubmitOptions<StateType extends Record<string, unknown> = Record<string, unknown>, ConfigurableType extends Record<string, unknown> = Record<string, unknown>> = Pick<SubmitOptions<StateType, ConfigurableType>, "optimisticValues" | "context" | "command" | "config" | "onError" | "threadId">;
|
|
869
978
|
//#endregion
|
|
870
|
-
export { AgentTypeConfigLike, BaseSubagentState, CompiledSubAgentLike, CustomSubmitOptions, DeepAgentTypeConfigLike, DefaultSubagentStates, ExtractAgentConfig, ExtractDeepAgentConfig, ExtractSubAgentMiddleware, GetConfigurableType, GetInterruptType, GetToolCallsType, GetUpdateType, InferAgentState, InferAgentToolCalls, InferDeepAgentSubagents, InferSubagentByName, InferSubagentNames, InferSubagentState, IsAgentLike, IsDeepAgentLike, MessageMetadata, RunCallbackMeta, StreamBase, SubAgentLike, SubagentStateMap, SubagentStatus, SubagentStream, SubagentStreamInterface, SubagentToolCall, SubmitOptions, UseStreamCustomOptions, UseStreamOptions, UseStreamThread, UseStreamTransport };
|
|
979
|
+
export { AcceptBaseMessages, AgentMiddlewareLike, AgentTypeConfigLike, AnyStreamCustomOptions, AnyStreamOptions, BaseSubagentState, CompiledSubAgentLike, CustomSubmitOptions, DeepAgentTypeConfigLike, DefaultSubagentStates, ExtractAgentConfig, ExtractDeepAgentConfig, ExtractSubAgentMiddleware, ExtractToolCallsFromState, GetConfigurableType, GetCustomEventType, GetInterruptType, GetToolCallsType, GetUpdateType, InferAgentState, InferAgentToolCalls, InferDeepAgentSubagents, InferMiddlewareStatesFromArray, InferSubagentByName, InferSubagentNames, InferSubagentState, IsAgentLike, IsDeepAgentLike, MessageMetadata, RunCallbackMeta, StreamBase, SubAgentLike, SubagentApi, SubagentStateMap, SubagentStatus, SubagentStream, SubagentStreamInterface, SubagentToolCall, SubmitOptions, UseStreamCustomOptions, UseStreamOptions, UseStreamThread, UseStreamTransport, UseStreamTransportPayload };
|
|
871
980
|
//# sourceMappingURL=types.d.cts.map
|