@librechat/agents 3.1.66-dev.0 → 3.1.67-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +47 -18
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/common/enum.cjs +1 -0
  4. package/dist/cjs/common/enum.cjs.map +1 -1
  5. package/dist/cjs/graphs/Graph.cjs +69 -0
  6. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  7. package/dist/cjs/hooks/types.cjs.map +1 -1
  8. package/dist/cjs/main.cjs +12 -0
  9. package/dist/cjs/main.cjs.map +1 -1
  10. package/dist/cjs/summarization/node.cjs +44 -0
  11. package/dist/cjs/summarization/node.cjs.map +1 -1
  12. package/dist/cjs/tools/SubagentTool.cjs +92 -0
  13. package/dist/cjs/tools/SubagentTool.cjs.map +1 -0
  14. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +261 -0
  15. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -0
  16. package/dist/esm/agents/AgentContext.mjs +47 -18
  17. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  18. package/dist/esm/common/enum.mjs +1 -0
  19. package/dist/esm/common/enum.mjs.map +1 -1
  20. package/dist/esm/graphs/Graph.mjs +69 -0
  21. package/dist/esm/graphs/Graph.mjs.map +1 -1
  22. package/dist/esm/hooks/types.mjs.map +1 -1
  23. package/dist/esm/main.mjs +2 -0
  24. package/dist/esm/main.mjs.map +1 -1
  25. package/dist/esm/summarization/node.mjs +44 -0
  26. package/dist/esm/summarization/node.mjs.map +1 -1
  27. package/dist/esm/tools/SubagentTool.mjs +85 -0
  28. package/dist/esm/tools/SubagentTool.mjs.map +1 -0
  29. package/dist/esm/tools/subagent/SubagentExecutor.mjs +256 -0
  30. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -0
  31. package/dist/types/agents/AgentContext.d.ts +12 -0
  32. package/dist/types/common/enum.d.ts +2 -1
  33. package/dist/types/hooks/types.d.ts +12 -1
  34. package/dist/types/index.d.ts +2 -0
  35. package/dist/types/summarization/node.d.ts +2 -0
  36. package/dist/types/tools/SubagentTool.d.ts +36 -0
  37. package/dist/types/tools/subagent/SubagentExecutor.d.ts +83 -0
  38. package/dist/types/tools/subagent/index.d.ts +2 -0
  39. package/dist/types/types/graph.d.ts +25 -0
  40. package/dist/types/types/llm.d.ts +14 -2
  41. package/package.json +2 -1
  42. package/src/agents/AgentContext.ts +54 -17
  43. package/src/agents/__tests__/AgentContext.test.ts +110 -0
  44. package/src/common/enum.ts +1 -0
  45. package/src/graphs/Graph.ts +88 -0
  46. package/src/hooks/__tests__/compactHooks.test.ts +214 -0
  47. package/src/hooks/index.ts +4 -2
  48. package/src/hooks/types.ts +17 -1
  49. package/src/index.ts +2 -0
  50. package/src/scripts/multi-agent-subagent.ts +246 -0
  51. package/src/specs/subagent.test.ts +305 -0
  52. package/src/summarization/node.ts +53 -0
  53. package/src/tools/SubagentTool.ts +100 -0
  54. package/src/tools/__tests__/SubagentExecutor.test.ts +615 -0
  55. package/src/tools/__tests__/SubagentTool.test.ts +149 -0
  56. package/src/tools/__tests__/subagentHooks.test.ts +215 -0
  57. package/src/tools/subagent/SubagentExecutor.ts +344 -0
  58. package/src/tools/subagent/index.ts +12 -0
  59. package/src/types/graph.ts +27 -0
  60. package/src/types/llm.ts +16 -2
@@ -1 +1 @@
1
- {"version":3,"file":"Graph.cjs","sources":["../../../src/graphs/Graph.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { nanoid } from 'nanoid';\nimport { ToolNode } from '@langchain/langgraph/prebuilt';\nimport { Runnable, RunnableConfig } from '@langchain/core/runnables';\nimport { ToolMessage, AIMessageChunk } from '@langchain/core/messages';\nimport { START, END, StateGraph, Annotation } from '@langchain/langgraph';\nimport type {\n UsageMetadata,\n BaseMessage,\n MessageContent,\n} from '@langchain/core/messages';\nimport type { ToolCall } from '@langchain/core/messages/tool';\nimport type * as t from '@/types';\nimport {\n formatAnthropicArtifactContent,\n ensureThinkingBlockInMessages,\n convertMessagesToContent,\n sanitizeOrphanToolBlocks,\n extractToolDiscoveries,\n addBedrockCacheControl,\n formatArtifactPayload,\n formatContentStrings,\n createPruneMessages,\n addCacheControl,\n getMessageId,\n} from '@/messages';\nimport {\n GraphNodeKeys,\n ContentTypes,\n GraphEvents,\n Providers,\n StepTypes,\n} from '@/common';\nimport {\n resetIfNotEmpty,\n isAnthropicLike,\n isOpenAILike,\n isGoogleLike,\n joinKeys,\n sleep,\n} from '@/utils';\nimport { ToolNode as CustomToolNode, toolsCondition } from '@/tools/ToolNode';\nimport { safeDispatchCustomEvent, emitAgentLog } from '@/utils/events';\nimport { attemptInvoke, tryFallbackProviders } from '@/llm/invoke';\nimport { shouldTriggerSummarization } from '@/summarization';\nimport { createSummarizeNode } from '@/summarization/node';\nimport { messagesStateReducer } from '@/messages/reducer';\nimport { createSchemaOnlyTools } from '@/tools/schema';\nimport { AgentContext } from '@/agents/AgentContext';\nimport { createFakeStreamingLLM } from '@/llm/fake';\nimport { handleToolCalls } from '@/tools/handlers';\nimport { isThinkingEnabled } from '@/llm/request';\nimport { initializeModel } from '@/llm/init';\nimport { HandlerRegistry } from '@/events';\nimport { ChatOpenAI } from '@/llm/openai';\nimport type { HookRegistry } from '@/hooks';\n\nconst { AGENT, TOOLS, SUMMARIZE } = GraphNodeKeys;\n\n/** Minimum relative variance before calibrated toolSchemaTokens overrides current value. */\nconst CALIBRATION_VARIANCE_THRESHOLD = 0.15;\n\nexport abstract class Graph<\n T extends t.BaseGraphState = t.BaseGraphState,\n _TNodeName extends string = string,\n> {\n abstract resetValues(): void;\n abstract initializeTools({\n currentTools,\n currentToolMap,\n }: {\n currentTools?: t.GraphTools;\n currentToolMap?: t.ToolMap;\n }): CustomToolNode<T> | ToolNode<T>;\n abstract getRunMessages(): BaseMessage[] | undefined;\n abstract getContentParts(): t.MessageContentComplex[] | undefined;\n abstract generateStepId(stepKey: string): [string, number];\n abstract getKeyList(\n metadata: Record<string, unknown> | undefined\n ): (string | number | undefined)[];\n abstract getStepKey(metadata: Record<string, unknown> | undefined): string;\n abstract checkKeyList(keyList: (string | number | undefined)[]): boolean;\n abstract getStepIdByKey(stepKey: string, index?: number): string;\n abstract getRunStep(stepId: string): t.RunStep | undefined;\n abstract dispatchRunStep(\n stepKey: string,\n stepDetails: t.StepDetails,\n metadata?: Record<string, unknown>\n ): Promise<string>;\n abstract dispatchRunStepDelta(\n id: string,\n delta: t.ToolCallDelta\n ): Promise<void>;\n abstract dispatchMessageDelta(\n id: string,\n delta: t.MessageDelta\n ): Promise<void>;\n abstract dispatchReasoningDelta(\n stepId: string,\n delta: t.ReasoningDelta\n ): Promise<void>;\n abstract createCallModel(\n agentId?: string,\n currentModel?: t.ChatModel\n ): (\n state: t.AgentSubgraphState,\n config?: RunnableConfig\n ) => Promise<Partial<t.AgentSubgraphState>>;\n messageStepHasToolCalls: Map<string, boolean> = new Map();\n messageIdsByStepKey: Map<string, string> = new Map();\n prelimMessageIdsByStepKey: Map<string, string> = new Map();\n config: RunnableConfig | undefined;\n contentData: t.RunStep[] = [];\n stepKeyIds: Map<string, string[]> = new Map<string, string[]>();\n contentIndexMap: Map<string, number> = new Map();\n toolCallStepIds: Map<string, string> = new Map();\n /**\n * Step IDs that have been dispatched via handler registry directly\n * (in dispatchRunStep). Used by the custom event callback to skip\n * duplicate dispatch through the LangGraph callback chain.\n */\n handlerDispatchedStepIds: Set<string> = new Set();\n signal?: AbortSignal;\n /** Set of invoked tool call IDs from non-message run steps completed mid-run, if any */\n invokedToolIds?: Set<string>;\n handlerRegistry: HandlerRegistry | undefined;\n hookRegistry: HookRegistry | undefined;\n /**\n * Tool session contexts for automatic state persistence across tool invocations.\n * Keyed by tool name (e.g., Constants.EXECUTE_CODE).\n * Currently supports code execution session tracking (session_id, files).\n */\n sessions: t.ToolSessionMap = new Map();\n\n /**\n * Clears heavy references to allow GC to reclaim memory held by\n * LangGraph's internal config / AsyncLocalStorage RunTree chain.\n * Call after a run completes and content has been extracted.\n */\n clearHeavyState(): void {\n this.config = undefined;\n this.signal = undefined;\n this.contentData = [];\n this.contentIndexMap = new Map();\n this.stepKeyIds = new Map();\n this.toolCallStepIds.clear();\n this.messageIdsByStepKey = new Map();\n this.messageStepHasToolCalls = new Map();\n this.prelimMessageIdsByStepKey = new Map();\n this.invokedToolIds = undefined;\n this.handlerRegistry = undefined;\n this.hookRegistry = undefined;\n this.sessions.clear();\n }\n}\n\nexport class StandardGraph extends Graph<t.BaseGraphState, t.GraphNode> {\n overrideModel?: t.ChatModel;\n /** Optional compile options passed into workflow.compile() */\n compileOptions?: t.CompileOptions | undefined;\n messages: BaseMessage[] = [];\n /** Cached run messages preserved before clearHeavyState() so getRunMessages() works after cleanup. */\n private cachedRunMessages?: BaseMessage[];\n runId: string | undefined;\n /**\n * Boundary between historical messages (loaded from conversation state)\n * and messages produced during the current run. Set once in the state\n * reducer when messages first arrive. Used by `getRunMessages()` and\n * multi-agent message filtering — NOT for pruner token counting (the\n * pruner maintains its own `lastTurnStartIndex` in its closure).\n */\n startIndex: number = 0;\n signal?: AbortSignal;\n /** Map of agent contexts by agent ID */\n agentContexts: Map<string, AgentContext> = new Map();\n /** Default agent ID to use */\n defaultAgentId: string;\n\n constructor({\n runId,\n signal,\n agents,\n tokenCounter,\n indexTokenCountMap,\n calibrationRatio,\n }: t.StandardGraphInput) {\n super();\n this.runId = runId;\n this.signal = signal;\n\n if (agents.length === 0) {\n throw new Error('At least one agent configuration is required');\n }\n\n for (const agentConfig of agents) {\n const agentContext = AgentContext.fromConfig(\n agentConfig,\n tokenCounter,\n indexTokenCountMap\n );\n if (calibrationRatio != null && calibrationRatio > 0) {\n agentContext.calibrationRatio = calibrationRatio;\n }\n\n this.agentContexts.set(agentConfig.agentId, agentContext);\n }\n\n this.defaultAgentId = agents[0].agentId;\n }\n\n /* Init */\n\n resetValues(keepContent?: boolean): void {\n this.messages = [];\n this.cachedRunMessages = undefined;\n this.config = resetIfNotEmpty(this.config, undefined);\n if (keepContent !== true) {\n this.contentData = resetIfNotEmpty(this.contentData, []);\n this.contentIndexMap = resetIfNotEmpty(this.contentIndexMap, new Map());\n }\n this.stepKeyIds = resetIfNotEmpty(this.stepKeyIds, new Map());\n /**\n * Clear in-place instead of replacing with a new Map to preserve the\n * shared reference held by ToolNode (passed at construction time).\n * Using resetIfNotEmpty would create a new Map, leaving ToolNode with\n * a stale reference on 2nd+ processStream calls.\n */\n this.toolCallStepIds.clear();\n this.handlerDispatchedStepIds = resetIfNotEmpty(\n this.handlerDispatchedStepIds,\n new Set()\n );\n this.messageIdsByStepKey = resetIfNotEmpty(\n this.messageIdsByStepKey,\n new Map()\n );\n this.messageStepHasToolCalls = resetIfNotEmpty(\n this.messageStepHasToolCalls,\n new Map()\n );\n this.prelimMessageIdsByStepKey = resetIfNotEmpty(\n this.prelimMessageIdsByStepKey,\n new Map()\n );\n this.invokedToolIds = resetIfNotEmpty(this.invokedToolIds, undefined);\n for (const context of this.agentContexts.values()) {\n context.reset();\n }\n }\n\n override clearHeavyState(): void {\n this.cachedRunMessages = this.messages.slice(this.startIndex);\n super.clearHeavyState();\n this.messages = [];\n this.overrideModel = undefined;\n for (const context of this.agentContexts.values()) {\n context.reset();\n }\n }\n\n /* Run Step Processing */\n\n getRunStep(stepId: string): t.RunStep | undefined {\n const index = this.contentIndexMap.get(stepId);\n if (index !== undefined) {\n return this.contentData[index];\n }\n return undefined;\n }\n\n getAgentContext(metadata: Record<string, unknown> | undefined): AgentContext {\n if (!metadata) {\n throw new Error('No metadata provided to retrieve agent context');\n }\n\n const currentNode = metadata.langgraph_node as string;\n if (!currentNode) {\n throw new Error(\n 'No langgraph_node in metadata to retrieve agent context'\n );\n }\n\n let agentId: string | undefined;\n if (currentNode.startsWith(AGENT)) {\n agentId = currentNode.substring(AGENT.length);\n } else if (currentNode.startsWith(TOOLS)) {\n agentId = currentNode.substring(TOOLS.length);\n } else if (currentNode.startsWith(SUMMARIZE)) {\n agentId = currentNode.substring(SUMMARIZE.length);\n }\n\n const agentContext = this.agentContexts.get(agentId ?? '');\n if (!agentContext) {\n throw new Error(`No agent context found for agent ID ${agentId}`);\n }\n\n return agentContext;\n }\n\n getStepKey(metadata: Record<string, unknown> | undefined): string {\n if (!metadata) return '';\n\n const keyList = this.getKeyList(metadata);\n if (this.checkKeyList(keyList)) {\n throw new Error('Missing metadata');\n }\n\n return joinKeys(keyList);\n }\n\n getStepIdByKey(stepKey: string, index?: number): string {\n const stepIds = this.stepKeyIds.get(stepKey);\n if (!stepIds) {\n throw new Error(`No step IDs found for stepKey ${stepKey}`);\n }\n\n if (index === undefined) {\n return stepIds[stepIds.length - 1];\n }\n\n return stepIds[index];\n }\n\n generateStepId(stepKey: string): [string, number] {\n const stepIds = this.stepKeyIds.get(stepKey);\n let newStepId: string | undefined;\n let stepIndex = 0;\n if (stepIds) {\n stepIndex = stepIds.length;\n newStepId = `step_${nanoid()}`;\n stepIds.push(newStepId);\n this.stepKeyIds.set(stepKey, stepIds);\n } else {\n newStepId = `step_${nanoid()}`;\n this.stepKeyIds.set(stepKey, [newStepId]);\n }\n\n return [newStepId, stepIndex];\n }\n\n getKeyList(\n metadata: Record<string, unknown> | undefined\n ): (string | number | undefined)[] {\n if (!metadata) return [];\n\n const keyList = [\n metadata.run_id as string,\n metadata.thread_id as string,\n metadata.langgraph_node as string,\n metadata.langgraph_step as number,\n metadata.checkpoint_ns as string,\n ];\n\n const agentContext = this.getAgentContext(metadata);\n if (\n agentContext.currentTokenType === ContentTypes.THINK ||\n agentContext.currentTokenType === 'think_and_text'\n ) {\n keyList.push('reasoning');\n } else if (agentContext.tokenTypeSwitch === 'content') {\n keyList.push(`post-reasoning-${agentContext.reasoningTransitionCount}`);\n }\n\n if (this.invokedToolIds != null && this.invokedToolIds.size > 0) {\n keyList.push(this.invokedToolIds.size + '');\n }\n\n return keyList;\n }\n\n checkKeyList(keyList: (string | number | undefined)[]): boolean {\n return keyList.some((key) => key === undefined);\n }\n\n /* Misc.*/\n\n getRunMessages(): BaseMessage[] | undefined {\n if (this.messages.length === 0 && this.cachedRunMessages != null) {\n return this.cachedRunMessages;\n }\n return this.messages.slice(this.startIndex);\n }\n\n getContentParts(): t.MessageContentComplex[] | undefined {\n return convertMessagesToContent(this.messages.slice(this.startIndex));\n }\n\n getCalibrationRatio(): number {\n const context = this.agentContexts.get(this.defaultAgentId);\n return context?.calibrationRatio ?? 1;\n }\n\n getResolvedInstructionOverhead(): number | undefined {\n const context = this.agentContexts.get(this.defaultAgentId);\n return context?.resolvedInstructionOverhead;\n }\n\n getToolCount(): number {\n const context = this.agentContexts.get(this.defaultAgentId);\n return (\n (context?.tools?.length ?? 0) + (context?.toolDefinitions?.length ?? 0)\n );\n }\n\n /**\n * Get all run steps, optionally filtered by agent ID\n */\n getRunSteps(agentId?: string): t.RunStep[] {\n if (agentId == null || agentId === '') {\n return [...this.contentData];\n }\n return this.contentData.filter((step) => step.agentId === agentId);\n }\n\n /**\n * Get run steps grouped by agent ID\n */\n getRunStepsByAgent(): Map<string, t.RunStep[]> {\n const stepsByAgent = new Map<string, t.RunStep[]>();\n\n for (const step of this.contentData) {\n if (step.agentId == null || step.agentId === '') continue;\n\n const steps = stepsByAgent.get(step.agentId) ?? [];\n steps.push(step);\n stepsByAgent.set(step.agentId, steps);\n }\n\n return stepsByAgent;\n }\n\n /**\n * Get agent IDs that participated in this run\n */\n getActiveAgentIds(): string[] {\n const agentIds = new Set<string>();\n for (const step of this.contentData) {\n if (step.agentId != null && step.agentId !== '') {\n agentIds.add(step.agentId);\n }\n }\n return Array.from(agentIds);\n }\n\n /**\n * Maps contentPart indices to agent IDs for post-run analysis\n * Returns a map where key is the contentPart index and value is the agentId\n */\n getContentPartAgentMap(): Map<number, string> {\n const contentPartAgentMap = new Map<number, string>();\n\n for (const step of this.contentData) {\n if (\n step.agentId != null &&\n step.agentId !== '' &&\n Number.isFinite(step.index)\n ) {\n contentPartAgentMap.set(step.index, step.agentId);\n }\n }\n\n return contentPartAgentMap;\n }\n\n /* Graph */\n\n initializeTools({\n currentTools,\n currentToolMap,\n agentContext,\n }: {\n currentTools?: t.GraphTools;\n currentToolMap?: t.ToolMap;\n agentContext?: AgentContext;\n }): CustomToolNode<t.BaseGraphState> | ToolNode<t.BaseGraphState> {\n const toolDefinitions = agentContext?.toolDefinitions;\n const eventDrivenMode =\n toolDefinitions != null && toolDefinitions.length > 0;\n\n if (eventDrivenMode) {\n const schemaTools = createSchemaOnlyTools(toolDefinitions);\n const toolDefMap = new Map(toolDefinitions.map((def) => [def.name, def]));\n const graphTools = agentContext?.graphTools as\n | t.GenericTool[]\n | undefined;\n\n const directToolNames = new Set<string>();\n const allTools = [...schemaTools] as t.GenericTool[];\n const allToolMap: t.ToolMap = new Map(\n schemaTools.map((tool) => [tool.name, tool])\n );\n\n if (graphTools && graphTools.length > 0) {\n for (const tool of graphTools) {\n if ('name' in tool) {\n allTools.push(tool);\n allToolMap.set(tool.name, tool);\n directToolNames.add(tool.name);\n }\n }\n }\n\n return new CustomToolNode<t.BaseGraphState>({\n tools: allTools,\n toolMap: allToolMap,\n eventDrivenMode: true,\n sessions: this.sessions,\n toolDefinitions: toolDefMap,\n agentId: agentContext?.agentId,\n toolCallStepIds: this.toolCallStepIds,\n toolRegistry: agentContext?.toolRegistry,\n hookRegistry: this.hookRegistry,\n directToolNames: directToolNames.size > 0 ? directToolNames : undefined,\n maxContextTokens: agentContext?.maxContextTokens,\n maxToolResultChars: agentContext?.maxToolResultChars,\n errorHandler: (data, metadata) =>\n StandardGraph.handleToolCallErrorStatic(this, data, metadata),\n });\n }\n\n const graphTools = agentContext?.graphTools as t.GenericTool[] | undefined;\n const baseTools = (currentTools as t.GenericTool[] | undefined) ?? [];\n const allTraditionalTools =\n graphTools && graphTools.length > 0\n ? [...baseTools, ...graphTools]\n : baseTools;\n const traditionalToolMap =\n graphTools && graphTools.length > 0\n ? new Map([\n ...(currentToolMap ?? new Map()),\n ...graphTools\n .filter((t): t is t.GenericTool & { name: string } => 'name' in t)\n .map((t) => [t.name, t] as [string, t.GenericTool]),\n ])\n : currentToolMap;\n\n return new CustomToolNode<t.BaseGraphState>({\n tools: allTraditionalTools,\n toolMap: traditionalToolMap,\n toolCallStepIds: this.toolCallStepIds,\n errorHandler: (data, metadata) =>\n StandardGraph.handleToolCallErrorStatic(this, data, metadata),\n toolRegistry: agentContext?.toolRegistry,\n sessions: this.sessions,\n maxContextTokens: agentContext?.maxContextTokens,\n maxToolResultChars: agentContext?.maxToolResultChars,\n });\n }\n\n overrideTestModel(\n responses: string[],\n sleep?: number,\n toolCalls?: ToolCall[]\n ): void {\n this.overrideModel = createFakeStreamingLLM({\n responses,\n sleep,\n toolCalls,\n });\n }\n\n getUsageMetadata(\n finalMessage?: BaseMessage\n ): Partial<UsageMetadata> | undefined {\n if (\n finalMessage &&\n 'usage_metadata' in finalMessage &&\n finalMessage.usage_metadata != null\n ) {\n return finalMessage.usage_metadata as Partial<UsageMetadata>;\n }\n }\n\n cleanupSignalListener(currentModel?: t.ChatModel): void {\n if (!this.signal) {\n return;\n }\n const model = this.overrideModel ?? currentModel;\n if (!model) {\n return;\n }\n const client = (model as ChatOpenAI | undefined)?.exposedClient;\n if (!client?.abortHandler) {\n return;\n }\n this.signal.removeEventListener('abort', client.abortHandler);\n client.abortHandler = undefined;\n }\n\n createCallModel(agentId = 'default') {\n return async (\n state: t.AgentSubgraphState,\n config?: RunnableConfig\n ): Promise<Partial<t.AgentSubgraphState>> => {\n const agentContext = this.agentContexts.get(agentId);\n if (!agentContext) {\n throw new Error(`Agent context not found for agentId: ${agentId}`);\n }\n\n if (!config) {\n throw new Error('No config provided');\n }\n\n const { messages } = state;\n\n const discoveredNames = extractToolDiscoveries(messages);\n if (discoveredNames.length > 0) {\n agentContext.markToolsAsDiscovered(discoveredNames);\n }\n\n const toolsForBinding = agentContext.getToolsForBinding();\n let model =\n this.overrideModel ??\n initializeModel({\n tools: toolsForBinding,\n provider: agentContext.provider,\n clientOptions: agentContext.clientOptions,\n });\n\n if (agentContext.systemRunnable) {\n model = agentContext.systemRunnable.pipe(model as Runnable);\n }\n\n if (agentContext.tokenCalculationPromise) {\n await agentContext.tokenCalculationPromise;\n }\n if (!config.signal) {\n config.signal = this.signal;\n }\n this.config = config;\n\n let messagesToUse = messages;\n if (\n !agentContext.pruneMessages &&\n agentContext.tokenCounter &&\n agentContext.maxContextTokens != null\n ) {\n agentContext.pruneMessages = createPruneMessages({\n startIndex:\n agentContext.indexTokenCountMap[0] != null ? this.startIndex : 0,\n provider: agentContext.provider,\n tokenCounter: agentContext.tokenCounter,\n maxTokens: agentContext.maxContextTokens,\n thinkingEnabled: isThinkingEnabled(\n agentContext.provider,\n agentContext.clientOptions\n ),\n indexTokenCountMap: agentContext.indexTokenCountMap,\n contextPruningConfig: agentContext.contextPruningConfig,\n summarizationEnabled: agentContext.summarizationEnabled,\n reserveRatio: agentContext.summarizationConfig?.reserveRatio,\n calibrationRatio: agentContext.calibrationRatio,\n getInstructionTokens: () => agentContext.instructionTokens,\n log: (level, message, data) => {\n emitAgentLog(config, level, 'prune', message, data, {\n runId: this.runId,\n agentId,\n });\n },\n });\n }\n if (agentContext.pruneMessages) {\n const {\n context,\n indexTokenCountMap,\n messagesToRefine,\n prePruneContextTokens,\n remainingContextTokens,\n originalToolContent,\n calibrationRatio,\n resolvedInstructionOverhead,\n } = agentContext.pruneMessages({\n messages,\n usageMetadata: agentContext.currentUsage,\n lastCallUsage: agentContext.lastCallUsage,\n totalTokensFresh: agentContext.totalTokensFresh,\n });\n agentContext.indexTokenCountMap = indexTokenCountMap;\n if (calibrationRatio != null && calibrationRatio > 0) {\n agentContext.calibrationRatio = calibrationRatio;\n }\n if (resolvedInstructionOverhead != null) {\n agentContext.resolvedInstructionOverhead =\n resolvedInstructionOverhead;\n const nonToolOverhead =\n agentContext.instructionTokens - agentContext.toolSchemaTokens;\n const calibratedToolTokens = Math.max(\n 0,\n resolvedInstructionOverhead - nonToolOverhead\n );\n const currentToolTokens = agentContext.toolSchemaTokens;\n const variance =\n currentToolTokens > 0\n ? Math.abs(calibratedToolTokens - currentToolTokens) /\n currentToolTokens\n : 1;\n if (variance > CALIBRATION_VARIANCE_THRESHOLD) {\n agentContext.toolSchemaTokens = calibratedToolTokens;\n }\n }\n messagesToUse = context;\n\n const hasPrunedMessages =\n agentContext.summarizationEnabled === true &&\n Array.isArray(messagesToRefine) &&\n messagesToRefine.length > 0;\n\n if (hasPrunedMessages) {\n const shouldSkip = agentContext.shouldSkipSummarization(\n messages.length\n );\n const triggerResult =\n !shouldSkip &&\n shouldTriggerSummarization({\n trigger: agentContext.summarizationConfig?.trigger,\n maxContextTokens: agentContext.maxContextTokens,\n prePruneContextTokens:\n prePruneContextTokens != null\n ? prePruneContextTokens + agentContext.instructionTokens\n : undefined,\n remainingContextTokens,\n messagesToRefineCount: messagesToRefine.length,\n });\n\n if (triggerResult) {\n if (originalToolContent != null && originalToolContent.size > 0) {\n agentContext.pendingOriginalToolContent = originalToolContent;\n }\n\n emitAgentLog(\n config,\n 'info',\n 'graph',\n 'Summarization triggered',\n undefined,\n { runId: this.runId, agentId }\n );\n emitAgentLog(\n config,\n 'debug',\n 'graph',\n 'Summarization trigger details',\n {\n totalMessages: messages.length,\n remainingContextTokens: remainingContextTokens ?? 0,\n summaryVersion: agentContext.summaryVersion + 1,\n toolSchemaTokens: agentContext.toolSchemaTokens,\n instructionTokens: agentContext.instructionTokens,\n systemMessageTokens: agentContext.systemMessageTokens,\n },\n { runId: this.runId, agentId }\n );\n agentContext.markSummarizationTriggered(messages.length);\n return {\n summarizationRequest: {\n remainingContextTokens: remainingContextTokens ?? 0,\n agentId: agentId || agentContext.agentId,\n },\n };\n }\n\n if (shouldSkip) {\n emitAgentLog(\n config,\n 'debug',\n 'graph',\n 'Summarization skipped — no new messages or per-run cap reached',\n {\n messageCount: messages.length,\n messagesToRefineCount: messagesToRefine.length,\n contextLength: context.length,\n },\n { runId: this.runId, agentId }\n );\n }\n }\n }\n\n let finalMessages = messagesToUse;\n if (agentContext.useLegacyContent) {\n finalMessages = formatContentStrings(finalMessages);\n }\n\n const lastMessageX =\n finalMessages.length >= 2\n ? finalMessages[finalMessages.length - 2]\n : null;\n const lastMessageY =\n finalMessages.length >= 1\n ? finalMessages[finalMessages.length - 1]\n : null;\n\n const anthropicLike = isAnthropicLike(\n agentContext.provider,\n agentContext.clientOptions as { model?: string }\n );\n\n if (\n agentContext.provider === Providers.BEDROCK &&\n lastMessageX instanceof AIMessageChunk &&\n lastMessageY instanceof ToolMessage &&\n typeof lastMessageX.content === 'string'\n ) {\n const trimmed = lastMessageX.content.trim();\n finalMessages[finalMessages.length - 2].content =\n trimmed.length > 0 ? [{ type: 'text' as const, text: trimmed }] : '';\n }\n\n if (lastMessageY instanceof ToolMessage) {\n if (anthropicLike) {\n formatAnthropicArtifactContent(finalMessages);\n } else if (\n (isOpenAILike(agentContext.provider) &&\n agentContext.provider !== Providers.DEEPSEEK) ||\n isGoogleLike(agentContext.provider)\n ) {\n formatArtifactPayload(finalMessages);\n }\n }\n\n if (agentContext.provider === Providers.ANTHROPIC) {\n const anthropicOptions = agentContext.clientOptions as\n | t.AnthropicClientOptions\n | undefined;\n if (\n anthropicOptions?.promptCache === true &&\n !agentContext.systemRunnable\n ) {\n finalMessages = addCacheControl<BaseMessage>(finalMessages);\n }\n } else if (agentContext.provider === Providers.BEDROCK) {\n const bedrockOptions = agentContext.clientOptions as\n | t.BedrockAnthropicClientOptions\n | undefined;\n if (bedrockOptions?.promptCache === true) {\n finalMessages = addBedrockCacheControl<BaseMessage>(finalMessages);\n }\n }\n\n if (\n isThinkingEnabled(agentContext.provider, agentContext.clientOptions)\n ) {\n finalMessages = ensureThinkingBlockInMessages(\n finalMessages,\n agentContext.provider,\n config\n );\n }\n\n // Intentionally broad: runs when the pruner wasn't used OR any post-pruning\n // transform (addCacheControl, ensureThinkingBlock, etc.) reassigned finalMessages.\n // sanitizeOrphanToolBlocks fast-paths to a Set diff check when no orphans exist,\n // so the cost is negligible and this acts as a safety net for Anthropic/Bedrock.\n const needsOrphanSanitize =\n anthropicLike &&\n (!agentContext.pruneMessages || finalMessages !== messagesToUse);\n if (needsOrphanSanitize) {\n const beforeSanitize = finalMessages.length;\n finalMessages = sanitizeOrphanToolBlocks(finalMessages);\n if (finalMessages.length !== beforeSanitize) {\n emitAgentLog(\n config,\n 'warn',\n 'sanitize',\n 'Orphan tool blocks removed',\n {\n before: beforeSanitize,\n after: finalMessages.length,\n dropped: beforeSanitize - finalMessages.length,\n },\n { runId: this.runId, agentId }\n );\n }\n }\n\n if (\n agentContext.lastStreamCall != null &&\n agentContext.streamBuffer != null\n ) {\n const timeSinceLastCall = Date.now() - agentContext.lastStreamCall;\n if (timeSinceLastCall < agentContext.streamBuffer) {\n const timeToWait =\n Math.ceil((agentContext.streamBuffer - timeSinceLastCall) / 1000) *\n 1000;\n await sleep(timeToWait);\n }\n }\n\n agentContext.lastStreamCall = Date.now();\n agentContext.markTokensStale();\n\n let result: Partial<t.BaseGraphState> | undefined;\n const fallbacks =\n (agentContext.clientOptions as t.LLMConfig | undefined)?.fallbacks ??\n [];\n\n if (\n finalMessages.length === 0 &&\n !agentContext.hasPendingCompactionSummary()\n ) {\n const budgetBreakdown = agentContext.getTokenBudgetBreakdown(messages);\n const breakdown = agentContext.formatTokenBudgetBreakdown(messages);\n const instructionsExceedBudget =\n budgetBreakdown.instructionTokens > budgetBreakdown.maxContextTokens;\n\n let guidance: string;\n if (instructionsExceedBudget) {\n const toolPct =\n budgetBreakdown.toolSchemaTokens > 0\n ? Math.round(\n (budgetBreakdown.toolSchemaTokens /\n budgetBreakdown.instructionTokens) *\n 100\n )\n : 0;\n guidance =\n toolPct > 50\n ? `Tool definitions consume ${budgetBreakdown.toolSchemaTokens} tokens (${toolPct}% of instructions) across ${budgetBreakdown.toolCount} tools, exceeding maxContextTokens (${budgetBreakdown.maxContextTokens}). Reduce the number of tools or increase maxContextTokens.`\n : `Instructions (${budgetBreakdown.instructionTokens} tokens) exceed maxContextTokens (${budgetBreakdown.maxContextTokens}). Increase maxContextTokens or shorten the system prompt.`;\n if (agentContext.summarizationEnabled === true) {\n guidance +=\n ' Summarization was skipped because the summary would further increase the instruction overhead.';\n }\n } else {\n guidance =\n 'Please increase the context window size or make your message shorter.';\n }\n\n emitAgentLog(\n config,\n 'error',\n 'graph',\n 'Empty messages after pruning',\n {\n messageCount: messages.length,\n instructionsExceedBudget,\n breakdown,\n },\n { runId: this.runId, agentId }\n );\n throw new Error(\n JSON.stringify({\n type: 'empty_messages',\n info: `Message pruning removed all messages as none fit in the context window. ${guidance}\\n${breakdown}`,\n })\n );\n }\n\n const invokeStart = Date.now();\n const invokeMeta = { runId: this.runId, agentId };\n emitAgentLog(\n config,\n 'debug',\n 'graph',\n 'Invoking LLM',\n {\n messageCount: finalMessages.length,\n provider: agentContext.provider,\n },\n invokeMeta,\n { force: true }\n );\n\n try {\n result = await attemptInvoke(\n {\n model: (this.overrideModel ?? model) as t.ChatModel,\n messages: finalMessages,\n provider: agentContext.provider,\n context: this,\n },\n config\n );\n } catch (primaryError) {\n result = await tryFallbackProviders({\n fallbacks,\n tools: agentContext.tools,\n messages: finalMessages,\n config,\n primaryError,\n context: this,\n });\n }\n\n if (!result) {\n throw new Error('No result after model invocation');\n }\n\n /**\n * Fallback: populate toolCallStepIds in the graph execution context.\n *\n * When model.stream() is available (the common case), attemptInvoke\n * processes all chunks through a local ChatModelStreamHandler which\n * creates run steps and populates toolCallStepIds before returning.\n * The code below is a fallback for the rare case where model.stream\n * is unavailable and model.invoke() was used instead.\n *\n * Text content is dispatched FIRST so that MESSAGE_CREATION is the\n * current step when handleToolCalls runs. handleToolCalls then creates\n * TOOL_CALLS on top of it. The dedup in getMessageId and\n * toolCallStepIds.has makes this safe when attemptInvoke already\n * handled everything — both paths become no-ops.\n */\n const responseMessage = result.messages?.[0];\n const toolCalls = (responseMessage as AIMessageChunk | undefined)\n ?.tool_calls;\n const hasToolCalls = Array.isArray(toolCalls) && toolCalls.length > 0;\n\n if (hasToolCalls) {\n const metadata = config.metadata as Record<string, unknown>;\n const stepKey = this.getStepKey(metadata);\n const content = responseMessage?.content as MessageContent | undefined;\n const hasTextContent =\n content != null &&\n (typeof content === 'string'\n ? content !== ''\n : Array.isArray(content) && content.length > 0);\n\n /**\n * Dispatch text content BEFORE creating TOOL_CALLS steps.\n * getMessageId returns a new ID only on the first call for a step key;\n * if the for-await consumer already claimed it, this is a no-op.\n */\n if (hasTextContent) {\n const messageId = getMessageId(stepKey, this) ?? '';\n if (messageId) {\n await this.dispatchRunStep(\n stepKey,\n {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: { message_id: messageId },\n },\n metadata\n );\n const stepId = this.getStepIdByKey(stepKey);\n if (typeof content === 'string') {\n await this.dispatchMessageDelta(stepId, {\n content: [{ type: ContentTypes.TEXT, text: content }],\n });\n } else if (\n Array.isArray(content) &&\n content.every(\n (c) =>\n typeof c === 'object' &&\n 'type' in c &&\n typeof c.type === 'string' &&\n c.type.startsWith('text')\n )\n ) {\n await this.dispatchMessageDelta(stepId, {\n content: content as t.MessageDelta['content'],\n });\n }\n }\n }\n\n await handleToolCalls(toolCalls as ToolCall[], metadata, this);\n }\n\n /**\n * When streaming is disabled, on_chat_model_stream events are never\n * emitted so ChatModelStreamHandler never fires. Dispatch the text\n * content as MESSAGE_CREATION + MESSAGE_DELTA here.\n */\n const disableStreaming =\n (agentContext.clientOptions as t.OpenAIClientOptions | undefined)\n ?.disableStreaming === true;\n\n if (\n disableStreaming &&\n !hasToolCalls &&\n responseMessage != null &&\n (responseMessage.content as MessageContent | undefined) != null\n ) {\n const metadata = config.metadata as Record<string, unknown>;\n const stepKey = this.getStepKey(metadata);\n const messageId = getMessageId(stepKey, this) ?? '';\n if (messageId) {\n await this.dispatchRunStep(\n stepKey,\n {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: { message_id: messageId },\n },\n metadata\n );\n const stepId = this.getStepIdByKey(stepKey);\n const content = responseMessage.content;\n if (typeof content === 'string') {\n await this.dispatchMessageDelta(stepId, {\n content: [{ type: ContentTypes.TEXT, text: content }],\n });\n } else if (\n Array.isArray(content) &&\n content.every(\n (c) =>\n typeof c === 'object' &&\n 'type' in c &&\n typeof c.type === 'string' &&\n c.type.startsWith('text')\n )\n ) {\n await this.dispatchMessageDelta(stepId, {\n content: content as t.MessageDelta['content'],\n });\n }\n }\n }\n\n const invokeElapsed = ((Date.now() - invokeStart) / 1000).toFixed(2);\n agentContext.currentUsage = this.getUsageMetadata(result.messages?.[0]);\n if (agentContext.currentUsage) {\n agentContext.updateLastCallUsage(agentContext.currentUsage);\n emitAgentLog(\n config,\n 'debug',\n 'graph',\n `LLM call complete (${invokeElapsed}s)`,\n {\n ...agentContext.currentUsage,\n elapsedSeconds: Number(invokeElapsed),\n instructionTokens: agentContext.instructionTokens,\n toolSchemaTokens: agentContext.toolSchemaTokens,\n messageCount: finalMessages.length,\n },\n invokeMeta,\n { force: true }\n );\n } else {\n emitAgentLog(\n config,\n 'debug',\n 'graph',\n `LLM call complete (${invokeElapsed}s)`,\n {\n elapsedSeconds: Number(invokeElapsed),\n messageCount: finalMessages.length,\n },\n invokeMeta,\n { force: true }\n );\n }\n this.cleanupSignalListener();\n return result;\n };\n }\n\n createAgentNode(agentId: string): t.CompiledAgentWorfklow {\n const getConfig = (): RunnableConfig | undefined => this.config;\n const agentContext = this.agentContexts.get(agentId);\n if (!agentContext) {\n throw new Error(`Agent context not found for agentId: ${agentId}`);\n }\n\n const agentNode = `${AGENT}${agentId}` as const;\n const toolNode = `${TOOLS}${agentId}` as const;\n const summarizeNode = `${SUMMARIZE}${agentId}` as const;\n\n const routeMessage = (\n state: t.AgentSubgraphState,\n config?: RunnableConfig\n ): string => {\n this.config = config;\n if (state.summarizationRequest != null) {\n return summarizeNode;\n }\n return toolsCondition(\n state as t.BaseGraphState,\n toolNode,\n this.invokedToolIds\n );\n };\n\n const StateAnnotation = Annotation.Root({\n messages: Annotation<BaseMessage[]>({\n reducer: messagesStateReducer,\n default: () => [],\n }),\n summarizationRequest: Annotation<t.SummarizationNodeInput | undefined>({\n reducer: (\n _: t.SummarizationNodeInput | undefined,\n b: t.SummarizationNodeInput | undefined\n ) => b,\n default: () => undefined,\n }),\n });\n\n const workflow = new StateGraph(StateAnnotation)\n .addNode(agentNode, this.createCallModel(agentId))\n .addNode(\n toolNode,\n this.initializeTools({\n currentTools: agentContext.tools,\n currentToolMap: agentContext.toolMap,\n agentContext,\n })\n )\n .addNode(\n summarizeNode,\n createSummarizeNode({\n agentContext,\n graph: {\n contentData: this.contentData,\n contentIndexMap: this.contentIndexMap,\n get config() {\n return getConfig();\n },\n runId: this.runId,\n isMultiAgent: this.isMultiAgentGraph(),\n dispatchRunStep: async (runStep, nodeConfig) => {\n this.contentData.push(runStep);\n this.contentIndexMap.set(runStep.id, runStep.index);\n\n const resolvedConfig = nodeConfig ?? this.config;\n const handler = this.handlerRegistry?.getHandler(\n GraphEvents.ON_RUN_STEP\n );\n if (handler) {\n await handler.handle(\n GraphEvents.ON_RUN_STEP,\n runStep,\n resolvedConfig?.configurable,\n this\n );\n this.handlerDispatchedStepIds.add(runStep.id);\n }\n\n if (resolvedConfig) {\n await safeDispatchCustomEvent(\n GraphEvents.ON_RUN_STEP,\n runStep,\n resolvedConfig\n );\n }\n },\n dispatchRunStepCompleted: async (\n stepId: string,\n result: t.StepCompleted,\n nodeConfig?: RunnableConfig\n ) => {\n const resolvedConfig = nodeConfig ?? this.config;\n const runStep = this.contentData.find((s) => s.id === stepId);\n const handler = this.handlerRegistry?.getHandler(\n GraphEvents.ON_RUN_STEP_COMPLETED\n );\n if (handler) {\n await handler.handle(\n GraphEvents.ON_RUN_STEP_COMPLETED,\n {\n result: {\n ...result,\n id: stepId,\n index: runStep?.index ?? 0,\n },\n },\n resolvedConfig?.configurable,\n this\n );\n }\n },\n },\n generateStepId: (stepKey: string) => this.generateStepId(stepKey),\n })\n )\n .addEdge(START, agentNode)\n .addConditionalEdges(agentNode, routeMessage)\n .addEdge(summarizeNode, agentNode)\n .addEdge(toolNode, agentContext.toolEnd ? END : agentNode);\n\n return workflow.compile();\n }\n\n createWorkflow(): t.CompiledStateWorkflow {\n const agentNode = this.createAgentNode(this.defaultAgentId);\n const StateAnnotation = Annotation.Root({\n messages: Annotation<BaseMessage[]>({\n reducer: (a, b) => {\n if (!a.length) {\n this.startIndex = a.length + b.length;\n }\n const result = messagesStateReducer(a, b);\n this.messages = result;\n return result;\n },\n default: () => [],\n }),\n });\n const workflow = new StateGraph(StateAnnotation)\n .addNode(this.defaultAgentId, agentNode, { ends: [END] })\n .addEdge(START, this.defaultAgentId)\n // LangGraph compile() types are overly strict for opt-in options\n .compile(this.compileOptions as unknown as never);\n\n return workflow;\n }\n\n /**\n * Indicates if this is a multi-agent graph.\n * Override in MultiAgentGraph to return true.\n * Used to conditionally include agentId in RunStep for frontend rendering.\n */\n protected isMultiAgentGraph(): boolean {\n return false;\n }\n\n /**\n * Get the parallel group ID for an agent, if any.\n * Override in MultiAgentGraph to provide actual group IDs.\n * Group IDs are incrementing numbers (1, 2, 3...) reflecting execution order.\n * @param _agentId - The agent ID to look up\n * @returns undefined for StandardGraph (no parallel groups), or group number for MultiAgentGraph\n */\n protected getParallelGroupIdForAgent(_agentId: string): number | undefined {\n return undefined;\n }\n\n /* Dispatchers */\n\n /**\n * Dispatches a run step to the client, returns the step ID\n */\n async dispatchRunStep(\n stepKey: string,\n stepDetails: t.StepDetails,\n metadata?: Record<string, unknown>\n ): Promise<string> {\n if (!this.config) {\n throw new Error('No config provided');\n }\n\n const [stepId, stepIndex] = this.generateStepId(stepKey);\n if (stepDetails.type === StepTypes.TOOL_CALLS && stepDetails.tool_calls) {\n for (const tool_call of stepDetails.tool_calls) {\n const toolCallId = tool_call.id ?? '';\n if (!toolCallId || this.toolCallStepIds.has(toolCallId)) {\n continue;\n }\n this.toolCallStepIds.set(toolCallId, stepId);\n }\n }\n\n const runStep: t.RunStep = {\n stepIndex,\n id: stepId,\n type: stepDetails.type,\n index: this.contentData.length,\n stepDetails,\n usage: null,\n };\n\n const runId = this.runId ?? '';\n if (runId) {\n runStep.runId = runId;\n }\n\n if (metadata) {\n try {\n const agentContext = this.getAgentContext(metadata);\n if (this.isMultiAgentGraph() && agentContext.agentId) {\n runStep.agentId = agentContext.agentId;\n const groupId = this.getParallelGroupIdForAgent(agentContext.agentId);\n if (groupId != null) {\n runStep.groupId = groupId;\n }\n }\n } catch (_e) {\n /** If we can't get agent context, that's okay - agentId remains undefined */\n }\n }\n\n this.contentData.push(runStep);\n this.contentIndexMap.set(stepId, runStep.index);\n\n // Primary dispatch: handler registry (reliable, always works).\n // This mirrors how handleToolCallCompleted dispatches ON_RUN_STEP_COMPLETED\n // via the handler registry, ensuring the event always reaches the handler\n // even when LangGraph's callback system drops the custom event.\n const handler = this.handlerRegistry?.getHandler(GraphEvents.ON_RUN_STEP);\n if (handler) {\n await handler.handle(GraphEvents.ON_RUN_STEP, runStep, metadata, this);\n this.handlerDispatchedStepIds.add(stepId);\n }\n\n // Secondary dispatch: custom event for LangGraph callback chain\n // (tracing, Langfuse, external consumers). May be silently dropped\n // in some scenarios (stale run ID, subgraph callback propagation issues),\n // but the primary dispatch above guarantees the event reaches the handler.\n // The customEventCallback in run.ts skips events already dispatched above\n // to prevent double handling.\n await safeDispatchCustomEvent(\n GraphEvents.ON_RUN_STEP,\n runStep,\n this.config\n );\n return stepId;\n }\n\n /**\n * Static version of handleToolCallError to avoid creating strong references\n * that prevent garbage collection\n */\n static async handleToolCallErrorStatic(\n graph: StandardGraph,\n data: t.ToolErrorData,\n metadata?: Record<string, unknown>\n ): Promise<void> {\n if (!graph.config) {\n throw new Error('No config provided');\n }\n\n if (!data.id) {\n console.warn('No Tool ID provided for Tool Error');\n return;\n }\n\n const stepId = graph.toolCallStepIds.get(data.id) ?? '';\n if (!stepId) {\n throw new Error(`No stepId found for tool_call_id ${data.id}`);\n }\n\n const { name, input: args, error } = data;\n\n const runStep = graph.getRunStep(stepId);\n if (!runStep) {\n throw new Error(`No run step found for stepId ${stepId}`);\n }\n\n const tool_call: t.ProcessedToolCall = {\n id: data.id,\n name: name || '',\n args: typeof args === 'string' ? args : JSON.stringify(args),\n output: `Error processing tool${error?.message != null ? `: ${error.message}` : ''}`,\n progress: 1,\n };\n\n await graph.handlerRegistry\n ?.getHandler(GraphEvents.ON_RUN_STEP_COMPLETED)\n ?.handle(\n GraphEvents.ON_RUN_STEP_COMPLETED,\n {\n result: {\n id: stepId,\n index: runStep.index,\n type: 'tool_call',\n tool_call,\n } as t.ToolCompleteEvent,\n },\n metadata,\n graph\n );\n }\n\n /**\n * Instance method that delegates to the static method\n * Kept for backward compatibility\n */\n async handleToolCallError(\n data: t.ToolErrorData,\n metadata?: Record<string, unknown>\n ): Promise<void> {\n await StandardGraph.handleToolCallErrorStatic(this, data, metadata);\n }\n\n async dispatchRunStepDelta(\n id: string,\n delta: t.ToolCallDelta\n ): Promise<void> {\n if (!this.config) {\n throw new Error('No config provided');\n } else if (!id) {\n throw new Error('No step ID found');\n }\n const runStepDelta: t.RunStepDeltaEvent = {\n id,\n delta,\n };\n await safeDispatchCustomEvent(\n GraphEvents.ON_RUN_STEP_DELTA,\n runStepDelta,\n this.config\n );\n }\n\n async dispatchMessageDelta(id: string, delta: t.MessageDelta): Promise<void> {\n if (!this.config) {\n throw new Error('No config provided');\n }\n const messageDelta: t.MessageDeltaEvent = {\n id,\n delta,\n };\n await safeDispatchCustomEvent(\n GraphEvents.ON_MESSAGE_DELTA,\n messageDelta,\n this.config\n );\n }\n\n dispatchReasoningDelta = async (\n stepId: string,\n delta: t.ReasoningDelta\n ): Promise<void> => {\n if (!this.config) {\n throw new Error('No config provided');\n }\n const reasoningDelta: t.ReasoningDeltaEvent = {\n id: stepId,\n delta,\n };\n await safeDispatchCustomEvent(\n GraphEvents.ON_REASONING_DELTA,\n reasoningDelta,\n this.config\n );\n };\n}\n"],"names":["GraphNodeKeys","AgentContext","resetIfNotEmpty","joinKeys","nanoid","ContentTypes","convertMessagesToContent","createSchemaOnlyTools","CustomToolNode","createFakeStreamingLLM","messages","extractToolDiscoveries","initializeModel","createPruneMessages","isThinkingEnabled","emitAgentLog","shouldTriggerSummarization","formatContentStrings","isAnthropicLike","Providers","AIMessageChunk","ToolMessage","formatAnthropicArtifactContent","isOpenAILike","isGoogleLike","formatArtifactPayload","addCacheControl","addBedrockCacheControl","ensureThinkingBlockInMessages","sanitizeOrphanToolBlocks","sleep","attemptInvoke","tryFallbackProviders","getMessageId","StepTypes","handleToolCalls","toolsCondition","Annotation","messagesStateReducer","StateGraph","createSummarizeNode","GraphEvents","safeDispatchCustomEvent","START","END"],"mappings":"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"}
1
+ {"version":3,"file":"Graph.cjs","sources":["../../../src/graphs/Graph.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { nanoid } from 'nanoid';\nimport { tool } from '@langchain/core/tools';\nimport { ToolNode } from '@langchain/langgraph/prebuilt';\nimport { Runnable, RunnableConfig } from '@langchain/core/runnables';\nimport { ToolMessage, AIMessageChunk } from '@langchain/core/messages';\nimport { START, END, StateGraph, Annotation } from '@langchain/langgraph';\nimport type {\n UsageMetadata,\n BaseMessage,\n MessageContent,\n} from '@langchain/core/messages';\nimport type { ToolCall } from '@langchain/core/messages/tool';\nimport type * as t from '@/types';\nimport {\n formatAnthropicArtifactContent,\n ensureThinkingBlockInMessages,\n convertMessagesToContent,\n sanitizeOrphanToolBlocks,\n extractToolDiscoveries,\n addBedrockCacheControl,\n formatArtifactPayload,\n formatContentStrings,\n createPruneMessages,\n addCacheControl,\n getMessageId,\n} from '@/messages';\nimport {\n GraphNodeKeys,\n ContentTypes,\n GraphEvents,\n Providers,\n StepTypes,\n} from '@/common';\nimport {\n resetIfNotEmpty,\n isAnthropicLike,\n isOpenAILike,\n isGoogleLike,\n joinKeys,\n sleep,\n} from '@/utils';\nimport { SubagentExecutor, resolveSubagentConfigs } from '@/tools/subagent';\nimport { buildSubagentToolParams } from '@/tools/SubagentTool';\nimport { ToolNode as CustomToolNode, toolsCondition } from '@/tools/ToolNode';\nimport { safeDispatchCustomEvent, emitAgentLog } from '@/utils/events';\nimport { attemptInvoke, tryFallbackProviders } from '@/llm/invoke';\nimport { shouldTriggerSummarization } from '@/summarization';\nimport { createSummarizeNode } from '@/summarization/node';\nimport { messagesStateReducer } from '@/messages/reducer';\nimport { createSchemaOnlyTools } from '@/tools/schema';\nimport { AgentContext } from '@/agents/AgentContext';\nimport { createFakeStreamingLLM } from '@/llm/fake';\nimport { handleToolCalls } from '@/tools/handlers';\nimport { isThinkingEnabled } from '@/llm/request';\nimport { initializeModel } from '@/llm/init';\nimport { HandlerRegistry } from '@/events';\nimport { ChatOpenAI } from '@/llm/openai';\nimport type { HookRegistry } from '@/hooks';\n\nconst { AGENT, TOOLS, SUMMARIZE } = GraphNodeKeys;\n\n/** Minimum relative variance before calibrated toolSchemaTokens overrides current value. */\nconst CALIBRATION_VARIANCE_THRESHOLD = 0.15;\n\nexport abstract class Graph<\n T extends t.BaseGraphState = t.BaseGraphState,\n _TNodeName extends string = string,\n> {\n abstract resetValues(): void;\n abstract initializeTools({\n currentTools,\n currentToolMap,\n }: {\n currentTools?: t.GraphTools;\n currentToolMap?: t.ToolMap;\n }): CustomToolNode<T> | ToolNode<T>;\n abstract getRunMessages(): BaseMessage[] | undefined;\n abstract getContentParts(): t.MessageContentComplex[] | undefined;\n abstract generateStepId(stepKey: string): [string, number];\n abstract getKeyList(\n metadata: Record<string, unknown> | undefined\n ): (string | number | undefined)[];\n abstract getStepKey(metadata: Record<string, unknown> | undefined): string;\n abstract checkKeyList(keyList: (string | number | undefined)[]): boolean;\n abstract getStepIdByKey(stepKey: string, index?: number): string;\n abstract getRunStep(stepId: string): t.RunStep | undefined;\n abstract dispatchRunStep(\n stepKey: string,\n stepDetails: t.StepDetails,\n metadata?: Record<string, unknown>\n ): Promise<string>;\n abstract dispatchRunStepDelta(\n id: string,\n delta: t.ToolCallDelta\n ): Promise<void>;\n abstract dispatchMessageDelta(\n id: string,\n delta: t.MessageDelta\n ): Promise<void>;\n abstract dispatchReasoningDelta(\n stepId: string,\n delta: t.ReasoningDelta\n ): Promise<void>;\n abstract createCallModel(\n agentId?: string,\n currentModel?: t.ChatModel\n ): (\n state: t.AgentSubgraphState,\n config?: RunnableConfig\n ) => Promise<Partial<t.AgentSubgraphState>>;\n messageStepHasToolCalls: Map<string, boolean> = new Map();\n messageIdsByStepKey: Map<string, string> = new Map();\n prelimMessageIdsByStepKey: Map<string, string> = new Map();\n config: RunnableConfig | undefined;\n contentData: t.RunStep[] = [];\n stepKeyIds: Map<string, string[]> = new Map<string, string[]>();\n contentIndexMap: Map<string, number> = new Map();\n toolCallStepIds: Map<string, string> = new Map();\n /**\n * Step IDs that have been dispatched via handler registry directly\n * (in dispatchRunStep). Used by the custom event callback to skip\n * duplicate dispatch through the LangGraph callback chain.\n */\n handlerDispatchedStepIds: Set<string> = new Set();\n signal?: AbortSignal;\n /** Set of invoked tool call IDs from non-message run steps completed mid-run, if any */\n invokedToolIds?: Set<string>;\n handlerRegistry: HandlerRegistry | undefined;\n hookRegistry: HookRegistry | undefined;\n /**\n * Tool session contexts for automatic state persistence across tool invocations.\n * Keyed by tool name (e.g., Constants.EXECUTE_CODE).\n * Currently supports code execution session tracking (session_id, files).\n */\n sessions: t.ToolSessionMap = new Map();\n\n /**\n * Clears heavy references to allow GC to reclaim memory held by\n * LangGraph's internal config / AsyncLocalStorage RunTree chain.\n * Call after a run completes and content has been extracted.\n */\n clearHeavyState(): void {\n this.config = undefined;\n this.signal = undefined;\n this.contentData = [];\n this.contentIndexMap = new Map();\n this.stepKeyIds = new Map();\n this.toolCallStepIds.clear();\n this.messageIdsByStepKey = new Map();\n this.messageStepHasToolCalls = new Map();\n this.prelimMessageIdsByStepKey = new Map();\n this.invokedToolIds = undefined;\n this.handlerRegistry = undefined;\n this.hookRegistry = undefined;\n this.sessions.clear();\n }\n}\n\nexport class StandardGraph extends Graph<t.BaseGraphState, t.GraphNode> {\n overrideModel?: t.ChatModel;\n /** Optional compile options passed into workflow.compile() */\n compileOptions?: t.CompileOptions | undefined;\n messages: BaseMessage[] = [];\n /** Cached run messages preserved before clearHeavyState() so getRunMessages() works after cleanup. */\n private cachedRunMessages?: BaseMessage[];\n runId: string | undefined;\n /**\n * Boundary between historical messages (loaded from conversation state)\n * and messages produced during the current run. Set once in the state\n * reducer when messages first arrive. Used by `getRunMessages()` and\n * multi-agent message filtering — NOT for pruner token counting (the\n * pruner maintains its own `lastTurnStartIndex` in its closure).\n */\n startIndex: number = 0;\n signal?: AbortSignal;\n /** Map of agent contexts by agent ID */\n agentContexts: Map<string, AgentContext> = new Map();\n /** Default agent ID to use */\n defaultAgentId: string;\n\n constructor({\n runId,\n signal,\n agents,\n tokenCounter,\n indexTokenCountMap,\n calibrationRatio,\n }: t.StandardGraphInput) {\n super();\n this.runId = runId;\n this.signal = signal;\n\n if (agents.length === 0) {\n throw new Error('At least one agent configuration is required');\n }\n\n for (const agentConfig of agents) {\n const agentContext = AgentContext.fromConfig(\n agentConfig,\n tokenCounter,\n indexTokenCountMap\n );\n if (calibrationRatio != null && calibrationRatio > 0) {\n agentContext.calibrationRatio = calibrationRatio;\n }\n\n this.agentContexts.set(agentConfig.agentId, agentContext);\n }\n\n this.defaultAgentId = agents[0].agentId;\n }\n\n /* Init */\n\n resetValues(keepContent?: boolean): void {\n this.messages = [];\n this.cachedRunMessages = undefined;\n this.config = resetIfNotEmpty(this.config, undefined);\n if (keepContent !== true) {\n this.contentData = resetIfNotEmpty(this.contentData, []);\n this.contentIndexMap = resetIfNotEmpty(this.contentIndexMap, new Map());\n }\n this.stepKeyIds = resetIfNotEmpty(this.stepKeyIds, new Map());\n /**\n * Clear in-place instead of replacing with a new Map to preserve the\n * shared reference held by ToolNode (passed at construction time).\n * Using resetIfNotEmpty would create a new Map, leaving ToolNode with\n * a stale reference on 2nd+ processStream calls.\n */\n this.toolCallStepIds.clear();\n this.handlerDispatchedStepIds = resetIfNotEmpty(\n this.handlerDispatchedStepIds,\n new Set()\n );\n this.messageIdsByStepKey = resetIfNotEmpty(\n this.messageIdsByStepKey,\n new Map()\n );\n this.messageStepHasToolCalls = resetIfNotEmpty(\n this.messageStepHasToolCalls,\n new Map()\n );\n this.prelimMessageIdsByStepKey = resetIfNotEmpty(\n this.prelimMessageIdsByStepKey,\n new Map()\n );\n this.invokedToolIds = resetIfNotEmpty(this.invokedToolIds, undefined);\n for (const context of this.agentContexts.values()) {\n context.reset();\n }\n }\n\n override clearHeavyState(): void {\n this.cachedRunMessages = this.messages.slice(this.startIndex);\n super.clearHeavyState();\n this.messages = [];\n this.overrideModel = undefined;\n for (const context of this.agentContexts.values()) {\n context.reset();\n }\n }\n\n /* Run Step Processing */\n\n getRunStep(stepId: string): t.RunStep | undefined {\n const index = this.contentIndexMap.get(stepId);\n if (index !== undefined) {\n return this.contentData[index];\n }\n return undefined;\n }\n\n getAgentContext(metadata: Record<string, unknown> | undefined): AgentContext {\n if (!metadata) {\n throw new Error('No metadata provided to retrieve agent context');\n }\n\n const currentNode = metadata.langgraph_node as string;\n if (!currentNode) {\n throw new Error(\n 'No langgraph_node in metadata to retrieve agent context'\n );\n }\n\n let agentId: string | undefined;\n if (currentNode.startsWith(AGENT)) {\n agentId = currentNode.substring(AGENT.length);\n } else if (currentNode.startsWith(TOOLS)) {\n agentId = currentNode.substring(TOOLS.length);\n } else if (currentNode.startsWith(SUMMARIZE)) {\n agentId = currentNode.substring(SUMMARIZE.length);\n }\n\n const agentContext = this.agentContexts.get(agentId ?? '');\n if (!agentContext) {\n throw new Error(`No agent context found for agent ID ${agentId}`);\n }\n\n return agentContext;\n }\n\n getStepKey(metadata: Record<string, unknown> | undefined): string {\n if (!metadata) return '';\n\n const keyList = this.getKeyList(metadata);\n if (this.checkKeyList(keyList)) {\n throw new Error('Missing metadata');\n }\n\n return joinKeys(keyList);\n }\n\n getStepIdByKey(stepKey: string, index?: number): string {\n const stepIds = this.stepKeyIds.get(stepKey);\n if (!stepIds) {\n throw new Error(`No step IDs found for stepKey ${stepKey}`);\n }\n\n if (index === undefined) {\n return stepIds[stepIds.length - 1];\n }\n\n return stepIds[index];\n }\n\n generateStepId(stepKey: string): [string, number] {\n const stepIds = this.stepKeyIds.get(stepKey);\n let newStepId: string | undefined;\n let stepIndex = 0;\n if (stepIds) {\n stepIndex = stepIds.length;\n newStepId = `step_${nanoid()}`;\n stepIds.push(newStepId);\n this.stepKeyIds.set(stepKey, stepIds);\n } else {\n newStepId = `step_${nanoid()}`;\n this.stepKeyIds.set(stepKey, [newStepId]);\n }\n\n return [newStepId, stepIndex];\n }\n\n getKeyList(\n metadata: Record<string, unknown> | undefined\n ): (string | number | undefined)[] {\n if (!metadata) return [];\n\n const keyList = [\n metadata.run_id as string,\n metadata.thread_id as string,\n metadata.langgraph_node as string,\n metadata.langgraph_step as number,\n metadata.checkpoint_ns as string,\n ];\n\n const agentContext = this.getAgentContext(metadata);\n if (\n agentContext.currentTokenType === ContentTypes.THINK ||\n agentContext.currentTokenType === 'think_and_text'\n ) {\n keyList.push('reasoning');\n } else if (agentContext.tokenTypeSwitch === 'content') {\n keyList.push(`post-reasoning-${agentContext.reasoningTransitionCount}`);\n }\n\n if (this.invokedToolIds != null && this.invokedToolIds.size > 0) {\n keyList.push(this.invokedToolIds.size + '');\n }\n\n return keyList;\n }\n\n checkKeyList(keyList: (string | number | undefined)[]): boolean {\n return keyList.some((key) => key === undefined);\n }\n\n /* Misc.*/\n\n getRunMessages(): BaseMessage[] | undefined {\n if (this.messages.length === 0 && this.cachedRunMessages != null) {\n return this.cachedRunMessages;\n }\n return this.messages.slice(this.startIndex);\n }\n\n getContentParts(): t.MessageContentComplex[] | undefined {\n return convertMessagesToContent(this.messages.slice(this.startIndex));\n }\n\n getCalibrationRatio(): number {\n const context = this.agentContexts.get(this.defaultAgentId);\n return context?.calibrationRatio ?? 1;\n }\n\n getResolvedInstructionOverhead(): number | undefined {\n const context = this.agentContexts.get(this.defaultAgentId);\n return context?.resolvedInstructionOverhead;\n }\n\n getToolCount(): number {\n const context = this.agentContexts.get(this.defaultAgentId);\n return (\n (context?.tools?.length ?? 0) + (context?.toolDefinitions?.length ?? 0)\n );\n }\n\n /**\n * Get all run steps, optionally filtered by agent ID\n */\n getRunSteps(agentId?: string): t.RunStep[] {\n if (agentId == null || agentId === '') {\n return [...this.contentData];\n }\n return this.contentData.filter((step) => step.agentId === agentId);\n }\n\n /**\n * Get run steps grouped by agent ID\n */\n getRunStepsByAgent(): Map<string, t.RunStep[]> {\n const stepsByAgent = new Map<string, t.RunStep[]>();\n\n for (const step of this.contentData) {\n if (step.agentId == null || step.agentId === '') continue;\n\n const steps = stepsByAgent.get(step.agentId) ?? [];\n steps.push(step);\n stepsByAgent.set(step.agentId, steps);\n }\n\n return stepsByAgent;\n }\n\n /**\n * Get agent IDs that participated in this run\n */\n getActiveAgentIds(): string[] {\n const agentIds = new Set<string>();\n for (const step of this.contentData) {\n if (step.agentId != null && step.agentId !== '') {\n agentIds.add(step.agentId);\n }\n }\n return Array.from(agentIds);\n }\n\n /**\n * Maps contentPart indices to agent IDs for post-run analysis\n * Returns a map where key is the contentPart index and value is the agentId\n */\n getContentPartAgentMap(): Map<number, string> {\n const contentPartAgentMap = new Map<number, string>();\n\n for (const step of this.contentData) {\n if (\n step.agentId != null &&\n step.agentId !== '' &&\n Number.isFinite(step.index)\n ) {\n contentPartAgentMap.set(step.index, step.agentId);\n }\n }\n\n return contentPartAgentMap;\n }\n\n /* Graph */\n\n initializeTools({\n currentTools,\n currentToolMap,\n agentContext,\n }: {\n currentTools?: t.GraphTools;\n currentToolMap?: t.ToolMap;\n agentContext?: AgentContext;\n }): CustomToolNode<t.BaseGraphState> | ToolNode<t.BaseGraphState> {\n const toolDefinitions = agentContext?.toolDefinitions;\n const eventDrivenMode =\n toolDefinitions != null && toolDefinitions.length > 0;\n\n if (eventDrivenMode) {\n const schemaTools = createSchemaOnlyTools(toolDefinitions);\n const toolDefMap = new Map(toolDefinitions.map((def) => [def.name, def]));\n const graphTools = agentContext?.graphTools as\n | t.GenericTool[]\n | undefined;\n\n const directToolNames = new Set<string>();\n const allTools = [...schemaTools] as t.GenericTool[];\n const allToolMap: t.ToolMap = new Map(\n schemaTools.map((tool) => [tool.name, tool])\n );\n\n if (graphTools && graphTools.length > 0) {\n for (const tool of graphTools) {\n if ('name' in tool) {\n allTools.push(tool);\n allToolMap.set(tool.name, tool);\n directToolNames.add(tool.name);\n }\n }\n }\n\n return new CustomToolNode<t.BaseGraphState>({\n tools: allTools,\n toolMap: allToolMap,\n eventDrivenMode: true,\n sessions: this.sessions,\n toolDefinitions: toolDefMap,\n agentId: agentContext?.agentId,\n toolCallStepIds: this.toolCallStepIds,\n toolRegistry: agentContext?.toolRegistry,\n hookRegistry: this.hookRegistry,\n directToolNames: directToolNames.size > 0 ? directToolNames : undefined,\n maxContextTokens: agentContext?.maxContextTokens,\n maxToolResultChars: agentContext?.maxToolResultChars,\n errorHandler: (data, metadata) =>\n StandardGraph.handleToolCallErrorStatic(this, data, metadata),\n });\n }\n\n const graphTools = agentContext?.graphTools as t.GenericTool[] | undefined;\n const baseTools = (currentTools as t.GenericTool[] | undefined) ?? [];\n const allTraditionalTools =\n graphTools && graphTools.length > 0\n ? [...baseTools, ...graphTools]\n : baseTools;\n const traditionalToolMap =\n graphTools && graphTools.length > 0\n ? new Map([\n ...(currentToolMap ?? new Map()),\n ...graphTools\n .filter((t): t is t.GenericTool & { name: string } => 'name' in t)\n .map((t) => [t.name, t] as [string, t.GenericTool]),\n ])\n : currentToolMap;\n\n return new CustomToolNode<t.BaseGraphState>({\n tools: allTraditionalTools,\n toolMap: traditionalToolMap,\n toolCallStepIds: this.toolCallStepIds,\n errorHandler: (data, metadata) =>\n StandardGraph.handleToolCallErrorStatic(this, data, metadata),\n toolRegistry: agentContext?.toolRegistry,\n sessions: this.sessions,\n maxContextTokens: agentContext?.maxContextTokens,\n maxToolResultChars: agentContext?.maxToolResultChars,\n });\n }\n\n overrideTestModel(\n responses: string[],\n sleep?: number,\n toolCalls?: ToolCall[]\n ): void {\n this.overrideModel = createFakeStreamingLLM({\n responses,\n sleep,\n toolCalls,\n });\n }\n\n getUsageMetadata(\n finalMessage?: BaseMessage\n ): Partial<UsageMetadata> | undefined {\n if (\n finalMessage &&\n 'usage_metadata' in finalMessage &&\n finalMessage.usage_metadata != null\n ) {\n return finalMessage.usage_metadata as Partial<UsageMetadata>;\n }\n }\n\n cleanupSignalListener(currentModel?: t.ChatModel): void {\n if (!this.signal) {\n return;\n }\n const model = this.overrideModel ?? currentModel;\n if (!model) {\n return;\n }\n const client = (model as ChatOpenAI | undefined)?.exposedClient;\n if (!client?.abortHandler) {\n return;\n }\n this.signal.removeEventListener('abort', client.abortHandler);\n client.abortHandler = undefined;\n }\n\n createCallModel(agentId = 'default') {\n return async (\n state: t.AgentSubgraphState,\n config?: RunnableConfig\n ): Promise<Partial<t.AgentSubgraphState>> => {\n const agentContext = this.agentContexts.get(agentId);\n if (!agentContext) {\n throw new Error(`Agent context not found for agentId: ${agentId}`);\n }\n\n if (!config) {\n throw new Error('No config provided');\n }\n\n const { messages } = state;\n\n const discoveredNames = extractToolDiscoveries(messages);\n if (discoveredNames.length > 0) {\n agentContext.markToolsAsDiscovered(discoveredNames);\n }\n\n const toolsForBinding = agentContext.getToolsForBinding();\n let model =\n this.overrideModel ??\n initializeModel({\n tools: toolsForBinding,\n provider: agentContext.provider,\n clientOptions: agentContext.clientOptions,\n });\n\n if (agentContext.systemRunnable) {\n model = agentContext.systemRunnable.pipe(model as Runnable);\n }\n\n if (agentContext.tokenCalculationPromise) {\n await agentContext.tokenCalculationPromise;\n }\n if (!config.signal) {\n config.signal = this.signal;\n }\n this.config = config;\n\n let messagesToUse = messages;\n if (\n !agentContext.pruneMessages &&\n agentContext.tokenCounter &&\n agentContext.maxContextTokens != null\n ) {\n agentContext.pruneMessages = createPruneMessages({\n startIndex:\n agentContext.indexTokenCountMap[0] != null ? this.startIndex : 0,\n provider: agentContext.provider,\n tokenCounter: agentContext.tokenCounter,\n maxTokens: agentContext.maxContextTokens,\n thinkingEnabled: isThinkingEnabled(\n agentContext.provider,\n agentContext.clientOptions\n ),\n indexTokenCountMap: agentContext.indexTokenCountMap,\n contextPruningConfig: agentContext.contextPruningConfig,\n summarizationEnabled: agentContext.summarizationEnabled,\n reserveRatio: agentContext.summarizationConfig?.reserveRatio,\n calibrationRatio: agentContext.calibrationRatio,\n getInstructionTokens: () => agentContext.instructionTokens,\n log: (level, message, data) => {\n emitAgentLog(config, level, 'prune', message, data, {\n runId: this.runId,\n agentId,\n });\n },\n });\n }\n if (agentContext.pruneMessages) {\n const {\n context,\n indexTokenCountMap,\n messagesToRefine,\n prePruneContextTokens,\n remainingContextTokens,\n originalToolContent,\n calibrationRatio,\n resolvedInstructionOverhead,\n } = agentContext.pruneMessages({\n messages,\n usageMetadata: agentContext.currentUsage,\n lastCallUsage: agentContext.lastCallUsage,\n totalTokensFresh: agentContext.totalTokensFresh,\n });\n agentContext.indexTokenCountMap = indexTokenCountMap;\n if (calibrationRatio != null && calibrationRatio > 0) {\n agentContext.calibrationRatio = calibrationRatio;\n }\n if (resolvedInstructionOverhead != null) {\n agentContext.resolvedInstructionOverhead =\n resolvedInstructionOverhead;\n const nonToolOverhead =\n agentContext.instructionTokens - agentContext.toolSchemaTokens;\n const calibratedToolTokens = Math.max(\n 0,\n resolvedInstructionOverhead - nonToolOverhead\n );\n const currentToolTokens = agentContext.toolSchemaTokens;\n const variance =\n currentToolTokens > 0\n ? Math.abs(calibratedToolTokens - currentToolTokens) /\n currentToolTokens\n : 1;\n if (variance > CALIBRATION_VARIANCE_THRESHOLD) {\n agentContext.toolSchemaTokens = calibratedToolTokens;\n }\n }\n messagesToUse = context;\n\n const hasPrunedMessages =\n agentContext.summarizationEnabled === true &&\n Array.isArray(messagesToRefine) &&\n messagesToRefine.length > 0;\n\n if (hasPrunedMessages) {\n const shouldSkip = agentContext.shouldSkipSummarization(\n messages.length\n );\n const triggerResult =\n !shouldSkip &&\n shouldTriggerSummarization({\n trigger: agentContext.summarizationConfig?.trigger,\n maxContextTokens: agentContext.maxContextTokens,\n prePruneContextTokens:\n prePruneContextTokens != null\n ? prePruneContextTokens + agentContext.instructionTokens\n : undefined,\n remainingContextTokens,\n messagesToRefineCount: messagesToRefine.length,\n });\n\n if (triggerResult) {\n if (originalToolContent != null && originalToolContent.size > 0) {\n agentContext.pendingOriginalToolContent = originalToolContent;\n }\n\n emitAgentLog(\n config,\n 'info',\n 'graph',\n 'Summarization triggered',\n undefined,\n { runId: this.runId, agentId }\n );\n emitAgentLog(\n config,\n 'debug',\n 'graph',\n 'Summarization trigger details',\n {\n totalMessages: messages.length,\n remainingContextTokens: remainingContextTokens ?? 0,\n summaryVersion: agentContext.summaryVersion + 1,\n toolSchemaTokens: agentContext.toolSchemaTokens,\n instructionTokens: agentContext.instructionTokens,\n systemMessageTokens: agentContext.systemMessageTokens,\n },\n { runId: this.runId, agentId }\n );\n agentContext.markSummarizationTriggered(messages.length);\n return {\n summarizationRequest: {\n remainingContextTokens: remainingContextTokens ?? 0,\n agentId: agentId || agentContext.agentId,\n },\n };\n }\n\n if (shouldSkip) {\n emitAgentLog(\n config,\n 'debug',\n 'graph',\n 'Summarization skipped — no new messages or per-run cap reached',\n {\n messageCount: messages.length,\n messagesToRefineCount: messagesToRefine.length,\n contextLength: context.length,\n },\n { runId: this.runId, agentId }\n );\n }\n }\n }\n\n let finalMessages = messagesToUse;\n if (agentContext.useLegacyContent) {\n finalMessages = formatContentStrings(finalMessages);\n }\n\n const lastMessageX =\n finalMessages.length >= 2\n ? finalMessages[finalMessages.length - 2]\n : null;\n const lastMessageY =\n finalMessages.length >= 1\n ? finalMessages[finalMessages.length - 1]\n : null;\n\n const anthropicLike = isAnthropicLike(\n agentContext.provider,\n agentContext.clientOptions as { model?: string }\n );\n\n if (\n agentContext.provider === Providers.BEDROCK &&\n lastMessageX instanceof AIMessageChunk &&\n lastMessageY instanceof ToolMessage &&\n typeof lastMessageX.content === 'string'\n ) {\n const trimmed = lastMessageX.content.trim();\n finalMessages[finalMessages.length - 2].content =\n trimmed.length > 0 ? [{ type: 'text' as const, text: trimmed }] : '';\n }\n\n if (lastMessageY instanceof ToolMessage) {\n if (anthropicLike) {\n formatAnthropicArtifactContent(finalMessages);\n } else if (\n (isOpenAILike(agentContext.provider) &&\n agentContext.provider !== Providers.DEEPSEEK) ||\n isGoogleLike(agentContext.provider)\n ) {\n formatArtifactPayload(finalMessages);\n }\n }\n\n if (agentContext.provider === Providers.ANTHROPIC) {\n const anthropicOptions = agentContext.clientOptions as\n | t.AnthropicClientOptions\n | undefined;\n if (\n anthropicOptions?.promptCache === true &&\n !agentContext.systemRunnable\n ) {\n finalMessages = addCacheControl<BaseMessage>(finalMessages);\n }\n } else if (agentContext.provider === Providers.BEDROCK) {\n const bedrockOptions = agentContext.clientOptions as\n | t.BedrockAnthropicClientOptions\n | undefined;\n if (bedrockOptions?.promptCache === true) {\n finalMessages = addBedrockCacheControl<BaseMessage>(finalMessages);\n }\n }\n\n if (\n isThinkingEnabled(agentContext.provider, agentContext.clientOptions)\n ) {\n finalMessages = ensureThinkingBlockInMessages(\n finalMessages,\n agentContext.provider,\n config\n );\n }\n\n // Intentionally broad: runs when the pruner wasn't used OR any post-pruning\n // transform (addCacheControl, ensureThinkingBlock, etc.) reassigned finalMessages.\n // sanitizeOrphanToolBlocks fast-paths to a Set diff check when no orphans exist,\n // so the cost is negligible and this acts as a safety net for Anthropic/Bedrock.\n const needsOrphanSanitize =\n anthropicLike &&\n (!agentContext.pruneMessages || finalMessages !== messagesToUse);\n if (needsOrphanSanitize) {\n const beforeSanitize = finalMessages.length;\n finalMessages = sanitizeOrphanToolBlocks(finalMessages);\n if (finalMessages.length !== beforeSanitize) {\n emitAgentLog(\n config,\n 'warn',\n 'sanitize',\n 'Orphan tool blocks removed',\n {\n before: beforeSanitize,\n after: finalMessages.length,\n dropped: beforeSanitize - finalMessages.length,\n },\n { runId: this.runId, agentId }\n );\n }\n }\n\n if (\n agentContext.lastStreamCall != null &&\n agentContext.streamBuffer != null\n ) {\n const timeSinceLastCall = Date.now() - agentContext.lastStreamCall;\n if (timeSinceLastCall < agentContext.streamBuffer) {\n const timeToWait =\n Math.ceil((agentContext.streamBuffer - timeSinceLastCall) / 1000) *\n 1000;\n await sleep(timeToWait);\n }\n }\n\n agentContext.lastStreamCall = Date.now();\n agentContext.markTokensStale();\n\n let result: Partial<t.BaseGraphState> | undefined;\n const fallbacks =\n (agentContext.clientOptions as t.LLMConfig | undefined)?.fallbacks ??\n [];\n\n if (\n finalMessages.length === 0 &&\n !agentContext.hasPendingCompactionSummary()\n ) {\n const budgetBreakdown = agentContext.getTokenBudgetBreakdown(messages);\n const breakdown = agentContext.formatTokenBudgetBreakdown(messages);\n const instructionsExceedBudget =\n budgetBreakdown.instructionTokens > budgetBreakdown.maxContextTokens;\n\n let guidance: string;\n if (instructionsExceedBudget) {\n const toolPct =\n budgetBreakdown.toolSchemaTokens > 0\n ? Math.round(\n (budgetBreakdown.toolSchemaTokens /\n budgetBreakdown.instructionTokens) *\n 100\n )\n : 0;\n guidance =\n toolPct > 50\n ? `Tool definitions consume ${budgetBreakdown.toolSchemaTokens} tokens (${toolPct}% of instructions) across ${budgetBreakdown.toolCount} tools, exceeding maxContextTokens (${budgetBreakdown.maxContextTokens}). Reduce the number of tools or increase maxContextTokens.`\n : `Instructions (${budgetBreakdown.instructionTokens} tokens) exceed maxContextTokens (${budgetBreakdown.maxContextTokens}). Increase maxContextTokens or shorten the system prompt.`;\n if (agentContext.summarizationEnabled === true) {\n guidance +=\n ' Summarization was skipped because the summary would further increase the instruction overhead.';\n }\n } else {\n guidance =\n 'Please increase the context window size or make your message shorter.';\n }\n\n emitAgentLog(\n config,\n 'error',\n 'graph',\n 'Empty messages after pruning',\n {\n messageCount: messages.length,\n instructionsExceedBudget,\n breakdown,\n },\n { runId: this.runId, agentId }\n );\n throw new Error(\n JSON.stringify({\n type: 'empty_messages',\n info: `Message pruning removed all messages as none fit in the context window. ${guidance}\\n${breakdown}`,\n })\n );\n }\n\n const invokeStart = Date.now();\n const invokeMeta = { runId: this.runId, agentId };\n emitAgentLog(\n config,\n 'debug',\n 'graph',\n 'Invoking LLM',\n {\n messageCount: finalMessages.length,\n provider: agentContext.provider,\n },\n invokeMeta,\n { force: true }\n );\n\n try {\n result = await attemptInvoke(\n {\n model: (this.overrideModel ?? model) as t.ChatModel,\n messages: finalMessages,\n provider: agentContext.provider,\n context: this,\n },\n config\n );\n } catch (primaryError) {\n result = await tryFallbackProviders({\n fallbacks,\n tools: agentContext.tools,\n messages: finalMessages,\n config,\n primaryError,\n context: this,\n });\n }\n\n if (!result) {\n throw new Error('No result after model invocation');\n }\n\n /**\n * Fallback: populate toolCallStepIds in the graph execution context.\n *\n * When model.stream() is available (the common case), attemptInvoke\n * processes all chunks through a local ChatModelStreamHandler which\n * creates run steps and populates toolCallStepIds before returning.\n * The code below is a fallback for the rare case where model.stream\n * is unavailable and model.invoke() was used instead.\n *\n * Text content is dispatched FIRST so that MESSAGE_CREATION is the\n * current step when handleToolCalls runs. handleToolCalls then creates\n * TOOL_CALLS on top of it. The dedup in getMessageId and\n * toolCallStepIds.has makes this safe when attemptInvoke already\n * handled everything — both paths become no-ops.\n */\n const responseMessage = result.messages?.[0];\n const toolCalls = (responseMessage as AIMessageChunk | undefined)\n ?.tool_calls;\n const hasToolCalls = Array.isArray(toolCalls) && toolCalls.length > 0;\n\n if (hasToolCalls) {\n const metadata = config.metadata as Record<string, unknown>;\n const stepKey = this.getStepKey(metadata);\n const content = responseMessage?.content as MessageContent | undefined;\n const hasTextContent =\n content != null &&\n (typeof content === 'string'\n ? content !== ''\n : Array.isArray(content) && content.length > 0);\n\n /**\n * Dispatch text content BEFORE creating TOOL_CALLS steps.\n * getMessageId returns a new ID only on the first call for a step key;\n * if the for-await consumer already claimed it, this is a no-op.\n */\n if (hasTextContent) {\n const messageId = getMessageId(stepKey, this) ?? '';\n if (messageId) {\n await this.dispatchRunStep(\n stepKey,\n {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: { message_id: messageId },\n },\n metadata\n );\n const stepId = this.getStepIdByKey(stepKey);\n if (typeof content === 'string') {\n await this.dispatchMessageDelta(stepId, {\n content: [{ type: ContentTypes.TEXT, text: content }],\n });\n } else if (\n Array.isArray(content) &&\n content.every(\n (c) =>\n typeof c === 'object' &&\n 'type' in c &&\n typeof c.type === 'string' &&\n c.type.startsWith('text')\n )\n ) {\n await this.dispatchMessageDelta(stepId, {\n content: content as t.MessageDelta['content'],\n });\n }\n }\n }\n\n await handleToolCalls(toolCalls as ToolCall[], metadata, this);\n }\n\n /**\n * When streaming is disabled, on_chat_model_stream events are never\n * emitted so ChatModelStreamHandler never fires. Dispatch the text\n * content as MESSAGE_CREATION + MESSAGE_DELTA here.\n */\n const disableStreaming =\n (agentContext.clientOptions as t.OpenAIClientOptions | undefined)\n ?.disableStreaming === true;\n\n if (\n disableStreaming &&\n !hasToolCalls &&\n responseMessage != null &&\n (responseMessage.content as MessageContent | undefined) != null\n ) {\n const metadata = config.metadata as Record<string, unknown>;\n const stepKey = this.getStepKey(metadata);\n const messageId = getMessageId(stepKey, this) ?? '';\n if (messageId) {\n await this.dispatchRunStep(\n stepKey,\n {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: { message_id: messageId },\n },\n metadata\n );\n const stepId = this.getStepIdByKey(stepKey);\n const content = responseMessage.content;\n if (typeof content === 'string') {\n await this.dispatchMessageDelta(stepId, {\n content: [{ type: ContentTypes.TEXT, text: content }],\n });\n } else if (\n Array.isArray(content) &&\n content.every(\n (c) =>\n typeof c === 'object' &&\n 'type' in c &&\n typeof c.type === 'string' &&\n c.type.startsWith('text')\n )\n ) {\n await this.dispatchMessageDelta(stepId, {\n content: content as t.MessageDelta['content'],\n });\n }\n }\n }\n\n const invokeElapsed = ((Date.now() - invokeStart) / 1000).toFixed(2);\n agentContext.currentUsage = this.getUsageMetadata(result.messages?.[0]);\n if (agentContext.currentUsage) {\n agentContext.updateLastCallUsage(agentContext.currentUsage);\n emitAgentLog(\n config,\n 'debug',\n 'graph',\n `LLM call complete (${invokeElapsed}s)`,\n {\n ...agentContext.currentUsage,\n elapsedSeconds: Number(invokeElapsed),\n instructionTokens: agentContext.instructionTokens,\n toolSchemaTokens: agentContext.toolSchemaTokens,\n messageCount: finalMessages.length,\n },\n invokeMeta,\n { force: true }\n );\n } else {\n emitAgentLog(\n config,\n 'debug',\n 'graph',\n `LLM call complete (${invokeElapsed}s)`,\n {\n elapsedSeconds: Number(invokeElapsed),\n messageCount: finalMessages.length,\n },\n invokeMeta,\n { force: true }\n );\n }\n this.cleanupSignalListener();\n return result;\n };\n }\n\n createAgentNode(agentId: string): t.CompiledAgentWorfklow {\n const getConfig = (): RunnableConfig | undefined => this.config;\n const agentContext = this.agentContexts.get(agentId);\n if (!agentContext) {\n throw new Error(`Agent context not found for agentId: ${agentId}`);\n }\n\n /**\n * Depth countdown across graph boundaries: the parent's `maxSubagentDepth`\n * becomes this executor's `maxDepth`. When the child graph is constructed,\n * `buildChildInputs()` decrements `maxSubagentDepth` on the child's\n * `AgentInputs` (only when `allowNested: true`; otherwise subagentConfigs\n * are stripped entirely). The child graph's own `createAgentNode()` then\n * reads the decremented value here and creates a narrower executor —\n * recursion is bounded even though each graph has its own separate\n * executor instance.\n */\n const effectiveSubagentDepth = agentContext.maxSubagentDepth ?? 1;\n if (\n agentContext.subagentConfigs != null &&\n agentContext.subagentConfigs.length > 0 &&\n effectiveSubagentDepth > 0\n ) {\n const resolvedConfigs = resolveSubagentConfigs(\n agentContext.subagentConfigs,\n agentContext\n );\n if (resolvedConfigs.length > 0) {\n const executor = new SubagentExecutor({\n configs: new Map(resolvedConfigs.map((c) => [c.type, c])),\n parentSignal: this.signal,\n hookRegistry: this.hookRegistry,\n parentRunId: this.runId ?? '',\n parentAgentId: agentContext.agentId,\n tokenCounter: agentContext.tokenCounter,\n maxDepth: effectiveSubagentDepth,\n createChildGraph: (input): StandardGraph => new StandardGraph(input),\n });\n\n const subagentTool = tool(async (rawInput, config) => {\n const input = rawInput as {\n description?: string;\n subagent_type?: string;\n };\n const description =\n typeof input.description === 'string' &&\n input.description.trim().length > 0\n ? input.description\n : 'No task description provided';\n const subagentType =\n typeof input.subagent_type === 'string' ? input.subagent_type : '';\n const threadId = config.configurable?.thread_id as string | undefined;\n const result = await executor.execute({\n description,\n subagentType,\n threadId,\n });\n return result.content;\n }, buildSubagentToolParams(resolvedConfigs));\n\n if (!agentContext.graphTools) {\n agentContext.graphTools = [];\n }\n (agentContext.graphTools as t.GenericTool[]).push(subagentTool);\n\n /**\n * Refresh toolSchemaTokens to include the subagent tool's schema.\n * `calculateInstructionTokens()` was kicked off in `fromConfig()`\n * before graphTools was populated, so its result did not count this\n * tool. Without this retrigger, token-budget/pruning logic\n * underestimates prompt overhead.\n */\n if (agentContext.tokenCounter) {\n const { tokenCounter, baseIndexTokenCountMap } = agentContext;\n agentContext.tokenCalculationPromise = agentContext\n .calculateInstructionTokens(tokenCounter)\n .then(() => {\n agentContext.updateTokenMapWithInstructions(\n baseIndexTokenCountMap\n );\n })\n .catch((err) => {\n console.error(\n 'Error recalculating instruction tokens after subagent tool injection:',\n err\n );\n });\n }\n }\n }\n\n const agentNode = `${AGENT}${agentId}` as const;\n const toolNode = `${TOOLS}${agentId}` as const;\n const summarizeNode = `${SUMMARIZE}${agentId}` as const;\n\n const routeMessage = (\n state: t.AgentSubgraphState,\n config?: RunnableConfig\n ): string => {\n this.config = config;\n if (state.summarizationRequest != null) {\n return summarizeNode;\n }\n return toolsCondition(\n state as t.BaseGraphState,\n toolNode,\n this.invokedToolIds\n );\n };\n\n const StateAnnotation = Annotation.Root({\n messages: Annotation<BaseMessage[]>({\n reducer: messagesStateReducer,\n default: () => [],\n }),\n summarizationRequest: Annotation<t.SummarizationNodeInput | undefined>({\n reducer: (\n _: t.SummarizationNodeInput | undefined,\n b: t.SummarizationNodeInput | undefined\n ) => b,\n default: () => undefined,\n }),\n });\n\n const workflow = new StateGraph(StateAnnotation)\n .addNode(agentNode, this.createCallModel(agentId))\n .addNode(\n toolNode,\n this.initializeTools({\n currentTools: agentContext.tools,\n currentToolMap: agentContext.toolMap,\n agentContext,\n })\n )\n .addNode(\n summarizeNode,\n createSummarizeNode({\n agentContext,\n graph: {\n contentData: this.contentData,\n contentIndexMap: this.contentIndexMap,\n get config() {\n return getConfig();\n },\n runId: this.runId,\n isMultiAgent: this.isMultiAgentGraph(),\n hookRegistry: this.hookRegistry,\n dispatchRunStep: async (runStep, nodeConfig) => {\n this.contentData.push(runStep);\n this.contentIndexMap.set(runStep.id, runStep.index);\n\n const resolvedConfig = nodeConfig ?? this.config;\n const handler = this.handlerRegistry?.getHandler(\n GraphEvents.ON_RUN_STEP\n );\n if (handler) {\n await handler.handle(\n GraphEvents.ON_RUN_STEP,\n runStep,\n resolvedConfig?.configurable,\n this\n );\n this.handlerDispatchedStepIds.add(runStep.id);\n }\n\n if (resolvedConfig) {\n await safeDispatchCustomEvent(\n GraphEvents.ON_RUN_STEP,\n runStep,\n resolvedConfig\n );\n }\n },\n dispatchRunStepCompleted: async (\n stepId: string,\n result: t.StepCompleted,\n nodeConfig?: RunnableConfig\n ) => {\n const resolvedConfig = nodeConfig ?? this.config;\n const runStep = this.contentData.find((s) => s.id === stepId);\n const handler = this.handlerRegistry?.getHandler(\n GraphEvents.ON_RUN_STEP_COMPLETED\n );\n if (handler) {\n await handler.handle(\n GraphEvents.ON_RUN_STEP_COMPLETED,\n {\n result: {\n ...result,\n id: stepId,\n index: runStep?.index ?? 0,\n },\n },\n resolvedConfig?.configurable,\n this\n );\n }\n },\n },\n generateStepId: (stepKey: string) => this.generateStepId(stepKey),\n })\n )\n .addEdge(START, agentNode)\n .addConditionalEdges(agentNode, routeMessage)\n .addEdge(summarizeNode, agentNode)\n .addEdge(toolNode, agentContext.toolEnd ? END : agentNode);\n\n return workflow.compile();\n }\n\n createWorkflow(): t.CompiledStateWorkflow {\n const agentNode = this.createAgentNode(this.defaultAgentId);\n const StateAnnotation = Annotation.Root({\n messages: Annotation<BaseMessage[]>({\n reducer: (a, b) => {\n if (!a.length) {\n this.startIndex = a.length + b.length;\n }\n const result = messagesStateReducer(a, b);\n this.messages = result;\n return result;\n },\n default: () => [],\n }),\n });\n const workflow = new StateGraph(StateAnnotation)\n .addNode(this.defaultAgentId, agentNode, { ends: [END] })\n .addEdge(START, this.defaultAgentId)\n // LangGraph compile() types are overly strict for opt-in options\n .compile(this.compileOptions as unknown as never);\n\n return workflow;\n }\n\n /**\n * Indicates if this is a multi-agent graph.\n * Override in MultiAgentGraph to return true.\n * Used to conditionally include agentId in RunStep for frontend rendering.\n */\n protected isMultiAgentGraph(): boolean {\n return false;\n }\n\n /**\n * Get the parallel group ID for an agent, if any.\n * Override in MultiAgentGraph to provide actual group IDs.\n * Group IDs are incrementing numbers (1, 2, 3...) reflecting execution order.\n * @param _agentId - The agent ID to look up\n * @returns undefined for StandardGraph (no parallel groups), or group number for MultiAgentGraph\n */\n protected getParallelGroupIdForAgent(_agentId: string): number | undefined {\n return undefined;\n }\n\n /* Dispatchers */\n\n /**\n * Dispatches a run step to the client, returns the step ID\n */\n async dispatchRunStep(\n stepKey: string,\n stepDetails: t.StepDetails,\n metadata?: Record<string, unknown>\n ): Promise<string> {\n if (!this.config) {\n throw new Error('No config provided');\n }\n\n const [stepId, stepIndex] = this.generateStepId(stepKey);\n if (stepDetails.type === StepTypes.TOOL_CALLS && stepDetails.tool_calls) {\n for (const tool_call of stepDetails.tool_calls) {\n const toolCallId = tool_call.id ?? '';\n if (!toolCallId || this.toolCallStepIds.has(toolCallId)) {\n continue;\n }\n this.toolCallStepIds.set(toolCallId, stepId);\n }\n }\n\n const runStep: t.RunStep = {\n stepIndex,\n id: stepId,\n type: stepDetails.type,\n index: this.contentData.length,\n stepDetails,\n usage: null,\n };\n\n const runId = this.runId ?? '';\n if (runId) {\n runStep.runId = runId;\n }\n\n if (metadata) {\n try {\n const agentContext = this.getAgentContext(metadata);\n if (this.isMultiAgentGraph() && agentContext.agentId) {\n runStep.agentId = agentContext.agentId;\n const groupId = this.getParallelGroupIdForAgent(agentContext.agentId);\n if (groupId != null) {\n runStep.groupId = groupId;\n }\n }\n } catch (_e) {\n /** If we can't get agent context, that's okay - agentId remains undefined */\n }\n }\n\n this.contentData.push(runStep);\n this.contentIndexMap.set(stepId, runStep.index);\n\n // Primary dispatch: handler registry (reliable, always works).\n // This mirrors how handleToolCallCompleted dispatches ON_RUN_STEP_COMPLETED\n // via the handler registry, ensuring the event always reaches the handler\n // even when LangGraph's callback system drops the custom event.\n const handler = this.handlerRegistry?.getHandler(GraphEvents.ON_RUN_STEP);\n if (handler) {\n await handler.handle(GraphEvents.ON_RUN_STEP, runStep, metadata, this);\n this.handlerDispatchedStepIds.add(stepId);\n }\n\n // Secondary dispatch: custom event for LangGraph callback chain\n // (tracing, Langfuse, external consumers). May be silently dropped\n // in some scenarios (stale run ID, subgraph callback propagation issues),\n // but the primary dispatch above guarantees the event reaches the handler.\n // The customEventCallback in run.ts skips events already dispatched above\n // to prevent double handling.\n await safeDispatchCustomEvent(\n GraphEvents.ON_RUN_STEP,\n runStep,\n this.config\n );\n return stepId;\n }\n\n /**\n * Static version of handleToolCallError to avoid creating strong references\n * that prevent garbage collection\n */\n static async handleToolCallErrorStatic(\n graph: StandardGraph,\n data: t.ToolErrorData,\n metadata?: Record<string, unknown>\n ): Promise<void> {\n if (!graph.config) {\n throw new Error('No config provided');\n }\n\n if (!data.id) {\n console.warn('No Tool ID provided for Tool Error');\n return;\n }\n\n const stepId = graph.toolCallStepIds.get(data.id) ?? '';\n if (!stepId) {\n throw new Error(`No stepId found for tool_call_id ${data.id}`);\n }\n\n const { name, input: args, error } = data;\n\n const runStep = graph.getRunStep(stepId);\n if (!runStep) {\n throw new Error(`No run step found for stepId ${stepId}`);\n }\n\n const tool_call: t.ProcessedToolCall = {\n id: data.id,\n name: name || '',\n args: typeof args === 'string' ? args : JSON.stringify(args),\n output: `Error processing tool${error?.message != null ? `: ${error.message}` : ''}`,\n progress: 1,\n };\n\n await graph.handlerRegistry\n ?.getHandler(GraphEvents.ON_RUN_STEP_COMPLETED)\n ?.handle(\n GraphEvents.ON_RUN_STEP_COMPLETED,\n {\n result: {\n id: stepId,\n index: runStep.index,\n type: 'tool_call',\n tool_call,\n } as t.ToolCompleteEvent,\n },\n metadata,\n graph\n );\n }\n\n /**\n * Instance method that delegates to the static method\n * Kept for backward compatibility\n */\n async handleToolCallError(\n data: t.ToolErrorData,\n metadata?: Record<string, unknown>\n ): Promise<void> {\n await StandardGraph.handleToolCallErrorStatic(this, data, metadata);\n }\n\n async dispatchRunStepDelta(\n id: string,\n delta: t.ToolCallDelta\n ): Promise<void> {\n if (!this.config) {\n throw new Error('No config provided');\n } else if (!id) {\n throw new Error('No step ID found');\n }\n const runStepDelta: t.RunStepDeltaEvent = {\n id,\n delta,\n };\n await safeDispatchCustomEvent(\n GraphEvents.ON_RUN_STEP_DELTA,\n runStepDelta,\n this.config\n );\n }\n\n async dispatchMessageDelta(id: string, delta: t.MessageDelta): Promise<void> {\n if (!this.config) {\n throw new Error('No config provided');\n }\n const messageDelta: t.MessageDeltaEvent = {\n id,\n delta,\n };\n await safeDispatchCustomEvent(\n GraphEvents.ON_MESSAGE_DELTA,\n messageDelta,\n this.config\n );\n }\n\n dispatchReasoningDelta = async (\n stepId: string,\n delta: t.ReasoningDelta\n ): Promise<void> => {\n if (!this.config) {\n throw new Error('No config provided');\n }\n const reasoningDelta: t.ReasoningDeltaEvent = {\n id: stepId,\n delta,\n };\n await safeDispatchCustomEvent(\n GraphEvents.ON_REASONING_DELTA,\n reasoningDelta,\n this.config\n );\n };\n}\n"],"names":["GraphNodeKeys","AgentContext","resetIfNotEmpty","joinKeys","nanoid","ContentTypes","convertMessagesToContent","createSchemaOnlyTools","CustomToolNode","createFakeStreamingLLM","messages","extractToolDiscoveries","initializeModel","createPruneMessages","isThinkingEnabled","emitAgentLog","shouldTriggerSummarization","formatContentStrings","isAnthropicLike","Providers","AIMessageChunk","ToolMessage","formatAnthropicArtifactContent","isOpenAILike","isGoogleLike","formatArtifactPayload","addCacheControl","addBedrockCacheControl","ensureThinkingBlockInMessages","sanitizeOrphanToolBlocks","sleep","attemptInvoke","tryFallbackProviders","getMessageId","StepTypes","handleToolCalls","resolveSubagentConfigs","SubagentExecutor","tool","buildSubagentToolParams","toolsCondition","Annotation","messagesStateReducer","StateGraph","createSummarizeNode","GraphEvents","safeDispatchCustomEvent","START","END"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.cjs","sources":["../../../src/hooks/types.ts"],"sourcesContent":["// src/hooks/types.ts\nimport type { BaseMessage } from '@langchain/core/messages';\n\n/**\n * Closed set of hook lifecycle events supported by the hooks system.\n *\n * These mirror the subset of Claude Code's event surface that makes sense\n * for a library context (no filesystem/CLI-specific events). See\n * `docs/hooks-design-report.md` §3.2 for the mapping to existing\n * `@librechat/agents` emission points.\n */\nexport const HOOK_EVENTS = [\n 'RunStart',\n 'UserPromptSubmit',\n 'PreToolUse',\n 'PostToolUse',\n 'PostToolUseFailure',\n 'PermissionDenied',\n 'SubagentStart',\n 'SubagentStop',\n 'Stop',\n 'StopFailure',\n 'PreCompact',\n 'PostCompact',\n] as const;\n\nexport type HookEvent = (typeof HOOK_EVENTS)[number];\n\n/** Tool-gating decision; executeHooks folds with `deny > ask > allow` precedence. */\nexport type ToolDecision = 'allow' | 'deny' | 'ask';\n\n/** Stop-loop decision; `block` means \"do not stop, run another turn\". Any `block` wins. */\nexport type StopDecision = 'continue' | 'block';\n\n/**\n * Fields shared by every `HookInput`. Discriminated by `hook_event_name`.\n *\n * - `runId` identifies the current agent run and is always present.\n * - `threadId` identifies the conversation thread when the host has one.\n * - `agentId` is only set when the hook fires inside a subagent scope.\n */\nexport interface BaseHookInput {\n runId: string;\n threadId?: string;\n agentId?: string;\n}\n\nexport interface RunStartHookInput extends BaseHookInput {\n hook_event_name: 'RunStart';\n messages: BaseMessage[];\n}\n\nexport interface UserPromptSubmitHookInput extends BaseHookInput {\n hook_event_name: 'UserPromptSubmit';\n prompt: string;\n attachments?: BaseMessage[];\n}\n\n/**\n * Fires before a tool is invoked. Hook may return `deny`/`ask`/`allow` and/or\n * an `updatedInput` that replaces the tool arguments before invocation.\n *\n * `toolInput` is intentionally typed as `Record<string, unknown>` because the\n * SDK is tool-agnostic — concrete tool argument shapes are only known at the\n * call site and are narrowed by the host. This is the one escape hatch in\n * the hook type system.\n */\nexport interface PreToolUseHookInput extends BaseHookInput {\n hook_event_name: 'PreToolUse';\n toolName: string;\n toolInput: Record<string, unknown>;\n toolUseId: string;\n stepId?: string;\n /**\n * Number of times this tool has been invoked in prior batches within the\n * current run. Within a single batch of parallel calls, all calls to the\n * same tool share the same turn value — per-call discrimination within a\n * batch is not supported in v1.\n */\n turn?: number;\n}\n\nexport interface PostToolUseHookInput extends BaseHookInput {\n hook_event_name: 'PostToolUse';\n toolName: string;\n toolInput: Record<string, unknown>;\n toolOutput: unknown;\n toolUseId: string;\n stepId?: string;\n turn?: number;\n}\n\nexport interface PostToolUseFailureHookInput extends BaseHookInput {\n hook_event_name: 'PostToolUseFailure';\n toolName: string;\n toolInput: Record<string, unknown>;\n toolUseId: string;\n error: string;\n stepId?: string;\n turn?: number;\n}\n\nexport interface PermissionDeniedHookInput extends BaseHookInput {\n hook_event_name: 'PermissionDenied';\n toolName: string;\n toolInput: Record<string, unknown>;\n toolUseId: string;\n reason: string;\n}\n\nexport interface SubagentStartHookInput extends BaseHookInput {\n hook_event_name: 'SubagentStart';\n parentAgentId?: string;\n agentId: string;\n agentType: string;\n inputs: BaseMessage[];\n}\n\nexport interface SubagentStopHookInput extends BaseHookInput {\n hook_event_name: 'SubagentStop';\n agentId: string;\n agentType: string;\n messages: BaseMessage[];\n}\n\nexport interface StopHookInput extends BaseHookInput {\n hook_event_name: 'Stop';\n messages: BaseMessage[];\n stopReason?: string;\n stopHookActive: boolean;\n}\n\nexport interface StopFailureHookInput extends BaseHookInput {\n hook_event_name: 'StopFailure';\n error: string;\n lastAssistantMessage?: BaseMessage;\n}\n\nexport interface PreCompactHookInput extends BaseHookInput {\n hook_event_name: 'PreCompact';\n messagesBeforeCount: number;\n trigger: 'threshold' | 'manual' | 'error';\n}\n\nexport interface PostCompactHookInput extends BaseHookInput {\n hook_event_name: 'PostCompact';\n summary: string;\n messagesAfterCount: number;\n}\n\n/** Discriminated union of every hook input shape. */\nexport type HookInput =\n | RunStartHookInput\n | UserPromptSubmitHookInput\n | PreToolUseHookInput\n | PostToolUseHookInput\n | PostToolUseFailureHookInput\n | PermissionDeniedHookInput\n | SubagentStartHookInput\n | SubagentStopHookInput\n | StopHookInput\n | StopFailureHookInput\n | PreCompactHookInput\n | PostCompactHookInput;\n\n/** Compile-time map from event name to its input shape. */\nexport type HookInputByEvent = {\n RunStart: RunStartHookInput;\n UserPromptSubmit: UserPromptSubmitHookInput;\n PreToolUse: PreToolUseHookInput;\n PostToolUse: PostToolUseHookInput;\n PostToolUseFailure: PostToolUseFailureHookInput;\n PermissionDenied: PermissionDeniedHookInput;\n SubagentStart: SubagentStartHookInput;\n SubagentStop: SubagentStopHookInput;\n Stop: StopHookInput;\n StopFailure: StopFailureHookInput;\n PreCompact: PreCompactHookInput;\n PostCompact: PostCompactHookInput;\n};\n\n/**\n * Fields common to every hook output. Hooks that have nothing to say simply\n * return `{}` (or omit the fields below).\n */\nexport interface BaseHookOutput {\n /** Context string to inject into the conversation. Accumulated across hooks. */\n additionalContext?: string;\n /** True to prevent the next model turn. Any hook can set this. */\n preventContinuation?: boolean;\n /** Reason reported alongside `preventContinuation`. */\n stopReason?: string;\n}\n\nexport type RunStartHookOutput = BaseHookOutput;\n\nexport interface UserPromptSubmitHookOutput extends BaseHookOutput {\n decision?: ToolDecision;\n reason?: string;\n}\n\nexport interface PreToolUseHookOutput extends BaseHookOutput {\n decision?: ToolDecision;\n reason?: string;\n /**\n * Replacement tool input. Merged into the pending tool call by the host.\n *\n * When multiple hooks set `updatedInput` within a single `executeHooks`\n * call, the last writer in registration order wins (outer loop: matcher\n * registration order; inner loop: hook position within the matcher). The\n * winner is deterministic — `Promise.all` preserves input-array order.\n * Consumers that need a single authoritative rewrite should still scope\n * `updatedInput` to one hook per matcher to avoid confusing precedence.\n */\n updatedInput?: Record<string, unknown>;\n}\n\nexport interface PostToolUseHookOutput extends BaseHookOutput {\n /**\n * Replacement tool output. Flows through the aggregated result so the\n * host can substitute it before appending the tool result message.\n * Ordering semantics match `PreToolUseHookOutput.updatedInput`:\n * last-writer-wins in registration order.\n */\n updatedOutput?: unknown;\n}\n\nexport type PostToolUseFailureHookOutput = BaseHookOutput;\n\nexport type PermissionDeniedHookOutput = BaseHookOutput;\n\nexport interface SubagentStartHookOutput extends BaseHookOutput {\n decision?: ToolDecision;\n reason?: string;\n}\n\nexport type SubagentStopHookOutput = BaseHookOutput;\n\nexport interface StopHookOutput extends BaseHookOutput {\n decision?: StopDecision;\n reason?: string;\n}\n\nexport type StopFailureHookOutput = BaseHookOutput;\n\nexport type PreCompactHookOutput = BaseHookOutput;\n\nexport type PostCompactHookOutput = BaseHookOutput;\n\n/** Compile-time map from event name to its output shape. */\nexport type HookOutputByEvent = {\n RunStart: RunStartHookOutput;\n UserPromptSubmit: UserPromptSubmitHookOutput;\n PreToolUse: PreToolUseHookOutput;\n PostToolUse: PostToolUseHookOutput;\n PostToolUseFailure: PostToolUseFailureHookOutput;\n PermissionDenied: PermissionDeniedHookOutput;\n SubagentStart: SubagentStartHookOutput;\n SubagentStop: SubagentStopHookOutput;\n Stop: StopHookOutput;\n StopFailure: StopFailureHookOutput;\n PreCompact: PreCompactHookOutput;\n PostCompact: PostCompactHookOutput;\n};\n\n/** Superset output shape used by the executor's fold loop. */\nexport type HookOutput =\n | RunStartHookOutput\n | UserPromptSubmitHookOutput\n | PreToolUseHookOutput\n | PostToolUseHookOutput\n | PostToolUseFailureHookOutput\n | PermissionDeniedHookOutput\n | SubagentStartHookOutput\n | SubagentStopHookOutput\n | StopHookOutput\n | StopFailureHookOutput\n | PreCompactHookOutput\n | PostCompactHookOutput;\n\n/**\n * A hook callback is a plain async function registered against a specific\n * event. The `signal` is always supplied by `executeHooks` and combines the\n * batch's parent signal with the per-hook timeout — callbacks that perform\n * long-running work should observe it.\n */\nexport type HookCallback<E extends HookEvent = HookEvent> = (\n input: HookInputByEvent[E],\n signal: AbortSignal\n) => HookOutputByEvent[E] | Promise<HookOutputByEvent[E]>;\n\n/**\n * A matcher groups one or more callbacks under a shared regex filter and\n * shared timeout/once/internal flags. The generic `E` ties the callback\n * types to the event the matcher is registered against.\n */\nexport interface HookMatcher<E extends HookEvent = HookEvent> {\n /**\n * Regex pattern matched against the event's primary query string (e.g.\n * the tool name for `PreToolUse`, the agent type for `SubagentStart`).\n *\n * Omitted or empty means \"always match\". For events that do not supply a\n * query string (`RunStart`, `Stop`, etc.), only wildcard matchers fire —\n * a non-empty pattern on such events will never match.\n *\n * Patterns are treated as trusted input: `executeHooks` compiles them\n * with `new RegExp(pattern)` without any sandbox, and a pathological\n * pattern can block the event loop. Host registration code is expected\n * to validate or length-bound patterns that originate from user input.\n */\n pattern?: string;\n /** Callbacks that fire when the matcher hits. Executed in parallel. */\n hooks: HookCallback<E>[];\n /** Per-matcher timeout in ms. Defaults to the executor's batch timeout. */\n timeout?: number;\n /**\n * Atomically remove the matcher before its first dispatch.\n *\n * `executeHooks` claims `once: true` matchers synchronously — between\n * `getMatchers` and its first `await` — so two concurrent calls cannot\n * both dispatch the same matcher. Whichever call runs its sync prefix\n * first wins the matcher; the other sees an empty bucket.\n *\n * Semantics are \"at most one dispatch, ever\" — if every hook in the\n * matcher throws, the matcher is still gone. Use `once` for\n * fire-and-forget bootstrapping (registration, telemetry, setup). Hosts\n * that need retry semantics should register a normal matcher and\n * self-unregister via the callback returned from `registry.register`.\n */\n once?: boolean;\n /** Internal hooks are excluded from telemetry and non-fatal error logging. */\n internal?: boolean;\n}\n\n/**\n * Storage shape for matchers keyed by event. Each event's matcher list is\n * a generic array parameterized by that event type, so lookup via\n * `HooksByEvent[E]` preserves type-safe callback signatures.\n */\nexport type HooksByEvent = {\n [E in HookEvent]?: HookMatcher<E>[];\n};\n\n/**\n * Aggregated result of a single `executeHooks` call. Fields are populated\n * according to the fold rules in `executeHooks.ts`.\n */\nexport interface AggregatedHookResult {\n /** Folded tool-gating decision; `deny > ask > allow`. */\n decision?: ToolDecision;\n /** Folded stop decision; any `block` wins. */\n stopDecision?: StopDecision;\n /** Reason from the hook that set the winning decision. */\n reason?: string;\n /**\n * Replacement tool input from a `PreToolUse` hook.\n *\n * Last-writer-wins in **registration order**: `executeHooks` uses\n * `Promise.all`, which preserves input-array order, so the fold iterates\n * outcomes in the same order they were pushed — outer loop over matchers\n * as they sit in the registry, inner loop over each matcher's `hooks`\n * array. The winner is therefore deterministic but may not match the\n * order in which hooks actually completed. Consumers that want a single\n * authoritative rewrite should still register one `updatedInput`-setting\n * hook per matcher to avoid subtle precedence bugs.\n */\n updatedInput?: Record<string, unknown>;\n /**\n * Replacement tool output from a `PostToolUse` hook.\n *\n * Same last-writer-wins-in-registration-order semantics as\n * `updatedInput`. Present only when at least one hook set it; `undefined`\n * means \"use the original tool output\".\n */\n updatedOutput?: unknown;\n /** Accumulated `additionalContext` strings from every hook, in order. */\n additionalContexts: string[];\n /** True if any hook returned `preventContinuation`. */\n preventContinuation?: boolean;\n /**\n * Reason recorded alongside `preventContinuation`. First winner wins:\n * once a hook sets both flags, later hooks that also set\n * `preventContinuation` do not overwrite the reason.\n */\n stopReason?: string;\n /** Error messages from hooks that threw; always present (possibly empty). */\n errors: string[];\n}\n"],"names":[],"mappings":";;AAGA;;;;;;;AAOG;AACI,MAAM,WAAW,GAAG;IACzB,UAAU;IACV,kBAAkB;IAClB,YAAY;IACZ,aAAa;IACb,oBAAoB;IACpB,kBAAkB;IAClB,eAAe;IACf,cAAc;IACd,MAAM;IACN,aAAa;IACb,YAAY;IACZ,aAAa;;;;;"}
1
+ {"version":3,"file":"types.cjs","sources":["../../../src/hooks/types.ts"],"sourcesContent":["// src/hooks/types.ts\nimport type { BaseMessage } from '@langchain/core/messages';\n\n/**\n * Closed set of hook lifecycle events supported by the hooks system.\n *\n * These mirror the subset of Claude Code's event surface that makes sense\n * for a library context (no filesystem/CLI-specific events). See\n * `docs/hooks-design-report.md` §3.2 for the mapping to existing\n * `@librechat/agents` emission points.\n */\nexport const HOOK_EVENTS = [\n 'RunStart',\n 'UserPromptSubmit',\n 'PreToolUse',\n 'PostToolUse',\n 'PostToolUseFailure',\n 'PermissionDenied',\n 'SubagentStart',\n 'SubagentStop',\n 'Stop',\n 'StopFailure',\n 'PreCompact',\n 'PostCompact',\n] as const;\n\nexport type HookEvent = (typeof HOOK_EVENTS)[number];\n\n/** Tool-gating decision; executeHooks folds with `deny > ask > allow` precedence. */\nexport type ToolDecision = 'allow' | 'deny' | 'ask';\n\n/** Stop-loop decision; `block` means \"do not stop, run another turn\". Any `block` wins. */\nexport type StopDecision = 'continue' | 'block';\n\n/**\n * Fields shared by every `HookInput`. Discriminated by `hook_event_name`.\n *\n * - `runId` identifies the current agent run and is always present.\n * - `threadId` identifies the conversation thread when the host has one.\n * - `agentId` is only set when the hook fires inside a subagent scope.\n */\nexport interface BaseHookInput {\n runId: string;\n threadId?: string;\n agentId?: string;\n}\n\nexport interface RunStartHookInput extends BaseHookInput {\n hook_event_name: 'RunStart';\n messages: BaseMessage[];\n}\n\nexport interface UserPromptSubmitHookInput extends BaseHookInput {\n hook_event_name: 'UserPromptSubmit';\n prompt: string;\n attachments?: BaseMessage[];\n}\n\n/**\n * Fires before a tool is invoked. Hook may return `deny`/`ask`/`allow` and/or\n * an `updatedInput` that replaces the tool arguments before invocation.\n *\n * `toolInput` is intentionally typed as `Record<string, unknown>` because the\n * SDK is tool-agnostic — concrete tool argument shapes are only known at the\n * call site and are narrowed by the host. This is the one escape hatch in\n * the hook type system.\n */\nexport interface PreToolUseHookInput extends BaseHookInput {\n hook_event_name: 'PreToolUse';\n toolName: string;\n toolInput: Record<string, unknown>;\n toolUseId: string;\n stepId?: string;\n /**\n * Number of times this tool has been invoked in prior batches within the\n * current run. Within a single batch of parallel calls, all calls to the\n * same tool share the same turn value — per-call discrimination within a\n * batch is not supported in v1.\n */\n turn?: number;\n}\n\nexport interface PostToolUseHookInput extends BaseHookInput {\n hook_event_name: 'PostToolUse';\n toolName: string;\n toolInput: Record<string, unknown>;\n toolOutput: unknown;\n toolUseId: string;\n stepId?: string;\n turn?: number;\n}\n\nexport interface PostToolUseFailureHookInput extends BaseHookInput {\n hook_event_name: 'PostToolUseFailure';\n toolName: string;\n toolInput: Record<string, unknown>;\n toolUseId: string;\n error: string;\n stepId?: string;\n turn?: number;\n}\n\nexport interface PermissionDeniedHookInput extends BaseHookInput {\n hook_event_name: 'PermissionDenied';\n toolName: string;\n toolInput: Record<string, unknown>;\n toolUseId: string;\n reason: string;\n}\n\nexport interface SubagentStartHookInput extends BaseHookInput {\n hook_event_name: 'SubagentStart';\n parentAgentId?: string;\n agentId: string;\n agentType: string;\n inputs: BaseMessage[];\n}\n\nexport interface SubagentStopHookInput extends BaseHookInput {\n hook_event_name: 'SubagentStop';\n agentId: string;\n agentType: string;\n messages: BaseMessage[];\n}\n\nexport interface StopHookInput extends BaseHookInput {\n hook_event_name: 'Stop';\n messages: BaseMessage[];\n stopReason?: string;\n stopHookActive: boolean;\n}\n\nexport interface StopFailureHookInput extends BaseHookInput {\n hook_event_name: 'StopFailure';\n error: string;\n lastAssistantMessage?: BaseMessage;\n}\n\nexport interface PreCompactHookInput extends BaseHookInput {\n hook_event_name: 'PreCompact';\n messagesBeforeCount: number;\n /**\n * What triggered compaction. Matches `SummarizationTrigger.type` from the\n * agent's summarization config. `'default'` means no trigger was\n * configured and compaction fired because messages were pruned.\n */\n trigger:\n | 'token_ratio'\n | 'remaining_tokens'\n | 'messages_to_refine'\n | 'default'\n | (string & {});\n}\n\nexport interface PostCompactHookInput extends BaseHookInput {\n hook_event_name: 'PostCompact';\n summary: string;\n /**\n * Number of messages remaining after compaction. The summarize node\n * returns a `removeAll` signal that clears all messages from state;\n * the summary itself is injected into the system prompt, not as a\n * message. This is `0` at the point of hook dispatch.\n */\n messagesAfterCount: number;\n}\n\n/** Discriminated union of every hook input shape. */\nexport type HookInput =\n | RunStartHookInput\n | UserPromptSubmitHookInput\n | PreToolUseHookInput\n | PostToolUseHookInput\n | PostToolUseFailureHookInput\n | PermissionDeniedHookInput\n | SubagentStartHookInput\n | SubagentStopHookInput\n | StopHookInput\n | StopFailureHookInput\n | PreCompactHookInput\n | PostCompactHookInput;\n\n/** Compile-time map from event name to its input shape. */\nexport type HookInputByEvent = {\n RunStart: RunStartHookInput;\n UserPromptSubmit: UserPromptSubmitHookInput;\n PreToolUse: PreToolUseHookInput;\n PostToolUse: PostToolUseHookInput;\n PostToolUseFailure: PostToolUseFailureHookInput;\n PermissionDenied: PermissionDeniedHookInput;\n SubagentStart: SubagentStartHookInput;\n SubagentStop: SubagentStopHookInput;\n Stop: StopHookInput;\n StopFailure: StopFailureHookInput;\n PreCompact: PreCompactHookInput;\n PostCompact: PostCompactHookInput;\n};\n\n/**\n * Fields common to every hook output. Hooks that have nothing to say simply\n * return `{}` (or omit the fields below).\n */\nexport interface BaseHookOutput {\n /** Context string to inject into the conversation. Accumulated across hooks. */\n additionalContext?: string;\n /** True to prevent the next model turn. Any hook can set this. */\n preventContinuation?: boolean;\n /** Reason reported alongside `preventContinuation`. */\n stopReason?: string;\n}\n\nexport type RunStartHookOutput = BaseHookOutput;\n\nexport interface UserPromptSubmitHookOutput extends BaseHookOutput {\n decision?: ToolDecision;\n reason?: string;\n}\n\nexport interface PreToolUseHookOutput extends BaseHookOutput {\n decision?: ToolDecision;\n reason?: string;\n /**\n * Replacement tool input. Merged into the pending tool call by the host.\n *\n * When multiple hooks set `updatedInput` within a single `executeHooks`\n * call, the last writer in registration order wins (outer loop: matcher\n * registration order; inner loop: hook position within the matcher). The\n * winner is deterministic — `Promise.all` preserves input-array order.\n * Consumers that need a single authoritative rewrite should still scope\n * `updatedInput` to one hook per matcher to avoid confusing precedence.\n */\n updatedInput?: Record<string, unknown>;\n}\n\nexport interface PostToolUseHookOutput extends BaseHookOutput {\n /**\n * Replacement tool output. Flows through the aggregated result so the\n * host can substitute it before appending the tool result message.\n * Ordering semantics match `PreToolUseHookOutput.updatedInput`:\n * last-writer-wins in registration order.\n */\n updatedOutput?: unknown;\n}\n\nexport type PostToolUseFailureHookOutput = BaseHookOutput;\n\nexport type PermissionDeniedHookOutput = BaseHookOutput;\n\nexport interface SubagentStartHookOutput extends BaseHookOutput {\n decision?: ToolDecision;\n reason?: string;\n}\n\nexport type SubagentStopHookOutput = BaseHookOutput;\n\nexport interface StopHookOutput extends BaseHookOutput {\n decision?: StopDecision;\n reason?: string;\n}\n\nexport type StopFailureHookOutput = BaseHookOutput;\n\nexport type PreCompactHookOutput = BaseHookOutput;\n\nexport type PostCompactHookOutput = BaseHookOutput;\n\n/** Compile-time map from event name to its output shape. */\nexport type HookOutputByEvent = {\n RunStart: RunStartHookOutput;\n UserPromptSubmit: UserPromptSubmitHookOutput;\n PreToolUse: PreToolUseHookOutput;\n PostToolUse: PostToolUseHookOutput;\n PostToolUseFailure: PostToolUseFailureHookOutput;\n PermissionDenied: PermissionDeniedHookOutput;\n SubagentStart: SubagentStartHookOutput;\n SubagentStop: SubagentStopHookOutput;\n Stop: StopHookOutput;\n StopFailure: StopFailureHookOutput;\n PreCompact: PreCompactHookOutput;\n PostCompact: PostCompactHookOutput;\n};\n\n/** Superset output shape used by the executor's fold loop. */\nexport type HookOutput =\n | RunStartHookOutput\n | UserPromptSubmitHookOutput\n | PreToolUseHookOutput\n | PostToolUseHookOutput\n | PostToolUseFailureHookOutput\n | PermissionDeniedHookOutput\n | SubagentStartHookOutput\n | SubagentStopHookOutput\n | StopHookOutput\n | StopFailureHookOutput\n | PreCompactHookOutput\n | PostCompactHookOutput;\n\n/**\n * A hook callback is a plain async function registered against a specific\n * event. The `signal` is always supplied by `executeHooks` and combines the\n * batch's parent signal with the per-hook timeout — callbacks that perform\n * long-running work should observe it.\n */\nexport type HookCallback<E extends HookEvent = HookEvent> = (\n input: HookInputByEvent[E],\n signal: AbortSignal\n) => HookOutputByEvent[E] | Promise<HookOutputByEvent[E]>;\n\n/**\n * A matcher groups one or more callbacks under a shared regex filter and\n * shared timeout/once/internal flags. The generic `E` ties the callback\n * types to the event the matcher is registered against.\n */\nexport interface HookMatcher<E extends HookEvent = HookEvent> {\n /**\n * Regex pattern matched against the event's primary query string (e.g.\n * the tool name for `PreToolUse`, the agent type for `SubagentStart`).\n *\n * Omitted or empty means \"always match\". For events that do not supply a\n * query string (`RunStart`, `Stop`, etc.), only wildcard matchers fire —\n * a non-empty pattern on such events will never match.\n *\n * Patterns are treated as trusted input: `executeHooks` compiles them\n * with `new RegExp(pattern)` without any sandbox, and a pathological\n * pattern can block the event loop. Host registration code is expected\n * to validate or length-bound patterns that originate from user input.\n */\n pattern?: string;\n /** Callbacks that fire when the matcher hits. Executed in parallel. */\n hooks: HookCallback<E>[];\n /** Per-matcher timeout in ms. Defaults to the executor's batch timeout. */\n timeout?: number;\n /**\n * Atomically remove the matcher before its first dispatch.\n *\n * `executeHooks` claims `once: true` matchers synchronously — between\n * `getMatchers` and its first `await` — so two concurrent calls cannot\n * both dispatch the same matcher. Whichever call runs its sync prefix\n * first wins the matcher; the other sees an empty bucket.\n *\n * Semantics are \"at most one dispatch, ever\" — if every hook in the\n * matcher throws, the matcher is still gone. Use `once` for\n * fire-and-forget bootstrapping (registration, telemetry, setup). Hosts\n * that need retry semantics should register a normal matcher and\n * self-unregister via the callback returned from `registry.register`.\n */\n once?: boolean;\n /** Internal hooks are excluded from telemetry and non-fatal error logging. */\n internal?: boolean;\n}\n\n/**\n * Storage shape for matchers keyed by event. Each event's matcher list is\n * a generic array parameterized by that event type, so lookup via\n * `HooksByEvent[E]` preserves type-safe callback signatures.\n */\nexport type HooksByEvent = {\n [E in HookEvent]?: HookMatcher<E>[];\n};\n\n/**\n * Aggregated result of a single `executeHooks` call. Fields are populated\n * according to the fold rules in `executeHooks.ts`.\n */\nexport interface AggregatedHookResult {\n /** Folded tool-gating decision; `deny > ask > allow`. */\n decision?: ToolDecision;\n /** Folded stop decision; any `block` wins. */\n stopDecision?: StopDecision;\n /** Reason from the hook that set the winning decision. */\n reason?: string;\n /**\n * Replacement tool input from a `PreToolUse` hook.\n *\n * Last-writer-wins in **registration order**: `executeHooks` uses\n * `Promise.all`, which preserves input-array order, so the fold iterates\n * outcomes in the same order they were pushed — outer loop over matchers\n * as they sit in the registry, inner loop over each matcher's `hooks`\n * array. The winner is therefore deterministic but may not match the\n * order in which hooks actually completed. Consumers that want a single\n * authoritative rewrite should still register one `updatedInput`-setting\n * hook per matcher to avoid subtle precedence bugs.\n */\n updatedInput?: Record<string, unknown>;\n /**\n * Replacement tool output from a `PostToolUse` hook.\n *\n * Same last-writer-wins-in-registration-order semantics as\n * `updatedInput`. Present only when at least one hook set it; `undefined`\n * means \"use the original tool output\".\n */\n updatedOutput?: unknown;\n /** Accumulated `additionalContext` strings from every hook, in order. */\n additionalContexts: string[];\n /** True if any hook returned `preventContinuation`. */\n preventContinuation?: boolean;\n /**\n * Reason recorded alongside `preventContinuation`. First winner wins:\n * once a hook sets both flags, later hooks that also set\n * `preventContinuation` do not overwrite the reason.\n */\n stopReason?: string;\n /** Error messages from hooks that threw; always present (possibly empty). */\n errors: string[];\n}\n"],"names":[],"mappings":";;AAGA;;;;;;;AAOG;AACI,MAAM,WAAW,GAAG;IACzB,UAAU;IACV,kBAAkB;IAClB,YAAY;IACZ,aAAa;IACb,oBAAoB;IACpB,kBAAkB;IAClB,eAAe;IACf,cAAc;IACd,MAAM;IACN,aAAa;IACb,YAAY;IACZ,aAAa;;;;;"}
package/dist/cjs/main.cjs CHANGED
@@ -23,6 +23,8 @@ var BashExecutor = require('./tools/BashExecutor.cjs');
23
23
  var ProgrammaticToolCalling = require('./tools/ProgrammaticToolCalling.cjs');
24
24
  var BashProgrammaticToolCalling = require('./tools/BashProgrammaticToolCalling.cjs');
25
25
  var SkillTool = require('./tools/SkillTool.cjs');
26
+ var SubagentTool = require('./tools/SubagentTool.cjs');
27
+ var SubagentExecutor = require('./tools/subagent/SubagentExecutor.cjs');
26
28
  var ReadFile = require('./tools/ReadFile.cjs');
27
29
  var skillCatalog = require('./tools/skillCatalog.cjs');
28
30
  var ToolSearch = require('./tools/ToolSearch.cjs');
@@ -154,6 +156,16 @@ exports.SkillToolDefinition = SkillTool.SkillToolDefinition;
154
156
  exports.SkillToolDescription = SkillTool.SkillToolDescription;
155
157
  exports.SkillToolName = SkillTool.SkillToolName;
156
158
  exports.SkillToolSchema = SkillTool.SkillToolSchema;
159
+ exports.SubagentToolDefinition = SubagentTool.SubagentToolDefinition;
160
+ exports.SubagentToolDescription = SubagentTool.SubagentToolDescription;
161
+ exports.SubagentToolName = SubagentTool.SubagentToolName;
162
+ exports.SubagentToolSchema = SubagentTool.SubagentToolSchema;
163
+ exports.buildSubagentToolParams = SubagentTool.buildSubagentToolParams;
164
+ exports.createSubagentToolDefinition = SubagentTool.createSubagentToolDefinition;
165
+ exports.SubagentExecutor = SubagentExecutor.SubagentExecutor;
166
+ exports.buildChildInputs = SubagentExecutor.buildChildInputs;
167
+ exports.filterSubagentResult = SubagentExecutor.filterSubagentResult;
168
+ exports.resolveSubagentConfigs = SubagentExecutor.resolveSubagentConfigs;
157
169
  exports.ReadFileToolDefinition = ReadFile.ReadFileToolDefinition;
158
170
  exports.ReadFileToolDescription = ReadFile.ReadFileToolDescription;
159
171
  exports.ReadFileToolName = ReadFile.ReadFileToolName;
@@ -1 +1 @@
1
- {"version":3,"file":"main.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"main.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -9,6 +9,7 @@ var request = require('../llm/request.cjs');
9
9
  var cache = require('../messages/cache.cjs');
10
10
  var init = require('../llm/init.cjs');
11
11
  var stream = require('../stream.cjs');
12
+ var executeHooks = require('../hooks/executeHooks.cjs');
12
13
 
13
14
  const SUMMARIZATION_PARAM_KEYS = new Set(['maxSummaryTokens']);
14
15
  /**
@@ -372,6 +373,31 @@ async function dispatchCompletionEvents(params) {
372
373
  summary: summaryBlock,
373
374
  }, runnableConfig);
374
375
  }
376
+ const sessionId = graph.runId ?? '';
377
+ if (graph.hookRegistry?.hasHookFor('PostCompact', sessionId) === true) {
378
+ const threadId = runnableConfig?.configurable?.thread_id;
379
+ const firstBlock = summaryBlock.content?.[0];
380
+ const summaryText = firstBlock != null &&
381
+ typeof firstBlock === 'object' &&
382
+ 'text' in firstBlock &&
383
+ typeof firstBlock.text === 'string'
384
+ ? firstBlock.text
385
+ : '';
386
+ await executeHooks.executeHooks({
387
+ registry: graph.hookRegistry,
388
+ input: {
389
+ hook_event_name: 'PostCompact',
390
+ runId: sessionId,
391
+ threadId,
392
+ agentId,
393
+ summary: summaryText,
394
+ messagesAfterCount: 0,
395
+ },
396
+ sessionId,
397
+ }).catch(() => {
398
+ /* PostCompact is observational — swallow errors */
399
+ });
400
+ }
375
401
  agentContext.rebuildTokenMapAfterSummarization({});
376
402
  }
377
403
  function createSummarizeNode({ agentContext, graph, generateStepId, }) {
@@ -428,6 +454,24 @@ function createSummarizeNode({ agentContext, graph, generateStepId, }) {
428
454
  summaryVersion: agentContext.summaryVersion + 1,
429
455
  }, runnableConfig);
430
456
  }
457
+ const sessionId = graph.runId ?? '';
458
+ if (graph.hookRegistry?.hasHookFor('PreCompact', sessionId) === true) {
459
+ const threadId = runnableConfig?.configurable?.thread_id;
460
+ await executeHooks.executeHooks({
461
+ registry: graph.hookRegistry,
462
+ input: {
463
+ hook_event_name: 'PreCompact',
464
+ runId: sessionId,
465
+ threadId,
466
+ agentId: request.agentId,
467
+ messagesBeforeCount: messagesToRefine.length,
468
+ trigger: agentContext.summarizationConfig?.trigger?.type ?? 'default',
469
+ },
470
+ sessionId,
471
+ }).catch(() => {
472
+ /* PreCompact is observational — swallow errors */
473
+ });
474
+ }
431
475
  const isSelfSummarizeModel = clientConfig.provider === agentContext.provider;
432
476
  const hasPromptCache = isSelfSummarizeModel &&
433
477
  agentContext.clientOptions