{"version":3,"file":"ToolNode.cjs","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  interrupt,\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 { ExecutionContext } from './approval/constants';\nimport { RunnableCallable } from '@/utils';\nimport { processToolOutput } from '@/utils/toonFormat';\nimport { safeDispatchCustomEvent } from '@/utils/events';\nimport { Constants, GraphEvents, CODE_EXECUTION_TOOLS } from '@/common';\nimport { executeHooks } from '@/hooks';\nimport type { HookRegistry, AggregatedHookResult } from '@/hooks';\nimport {\n  ToolOutputReferenceRegistry,\n  buildReferenceKey,\n} from '@/tools/toolOutputReferences';\nimport type { ResolvedArgsByCallId } from '@/tools/toolOutputReferences';\n\n/**\n * Per-call batch context for `runTool`. Bundles every optional batch-scoped\n * value the method needs so the signature stays at three positional params\n * even as new context fields are added. Upstream-aligned (PR #117).\n */\ntype RunToolBatchContext = {\n  /** Position of this call within the parent ToolNode batch. */\n  batchIndex?: number;\n  /** Batch turn shared across every call in the batch. */\n  turn?: number;\n  /** Registry partition scope (run id or anonymous batch id). */\n  batchScopeId?: string;\n  /** Batch-local sink for post-substitution args. */\n  resolvedArgsByCallId?: ResolvedArgsByCallId;\n};\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/**\n * Extract text content from a ToolMessage content field.\n * Handles both string and MessageContentComplex[] formats.\n * For array content (e.g., from content_and_artifact tools), extracts text from text blocks.\n */\nfunction extractStringContent(content: unknown): string {\n  // Already a string - return as is\n  if (typeof content === 'string') {\n    return content;\n  }\n\n  // Array of content blocks - extract text from each\n  if (Array.isArray(content)) {\n    const textParts: string[] = [];\n    for (const block of content) {\n      if (typeof block === 'string') {\n        textParts.push(block);\n      } else if (block != null && typeof block === 'object') {\n        // Handle {type: 'text', text: '...'} format\n        const obj = block as Record<string, unknown>;\n        if (obj.type === 'text' && typeof obj.text === 'string') {\n          textParts.push(obj.text);\n        } else if (typeof obj.text === 'string') {\n          // Just has 'text' property\n          textParts.push(obj.text);\n        }\n      }\n    }\n    if (textParts.length > 0) {\n      return textParts.join('\\n');\n    }\n  }\n\n  // Fallback: stringify whatever it is\n  return JSON.stringify(content);\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  /** HITL tool approval configuration */\n  private toolApprovalConfig?: t.ToolApprovalConfig;\n  /** Buffer for recovering truncated tool call arguments from streaming data */\n  private streamingToolCallBuffer?: import('@/tools/StreamingToolCallBuffer').StreamingToolCallBuffer;\n  /** Hook registry threaded down from Run for tool-lifecycle events. */\n  private hookRegistry?: HookRegistry;\n  /**\n   * Tool output reference registry threaded down from Run / Graph\n   * (upstream PR #114). When set, dispatchToolEvents resolves\n   * `{{tool<i>turn<n>}}` placeholders in args before invoking each tool\n   * and stores successful outputs under their stable reference keys for\n   * subsequent calls in the same run to pipe through.\n   */\n  private toolOutputRegistry?: ToolOutputReferenceRegistry;\n  /**\n   * Per-batch turn counter for the registry. Increments once per\n   * `dispatchToolEvents` invocation so `tool<i>turn<n>` keys remain\n   * unique across overlapping batches in a single run.\n   */\n  private toolOutputTurn: number = 0;\n  /**\n   * Counter for synthesising scope ids when `run()` is called without a\n   * `run_id` in config. Each anonymous batch gets a unique\n   * `\\0anon-<n>` scope so concurrent invocations don't collide on the\n   * shared `toolOutputRegistry`.\n   */\n  private anonBatchCounter: number = 0;\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    streamingToolCallBuffer,\n    toolApprovalConfig,\n    hookRegistry,\n    toolOutputRegistry,\n    toolOutputReferences,\n    maxToolResultChars: _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.streamingToolCallBuffer = streamingToolCallBuffer;\n    this.toolApprovalConfig = toolApprovalConfig;\n    this.hookRegistry = hookRegistry;\n    /**\n     * Precedence: an explicitly passed `toolOutputRegistry` instance\n     * wins (the multi-agent case where every ToolNode shares one registry\n     * for the run); otherwise the per-ToolNode `toolOutputReferences`\n     * config builds an instance scoped to this ToolNode.\n     */\n    if (toolOutputRegistry != null) {\n      this.toolOutputRegistry = toolOutputRegistry;\n    } else if (toolOutputReferences?.enabled === true) {\n      this.toolOutputRegistry = new ToolOutputReferenceRegistry({\n        maxOutputSize: toolOutputReferences.maxOutputSize,\n        maxTotalSize: toolOutputReferences.maxTotalSize,\n      });\n    }\n  }\n\n  /**\n   * Test-observation accessor for the tool-output reference registry.\n   * @internal Exposed for test observation only. Host code should rely on\n   * `{{tool<i>turn<n>}}` substitution at tool-invocation time and not\n   * mutate the registry directly.\n   */\n  public _unsafeGetToolOutputRegistry():\n    | ToolOutputReferenceRegistry\n    | undefined {\n    return this.toolOutputRegistry;\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   * Evaluates whether a tool call requires human approval.\n   * Returns true if approval is needed, false otherwise.\n   * Does NOT perform the actual approval flow - that's handled by requestApproval().\n   */\n  private requiresApproval(\n    toolName: string,\n    args: Record<string, unknown>\n  ): boolean {\n    if (!this.toolApprovalConfig) {\n      return false;\n    }\n\n    const {\n      defaultPolicy,\n      overrides,\n      executionContext,\n      agentExecutionContextOverrides,\n    } = this.toolApprovalConfig;\n\n    // Resolve the effective execution context for this agent.\n    // Per-agent overrides take precedence — allows handoff agents to bypass HITL\n    // while the primary agent retains interactive approval.\n    const effectiveContext =\n      (this.agentId && agentExecutionContextOverrides?.[this.agentId]) ??\n      executionContext;\n\n    // Scheduled executions bypass all approval checks — no user is present\n    if (effectiveContext === ExecutionContext.SCHEDULED) {\n      return false;\n    }\n\n    // Handoff/delegate/workflow agents bypass HITL approval — these agents run\n    // autonomously as part of a multi-agent pipeline. Blocking on user approval\n    // would stall the entire graph since all agents share the same SSE stream.\n    // The primary (user-facing) agent retains HITL; only delegated agents skip it.\n    if (effectiveContext === ExecutionContext.HANDOFF) {\n      return false;\n    }\n\n    // Graph-managed routing tools (handoff/transfer) bypass HITL approval —\n    // these are internal routing mechanisms, not user-facing tool executions.\n    //\n    // NOTE: `directToolNames` is used for two purposes — (1) marking tools that\n    // are loaded as full instances and don't need on-demand ON_TOOL_EXECUTE loading,\n    // and (2) bypassing HITL. In event-driven mode ALL built-in tools (including\n    // `ask_user`) end up in directToolNames for reason (1), so we cannot use\n    // `directToolNames.has(toolName)` as the HITL-bypass test — it would let\n    // `ask_user` execute without ever firing interrupt(), defeating the whole tool.\n    // Instead, gate the bypass on the actual routing-tool name prefix.\n    if (\n      this.directToolNames?.has(toolName) &&\n      toolName.startsWith(Constants.LC_TRANSFER_TO_)\n    ) {\n      return false;\n    }\n\n    // Determine the effective policy for this tool\n    const toolOverride = overrides?.[toolName];\n    const effectivePolicy = toolOverride ?? defaultPolicy ?? 'always';\n\n    // Evaluate whether approval is required\n    if (effectivePolicy === 'always') {\n      return true;\n    } else if (effectivePolicy === 'never') {\n      return false;\n    } else {\n      // Custom function - evaluate with tool name and args\n      return effectivePolicy(toolName, args);\n    }\n  }\n\n  /**\n   * Requests human approval for a tool call using LangGraph's native interrupt().\n   *\n   * Flow:\n   * 1. Dispatches ON_TOOL_APPROVAL_REQUIRED notification (no resolve/reject — data only)\n   *    so the host can persist the request and send UI events.\n   * 2. Calls interrupt() which checkpoints graph state and pauses execution.\n   * 3. When the host resumes via Command({ resume: ToolApprovalResponse }),\n   *    interrupt() returns the response synchronously.\n   *\n   * @param call - The tool call requiring approval\n   * @param config - The runnable config for event dispatch\n   * @returns The approval response from the human\n   */\n  private async requestApproval(\n    call: ToolCall,\n    config: RunnableConfig\n  ): Promise<t.ToolApprovalResponse> {\n    const approvalRequest: t.ToolApprovalRequest = {\n      type: 'tool_approval_required',\n      toolCallId: call.id ?? '',\n      toolName: call.name,\n      toolArgs: call.args as Record<string, unknown>,\n      agentId: this.agentId,\n      description: `Tool \"${call.name}\" wants to execute with the provided arguments.`,\n    };\n\n    // MUST await — interrupt() throws GraphInterrupt synchronously which unwinds\n    // the call stack. Any un-awaited dispatch Promise is abandoned before the\n    // host's ON_TOOL_APPROVAL_REQUIRED handler runs, so the MongoDB row never\n    // gets written and the subsequent approve-tool POST 404s with\n    // \"No pending approval found\". Awaiting guarantees the handler has persisted\n    // the request before we suspend the graph.\n    await safeDispatchCustomEvent(\n      GraphEvents.ON_TOOL_APPROVAL_REQUIRED,\n      approvalRequest,\n      config\n    );\n\n    // interrupt() throws GraphInterrupt on first call (checkpoints state),\n    // returns the resume value on re-execution after Command({ resume }).\n    const response = interrupt(approvalRequest) as t.ToolApprovalResponse;\n    return response;\n  }\n\n  /**\n   * Runs a single tool call with error handling.\n   *\n   * @param batchContext  Optional per-batch context (upstream PR #117).\n   *   Threaded from `run()` for tool output reference annotation. The\n   *   `batchScopeId` field carries an anonymous synthetic scope when the\n   *   caller has no `run_id`, so concurrent batches don't collide on the\n   *   shared registry.\n   */\n  protected async runTool(\n    call: ToolCall,\n    config: RunnableConfig,\n    batchContext: RunToolBatchContext = {}\n  ): Promise<BaseMessage | Command> {\n    const {\n      batchIndex,\n      turn: batchTurn,\n      batchScopeId,\n      resolvedArgsByCallId,\n    } = batchContext;\n    const tool = this.toolMap.get(call.name);\n    const registry = this.toolOutputRegistry;\n    /**\n     * Precompute the reference key once per call — captured locally so\n     * concurrent `invoke()` calls on the same ToolNode cannot race on a\n     * shared turn field.\n     */\n    const refKey =\n      registry != null && batchIndex != null && batchTurn != null\n        ? buildReferenceKey(batchIndex, batchTurn)\n        : undefined;\n    /**\n     * Hoisted outside the try so the catch branch can stamp\n     * `_unresolvedRefs` into error ToolMessage metadata. This lets the\n     * lazy annotation transform surface a `[unresolved refs: …]` hint to\n     * the LLM, helping the model self-correct when its reference key\n     * caused the failure.\n     */\n    let unresolvedRefs: string[] = [];\n    /**\n     * Use the caller-provided `batchScopeId` when threaded from `run()`.\n     * Fall back to the config's `run_id` when runTool is invoked from a\n     * context that doesn't thread the batch context — that still\n     * preserves the runId-based partitioning for named runs.\n     */\n    const runId =\n      batchScopeId ?? (config.configurable?.run_id as string | undefined);\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      let args = call.args;\n      const stepId = this.toolCallStepIds?.get(call.id!);\n\n      // Recover truncated tool call arguments from the streaming buffer.\n      // When max_tokens truncates a tool call mid-JSON, parsePartialJson may lose\n      // content that was already streamed to the UI. The buffer has the raw accumulated\n      // arg string, so we can extract field values that were dropped.\n      if (call.id && this.streamingToolCallBuffer?.has(call.id)) {\n        args = this.recoverTruncatedArgs(call.name, call.id, args);\n        this.streamingToolCallBuffer.clear(call.id);\n      }\n\n      /**\n       * Resolve `{{tool<i>turn<n>}}` placeholders in args against the\n       * registry. Captures `unresolvedRefs` so error/success branches can\n       * surface them to the LLM via `additional_kwargs._unresolvedRefs`.\n       */\n      if (registry != null) {\n        const { resolved, unresolved } = registry.resolve(runId, args);\n        args = resolved as typeof call.args;\n        unresolvedRefs = unresolved;\n        if (\n          resolvedArgsByCallId != null &&\n          call.id != null &&\n          call.id !== '' &&\n          resolved !== call.args &&\n          typeof resolved === 'object'\n        ) {\n          resolvedArgsByCallId.set(\n            call.id,\n            resolved as Record<string, unknown>\n          );\n        }\n      }\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 (CODE_EXECUTION_TOOLS.has(call.name)) {\n        const codeSession = this.sessions?.get(Constants.EXECUTE_CODE) as\n          | t.CodeSessionContext\n          | undefined;\n        if (codeSession != null && codeSession.session_id !== '') {\n          /**\n           * Always inject session_id so retries reuse the same workspace.\n           * Also inject file refs when files exist from previous executions.\n           */\n          invokeParams = {\n            ...invokeParams,\n            session_id: codeSession.session_id,\n          };\n\n          if (codeSession.files != null && codeSession.files.length > 0) {\n            /**\n             * Convert tracked files to CodeEnvFile format for the API.\n             * Each file uses its own session_id (set when file was created).\n             * This supports files from multiple parallel/sequential executions.\n             */\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 = {\n              ...invokeParams,\n              _injected_files: fileRefs,\n            };\n          }\n        }\n      }\n\n      // ========================================================================\n      // HITL: Check if this tool requires human approval before execution.\n      // Uses LangGraph interrupt() — checkpoints state and pauses the graph.\n      // Resumes when host sends Command({ resume: ToolApprovalResponse }).\n      // ========================================================================\n      if (\n        this.requiresApproval(call.name, call.args as Record<string, unknown>)\n      ) {\n        const approvalResponse = await this.requestApproval(call, config);\n        if (!approvalResponse.approved) {\n          // Human denied the tool call - return a denial message\n          return new ToolMessage({\n            status: 'error',\n            content: `Tool call \"${call.name}\" was denied by the user.${approvalResponse.feedback != null && approvalResponse.feedback !== '' ? ` Reason: ${approvalResponse.feedback}` : ''} Please acknowledge the denial and proceed without executing this tool.`,\n            name: call.name,\n            tool_call_id: call.id ?? '',\n          });\n        }\n        // Human approved - optionally use modified args\n        if (approvalResponse.modifiedArgs) {\n          invokeParams = {\n            ...invokeParams,\n            args: approvalResponse.modifiedArgs,\n          };\n        }\n      }\n\n      const output = await tool.invoke(invokeParams, config);\n\n      // Handle Command outputs directly\n      if (isCommand(output)) {\n        return output;\n      }\n\n      // ========================================================================\n      // TOOL OUTPUT PROCESSING - Single point for all tools (MCP and non-MCP)\n      // 1. Extract string content from any output format\n      // 2. Apply TOON conversion if content contains JSON\n      // 3. Apply truncation if still too large\n      // 4. Return ToolMessage with processed string content\n      // ========================================================================\n\n      // Step 1: Extract string content from the output\n      let rawContent: string;\n      if (isBaseMessage(output) && output._getType() === 'tool') {\n        const toolMsg = output as ToolMessage;\n        rawContent = extractStringContent(toolMsg.content);\n      } else {\n        rawContent = extractStringContent(output);\n      }\n\n      // Step 2 & 3: Apply TOON conversion and truncation\n      // Skip TOON for content_tool — its output is line-numbered source code.\n      // TOON corrupts embedded JSON in source files, causing edit (str_replace) failures\n      // because the agent sees TOON-transformed content but strReplace matches original.\n      const isContentTool = call.name === 'content_tool';\n      const processed = processToolOutput(rawContent, {\n        maxLength: 100000, // 100K char limit\n        enableToon: !isContentTool,\n        minSizeForToon: 1000,\n        minReductionPercent: 10, // Only apply TOON when clearly beneficial\n      });\n\n      /**\n       * Tool output reference metadata (upstream PR #117). Register the\n       * raw, untruncated content so future `{{...}}` substitutions deliver\n       * the full payload, and stamp `_refKey` / `_refScope` /\n       * `_unresolvedRefs` into `additional_kwargs` for the lazy\n       * annotation transform to apply at LLM request time. Persisted\n       * `content` stays clean.\n       *\n       * For error ToolMessages from the underlying tool: bypass\n       * registration but still stamp `_unresolvedRefs` so the model can\n       * self-correct.\n       */\n      if (isBaseMessage(output) && output._getType() === 'tool') {\n        const toolMsg = output as ToolMessage;\n        const isError = toolMsg.status === 'error';\n        const refMeta = isError\n          ? unresolvedRefs.length > 0\n            ? { _unresolvedRefs: unresolvedRefs }\n            : undefined\n          : this.recordOutputReference(\n              runId,\n              rawContent,\n              refKey,\n              unresolvedRefs\n            );\n        return new ToolMessage({\n          status: toolMsg.status,\n          name: toolMsg.name,\n          content: processed.content,\n          tool_call_id: toolMsg.tool_call_id,\n          ...(refMeta != null && {\n            additional_kwargs: {\n              ...toolMsg.additional_kwargs,\n              ...refMeta,\n            },\n          }),\n        });\n      } else {\n        const refMeta = this.recordOutputReference(\n          runId,\n          rawContent,\n          refKey,\n          unresolvedRefs\n        );\n        return new ToolMessage({\n          status: 'success',\n          name: tool.name,\n          content: processed.content,\n          tool_call_id: call.id!,\n          ...(refMeta != null && {\n            additional_kwargs: refMeta as Record<string, unknown>,\n          }),\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        ...(unresolvedRefs.length > 0 && {\n          additional_kwargs: { _unresolvedRefs: unresolvedRefs },\n        }),\n      });\n    }\n  }\n\n  /**\n   * Recover truncated tool call arguments using the raw streaming buffer.\n   *\n   * When parsePartialJson drops content (e.g., a large \"content\" field truncated\n   * at max_tokens), this method extracts the field value from the raw accumulated\n   * arg string and merges it back into the parsed args object.\n   *\n   * This is generic — it checks ALL string fields in the raw buffer, not just\n   * content_tool fields. Any tool with a truncated string value benefits.\n   */\n  /**\n   * Recover truncated tool call arguments using the raw streaming buffer.\n   *\n   * Strategy:\n   * 1. If args are completely empty → try parsePartialJson on the raw buffer\n   * 2. Otherwise → field-level recovery: extract missing fields from raw buffer\n   *\n   * @param toolName - Tool name (for logging)\n   * @param toolCallId - The tool call ID\n   * @param args - The parsed args (potentially incomplete from parsePartialJson)\n   * @returns The args with recovered fields merged in\n   */\n\n  /* eslint-disable @typescript-eslint/no-explicit-any */\n  private recoverTruncatedArgs(\n    toolName: string,\n    toolCallId: string,\n    args: any\n  ): any {\n    /* eslint-enable @typescript-eslint/no-explicit-any */\n    if (!this.streamingToolCallBuffer) return args;\n\n    const rawArgs = this.streamingToolCallBuffer.getRawArgs(toolCallId);\n    if (!rawArgs) return args;\n\n    const rawLen = rawArgs.length;\n\n    // If args is completely empty (JSON parsing aborted before any key),\n    // attempt to parse the raw accumulated string\n    if (\n      args == null ||\n      (typeof args === 'object' && Object.keys(args).length === 0)\n    ) {\n      try {\n        // eslint-disable-next-line @typescript-eslint/no-require-imports\n        const { parsePartialJson } = require('@langchain/core/utils/json');\n        const recovered = parsePartialJson(rawArgs);\n        if (\n          recovered != null &&\n          typeof recovered === 'object' &&\n          Object.keys(recovered).length > 0\n        ) {\n          // eslint-disable-next-line no-console\n          console.warn(\n            `[TruncationRecovery] Tool=${toolName}, callId=${toolCallId}, rawBufferLen=${rawLen}, ` +\n              `parsedFields=[], recoveredFields=[${Object.keys(recovered).join(',')}] (full parse)`\n          );\n          return recovered;\n        }\n      } catch {\n        // parsePartialJson failed — fall through to field-level extraction\n      }\n    }\n\n    // Field-level recovery: extract missing fields from the raw buffer.\n    //\n    // Only attempt this when `parsedArgs` is missing top-level keys that\n    // appear at depth 0 in the raw JSON. The previous implementation walked\n    // EVERY `\"key\":` match the regex found — including keys nested inside\n    // arrays/objects like `steps[].options[].label` — and tried to \"recover\"\n    // them as top-level fields. That produced confusing log spam (false\n    // positives like `recoveredFields=[question,label,value]` for a clean\n    // multi-step `ask_user` call) and could inject stray top-level fields\n    // into `args` for downstream tool execution.\n    const parsedArgs = typeof args === 'object' ? { ...args } : {};\n    const recoveredFields: string[] = [];\n\n    /**\n     * Extract only TOP-LEVEL keys from the raw JSON. Walks the buffer\n     * tracking brace/bracket depth so nested keys are skipped.\n     */\n    const topLevelKeys: string[] = [];\n    let depth = 0;\n    let inString = false;\n    let escaped = false;\n    let i = 0;\n    while (i < rawArgs.length) {\n      const ch = rawArgs[i];\n      if (escaped) {\n        escaped = false;\n        i++;\n        continue;\n      }\n      if (inString) {\n        if (ch === '\\\\') escaped = true;\n        else if (ch === '\"') inString = false;\n        i++;\n        continue;\n      }\n      if (ch === '\"') {\n        // Possible key — only count if at depth 1 (inside the outer object)\n        const start = i + 1;\n        let j = start;\n        while (j < rawArgs.length) {\n          const c = rawArgs[j];\n          if (c === '\\\\') {\n            j += 2;\n            continue;\n          }\n          if (c === '\"') break;\n          j++;\n        }\n        if (j < rawArgs.length) {\n          // Skip whitespace after closing quote and check for ':'\n          let k = j + 1;\n          while (k < rawArgs.length && /\\s/.test(rawArgs[k])) k++;\n          if (depth === 1 && rawArgs[k] === ':') {\n            topLevelKeys.push(rawArgs.slice(start, j));\n          }\n          i = j + 1;\n          continue;\n        }\n        inString = true;\n        i++;\n        continue;\n      }\n      if (ch === '{' || ch === '[') depth++;\n      else if (ch === '}' || ch === ']') depth--;\n      i++;\n    }\n\n    for (const fieldName of topLevelKeys) {\n      if (\n        parsedArgs[fieldName] == null ||\n        parsedArgs[fieldName] === '' ||\n        parsedArgs[fieldName] === undefined\n      ) {\n        const rawValue = this.streamingToolCallBuffer.extractFieldValue(\n          toolCallId,\n          fieldName\n        );\n        if (rawValue != null && rawValue !== '') {\n          parsedArgs[fieldName] = rawValue;\n          recoveredFields.push(fieldName);\n        }\n      }\n    }\n\n    if (recoveredFields.length > 0) {\n      // eslint-disable-next-line no-console\n      console.warn(\n        `[TruncationRecovery] Tool=${toolName}, callId=${toolCallId}, rawBufferLen=${rawLen}, ` +\n          `parsedFields=[${Object.keys(args ?? {}).join(',')}], recoveredFields=[${recoveredFields.join(',')}]`\n      );\n    }\n\n    return parsedArgs;\n  }\n\n  /**\n   * Stores the raw, untruncated tool output in the registry under `refKey`\n   * (when registry + refKey are both present) and returns the metadata\n   * envelope to stamp on `ToolMessage.additional_kwargs`. The lazy\n   * annotation transform reads `_refKey` / `_refScope` / `_unresolvedRefs`\n   * at LLM request time to produce the transient annotated copy.\n   */\n  private recordOutputReference(\n    runId: string | undefined,\n    registryContent: string,\n    refKey: string | undefined,\n    unresolved: string[]\n  ): t.ToolMessageRefMetadata | undefined {\n    if (this.toolOutputRegistry != null && refKey != null) {\n      this.toolOutputRegistry.set(runId, refKey, registryContent);\n    }\n    if (refKey == null && unresolved.length === 0) return undefined;\n    const meta: t.ToolMessageRefMetadata = {};\n    if (refKey != null) {\n      meta._refKey = refKey;\n      // Anonymous invocations use a synthetic scope minted in run() — stamp\n      // it onto the message so annotateMessagesForLLM can recover it later.\n      if (runId != null) meta._refScope = runId;\n    }\n    if (unresolved.length > 0) meta._unresolvedRefs = unresolved;\n    return meta;\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        // eslint-disable-next-line no-console\n        console.warn(\n          `[ToolNode.handleRunToolCompletions] missing stepId for toolCallId=${toolCallId} ` +\n            `name=${call.name} — ON_RUN_STEP_COMPLETED skipped, output will not be persisted. ` +\n            `If this is a resumed HITL tool call, verify Graph.resetValues preserves toolCallStepIds when keepContent=true.`\n        );\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   * Converts InjectedMessage entries into LangChain HumanMessages.\n   * 'user' and 'system' both become HumanMessage to avoid provider rejections\n   * (Anthropic/Google reject non-leading SystemMessages); the original role\n   * and metadata are 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   * Dispatches tool calls to the host via ON_TOOL_EXECUTE event and returns\n   * the resulting ToolMessages along with any injected messages emitted by\n   * the host (e.g. SkillTool body injection). Injected messages must be\n   * placed AFTER the ToolMessages so the AIMessage tool_calls -> ToolMessage\n   * adjacency required by some providers is preserved.\n   */\n  private async dispatchToolEvents(\n    toolCalls: ToolCall[],\n    config: RunnableConfig\n  ): Promise<{ toolMessages: ToolMessage[]; injected: BaseMessage[] }> {\n    // ========================================================================\n    // HITL: Check approval for event-dispatched tools (browser, MCP, etc.)\n    // before dispatching. Uses LangGraph interrupt() for each tool needing\n    // approval — counter-based matching handles sequential interrupts.\n    // ========================================================================\n    const approvedCalls: ToolCall[] = [];\n    const denialMessages: ToolMessage[] = [];\n\n    for (const call of toolCalls) {\n      if (\n        this.requiresApproval(call.name, call.args as Record<string, unknown>)\n      ) {\n        const approvalResponse = await this.requestApproval(call, config);\n        if (!approvalResponse.approved) {\n          denialMessages.push(\n            new ToolMessage({\n              status: 'error',\n              content: `Tool call \"${call.name}\" was denied by the user.${approvalResponse.feedback != null && approvalResponse.feedback !== '' ? ` Reason: ${approvalResponse.feedback}` : ''} Please acknowledge the denial and proceed without executing this tool.`,\n              name: call.name,\n              tool_call_id: call.id ?? '',\n            })\n          );\n          continue;\n        }\n        // Use modified args if provided\n        if (approvalResponse.modifiedArgs) {\n          call.args = approvalResponse.modifiedArgs;\n        }\n      }\n      approvedCalls.push(call);\n    }\n\n    // If all tools were denied, return denial messages without dispatching\n    if (approvedCalls.length === 0) {\n      return { toolMessages: denialMessages, injected: [] };\n    }\n\n    const runId = config.configurable?.run_id as string | undefined;\n    const threadId = config.configurable?.thread_id as string | undefined;\n\n    /**\n     * PreToolUse hooks may deny / ask / allow each call, and may rewrite\n     * `toolInput` via `updatedInput`. A denied/asked call short-circuits\n     * with a synthetic error ToolMessage and fires PermissionDenied so\n     * the host can audit. Survivors continue to dispatch.\n     */\n    const hookDenialMessages: ToolMessage[] = [];\n    let postHookCalls = approvedCalls;\n    if (\n      runId != null &&\n      this.hookRegistry?.hasHookFor('PreToolUse', runId) === true\n    ) {\n      const HOOK_FALLBACK: AggregatedHookResult = {\n        additionalContexts: [],\n        errors: [],\n      };\n      const surviving: ToolCall[] = [];\n      const preResults = await Promise.all(\n        approvedCalls.map((call) =>\n          executeHooks({\n            registry: this.hookRegistry!,\n            input: {\n              hook_event_name: 'PreToolUse',\n              runId,\n              threadId,\n              agentId: this.agentId,\n              toolName: call.name,\n              toolInput: call.args as Record<string, unknown>,\n              toolUseId: call.id ?? '',\n              stepId: this.toolCallStepIds?.get(call.id ?? ''),\n              turn: this.toolUsageCount.get(call.name) ?? 0,\n            },\n            sessionId: runId,\n            matchQuery: call.name,\n          }).catch((): AggregatedHookResult => HOOK_FALLBACK)\n        )\n      );\n\n      for (let i = 0; i < approvedCalls.length; i++) {\n        const call = approvedCalls[i];\n        const hookResult = preResults[i];\n        const denied =\n          hookResult.decision === 'deny' || hookResult.decision === 'ask';\n        if (denied) {\n          const reason = hookResult.reason ?? 'Blocked by hook';\n          hookDenialMessages.push(\n            new ToolMessage({\n              status: 'error',\n              content: `Blocked: ${reason}`,\n              name: call.name,\n              tool_call_id: call.id ?? '',\n            })\n          );\n          if (this.hookRegistry.hasHookFor('PermissionDenied', runId)) {\n            // Fire-and-forget — denial accounting must not block dispatch.\n            void executeHooks({\n              registry: this.hookRegistry,\n              input: {\n                hook_event_name: 'PermissionDenied',\n                runId,\n                threadId,\n                agentId: this.agentId,\n                toolName: call.name,\n                toolInput: call.args as Record<string, unknown>,\n                toolUseId: call.id ?? '',\n                reason,\n              },\n              sessionId: runId,\n              matchQuery: call.name,\n            }).catch(() => {\n              /* swallow — denial is informational */\n            });\n          }\n          continue;\n        }\n        if (\n          hookResult.updatedInput != null &&\n          typeof hookResult.updatedInput === 'object'\n        ) {\n          call.args = hookResult.updatedInput as Record<string, unknown>;\n        }\n        surviving.push(call);\n      }\n      postHookCalls = surviving;\n\n      if (postHookCalls.length === 0) {\n        return {\n          toolMessages: [...denialMessages, ...hookDenialMessages],\n          injected: [],\n        };\n      }\n    }\n\n    /**\n     * Tool output reference resolution (upstream PR #114): walk each call's\n     * args and substitute `{{tool<i>turn<n>}}` placeholders with the stored\n     * raw output. Captured here BEFORE request shaping so the substituted\n     * args flow through the rest of the dispatch unchanged.\n     *\n     * Failures are non-fatal: the registry resolver returns the original\n     * string unchanged for unknown keys, and surfaces them via `unresolved`\n     * which we currently log-only. Future work can route unresolved-key\n     * complaints into a hint message for the LLM.\n     */\n    const batchTurn = this.toolOutputTurn++;\n    if (this.toolOutputRegistry != null && runId != null) {\n      const registry = this.toolOutputRegistry;\n      for (const call of postHookCalls) {\n        const args = call.args as Record<string, unknown> | undefined;\n        if (args == null) continue;\n        try {\n          const { resolved } = registry.resolve(runId, args);\n          call.args = resolved;\n        } catch {\n          /* leave args untouched on resolver failure */\n        }\n      }\n    }\n\n    const requests: t.ToolCallRequest[] = postHookCalls.map((call) => {\n      const turn = this.toolUsageCount.get(call.name) ?? 0;\n      this.toolUsageCount.set(call.name, turn + 1);\n\n      // Recover truncated args from streaming buffer (same as runTool path)\n      let args = call.args as Record<string, unknown>;\n      if (call.id && this.streamingToolCallBuffer?.has(call.id)) {\n        args = this.recoverTruncatedArgs(call.name, call.id, args) as Record<\n          string,\n          unknown\n        >;\n        this.streamingToolCallBuffer.clear(call.id);\n      }\n\n      const request: t.ToolCallRequest = {\n        id: call.id!,\n        name: call.name,\n        args,\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    const injected: BaseMessage[] = [];\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    }\n\n    /**\n     * Fire PostToolUse / PostToolUseFailure hooks after results are in.\n     * These run in parallel and never block the return — failures are\n     * swallowed so a hook bug can't masquerade as a tool failure.\n     */\n    if (runId != null && this.hookRegistry != null) {\n      const hasPost = this.hookRegistry.hasHookFor('PostToolUse', runId);\n      const hasFail = this.hookRegistry.hasHookFor('PostToolUseFailure', runId);\n      if (hasPost || hasFail) {\n        const postPromises: Promise<unknown>[] = [];\n        for (const result of results) {\n          const request = requests.find((r) => r.id === result.toolCallId);\n          if (!request) continue;\n          if (result.status === 'success' && hasPost) {\n            postPromises.push(\n              executeHooks({\n                registry: this.hookRegistry,\n                input: {\n                  hook_event_name: 'PostToolUse',\n                  runId,\n                  threadId,\n                  agentId: this.agentId,\n                  toolName: request.name,\n                  toolInput: request.args as Record<string, unknown>,\n                  toolOutput: result.content,\n                  toolUseId: result.toolCallId,\n                  stepId: this.toolCallStepIds?.get(result.toolCallId),\n                  turn: request.turn,\n                },\n                sessionId: runId,\n                matchQuery: request.name,\n              }).catch(() => undefined)\n            );\n          } else if (result.status === 'error' && hasFail) {\n            postPromises.push(\n              executeHooks({\n                registry: this.hookRegistry,\n                input: {\n                  hook_event_name: 'PostToolUseFailure',\n                  runId,\n                  threadId,\n                  agentId: this.agentId,\n                  toolName: request.name,\n                  toolInput: request.args as Record<string, unknown>,\n                  toolUseId: result.toolCallId,\n                  error: result.errorMessage ?? 'Unknown error',\n                  stepId: this.toolCallStepIds?.get(result.toolCallId),\n                  turn: request.turn,\n                },\n                sessionId: runId,\n                matchQuery: request.name,\n              }).catch(() => undefined)\n            );\n          }\n        }\n        if (postPromises.length > 0) {\n          await Promise.all(postPromises);\n        }\n      }\n    }\n\n    const eventMessages = results.map((result, idx) => {\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        contentString =\n          typeof result.content === 'string'\n            ? result.content\n            : JSON.stringify(result.content);\n        /**\n         * Tool output reference — lazy annotation (upstream PRs #114 + #117).\n         * Register the raw output under `tool<idx>turn<turn>` in the\n         * registry but leave `ToolMessage.content` clean. Stamp the ref\n         * metadata into `additional_kwargs` instead. The lazy\n         * `annotateMessagesForLLM` transform applies the visible\n         * `[ref: …]` / `_ref` annotation only on the transient copy sent\n         * to the model. Persisted message stays unannotated so\n         * conversation exports / pruning / token accounting stay clean.\n         */\n        const additionalKwargs: Record<string, unknown> = {};\n        if (this.toolOutputRegistry != null && runId != null) {\n          try {\n            const refKey = buildReferenceKey(idx, batchTurn);\n            this.toolOutputRegistry.set(runId, refKey, contentString);\n            const meta: t.ToolMessageRefMetadata = {\n              _refKey: refKey,\n              _refScope: runId,\n            };\n            Object.assign(additionalKwargs, meta);\n          } catch {\n            /* registry store failure is non-fatal — message stays clean, no annotation */\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          additional_kwargs:\n            Object.keys(additionalKwargs).length > 0\n              ? additionalKwargs\n              : undefined,\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    return {\n      toolMessages: [\n        ...denialMessages,\n        ...hookDenialMessages,\n        ...eventMessages,\n      ],\n      injected,\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 { 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    /**\n     * Per-batch local map for resolved (post-substitution) args. Lives\n     * on the stack so concurrent `run()` calls on the same ToolNode\n     * cannot read or wipe each other's entries.\n     */\n    const resolvedArgsByCallId: ResolvedArgsByCallId = new Map();\n    /**\n     * Claim this batch's turn synchronously from the registry (or fall\n     * back to 0 when the feature is disabled). For anonymous callers\n     * (no `run_id` in config), mint a unique per-batch scope id so two\n     * concurrent anonymous invocations don't target the same bucket.\n     */\n    const incomingRunId = config.configurable?.run_id as string | undefined;\n    const batchScopeId = incomingRunId ?? `\\0anon-${this.anonBatchCounter++}`;\n    const batchTurn = this.toolOutputRegistry?.nextTurn(batchScopeId) ?? 0;\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 = [\n        await this.runTool(input.lg_tool_call, config, {\n          batchIndex: 0,\n          turn: batchTurn,\n          batchScopeId,\n          resolvedArgsByCallId,\n        }),\n      ];\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            !(call.id?.startsWith('srvtoolu_') ?? false)\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        // Run direct tools and event tools in parallel — they are independent\n        const [directOutputs, eventDispatch] = (await Promise.all([\n          directCalls.length > 0\n            ? Promise.all(\n                directCalls.map((call, idx) =>\n                  this.runTool(call, config, {\n                    batchIndex: idx,\n                    turn: batchTurn,\n                    batchScopeId,\n                    resolvedArgsByCallId,\n                  })\n                )\n              )\n            : ([] as (BaseMessage | Command)[]),\n          eventCalls.length > 0\n            ? this.dispatchToolEvents(eventCalls, config)\n            : ({ toolMessages: [], injected: [] } as {\n                toolMessages: ToolMessage[];\n                injected: BaseMessage[];\n              }),\n        ])) as [\n          (BaseMessage | Command)[],\n          { toolMessages: ToolMessage[]; injected: BaseMessage[] },\n        ];\n\n        if (directCalls.length > 0 && directOutputs.length > 0) {\n          this.handleRunToolCompletions(directCalls, directOutputs, config);\n        }\n\n        // Injected messages MUST follow ToolMessages so the AIMessage\n        // tool_calls -> ToolMessage adjacency required by some providers\n        // is preserved.\n        outputs = [\n          ...directOutputs,\n          ...eventDispatch.toolMessages,\n          ...eventDispatch.injected,\n        ];\n      } else {\n        outputs = await Promise.all(\n          filteredCalls.map((call, idx) =>\n            this.runTool(call, config, {\n              batchIndex: idx,\n              turn: batchTurn,\n              batchScopeId,\n              resolvedArgsByCallId,\n            })\n          )\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     * Dedupe handoffs targeting the same destination.\n     *\n     * Parent LLMs sometimes emit multiple parallel transfer_to_<agent> tool\n     * calls for the same child agent in one model tick (e.g. \"send email 1\"\n     * and \"send email 2\" both routed to the Productivity Assistant). LangGraph\n     * would otherwise create two parallel Sends into the same subgraph, which\n     * produces duplicate handoff entries in the UI and leaves extra\n     * tool_call_ids without a clean result when the single child run finishes.\n     *\n     * Merge same-destination handoffs into one Command whose update.messages\n     * carries every original ToolMessage — the primary one has its\n     * Instructions field rebuilt from the combined set, and the rest are kept\n     * verbatim so the parent message history has a ToolMessage for every\n     * tool_call_id (LangChain requires every AI tool_call to be resolved).\n     * The child's _extractTransferContext filters all transfer ToolMessages\n     * out of the child's view, so it only ever sees the merged instructions.\n     */\n    if (handoffCommands.length > 1) {\n      const byDestination = new Map<string, Command[]>();\n      for (const cmd of handoffCommands) {\n        const goto = cmd.goto;\n        const dest = typeof goto === 'string' ? goto : (goto as string[])[0];\n        const arr = byDestination.get(dest) ?? [];\n        arr.push(cmd);\n        byDestination.set(dest, arr);\n      }\n\n      const hasDuplicates = Array.from(byDestination.values()).some(\n        (arr) => arr.length > 1\n      );\n\n      if (hasDuplicates) {\n        const TRANSFER_INSTRUCTIONS_PATTERN =\n          /(?:Instructions?|Context):\\s*(.+)/is;\n        const mergedHandoffs: Command[] = [];\n\n        for (const [dest, cmds] of byDestination) {\n          if (cmds.length === 1) {\n            mergedHandoffs.push(cmds[0]);\n            continue;\n          }\n\n          const allToolMessages: ToolMessage[] = [];\n          const allOtherMessages: BaseMessage[] = [];\n          for (const cmd of cmds) {\n            const upd = cmd.update as { messages?: BaseMessage[] } | undefined;\n            for (const m of upd?.messages ?? []) {\n              if (m.getType() === 'tool') {\n                allToolMessages.push(m as ToolMessage);\n              } else {\n                allOtherMessages.push(m);\n              }\n            }\n          }\n\n          if (allToolMessages.length === 0) {\n            mergedHandoffs.push(cmds[0]);\n            continue;\n          }\n\n          const primary = allToolMessages[0];\n          const primaryContent =\n            typeof primary.content === 'string'\n              ? primary.content\n              : JSON.stringify(primary.content);\n\n          const mergedInstructions: string[] = [];\n          for (const tm of allToolMessages) {\n            const c =\n              typeof tm.content === 'string'\n                ? tm.content\n                : JSON.stringify(tm.content);\n            const match = c.match(TRANSFER_INSTRUCTIONS_PATTERN);\n            if (match?.[1]) {\n              const instr = match[1].trim();\n              if (instr && !mergedInstructions.includes(instr)) {\n                mergedInstructions.push(instr);\n              }\n            }\n          }\n\n          let mergedPrimaryContent = primaryContent;\n          if (mergedInstructions.length > 1) {\n            const header = primaryContent\n              .replace(TRANSFER_INSTRUCTIONS_PATTERN, '')\n              .trimEnd();\n            const combinedInstr = mergedInstructions\n              .map((s, i) => `${i + 1}. ${s}`)\n              .join('\\n');\n            mergedPrimaryContent =\n              `${header}\\nInstructions: ${combinedInstr}`.trim();\n          }\n\n          const mergedPrimary = new ToolMessage({\n            content: mergedPrimaryContent,\n            tool_call_id: primary.tool_call_id,\n            name: primary.name,\n            additional_kwargs: { ...primary.additional_kwargs },\n          });\n\n          const mergedMessages: BaseMessage[] = [\n            mergedPrimary,\n            ...allToolMessages.slice(1),\n            ...allOtherMessages,\n          ];\n\n          mergedHandoffs.push(\n            new Command({\n              graph: Command.PARENT,\n              goto: dest,\n              update: { messages: mergedMessages },\n            })\n          );\n        }\n\n        handoffCommands.length = 0;\n        handoffCommands.push(...mergedHandoffs);\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":["Send","RunnableCallable","toolOutputReferences","ToolOutputReferenceRegistry","ExecutionContext","Constants","safeDispatchCustomEvent","GraphEvents","interrupt","buildReferenceKey","CODE_EXECUTION_TOOLS","ToolMessage","isCommand","isBaseMessage","processToolOutput","isGraphInterrupt","messages","HumanMessage","executeHooks","isAIMessage","Command","END"],"mappings":"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"}