@librechat/agents 3.2.61 → 3.2.63
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/cjs/common/enum.cjs +2 -0
- package/dist/cjs/common/enum.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +6 -2
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/hooks/HookRegistry.cjs +32 -0
- package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
- package/dist/cjs/hooks/executeHooks.cjs +6 -0
- package/dist/cjs/hooks/executeHooks.cjs.map +1 -1
- package/dist/cjs/hooks/index.cjs +12 -0
- package/dist/cjs/hooks/index.cjs.map +1 -0
- package/dist/cjs/hooks/types.cjs.map +1 -1
- package/dist/cjs/langfuse.cjs +62 -1
- package/dist/cjs/langfuse.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/index.cjs +266 -43
- package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
- package/dist/cjs/llm/openai/index.cjs +274 -7
- package/dist/cjs/llm/openai/index.cjs.map +1 -1
- package/dist/cjs/llm/openai/streamMetadata.cjs +69 -0
- package/dist/cjs/llm/openai/streamMetadata.cjs.map +1 -0
- package/dist/cjs/llm/openrouter/index.cjs +5 -6
- package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +6 -1
- package/dist/cjs/messages/format.cjs +61 -0
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/messages/prune.cjs +31 -19
- package/dist/cjs/messages/prune.cjs.map +1 -1
- package/dist/cjs/stream.cjs +13 -3
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +76 -11
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs +2 -0
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
- package/dist/cjs/utils/tokens.cjs +111 -0
- package/dist/cjs/utils/tokens.cjs.map +1 -1
- package/dist/esm/common/enum.mjs +2 -0
- package/dist/esm/common/enum.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +6 -2
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/hooks/HookRegistry.mjs +32 -0
- package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
- package/dist/esm/hooks/executeHooks.mjs +6 -0
- package/dist/esm/hooks/executeHooks.mjs.map +1 -1
- package/dist/esm/hooks/index.mjs +12 -1
- package/dist/esm/hooks/index.mjs.map +1 -0
- package/dist/esm/hooks/types.mjs.map +1 -1
- package/dist/esm/langfuse.mjs +62 -1
- package/dist/esm/langfuse.mjs.map +1 -1
- package/dist/esm/llm/bedrock/index.mjs +266 -43
- package/dist/esm/llm/bedrock/index.mjs.map +1 -1
- package/dist/esm/llm/openai/index.mjs +274 -7
- package/dist/esm/llm/openai/index.mjs.map +1 -1
- package/dist/esm/llm/openai/streamMetadata.mjs +69 -0
- package/dist/esm/llm/openai/streamMetadata.mjs.map +1 -0
- package/dist/esm/llm/openrouter/index.mjs +5 -6
- package/dist/esm/llm/openrouter/index.mjs.map +1 -1
- package/dist/esm/main.mjs +3 -3
- package/dist/esm/messages/format.mjs +61 -0
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/messages/prune.mjs +31 -19
- package/dist/esm/messages/prune.mjs.map +1 -1
- package/dist/esm/stream.mjs +13 -3
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +76 -11
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/subagent/SubagentExecutor.mjs +2 -0
- package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
- package/dist/esm/utils/tokens.mjs +108 -1
- package/dist/esm/utils/tokens.mjs.map +1 -1
- package/dist/types/common/enum.d.ts +3 -1
- package/dist/types/graphs/Graph.d.ts +3 -1
- package/dist/types/hooks/HookRegistry.d.ts +10 -0
- package/dist/types/hooks/index.d.ts +7 -0
- package/dist/types/hooks/types.d.ts +18 -1
- package/dist/types/llm/bedrock/index.d.ts +5 -0
- package/dist/types/llm/openai/index.d.ts +19 -0
- package/dist/types/llm/openai/streamMetadata.d.ts +16 -0
- package/dist/types/messages/prune.d.ts +4 -3
- package/dist/types/tools/ToolNode.d.ts +1 -0
- package/dist/types/types/graph.d.ts +10 -0
- package/dist/types/types/llm.d.ts +12 -2
- package/dist/types/types/tools.d.ts +1 -1
- package/dist/types/utils/tokens.d.ts +30 -0
- package/package.json +6 -6
- package/src/__tests__/stream.eagerEventExecution.test.ts +100 -2
- package/src/common/enum.ts +2 -0
- package/src/graphs/Graph.ts +12 -4
- package/src/hooks/HookRegistry.ts +45 -0
- package/src/hooks/__tests__/HookRegistry.test.ts +48 -0
- package/src/hooks/__tests__/executeHooks.test.ts +85 -2
- package/src/hooks/executeHooks.ts +15 -0
- package/src/hooks/index.ts +7 -0
- package/src/hooks/types.ts +18 -1
- package/src/langfuse.ts +134 -1
- package/src/llm/bedrock/index.ts +434 -83
- package/src/llm/bedrock/streamSealDispatch.test.ts +97 -0
- package/src/llm/custom-chat-models.smoke.test.ts +7 -0
- package/src/llm/openai/index.ts +604 -6
- package/src/llm/openai/managedRequests.test.ts +182 -0
- package/src/llm/openai/streamMetadata.spec.ts +86 -0
- package/src/llm/openai/streamMetadata.ts +95 -0
- package/src/llm/openai/streamMetadataDedup.spec.ts +166 -0
- package/src/llm/openrouter/index.ts +9 -5
- package/src/messages/format.ts +96 -3
- package/src/messages/formatAgentMessages.steer.test.ts +326 -0
- package/src/messages/labelContentByAgent.test.ts +75 -0
- package/src/messages/prune.ts +56 -30
- package/src/specs/anthropic.simple.test.ts +4 -2
- package/src/specs/cache.simple.test.ts +17 -4
- package/src/specs/langfuse-callbacks.test.ts +61 -0
- package/src/specs/openai.simple.test.ts +4 -2
- package/src/specs/spec.utils.ts +12 -0
- package/src/specs/summarization.test.ts +9 -13
- package/src/specs/token-accounting-pipeline.test.ts +130 -4
- package/src/specs/tokens.test.ts +214 -0
- package/src/stream.ts +22 -3
- package/src/tools/ToolNode.ts +112 -13
- package/src/tools/__tests__/ToolNode.eagerEventExecution.test.ts +554 -0
- package/src/tools/__tests__/ToolNode.onResultCompletion.test.ts +49 -2
- package/src/tools/__tests__/hitl.test.ts +112 -0
- package/src/tools/__tests__/subagentHooks.test.ts +124 -0
- package/src/tools/subagent/SubagentExecutor.ts +3 -0
- package/src/types/graph.ts +10 -0
- package/src/types/llm.ts +12 -2
- package/src/types/tools.ts +1 -1
- package/src/utils/tokens.ts +181 -3
package/dist/esm/stream.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.mjs","names":["completeData"],"sources":["../../src/stream.ts"],"sourcesContent":["// src/stream.ts\nimport type { ToolCall, ToolCallChunk } from '@langchain/core/messages/tool';\nimport type { ChatOpenAIReasoningSummary } from '@langchain/openai';\nimport type { AIMessageChunk } from '@langchain/core/messages';\nimport type { AgentContext } from '@/agents/AgentContext';\nimport type { StandardGraph } from '@/graphs';\nimport type * as t from '@/types';\nimport {\n getStreamedToolCallSeal,\n getStreamedToolCallAdapter,\n streamedToolCallAdapterAllowsSequentialSeal,\n type StreamedToolCallSeal,\n} from '@/tools/streamedToolCallSeals';\nimport {\n ToolCallTypes,\n ContentTypes,\n GraphEvents,\n StepTypes,\n Providers,\n Constants,\n CODE_EXECUTION_TOOLS,\n LOCAL_CODING_BUNDLE_NAMES,\n} from '@/common';\nimport {\n buildToolExecutionRequestPlan,\n coerceRecordArgs,\n normalizeError,\n} from '@/tools/eagerEventExecution';\nimport {\n handleServerToolResult,\n handleToolCallChunks,\n handleToolCalls,\n} from '@/tools/handlers';\nimport {\n calculateMaxToolResultChars,\n truncateToolResultContent,\n} from '@/utils/truncation';\nimport { TOOL_OUTPUT_REF_PATTERN } from '@/tools/toolOutputReferences';\nimport { safeDispatchCustomEvent } from '@/utils/events';\nimport { isGoogleLike } from '@/utils/llm';\nimport { getMessageId } from '@/messages';\n\nconst LOCAL_CODING_BUNDLE_NAME_SET: ReadonlySet<string> = new Set(\n LOCAL_CODING_BUNDLE_NAMES\n);\n\ntype ReasoningSummaryLike = {\n summary?: Array<{ text?: string }>;\n};\n\n/**\n * Parses content to extract thinking sections enclosed in <think> tags using string operations\n * @param content The content to parse\n * @returns An object with separated text and thinking content\n */\nfunction parseThinkingContent(content: string): {\n text: string;\n thinking: string;\n} {\n // If no think tags, return the original content as text\n if (!content.includes('<think>')) {\n return { text: content, thinking: '' };\n }\n\n let textResult = '';\n const thinkingResult: string[] = [];\n let position = 0;\n\n while (position < content.length) {\n const thinkStart = content.indexOf('<think>', position);\n\n if (thinkStart === -1) {\n // No more think tags, add the rest and break\n textResult += content.slice(position);\n break;\n }\n\n // Add text before the think tag\n textResult += content.slice(position, thinkStart);\n\n const thinkEnd = content.indexOf('</think>', thinkStart);\n if (thinkEnd === -1) {\n // Malformed input, no closing tag\n textResult += content.slice(thinkStart);\n break;\n }\n\n // Add the thinking content\n const thinkContent = content.slice(thinkStart + 7, thinkEnd);\n thinkingResult.push(thinkContent);\n\n // Move position to after the think tag\n position = thinkEnd + 8; // 8 is the length of '</think>'\n }\n\n return {\n text: textResult.trim(),\n thinking: thinkingResult.join('\\n').trim(),\n };\n}\n\nfunction getNonEmptyValue(possibleValues: string[]): string | undefined {\n for (const value of possibleValues) {\n if (value && value.trim() !== '') {\n return value;\n }\n }\n return undefined;\n}\n\nfunction isBatchSensitiveToolExecution(graph: StandardGraph): boolean {\n return graph.hookRegistry != null || graph.humanInTheLoop?.enabled === true;\n}\n\nfunction hasToolOutputReference(value: unknown): boolean {\n if (typeof value === 'string') {\n return TOOL_OUTPUT_REF_PATTERN.test(value);\n }\n if (Array.isArray(value)) {\n return value.some((item) => hasToolOutputReference(item));\n }\n if (value !== null && typeof value === 'object') {\n return Object.values(value as Record<string, unknown>).some((item) =>\n hasToolOutputReference(item)\n );\n }\n return false;\n}\n\nfunction isEagerExecutionExcludedTool(\n name: string,\n graph: StandardGraph\n): boolean {\n if (name === '') {\n return false;\n }\n const excluded = graph.eagerEventToolExecution?.excludeToolNames;\n if (excluded != null && excluded.includes(name)) {\n return true;\n }\n // A code-session participant writes to the shared sandbox, so it is\n // side-effecting: never prestart it speculatively (a revised/superseded turn\n // would leave the write applied). Implies exclusion without the host having\n // to also list the name in excludeToolNames.\n if (graph.codeSessionToolNames?.includes(name) === true) {\n return true;\n }\n // With stateful sessions on, execute_code/bash run against a DURABLE warm\n // runtime. Speculative prestart there is unsafe: if the model revises the\n // args, ToolNode discards the eager result but the mutation has already\n // landed in the session workspace, corrupting later runs. Stateless mode\n // uses a throwaway VM per call, so eager prestart stays safe there.\n return (\n graph.toolExecution?.sandbox?.statefulSessions === true &&\n CODE_EXECUTION_TOOLS.has(name)\n );\n}\n\nfunction isDirectGraphTool(\n name: string,\n agentContext: AgentContext | undefined\n): boolean {\n if (name.startsWith(Constants.LC_TRANSFER_TO_)) {\n return true;\n }\n return (\n (agentContext?.graphTools as t.GenericTool[] | undefined)?.some(\n (tool) => 'name' in tool && tool.name === name\n ) === true\n );\n}\n\nfunction isDirectLocalTool(name: string, graph: StandardGraph): boolean {\n const toolExecution = graph.toolExecution;\n const engine = toolExecution?.engine;\n if (\n toolExecution == null ||\n (engine !== 'local' && engine !== 'cloudflare-sandbox')\n ) {\n return false;\n }\n const includeCodingTools =\n engine === 'cloudflare-sandbox'\n ? toolExecution.cloudflare?.includeCodingTools\n : toolExecution.local?.includeCodingTools;\n if (includeCodingTools === false) {\n return CODE_EXECUTION_TOOLS.has(name);\n }\n return LOCAL_CODING_BUNDLE_NAME_SET.has(name);\n}\n\nfunction toCodeEnvFile(file: t.FileRef, execSessionId: string): t.CodeEnvFile {\n const base = {\n id: file.id,\n resource_id: file.resource_id ?? file.id,\n name: file.name,\n storage_session_id: file.storage_session_id ?? execSessionId,\n };\n const kind = file.kind ?? 'user';\n if (kind === 'skill' && file.version != null) {\n return { ...base, kind: 'skill', version: file.version };\n }\n if (kind === 'agent') {\n return { ...base, kind: 'agent' };\n }\n return { ...base, kind: 'user' };\n}\n\nfunction getCodeSessionContext(\n graph: StandardGraph,\n name: string\n): t.ToolCallRequest['codeSessionContext'] | undefined {\n if (\n !CODE_EXECUTION_TOOLS.has(name) &&\n name !== Constants.SKILL_TOOL &&\n name !== Constants.READ_FILE &&\n graph.codeSessionToolNames?.includes(name) !== true\n ) {\n return undefined;\n }\n\n const codeSession = graph.sessions.get(Constants.EXECUTE_CODE) as\n | t.CodeSessionContext\n | undefined;\n if (codeSession?.session_id == null || codeSession.session_id === '') {\n return undefined;\n }\n\n return {\n session_id: codeSession.session_id,\n files: codeSession.files?.map((file) =>\n toCodeEnvFile(file, codeSession.session_id)\n ),\n };\n}\n\nfunction isEagerToolExecutionEnabledForBatch(args: {\n graph: StandardGraph;\n metadata?: Record<string, unknown>;\n agentContext?: AgentContext;\n}): boolean {\n const { graph, metadata, agentContext } = args;\n if (graph.eagerEventToolExecution?.enabled !== true) {\n return false;\n }\n if ((agentContext?.toolDefinitions?.length ?? 0) === 0) {\n return false;\n }\n if (isBatchSensitiveToolExecution(graph)) {\n return false;\n }\n if (\n metadata?.[Constants.PROGRAMMATIC_TOOL_CALLING] === true ||\n metadata?.[Constants.BASH_PROGRAMMATIC_TOOL_CALLING] === true\n ) {\n return false;\n }\n if (\n graph.handlerRegistry?.getHandler(GraphEvents.ON_TOOL_EXECUTE) == null &&\n graph.eventToolExecutionAvailable !== true\n ) {\n return false;\n }\n return true;\n}\n\nfunction hasFinalToolCallSignal(chunk: Partial<AIMessageChunk>): boolean {\n const metadata = chunk.response_metadata as\n | Record<string, unknown>\n | undefined;\n const finishReason =\n metadata?.finish_reason ??\n metadata?.finishReason ??\n metadata?.stop_reason ??\n metadata?.stopReason;\n return finishReason === 'tool_calls' || finishReason === 'tool_use';\n}\n\nfunction canPrestartSequentialStreamedToolChunks(\n agentContext: AgentContext | undefined\n): boolean {\n // Anthropic seals each prior streamed tool-use block when the next indexed\n // tool-use block begins. Live Kimi/Moonshot streams can still revise prior\n // args after advancing to the next index, so keep those on the final\n // tool-call path unless they grow an explicit adapter seal.\n return agentContext?.provider === Providers.ANTHROPIC;\n}\n\nfunction hasExplicitStreamedToolCallSeals(\n chunk: Partial<AIMessageChunk>\n): boolean {\n return (\n getStreamedToolCallAdapter(\n chunk.response_metadata as Record<string, unknown> | undefined\n ) != null\n );\n}\n\n/**\n * True when a provider adapter marked every tool call on this chunk as\n * complete on arrival (seal kind `all`), e.g. Google GenAI / Vertex AI, whose\n * protocol delivers function calls as whole objects rather than arg deltas.\n */\nfunction hasOnArrivalToolCallSeal(chunk: Partial<AIMessageChunk>): boolean {\n const metadata = chunk.response_metadata as\n | Record<string, unknown>\n | undefined;\n return (\n getStreamedToolCallAdapter(metadata) != null &&\n getStreamedToolCallSeal(metadata)?.kind === 'all'\n );\n}\n\nfunction hasDirectToolCallInBatch(args: {\n graph: StandardGraph;\n agentContext?: AgentContext;\n toolCalls: ToolCall[];\n}): boolean {\n const { graph, agentContext, toolCalls } = args;\n return toolCalls.some(\n (toolCall) =>\n toolCall.name !== '' &&\n (isDirectGraphTool(toolCall.name, agentContext) ||\n isDirectLocalTool(toolCall.name, graph))\n );\n}\n\nfunction hasPotentialDirectToolInStreamContext(args: {\n graph: StandardGraph;\n agentContext?: AgentContext;\n}): boolean {\n const { graph, agentContext } = args;\n const engine = graph.toolExecution?.engine;\n if (engine === 'local' || engine === 'cloudflare-sandbox') {\n return true;\n }\n if ((agentContext?.graphTools?.length ?? 0) > 0) {\n return true;\n }\n return false;\n}\n\nfunction hasDirectToolCallChunkInBatch(args: {\n graph: StandardGraph;\n agentContext?: AgentContext;\n toolCallChunks?: ToolCallChunk[];\n}): boolean {\n const { graph, agentContext, toolCallChunks } = args;\n return (\n toolCallChunks?.some(\n (toolCallChunk) =>\n toolCallChunk.name != null &&\n toolCallChunk.name !== '' &&\n (isDirectGraphTool(toolCallChunk.name, agentContext) ||\n isDirectLocalTool(toolCallChunk.name, graph))\n ) === true\n );\n}\n\nfunction hasDirectToolCallChunkStateInStep(args: {\n graph: StandardGraph;\n agentContext?: AgentContext;\n stepKey: string;\n}): boolean {\n const { graph, agentContext, stepKey } = args;\n const prefix = `${stepKey}\\u0000`;\n for (const [key, state] of graph.eagerEventToolCallChunks) {\n if (!key.startsWith(prefix)) {\n continue;\n }\n const name = state.name;\n if (\n name != null &&\n name !== '' &&\n (isDirectGraphTool(name, agentContext) || isDirectLocalTool(name, graph))\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction isGoogleServerSideToolContentPart(\n contentPart: t.MessageContentComplex\n): boolean {\n return contentPart.type === 'toolCall' || contentPart.type === 'toolResponse';\n}\n\nfunction isTextContentPart(contentPart: t.MessageContentComplex): boolean {\n return contentPart.type?.startsWith(ContentTypes.TEXT) ?? false;\n}\n\nfunction isReasoningContentPart(contentPart: t.MessageContentComplex): boolean {\n return (\n (contentPart.type?.startsWith(ContentTypes.THINKING) ?? false) ||\n (contentPart.type?.startsWith(ContentTypes.REASONING) ?? false) ||\n (contentPart.type?.startsWith(ContentTypes.REASONING_CONTENT) ?? false) ||\n contentPart.type === 'redacted_thinking'\n );\n}\n\nfunction getReasoningTextFromContentPart(\n contentPart: t.MessageContentComplex\n): string {\n return (\n (contentPart as t.ThinkingContentText).thinking ??\n (contentPart as Partial<t.GoogleReasoningContentText>).reasoning ??\n (contentPart as Partial<t.BedrockReasoningContentText>).reasoningText\n ?.text ??\n ''\n );\n}\n\nfunction getReasoningTextFromChunk(\n chunk: Partial<AIMessageChunk>,\n agentContext: AgentContext\n): string {\n const reasoning = chunk.additional_kwargs?.[agentContext.reasoningKey] as\n | string\n | Partial<ChatOpenAIReasoningSummary>\n | undefined;\n if (typeof reasoning === 'string') {\n return reasoning;\n }\n return reasoning?.summary?.[0]?.text ?? '';\n}\n\nconst googleServerSideToolStepIdsByGraph = new WeakMap<\n StandardGraph,\n Set<string>\n>();\n\nfunction markGoogleServerSideToolMessageStep(\n graph: StandardGraph,\n stepId: string\n): void {\n const stepIds = googleServerSideToolStepIdsByGraph.get(graph) ?? new Set();\n stepIds.add(stepId);\n googleServerSideToolStepIdsByGraph.set(graph, stepIds);\n}\n\nfunction isGoogleServerSideToolMessageStep(\n graph: StandardGraph,\n stepId: string\n): boolean {\n return googleServerSideToolStepIdsByGraph.get(graph)?.has(stepId) === true;\n}\n\nfunction shouldStartFreshMessageStepAfterGoogleServerSideTool({\n graph,\n stepId,\n runStep,\n content,\n}: {\n graph: StandardGraph;\n stepId: string;\n runStep?: t.RunStep;\n content: string | t.MessageContentComplex[];\n}): boolean {\n if (\n runStep?.type !== StepTypes.MESSAGE_CREATION ||\n !isGoogleServerSideToolMessageStep(graph, stepId)\n ) {\n return false;\n }\n if (typeof content === 'string') {\n return true;\n }\n return (\n content.every((c) => isTextContentPart(c)) ||\n content.every((c) => isReasoningContentPart(c))\n );\n}\n\nasync function dispatchMessageCreationStep({\n graph,\n stepKey,\n metadata,\n}: {\n graph: StandardGraph;\n stepKey: string;\n metadata?: Record<string, unknown>;\n}): Promise<string> {\n const messageId = getMessageId(stepKey, graph, true) ?? '';\n return graph.dispatchRunStep(\n stepKey,\n {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id: messageId,\n },\n },\n metadata\n );\n}\n\nasync function dispatchMessageContentParts({\n graph,\n stepKey,\n content,\n metadata,\n}: {\n graph: StandardGraph;\n stepKey: string;\n content: t.MessageContentComplex[];\n metadata?: Record<string, unknown>;\n}): Promise<void> {\n for (const contentPart of content) {\n const currentStepId = await dispatchMessageCreationStep({\n graph,\n stepKey,\n metadata,\n });\n if (isGoogleServerSideToolContentPart(contentPart)) {\n markGoogleServerSideToolMessageStep(graph, currentStepId);\n }\n await graph.dispatchMessageDelta(\n currentStepId,\n {\n content: [contentPart],\n },\n metadata\n );\n }\n}\n\nasync function dispatchReasoningContentParts({\n graph,\n stepKey,\n content,\n metadata,\n}: {\n graph: StandardGraph;\n stepKey: string;\n content: t.MessageContentComplex[];\n metadata?: Record<string, unknown>;\n}): Promise<void> {\n if (content.length === 0) {\n return;\n }\n const currentStepId = await dispatchMessageCreationStep({\n graph,\n stepKey,\n metadata,\n });\n await graph.dispatchReasoningDelta(\n currentStepId,\n {\n content,\n },\n metadata\n );\n}\n\nasync function dispatchGoogleServerSideToolStreamContent({\n graph,\n stepKey,\n chunk,\n agentContext,\n content,\n metadata,\n}: {\n graph: StandardGraph;\n stepKey: string;\n chunk: Partial<AIMessageChunk>;\n agentContext: AgentContext;\n content: t.MessageContentComplex[];\n metadata?: Record<string, unknown>;\n}): Promise<void> {\n const reasoningContent: t.MessageContentComplex[] = [];\n const reasoningText = getReasoningTextFromChunk(chunk, agentContext);\n if (reasoningText !== '') {\n reasoningContent.push({\n type: ContentTypes.THINK,\n think: reasoningText,\n });\n }\n reasoningContent.push(\n ...content\n .filter((contentPart) => isReasoningContentPart(contentPart))\n .map((contentPart) => ({\n type: ContentTypes.THINK,\n think: getReasoningTextFromContentPart(contentPart),\n }))\n .filter((contentPart) => contentPart.think !== '')\n );\n await dispatchReasoningContentParts({\n graph,\n stepKey,\n content: reasoningContent,\n metadata,\n });\n\n const messageContent = content.filter(\n (contentPart) =>\n isTextContentPart(contentPart) ||\n isGoogleServerSideToolContentPart(contentPart)\n );\n await dispatchMessageContentParts({\n graph,\n stepKey,\n content: messageContent,\n metadata,\n });\n}\n\ntype EagerToolExecutionEntry = {\n id: string;\n toolName: string;\n coercedArgs: Record<string, unknown>;\n request: t.ToolCallRequest;\n};\n\nfunction createEagerToolExecutionPlan(args: {\n graph: StandardGraph;\n metadata?: Record<string, unknown>;\n agentContext?: AgentContext;\n toolCalls: ToolCall[];\n skipExisting?: boolean;\n}): EagerToolExecutionEntry[] | undefined {\n const {\n graph,\n metadata,\n agentContext,\n toolCalls,\n skipExisting = false,\n } = args;\n if (\n !isEagerToolExecutionEnabledForBatch({\n graph,\n metadata,\n agentContext,\n })\n ) {\n return undefined;\n }\n\n if (hasDirectToolCallInBatch({ graph, agentContext, toolCalls })) {\n return undefined;\n }\n if (\n graph.toolOutputReferences?.enabled === true &&\n toolCalls.some((toolCall) => hasToolOutputReference(toolCall.args))\n ) {\n return undefined;\n }\n\n const unstartedToolCalls = skipExisting\n ? toolCalls.filter((toolCall) => {\n if (toolCall.id == null || toolCall.id === '') {\n return true;\n }\n return !graph.eagerEventToolExecutions.has(toolCall.id);\n })\n : toolCalls;\n // Drop host-excluded tools only AFTER the batch-level guards above have run\n // against the full batch, so excluding a call never hides a sibling direct\n // tool from `hasDirectToolCallInBatch`. Excluded calls fall through to normal\n // ToolNode execution; siblings may still eager-execute.\n const candidateToolCalls = unstartedToolCalls.filter(\n (toolCall) => !isEagerExecutionExcludedTool(toolCall.name, graph)\n );\n if (candidateToolCalls.length === 0) {\n return [];\n }\n\n // Eager execution must preserve ToolNode batch semantics exactly for every\n // unstarted call. If any candidate cannot be planned, fall back for that\n // candidate set.\n if (\n candidateToolCalls.some(\n (toolCall) =>\n toolCall.id == null ||\n toolCall.id === '' ||\n toolCall.name === '' ||\n (!skipExisting && graph.eagerEventToolExecutions.has(toolCall.id))\n )\n ) {\n return undefined;\n }\n\n /* No runtimeSessionHint here on purpose: the eager path is speculative, and\n * code-session tools (the only ones that carry a hint) are excluded from\n * eager prestart entirely when stateful sessions are on — see\n * isEagerExecutionExcludedTool. The durable runtime is only ever touched by\n * the committed ToolNode path. */\n const plan = buildToolExecutionRequestPlan({\n toolCalls: candidateToolCalls.map((toolCall) => ({\n id: toolCall.id,\n name: toolCall.name,\n args: toolCall.args,\n stepId: graph.toolCallStepIds.get(toolCall.id!) ?? '',\n codeSessionContext: getCodeSessionContext(graph, toolCall.name),\n })),\n usageCount: graph.getEagerEventToolUsageCount(agentContext?.agentId),\n });\n if (plan == null) {\n return undefined;\n }\n\n return plan.requests.map(\n (request): EagerToolExecutionEntry => ({\n id: request.id,\n toolName: request.name,\n coercedArgs: request.args,\n request,\n })\n );\n}\n\nfunction startEagerToolExecutions(args: {\n graph: StandardGraph;\n metadata?: Record<string, unknown>;\n agentContext?: AgentContext;\n toolCalls: ToolCall[];\n skipExisting?: boolean;\n}): void {\n const { graph, metadata, agentContext, toolCalls, skipExisting } = args;\n const entries = createEagerToolExecutionPlan({\n graph,\n metadata,\n agentContext,\n toolCalls,\n skipExisting,\n });\n if (entries == null || entries.length === 0) {\n return;\n }\n\n const records: t.EagerEventToolExecution[] = [];\n const promise: Promise<t.EagerEventToolExecutionOutcome> = new Promise<\n t.ToolExecuteResult[]\n >((resolve, reject) => {\n let dispatchSettled = false;\n let resultSettled = false;\n let settledResults: t.ToolExecuteResult[] | undefined;\n const maybeResolve = (): void => {\n if (dispatchSettled && resultSettled) {\n resolve(settledResults ?? []);\n }\n };\n const batchRequest: t.ToolExecuteBatchRequest = {\n toolCalls: entries.map((entry) => entry.request),\n userId: graph.config?.configurable?.user_id as string | undefined,\n agentId: agentContext?.agentId,\n configurable: graph.config?.configurable as\n | Record<string, unknown>\n | undefined,\n metadata,\n resolve: (results): void => {\n resultSettled = true;\n settledResults = results;\n maybeResolve();\n },\n reject,\n };\n\n void safeDispatchCustomEvent(\n GraphEvents.ON_TOOL_EXECUTE,\n batchRequest,\n graph.config\n )\n .then(() => {\n dispatchSettled = true;\n maybeResolve();\n })\n .catch(reject);\n }).then(\n async (results): Promise<t.EagerEventToolExecutionOutcome> => {\n await dispatchEagerToolCompletions({\n graph,\n agentContext,\n records,\n results,\n });\n return { results };\n },\n (error): t.EagerEventToolExecutionOutcome => ({\n error: normalizeError(error),\n })\n );\n\n for (const entry of entries) {\n const record: t.EagerEventToolExecution = {\n toolCallId: entry.id,\n toolName: entry.toolName,\n args: entry.coercedArgs,\n request: entry.request,\n promise,\n };\n records.push(record);\n graph.eagerEventToolExecutions.set(entry.id, record);\n }\n}\n\nasync function dispatchEagerToolCompletions(args: {\n graph: StandardGraph;\n agentContext?: AgentContext;\n records: t.EagerEventToolExecution[];\n results: t.ToolExecuteResult[];\n}): Promise<void> {\n const { graph, agentContext, records, results } = args;\n const recordById = new Map(\n records.map((record) => [record.toolCallId, record])\n );\n const maxToolResultChars =\n agentContext?.maxToolResultChars ??\n calculateMaxToolResultChars(agentContext?.maxContextTokens);\n\n for (const result of results) {\n const record = recordById.get(result.toolCallId);\n if (record == null) {\n continue;\n }\n if (graph.eagerEventToolExecutions.get(result.toolCallId) !== record) {\n continue;\n }\n const stepId =\n record.request.stepId ??\n graph.toolCallStepIds.get(result.toolCallId) ??\n '';\n if (stepId === '') {\n continue;\n }\n const output =\n result.status === 'error'\n ? `Error: ${result.errorMessage ?? 'Unknown error'}\\n Please fix your mistakes.`\n : truncateToolResultContent(\n typeof result.content === 'string'\n ? result.content\n : JSON.stringify(result.content),\n maxToolResultChars\n );\n\n try {\n const dispatched = await safeDispatchCustomEvent(\n GraphEvents.ON_RUN_STEP_COMPLETED,\n {\n result: {\n id: stepId,\n index: record.request.turn ?? 0,\n type: 'tool_call' as const,\n eager: true,\n tool_call: {\n args: JSON.stringify(record.request.args),\n name: record.toolName,\n id: result.toolCallId,\n output,\n progress: 1,\n } as t.ProcessedToolCall,\n },\n },\n graph.config\n );\n if (dispatched === false) {\n continue;\n }\n record.completionDispatched = true;\n } catch (error) {\n // Let ToolNode dispatch the completion through the normal path later.\n\n console.warn(\n `[stream] eager completion dispatch failed for toolCallId=${result.toolCallId}:`,\n error instanceof Error ? error.message : error\n );\n }\n }\n}\n\nfunction getEagerToolChunkKey(\n stepKey: string,\n toolCallChunk: ToolCallChunk\n): string | undefined {\n let chunkKey: string | undefined;\n if (typeof toolCallChunk.index === 'number') {\n chunkKey = String(toolCallChunk.index);\n } else if (toolCallChunk.id != null && toolCallChunk.id !== '') {\n chunkKey = toolCallChunk.id;\n }\n if (chunkKey == null) {\n return undefined;\n }\n return `${stepKey}\\u0000${chunkKey}`;\n}\n\nfunction getEagerToolChunkIndex(\n toolCallChunk: ToolCallChunk\n): number | undefined {\n return typeof toolCallChunk.index === 'number'\n ? toolCallChunk.index\n : undefined;\n}\n\nfunction pruneEagerToolCallChunkStates(args: {\n graph: StandardGraph;\n stepKey: string;\n toolCallIds?: ReadonlySet<string>;\n clearStep?: boolean;\n}): void {\n const { graph, stepKey, toolCallIds, clearStep = false } = args;\n const prefix = `${stepKey}\\u0000`;\n for (const [key, state] of graph.eagerEventToolCallChunks) {\n if (!key.startsWith(prefix)) {\n continue;\n }\n if (\n clearStep ||\n (state.id != null && toolCallIds?.has(state.id) === true)\n ) {\n graph.eagerEventToolCallChunks.delete(key);\n }\n }\n}\n\nfunction isEagerToolChunkStateComplete(\n state: t.EagerEventToolCallChunkState\n): boolean {\n return (\n state.id != null &&\n state.id !== '' &&\n state.name != null &&\n state.name !== '' &&\n coerceRecordArgs(state.argsText) != null\n );\n}\n\nfunction mergeToolCallArgsText(existing: string, incoming: string): string {\n if (incoming === '') {\n return existing;\n }\n if (existing === '') {\n return incoming;\n }\n if (incoming === existing) {\n try {\n JSON.parse(incoming);\n return incoming;\n } catch {\n return `${existing}${incoming}`;\n }\n }\n if (incoming.startsWith(existing)) {\n return incoming;\n }\n if (existing.startsWith(incoming)) {\n return existing;\n }\n try {\n JSON.parse(existing);\n JSON.parse(incoming);\n return incoming;\n } catch {\n // Fall through to delta concatenation.\n }\n for (\n let overlap = Math.min(existing.length, incoming.length);\n overlap >= 8;\n overlap -= 1\n ) {\n if (existing.endsWith(incoming.slice(0, overlap))) {\n return `${existing}${incoming.slice(overlap)}`;\n }\n }\n return `${existing}${incoming}`;\n}\n\nfunction recordEagerToolCallChunks(args: {\n graph: StandardGraph;\n stepKey: string;\n toolCallChunks?: ToolCallChunk[];\n}): void {\n const { graph, stepKey, toolCallChunks } = args;\n if (toolCallChunks == null || toolCallChunks.length === 0) {\n return;\n }\n\n // Streamed args can be cumulative and parseable before the provider has\n // sealed the call. Recording stays separate from dispatch so the boundary\n // logic can wait for either a later tool index or the final tool-call signal.\n for (const toolCallChunk of toolCallChunks) {\n const key = getEagerToolChunkKey(stepKey, toolCallChunk);\n if (key == null) {\n continue;\n }\n\n const incomingId =\n toolCallChunk.id != null && toolCallChunk.id !== ''\n ? toolCallChunk.id\n : undefined;\n const incomingName =\n toolCallChunk.name != null && toolCallChunk.name !== ''\n ? toolCallChunk.name\n : undefined;\n const previous = graph.eagerEventToolCallChunks.get(key);\n const shouldReset =\n previous != null &&\n ((incomingId != null &&\n previous.id != null &&\n incomingId !== previous.id) ||\n (incomingName != null &&\n previous.name != null &&\n incomingName !== previous.name));\n const existing =\n previous == null || shouldReset\n ? {\n argsText: '',\n }\n : previous;\n const id = incomingId ?? existing.id;\n const name = incomingName ?? existing.name;\n const incomingArgs = toolCallChunk.args ?? '';\n const isRepeatedObservedFragment =\n incomingArgs !== '' &&\n incomingArgs.length > 1 &&\n incomingArgs === existing.lastArgsFragment;\n const argsText = isRepeatedObservedFragment\n ? existing.argsText\n : mergeToolCallArgsText(existing.argsText, incomingArgs);\n const next = {\n id,\n name,\n argsText,\n index: getEagerToolChunkIndex(toolCallChunk) ?? existing.index,\n lastArgsFragment:\n incomingArgs !== '' ? incomingArgs : existing.lastArgsFragment,\n };\n graph.eagerEventToolCallChunks.set(key, next);\n }\n}\n\nfunction getStreamedReadyToolCalls(args: {\n graph: StandardGraph;\n stepKey: string;\n toolCallChunks?: ToolCallChunk[];\n seal?: StreamedToolCallSeal;\n allowSequentialSeal?: boolean;\n sealAll?: boolean;\n}): ToolCall[] {\n const {\n graph,\n stepKey,\n toolCallChunks,\n seal,\n allowSequentialSeal = false,\n sealAll = false,\n } = args;\n const currentIndices = new Set<number>();\n for (const toolCallChunk of toolCallChunks ?? []) {\n const index = getEagerToolChunkIndex(toolCallChunk);\n if (index != null) {\n currentIndices.add(index);\n }\n }\n const highestCurrentIndex =\n currentIndices.size > 0 ? Math.max(...currentIndices) : undefined;\n const prefix = `${stepKey}\\u0000`;\n const readyEntries: Array<{\n key: string;\n state: t.EagerEventToolCallChunkState;\n }> = [];\n\n for (const [key, state] of graph.eagerEventToolCallChunks) {\n if (!key.startsWith(prefix)) {\n continue;\n }\n if (state.id != null && graph.eagerEventToolExecutions.has(state.id)) {\n graph.eagerEventToolCallChunks.delete(key);\n continue;\n }\n if (!isEagerToolChunkStateComplete(state)) {\n continue;\n }\n const isSealedByLaterChunk =\n allowSequentialSeal &&\n highestCurrentIndex != null &&\n state.index != null &&\n state.index < highestCurrentIndex &&\n !currentIndices.has(state.index);\n const isSealedExplicitly =\n seal?.kind === 'single' &&\n ((seal.id != null && state.id === seal.id) ||\n (seal.index != null && state.index === seal.index));\n if (\n sealAll ||\n seal?.kind === 'all' ||\n isSealedByLaterChunk ||\n isSealedExplicitly\n ) {\n readyEntries.push({ key, state });\n }\n }\n\n pruneEagerToolCallChunkStates({\n graph,\n stepKey,\n toolCallIds: new Set(\n readyEntries\n .map(({ state }) => state.id)\n .filter((id): id is string => id != null && id !== '')\n ),\n });\n if (sealAll) {\n pruneEagerToolCallChunkStates({ graph, stepKey, clearStep: true });\n }\n\n return readyEntries\n .sort((left, right) => (left.state.index ?? 0) - (right.state.index ?? 0))\n .flatMap(({ state }) => {\n const args = coerceRecordArgs(state.argsText);\n if (args == null) {\n return [];\n }\n return [\n {\n id: state.id,\n name: state.name ?? '',\n args,\n },\n ];\n });\n}\n\nfunction startReadyStreamedEagerToolExecutions(args: {\n graph: StandardGraph;\n metadata?: Record<string, unknown>;\n agentContext?: AgentContext;\n stepKey: string;\n toolCallChunks?: ToolCallChunk[];\n seal?: StreamedToolCallSeal;\n allowSequentialSeal?: boolean;\n sealAll?: boolean;\n}): void {\n const {\n graph,\n metadata,\n agentContext,\n stepKey,\n toolCallChunks,\n seal,\n allowSequentialSeal,\n sealAll,\n } = args;\n if (\n hasPotentialDirectToolInStreamContext({ graph, agentContext }) ||\n hasDirectToolCallChunkInBatch({ graph, agentContext, toolCallChunks }) ||\n hasDirectToolCallChunkStateInStep({ graph, agentContext, stepKey }) ||\n !isEagerToolExecutionEnabledForBatch({ graph, metadata, agentContext })\n ) {\n return;\n }\n const toolCalls = getStreamedReadyToolCalls({\n graph,\n stepKey,\n toolCallChunks,\n seal,\n allowSequentialSeal,\n sealAll,\n });\n if (toolCalls.length === 0) {\n return;\n }\n startEagerToolExecutions({\n graph,\n metadata,\n agentContext,\n toolCalls,\n skipExisting: true,\n });\n}\n\nexport function getChunkContent({\n chunk,\n provider,\n reasoningKey,\n}: {\n chunk?: Partial<AIMessageChunk>;\n provider?: Providers;\n reasoningKey: 'reasoning_content' | 'reasoning';\n}): string | t.MessageContentComplex[] | undefined {\n if (\n isGoogleLike(provider) &&\n Array.isArray(chunk?.content) &&\n chunk.content.some((c) => isGoogleServerSideToolContentPart(c))\n ) {\n return chunk.content;\n }\n\n if (\n (provider === Providers.OPENAI || provider === Providers.AZURE) &&\n (\n chunk?.additional_kwargs?.reasoning as\n | Partial<ChatOpenAIReasoningSummary>\n | undefined\n )?.summary?.[0]?.text != null &&\n ((\n chunk?.additional_kwargs?.reasoning as\n | Partial<ChatOpenAIReasoningSummary>\n | undefined\n )?.summary?.[0]?.text?.length ?? 0) > 0\n ) {\n return (\n chunk?.additional_kwargs?.reasoning as\n | Partial<ChatOpenAIReasoningSummary>\n | undefined\n )?.summary?.[0]?.text;\n }\n if (provider === Providers.OPENROUTER) {\n // Content presence signals end of reasoning phase - prefer content over reasoning\n // This handles transitional chunks that may have both reasoning and content\n if (typeof chunk?.content === 'string' && chunk.content !== '') {\n return chunk.content;\n }\n const reasoning = chunk?.additional_kwargs?.reasoning as string | undefined;\n if (reasoning != null && reasoning !== '') {\n return reasoning;\n }\n const reasoningContent = chunk?.additional_kwargs?.reasoning_content as\n | string\n | undefined;\n if (reasoningContent != null && reasoningContent !== '') {\n return reasoningContent;\n }\n return chunk?.content;\n }\n const keyedReasoning = chunk?.additional_kwargs?.[reasoningKey] as\n | string\n | undefined;\n if (\n typeof chunk?.content === 'string' &&\n chunk.content !== '' &&\n keyedReasoning != null &&\n keyedReasoning !== ''\n ) {\n return chunk.content;\n }\n return ((keyedReasoning as string | undefined) ?? '') || chunk?.content;\n}\n\nfunction isDisableStreamingEnabled(\n clientOptions: t.ClientOptions | undefined\n): boolean {\n return (\n clientOptions != null &&\n 'disableStreaming' in clientOptions &&\n clientOptions.disableStreaming === true\n );\n}\n\nfunction hasReasoningContent(\n value: string | ReasoningSummaryLike | object[] | null | undefined\n): boolean {\n if (typeof value === 'string') {\n return value !== '';\n }\n if (Array.isArray(value)) {\n return value.length > 0;\n }\n if (value == null) {\n return false;\n }\n return (\n value.summary?.some(\n (summary) => summary.text != null && summary.text.length > 0\n ) === true\n );\n}\n\nfunction shouldDeferMixedFinalReasoningChunk({\n chunk,\n agentContext,\n}: {\n chunk: Partial<AIMessageChunk>;\n agentContext: AgentContext;\n}): boolean {\n if (\n (chunk.tool_calls?.length ?? 0) > 0 ||\n (chunk.tool_call_chunks?.length ?? 0) > 0 ||\n typeof chunk.content !== 'string' ||\n chunk.content === ''\n ) {\n return false;\n }\n const additionalKwargs = chunk.additional_kwargs;\n if (\n agentContext.provider === Providers.OPENROUTER &&\n hasReasoningContent(additionalKwargs?.reasoning_details as object[])\n ) {\n return true;\n }\n if (!isDisableStreamingEnabled(agentContext.clientOptions)) {\n return false;\n }\n return (\n hasReasoningContent(\n additionalKwargs?.[agentContext.reasoningKey] as\n | string\n | ReasoningSummaryLike\n | null\n | undefined\n ) ||\n hasReasoningContent(\n additionalKwargs?.reasoning_content as\n | string\n | ReasoningSummaryLike\n | null\n | undefined\n ) ||\n hasReasoningContent(\n additionalKwargs?.reasoning as\n | string\n | ReasoningSummaryLike\n | null\n | undefined\n ) ||\n hasReasoningContent(additionalKwargs?.reasoning_details as object[])\n );\n}\n\nfunction hasCurrentTextDeltaStep({\n graph,\n metadata,\n}: {\n graph: StandardGraph;\n metadata?: Record<string, unknown>;\n}): boolean {\n if (metadata == null) {\n return false;\n }\n const baseStepKey = graph.getStepBaseKey(metadata);\n for (const [stepKey, stepIds] of graph.stepKeyIds) {\n if (stepKey !== baseStepKey && !stepKey.startsWith(`${baseStepKey}_`)) {\n continue;\n }\n if (stepIds.some((stepId) => graph.messageStepHasTextDeltas.has(stepId))) {\n return true;\n }\n }\n return false;\n}\n\nfunction shouldSkipLateOpenRouterReasoningChunk({\n chunk,\n agentContext,\n graph,\n metadata,\n}: {\n chunk: Partial<AIMessageChunk>;\n agentContext: AgentContext;\n graph: StandardGraph;\n metadata?: Record<string, unknown>;\n}): boolean {\n if (\n agentContext.provider !== Providers.OPENROUTER ||\n (chunk.tool_calls?.length ?? 0) > 0 ||\n (chunk.tool_call_chunks?.length ?? 0) > 0 ||\n (chunk.content != null && chunk.content !== '')\n ) {\n return false;\n }\n return (\n (hasReasoningContent(chunk.additional_kwargs?.reasoning as string) ||\n hasReasoningContent(\n chunk.additional_kwargs?.reasoning_content as string\n ) ||\n hasReasoningContent(\n chunk.additional_kwargs?.reasoning_details as object[]\n )) &&\n hasCurrentTextDeltaStep({ graph, metadata })\n );\n}\n\nexport class ChatModelStreamHandler implements t.EventHandler {\n async handle(\n event: string,\n data: t.StreamEventData,\n metadata?: Record<string, unknown>,\n graph?: StandardGraph\n ): Promise<void> {\n if (!graph) {\n throw new Error('Graph not found');\n }\n if (!graph.config) {\n throw new Error('Config not found in graph');\n }\n\n if (!data.chunk) {\n console.warn(`No chunk found in ${event} event`);\n return;\n }\n\n const agentContext = graph.getAgentContext(metadata);\n\n const chunk = data.chunk as Partial<AIMessageChunk>;\n\n const content = getChunkContent({\n chunk,\n reasoningKey: agentContext.reasoningKey,\n provider: agentContext.provider,\n });\n const skipHandling = await handleServerToolResult({\n graph,\n content,\n metadata,\n agentContext,\n });\n if (skipHandling) {\n return;\n }\n if (shouldDeferMixedFinalReasoningChunk({ chunk, agentContext })) {\n return;\n }\n if (\n shouldSkipLateOpenRouterReasoningChunk({\n chunk,\n agentContext,\n graph,\n metadata,\n })\n ) {\n return;\n }\n this.handleReasoning(chunk, agentContext);\n const stepKey = graph.getStepKey(metadata);\n let hasToolCalls = false;\n const hasToolCallChunks =\n (chunk.tool_call_chunks && chunk.tool_call_chunks.length > 0) ?? false;\n const hasGoogleServerSideToolContent =\n isGoogleLike(agentContext.provider) &&\n Array.isArray(content) &&\n content.some((c) => isGoogleServerSideToolContentPart(c));\n if (hasGoogleServerSideToolContent && Array.isArray(content)) {\n await dispatchGoogleServerSideToolStreamContent({\n graph,\n stepKey,\n chunk,\n agentContext,\n content,\n metadata,\n });\n }\n\n if (\n chunk.tool_calls &&\n chunk.tool_calls.length > 0 &&\n chunk.tool_calls.every(\n (tc) =>\n tc.id != null &&\n tc.id !== '' &&\n (tc as Partial<ToolCall>).name != null &&\n tc.name !== ''\n )\n ) {\n hasToolCalls = true;\n await handleToolCalls(chunk.tool_calls, metadata, graph);\n if (hasFinalToolCallSignal(chunk)) {\n startEagerToolExecutions({\n graph,\n metadata,\n agentContext,\n toolCalls: chunk.tool_calls,\n skipExisting: true,\n });\n if (!hasToolCallChunks) {\n pruneEagerToolCallChunkStates({ graph, stepKey, clearStep: true });\n }\n } else if (\n hasOnArrivalToolCallSeal(chunk) &&\n !hasPotentialDirectToolInStreamContext({ graph, agentContext })\n ) {\n // Providers like Google never signal `tool_calls`/`tool_use` as the\n // finish reason, but their adapters seal calls on arrival — prestart\n // these mid-stream under the same direct-tool guard as streamed\n // chunk sealing.\n startEagerToolExecutions({\n graph,\n metadata,\n agentContext,\n toolCalls: chunk.tool_calls,\n skipExisting: true,\n });\n }\n }\n\n const isEmptyContent =\n typeof content === 'undefined' ||\n !content.length ||\n (typeof content === 'string' && !content);\n\n /** Set a preliminary message ID if found in empty chunk */\n const isEmptyChunk = isEmptyContent && !hasToolCallChunks;\n if (\n isEmptyChunk &&\n (chunk.id ?? '') !== '' &&\n !graph.prelimMessageIdsByStepKey.has(chunk.id ?? '')\n ) {\n graph.prelimMessageIdsByStepKey.set(stepKey, chunk.id ?? '');\n } else if (isEmptyChunk) {\n return;\n }\n\n if (\n hasToolCallChunks &&\n chunk.tool_call_chunks &&\n chunk.tool_call_chunks.length &&\n typeof chunk.tool_call_chunks[0]?.index === 'number'\n ) {\n const streamedToolCallSeal = getStreamedToolCallSeal(\n chunk.response_metadata as Record<string, unknown> | undefined\n );\n const allowSequentialSeal =\n canPrestartSequentialStreamedToolChunks(agentContext) ||\n streamedToolCallAdapterAllowsSequentialSeal(\n chunk.response_metadata as Record<string, unknown> | undefined\n );\n const canStreamEager =\n (allowSequentialSeal || hasExplicitStreamedToolCallSeals(chunk)) &&\n !hasPotentialDirectToolInStreamContext({ graph, agentContext }) &&\n isEagerToolExecutionEnabledForBatch({ graph, metadata, agentContext });\n if (canStreamEager) {\n recordEagerToolCallChunks({\n graph,\n stepKey,\n toolCallChunks: chunk.tool_call_chunks,\n });\n }\n await handleToolCallChunks({\n graph,\n stepKey,\n toolCallChunks: chunk.tool_call_chunks,\n metadata,\n });\n if (canStreamEager) {\n startReadyStreamedEagerToolExecutions({\n graph,\n metadata,\n agentContext,\n stepKey,\n toolCallChunks: chunk.tool_call_chunks,\n seal: streamedToolCallSeal,\n allowSequentialSeal,\n sealAll: hasFinalToolCallSignal(chunk),\n });\n }\n }\n\n if (isEmptyContent) {\n return;\n }\n\n if (hasGoogleServerSideToolContent) {\n return;\n }\n\n const message_id = getMessageId(stepKey, graph) ?? '';\n if (message_id) {\n await graph.dispatchRunStep(\n stepKey,\n {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n },\n metadata\n );\n }\n\n let stepId = graph.getStepIdByKey(stepKey);\n let runStep = graph.getRunStep(stepId);\n if (\n shouldStartFreshMessageStepAfterGoogleServerSideTool({\n graph,\n stepId,\n runStep,\n content,\n })\n ) {\n stepId = await dispatchMessageCreationStep({ graph, stepKey, metadata });\n runStep = graph.getRunStep(stepId);\n }\n if (!runStep) {\n console.warn(`\\n\n==============================================================\n\n\nRun step for ${stepId} does not exist, cannot dispatch delta event.\n\nevent: ${event}\nstepId: ${stepId}\nstepKey: ${stepKey}\nmessage_id: ${message_id}\nhasToolCalls: ${hasToolCalls}\nhasToolCallChunks: ${hasToolCallChunks}\n\n==============================================================\n\\n`);\n return;\n }\n\n /* Note: tool call chunks may have non-empty content that matches the current tool chunk generation */\n if (typeof content === 'string' && runStep.type === StepTypes.TOOL_CALLS) {\n return;\n } else if (\n hasToolCallChunks &&\n (chunk.tool_call_chunks?.some((tc) => tc.args === content) ?? false)\n ) {\n return;\n } else if (typeof content === 'string') {\n if (agentContext.currentTokenType === ContentTypes.TEXT) {\n await graph.dispatchMessageDelta(\n stepId,\n {\n content: [\n {\n type: ContentTypes.TEXT,\n text: content,\n },\n ],\n },\n metadata\n );\n } else if (agentContext.currentTokenType === 'think_and_text') {\n const { text, thinking } = parseThinkingContent(content);\n if (thinking) {\n await graph.dispatchReasoningDelta(\n stepId,\n {\n content: [\n {\n type: ContentTypes.THINK,\n think: thinking,\n },\n ],\n },\n metadata\n );\n }\n if (text) {\n agentContext.currentTokenType = ContentTypes.TEXT;\n agentContext.tokenTypeSwitch = 'content';\n const newStepKey = graph.getStepKey(metadata);\n const message_id = getMessageId(newStepKey, graph) ?? '';\n await graph.dispatchRunStep(\n newStepKey,\n {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n },\n metadata\n );\n\n const newStepId = graph.getStepIdByKey(newStepKey);\n await graph.dispatchMessageDelta(\n newStepId,\n {\n content: [\n {\n type: ContentTypes.TEXT,\n text: text,\n },\n ],\n },\n metadata\n );\n }\n } else {\n await graph.dispatchReasoningDelta(\n stepId,\n {\n content: [\n {\n type: ContentTypes.THINK,\n think: content,\n },\n ],\n },\n metadata\n );\n }\n } else if (content.every((c) => isTextContentPart(c))) {\n await graph.dispatchMessageDelta(\n stepId,\n {\n content,\n },\n metadata\n );\n } else if (content.every((c) => isReasoningContentPart(c))) {\n await graph.dispatchReasoningDelta(\n stepId,\n {\n content: content.map((c) => ({\n type: ContentTypes.THINK,\n think:\n (c as t.ThinkingContentText).thinking ??\n (c as Partial<t.GoogleReasoningContentText>).reasoning ??\n (c as Partial<t.BedrockReasoningContentText>).reasoningText\n ?.text ??\n '',\n })),\n },\n metadata\n );\n }\n }\n handleReasoning(\n chunk: Partial<AIMessageChunk>,\n agentContext: AgentContext\n ): void {\n let reasoning_content = chunk.additional_kwargs?.[\n agentContext.reasoningKey\n ] as string | Partial<ChatOpenAIReasoningSummary> | undefined;\n if (\n Array.isArray(chunk.content) &&\n (chunk.content[0]?.type === ContentTypes.THINKING ||\n chunk.content[0]?.type === ContentTypes.REASONING ||\n chunk.content[0]?.type === ContentTypes.REASONING_CONTENT ||\n chunk.content[0]?.type === 'redacted_thinking')\n ) {\n reasoning_content = 'valid';\n } else if (\n (agentContext.provider === Providers.OPENAI ||\n agentContext.provider === Providers.AZURE) &&\n reasoning_content != null &&\n typeof reasoning_content !== 'string' &&\n reasoning_content.summary?.[0]?.text != null &&\n reasoning_content.summary[0].text\n ) {\n reasoning_content = 'valid';\n } else if (\n agentContext.provider === Providers.OPENROUTER &&\n // Only set reasoning as valid if content is NOT present (content signals end of reasoning)\n (chunk.content == null || chunk.content === '') &&\n // Check for reasoning_details (final chunk) OR reasoning string (intermediate chunks)\n ((chunk.additional_kwargs?.reasoning_details != null &&\n Array.isArray(chunk.additional_kwargs.reasoning_details) &&\n chunk.additional_kwargs.reasoning_details.length > 0) ||\n (typeof chunk.additional_kwargs?.reasoning === 'string' &&\n chunk.additional_kwargs.reasoning !== '') ||\n (typeof chunk.additional_kwargs?.reasoning_content === 'string' &&\n chunk.additional_kwargs.reasoning_content !== ''))\n ) {\n reasoning_content = 'valid';\n }\n if (\n reasoning_content != null &&\n reasoning_content !== '' &&\n (chunk.content == null ||\n chunk.content === '' ||\n reasoning_content === 'valid')\n ) {\n agentContext.currentTokenType = ContentTypes.THINK;\n agentContext.tokenTypeSwitch = 'reasoning';\n return;\n } else if (\n agentContext.tokenTypeSwitch === 'reasoning' &&\n agentContext.currentTokenType !== ContentTypes.TEXT &&\n ((chunk.content != null && chunk.content !== '') ||\n (chunk.tool_calls?.length ?? 0) > 0 ||\n (chunk.tool_call_chunks?.length ?? 0) > 0)\n ) {\n agentContext.currentTokenType = ContentTypes.TEXT;\n agentContext.tokenTypeSwitch = 'content';\n agentContext.reasoningTransitionCount++;\n } else if (\n chunk.content != null &&\n typeof chunk.content === 'string' &&\n chunk.content.includes('<think>') &&\n chunk.content.includes('</think>')\n ) {\n agentContext.currentTokenType = 'think_and_text';\n agentContext.tokenTypeSwitch = 'content';\n } else if (\n chunk.content != null &&\n typeof chunk.content === 'string' &&\n chunk.content.includes('<think>')\n ) {\n agentContext.currentTokenType = ContentTypes.THINK;\n agentContext.tokenTypeSwitch = 'content';\n } else if (\n agentContext.lastToken != null &&\n agentContext.lastToken.includes('</think>')\n ) {\n agentContext.currentTokenType = ContentTypes.TEXT;\n agentContext.tokenTypeSwitch = 'content';\n }\n if (typeof chunk.content !== 'string') {\n return;\n }\n agentContext.lastToken = chunk.content;\n }\n}\n\nexport function createContentAggregator(): t.ContentAggregatorResult {\n const contentParts: Array<t.MessageContentComplex | undefined> = [];\n const stepMap = new Map<string, t.RunStep>();\n const toolCallIdMap = new Map<string, string>();\n // Track agentId and groupId for each content index (applied to content parts)\n const contentMetaMap = new Map<\n number,\n { agentId?: string; groupId?: number }\n >();\n const getFirstContentPart = (\n content?: t.MessageDelta['content'] | t.MessageContentComplex\n ): t.MessageContentComplex | undefined => {\n if (content == null) {\n return undefined;\n }\n return Array.isArray(content) ? content[0] : content;\n };\n\n const updateContent = (\n index: number,\n contentPart?: t.MessageContentComplex,\n finalUpdate = false\n ): void => {\n if (!contentPart) {\n console.warn('No content part found in \\'updateContent\\'');\n return;\n }\n const partType = contentPart.type ?? '';\n if (!partType) {\n console.warn('No content type found in content part');\n return;\n }\n\n if (!contentParts[index] && partType !== ContentTypes.TOOL_CALL) {\n contentParts[index] = { type: partType };\n }\n\n if (!partType.startsWith(contentParts[index]?.type ?? '')) {\n console.warn('Content type mismatch');\n return;\n }\n\n if (\n partType.startsWith(ContentTypes.TEXT) &&\n ContentTypes.TEXT in contentPart &&\n typeof contentPart.text === 'string'\n ) {\n // TODO: update this!!\n const currentContent = contentParts[index] as t.MessageDeltaUpdate;\n const update: t.MessageDeltaUpdate = {\n type: ContentTypes.TEXT,\n text: (currentContent.text || '') + contentPart.text,\n };\n\n if (contentPart.tool_call_ids) {\n update.tool_call_ids = contentPart.tool_call_ids;\n }\n contentParts[index] = update;\n } else if (\n partType.startsWith(ContentTypes.THINK) &&\n ContentTypes.THINK in contentPart &&\n typeof contentPart.think === 'string'\n ) {\n const currentContent = contentParts[index] as t.ReasoningDeltaUpdate;\n const update: t.ReasoningDeltaUpdate = {\n type: ContentTypes.THINK,\n think: (currentContent.think || '') + contentPart.think,\n };\n contentParts[index] = update;\n } else if (\n partType.startsWith(ContentTypes.AGENT_UPDATE) &&\n ContentTypes.AGENT_UPDATE in contentPart &&\n contentPart.agent_update != null\n ) {\n const update: t.AgentUpdate = {\n type: ContentTypes.AGENT_UPDATE,\n agent_update: contentPart.agent_update,\n };\n\n contentParts[index] = update;\n } else if (partType === 'toolCall' || partType === 'toolResponse') {\n contentParts[index] = contentPart;\n } else if (partType === ContentTypes.SUMMARY) {\n const currentSummary = contentParts[index] as\n | t.SummaryContentBlock\n | undefined;\n const incoming = contentPart as t.SummaryContentBlock;\n contentParts[index] = {\n ...incoming,\n content: [\n ...(currentSummary?.content ?? []),\n ...(incoming.content ?? []),\n ],\n };\n } else if (\n partType === ContentTypes.IMAGE_URL &&\n 'image_url' in contentPart\n ) {\n const currentContent = contentParts[index] as {\n type: 'image_url';\n image_url: string;\n };\n contentParts[index] = {\n ...currentContent,\n };\n } else if (\n partType === ContentTypes.TOOL_CALL &&\n 'tool_call' in contentPart\n ) {\n const incomingName = contentPart.tool_call.name;\n const incomingId = contentPart.tool_call.id;\n const toolCallArgs = (contentPart.tool_call as t.ToolCallPart).args;\n\n // When we receive a tool call with a name, it's the complete tool call\n // Consolidate with any previously accumulated args from chunks\n const hasValidName = incomingName != null && incomingName !== '';\n\n // Only process if incoming has a valid name (complete tool call)\n // or if we're doing a final update with complete data\n if (!hasValidName && !finalUpdate) {\n return;\n }\n\n const existingContent = contentParts[index] as\n | (Omit<t.ToolCallContent, 'tool_call'> & {\n tool_call?: t.ToolCallPart & t.PartMetadata;\n })\n | undefined;\n if (!finalUpdate && existingContent?.tool_call?.progress === 1) {\n return;\n }\n\n /** When args are a valid object, they are likely already invoked */\n let args =\n finalUpdate ||\n typeof existingContent?.tool_call?.args === 'object' ||\n typeof toolCallArgs === 'object'\n ? contentPart.tool_call.args\n : (existingContent?.tool_call?.args ?? '') + (toolCallArgs ?? '');\n if (\n finalUpdate &&\n args == null &&\n existingContent?.tool_call?.args != null\n ) {\n args = existingContent.tool_call.args;\n }\n\n const id =\n getNonEmptyValue([incomingId, existingContent?.tool_call?.id]) ?? '';\n const name =\n getNonEmptyValue([incomingName, existingContent?.tool_call?.name]) ??\n '';\n\n const newToolCall: ToolCall & t.PartMetadata = {\n id,\n name,\n args,\n type: ToolCallTypes.TOOL_CALL,\n };\n\n const auth =\n contentPart.tool_call.auth ?? existingContent?.tool_call?.auth;\n const expiresAt =\n contentPart.tool_call.expires_at ??\n existingContent?.tool_call?.expires_at;\n if (auth != null) {\n newToolCall.auth = auth;\n newToolCall.expires_at = expiresAt;\n }\n\n if (finalUpdate) {\n newToolCall.progress = 1;\n newToolCall.output = contentPart.tool_call.output;\n }\n\n contentParts[index] = {\n type: ContentTypes.TOOL_CALL,\n tool_call: newToolCall,\n };\n }\n\n // Apply agentId (for MultiAgentGraph) and groupId (for parallel execution) to content parts\n // - agentId present → MultiAgentGraph (show agent labels)\n // - groupId present → parallel execution (render columns)\n const meta = contentMetaMap.get(index);\n if (meta?.agentId != null) {\n (contentParts[index] as t.MessageContentComplex).agentId = meta.agentId;\n }\n if (meta?.groupId != null) {\n (contentParts[index] as t.MessageContentComplex).groupId = meta.groupId;\n }\n };\n\n const aggregateContent = ({\n event,\n data,\n }: {\n event: GraphEvents;\n data:\n | t.RunStep\n | t.AgentUpdate\n | t.MessageDeltaEvent\n | t.ReasoningDeltaEvent\n | t.RunStepDeltaEvent\n | t.SummarizeDeltaData\n | t.SummarizeCompleteEvent\n | { result: t.ToolEndEvent };\n }): void => {\n if (event === GraphEvents.ON_SUMMARIZE_DELTA) {\n const deltaData = data as t.SummarizeDeltaData;\n const runStep = stepMap.get(deltaData.id);\n if (!runStep) {\n console.warn('No run step found for summarize delta event');\n return;\n }\n updateContent(runStep.index, deltaData.delta.summary);\n return;\n }\n\n if (event === GraphEvents.ON_SUMMARIZE_COMPLETE) {\n const completeData = data as t.SummarizeCompleteEvent;\n const summary = completeData.summary;\n if (!summary?.boundary) {\n return;\n }\n const runStep = stepMap.get(summary.boundary.messageId);\n if (!runStep) {\n return;\n }\n // Replace accumulated delta text with the authoritative final summary.\n // Multi-stage summarization streams deltas from each chunk, which\n // concatenate in updateContent. This event carries only the correct\n // final text from the last stage.\n contentParts[runStep.index] = summary;\n return;\n }\n\n if (event === GraphEvents.ON_RUN_STEP) {\n const runStep = data as t.RunStep;\n stepMap.set(runStep.id, runStep);\n\n // Track agentId (MultiAgentGraph) and groupId (parallel execution) separately\n // - agentId: present for all MultiAgentGraph runs (enables agent labels in UI)\n // - groupId: present only for parallel execution (enables column rendering)\n const hasAgentId = runStep.agentId != null && runStep.agentId !== '';\n const hasGroupId = runStep.groupId != null;\n if (hasAgentId || hasGroupId) {\n const existingMeta = contentMetaMap.get(runStep.index) ?? {};\n if (hasAgentId) {\n existingMeta.agentId = runStep.agentId;\n }\n if (hasGroupId) {\n existingMeta.groupId = runStep.groupId;\n }\n contentMetaMap.set(runStep.index, existingMeta);\n }\n\n if (runStep.summary != null) {\n updateContent(runStep.index, runStep.summary);\n }\n\n if (\n runStep.stepDetails.type === StepTypes.TOOL_CALLS &&\n runStep.stepDetails.tool_calls\n ) {\n (runStep.stepDetails.tool_calls as ToolCall[]).forEach((toolCall) => {\n const toolCallId = toolCall.id ?? '';\n if ('id' in toolCall && toolCallId) {\n toolCallIdMap.set(runStep.id, toolCallId);\n }\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: {\n args: toolCall.args,\n name: toolCall.name,\n id: toolCallId,\n },\n };\n\n updateContent(runStep.index, contentPart);\n });\n }\n } else if (event === GraphEvents.ON_MESSAGE_DELTA) {\n const messageDelta = data as t.MessageDeltaEvent;\n const runStep = stepMap.get(messageDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for message delta event');\n return;\n }\n\n const contentPart = getFirstContentPart(messageDelta.delta.content);\n if (contentPart != null) {\n updateContent(runStep.index, contentPart);\n }\n } else if (\n event === GraphEvents.ON_AGENT_UPDATE &&\n (data as t.AgentUpdate | undefined)?.agent_update\n ) {\n const contentPart = data as t.AgentUpdate | undefined;\n if (!contentPart) {\n return;\n }\n updateContent(contentPart.agent_update.index, contentPart);\n } else if (event === GraphEvents.ON_REASONING_DELTA) {\n const reasoningDelta = data as t.ReasoningDeltaEvent;\n const runStep = stepMap.get(reasoningDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for reasoning delta event');\n return;\n }\n\n const contentPart = getFirstContentPart(reasoningDelta.delta.content);\n if (contentPart != null) {\n updateContent(runStep.index, contentPart);\n }\n } else if (event === GraphEvents.ON_RUN_STEP_DELTA) {\n const runStepDelta = data as t.RunStepDeltaEvent;\n const runStep = stepMap.get(runStepDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for run step delta event');\n return;\n }\n\n if (\n runStepDelta.delta.type === StepTypes.TOOL_CALLS &&\n runStepDelta.delta.tool_calls\n ) {\n runStepDelta.delta.tool_calls.forEach((toolCallDelta) => {\n const toolCallId = toolCallIdMap.get(runStepDelta.id);\n\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: {\n args: toolCallDelta.args ?? '',\n name: toolCallDelta.name,\n id: toolCallId,\n auth: runStepDelta.delta.auth,\n expires_at: runStepDelta.delta.expires_at,\n },\n };\n\n updateContent(runStep.index, contentPart);\n });\n }\n } else if (event === GraphEvents.ON_RUN_STEP_COMPLETED) {\n const { result } = data as unknown as {\n result:\n | t.ToolEndEvent\n | (t.SummaryCompleted & { id: string; index: number });\n };\n\n const { id: stepId } = result;\n\n const runStep = stepMap.get(stepId);\n if (!runStep) {\n console.warn('No run step or runId found for completed step event');\n return;\n }\n\n if (result.type === ContentTypes.SUMMARY && 'summary' in result) {\n contentParts[runStep.index] = result.summary as t.MessageContentComplex;\n } else if ('tool_call' in result) {\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: (result as t.ToolEndEvent).tool_call,\n };\n updateContent(runStep.index, contentPart, true);\n }\n }\n };\n\n return { contentParts, aggregateContent, stepMap };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stream.mjs","names":["completeData"],"sources":["../../src/stream.ts"],"sourcesContent":["// src/stream.ts\nimport type { ToolCall, ToolCallChunk } from '@langchain/core/messages/tool';\nimport type { ChatOpenAIReasoningSummary } from '@langchain/openai';\nimport type { AIMessageChunk } from '@langchain/core/messages';\nimport type { AgentContext } from '@/agents/AgentContext';\nimport type { StandardGraph } from '@/graphs';\nimport type * as t from '@/types';\nimport {\n getStreamedToolCallSeal,\n getStreamedToolCallAdapter,\n streamedToolCallAdapterAllowsSequentialSeal,\n type StreamedToolCallSeal,\n} from '@/tools/streamedToolCallSeals';\nimport {\n ToolCallTypes,\n ContentTypes,\n GraphEvents,\n StepTypes,\n Providers,\n Constants,\n CODE_EXECUTION_TOOLS,\n LOCAL_CODING_BUNDLE_NAMES,\n} from '@/common';\nimport {\n buildToolExecutionRequestPlan,\n coerceRecordArgs,\n normalizeError,\n} from '@/tools/eagerEventExecution';\nimport {\n handleServerToolResult,\n handleToolCallChunks,\n handleToolCalls,\n} from '@/tools/handlers';\nimport {\n calculateMaxToolResultChars,\n truncateToolResultContent,\n} from '@/utils/truncation';\nimport { TOOL_OUTPUT_REF_PATTERN } from '@/tools/toolOutputReferences';\nimport { safeDispatchCustomEvent } from '@/utils/events';\nimport { isGoogleLike } from '@/utils/llm';\nimport { getMessageId } from '@/messages';\n\nconst LOCAL_CODING_BUNDLE_NAME_SET: ReadonlySet<string> = new Set(\n LOCAL_CODING_BUNDLE_NAMES\n);\n\ntype ReasoningSummaryLike = {\n summary?: Array<{ text?: string }>;\n};\n\n/**\n * Parses content to extract thinking sections enclosed in <think> tags using string operations\n * @param content The content to parse\n * @returns An object with separated text and thinking content\n */\nfunction parseThinkingContent(content: string): {\n text: string;\n thinking: string;\n} {\n // If no think tags, return the original content as text\n if (!content.includes('<think>')) {\n return { text: content, thinking: '' };\n }\n\n let textResult = '';\n const thinkingResult: string[] = [];\n let position = 0;\n\n while (position < content.length) {\n const thinkStart = content.indexOf('<think>', position);\n\n if (thinkStart === -1) {\n // No more think tags, add the rest and break\n textResult += content.slice(position);\n break;\n }\n\n // Add text before the think tag\n textResult += content.slice(position, thinkStart);\n\n const thinkEnd = content.indexOf('</think>', thinkStart);\n if (thinkEnd === -1) {\n // Malformed input, no closing tag\n textResult += content.slice(thinkStart);\n break;\n }\n\n // Add the thinking content\n const thinkContent = content.slice(thinkStart + 7, thinkEnd);\n thinkingResult.push(thinkContent);\n\n // Move position to after the think tag\n position = thinkEnd + 8; // 8 is the length of '</think>'\n }\n\n return {\n text: textResult.trim(),\n thinking: thinkingResult.join('\\n').trim(),\n };\n}\n\nfunction getNonEmptyValue(possibleValues: string[]): string | undefined {\n for (const value of possibleValues) {\n if (value && value.trim() !== '') {\n return value;\n }\n }\n return undefined;\n}\n\nfunction isBatchSensitiveToolExecution(\n graph: StandardGraph,\n metadata?: Record<string, unknown>\n): boolean {\n /**\n * Resolve the hook-session id exactly the way ToolNode will: its hook\n * lookups read `config.configurable.run_id` ONLY, so that source wins here\n * too (a subagent child graph carries its own `graph.runId`, but its\n * ToolNode executes hooks under the PARENT's inherited configurable run\n * id). The metadata / graph.runId fallbacks only apply when no\n * configurable id exists and can only be conservative — a false positive\n * merely skips eager prestart.\n */\n const runId =\n (graph.config?.configurable?.run_id as string | undefined) ??\n (metadata?.run_id as string | undefined) ??\n graph.runId;\n return (\n graph.hookRegistry?.hasResultAlteringHooks(runId) === true ||\n graph.humanInTheLoop?.enabled === true\n );\n}\n\nfunction hasToolOutputReference(value: unknown): boolean {\n if (typeof value === 'string') {\n return TOOL_OUTPUT_REF_PATTERN.test(value);\n }\n if (Array.isArray(value)) {\n return value.some((item) => hasToolOutputReference(item));\n }\n if (value !== null && typeof value === 'object') {\n return Object.values(value as Record<string, unknown>).some((item) =>\n hasToolOutputReference(item)\n );\n }\n return false;\n}\n\nfunction isEagerExecutionExcludedTool(\n name: string,\n graph: StandardGraph\n): boolean {\n if (name === '') {\n return false;\n }\n const excluded = graph.eagerEventToolExecution?.excludeToolNames;\n if (excluded != null && excluded.includes(name)) {\n return true;\n }\n // A code-session participant writes to the shared sandbox, so it is\n // side-effecting: never prestart it speculatively (a revised/superseded turn\n // would leave the write applied). Implies exclusion without the host having\n // to also list the name in excludeToolNames.\n if (graph.codeSessionToolNames?.includes(name) === true) {\n return true;\n }\n // With stateful sessions on, execute_code/bash run against a DURABLE warm\n // runtime. Speculative prestart there is unsafe: if the model revises the\n // args, ToolNode discards the eager result but the mutation has already\n // landed in the session workspace, corrupting later runs. Stateless mode\n // uses a throwaway VM per call, so eager prestart stays safe there.\n return (\n graph.toolExecution?.sandbox?.statefulSessions === true &&\n CODE_EXECUTION_TOOLS.has(name)\n );\n}\n\nfunction isDirectGraphTool(\n name: string,\n agentContext: AgentContext | undefined\n): boolean {\n if (name.startsWith(Constants.LC_TRANSFER_TO_)) {\n return true;\n }\n return (\n (agentContext?.graphTools as t.GenericTool[] | undefined)?.some(\n (tool) => 'name' in tool && tool.name === name\n ) === true\n );\n}\n\nfunction isDirectLocalTool(name: string, graph: StandardGraph): boolean {\n const toolExecution = graph.toolExecution;\n const engine = toolExecution?.engine;\n if (\n toolExecution == null ||\n (engine !== 'local' && engine !== 'cloudflare-sandbox')\n ) {\n return false;\n }\n const includeCodingTools =\n engine === 'cloudflare-sandbox'\n ? toolExecution.cloudflare?.includeCodingTools\n : toolExecution.local?.includeCodingTools;\n if (includeCodingTools === false) {\n return CODE_EXECUTION_TOOLS.has(name);\n }\n return LOCAL_CODING_BUNDLE_NAME_SET.has(name);\n}\n\nfunction toCodeEnvFile(file: t.FileRef, execSessionId: string): t.CodeEnvFile {\n const base = {\n id: file.id,\n resource_id: file.resource_id ?? file.id,\n name: file.name,\n storage_session_id: file.storage_session_id ?? execSessionId,\n };\n const kind = file.kind ?? 'user';\n if (kind === 'skill' && file.version != null) {\n return { ...base, kind: 'skill', version: file.version };\n }\n if (kind === 'agent') {\n return { ...base, kind: 'agent' };\n }\n return { ...base, kind: 'user' };\n}\n\nfunction getCodeSessionContext(\n graph: StandardGraph,\n name: string\n): t.ToolCallRequest['codeSessionContext'] | undefined {\n if (\n !CODE_EXECUTION_TOOLS.has(name) &&\n name !== Constants.SKILL_TOOL &&\n name !== Constants.READ_FILE &&\n graph.codeSessionToolNames?.includes(name) !== true\n ) {\n return undefined;\n }\n\n const codeSession = graph.sessions.get(Constants.EXECUTE_CODE) as\n | t.CodeSessionContext\n | undefined;\n if (codeSession?.session_id == null || codeSession.session_id === '') {\n return undefined;\n }\n\n return {\n session_id: codeSession.session_id,\n files: codeSession.files?.map((file) =>\n toCodeEnvFile(file, codeSession.session_id)\n ),\n };\n}\n\nfunction isEagerToolExecutionEnabledForBatch(args: {\n graph: StandardGraph;\n metadata?: Record<string, unknown>;\n agentContext?: AgentContext;\n}): boolean {\n const { graph, metadata, agentContext } = args;\n if (graph.eagerEventToolExecution?.enabled !== true) {\n return false;\n }\n if ((agentContext?.toolDefinitions?.length ?? 0) === 0) {\n return false;\n }\n if (isBatchSensitiveToolExecution(graph, metadata)) {\n return false;\n }\n if (\n metadata?.[Constants.PROGRAMMATIC_TOOL_CALLING] === true ||\n metadata?.[Constants.BASH_PROGRAMMATIC_TOOL_CALLING] === true\n ) {\n return false;\n }\n if (\n graph.handlerRegistry?.getHandler(GraphEvents.ON_TOOL_EXECUTE) == null &&\n graph.eventToolExecutionAvailable !== true\n ) {\n return false;\n }\n return true;\n}\n\nfunction hasFinalToolCallSignal(chunk: Partial<AIMessageChunk>): boolean {\n const metadata = chunk.response_metadata as\n | Record<string, unknown>\n | undefined;\n const finishReason =\n metadata?.finish_reason ??\n metadata?.finishReason ??\n metadata?.stop_reason ??\n metadata?.stopReason;\n return finishReason === 'tool_calls' || finishReason === 'tool_use';\n}\n\nfunction canPrestartSequentialStreamedToolChunks(\n agentContext: AgentContext | undefined\n): boolean {\n // Anthropic seals each prior streamed tool-use block when the next indexed\n // tool-use block begins. Live Kimi/Moonshot streams can still revise prior\n // args after advancing to the next index, so keep those on the final\n // tool-call path unless they grow an explicit adapter seal.\n return agentContext?.provider === Providers.ANTHROPIC;\n}\n\nfunction hasExplicitStreamedToolCallSeals(\n chunk: Partial<AIMessageChunk>\n): boolean {\n return (\n getStreamedToolCallAdapter(\n chunk.response_metadata as Record<string, unknown> | undefined\n ) != null\n );\n}\n\n/**\n * True when a provider adapter marked every tool call on this chunk as\n * complete on arrival (seal kind `all`), e.g. Google GenAI / Vertex AI, whose\n * protocol delivers function calls as whole objects rather than arg deltas.\n */\nfunction hasOnArrivalToolCallSeal(chunk: Partial<AIMessageChunk>): boolean {\n const metadata = chunk.response_metadata as\n | Record<string, unknown>\n | undefined;\n return (\n getStreamedToolCallAdapter(metadata) != null &&\n getStreamedToolCallSeal(metadata)?.kind === 'all'\n );\n}\n\nfunction hasDirectToolCallInBatch(args: {\n graph: StandardGraph;\n agentContext?: AgentContext;\n toolCalls: ToolCall[];\n}): boolean {\n const { graph, agentContext, toolCalls } = args;\n return toolCalls.some(\n (toolCall) =>\n toolCall.name !== '' &&\n (isDirectGraphTool(toolCall.name, agentContext) ||\n isDirectLocalTool(toolCall.name, graph))\n );\n}\n\nfunction hasPotentialDirectToolInStreamContext(args: {\n graph: StandardGraph;\n agentContext?: AgentContext;\n}): boolean {\n const { graph, agentContext } = args;\n const engine = graph.toolExecution?.engine;\n if (engine === 'local' || engine === 'cloudflare-sandbox') {\n return true;\n }\n if ((agentContext?.graphTools?.length ?? 0) > 0) {\n return true;\n }\n return false;\n}\n\nfunction hasDirectToolCallChunkInBatch(args: {\n graph: StandardGraph;\n agentContext?: AgentContext;\n toolCallChunks?: ToolCallChunk[];\n}): boolean {\n const { graph, agentContext, toolCallChunks } = args;\n return (\n toolCallChunks?.some(\n (toolCallChunk) =>\n toolCallChunk.name != null &&\n toolCallChunk.name !== '' &&\n (isDirectGraphTool(toolCallChunk.name, agentContext) ||\n isDirectLocalTool(toolCallChunk.name, graph))\n ) === true\n );\n}\n\nfunction hasDirectToolCallChunkStateInStep(args: {\n graph: StandardGraph;\n agentContext?: AgentContext;\n stepKey: string;\n}): boolean {\n const { graph, agentContext, stepKey } = args;\n const prefix = `${stepKey}\\u0000`;\n for (const [key, state] of graph.eagerEventToolCallChunks) {\n if (!key.startsWith(prefix)) {\n continue;\n }\n const name = state.name;\n if (\n name != null &&\n name !== '' &&\n (isDirectGraphTool(name, agentContext) || isDirectLocalTool(name, graph))\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction isGoogleServerSideToolContentPart(\n contentPart: t.MessageContentComplex\n): boolean {\n return contentPart.type === 'toolCall' || contentPart.type === 'toolResponse';\n}\n\nfunction isTextContentPart(contentPart: t.MessageContentComplex): boolean {\n return contentPart.type?.startsWith(ContentTypes.TEXT) ?? false;\n}\n\nfunction isReasoningContentPart(contentPart: t.MessageContentComplex): boolean {\n return (\n (contentPart.type?.startsWith(ContentTypes.THINKING) ?? false) ||\n (contentPart.type?.startsWith(ContentTypes.REASONING) ?? false) ||\n (contentPart.type?.startsWith(ContentTypes.REASONING_CONTENT) ?? false) ||\n contentPart.type === 'redacted_thinking'\n );\n}\n\nfunction getReasoningTextFromContentPart(\n contentPart: t.MessageContentComplex\n): string {\n return (\n (contentPart as t.ThinkingContentText).thinking ??\n (contentPart as Partial<t.GoogleReasoningContentText>).reasoning ??\n (contentPart as Partial<t.BedrockReasoningContentText>).reasoningText\n ?.text ??\n ''\n );\n}\n\nfunction getReasoningTextFromChunk(\n chunk: Partial<AIMessageChunk>,\n agentContext: AgentContext\n): string {\n const reasoning = chunk.additional_kwargs?.[agentContext.reasoningKey] as\n | string\n | Partial<ChatOpenAIReasoningSummary>\n | undefined;\n if (typeof reasoning === 'string') {\n return reasoning;\n }\n return reasoning?.summary?.[0]?.text ?? '';\n}\n\nconst googleServerSideToolStepIdsByGraph = new WeakMap<\n StandardGraph,\n Set<string>\n>();\n\nfunction markGoogleServerSideToolMessageStep(\n graph: StandardGraph,\n stepId: string\n): void {\n const stepIds = googleServerSideToolStepIdsByGraph.get(graph) ?? new Set();\n stepIds.add(stepId);\n googleServerSideToolStepIdsByGraph.set(graph, stepIds);\n}\n\nfunction isGoogleServerSideToolMessageStep(\n graph: StandardGraph,\n stepId: string\n): boolean {\n return googleServerSideToolStepIdsByGraph.get(graph)?.has(stepId) === true;\n}\n\nfunction shouldStartFreshMessageStepAfterGoogleServerSideTool({\n graph,\n stepId,\n runStep,\n content,\n}: {\n graph: StandardGraph;\n stepId: string;\n runStep?: t.RunStep;\n content: string | t.MessageContentComplex[];\n}): boolean {\n if (\n runStep?.type !== StepTypes.MESSAGE_CREATION ||\n !isGoogleServerSideToolMessageStep(graph, stepId)\n ) {\n return false;\n }\n if (typeof content === 'string') {\n return true;\n }\n return (\n content.every((c) => isTextContentPart(c)) ||\n content.every((c) => isReasoningContentPart(c))\n );\n}\n\nasync function dispatchMessageCreationStep({\n graph,\n stepKey,\n metadata,\n}: {\n graph: StandardGraph;\n stepKey: string;\n metadata?: Record<string, unknown>;\n}): Promise<string> {\n const messageId = getMessageId(stepKey, graph, true) ?? '';\n return graph.dispatchRunStep(\n stepKey,\n {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id: messageId,\n },\n },\n metadata\n );\n}\n\nasync function dispatchMessageContentParts({\n graph,\n stepKey,\n content,\n metadata,\n}: {\n graph: StandardGraph;\n stepKey: string;\n content: t.MessageContentComplex[];\n metadata?: Record<string, unknown>;\n}): Promise<void> {\n for (const contentPart of content) {\n const currentStepId = await dispatchMessageCreationStep({\n graph,\n stepKey,\n metadata,\n });\n if (isGoogleServerSideToolContentPart(contentPart)) {\n markGoogleServerSideToolMessageStep(graph, currentStepId);\n }\n await graph.dispatchMessageDelta(\n currentStepId,\n {\n content: [contentPart],\n },\n metadata\n );\n }\n}\n\nasync function dispatchReasoningContentParts({\n graph,\n stepKey,\n content,\n metadata,\n}: {\n graph: StandardGraph;\n stepKey: string;\n content: t.MessageContentComplex[];\n metadata?: Record<string, unknown>;\n}): Promise<void> {\n if (content.length === 0) {\n return;\n }\n const currentStepId = await dispatchMessageCreationStep({\n graph,\n stepKey,\n metadata,\n });\n await graph.dispatchReasoningDelta(\n currentStepId,\n {\n content,\n },\n metadata\n );\n}\n\nasync function dispatchGoogleServerSideToolStreamContent({\n graph,\n stepKey,\n chunk,\n agentContext,\n content,\n metadata,\n}: {\n graph: StandardGraph;\n stepKey: string;\n chunk: Partial<AIMessageChunk>;\n agentContext: AgentContext;\n content: t.MessageContentComplex[];\n metadata?: Record<string, unknown>;\n}): Promise<void> {\n const reasoningContent: t.MessageContentComplex[] = [];\n const reasoningText = getReasoningTextFromChunk(chunk, agentContext);\n if (reasoningText !== '') {\n reasoningContent.push({\n type: ContentTypes.THINK,\n think: reasoningText,\n });\n }\n reasoningContent.push(\n ...content\n .filter((contentPart) => isReasoningContentPart(contentPart))\n .map((contentPart) => ({\n type: ContentTypes.THINK,\n think: getReasoningTextFromContentPart(contentPart),\n }))\n .filter((contentPart) => contentPart.think !== '')\n );\n await dispatchReasoningContentParts({\n graph,\n stepKey,\n content: reasoningContent,\n metadata,\n });\n\n const messageContent = content.filter(\n (contentPart) =>\n isTextContentPart(contentPart) ||\n isGoogleServerSideToolContentPart(contentPart)\n );\n await dispatchMessageContentParts({\n graph,\n stepKey,\n content: messageContent,\n metadata,\n });\n}\n\ntype EagerToolExecutionEntry = {\n id: string;\n toolName: string;\n coercedArgs: Record<string, unknown>;\n request: t.ToolCallRequest;\n};\n\nfunction createEagerToolExecutionPlan(args: {\n graph: StandardGraph;\n metadata?: Record<string, unknown>;\n agentContext?: AgentContext;\n toolCalls: ToolCall[];\n skipExisting?: boolean;\n}): EagerToolExecutionEntry[] | undefined {\n const {\n graph,\n metadata,\n agentContext,\n toolCalls,\n skipExisting = false,\n } = args;\n if (\n !isEagerToolExecutionEnabledForBatch({\n graph,\n metadata,\n agentContext,\n })\n ) {\n return undefined;\n }\n\n if (hasDirectToolCallInBatch({ graph, agentContext, toolCalls })) {\n return undefined;\n }\n if (\n graph.toolOutputReferences?.enabled === true &&\n toolCalls.some((toolCall) => hasToolOutputReference(toolCall.args))\n ) {\n return undefined;\n }\n\n const unstartedToolCalls = skipExisting\n ? toolCalls.filter((toolCall) => {\n if (toolCall.id == null || toolCall.id === '') {\n return true;\n }\n return !graph.eagerEventToolExecutions.has(toolCall.id);\n })\n : toolCalls;\n // Drop host-excluded tools only AFTER the batch-level guards above have run\n // against the full batch, so excluding a call never hides a sibling direct\n // tool from `hasDirectToolCallInBatch`. Excluded calls fall through to normal\n // ToolNode execution; siblings may still eager-execute.\n const candidateToolCalls = unstartedToolCalls.filter(\n (toolCall) => !isEagerExecutionExcludedTool(toolCall.name, graph)\n );\n if (candidateToolCalls.length === 0) {\n return [];\n }\n\n // Eager execution must preserve ToolNode batch semantics exactly for every\n // unstarted call. If any candidate cannot be planned, fall back for that\n // candidate set.\n if (\n candidateToolCalls.some(\n (toolCall) =>\n toolCall.id == null ||\n toolCall.id === '' ||\n toolCall.name === '' ||\n (!skipExisting && graph.eagerEventToolExecutions.has(toolCall.id))\n )\n ) {\n return undefined;\n }\n\n /* No runtimeSessionHint here on purpose: the eager path is speculative, and\n * code-session tools (the only ones that carry a hint) are excluded from\n * eager prestart entirely when stateful sessions are on — see\n * isEagerExecutionExcludedTool. The durable runtime is only ever touched by\n * the committed ToolNode path. */\n const plan = buildToolExecutionRequestPlan({\n toolCalls: candidateToolCalls.map((toolCall) => ({\n id: toolCall.id,\n name: toolCall.name,\n args: toolCall.args,\n stepId: graph.toolCallStepIds.get(toolCall.id!) ?? '',\n codeSessionContext: getCodeSessionContext(graph, toolCall.name),\n })),\n usageCount: graph.getEagerEventToolUsageCount(agentContext?.agentId),\n });\n if (plan == null) {\n return undefined;\n }\n\n return plan.requests.map(\n (request): EagerToolExecutionEntry => ({\n id: request.id,\n toolName: request.name,\n coercedArgs: request.args,\n request,\n })\n );\n}\n\nfunction startEagerToolExecutions(args: {\n graph: StandardGraph;\n metadata?: Record<string, unknown>;\n agentContext?: AgentContext;\n toolCalls: ToolCall[];\n skipExisting?: boolean;\n}): void {\n const { graph, metadata, agentContext, toolCalls, skipExisting } = args;\n const entries = createEagerToolExecutionPlan({\n graph,\n metadata,\n agentContext,\n toolCalls,\n skipExisting,\n });\n if (entries == null || entries.length === 0) {\n return;\n }\n\n const records: t.EagerEventToolExecution[] = [];\n const promise: Promise<t.EagerEventToolExecutionOutcome> = new Promise<\n t.ToolExecuteResult[]\n >((resolve, reject) => {\n let dispatchSettled = false;\n let resultSettled = false;\n let settledResults: t.ToolExecuteResult[] | undefined;\n const maybeResolve = (): void => {\n if (dispatchSettled && resultSettled) {\n resolve(settledResults ?? []);\n }\n };\n const batchRequest: t.ToolExecuteBatchRequest = {\n toolCalls: entries.map((entry) => entry.request),\n userId: graph.config?.configurable?.user_id as string | undefined,\n agentId: agentContext?.agentId,\n configurable: graph.config?.configurable as\n | Record<string, unknown>\n | undefined,\n metadata,\n resolve: (results): void => {\n resultSettled = true;\n settledResults = results;\n maybeResolve();\n },\n reject,\n };\n\n void safeDispatchCustomEvent(\n GraphEvents.ON_TOOL_EXECUTE,\n batchRequest,\n graph.config\n )\n .then(() => {\n dispatchSettled = true;\n maybeResolve();\n })\n .catch(reject);\n }).then(\n async (results): Promise<t.EagerEventToolExecutionOutcome> => {\n await dispatchEagerToolCompletions({\n graph,\n agentContext,\n records,\n results,\n });\n return { results };\n },\n (error): t.EagerEventToolExecutionOutcome => ({\n error: normalizeError(error),\n })\n );\n\n for (const entry of entries) {\n const record: t.EagerEventToolExecution = {\n toolCallId: entry.id,\n toolName: entry.toolName,\n args: entry.coercedArgs,\n request: entry.request,\n promise,\n };\n records.push(record);\n graph.eagerEventToolExecutions.set(entry.id, record);\n }\n}\n\nasync function dispatchEagerToolCompletions(args: {\n graph: StandardGraph;\n agentContext?: AgentContext;\n records: t.EagerEventToolExecution[];\n results: t.ToolExecuteResult[];\n}): Promise<void> {\n const { graph, agentContext, records, results } = args;\n const recordById = new Map(\n records.map((record) => [record.toolCallId, record])\n );\n const maxToolResultChars =\n agentContext?.maxToolResultChars ??\n calculateMaxToolResultChars(agentContext?.maxContextTokens);\n\n for (const result of results) {\n const record = recordById.get(result.toolCallId);\n if (record == null) {\n continue;\n }\n if (graph.eagerEventToolExecutions.get(result.toolCallId) !== record) {\n continue;\n }\n const stepId =\n record.request.stepId ??\n graph.toolCallStepIds.get(result.toolCallId) ??\n '';\n if (stepId === '') {\n continue;\n }\n const output =\n result.status === 'error'\n ? `Error: ${result.errorMessage ?? 'Unknown error'}\\n Please fix your mistakes.`\n : truncateToolResultContent(\n typeof result.content === 'string'\n ? result.content\n : JSON.stringify(result.content),\n maxToolResultChars\n );\n\n try {\n const dispatched = await safeDispatchCustomEvent(\n GraphEvents.ON_RUN_STEP_COMPLETED,\n {\n result: {\n id: stepId,\n index: record.request.turn ?? 0,\n type: 'tool_call' as const,\n eager: true,\n tool_call: {\n args: JSON.stringify(record.request.args),\n name: record.toolName,\n id: result.toolCallId,\n output,\n progress: 1,\n } as t.ProcessedToolCall,\n },\n },\n graph.config\n );\n if (dispatched === false) {\n continue;\n }\n record.completionDispatched = true;\n } catch (error) {\n // Let ToolNode dispatch the completion through the normal path later.\n\n console.warn(\n `[stream] eager completion dispatch failed for toolCallId=${result.toolCallId}:`,\n error instanceof Error ? error.message : error\n );\n }\n }\n}\n\nfunction getEagerToolChunkKey(\n stepKey: string,\n toolCallChunk: ToolCallChunk\n): string | undefined {\n let chunkKey: string | undefined;\n if (typeof toolCallChunk.index === 'number') {\n chunkKey = String(toolCallChunk.index);\n } else if (toolCallChunk.id != null && toolCallChunk.id !== '') {\n chunkKey = toolCallChunk.id;\n }\n if (chunkKey == null) {\n return undefined;\n }\n return `${stepKey}\\u0000${chunkKey}`;\n}\n\nfunction getEagerToolChunkIndex(\n toolCallChunk: ToolCallChunk\n): number | undefined {\n return typeof toolCallChunk.index === 'number'\n ? toolCallChunk.index\n : undefined;\n}\n\nfunction pruneEagerToolCallChunkStates(args: {\n graph: StandardGraph;\n stepKey: string;\n toolCallIds?: ReadonlySet<string>;\n clearStep?: boolean;\n}): void {\n const { graph, stepKey, toolCallIds, clearStep = false } = args;\n const prefix = `${stepKey}\\u0000`;\n for (const [key, state] of graph.eagerEventToolCallChunks) {\n if (!key.startsWith(prefix)) {\n continue;\n }\n if (\n clearStep ||\n (state.id != null && toolCallIds?.has(state.id) === true)\n ) {\n graph.eagerEventToolCallChunks.delete(key);\n }\n }\n}\n\nfunction isEagerToolChunkStateComplete(\n state: t.EagerEventToolCallChunkState\n): boolean {\n return (\n state.id != null &&\n state.id !== '' &&\n state.name != null &&\n state.name !== '' &&\n coerceRecordArgs(state.argsText) != null\n );\n}\n\nfunction mergeToolCallArgsText(existing: string, incoming: string): string {\n if (incoming === '') {\n return existing;\n }\n if (existing === '') {\n return incoming;\n }\n if (incoming === existing) {\n try {\n JSON.parse(incoming);\n return incoming;\n } catch {\n return `${existing}${incoming}`;\n }\n }\n if (incoming.startsWith(existing)) {\n return incoming;\n }\n if (existing.startsWith(incoming)) {\n return existing;\n }\n try {\n JSON.parse(existing);\n JSON.parse(incoming);\n return incoming;\n } catch {\n // Fall through to delta concatenation.\n }\n for (\n let overlap = Math.min(existing.length, incoming.length);\n overlap >= 8;\n overlap -= 1\n ) {\n if (existing.endsWith(incoming.slice(0, overlap))) {\n return `${existing}${incoming.slice(overlap)}`;\n }\n }\n return `${existing}${incoming}`;\n}\n\nfunction recordEagerToolCallChunks(args: {\n graph: StandardGraph;\n stepKey: string;\n toolCallChunks?: ToolCallChunk[];\n}): void {\n const { graph, stepKey, toolCallChunks } = args;\n if (toolCallChunks == null || toolCallChunks.length === 0) {\n return;\n }\n\n // Streamed args can be cumulative and parseable before the provider has\n // sealed the call. Recording stays separate from dispatch so the boundary\n // logic can wait for either a later tool index or the final tool-call signal.\n for (const toolCallChunk of toolCallChunks) {\n const key = getEagerToolChunkKey(stepKey, toolCallChunk);\n if (key == null) {\n continue;\n }\n\n const incomingId =\n toolCallChunk.id != null && toolCallChunk.id !== ''\n ? toolCallChunk.id\n : undefined;\n const incomingName =\n toolCallChunk.name != null && toolCallChunk.name !== ''\n ? toolCallChunk.name\n : undefined;\n const previous = graph.eagerEventToolCallChunks.get(key);\n const shouldReset =\n previous != null &&\n ((incomingId != null &&\n previous.id != null &&\n incomingId !== previous.id) ||\n (incomingName != null &&\n previous.name != null &&\n incomingName !== previous.name));\n const existing =\n previous == null || shouldReset\n ? {\n argsText: '',\n }\n : previous;\n const id = incomingId ?? existing.id;\n const name = incomingName ?? existing.name;\n const incomingArgs = toolCallChunk.args ?? '';\n const isRepeatedObservedFragment =\n incomingArgs !== '' &&\n incomingArgs.length > 1 &&\n incomingArgs === existing.lastArgsFragment;\n const argsText = isRepeatedObservedFragment\n ? existing.argsText\n : mergeToolCallArgsText(existing.argsText, incomingArgs);\n const next = {\n id,\n name,\n argsText,\n index: getEagerToolChunkIndex(toolCallChunk) ?? existing.index,\n lastArgsFragment:\n incomingArgs !== '' ? incomingArgs : existing.lastArgsFragment,\n };\n graph.eagerEventToolCallChunks.set(key, next);\n }\n}\n\nfunction getStreamedReadyToolCalls(args: {\n graph: StandardGraph;\n stepKey: string;\n toolCallChunks?: ToolCallChunk[];\n seal?: StreamedToolCallSeal;\n allowSequentialSeal?: boolean;\n sealAll?: boolean;\n}): ToolCall[] {\n const {\n graph,\n stepKey,\n toolCallChunks,\n seal,\n allowSequentialSeal = false,\n sealAll = false,\n } = args;\n const currentIndices = new Set<number>();\n for (const toolCallChunk of toolCallChunks ?? []) {\n const index = getEagerToolChunkIndex(toolCallChunk);\n if (index != null) {\n currentIndices.add(index);\n }\n }\n const highestCurrentIndex =\n currentIndices.size > 0 ? Math.max(...currentIndices) : undefined;\n const prefix = `${stepKey}\\u0000`;\n const readyEntries: Array<{\n key: string;\n state: t.EagerEventToolCallChunkState;\n }> = [];\n\n for (const [key, state] of graph.eagerEventToolCallChunks) {\n if (!key.startsWith(prefix)) {\n continue;\n }\n if (state.id != null && graph.eagerEventToolExecutions.has(state.id)) {\n graph.eagerEventToolCallChunks.delete(key);\n continue;\n }\n if (!isEagerToolChunkStateComplete(state)) {\n continue;\n }\n const isSealedByLaterChunk =\n allowSequentialSeal &&\n highestCurrentIndex != null &&\n state.index != null &&\n state.index < highestCurrentIndex &&\n !currentIndices.has(state.index);\n const isSealedExplicitly =\n seal?.kind === 'single' &&\n ((seal.id != null && state.id === seal.id) ||\n (seal.index != null && state.index === seal.index));\n if (\n sealAll ||\n seal?.kind === 'all' ||\n isSealedByLaterChunk ||\n isSealedExplicitly\n ) {\n readyEntries.push({ key, state });\n }\n }\n\n pruneEagerToolCallChunkStates({\n graph,\n stepKey,\n toolCallIds: new Set(\n readyEntries\n .map(({ state }) => state.id)\n .filter((id): id is string => id != null && id !== '')\n ),\n });\n if (sealAll) {\n pruneEagerToolCallChunkStates({ graph, stepKey, clearStep: true });\n }\n\n return readyEntries\n .sort((left, right) => (left.state.index ?? 0) - (right.state.index ?? 0))\n .flatMap(({ state }) => {\n const args = coerceRecordArgs(state.argsText);\n if (args == null) {\n return [];\n }\n return [\n {\n id: state.id,\n name: state.name ?? '',\n args,\n },\n ];\n });\n}\n\nfunction startReadyStreamedEagerToolExecutions(args: {\n graph: StandardGraph;\n metadata?: Record<string, unknown>;\n agentContext?: AgentContext;\n stepKey: string;\n toolCallChunks?: ToolCallChunk[];\n seal?: StreamedToolCallSeal;\n allowSequentialSeal?: boolean;\n sealAll?: boolean;\n}): void {\n const {\n graph,\n metadata,\n agentContext,\n stepKey,\n toolCallChunks,\n seal,\n allowSequentialSeal,\n sealAll,\n } = args;\n if (\n hasPotentialDirectToolInStreamContext({ graph, agentContext }) ||\n hasDirectToolCallChunkInBatch({ graph, agentContext, toolCallChunks }) ||\n hasDirectToolCallChunkStateInStep({ graph, agentContext, stepKey }) ||\n !isEagerToolExecutionEnabledForBatch({ graph, metadata, agentContext })\n ) {\n return;\n }\n const toolCalls = getStreamedReadyToolCalls({\n graph,\n stepKey,\n toolCallChunks,\n seal,\n allowSequentialSeal,\n sealAll,\n });\n if (toolCalls.length === 0) {\n return;\n }\n startEagerToolExecutions({\n graph,\n metadata,\n agentContext,\n toolCalls,\n skipExisting: true,\n });\n}\n\nexport function getChunkContent({\n chunk,\n provider,\n reasoningKey,\n}: {\n chunk?: Partial<AIMessageChunk>;\n provider?: Providers;\n reasoningKey: 'reasoning_content' | 'reasoning';\n}): string | t.MessageContentComplex[] | undefined {\n if (\n isGoogleLike(provider) &&\n Array.isArray(chunk?.content) &&\n chunk.content.some((c) => isGoogleServerSideToolContentPart(c))\n ) {\n return chunk.content;\n }\n\n if (\n (provider === Providers.OPENAI || provider === Providers.AZURE) &&\n (\n chunk?.additional_kwargs?.reasoning as\n | Partial<ChatOpenAIReasoningSummary>\n | undefined\n )?.summary?.[0]?.text != null &&\n ((\n chunk?.additional_kwargs?.reasoning as\n | Partial<ChatOpenAIReasoningSummary>\n | undefined\n )?.summary?.[0]?.text?.length ?? 0) > 0\n ) {\n return (\n chunk?.additional_kwargs?.reasoning as\n | Partial<ChatOpenAIReasoningSummary>\n | undefined\n )?.summary?.[0]?.text;\n }\n if (provider === Providers.OPENROUTER) {\n // Content presence signals end of reasoning phase - prefer content over reasoning\n // This handles transitional chunks that may have both reasoning and content\n if (typeof chunk?.content === 'string' && chunk.content !== '') {\n return chunk.content;\n }\n const reasoning = chunk?.additional_kwargs?.reasoning as string | undefined;\n if (reasoning != null && reasoning !== '') {\n return reasoning;\n }\n const reasoningContent = chunk?.additional_kwargs?.reasoning_content as\n | string\n | undefined;\n if (reasoningContent != null && reasoningContent !== '') {\n return reasoningContent;\n }\n return chunk?.content;\n }\n const keyedReasoning = chunk?.additional_kwargs?.[reasoningKey] as\n | string\n | undefined;\n if (\n typeof chunk?.content === 'string' &&\n chunk.content !== '' &&\n keyedReasoning != null &&\n keyedReasoning !== ''\n ) {\n return chunk.content;\n }\n return ((keyedReasoning as string | undefined) ?? '') || chunk?.content;\n}\n\nfunction isDisableStreamingEnabled(\n clientOptions: t.ClientOptions | undefined\n): boolean {\n return (\n clientOptions != null &&\n 'disableStreaming' in clientOptions &&\n clientOptions.disableStreaming === true\n );\n}\n\nfunction hasReasoningContent(\n value: string | ReasoningSummaryLike | object[] | null | undefined\n): boolean {\n if (typeof value === 'string') {\n return value !== '';\n }\n if (Array.isArray(value)) {\n return value.length > 0;\n }\n if (value == null) {\n return false;\n }\n return (\n value.summary?.some(\n (summary) => summary.text != null && summary.text.length > 0\n ) === true\n );\n}\n\nfunction shouldDeferMixedFinalReasoningChunk({\n chunk,\n agentContext,\n}: {\n chunk: Partial<AIMessageChunk>;\n agentContext: AgentContext;\n}): boolean {\n if (\n (chunk.tool_calls?.length ?? 0) > 0 ||\n (chunk.tool_call_chunks?.length ?? 0) > 0 ||\n typeof chunk.content !== 'string' ||\n chunk.content === ''\n ) {\n return false;\n }\n const additionalKwargs = chunk.additional_kwargs;\n if (\n agentContext.provider === Providers.OPENROUTER &&\n hasReasoningContent(additionalKwargs?.reasoning_details as object[])\n ) {\n return true;\n }\n if (!isDisableStreamingEnabled(agentContext.clientOptions)) {\n return false;\n }\n return (\n hasReasoningContent(\n additionalKwargs?.[agentContext.reasoningKey] as\n | string\n | ReasoningSummaryLike\n | null\n | undefined\n ) ||\n hasReasoningContent(\n additionalKwargs?.reasoning_content as\n | string\n | ReasoningSummaryLike\n | null\n | undefined\n ) ||\n hasReasoningContent(\n additionalKwargs?.reasoning as\n | string\n | ReasoningSummaryLike\n | null\n | undefined\n ) ||\n hasReasoningContent(additionalKwargs?.reasoning_details as object[])\n );\n}\n\nfunction hasCurrentTextDeltaStep({\n graph,\n metadata,\n}: {\n graph: StandardGraph;\n metadata?: Record<string, unknown>;\n}): boolean {\n if (metadata == null) {\n return false;\n }\n const baseStepKey = graph.getStepBaseKey(metadata);\n for (const [stepKey, stepIds] of graph.stepKeyIds) {\n if (stepKey !== baseStepKey && !stepKey.startsWith(`${baseStepKey}_`)) {\n continue;\n }\n if (stepIds.some((stepId) => graph.messageStepHasTextDeltas.has(stepId))) {\n return true;\n }\n }\n return false;\n}\n\nfunction shouldSkipLateOpenRouterReasoningChunk({\n chunk,\n agentContext,\n graph,\n metadata,\n}: {\n chunk: Partial<AIMessageChunk>;\n agentContext: AgentContext;\n graph: StandardGraph;\n metadata?: Record<string, unknown>;\n}): boolean {\n if (\n agentContext.provider !== Providers.OPENROUTER ||\n (chunk.tool_calls?.length ?? 0) > 0 ||\n (chunk.tool_call_chunks?.length ?? 0) > 0 ||\n (chunk.content != null && chunk.content !== '')\n ) {\n return false;\n }\n return (\n (hasReasoningContent(chunk.additional_kwargs?.reasoning as string) ||\n hasReasoningContent(\n chunk.additional_kwargs?.reasoning_content as string\n ) ||\n hasReasoningContent(\n chunk.additional_kwargs?.reasoning_details as object[]\n )) &&\n hasCurrentTextDeltaStep({ graph, metadata })\n );\n}\n\nexport class ChatModelStreamHandler implements t.EventHandler {\n async handle(\n event: string,\n data: t.StreamEventData,\n metadata?: Record<string, unknown>,\n graph?: StandardGraph\n ): Promise<void> {\n if (!graph) {\n throw new Error('Graph not found');\n }\n if (!graph.config) {\n throw new Error('Config not found in graph');\n }\n\n if (!data.chunk) {\n console.warn(`No chunk found in ${event} event`);\n return;\n }\n\n const agentContext = graph.getAgentContext(metadata);\n\n const chunk = data.chunk as Partial<AIMessageChunk>;\n\n const content = getChunkContent({\n chunk,\n reasoningKey: agentContext.reasoningKey,\n provider: agentContext.provider,\n });\n const skipHandling = await handleServerToolResult({\n graph,\n content,\n metadata,\n agentContext,\n });\n if (skipHandling) {\n return;\n }\n if (shouldDeferMixedFinalReasoningChunk({ chunk, agentContext })) {\n return;\n }\n if (\n shouldSkipLateOpenRouterReasoningChunk({\n chunk,\n agentContext,\n graph,\n metadata,\n })\n ) {\n return;\n }\n this.handleReasoning(chunk, agentContext);\n const stepKey = graph.getStepKey(metadata);\n let hasToolCalls = false;\n const hasToolCallChunks =\n (chunk.tool_call_chunks && chunk.tool_call_chunks.length > 0) ?? false;\n const hasGoogleServerSideToolContent =\n isGoogleLike(agentContext.provider) &&\n Array.isArray(content) &&\n content.some((c) => isGoogleServerSideToolContentPart(c));\n if (hasGoogleServerSideToolContent && Array.isArray(content)) {\n await dispatchGoogleServerSideToolStreamContent({\n graph,\n stepKey,\n chunk,\n agentContext,\n content,\n metadata,\n });\n }\n\n if (\n chunk.tool_calls &&\n chunk.tool_calls.length > 0 &&\n chunk.tool_calls.every(\n (tc) =>\n tc.id != null &&\n tc.id !== '' &&\n (tc as Partial<ToolCall>).name != null &&\n tc.name !== ''\n )\n ) {\n hasToolCalls = true;\n await handleToolCalls(chunk.tool_calls, metadata, graph);\n if (hasFinalToolCallSignal(chunk)) {\n startEagerToolExecutions({\n graph,\n metadata,\n agentContext,\n toolCalls: chunk.tool_calls,\n skipExisting: true,\n });\n if (!hasToolCallChunks) {\n pruneEagerToolCallChunkStates({ graph, stepKey, clearStep: true });\n }\n } else if (\n hasOnArrivalToolCallSeal(chunk) &&\n !hasPotentialDirectToolInStreamContext({ graph, agentContext })\n ) {\n // Providers like Google never signal `tool_calls`/`tool_use` as the\n // finish reason, but their adapters seal calls on arrival — prestart\n // these mid-stream under the same direct-tool guard as streamed\n // chunk sealing.\n startEagerToolExecutions({\n graph,\n metadata,\n agentContext,\n toolCalls: chunk.tool_calls,\n skipExisting: true,\n });\n }\n }\n\n const isEmptyContent =\n typeof content === 'undefined' ||\n !content.length ||\n (typeof content === 'string' && !content);\n\n /** Set a preliminary message ID if found in empty chunk */\n const isEmptyChunk = isEmptyContent && !hasToolCallChunks;\n if (\n isEmptyChunk &&\n (chunk.id ?? '') !== '' &&\n !graph.prelimMessageIdsByStepKey.has(chunk.id ?? '')\n ) {\n graph.prelimMessageIdsByStepKey.set(stepKey, chunk.id ?? '');\n } else if (isEmptyChunk) {\n return;\n }\n\n if (\n hasToolCallChunks &&\n chunk.tool_call_chunks &&\n chunk.tool_call_chunks.length &&\n typeof chunk.tool_call_chunks[0]?.index === 'number'\n ) {\n const streamedToolCallSeal = getStreamedToolCallSeal(\n chunk.response_metadata as Record<string, unknown> | undefined\n );\n const allowSequentialSeal =\n canPrestartSequentialStreamedToolChunks(agentContext) ||\n streamedToolCallAdapterAllowsSequentialSeal(\n chunk.response_metadata as Record<string, unknown> | undefined\n );\n const canStreamEager =\n (allowSequentialSeal || hasExplicitStreamedToolCallSeals(chunk)) &&\n !hasPotentialDirectToolInStreamContext({ graph, agentContext }) &&\n isEagerToolExecutionEnabledForBatch({ graph, metadata, agentContext });\n if (canStreamEager) {\n recordEagerToolCallChunks({\n graph,\n stepKey,\n toolCallChunks: chunk.tool_call_chunks,\n });\n }\n await handleToolCallChunks({\n graph,\n stepKey,\n toolCallChunks: chunk.tool_call_chunks,\n metadata,\n });\n if (canStreamEager) {\n startReadyStreamedEagerToolExecutions({\n graph,\n metadata,\n agentContext,\n stepKey,\n toolCallChunks: chunk.tool_call_chunks,\n seal: streamedToolCallSeal,\n allowSequentialSeal,\n sealAll: hasFinalToolCallSignal(chunk),\n });\n }\n }\n\n if (isEmptyContent) {\n return;\n }\n\n if (hasGoogleServerSideToolContent) {\n return;\n }\n\n const message_id = getMessageId(stepKey, graph) ?? '';\n if (message_id) {\n await graph.dispatchRunStep(\n stepKey,\n {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n },\n metadata\n );\n }\n\n let stepId = graph.getStepIdByKey(stepKey);\n let runStep = graph.getRunStep(stepId);\n if (\n shouldStartFreshMessageStepAfterGoogleServerSideTool({\n graph,\n stepId,\n runStep,\n content,\n })\n ) {\n stepId = await dispatchMessageCreationStep({ graph, stepKey, metadata });\n runStep = graph.getRunStep(stepId);\n }\n if (!runStep) {\n console.warn(`\\n\n==============================================================\n\n\nRun step for ${stepId} does not exist, cannot dispatch delta event.\n\nevent: ${event}\nstepId: ${stepId}\nstepKey: ${stepKey}\nmessage_id: ${message_id}\nhasToolCalls: ${hasToolCalls}\nhasToolCallChunks: ${hasToolCallChunks}\n\n==============================================================\n\\n`);\n return;\n }\n\n /* Note: tool call chunks may have non-empty content that matches the current tool chunk generation */\n if (typeof content === 'string' && runStep.type === StepTypes.TOOL_CALLS) {\n return;\n } else if (\n hasToolCallChunks &&\n (chunk.tool_call_chunks?.some((tc) => tc.args === content) ?? false)\n ) {\n return;\n } else if (typeof content === 'string') {\n if (agentContext.currentTokenType === ContentTypes.TEXT) {\n await graph.dispatchMessageDelta(\n stepId,\n {\n content: [\n {\n type: ContentTypes.TEXT,\n text: content,\n },\n ],\n },\n metadata\n );\n } else if (agentContext.currentTokenType === 'think_and_text') {\n const { text, thinking } = parseThinkingContent(content);\n if (thinking) {\n await graph.dispatchReasoningDelta(\n stepId,\n {\n content: [\n {\n type: ContentTypes.THINK,\n think: thinking,\n },\n ],\n },\n metadata\n );\n }\n if (text) {\n agentContext.currentTokenType = ContentTypes.TEXT;\n agentContext.tokenTypeSwitch = 'content';\n const newStepKey = graph.getStepKey(metadata);\n const message_id = getMessageId(newStepKey, graph) ?? '';\n await graph.dispatchRunStep(\n newStepKey,\n {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n },\n metadata\n );\n\n const newStepId = graph.getStepIdByKey(newStepKey);\n await graph.dispatchMessageDelta(\n newStepId,\n {\n content: [\n {\n type: ContentTypes.TEXT,\n text: text,\n },\n ],\n },\n metadata\n );\n }\n } else {\n await graph.dispatchReasoningDelta(\n stepId,\n {\n content: [\n {\n type: ContentTypes.THINK,\n think: content,\n },\n ],\n },\n metadata\n );\n }\n } else if (content.every((c) => isTextContentPart(c))) {\n await graph.dispatchMessageDelta(\n stepId,\n {\n content,\n },\n metadata\n );\n } else if (content.every((c) => isReasoningContentPart(c))) {\n await graph.dispatchReasoningDelta(\n stepId,\n {\n content: content.map((c) => ({\n type: ContentTypes.THINK,\n think:\n (c as t.ThinkingContentText).thinking ??\n (c as Partial<t.GoogleReasoningContentText>).reasoning ??\n (c as Partial<t.BedrockReasoningContentText>).reasoningText\n ?.text ??\n '',\n })),\n },\n metadata\n );\n }\n }\n handleReasoning(\n chunk: Partial<AIMessageChunk>,\n agentContext: AgentContext\n ): void {\n let reasoning_content = chunk.additional_kwargs?.[\n agentContext.reasoningKey\n ] as string | Partial<ChatOpenAIReasoningSummary> | undefined;\n if (\n Array.isArray(chunk.content) &&\n (chunk.content[0]?.type === ContentTypes.THINKING ||\n chunk.content[0]?.type === ContentTypes.REASONING ||\n chunk.content[0]?.type === ContentTypes.REASONING_CONTENT ||\n chunk.content[0]?.type === 'redacted_thinking')\n ) {\n reasoning_content = 'valid';\n } else if (\n (agentContext.provider === Providers.OPENAI ||\n agentContext.provider === Providers.AZURE) &&\n reasoning_content != null &&\n typeof reasoning_content !== 'string' &&\n reasoning_content.summary?.[0]?.text != null &&\n reasoning_content.summary[0].text\n ) {\n reasoning_content = 'valid';\n } else if (\n agentContext.provider === Providers.OPENROUTER &&\n // Only set reasoning as valid if content is NOT present (content signals end of reasoning)\n (chunk.content == null || chunk.content === '') &&\n // Check for reasoning_details (final chunk) OR reasoning string (intermediate chunks)\n ((chunk.additional_kwargs?.reasoning_details != null &&\n Array.isArray(chunk.additional_kwargs.reasoning_details) &&\n chunk.additional_kwargs.reasoning_details.length > 0) ||\n (typeof chunk.additional_kwargs?.reasoning === 'string' &&\n chunk.additional_kwargs.reasoning !== '') ||\n (typeof chunk.additional_kwargs?.reasoning_content === 'string' &&\n chunk.additional_kwargs.reasoning_content !== ''))\n ) {\n reasoning_content = 'valid';\n }\n if (\n reasoning_content != null &&\n reasoning_content !== '' &&\n (chunk.content == null ||\n chunk.content === '' ||\n reasoning_content === 'valid')\n ) {\n agentContext.currentTokenType = ContentTypes.THINK;\n agentContext.tokenTypeSwitch = 'reasoning';\n return;\n } else if (\n agentContext.tokenTypeSwitch === 'reasoning' &&\n agentContext.currentTokenType !== ContentTypes.TEXT &&\n ((chunk.content != null && chunk.content !== '') ||\n (chunk.tool_calls?.length ?? 0) > 0 ||\n (chunk.tool_call_chunks?.length ?? 0) > 0)\n ) {\n agentContext.currentTokenType = ContentTypes.TEXT;\n agentContext.tokenTypeSwitch = 'content';\n agentContext.reasoningTransitionCount++;\n } else if (\n chunk.content != null &&\n typeof chunk.content === 'string' &&\n chunk.content.includes('<think>') &&\n chunk.content.includes('</think>')\n ) {\n agentContext.currentTokenType = 'think_and_text';\n agentContext.tokenTypeSwitch = 'content';\n } else if (\n chunk.content != null &&\n typeof chunk.content === 'string' &&\n chunk.content.includes('<think>')\n ) {\n agentContext.currentTokenType = ContentTypes.THINK;\n agentContext.tokenTypeSwitch = 'content';\n } else if (\n agentContext.lastToken != null &&\n agentContext.lastToken.includes('</think>')\n ) {\n agentContext.currentTokenType = ContentTypes.TEXT;\n agentContext.tokenTypeSwitch = 'content';\n }\n if (typeof chunk.content !== 'string') {\n return;\n }\n agentContext.lastToken = chunk.content;\n }\n}\n\nexport function createContentAggregator(): t.ContentAggregatorResult {\n const contentParts: Array<t.MessageContentComplex | undefined> = [];\n const stepMap = new Map<string, t.RunStep>();\n const toolCallIdMap = new Map<string, string>();\n // Track agentId and groupId for each content index (applied to content parts)\n const contentMetaMap = new Map<\n number,\n { agentId?: string; groupId?: number }\n >();\n const getFirstContentPart = (\n content?: t.MessageDelta['content'] | t.MessageContentComplex\n ): t.MessageContentComplex | undefined => {\n if (content == null) {\n return undefined;\n }\n return Array.isArray(content) ? content[0] : content;\n };\n\n const updateContent = (\n index: number,\n contentPart?: t.MessageContentComplex,\n finalUpdate = false\n ): void => {\n if (!contentPart) {\n console.warn('No content part found in \\'updateContent\\'');\n return;\n }\n const partType = contentPart.type ?? '';\n if (!partType) {\n console.warn('No content type found in content part');\n return;\n }\n\n if (!contentParts[index] && partType !== ContentTypes.TOOL_CALL) {\n contentParts[index] = { type: partType };\n }\n\n if (!partType.startsWith(contentParts[index]?.type ?? '')) {\n console.warn('Content type mismatch');\n return;\n }\n\n if (\n partType.startsWith(ContentTypes.TEXT) &&\n ContentTypes.TEXT in contentPart &&\n typeof contentPart.text === 'string'\n ) {\n // TODO: update this!!\n const currentContent = contentParts[index] as t.MessageDeltaUpdate;\n const update: t.MessageDeltaUpdate = {\n type: ContentTypes.TEXT,\n text: (currentContent.text || '') + contentPart.text,\n };\n\n if (contentPart.tool_call_ids) {\n update.tool_call_ids = contentPart.tool_call_ids;\n }\n contentParts[index] = update;\n } else if (\n partType.startsWith(ContentTypes.THINK) &&\n ContentTypes.THINK in contentPart &&\n typeof contentPart.think === 'string'\n ) {\n const currentContent = contentParts[index] as t.ReasoningDeltaUpdate;\n const update: t.ReasoningDeltaUpdate = {\n type: ContentTypes.THINK,\n think: (currentContent.think || '') + contentPart.think,\n };\n contentParts[index] = update;\n } else if (\n partType.startsWith(ContentTypes.AGENT_UPDATE) &&\n ContentTypes.AGENT_UPDATE in contentPart &&\n contentPart.agent_update != null\n ) {\n const update: t.AgentUpdate = {\n type: ContentTypes.AGENT_UPDATE,\n agent_update: contentPart.agent_update,\n };\n\n contentParts[index] = update;\n } else if (partType === 'toolCall' || partType === 'toolResponse') {\n contentParts[index] = contentPart;\n } else if (partType === ContentTypes.SUMMARY) {\n const currentSummary = contentParts[index] as\n | t.SummaryContentBlock\n | undefined;\n const incoming = contentPart as t.SummaryContentBlock;\n contentParts[index] = {\n ...incoming,\n content: [\n ...(currentSummary?.content ?? []),\n ...(incoming.content ?? []),\n ],\n };\n } else if (\n partType === ContentTypes.IMAGE_URL &&\n 'image_url' in contentPart\n ) {\n const currentContent = contentParts[index] as {\n type: 'image_url';\n image_url: string;\n };\n contentParts[index] = {\n ...currentContent,\n };\n } else if (\n partType === ContentTypes.TOOL_CALL &&\n 'tool_call' in contentPart\n ) {\n const incomingName = contentPart.tool_call.name;\n const incomingId = contentPart.tool_call.id;\n const toolCallArgs = (contentPart.tool_call as t.ToolCallPart).args;\n\n // When we receive a tool call with a name, it's the complete tool call\n // Consolidate with any previously accumulated args from chunks\n const hasValidName = incomingName != null && incomingName !== '';\n\n // Only process if incoming has a valid name (complete tool call)\n // or if we're doing a final update with complete data\n if (!hasValidName && !finalUpdate) {\n return;\n }\n\n const existingContent = contentParts[index] as\n | (Omit<t.ToolCallContent, 'tool_call'> & {\n tool_call?: t.ToolCallPart & t.PartMetadata;\n })\n | undefined;\n if (!finalUpdate && existingContent?.tool_call?.progress === 1) {\n return;\n }\n\n /** When args are a valid object, they are likely already invoked */\n let args =\n finalUpdate ||\n typeof existingContent?.tool_call?.args === 'object' ||\n typeof toolCallArgs === 'object'\n ? contentPart.tool_call.args\n : (existingContent?.tool_call?.args ?? '') + (toolCallArgs ?? '');\n if (\n finalUpdate &&\n args == null &&\n existingContent?.tool_call?.args != null\n ) {\n args = existingContent.tool_call.args;\n }\n\n const id =\n getNonEmptyValue([incomingId, existingContent?.tool_call?.id]) ?? '';\n const name =\n getNonEmptyValue([incomingName, existingContent?.tool_call?.name]) ??\n '';\n\n const newToolCall: ToolCall & t.PartMetadata = {\n id,\n name,\n args,\n type: ToolCallTypes.TOOL_CALL,\n };\n\n const auth =\n contentPart.tool_call.auth ?? existingContent?.tool_call?.auth;\n const expiresAt =\n contentPart.tool_call.expires_at ??\n existingContent?.tool_call?.expires_at;\n if (auth != null) {\n newToolCall.auth = auth;\n newToolCall.expires_at = expiresAt;\n }\n\n if (finalUpdate) {\n newToolCall.progress = 1;\n newToolCall.output = contentPart.tool_call.output;\n }\n\n contentParts[index] = {\n type: ContentTypes.TOOL_CALL,\n tool_call: newToolCall,\n };\n }\n\n // Apply agentId (for MultiAgentGraph) and groupId (for parallel execution) to content parts\n // - agentId present → MultiAgentGraph (show agent labels)\n // - groupId present → parallel execution (render columns)\n const meta = contentMetaMap.get(index);\n if (meta?.agentId != null) {\n (contentParts[index] as t.MessageContentComplex).agentId = meta.agentId;\n }\n if (meta?.groupId != null) {\n (contentParts[index] as t.MessageContentComplex).groupId = meta.groupId;\n }\n };\n\n const aggregateContent = ({\n event,\n data,\n }: {\n event: GraphEvents;\n data:\n | t.RunStep\n | t.AgentUpdate\n | t.MessageDeltaEvent\n | t.ReasoningDeltaEvent\n | t.RunStepDeltaEvent\n | t.SummarizeDeltaData\n | t.SummarizeCompleteEvent\n | { result: t.ToolEndEvent };\n }): void => {\n if (event === GraphEvents.ON_SUMMARIZE_DELTA) {\n const deltaData = data as t.SummarizeDeltaData;\n const runStep = stepMap.get(deltaData.id);\n if (!runStep) {\n console.warn('No run step found for summarize delta event');\n return;\n }\n updateContent(runStep.index, deltaData.delta.summary);\n return;\n }\n\n if (event === GraphEvents.ON_SUMMARIZE_COMPLETE) {\n const completeData = data as t.SummarizeCompleteEvent;\n const summary = completeData.summary;\n if (!summary?.boundary) {\n return;\n }\n const runStep = stepMap.get(summary.boundary.messageId);\n if (!runStep) {\n return;\n }\n // Replace accumulated delta text with the authoritative final summary.\n // Multi-stage summarization streams deltas from each chunk, which\n // concatenate in updateContent. This event carries only the correct\n // final text from the last stage.\n contentParts[runStep.index] = summary;\n return;\n }\n\n if (event === GraphEvents.ON_RUN_STEP) {\n const runStep = data as t.RunStep;\n stepMap.set(runStep.id, runStep);\n\n // Track agentId (MultiAgentGraph) and groupId (parallel execution) separately\n // - agentId: present for all MultiAgentGraph runs (enables agent labels in UI)\n // - groupId: present only for parallel execution (enables column rendering)\n const hasAgentId = runStep.agentId != null && runStep.agentId !== '';\n const hasGroupId = runStep.groupId != null;\n if (hasAgentId || hasGroupId) {\n const existingMeta = contentMetaMap.get(runStep.index) ?? {};\n if (hasAgentId) {\n existingMeta.agentId = runStep.agentId;\n }\n if (hasGroupId) {\n existingMeta.groupId = runStep.groupId;\n }\n contentMetaMap.set(runStep.index, existingMeta);\n }\n\n if (runStep.summary != null) {\n updateContent(runStep.index, runStep.summary);\n }\n\n if (\n runStep.stepDetails.type === StepTypes.TOOL_CALLS &&\n runStep.stepDetails.tool_calls\n ) {\n (runStep.stepDetails.tool_calls as ToolCall[]).forEach((toolCall) => {\n const toolCallId = toolCall.id ?? '';\n if ('id' in toolCall && toolCallId) {\n toolCallIdMap.set(runStep.id, toolCallId);\n }\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: {\n args: toolCall.args,\n name: toolCall.name,\n id: toolCallId,\n },\n };\n\n updateContent(runStep.index, contentPart);\n });\n }\n } else if (event === GraphEvents.ON_MESSAGE_DELTA) {\n const messageDelta = data as t.MessageDeltaEvent;\n const runStep = stepMap.get(messageDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for message delta event');\n return;\n }\n\n const contentPart = getFirstContentPart(messageDelta.delta.content);\n if (contentPart != null) {\n updateContent(runStep.index, contentPart);\n }\n } else if (\n event === GraphEvents.ON_AGENT_UPDATE &&\n (data as t.AgentUpdate | undefined)?.agent_update\n ) {\n const contentPart = data as t.AgentUpdate | undefined;\n if (!contentPart) {\n return;\n }\n updateContent(contentPart.agent_update.index, contentPart);\n } else if (event === GraphEvents.ON_REASONING_DELTA) {\n const reasoningDelta = data as t.ReasoningDeltaEvent;\n const runStep = stepMap.get(reasoningDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for reasoning delta event');\n return;\n }\n\n const contentPart = getFirstContentPart(reasoningDelta.delta.content);\n if (contentPart != null) {\n updateContent(runStep.index, contentPart);\n }\n } else if (event === GraphEvents.ON_RUN_STEP_DELTA) {\n const runStepDelta = data as t.RunStepDeltaEvent;\n const runStep = stepMap.get(runStepDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for run step delta event');\n return;\n }\n\n if (\n runStepDelta.delta.type === StepTypes.TOOL_CALLS &&\n runStepDelta.delta.tool_calls\n ) {\n runStepDelta.delta.tool_calls.forEach((toolCallDelta) => {\n const toolCallId = toolCallIdMap.get(runStepDelta.id);\n\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: {\n args: toolCallDelta.args ?? '',\n name: toolCallDelta.name,\n id: toolCallId,\n auth: runStepDelta.delta.auth,\n expires_at: runStepDelta.delta.expires_at,\n },\n };\n\n updateContent(runStep.index, contentPart);\n });\n }\n } else if (event === GraphEvents.ON_RUN_STEP_COMPLETED) {\n const { result } = data as unknown as {\n result:\n | t.ToolEndEvent\n | (t.SummaryCompleted & { id: string; index: number });\n };\n\n const { id: stepId } = result;\n\n const runStep = stepMap.get(stepId);\n if (!runStep) {\n console.warn('No run step or runId found for completed step event');\n return;\n }\n\n if (result.type === ContentTypes.SUMMARY && 'summary' in result) {\n contentParts[runStep.index] = result.summary as t.MessageContentComplex;\n } else if ('tool_call' in result) {\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: (result as t.ToolEndEvent).tool_call,\n };\n updateContent(runStep.index, contentPart, true);\n }\n }\n };\n\n return { contentParts, aggregateContent, stepMap };\n}\n"],"mappings":"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"}
|
|
@@ -483,9 +483,9 @@ var ToolNode = class extends RunnableCallable {
|
|
|
483
483
|
this.toolUsageCount.set(toolName, Math.max(this.toolUsageCount.get(toolName) ?? 0, turn + 1));
|
|
484
484
|
if (callId != null && callId !== "") this.toolCallTurns.set(callId, turn);
|
|
485
485
|
}
|
|
486
|
-
recordEventToolPlanningTurn(toolName, turn, callId) {
|
|
486
|
+
recordEventToolPlanningTurn(toolName, turn, callId, runId) {
|
|
487
487
|
this.recordToolUsageTurn(toolName, turn, callId);
|
|
488
|
-
if (this.canConsumeEagerEventExecution()) this.eagerEventToolUsageCount?.set(toolName, Math.max(this.eagerEventToolUsageCount.get(toolName) ?? 0, turn + 1));
|
|
488
|
+
if (this.canConsumeEagerEventExecution(runId)) this.eagerEventToolUsageCount?.set(toolName, Math.max(this.eagerEventToolUsageCount.get(toolName) ?? 0, turn + 1));
|
|
489
489
|
}
|
|
490
490
|
/**
|
|
491
491
|
* Runs a single tool call with error handling.
|
|
@@ -1252,6 +1252,7 @@ var ToolNode = class extends RunnableCallable {
|
|
|
1252
1252
|
const postToolBatchEntryByCallId = /* @__PURE__ */ new Map();
|
|
1253
1253
|
const HOOK_FALLBACK = Object.freeze({
|
|
1254
1254
|
additionalContexts: [],
|
|
1255
|
+
injectedMessages: [],
|
|
1255
1256
|
errors: []
|
|
1256
1257
|
});
|
|
1257
1258
|
if (this.hookRegistry?.hasHookFor("PreToolUse", runId) === true) {
|
|
@@ -1261,6 +1262,25 @@ var ToolNode = class extends RunnableCallable {
|
|
|
1261
1262
|
* to defensively `?.` it across every reference inside.
|
|
1262
1263
|
*/
|
|
1263
1264
|
const hookRegistry = this.hookRegistry;
|
|
1265
|
+
/**
|
|
1266
|
+
* Pull each call's prestarted eager record BEFORE awaiting the hooks:
|
|
1267
|
+
* an async deny must never race the eager host promise into emitting a
|
|
1268
|
+
* successful completion (`dispatchEagerToolCompletions`' map-identity
|
|
1269
|
+
* check skips deleted records). Allowed entries get their record
|
|
1270
|
+
* restored in the decision loop below so consumption still works;
|
|
1271
|
+
* denied entries stay deleted. Ask/interrupt configs never have eager
|
|
1272
|
+
* records (HITL disables the reservation gate).
|
|
1273
|
+
*/
|
|
1274
|
+
const preemptedEagerRecords = /* @__PURE__ */ new Map();
|
|
1275
|
+
if (this.eagerEventToolExecutions != null) for (const entry of preToolCalls) {
|
|
1276
|
+
const callId = entry.call.id;
|
|
1277
|
+
if (callId == null) continue;
|
|
1278
|
+
const record = this.eagerEventToolExecutions.get(callId);
|
|
1279
|
+
if (record != null) {
|
|
1280
|
+
preemptedEagerRecords.set(callId, record);
|
|
1281
|
+
this.eagerEventToolExecutions.delete(callId);
|
|
1282
|
+
}
|
|
1283
|
+
}
|
|
1264
1284
|
const preResults = await Promise.all(preToolCalls.map((entry) => executeHooks({
|
|
1265
1285
|
registry: hookRegistry,
|
|
1266
1286
|
input: {
|
|
@@ -1326,6 +1346,14 @@ var ToolNode = class extends RunnableCallable {
|
|
|
1326
1346
|
contentString,
|
|
1327
1347
|
reason
|
|
1328
1348
|
});
|
|
1349
|
+
/**
|
|
1350
|
+
* A prestarted eager execution for a now-blocked call must neither be
|
|
1351
|
+
* consumed nor emit its completion — the run reports this call as
|
|
1352
|
+
* blocked. Deleting the record makes `dispatchEagerToolCompletions`'
|
|
1353
|
+
* map-identity check skip the pending emission (same pattern as the
|
|
1354
|
+
* rejected-results cleanup below).
|
|
1355
|
+
*/
|
|
1356
|
+
this.eagerEventToolExecutions?.delete(entry.call.id);
|
|
1329
1357
|
};
|
|
1330
1358
|
const flushDeferredBlockedSideEffects = async () => {
|
|
1331
1359
|
for (const item of deferredBlockedSideEffects) {
|
|
@@ -1414,6 +1442,10 @@ var ToolNode = class extends RunnableCallable {
|
|
|
1414
1442
|
continue;
|
|
1415
1443
|
}
|
|
1416
1444
|
if (hookResult.updatedInput != null) applyInputOverride(entry, hookResult.updatedInput);
|
|
1445
|
+
if (entry.call.id != null) {
|
|
1446
|
+
const preempted = preemptedEagerRecords.get(entry.call.id);
|
|
1447
|
+
if (preempted != null) this.eagerEventToolExecutions?.set(entry.call.id, preempted);
|
|
1448
|
+
}
|
|
1417
1449
|
approvedEntries.push(entry);
|
|
1418
1450
|
}
|
|
1419
1451
|
/**
|
|
@@ -1607,7 +1639,7 @@ var ToolNode = class extends RunnableCallable {
|
|
|
1607
1639
|
usageCount: this.toolUsageCount,
|
|
1608
1640
|
invalidArgsBehavior: "error-result",
|
|
1609
1641
|
recordTurn: (toolName, reservedTurn, callId) => {
|
|
1610
|
-
this.recordEventToolPlanningTurn(toolName, reservedTurn, callId);
|
|
1642
|
+
this.recordEventToolPlanningTurn(toolName, reservedTurn, callId, runId);
|
|
1611
1643
|
}
|
|
1612
1644
|
});
|
|
1613
1645
|
if (plan == null) throw new Error("Unable to build event tool execution request plan");
|
|
@@ -1635,7 +1667,17 @@ var ToolNode = class extends RunnableCallable {
|
|
|
1635
1667
|
* Ids are claimed synchronously before the async dispatch and
|
|
1636
1668
|
* released if the dispatch fails, letting the batch path re-emit.
|
|
1637
1669
|
*/
|
|
1638
|
-
const canEmitEarlyCompletions = this.hookRegistry
|
|
1670
|
+
const canEmitEarlyCompletions = this.hookRegistry?.hasResultAlteringHooks(runId) !== true && this.humanInTheLoop?.enabled !== true;
|
|
1671
|
+
/**
|
|
1672
|
+
* Snapshot the post-hook gates at the same instant as the early-emission
|
|
1673
|
+
* gate: a result-altering hook registered while this batch is in flight
|
|
1674
|
+
* applies from the NEXT batch. Evaluating these after results settle
|
|
1675
|
+
* would let a late hook rewrite the ToolMessage AFTER an early
|
|
1676
|
+
* completion already emitted the pre-hook output — two views of the
|
|
1677
|
+
* same call.
|
|
1678
|
+
*/
|
|
1679
|
+
const hasPostHook = this.hookRegistry?.hasHookFor("PostToolUse", runId) === true;
|
|
1680
|
+
const hasFailureHook = this.hookRegistry?.hasHookFor("PostToolUseFailure", runId) === true;
|
|
1639
1681
|
const earlyCompletionDispatchedIds = /* @__PURE__ */ new Set();
|
|
1640
1682
|
const earlyCompletionDispatches = [];
|
|
1641
1683
|
const dispatchRequestById = new Map(dispatchRequests.map((request) => [request.id, request]));
|
|
@@ -1659,7 +1701,7 @@ var ToolNode = class extends RunnableCallable {
|
|
|
1659
1701
|
safeDispatchCustomEvent("on_tool_execute", {
|
|
1660
1702
|
toolCalls: dispatchRequests,
|
|
1661
1703
|
userId: config.configurable?.user_id,
|
|
1662
|
-
agentId: this.
|
|
1704
|
+
agentId: this.executingAgentId,
|
|
1663
1705
|
configurable: config.configurable,
|
|
1664
1706
|
metadata: config.metadata,
|
|
1665
1707
|
resolve: (results) => {
|
|
@@ -1691,8 +1733,6 @@ var ToolNode = class extends RunnableCallable {
|
|
|
1691
1733
|
...dispatchedResults
|
|
1692
1734
|
];
|
|
1693
1735
|
this.storeCodeSessionFromResults(results, requestMap);
|
|
1694
|
-
const hasPostHook = this.hookRegistry?.hasHookFor("PostToolUse", runId) === true;
|
|
1695
|
-
const hasFailureHook = this.hookRegistry?.hasHookFor("PostToolUseFailure", runId) === true;
|
|
1696
1736
|
for (const result of results) {
|
|
1697
1737
|
if (result.injectedMessages && result.injectedMessages.length > 0) try {
|
|
1698
1738
|
injected.push(...this.convertInjectedMessages(result.injectedMessages));
|
|
@@ -1788,6 +1828,15 @@ var ToolNode = class extends RunnableCallable {
|
|
|
1788
1828
|
registryRaw = replaced;
|
|
1789
1829
|
contentString = truncateToolResultContent(replaced, this.maxToolResultChars);
|
|
1790
1830
|
finalToolOutput = hookResult.updatedOutput;
|
|
1831
|
+
/**
|
|
1832
|
+
* The hook ACTUALLY rewrote this output: any completion the
|
|
1833
|
+
* stream already emitted for the consumed eager result showed
|
|
1834
|
+
* the raw content, so un-mark it and let the dispatch below
|
|
1835
|
+
* re-emit the corrected version. Hooks that merely observe or
|
|
1836
|
+
* add context leave the original emission final — no
|
|
1837
|
+
* duplicates.
|
|
1838
|
+
*/
|
|
1839
|
+
eagerCompletionDispatchedIds.delete(result.toolCallId);
|
|
1791
1840
|
}
|
|
1792
1841
|
}
|
|
1793
1842
|
const batchIndex = batchIndexByCallId.get(result.toolCallId);
|
|
@@ -1830,11 +1879,12 @@ var ToolNode = class extends RunnableCallable {
|
|
|
1830
1879
|
injected
|
|
1831
1880
|
};
|
|
1832
1881
|
}
|
|
1833
|
-
|
|
1834
|
-
|
|
1882
|
+
/** Run-scoped so another run's session hooks can't flip this run's gate. */
|
|
1883
|
+
canConsumeEagerEventExecution(runId) {
|
|
1884
|
+
return this.eventDrivenMode && this.eagerEventToolExecution?.enabled === true && this.hookRegistry?.hasResultAlteringHooks(runId) !== true && this.humanInTheLoop?.enabled !== true;
|
|
1835
1885
|
}
|
|
1836
1886
|
takeMatchingEagerEventExecution(request) {
|
|
1837
|
-
if (!this.
|
|
1887
|
+
if (!this.eventDrivenMode || this.eagerEventToolExecution?.enabled !== true) return;
|
|
1838
1888
|
const execution = this.eagerEventToolExecutions?.get(request.id);
|
|
1839
1889
|
if (execution == null) return;
|
|
1840
1890
|
this.eagerEventToolExecutions?.delete(request.id);
|
|
@@ -1891,6 +1941,7 @@ var ToolNode = class extends RunnableCallable {
|
|
|
1891
1941
|
const entry = entriesByCallId.get(callId);
|
|
1892
1942
|
if (entry != null) orderedBatchEntries.push(entry);
|
|
1893
1943
|
}
|
|
1944
|
+
const hookInjectedMessages = [];
|
|
1894
1945
|
if (this.hookRegistry?.hasHookFor("PostToolBatch", runId) === true && orderedBatchEntries.length > 0) {
|
|
1895
1946
|
const batchHookResult = await executeHooks({
|
|
1896
1947
|
registry: this.hookRegistry,
|
|
@@ -1904,7 +1955,10 @@ var ToolNode = class extends RunnableCallable {
|
|
|
1904
1955
|
},
|
|
1905
1956
|
sessionId: runId
|
|
1906
1957
|
}).catch(() => void 0);
|
|
1907
|
-
if (batchHookResult != null)
|
|
1958
|
+
if (batchHookResult != null) {
|
|
1959
|
+
for (const ctx of batchHookResult.additionalContexts) batchAdditionalContexts.push(ctx);
|
|
1960
|
+
for (const msg of batchHookResult.injectedMessages) hookInjectedMessages.push(msg);
|
|
1961
|
+
}
|
|
1908
1962
|
}
|
|
1909
1963
|
if (batchAdditionalContexts.length > 0)
|
|
1910
1964
|
/**
|
|
@@ -1922,6 +1976,17 @@ var ToolNode = class extends RunnableCallable {
|
|
|
1922
1976
|
source: "hook"
|
|
1923
1977
|
}
|
|
1924
1978
|
}));
|
|
1979
|
+
/**
|
|
1980
|
+
* Hook-returned `injectedMessages` land AFTER the consolidated context
|
|
1981
|
+
* message: one converted `HumanMessage` per entry (role/source kept in
|
|
1982
|
+
* `additional_kwargs`), preserving per-message identity so verbatim
|
|
1983
|
+
* user speech (e.g. steering) sits closest to the next model call.
|
|
1984
|
+
*/
|
|
1985
|
+
if (hookInjectedMessages.length > 0) try {
|
|
1986
|
+
injected.push(...this.convertInjectedMessages(hookInjectedMessages));
|
|
1987
|
+
} catch (e) {
|
|
1988
|
+
console.warn("[ToolNode] Failed to convert PostToolBatch injectedMessages:", e instanceof Error ? e.message : e);
|
|
1989
|
+
}
|
|
1925
1990
|
}
|
|
1926
1991
|
async dispatchStepCompleted(toolCallId, toolName, args, output, config, turn) {
|
|
1927
1992
|
const stepId = this.toolCallStepIds?.get(toolCallId) ?? "";
|