@librechat/agents 3.1.64 → 3.1.66-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 (126) hide show
  1. package/dist/cjs/common/enum.cjs +13 -0
  2. package/dist/cjs/common/enum.cjs.map +1 -1
  3. package/dist/cjs/graphs/Graph.cjs +3 -0
  4. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  5. package/dist/cjs/hooks/HookRegistry.cjs +162 -0
  6. package/dist/cjs/hooks/HookRegistry.cjs.map +1 -0
  7. package/dist/cjs/hooks/executeHooks.cjs +276 -0
  8. package/dist/cjs/hooks/executeHooks.cjs.map +1 -0
  9. package/dist/cjs/hooks/matchers.cjs +256 -0
  10. package/dist/cjs/hooks/matchers.cjs.map +1 -0
  11. package/dist/cjs/hooks/types.cjs +27 -0
  12. package/dist/cjs/hooks/types.cjs.map +1 -0
  13. package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
  14. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +69 -54
  15. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  16. package/dist/cjs/main.cjs +40 -0
  17. package/dist/cjs/main.cjs.map +1 -1
  18. package/dist/cjs/messages/core.cjs +8 -1
  19. package/dist/cjs/messages/core.cjs.map +1 -1
  20. package/dist/cjs/messages/format.cjs +74 -12
  21. package/dist/cjs/messages/format.cjs.map +1 -1
  22. package/dist/cjs/run.cjs +111 -0
  23. package/dist/cjs/run.cjs.map +1 -1
  24. package/dist/cjs/tools/BashExecutor.cjs +175 -0
  25. package/dist/cjs/tools/BashExecutor.cjs.map +1 -0
  26. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +296 -0
  27. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -0
  28. package/dist/cjs/tools/ReadFile.cjs +43 -0
  29. package/dist/cjs/tools/ReadFile.cjs.map +1 -0
  30. package/dist/cjs/tools/SkillTool.cjs +50 -0
  31. package/dist/cjs/tools/SkillTool.cjs.map +1 -0
  32. package/dist/cjs/tools/ToolNode.cjs +304 -140
  33. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  34. package/dist/cjs/tools/skillCatalog.cjs +84 -0
  35. package/dist/cjs/tools/skillCatalog.cjs.map +1 -0
  36. package/dist/esm/common/enum.mjs +12 -1
  37. package/dist/esm/common/enum.mjs.map +1 -1
  38. package/dist/esm/graphs/Graph.mjs +3 -0
  39. package/dist/esm/graphs/Graph.mjs.map +1 -1
  40. package/dist/esm/hooks/HookRegistry.mjs +160 -0
  41. package/dist/esm/hooks/HookRegistry.mjs.map +1 -0
  42. package/dist/esm/hooks/executeHooks.mjs +273 -0
  43. package/dist/esm/hooks/executeHooks.mjs.map +1 -0
  44. package/dist/esm/hooks/matchers.mjs +251 -0
  45. package/dist/esm/hooks/matchers.mjs.map +1 -0
  46. package/dist/esm/hooks/types.mjs +25 -0
  47. package/dist/esm/hooks/types.mjs.map +1 -0
  48. package/dist/esm/llm/anthropic/types.mjs.map +1 -1
  49. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +69 -54
  50. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  51. package/dist/esm/main.mjs +10 -1
  52. package/dist/esm/main.mjs.map +1 -1
  53. package/dist/esm/messages/core.mjs +8 -1
  54. package/dist/esm/messages/core.mjs.map +1 -1
  55. package/dist/esm/messages/format.mjs +66 -4
  56. package/dist/esm/messages/format.mjs.map +1 -1
  57. package/dist/esm/run.mjs +111 -0
  58. package/dist/esm/run.mjs.map +1 -1
  59. package/dist/esm/tools/BashExecutor.mjs +169 -0
  60. package/dist/esm/tools/BashExecutor.mjs.map +1 -0
  61. package/dist/esm/tools/BashProgrammaticToolCalling.mjs +287 -0
  62. package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -0
  63. package/dist/esm/tools/ReadFile.mjs +38 -0
  64. package/dist/esm/tools/ReadFile.mjs.map +1 -0
  65. package/dist/esm/tools/SkillTool.mjs +45 -0
  66. package/dist/esm/tools/SkillTool.mjs.map +1 -0
  67. package/dist/esm/tools/ToolNode.mjs +306 -142
  68. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  69. package/dist/esm/tools/skillCatalog.mjs +82 -0
  70. package/dist/esm/tools/skillCatalog.mjs.map +1 -0
  71. package/dist/types/common/enum.d.ts +7 -1
  72. package/dist/types/graphs/Graph.d.ts +2 -0
  73. package/dist/types/hooks/HookRegistry.d.ts +56 -0
  74. package/dist/types/hooks/executeHooks.d.ts +79 -0
  75. package/dist/types/hooks/index.d.ts +6 -0
  76. package/dist/types/hooks/matchers.d.ts +95 -0
  77. package/dist/types/hooks/types.d.ts +309 -0
  78. package/dist/types/index.d.ts +6 -0
  79. package/dist/types/llm/anthropic/types.d.ts +1 -1
  80. package/dist/types/messages/format.d.ts +2 -1
  81. package/dist/types/run.d.ts +1 -0
  82. package/dist/types/tools/BashExecutor.d.ts +45 -0
  83. package/dist/types/tools/BashProgrammaticToolCalling.d.ts +72 -0
  84. package/dist/types/tools/ReadFile.d.ts +28 -0
  85. package/dist/types/tools/SkillTool.d.ts +40 -0
  86. package/dist/types/tools/ToolNode.d.ts +24 -2
  87. package/dist/types/tools/skillCatalog.d.ts +19 -0
  88. package/dist/types/types/index.d.ts +1 -0
  89. package/dist/types/types/run.d.ts +20 -0
  90. package/dist/types/types/skill.d.ts +9 -0
  91. package/dist/types/types/tools.d.ts +38 -1
  92. package/package.json +2 -2
  93. package/src/common/enum.ts +12 -0
  94. package/src/graphs/Graph.ts +4 -0
  95. package/src/hooks/HookRegistry.ts +208 -0
  96. package/src/hooks/__tests__/HookRegistry.test.ts +190 -0
  97. package/src/hooks/__tests__/executeHooks.test.ts +1013 -0
  98. package/src/hooks/__tests__/integration.test.ts +337 -0
  99. package/src/hooks/__tests__/matchers.test.ts +238 -0
  100. package/src/hooks/__tests__/toolHooks.test.ts +669 -0
  101. package/src/hooks/executeHooks.ts +375 -0
  102. package/src/hooks/index.ts +55 -0
  103. package/src/hooks/matchers.ts +280 -0
  104. package/src/hooks/types.ts +388 -0
  105. package/src/index.ts +8 -0
  106. package/src/llm/anthropic/types.ts +1 -1
  107. package/src/llm/anthropic/utils/message_inputs.ts +93 -68
  108. package/src/llm/anthropic/utils/server-tool-inputs.test.ts +349 -0
  109. package/src/messages/core.ts +8 -1
  110. package/src/messages/format.ts +74 -4
  111. package/src/messages/formatAgentMessages.skills.test.ts +334 -0
  112. package/src/run.ts +126 -0
  113. package/src/tools/BashExecutor.ts +205 -0
  114. package/src/tools/BashProgrammaticToolCalling.ts +397 -0
  115. package/src/tools/ReadFile.ts +39 -0
  116. package/src/tools/SkillTool.ts +46 -0
  117. package/src/tools/ToolNode.ts +391 -169
  118. package/src/tools/__tests__/ReadFile.test.ts +44 -0
  119. package/src/tools/__tests__/SkillTool.test.ts +442 -0
  120. package/src/tools/__tests__/ToolNode.session.test.ts +12 -12
  121. package/src/tools/__tests__/skillCatalog.test.ts +161 -0
  122. package/src/tools/skillCatalog.ts +126 -0
  123. package/src/types/index.ts +1 -0
  124. package/src/types/run.ts +20 -0
  125. package/src/types/skill.ts +11 -0
  126. package/src/types/tools.ts +41 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ToolNode.mjs","sources":["../../../src/tools/ToolNode.ts"],"sourcesContent":["import { ToolCall } from '@langchain/core/messages/tool';\nimport {\n ToolMessage,\n isAIMessage,\n isBaseMessage,\n} from '@langchain/core/messages';\nimport {\n END,\n Send,\n Command,\n isCommand,\n isGraphInterrupt,\n MessagesAnnotation,\n} from '@langchain/langgraph';\nimport type {\n RunnableConfig,\n RunnableToolLike,\n} from '@langchain/core/runnables';\nimport type { BaseMessage, AIMessage } from '@langchain/core/messages';\nimport type { StructuredToolInterface } from '@langchain/core/tools';\nimport type * as t from '@/types';\nimport { RunnableCallable } from '@/utils';\nimport {\n calculateMaxToolResultChars,\n truncateToolResultContent,\n} from '@/utils/truncation';\nimport { safeDispatchCustomEvent } from '@/utils/events';\nimport { Constants, GraphEvents } from '@/common';\n\n/**\n * Helper to check if a value is a Send object\n */\nfunction isSend(value: unknown): value is Send {\n return value instanceof Send;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class ToolNode<T = any> extends RunnableCallable<T, T> {\n private toolMap: Map<string, StructuredToolInterface | RunnableToolLike>;\n private loadRuntimeTools?: t.ToolRefGenerator;\n handleToolErrors = true;\n trace = false;\n toolCallStepIds?: Map<string, string>;\n errorHandler?: t.ToolNodeConstructorParams['errorHandler'];\n private toolUsageCount: Map<string, number>;\n /** Maps toolCallId → turn captured in runTool, used by handleRunToolCompletions */\n private toolCallTurns: Map<string, number> = new Map();\n /** Tool registry for filtering (lazy computation of programmatic maps) */\n private toolRegistry?: t.LCToolRegistry;\n /** Cached programmatic tools (computed once on first PTC call) */\n private programmaticCache?: t.ProgrammaticCache;\n /** Reference to Graph's sessions map for automatic session injection */\n private sessions?: t.ToolSessionMap;\n /** When true, dispatches ON_TOOL_EXECUTE events instead of invoking tools directly */\n private eventDrivenMode: boolean = false;\n /** Agent ID for event-driven mode */\n private agentId?: string;\n /** Tool names that bypass event dispatch and execute directly (e.g., graph-managed handoff tools) */\n private directToolNames?: Set<string>;\n /** Maximum characters allowed in a single tool result before truncation. */\n private maxToolResultChars: number;\n\n constructor({\n tools,\n toolMap,\n name,\n tags,\n errorHandler,\n toolCallStepIds,\n handleToolErrors,\n loadRuntimeTools,\n toolRegistry,\n sessions,\n eventDrivenMode,\n agentId,\n directToolNames,\n maxContextTokens,\n maxToolResultChars,\n }: t.ToolNodeConstructorParams) {\n super({ name, tags, func: (input, config) => this.run(input, config) });\n this.toolMap = toolMap ?? new Map(tools.map((tool) => [tool.name, tool]));\n this.toolCallStepIds = toolCallStepIds;\n this.handleToolErrors = handleToolErrors ?? this.handleToolErrors;\n this.loadRuntimeTools = loadRuntimeTools;\n this.errorHandler = errorHandler;\n this.toolUsageCount = new Map<string, number>();\n this.toolRegistry = toolRegistry;\n this.sessions = sessions;\n this.eventDrivenMode = eventDrivenMode ?? false;\n this.agentId = agentId;\n this.directToolNames = directToolNames;\n this.maxToolResultChars =\n maxToolResultChars ?? calculateMaxToolResultChars(maxContextTokens);\n }\n\n /**\n * Returns cached programmatic tools, computing once on first access.\n * Single iteration builds both toolMap and toolDefs simultaneously.\n */\n private getProgrammaticTools(): { toolMap: t.ToolMap; toolDefs: t.LCTool[] } {\n if (this.programmaticCache) return this.programmaticCache;\n\n const toolMap: t.ToolMap = new Map();\n const toolDefs: t.LCTool[] = [];\n\n if (this.toolRegistry) {\n for (const [name, toolDef] of this.toolRegistry) {\n if (\n (toolDef.allowed_callers ?? ['direct']).includes('code_execution')\n ) {\n toolDefs.push(toolDef);\n const tool = this.toolMap.get(name);\n if (tool) toolMap.set(name, tool);\n }\n }\n }\n\n this.programmaticCache = { toolMap, toolDefs };\n return this.programmaticCache;\n }\n\n /**\n * Returns a snapshot of the current tool usage counts.\n * @returns A ReadonlyMap where keys are tool names and values are their usage counts.\n */\n public getToolUsageCounts(): ReadonlyMap<string, number> {\n return new Map(this.toolUsageCount); // Return a copy\n }\n\n /**\n * Runs a single tool call with error handling\n */\n protected async runTool(\n call: ToolCall,\n config: RunnableConfig\n ): Promise<BaseMessage | Command> {\n const tool = this.toolMap.get(call.name);\n try {\n if (tool === undefined) {\n throw new Error(`Tool \"${call.name}\" not found.`);\n }\n const turn = this.toolUsageCount.get(call.name) ?? 0;\n this.toolUsageCount.set(call.name, turn + 1);\n if (call.id != null && call.id !== '') {\n this.toolCallTurns.set(call.id, turn);\n }\n const args = call.args;\n const stepId = this.toolCallStepIds?.get(call.id!);\n\n // Build invoke params - LangChain extracts non-schema fields to config.toolCall\n let invokeParams: Record<string, unknown> = {\n ...call,\n args,\n type: 'tool_call',\n stepId,\n turn,\n };\n\n // Inject runtime data for special tools (becomes available at config.toolCall)\n if (call.name === Constants.PROGRAMMATIC_TOOL_CALLING) {\n const { toolMap, toolDefs } = this.getProgrammaticTools();\n invokeParams = {\n ...invokeParams,\n toolMap,\n toolDefs,\n };\n } else if (call.name === Constants.TOOL_SEARCH) {\n invokeParams = {\n ...invokeParams,\n toolRegistry: this.toolRegistry,\n };\n }\n\n /**\n * Inject session context for code execution tools when available.\n * Each file uses its own session_id (supporting multi-session file tracking).\n * Both session_id and _injected_files are injected directly to invokeParams\n * (not inside args) so they bypass Zod schema validation and reach config.toolCall.\n *\n * session_id is always injected when available (even without tracked files)\n * so the CodeExecutor can fall back to the /files endpoint for session continuity.\n */\n if (\n call.name === Constants.EXECUTE_CODE ||\n call.name === Constants.PROGRAMMATIC_TOOL_CALLING\n ) {\n const codeSession = this.sessions?.get(Constants.EXECUTE_CODE) as\n | t.CodeSessionContext\n | undefined;\n if (codeSession?.session_id != null && codeSession.session_id !== '') {\n invokeParams = {\n ...invokeParams,\n session_id: codeSession.session_id,\n };\n\n if (codeSession.files != null && codeSession.files.length > 0) {\n const fileRefs: t.CodeEnvFile[] = codeSession.files.map((file) => ({\n session_id: file.session_id ?? codeSession.session_id,\n id: file.id,\n name: file.name,\n }));\n invokeParams._injected_files = fileRefs;\n }\n }\n }\n\n const output = await tool.invoke(invokeParams, config);\n if (\n (isBaseMessage(output) && output._getType() === 'tool') ||\n isCommand(output)\n ) {\n return output;\n } else {\n const rawContent =\n typeof output === 'string' ? output : JSON.stringify(output);\n return new ToolMessage({\n status: 'success',\n name: tool.name,\n content: truncateToolResultContent(\n rawContent,\n this.maxToolResultChars\n ),\n tool_call_id: call.id!,\n });\n }\n } catch (_e: unknown) {\n const e = _e as Error;\n if (!this.handleToolErrors) {\n throw e;\n }\n if (isGraphInterrupt(e)) {\n throw e;\n }\n if (this.errorHandler) {\n try {\n await this.errorHandler(\n {\n error: e,\n id: call.id!,\n name: call.name,\n input: call.args,\n },\n config.metadata\n );\n } catch (handlerError) {\n // eslint-disable-next-line no-console\n console.error('Error in errorHandler:', {\n toolName: call.name,\n toolCallId: call.id,\n toolArgs: call.args,\n stepId: this.toolCallStepIds?.get(call.id!),\n turn: this.toolUsageCount.get(call.name),\n originalError: {\n message: e.message,\n stack: e.stack ?? undefined,\n },\n handlerError:\n handlerError instanceof Error\n ? {\n message: handlerError.message,\n stack: handlerError.stack ?? undefined,\n }\n : {\n message: String(handlerError),\n stack: undefined,\n },\n });\n }\n }\n return new ToolMessage({\n status: 'error',\n content: `Error: ${e.message}\\n Please fix your mistakes.`,\n name: call.name,\n tool_call_id: call.id ?? '',\n });\n }\n }\n\n /**\n * Builds code session context for injection into event-driven tool calls.\n * Mirrors the session injection logic in runTool() for direct execution.\n */\n private getCodeSessionContext(): t.ToolCallRequest['codeSessionContext'] {\n if (!this.sessions) {\n return undefined;\n }\n\n const codeSession = this.sessions.get(Constants.EXECUTE_CODE) as\n | t.CodeSessionContext\n | undefined;\n if (!codeSession) {\n return undefined;\n }\n\n const context: NonNullable<t.ToolCallRequest['codeSessionContext']> = {\n session_id: codeSession.session_id,\n };\n\n if (codeSession.files && codeSession.files.length > 0) {\n context.files = codeSession.files.map((file) => ({\n session_id: file.session_id ?? codeSession.session_id,\n id: file.id,\n name: file.name,\n }));\n }\n\n return context;\n }\n\n /**\n * Extracts code execution session context from tool results and stores in Graph.sessions.\n * Mirrors the session storage logic in handleRunToolCompletions for direct execution.\n */\n private storeCodeSessionFromResults(\n results: t.ToolExecuteResult[],\n requests: t.ToolCallRequest[]\n ): void {\n if (!this.sessions) {\n return;\n }\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n if (result.status !== 'success' || result.artifact == null) {\n continue;\n }\n\n const request = requests.find((r) => r.id === result.toolCallId);\n if (\n request?.name !== Constants.EXECUTE_CODE &&\n request?.name !== Constants.PROGRAMMATIC_TOOL_CALLING\n ) {\n continue;\n }\n\n const artifact = result.artifact as t.CodeExecutionArtifact | undefined;\n if (artifact?.session_id == null || artifact.session_id === '') {\n continue;\n }\n\n const newFiles = artifact.files ?? [];\n const existingSession = this.sessions.get(Constants.EXECUTE_CODE) as\n | t.CodeSessionContext\n | undefined;\n const existingFiles = existingSession?.files ?? [];\n\n if (newFiles.length > 0) {\n const filesWithSession: t.FileRefs = newFiles.map((file) => ({\n ...file,\n session_id: artifact.session_id,\n }));\n\n const newFileNames = new Set(filesWithSession.map((f) => f.name));\n const filteredExisting = existingFiles.filter(\n (f) => !newFileNames.has(f.name)\n );\n\n this.sessions.set(Constants.EXECUTE_CODE, {\n session_id: artifact.session_id,\n files: [...filteredExisting, ...filesWithSession],\n lastUpdated: Date.now(),\n });\n } else {\n this.sessions.set(Constants.EXECUTE_CODE, {\n session_id: artifact.session_id,\n files: existingFiles,\n lastUpdated: Date.now(),\n });\n }\n }\n }\n\n /**\n * Post-processes standard runTool outputs: dispatches ON_RUN_STEP_COMPLETED\n * and stores code session context. Mirrors the completion handling in\n * dispatchToolEvents for the event-driven path.\n *\n * By handling completions here in graph context (rather than in the\n * stream consumer via ToolEndHandler), the race between the stream\n * consumer and graph execution is eliminated.\n */\n private handleRunToolCompletions(\n calls: ToolCall[],\n outputs: (BaseMessage | Command)[],\n config: RunnableConfig\n ): void {\n for (let i = 0; i < calls.length; i++) {\n const call = calls[i];\n const output = outputs[i];\n const turn = this.toolCallTurns.get(call.id!) ?? 0;\n\n if (isCommand(output)) {\n continue;\n }\n\n const toolMessage = output as ToolMessage;\n const toolCallId = call.id ?? '';\n\n // Skip error ToolMessages when errorHandler already dispatched ON_RUN_STEP_COMPLETED\n // via handleToolCallErrorStatic. Without this check, errors would be double-dispatched.\n if (toolMessage.status === 'error' && this.errorHandler != null) {\n continue;\n }\n\n // Store code session context from tool results\n if (\n this.sessions &&\n (call.name === Constants.EXECUTE_CODE ||\n call.name === Constants.PROGRAMMATIC_TOOL_CALLING)\n ) {\n const artifact = toolMessage.artifact as\n | t.CodeExecutionArtifact\n | undefined;\n if (artifact?.session_id != null && artifact.session_id !== '') {\n const newFiles = artifact.files ?? [];\n const existingSession = this.sessions.get(Constants.EXECUTE_CODE) as\n | t.CodeSessionContext\n | undefined;\n const existingFiles = existingSession?.files ?? [];\n\n if (newFiles.length > 0) {\n const filesWithSession: t.FileRefs = newFiles.map((file) => ({\n ...file,\n session_id: artifact.session_id,\n }));\n const newFileNames = new Set(filesWithSession.map((f) => f.name));\n const filteredExisting = existingFiles.filter(\n (f) => !newFileNames.has(f.name)\n );\n this.sessions.set(Constants.EXECUTE_CODE, {\n session_id: artifact.session_id,\n files: [...filteredExisting, ...filesWithSession],\n lastUpdated: Date.now(),\n });\n } else {\n this.sessions.set(Constants.EXECUTE_CODE, {\n session_id: artifact.session_id,\n files: existingFiles,\n lastUpdated: Date.now(),\n });\n }\n }\n }\n\n // Dispatch ON_RUN_STEP_COMPLETED via custom event (same path as dispatchToolEvents)\n const stepId = this.toolCallStepIds?.get(toolCallId) ?? '';\n if (!stepId) {\n continue;\n }\n\n const contentString =\n typeof toolMessage.content === 'string'\n ? toolMessage.content\n : JSON.stringify(toolMessage.content);\n\n const tool_call: t.ProcessedToolCall = {\n args:\n typeof call.args === 'string'\n ? (call.args as string)\n : JSON.stringify((call.args as unknown) ?? {}),\n name: call.name,\n id: toolCallId,\n output: contentString,\n progress: 1,\n };\n\n safeDispatchCustomEvent(\n GraphEvents.ON_RUN_STEP_COMPLETED,\n {\n result: {\n id: stepId,\n index: turn,\n type: 'tool_call' as const,\n tool_call,\n },\n },\n config\n );\n }\n }\n\n /**\n * Dispatches tool calls to the host via ON_TOOL_EXECUTE event and returns raw ToolMessages.\n * Core logic for event-driven execution, separated from output shaping.\n */\n private async dispatchToolEvents(\n toolCalls: ToolCall[],\n config: RunnableConfig\n ): Promise<ToolMessage[]> {\n const requests: t.ToolCallRequest[] = toolCalls.map((call) => {\n const turn = this.toolUsageCount.get(call.name) ?? 0;\n this.toolUsageCount.set(call.name, turn + 1);\n\n const request: t.ToolCallRequest = {\n id: call.id!,\n name: call.name,\n args: call.args as Record<string, unknown>,\n stepId: this.toolCallStepIds?.get(call.id!),\n turn,\n };\n\n if (\n call.name === Constants.EXECUTE_CODE ||\n call.name === Constants.PROGRAMMATIC_TOOL_CALLING\n ) {\n request.codeSessionContext = this.getCodeSessionContext();\n }\n\n return request;\n });\n\n const results = await new Promise<t.ToolExecuteResult[]>(\n (resolve, reject) => {\n const request: t.ToolExecuteBatchRequest = {\n toolCalls: requests,\n userId: config.configurable?.user_id as string | undefined,\n agentId: this.agentId,\n configurable: config.configurable as\n | Record<string, unknown>\n | undefined,\n metadata: config.metadata as Record<string, unknown> | undefined,\n resolve,\n reject,\n };\n\n safeDispatchCustomEvent(GraphEvents.ON_TOOL_EXECUTE, request, config);\n }\n );\n\n this.storeCodeSessionFromResults(results, requests);\n\n return results.map((result) => {\n const request = requests.find((r) => r.id === result.toolCallId);\n const toolName = request?.name ?? 'unknown';\n const stepId = this.toolCallStepIds?.get(result.toolCallId) ?? '';\n if (!stepId) {\n // eslint-disable-next-line no-console\n console.warn(\n `[ToolNode] toolCallStepIds missing entry for toolCallId=${result.toolCallId} (tool=${toolName}). ` +\n 'This indicates a race between the stream consumer and graph execution. ' +\n `Map size: ${this.toolCallStepIds?.size ?? 0}`\n );\n }\n\n let toolMessage: ToolMessage;\n let contentString: string;\n\n if (result.status === 'error') {\n contentString = `Error: ${result.errorMessage ?? 'Unknown error'}\\n Please fix your mistakes.`;\n toolMessage = new ToolMessage({\n status: 'error',\n content: contentString,\n name: toolName,\n tool_call_id: result.toolCallId,\n });\n } else {\n const rawContent =\n typeof result.content === 'string'\n ? result.content\n : JSON.stringify(result.content);\n contentString = truncateToolResultContent(\n rawContent,\n this.maxToolResultChars\n );\n toolMessage = new ToolMessage({\n status: 'success',\n name: toolName,\n content: contentString,\n artifact: result.artifact,\n tool_call_id: result.toolCallId,\n });\n }\n\n const tool_call: t.ProcessedToolCall = {\n args:\n typeof request?.args === 'string'\n ? request.args\n : JSON.stringify(request?.args ?? {}),\n name: toolName,\n id: result.toolCallId,\n output: contentString,\n progress: 1,\n };\n\n const runStepCompletedData = {\n result: {\n id: stepId,\n index: request?.turn ?? 0,\n type: 'tool_call' as const,\n tool_call,\n },\n };\n\n safeDispatchCustomEvent(\n GraphEvents.ON_RUN_STEP_COMPLETED,\n runStepCompletedData,\n config\n );\n\n return toolMessage;\n });\n }\n\n /**\n * Execute all tool calls via ON_TOOL_EXECUTE event dispatch.\n * Used in event-driven mode where the host handles actual tool execution.\n */\n private async executeViaEvent(\n toolCalls: ToolCall[],\n config: RunnableConfig,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n input: any\n ): Promise<T> {\n const outputs = await this.dispatchToolEvents(toolCalls, config);\n return (Array.isArray(input) ? outputs : { messages: outputs }) as T;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected async run(input: any, config: RunnableConfig): Promise<T> {\n this.toolCallTurns.clear();\n let outputs: (BaseMessage | Command)[];\n\n if (this.isSendInput(input)) {\n const isDirectTool = this.directToolNames?.has(input.lg_tool_call.name);\n if (this.eventDrivenMode && isDirectTool !== true) {\n return this.executeViaEvent([input.lg_tool_call], config, input);\n }\n outputs = [await this.runTool(input.lg_tool_call, config)];\n this.handleRunToolCompletions([input.lg_tool_call], outputs, config);\n } else {\n let messages: BaseMessage[];\n if (Array.isArray(input)) {\n messages = input;\n } else if (this.isMessagesState(input)) {\n messages = input.messages;\n } else {\n throw new Error(\n 'ToolNode only accepts BaseMessage[] or { messages: BaseMessage[] } as input.'\n );\n }\n\n const toolMessageIds: Set<string> = new Set(\n messages\n .filter((msg) => msg._getType() === 'tool')\n .map((msg) => (msg as ToolMessage).tool_call_id)\n );\n\n let aiMessage: AIMessage | undefined;\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i];\n if (isAIMessage(message)) {\n aiMessage = message;\n break;\n }\n }\n\n if (aiMessage == null || !isAIMessage(aiMessage)) {\n throw new Error('ToolNode only accepts AIMessages as input.');\n }\n\n if (this.loadRuntimeTools) {\n const { tools, toolMap } = this.loadRuntimeTools(\n aiMessage.tool_calls ?? []\n );\n this.toolMap =\n toolMap ?? new Map(tools.map((tool) => [tool.name, tool]));\n this.programmaticCache = undefined; // Invalidate cache on toolMap change\n }\n\n const filteredCalls =\n aiMessage.tool_calls?.filter((call) => {\n /**\n * Filter out:\n * 1. Already processed tool calls (present in toolMessageIds)\n * 2. Server tool calls (e.g., web_search with IDs starting with 'srvtoolu_')\n * which are executed by the provider's API and don't require invocation\n */\n return (\n (call.id == null || !toolMessageIds.has(call.id)) &&\n !(\n call.id?.startsWith(Constants.ANTHROPIC_SERVER_TOOL_PREFIX) ??\n false\n )\n );\n }) ?? [];\n\n if (this.eventDrivenMode && filteredCalls.length > 0) {\n if (!this.directToolNames || this.directToolNames.size === 0) {\n return this.executeViaEvent(filteredCalls, config, input);\n }\n\n const directCalls = filteredCalls.filter((c) =>\n this.directToolNames!.has(c.name)\n );\n const eventCalls = filteredCalls.filter(\n (c) => !this.directToolNames!.has(c.name)\n );\n\n const directOutputs: (BaseMessage | Command)[] =\n directCalls.length > 0\n ? await Promise.all(\n directCalls.map((call) => this.runTool(call, config))\n )\n : [];\n\n if (directCalls.length > 0 && directOutputs.length > 0) {\n this.handleRunToolCompletions(directCalls, directOutputs, config);\n }\n\n const eventOutputs: ToolMessage[] =\n eventCalls.length > 0\n ? await this.dispatchToolEvents(eventCalls, config)\n : [];\n\n outputs = [...directOutputs, ...eventOutputs];\n } else {\n outputs = await Promise.all(\n filteredCalls.map((call) => this.runTool(call, config))\n );\n this.handleRunToolCompletions(filteredCalls, outputs, config);\n }\n }\n\n if (!outputs.some(isCommand)) {\n return (Array.isArray(input) ? outputs : { messages: outputs }) as T;\n }\n\n const combinedOutputs: (\n | { messages: BaseMessage[] }\n | BaseMessage[]\n | Command\n )[] = [];\n let parentCommand: Command | null = null;\n\n /**\n * Collect handoff commands (Commands with string goto and Command.PARENT)\n * for potential parallel handoff aggregation\n */\n const handoffCommands: Command[] = [];\n const nonCommandOutputs: BaseMessage[] = [];\n\n for (const output of outputs) {\n if (isCommand(output)) {\n if (\n output.graph === Command.PARENT &&\n Array.isArray(output.goto) &&\n output.goto.every((send): send is Send => isSend(send))\n ) {\n /** Aggregate Send-based commands */\n if (parentCommand) {\n (parentCommand.goto as Send[]).push(...(output.goto as Send[]));\n } else {\n parentCommand = new Command({\n graph: Command.PARENT,\n goto: output.goto,\n });\n }\n } else if (output.graph === Command.PARENT) {\n /**\n * Handoff Command with destination.\n * Handle both string ('agent') and array (['agent']) formats.\n * Collect for potential parallel aggregation.\n */\n const goto = output.goto;\n const isSingleStringDest = typeof goto === 'string';\n const isSingleArrayDest =\n Array.isArray(goto) &&\n goto.length === 1 &&\n typeof goto[0] === 'string';\n\n if (isSingleStringDest || isSingleArrayDest) {\n handoffCommands.push(output);\n } else {\n /** Multi-destination or other command - pass through */\n combinedOutputs.push(output);\n }\n } else {\n /** Other commands - pass through */\n combinedOutputs.push(output);\n }\n } else {\n nonCommandOutputs.push(output);\n combinedOutputs.push(\n Array.isArray(input) ? [output] : { messages: [output] }\n );\n }\n }\n\n /**\n * Handle handoff commands - convert to Send objects for parallel execution\n * when multiple handoffs are requested\n */\n if (handoffCommands.length > 1) {\n /**\n * Multiple parallel handoffs - convert to Send objects.\n * Each Send carries its own state with the appropriate messages.\n * This enables LLM-initiated parallel execution when calling multiple\n * transfer tools simultaneously.\n */\n\n /** Collect all destinations for sibling tracking */\n const allDestinations = handoffCommands.map((cmd) => {\n const goto = cmd.goto;\n return typeof goto === 'string' ? goto : (goto as string[])[0];\n });\n\n const sends = handoffCommands.map((cmd, idx) => {\n const destination = allDestinations[idx];\n /** Get siblings (other destinations, not this one) */\n const siblings = allDestinations.filter((d) => d !== destination);\n\n /** Add siblings to ToolMessage additional_kwargs */\n const update = cmd.update as { messages?: BaseMessage[] } | undefined;\n if (update && update.messages) {\n for (const msg of update.messages) {\n if (msg.getType() === 'tool') {\n (msg as ToolMessage).additional_kwargs.handoff_parallel_siblings =\n siblings;\n }\n }\n }\n\n return new Send(destination, cmd.update);\n });\n\n const parallelCommand = new Command({\n graph: Command.PARENT,\n goto: sends,\n });\n combinedOutputs.push(parallelCommand);\n } else if (handoffCommands.length === 1) {\n /** Single handoff - pass through as-is */\n combinedOutputs.push(handoffCommands[0]);\n }\n\n if (parentCommand) {\n combinedOutputs.push(parentCommand);\n }\n\n return combinedOutputs as T;\n }\n\n private isSendInput(input: unknown): input is { lg_tool_call: ToolCall } {\n return (\n typeof input === 'object' && input != null && 'lg_tool_call' in input\n );\n }\n\n private isMessagesState(\n input: unknown\n ): input is { messages: BaseMessage[] } {\n return (\n typeof input === 'object' &&\n input != null &&\n 'messages' in input &&\n Array.isArray((input as { messages: unknown }).messages) &&\n (input as { messages: unknown[] }).messages.every(isBaseMessage)\n );\n }\n}\n\nfunction areToolCallsInvoked(\n message: AIMessage,\n invokedToolIds?: Set<string>\n): boolean {\n if (!invokedToolIds || invokedToolIds.size === 0) return false;\n return (\n message.tool_calls?.every(\n (toolCall) => toolCall.id != null && invokedToolIds.has(toolCall.id)\n ) ?? false\n );\n}\n\nexport function toolsCondition<T extends string>(\n state: BaseMessage[] | typeof MessagesAnnotation.State,\n toolNode: T,\n invokedToolIds?: Set<string>\n): T | typeof END {\n const messages = Array.isArray(state) ? state : state.messages;\n const message = messages[messages.length - 1] as AIMessage | undefined;\n\n if (\n message &&\n 'tool_calls' in message &&\n (message.tool_calls?.length ?? 0) > 0 &&\n !areToolCallsInvoked(message, invokedToolIds)\n ) {\n return toolNode;\n }\n return END;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ToolNode.mjs","sources":["../../../src/tools/ToolNode.ts"],"sourcesContent":["import { ToolCall } from '@langchain/core/messages/tool';\nimport {\n ToolMessage,\n HumanMessage,\n isAIMessage,\n isBaseMessage,\n} from '@langchain/core/messages';\nimport {\n END,\n Send,\n Command,\n isCommand,\n isGraphInterrupt,\n MessagesAnnotation,\n} from '@langchain/langgraph';\nimport type {\n RunnableConfig,\n RunnableToolLike,\n} from '@langchain/core/runnables';\nimport type { BaseMessage, AIMessage } from '@langchain/core/messages';\nimport type { StructuredToolInterface } from '@langchain/core/tools';\nimport type * as t from '@/types';\nimport type { HookRegistry, AggregatedHookResult } from '@/hooks';\nimport { RunnableCallable } from '@/utils';\nimport {\n calculateMaxToolResultChars,\n truncateToolResultContent,\n} from '@/utils/truncation';\nimport { safeDispatchCustomEvent } from '@/utils/events';\nimport { executeHooks } from '@/hooks';\nimport { Constants, GraphEvents, CODE_EXECUTION_TOOLS } from '@/common';\n\n/**\n * Helper to check if a value is a Send object\n */\nfunction isSend(value: unknown): value is Send {\n return value instanceof Send;\n}\n\n/** Merges code execution session context into the sessions map. */\nfunction updateCodeSession(\n sessions: t.ToolSessionMap,\n sessionId: string,\n files: t.FileRefs | undefined\n): void {\n const newFiles = files ?? [];\n const existingSession = sessions.get(Constants.EXECUTE_CODE) as\n | t.CodeSessionContext\n | undefined;\n const existingFiles = existingSession?.files ?? [];\n\n if (newFiles.length > 0) {\n const filesWithSession: t.FileRefs = newFiles.map((file) => ({\n ...file,\n session_id: sessionId,\n }));\n const newFileNames = new Set(filesWithSession.map((f) => f.name));\n const filteredExisting = existingFiles.filter(\n (f) => !newFileNames.has(f.name)\n );\n sessions.set(Constants.EXECUTE_CODE, {\n session_id: sessionId,\n files: [...filteredExisting, ...filesWithSession],\n lastUpdated: Date.now(),\n });\n } else {\n sessions.set(Constants.EXECUTE_CODE, {\n session_id: sessionId,\n files: existingFiles,\n lastUpdated: Date.now(),\n });\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class ToolNode<T = any> extends RunnableCallable<T, T> {\n private toolMap: Map<string, StructuredToolInterface | RunnableToolLike>;\n private loadRuntimeTools?: t.ToolRefGenerator;\n handleToolErrors = true;\n trace = false;\n toolCallStepIds?: Map<string, string>;\n errorHandler?: t.ToolNodeConstructorParams['errorHandler'];\n private toolUsageCount: Map<string, number>;\n /** Maps toolCallId → turn captured in runTool, used by handleRunToolCompletions */\n private toolCallTurns: Map<string, number> = new Map();\n /** Tool registry for filtering (lazy computation of programmatic maps) */\n private toolRegistry?: t.LCToolRegistry;\n /** Cached programmatic tools (computed once on first PTC call) */\n private programmaticCache?: t.ProgrammaticCache;\n /** Reference to Graph's sessions map for automatic session injection */\n private sessions?: t.ToolSessionMap;\n /** When true, dispatches ON_TOOL_EXECUTE events instead of invoking tools directly */\n private eventDrivenMode: boolean = false;\n /** Agent ID for event-driven mode */\n private agentId?: string;\n /** Tool names that bypass event dispatch and execute directly (e.g., graph-managed handoff tools) */\n private directToolNames?: Set<string>;\n /** Maximum characters allowed in a single tool result before truncation. */\n private maxToolResultChars: number;\n /** Hook registry for PreToolUse/PostToolUse lifecycle hooks */\n private hookRegistry?: HookRegistry;\n\n constructor({\n tools,\n toolMap,\n name,\n tags,\n errorHandler,\n toolCallStepIds,\n handleToolErrors,\n loadRuntimeTools,\n toolRegistry,\n sessions,\n eventDrivenMode,\n agentId,\n directToolNames,\n maxContextTokens,\n maxToolResultChars,\n hookRegistry,\n }: t.ToolNodeConstructorParams) {\n super({ name, tags, func: (input, config) => this.run(input, config) });\n this.toolMap = toolMap ?? new Map(tools.map((tool) => [tool.name, tool]));\n this.toolCallStepIds = toolCallStepIds;\n this.handleToolErrors = handleToolErrors ?? this.handleToolErrors;\n this.loadRuntimeTools = loadRuntimeTools;\n this.errorHandler = errorHandler;\n this.toolUsageCount = new Map<string, number>();\n this.toolRegistry = toolRegistry;\n this.sessions = sessions;\n this.eventDrivenMode = eventDrivenMode ?? false;\n this.agentId = agentId;\n this.directToolNames = directToolNames;\n this.maxToolResultChars =\n maxToolResultChars ?? calculateMaxToolResultChars(maxContextTokens);\n this.hookRegistry = hookRegistry;\n }\n\n /**\n * Returns cached programmatic tools, computing once on first access.\n * Single iteration builds both toolMap and toolDefs simultaneously.\n */\n private getProgrammaticTools(): { toolMap: t.ToolMap; toolDefs: t.LCTool[] } {\n if (this.programmaticCache) return this.programmaticCache;\n\n const toolMap: t.ToolMap = new Map();\n const toolDefs: t.LCTool[] = [];\n\n if (this.toolRegistry) {\n for (const [name, toolDef] of this.toolRegistry) {\n if (\n (toolDef.allowed_callers ?? ['direct']).includes('code_execution')\n ) {\n toolDefs.push(toolDef);\n const tool = this.toolMap.get(name);\n if (tool) toolMap.set(name, tool);\n }\n }\n }\n\n this.programmaticCache = { toolMap, toolDefs };\n return this.programmaticCache;\n }\n\n /**\n * Returns a snapshot of the current tool usage counts.\n * @returns A ReadonlyMap where keys are tool names and values are their usage counts.\n */\n public getToolUsageCounts(): ReadonlyMap<string, number> {\n return new Map(this.toolUsageCount); // Return a copy\n }\n\n /**\n * Runs a single tool call with error handling\n */\n protected async runTool(\n call: ToolCall,\n config: RunnableConfig\n ): Promise<BaseMessage | Command> {\n const tool = this.toolMap.get(call.name);\n try {\n if (tool === undefined) {\n throw new Error(`Tool \"${call.name}\" not found.`);\n }\n const turn = this.toolUsageCount.get(call.name) ?? 0;\n this.toolUsageCount.set(call.name, turn + 1);\n if (call.id != null && call.id !== '') {\n this.toolCallTurns.set(call.id, turn);\n }\n const args = call.args;\n const stepId = this.toolCallStepIds?.get(call.id!);\n\n // Build invoke params - LangChain extracts non-schema fields to config.toolCall\n let invokeParams: Record<string, unknown> = {\n ...call,\n args,\n type: 'tool_call',\n stepId,\n turn,\n };\n\n // Inject runtime data for special tools (becomes available at config.toolCall)\n if (\n call.name === Constants.PROGRAMMATIC_TOOL_CALLING ||\n call.name === Constants.BASH_PROGRAMMATIC_TOOL_CALLING\n ) {\n const { toolMap, toolDefs } = this.getProgrammaticTools();\n invokeParams = {\n ...invokeParams,\n toolMap,\n toolDefs,\n };\n } else if (call.name === Constants.TOOL_SEARCH) {\n invokeParams = {\n ...invokeParams,\n toolRegistry: this.toolRegistry,\n };\n }\n\n /**\n * Inject session context for code execution tools when available.\n * Each file uses its own session_id (supporting multi-session file tracking).\n * Both session_id and _injected_files are injected directly to invokeParams\n * (not inside args) so they bypass Zod schema validation and reach config.toolCall.\n *\n * session_id is always injected when available (even without tracked files)\n * so the CodeExecutor can fall back to the /files endpoint for session continuity.\n */\n if (CODE_EXECUTION_TOOLS.has(call.name)) {\n const codeSession = this.sessions?.get(Constants.EXECUTE_CODE) as\n | t.CodeSessionContext\n | undefined;\n if (codeSession?.session_id != null && codeSession.session_id !== '') {\n invokeParams = {\n ...invokeParams,\n session_id: codeSession.session_id,\n };\n\n if (codeSession.files != null && codeSession.files.length > 0) {\n const fileRefs: t.CodeEnvFile[] = codeSession.files.map((file) => ({\n session_id: file.session_id ?? codeSession.session_id,\n id: file.id,\n name: file.name,\n }));\n invokeParams._injected_files = fileRefs;\n }\n }\n }\n\n const output = await tool.invoke(invokeParams, config);\n if (\n (isBaseMessage(output) && output._getType() === 'tool') ||\n isCommand(output)\n ) {\n return output;\n } else {\n const rawContent =\n typeof output === 'string' ? output : JSON.stringify(output);\n return new ToolMessage({\n status: 'success',\n name: tool.name,\n content: truncateToolResultContent(\n rawContent,\n this.maxToolResultChars\n ),\n tool_call_id: call.id!,\n });\n }\n } catch (_e: unknown) {\n const e = _e as Error;\n if (!this.handleToolErrors) {\n throw e;\n }\n if (isGraphInterrupt(e)) {\n throw e;\n }\n if (this.errorHandler) {\n try {\n await this.errorHandler(\n {\n error: e,\n id: call.id!,\n name: call.name,\n input: call.args,\n },\n config.metadata\n );\n } catch (handlerError) {\n // eslint-disable-next-line no-console\n console.error('Error in errorHandler:', {\n toolName: call.name,\n toolCallId: call.id,\n toolArgs: call.args,\n stepId: this.toolCallStepIds?.get(call.id!),\n turn: this.toolUsageCount.get(call.name),\n originalError: {\n message: e.message,\n stack: e.stack ?? undefined,\n },\n handlerError:\n handlerError instanceof Error\n ? {\n message: handlerError.message,\n stack: handlerError.stack ?? undefined,\n }\n : {\n message: String(handlerError),\n stack: undefined,\n },\n });\n }\n }\n return new ToolMessage({\n status: 'error',\n content: `Error: ${e.message}\\n Please fix your mistakes.`,\n name: call.name,\n tool_call_id: call.id ?? '',\n });\n }\n }\n\n /**\n * Builds code session context for injection into event-driven tool calls.\n * Mirrors the session injection logic in runTool() for direct execution.\n */\n private getCodeSessionContext(): t.ToolCallRequest['codeSessionContext'] {\n if (!this.sessions) {\n return undefined;\n }\n\n const codeSession = this.sessions.get(Constants.EXECUTE_CODE) as\n | t.CodeSessionContext\n | undefined;\n if (!codeSession) {\n return undefined;\n }\n\n const context: NonNullable<t.ToolCallRequest['codeSessionContext']> = {\n session_id: codeSession.session_id,\n };\n\n if (codeSession.files && codeSession.files.length > 0) {\n context.files = codeSession.files.map((file) => ({\n session_id: file.session_id ?? codeSession.session_id,\n id: file.id,\n name: file.name,\n }));\n }\n\n return context;\n }\n\n /**\n * Extracts code execution session context from tool results and stores in Graph.sessions.\n * Mirrors the session storage logic in handleRunToolCompletions for direct execution.\n */\n private storeCodeSessionFromResults(\n results: t.ToolExecuteResult[],\n requestMap: Map<string, t.ToolCallRequest>\n ): void {\n if (!this.sessions) {\n return;\n }\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n if (result.status !== 'success' || result.artifact == null) {\n continue;\n }\n\n const request = requestMap.get(result.toolCallId);\n if (\n !request?.name ||\n (!CODE_EXECUTION_TOOLS.has(request.name) &&\n request.name !== Constants.SKILL_TOOL)\n ) {\n continue;\n }\n\n const artifact = result.artifact as t.CodeExecutionArtifact | undefined;\n if (artifact?.session_id == null || artifact.session_id === '') {\n continue;\n }\n\n updateCodeSession(this.sessions, artifact.session_id!, artifact.files);\n }\n }\n\n /**\n * Post-processes standard runTool outputs: dispatches ON_RUN_STEP_COMPLETED\n * and stores code session context. Mirrors the completion handling in\n * dispatchToolEvents for the event-driven path.\n *\n * By handling completions here in graph context (rather than in the\n * stream consumer via ToolEndHandler), the race between the stream\n * consumer and graph execution is eliminated.\n */\n private handleRunToolCompletions(\n calls: ToolCall[],\n outputs: (BaseMessage | Command)[],\n config: RunnableConfig\n ): void {\n for (let i = 0; i < calls.length; i++) {\n const call = calls[i];\n const output = outputs[i];\n const turn = this.toolCallTurns.get(call.id!) ?? 0;\n\n if (isCommand(output)) {\n continue;\n }\n\n const toolMessage = output as ToolMessage;\n const toolCallId = call.id ?? '';\n\n // Skip error ToolMessages when errorHandler already dispatched ON_RUN_STEP_COMPLETED\n // via handleToolCallErrorStatic. Without this check, errors would be double-dispatched.\n if (toolMessage.status === 'error' && this.errorHandler != null) {\n continue;\n }\n\n if (this.sessions && CODE_EXECUTION_TOOLS.has(call.name)) {\n const artifact = toolMessage.artifact as\n | t.CodeExecutionArtifact\n | undefined;\n if (artifact?.session_id != null && artifact.session_id !== '') {\n updateCodeSession(this.sessions, artifact.session_id, artifact.files);\n }\n }\n\n // Dispatch ON_RUN_STEP_COMPLETED via custom event (same path as dispatchToolEvents)\n const stepId = this.toolCallStepIds?.get(toolCallId) ?? '';\n if (!stepId) {\n continue;\n }\n\n const contentString =\n typeof toolMessage.content === 'string'\n ? toolMessage.content\n : JSON.stringify(toolMessage.content);\n\n const tool_call: t.ProcessedToolCall = {\n args:\n typeof call.args === 'string'\n ? (call.args as string)\n : JSON.stringify((call.args as unknown) ?? {}),\n name: call.name,\n id: toolCallId,\n output: contentString,\n progress: 1,\n };\n\n safeDispatchCustomEvent(\n GraphEvents.ON_RUN_STEP_COMPLETED,\n {\n result: {\n id: stepId,\n index: turn,\n type: 'tool_call' as const,\n tool_call,\n },\n },\n config\n );\n }\n }\n\n /**\n * Dispatches tool calls to the host via ON_TOOL_EXECUTE event and returns raw ToolMessages.\n * Core logic for event-driven execution, separated from output shaping.\n *\n * Hook lifecycle (when `hookRegistry` is set):\n * 1. **PreToolUse** fires per call in parallel before dispatch. Denied\n * calls produce error ToolMessages and fire **PermissionDenied**;\n * surviving calls proceed with optional `updatedInput`.\n * 2. Surviving calls are dispatched to the host via `ON_TOOL_EXECUTE`.\n * 3. **PostToolUse** / **PostToolUseFailure** fire per result. Post hooks\n * can replace tool output via `updatedOutput`.\n * 4. Injected messages from results are collected and returned alongside\n * ToolMessages (appended AFTER to respect provider ordering).\n */\n private async dispatchToolEvents(\n toolCalls: ToolCall[],\n config: RunnableConfig\n ): Promise<{ toolMessages: ToolMessage[]; injected: BaseMessage[] }> {\n const runId = (config.configurable?.run_id as string | undefined) ?? '';\n const threadId = config.configurable?.thread_id as string | undefined;\n\n const preToolCalls = toolCalls.map((call) => ({\n call,\n stepId: this.toolCallStepIds?.get(call.id!) ?? '',\n args: call.args as Record<string, unknown>,\n }));\n\n const messageByCallId = new Map<string, ToolMessage>();\n const approvedEntries: typeof preToolCalls = [];\n const HOOK_FALLBACK: AggregatedHookResult = Object.freeze({\n additionalContexts: [] as string[],\n errors: [] as string[],\n });\n\n if (this.hookRegistry?.hasHookFor('PreToolUse', runId) === true) {\n const preResults = await Promise.all(\n preToolCalls.map((entry) =>\n executeHooks({\n registry: this.hookRegistry!,\n input: {\n hook_event_name: 'PreToolUse',\n runId,\n threadId,\n agentId: this.agentId,\n toolName: entry.call.name,\n toolInput: entry.args,\n toolUseId: entry.call.id!,\n stepId: entry.stepId,\n turn: this.toolUsageCount.get(entry.call.name) ?? 0,\n },\n sessionId: runId,\n matchQuery: entry.call.name,\n }).catch((): AggregatedHookResult => HOOK_FALLBACK)\n )\n );\n\n for (let i = 0; i < preToolCalls.length; i++) {\n const hookResult = preResults[i];\n const entry = preToolCalls[i];\n const isDenied =\n hookResult.decision === 'deny' || hookResult.decision === 'ask';\n if (isDenied) {\n const reason = hookResult.reason ?? 'Blocked by hook';\n const contentString = `Blocked: ${reason}`;\n messageByCallId.set(\n entry.call.id!,\n new ToolMessage({\n status: 'error',\n content: contentString,\n name: entry.call.name,\n tool_call_id: entry.call.id!,\n })\n );\n this.dispatchStepCompleted(\n entry.call.id!,\n entry.call.name,\n entry.args,\n contentString,\n config\n );\n if (this.hookRegistry.hasHookFor('PermissionDenied', runId)) {\n executeHooks({\n registry: this.hookRegistry,\n input: {\n hook_event_name: 'PermissionDenied',\n runId,\n threadId,\n agentId: this.agentId,\n toolName: entry.call.name,\n toolInput: entry.args,\n toolUseId: entry.call.id!,\n reason,\n },\n sessionId: runId,\n matchQuery: entry.call.name,\n }).catch(() => {\n /* PermissionDenied is observational — swallow errors */\n });\n }\n continue;\n }\n if (hookResult.updatedInput != null) {\n entry.args = hookResult.updatedInput;\n }\n approvedEntries.push(entry);\n }\n } else {\n approvedEntries.push(...preToolCalls);\n }\n\n const injected: BaseMessage[] = [];\n\n if (approvedEntries.length > 0) {\n const requests: t.ToolCallRequest[] = approvedEntries.map((entry) => {\n const turn = this.toolUsageCount.get(entry.call.name) ?? 0;\n this.toolUsageCount.set(entry.call.name, turn + 1);\n\n const request: t.ToolCallRequest = {\n id: entry.call.id!,\n name: entry.call.name,\n args: entry.args,\n stepId: entry.stepId,\n turn,\n };\n\n if (\n CODE_EXECUTION_TOOLS.has(entry.call.name) ||\n entry.call.name === Constants.SKILL_TOOL\n ) {\n request.codeSessionContext = this.getCodeSessionContext();\n }\n\n return request;\n });\n\n const requestMap = new Map(requests.map((r) => [r.id, r]));\n\n const results = await new Promise<t.ToolExecuteResult[]>(\n (resolve, reject) => {\n const batchRequest: t.ToolExecuteBatchRequest = {\n toolCalls: requests,\n userId: config.configurable?.user_id as string | undefined,\n agentId: this.agentId,\n configurable: config.configurable as\n | Record<string, unknown>\n | undefined,\n metadata: config.metadata as Record<string, unknown> | undefined,\n resolve,\n reject,\n };\n\n safeDispatchCustomEvent(\n GraphEvents.ON_TOOL_EXECUTE,\n batchRequest,\n config\n );\n }\n );\n\n this.storeCodeSessionFromResults(results, requestMap);\n\n const hasPostHook =\n this.hookRegistry?.hasHookFor('PostToolUse', runId) === true;\n const hasFailureHook =\n this.hookRegistry?.hasHookFor('PostToolUseFailure', runId) === true;\n\n for (const result of results) {\n if (result.injectedMessages && result.injectedMessages.length > 0) {\n try {\n injected.push(\n ...this.convertInjectedMessages(result.injectedMessages)\n );\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(\n `[ToolNode] Failed to convert injectedMessages for toolCallId=${result.toolCallId}:`,\n e instanceof Error ? e.message : e\n );\n }\n }\n const request = requestMap.get(result.toolCallId);\n const toolName = request?.name ?? 'unknown';\n\n let contentString: string;\n let toolMessage: ToolMessage;\n\n if (result.status === 'error') {\n contentString = `Error: ${result.errorMessage ?? 'Unknown error'}\\n Please fix your mistakes.`;\n toolMessage = new ToolMessage({\n status: 'error',\n content: contentString,\n name: toolName,\n tool_call_id: result.toolCallId,\n });\n\n if (hasFailureHook) {\n await executeHooks({\n registry: this.hookRegistry!,\n input: {\n hook_event_name: 'PostToolUseFailure',\n runId,\n threadId,\n agentId: this.agentId,\n toolName,\n toolInput: request?.args ?? {},\n toolUseId: result.toolCallId,\n error: result.errorMessage ?? 'Unknown error',\n stepId: request?.stepId,\n turn: request?.turn,\n },\n sessionId: runId,\n matchQuery: toolName,\n }).catch(() => {\n /* PostToolUseFailure is observational — swallow errors */\n });\n }\n } else {\n const rawContent =\n typeof result.content === 'string'\n ? result.content\n : JSON.stringify(result.content);\n contentString = truncateToolResultContent(\n rawContent,\n this.maxToolResultChars\n );\n\n if (hasPostHook) {\n const hookResult = await executeHooks({\n registry: this.hookRegistry!,\n input: {\n hook_event_name: 'PostToolUse',\n runId,\n threadId,\n agentId: this.agentId,\n toolName,\n toolInput: request?.args ?? {},\n toolOutput: result.content,\n toolUseId: result.toolCallId,\n stepId: request?.stepId,\n turn: request?.turn,\n },\n sessionId: runId,\n matchQuery: toolName,\n }).catch((): undefined => undefined);\n if (hookResult?.updatedOutput != null) {\n const replaced =\n typeof hookResult.updatedOutput === 'string'\n ? hookResult.updatedOutput\n : JSON.stringify(hookResult.updatedOutput);\n contentString = truncateToolResultContent(\n replaced,\n this.maxToolResultChars\n );\n }\n }\n\n toolMessage = new ToolMessage({\n status: 'success',\n name: toolName,\n content: contentString,\n artifact: result.artifact,\n tool_call_id: result.toolCallId,\n });\n }\n\n this.dispatchStepCompleted(\n result.toolCallId,\n toolName,\n request?.args ?? {},\n contentString,\n config,\n request?.turn\n );\n\n messageByCallId.set(result.toolCallId, toolMessage);\n }\n }\n\n const toolMessages = toolCalls\n .map((call) => messageByCallId.get(call.id!))\n .filter((m): m is ToolMessage => m != null);\n return { toolMessages, injected };\n }\n\n private dispatchStepCompleted(\n toolCallId: string,\n toolName: string,\n args: Record<string, unknown>,\n output: string,\n config: RunnableConfig,\n turn?: number\n ): void {\n const stepId = this.toolCallStepIds?.get(toolCallId) ?? '';\n if (!stepId) {\n // eslint-disable-next-line no-console\n console.warn(\n `[ToolNode] toolCallStepIds missing entry for toolCallId=${toolCallId} (tool=${toolName}). ` +\n 'This indicates a race between the stream consumer and graph execution. ' +\n `Map size: ${this.toolCallStepIds?.size ?? 0}`\n );\n }\n\n safeDispatchCustomEvent(\n GraphEvents.ON_RUN_STEP_COMPLETED,\n {\n result: {\n id: stepId,\n index: turn ?? this.toolUsageCount.get(toolName) ?? 0,\n type: 'tool_call' as const,\n tool_call: {\n args: JSON.stringify(args),\n name: toolName,\n id: toolCallId,\n output,\n progress: 1,\n } as t.ProcessedToolCall,\n },\n },\n config\n );\n }\n\n /**\n * Converts InjectedMessage instances to LangChain HumanMessage objects.\n * Both 'user' and 'system' roles become HumanMessage to avoid provider\n * rejections (Anthropic/Google reject non-leading SystemMessages).\n * The original role is preserved in additional_kwargs for downstream consumers.\n */\n private convertInjectedMessages(\n messages: t.InjectedMessage[]\n ): BaseMessage[] {\n const converted: BaseMessage[] = [];\n for (const msg of messages) {\n const additional_kwargs: Record<string, unknown> = {\n role: msg.role,\n };\n if (msg.isMeta != null) additional_kwargs.isMeta = msg.isMeta;\n if (msg.source != null) additional_kwargs.source = msg.source;\n if (msg.skillName != null) additional_kwargs.skillName = msg.skillName;\n\n converted.push(\n new HumanMessage({ content: msg.content, additional_kwargs })\n );\n }\n return converted;\n }\n\n /**\n * Execute all tool calls via ON_TOOL_EXECUTE event dispatch.\n * Injected messages are placed AFTER ToolMessages to respect provider\n * message ordering (AIMessage tool_calls must be immediately followed\n * by their ToolMessage results).\n */\n private async executeViaEvent(\n toolCalls: ToolCall[],\n config: RunnableConfig,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n input: any\n ): Promise<T> {\n const { toolMessages, injected } = await this.dispatchToolEvents(\n toolCalls,\n config\n );\n const outputs: BaseMessage[] = [...toolMessages, ...injected];\n return (Array.isArray(input) ? outputs : { messages: outputs }) as T;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected async run(input: any, config: RunnableConfig): Promise<T> {\n this.toolCallTurns.clear();\n let outputs: (BaseMessage | Command)[];\n\n if (this.isSendInput(input)) {\n const isDirectTool = this.directToolNames?.has(input.lg_tool_call.name);\n if (this.eventDrivenMode && isDirectTool !== true) {\n return this.executeViaEvent([input.lg_tool_call], config, input);\n }\n outputs = [await this.runTool(input.lg_tool_call, config)];\n this.handleRunToolCompletions([input.lg_tool_call], outputs, config);\n } else {\n let messages: BaseMessage[];\n if (Array.isArray(input)) {\n messages = input;\n } else if (this.isMessagesState(input)) {\n messages = input.messages;\n } else {\n throw new Error(\n 'ToolNode only accepts BaseMessage[] or { messages: BaseMessage[] } as input.'\n );\n }\n\n const toolMessageIds: Set<string> = new Set(\n messages\n .filter((msg) => msg._getType() === 'tool')\n .map((msg) => (msg as ToolMessage).tool_call_id)\n );\n\n let aiMessage: AIMessage | undefined;\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i];\n if (isAIMessage(message)) {\n aiMessage = message;\n break;\n }\n }\n\n if (aiMessage == null || !isAIMessage(aiMessage)) {\n throw new Error('ToolNode only accepts AIMessages as input.');\n }\n\n if (this.loadRuntimeTools) {\n const { tools, toolMap } = this.loadRuntimeTools(\n aiMessage.tool_calls ?? []\n );\n this.toolMap =\n toolMap ?? new Map(tools.map((tool) => [tool.name, tool]));\n this.programmaticCache = undefined; // Invalidate cache on toolMap change\n }\n\n const filteredCalls =\n aiMessage.tool_calls?.filter((call) => {\n /**\n * Filter out:\n * 1. Already processed tool calls (present in toolMessageIds)\n * 2. Server tool calls (e.g., web_search with IDs starting with 'srvtoolu_')\n * which are executed by the provider's API and don't require invocation\n */\n return (\n (call.id == null || !toolMessageIds.has(call.id)) &&\n !(\n call.id?.startsWith(Constants.ANTHROPIC_SERVER_TOOL_PREFIX) ??\n false\n )\n );\n }) ?? [];\n\n if (this.eventDrivenMode && filteredCalls.length > 0) {\n if (!this.directToolNames || this.directToolNames.size === 0) {\n return this.executeViaEvent(filteredCalls, config, input);\n }\n\n const directCalls = filteredCalls.filter((c) =>\n this.directToolNames!.has(c.name)\n );\n const eventCalls = filteredCalls.filter(\n (c) => !this.directToolNames!.has(c.name)\n );\n\n const directOutputs: (BaseMessage | Command)[] =\n directCalls.length > 0\n ? await Promise.all(\n directCalls.map((call) => this.runTool(call, config))\n )\n : [];\n\n if (directCalls.length > 0 && directOutputs.length > 0) {\n this.handleRunToolCompletions(directCalls, directOutputs, config);\n }\n\n const eventResult =\n eventCalls.length > 0\n ? await this.dispatchToolEvents(eventCalls, config)\n : {\n toolMessages: [] as ToolMessage[],\n injected: [] as BaseMessage[],\n };\n\n outputs = [\n ...directOutputs,\n ...eventResult.toolMessages,\n ...eventResult.injected,\n ];\n } else {\n outputs = await Promise.all(\n filteredCalls.map((call) => this.runTool(call, config))\n );\n this.handleRunToolCompletions(filteredCalls, outputs, config);\n }\n }\n\n if (!outputs.some(isCommand)) {\n return (Array.isArray(input) ? outputs : { messages: outputs }) as T;\n }\n\n const combinedOutputs: (\n | { messages: BaseMessage[] }\n | BaseMessage[]\n | Command\n )[] = [];\n let parentCommand: Command | null = null;\n\n /**\n * Collect handoff commands (Commands with string goto and Command.PARENT)\n * for potential parallel handoff aggregation\n */\n const handoffCommands: Command[] = [];\n const nonCommandOutputs: BaseMessage[] = [];\n\n for (const output of outputs) {\n if (isCommand(output)) {\n if (\n output.graph === Command.PARENT &&\n Array.isArray(output.goto) &&\n output.goto.every((send): send is Send => isSend(send))\n ) {\n /** Aggregate Send-based commands */\n if (parentCommand) {\n (parentCommand.goto as Send[]).push(...(output.goto as Send[]));\n } else {\n parentCommand = new Command({\n graph: Command.PARENT,\n goto: output.goto,\n });\n }\n } else if (output.graph === Command.PARENT) {\n /**\n * Handoff Command with destination.\n * Handle both string ('agent') and array (['agent']) formats.\n * Collect for potential parallel aggregation.\n */\n const goto = output.goto;\n const isSingleStringDest = typeof goto === 'string';\n const isSingleArrayDest =\n Array.isArray(goto) &&\n goto.length === 1 &&\n typeof goto[0] === 'string';\n\n if (isSingleStringDest || isSingleArrayDest) {\n handoffCommands.push(output);\n } else {\n /** Multi-destination or other command - pass through */\n combinedOutputs.push(output);\n }\n } else {\n /** Other commands - pass through */\n combinedOutputs.push(output);\n }\n } else {\n nonCommandOutputs.push(output);\n combinedOutputs.push(\n Array.isArray(input) ? [output] : { messages: [output] }\n );\n }\n }\n\n /**\n * Handle handoff commands - convert to Send objects for parallel execution\n * when multiple handoffs are requested\n */\n if (handoffCommands.length > 1) {\n /**\n * Multiple parallel handoffs - convert to Send objects.\n * Each Send carries its own state with the appropriate messages.\n * This enables LLM-initiated parallel execution when calling multiple\n * transfer tools simultaneously.\n */\n\n /** Collect all destinations for sibling tracking */\n const allDestinations = handoffCommands.map((cmd) => {\n const goto = cmd.goto;\n return typeof goto === 'string' ? goto : (goto as string[])[0];\n });\n\n const sends = handoffCommands.map((cmd, idx) => {\n const destination = allDestinations[idx];\n /** Get siblings (other destinations, not this one) */\n const siblings = allDestinations.filter((d) => d !== destination);\n\n /** Add siblings to ToolMessage additional_kwargs */\n const update = cmd.update as { messages?: BaseMessage[] } | undefined;\n if (update && update.messages) {\n for (const msg of update.messages) {\n if (msg.getType() === 'tool') {\n (msg as ToolMessage).additional_kwargs.handoff_parallel_siblings =\n siblings;\n }\n }\n }\n\n return new Send(destination, cmd.update);\n });\n\n const parallelCommand = new Command({\n graph: Command.PARENT,\n goto: sends,\n });\n combinedOutputs.push(parallelCommand);\n } else if (handoffCommands.length === 1) {\n /** Single handoff - pass through as-is */\n combinedOutputs.push(handoffCommands[0]);\n }\n\n if (parentCommand) {\n combinedOutputs.push(parentCommand);\n }\n\n return combinedOutputs as T;\n }\n\n private isSendInput(input: unknown): input is { lg_tool_call: ToolCall } {\n return (\n typeof input === 'object' && input != null && 'lg_tool_call' in input\n );\n }\n\n private isMessagesState(\n input: unknown\n ): input is { messages: BaseMessage[] } {\n return (\n typeof input === 'object' &&\n input != null &&\n 'messages' in input &&\n Array.isArray((input as { messages: unknown }).messages) &&\n (input as { messages: unknown[] }).messages.every(isBaseMessage)\n );\n }\n}\n\nfunction areToolCallsInvoked(\n message: AIMessage,\n invokedToolIds?: Set<string>\n): boolean {\n if (!invokedToolIds || invokedToolIds.size === 0) return false;\n return (\n message.tool_calls?.every(\n (toolCall) => toolCall.id != null && invokedToolIds.has(toolCall.id)\n ) ?? false\n );\n}\n\nexport function toolsCondition<T extends string>(\n state: BaseMessage[] | typeof MessagesAnnotation.State,\n toolNode: T,\n invokedToolIds?: Set<string>\n): T | typeof END {\n const messages = Array.isArray(state) ? state : state.messages;\n const message = messages[messages.length - 1] as AIMessage | undefined;\n\n if (\n message &&\n 'tool_calls' in message &&\n (message.tool_calls?.length ?? 0) > 0 &&\n !areToolCallsInvoked(message, invokedToolIds)\n ) {\n return toolNode;\n }\n return END;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ const HEADER = '## Available Skills';
2
+ const DEFAULT_CONTEXT_WINDOW_TOKENS = 200_000;
3
+ const DEFAULT_BUDGET_PERCENT = 0.01;
4
+ const DEFAULT_MAX_ENTRY_CHARS = 250;
5
+ const DEFAULT_MIN_DESC_LENGTH = 20;
6
+ const DEFAULT_CHARS_PER_TOKEN = 4;
7
+ /**
8
+ * Formats a skill catalog for injection into agent context.
9
+ * Uses a truncation ladder: full descriptions, proportional truncation, names-only.
10
+ * Returns empty string for empty input.
11
+ */
12
+ function formatSkillCatalog(skills, opts) {
13
+ if (skills.length === 0)
14
+ return '';
15
+ const contextWindowTokens = opts?.contextWindowTokens ?? DEFAULT_CONTEXT_WINDOW_TOKENS;
16
+ const budgetPercent = opts?.budgetPercent ?? DEFAULT_BUDGET_PERCENT;
17
+ const maxEntryChars = Math.max(1, opts?.maxEntryChars ?? DEFAULT_MAX_ENTRY_CHARS);
18
+ const minDescLength = opts?.minDescLength ?? DEFAULT_MIN_DESC_LENGTH;
19
+ const charsPerToken = opts?.charsPerToken ?? DEFAULT_CHARS_PER_TOKEN;
20
+ const budgetChars = Math.floor(contextWindowTokens * budgetPercent * charsPerToken);
21
+ const capped = skills.map((s) => ({
22
+ name: s.name,
23
+ description: s.description.length > maxEntryChars
24
+ ? s.description.slice(0, maxEntryChars - 1) + '\u2026'
25
+ : s.description,
26
+ }));
27
+ const fullOutput = formatEntries(capped);
28
+ if (fullOutput.length <= budgetChars)
29
+ return fullOutput;
30
+ const headerLen = HEADER.length + 2;
31
+ const newlineChars = capped.length > 1 ? capped.length - 1 : 0;
32
+ const availableChars = budgetChars - headerLen - newlineChars;
33
+ const perEntryOverhead = 4;
34
+ const nameCharsTotal = capped.reduce((sum, s) => sum + s.name.length + perEntryOverhead, 0);
35
+ const availableForDescs = availableChars - nameCharsTotal;
36
+ if (availableForDescs <= 0) {
37
+ return fitNamesOnly(capped, budgetChars);
38
+ }
39
+ const maxDescPerEntry = Math.floor(availableForDescs / capped.length);
40
+ if (maxDescPerEntry < minDescLength) {
41
+ return fitNamesOnly(capped, budgetChars);
42
+ }
43
+ const truncated = capped.map((s) => ({
44
+ name: s.name,
45
+ description: s.description.length > maxDescPerEntry
46
+ ? s.description.slice(0, maxDescPerEntry - 1) + '\u2026'
47
+ : s.description,
48
+ }));
49
+ const result = formatEntries(truncated);
50
+ if (result.length <= budgetChars)
51
+ return result;
52
+ return fitNamesOnly(capped, budgetChars);
53
+ }
54
+ function formatEntries(entries) {
55
+ const lines = entries.map((e) => e.description ? `- ${e.name}: ${e.description}` : `- ${e.name}`);
56
+ return `${HEADER}\n\n${lines.join('\n')}`;
57
+ }
58
+ /** Names-only fallback that drops trailing entries if the list still exceeds budget. */
59
+ function fitNamesOnly(entries, budgetChars) {
60
+ // Format: "HEADER\n\n- name1\n- name2\n..."
61
+ // Running sum avoids O(n²) repeated string construction.
62
+ const prefix = HEADER.length + 2; // "HEADER\n\n"
63
+ const entryOverhead = 2; // "- "
64
+ let total = prefix;
65
+ let fitCount = 0;
66
+ for (let i = 0; i < entries.length; i++) {
67
+ const added = (i > 0 ? 1 : 0) + entryOverhead + entries[i].name.length;
68
+ if (total + added > budgetChars)
69
+ break;
70
+ total += added;
71
+ fitCount = i + 1;
72
+ }
73
+ if (fitCount === 0)
74
+ return '';
75
+ const namesOnly = entries
76
+ .slice(0, fitCount)
77
+ .map((s) => ({ name: s.name, description: '' }));
78
+ return formatEntries(namesOnly);
79
+ }
80
+
81
+ export { formatSkillCatalog };
82
+ //# sourceMappingURL=skillCatalog.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillCatalog.mjs","sources":["../../../src/tools/skillCatalog.ts"],"sourcesContent":["// src/tools/skillCatalog.ts\nimport type { SkillCatalogEntry } from '@/types';\n\nconst HEADER = '## Available Skills';\nconst DEFAULT_CONTEXT_WINDOW_TOKENS = 200_000;\nconst DEFAULT_BUDGET_PERCENT = 0.01;\nconst DEFAULT_MAX_ENTRY_CHARS = 250;\nconst DEFAULT_MIN_DESC_LENGTH = 20;\nconst DEFAULT_CHARS_PER_TOKEN = 4;\n\nexport type SkillCatalogOptions = {\n /** Total context window in tokens. Default: 200_000 */\n contextWindowTokens?: number;\n /** Fraction of context budget for catalog. Default: 0.01 (1%) */\n budgetPercent?: number;\n /** Max chars per entry description. Default: 250 */\n maxEntryChars?: number;\n /** Descriptions below this length trigger names-only fallback. Default: 20 */\n minDescLength?: number;\n /** Approximate chars per token for budget calculation. Default: 4 */\n charsPerToken?: number;\n};\n\n/**\n * Formats a skill catalog for injection into agent context.\n * Uses a truncation ladder: full descriptions, proportional truncation, names-only.\n * Returns empty string for empty input.\n */\nexport function formatSkillCatalog(\n skills: SkillCatalogEntry[],\n opts?: SkillCatalogOptions\n): string {\n if (skills.length === 0) return '';\n\n const contextWindowTokens =\n opts?.contextWindowTokens ?? DEFAULT_CONTEXT_WINDOW_TOKENS;\n const budgetPercent = opts?.budgetPercent ?? DEFAULT_BUDGET_PERCENT;\n const maxEntryChars = Math.max(\n 1,\n opts?.maxEntryChars ?? DEFAULT_MAX_ENTRY_CHARS\n );\n const minDescLength = opts?.minDescLength ?? DEFAULT_MIN_DESC_LENGTH;\n const charsPerToken = opts?.charsPerToken ?? DEFAULT_CHARS_PER_TOKEN;\n\n const budgetChars = Math.floor(\n contextWindowTokens * budgetPercent * charsPerToken\n );\n\n const capped = skills.map((s) => ({\n name: s.name,\n description:\n s.description.length > maxEntryChars\n ? s.description.slice(0, maxEntryChars - 1) + '\\u2026'\n : s.description,\n }));\n\n const fullOutput = formatEntries(capped);\n if (fullOutput.length <= budgetChars) return fullOutput;\n\n const headerLen = HEADER.length + 2;\n const newlineChars = capped.length > 1 ? capped.length - 1 : 0;\n const availableChars = budgetChars - headerLen - newlineChars;\n const perEntryOverhead = 4;\n const nameCharsTotal = capped.reduce(\n (sum, s) => sum + s.name.length + perEntryOverhead,\n 0\n );\n const availableForDescs = availableChars - nameCharsTotal;\n\n if (availableForDescs <= 0) {\n return fitNamesOnly(capped, budgetChars);\n }\n\n const maxDescPerEntry = Math.floor(availableForDescs / capped.length);\n\n if (maxDescPerEntry < minDescLength) {\n return fitNamesOnly(capped, budgetChars);\n }\n\n const truncated = capped.map((s) => ({\n name: s.name,\n description:\n s.description.length > maxDescPerEntry\n ? s.description.slice(0, maxDescPerEntry - 1) + '\\u2026'\n : s.description,\n }));\n\n const result = formatEntries(truncated);\n if (result.length <= budgetChars) return result;\n return fitNamesOnly(capped, budgetChars);\n}\n\nfunction formatEntries(\n entries: { name: string; description: string }[]\n): string {\n const lines = entries.map((e) =>\n e.description ? `- ${e.name}: ${e.description}` : `- ${e.name}`\n );\n return `${HEADER}\\n\\n${lines.join('\\n')}`;\n}\n\n/** Names-only fallback that drops trailing entries if the list still exceeds budget. */\nfunction fitNamesOnly(\n entries: { name: string }[],\n budgetChars: number\n): string {\n // Format: \"HEADER\\n\\n- name1\\n- name2\\n...\"\n // Running sum avoids O(n²) repeated string construction.\n const prefix = HEADER.length + 2; // \"HEADER\\n\\n\"\n const entryOverhead = 2; // \"- \"\n let total = prefix;\n let fitCount = 0;\n\n for (let i = 0; i < entries.length; i++) {\n const added = (i > 0 ? 1 : 0) + entryOverhead + entries[i].name.length;\n if (total + added > budgetChars) break;\n total += added;\n fitCount = i + 1;\n }\n\n if (fitCount === 0) return '';\n const namesOnly = entries\n .slice(0, fitCount)\n .map((s) => ({ name: s.name, description: '' }));\n return formatEntries(namesOnly);\n}\n"],"names":[],"mappings":"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"}
@@ -136,8 +136,14 @@ export declare enum Constants {
136
136
  /** Delimiter for MCP tools: toolName_mcp_serverName */
137
137
  MCP_DELIMITER = "_mcp_",
138
138
  /** Anthropic server tool ID prefix (web_search, code_execution, etc.) */
139
- ANTHROPIC_SERVER_TOOL_PREFIX = "srvtoolu_"
139
+ ANTHROPIC_SERVER_TOOL_PREFIX = "srvtoolu_",
140
+ SKILL_TOOL = "skill",
141
+ READ_FILE = "read_file",
142
+ BASH_TOOL = "bash_tool",
143
+ BASH_PROGRAMMATIC_TOOL_CALLING = "run_tools_with_bash"
140
144
  }
145
+ /** Tool names that use the code execution environment (shared session, file tracking). */
146
+ export declare const CODE_EXECUTION_TOOLS: ReadonlySet<string>;
141
147
  export declare enum TitleMethod {
142
148
  STRUCTURED = "structured",
143
149
  FUNCTIONS = "functions",
@@ -6,6 +6,7 @@ import type * as t from '@/types';
6
6
  import { ToolNode as CustomToolNode } from '@/tools/ToolNode';
7
7
  import { AgentContext } from '@/agents/AgentContext';
8
8
  import { HandlerRegistry } from '@/events';
9
+ import type { HookRegistry } from '@/hooks';
9
10
  export declare abstract class Graph<T extends t.BaseGraphState = t.BaseGraphState, _TNodeName extends string = string> {
10
11
  abstract resetValues(): void;
11
12
  abstract initializeTools({ currentTools, currentToolMap, }: {
@@ -43,6 +44,7 @@ export declare abstract class Graph<T extends t.BaseGraphState = t.BaseGraphStat
43
44
  /** Set of invoked tool call IDs from non-message run steps completed mid-run, if any */
44
45
  invokedToolIds?: Set<string>;
45
46
  handlerRegistry: HandlerRegistry | undefined;
47
+ hookRegistry: HookRegistry | undefined;
46
48
  /**
47
49
  * Tool session contexts for automatic state persistence across tool invocations.
48
50
  * Keyed by tool name (e.g., Constants.EXECUTE_CODE).
@@ -0,0 +1,56 @@
1
+ import type { HookEvent, HookMatcher } from './types';
2
+ /**
3
+ * Run-scoped storage for hook matchers with an additional layer for
4
+ * session-scoped matchers that should be cleaned up between sessions.
5
+ *
6
+ * Hosts construct one registry per `Run` (mirroring how `HandlerRegistry` is
7
+ * scoped) and register global matchers + per-session matchers against it.
8
+ * Registration is strictly additive — nothing in this class mutates a
9
+ * matcher's callbacks or flags after insertion.
10
+ *
11
+ * ## Why `Map<sessionId, MatcherBucket>` and not `Record`
12
+ *
13
+ * LibreChat runs thousands of parallel sessions in one Node process, and
14
+ * hook registration happens inside hot paths (tool loading, agent spawning).
15
+ * A `Record<sessionId, ...>` has to be spread on every insertion, which is
16
+ * O(n) per call and O(n²) total for a batch of parallel registrations. A
17
+ * Map mutates in place, keeping insertions O(1). This mirrors the reasoning
18
+ * Claude Code documents at `utils/hooks/sessionHooks.ts:62`.
19
+ */
20
+ export declare class HookRegistry {
21
+ private readonly global;
22
+ private readonly sessions;
23
+ /**
24
+ * Register a matcher for the lifetime of this registry (= one Run).
25
+ * Returns an unregister function that removes the matcher by reference.
26
+ */
27
+ register<E extends HookEvent>(event: E, matcher: HookMatcher<E>): () => void;
28
+ /**
29
+ * Register a matcher for a specific session. Cleared automatically when
30
+ * `clearSession(sessionId)` is called, or can be removed directly via the
31
+ * returned unregister function.
32
+ */
33
+ registerSession<E extends HookEvent>(sessionId: string, event: E, matcher: HookMatcher<E>): () => void;
34
+ /**
35
+ * Returns all matchers registered for `event`, concatenating global first
36
+ * and then session-specific (when `sessionId` is supplied). The caller
37
+ * receives a fresh array, so iterating it is safe even if a matcher is
38
+ * removed mid-iteration (e.g. via `once: true`).
39
+ */
40
+ getMatchers<E extends HookEvent>(event: E, sessionId?: string): HookMatcher<E>[];
41
+ /**
42
+ * Removes `matcher` by reference from global storage first, falling back
43
+ * to the session bucket when `sessionId` is supplied. Used by
44
+ * `executeHooks` to drop `once: true` matchers after they fire.
45
+ */
46
+ removeMatcher<E extends HookEvent>(event: E, matcher: HookMatcher<E>, sessionId?: string): boolean;
47
+ /**
48
+ * Drops every session-scoped matcher for `sessionId`. Call this in the
49
+ * `finally` block around a Run so a `once: true` hook that never fired
50
+ * cannot leak into the next session on the same registry.
51
+ */
52
+ clearSession(sessionId: string): void;
53
+ /** True if at least one matcher exists for `event` (global + session). */
54
+ hasHookFor(event: HookEvent, sessionId?: string): boolean;
55
+ private ensureSessionBucket;
56
+ }
@@ -0,0 +1,79 @@
1
+ import type { Logger } from 'winston';
2
+ import type { HookRegistry } from './HookRegistry';
3
+ import type { HookInput, AggregatedHookResult } from './types';
4
+ /** Default per-hook timeout when a matcher doesn't set its own. */
5
+ export declare const DEFAULT_HOOK_TIMEOUT_MS = 30000;
6
+ /**
7
+ * Options for a single `executeHooks` call. The `input` drives everything —
8
+ * the event name is read from `input.hook_event_name`, matchers are looked
9
+ * up against that event, and each hook receives `input` directly.
10
+ */
11
+ export interface ExecuteHooksOptions {
12
+ registry: HookRegistry;
13
+ input: HookInput;
14
+ /** Scope lookup to this session (in addition to global matchers). */
15
+ sessionId?: string;
16
+ /** Query string matched against each matcher's pattern (tool name, etc.). */
17
+ matchQuery?: string;
18
+ /** Parent AbortSignal — combined with per-hook timeout into the hook signal. */
19
+ signal?: AbortSignal;
20
+ /** Default per-hook timeout; overridden by `matcher.timeout` when present. */
21
+ timeoutMs?: number;
22
+ /** Optional winston logger for non-internal hook errors. */
23
+ logger?: Logger;
24
+ }
25
+ /**
26
+ * Fires every matcher registered against `input.hook_event_name`, folding
27
+ * their results per `deny > ask > allow` precedence and accumulating
28
+ * context/errors.
29
+ *
30
+ * ## Parallelism and determinism
31
+ *
32
+ * All matching hooks fire simultaneously and are awaited via `Promise.all`,
33
+ * which preserves input-array order in its returned results. The fold
34
+ * therefore iterates outcomes in **registration order** — outer loop over
35
+ * matchers as they sit in the registry (global first, then session), inner
36
+ * loop over each matcher's `hooks` array. Last-writer-wins fields
37
+ * (`updatedInput`, `updatedOutput`) are deterministic in that order, even
38
+ * though hooks may complete in arbitrary wall-clock order.
39
+ *
40
+ * Consumers that need a single authoritative rewrite should still scope
41
+ * `updatedInput`/`updatedOutput` to one hook per matcher to avoid subtle
42
+ * precedence bugs when matchers are added in a different order than
43
+ * expected.
44
+ *
45
+ * ## Timeouts and cancellation
46
+ *
47
+ * Each matcher receives **one shared `AbortSignal`** derived from the
48
+ * caller's parent signal combined with `matcher.timeout` (falling back to
49
+ * `opts.timeoutMs`, default {@link DEFAULT_HOOK_TIMEOUT_MS}). Sharing the
50
+ * signal across hooks in a matcher collapses N timer allocations into
51
+ * one, which matters on the PreToolUse hot path where a matcher with
52
+ * several hooks fires on every tool call. Each hook call is raced
53
+ * against the shared signal, so even a hook that ignores the signal is
54
+ * force-unblocked when the timeout fires. Timeout/abort errors are
55
+ * swallowed into the aggregated result's `errors` array (non-fatal by
56
+ * default).
57
+ *
58
+ * ## Internal matchers
59
+ *
60
+ * A matcher with `internal: true` is excluded from both the `errors` array
61
+ * and the logger output. Use it for infrastructure hooks whose failures
62
+ * should not pollute user-visible diagnostics.
63
+ *
64
+ * ## Once semantics — atomic at-most-once
65
+ *
66
+ * A matcher with `once: true` is removed from the registry **before any
67
+ * hook runs**, inside the synchronous prefix of `executeHooks` (between
68
+ * `getMatchers` and the first `await`). Because Node's event loop serialises
69
+ * sync work, two concurrent `executeHooks` calls can never both observe
70
+ * and dispatch the same `once` matcher — whichever call runs its sync
71
+ * prefix first consumes it, and the loser sees an empty bucket.
72
+ *
73
+ * Trade-off: if every hook in a `once` matcher throws, the matcher is
74
+ * still gone. "Once" here means "at most one dispatch, ever", not "at
75
+ * most one successful execution with retry on failure". Hosts that need
76
+ * retry semantics should register a normal matcher and self-unregister
77
+ * via the `unregister` callback returned from `registry.register`.
78
+ */
79
+ export declare function executeHooks(opts: ExecuteHooksOptions): Promise<AggregatedHookResult>;
@@ -0,0 +1,6 @@
1
+ export { HookRegistry } from './HookRegistry';
2
+ export { executeHooks, DEFAULT_HOOK_TIMEOUT_MS } from './executeHooks';
3
+ export { matchesQuery, hasNestedQuantifier, MAX_PATTERN_LENGTH, MAX_CACHE_SIZE, } from './matchers';
4
+ export { HOOK_EVENTS } from './types';
5
+ export type { HookEvent, HookInput, HookOutput, HookCallback, HookMatcher, HooksByEvent, HookInputByEvent, HookOutputByEvent, BaseHookInput, BaseHookOutput, ToolDecision, StopDecision, AggregatedHookResult, RunStartHookInput, UserPromptSubmitHookInput, PreToolUseHookInput, PostToolUseHookInput, PostToolUseFailureHookInput, PermissionDeniedHookInput, SubagentStartHookInput, SubagentStopHookInput, StopHookInput, StopFailureHookInput, PreCompactHookInput, PostCompactHookInput, RunStartHookOutput, UserPromptSubmitHookOutput, PreToolUseHookOutput, PostToolUseHookOutput, PostToolUseFailureHookOutput, PermissionDeniedHookOutput, SubagentStartHookOutput, SubagentStopHookOutput, StopHookOutput, StopFailureHookOutput, PreCompactHookOutput, PostCompactHookOutput, } from './types';
6
+ export type { ExecuteHooksOptions } from './executeHooks';