@illuma-ai/agents 1.1.17 → 1.1.18

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.
@@ -135,9 +135,20 @@ class ToolNode extends run.RunnableCallable {
135
135
  if (!this.toolApprovalConfig) {
136
136
  return false;
137
137
  }
138
- const { defaultPolicy, overrides, executionContext } = this.toolApprovalConfig;
139
- // Scheduled executions bypass all approval checks
140
- if (executionContext === constants.ExecutionContext.SCHEDULED) {
138
+ const { defaultPolicy, overrides, executionContext, agentExecutionContextOverrides, } = this.toolApprovalConfig;
139
+ // Resolve the effective execution context for this agent.
140
+ // Per-agent overrides take precedence — allows handoff agents to bypass HITL
141
+ // while the primary agent retains interactive approval.
142
+ const effectiveContext = (this.agentId && agentExecutionContextOverrides?.[this.agentId]) ?? executionContext;
143
+ // Scheduled executions bypass all approval checks — no user is present
144
+ if (effectiveContext === constants.ExecutionContext.SCHEDULED) {
145
+ return false;
146
+ }
147
+ // Handoff/delegate/workflow agents bypass HITL approval — these agents run
148
+ // autonomously as part of a multi-agent pipeline. Blocking on user approval
149
+ // would stall the entire graph since all agents share the same SSE stream.
150
+ // The primary (user-facing) agent retains HITL; only delegated agents skip it.
151
+ if (effectiveContext === constants.ExecutionContext.HANDOFF) {
141
152
  return false;
142
153
  }
143
154
  // Graph-managed tools (handoff/transfer tools) bypass HITL approval —
@@ -1 +1 @@
1
- {"version":3,"file":"ToolNode.cjs","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 { ExecutionContext } from './approval/constants';\nimport { RunnableCallable } from '@/utils';\nimport { processToolOutput } from '@/utils/toonFormat';\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/**\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\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 }: 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 }\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 { defaultPolicy, overrides, executionContext } =\n this.toolApprovalConfig;\n\n // Scheduled executions bypass all approval checks\n if (executionContext === ExecutionContext.SCHEDULED) {\n return false;\n }\n\n // Graph-managed tools (handoff/transfer tools) bypass HITL approval —\n // these are internal routing mechanisms, not user-facing tool executions\n if (this.directToolNames?.has(toolName)) {\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 via event dispatch.\n * Dispatches an ON_TOOL_APPROVAL_REQUIRED event and waits for the host\n * to resolve the promise with an approval response.\n *\n * This uses the same pattern as ON_TOOL_EXECUTE: a promise-based event\n * dispatch where the host calls resolve/reject when the human responds.\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 return new Promise<t.ToolApprovalResponse>((resolve, reject) => {\n safeDispatchCustomEvent(\n GraphEvents.ON_TOOL_APPROVAL_REQUIRED,\n {\n ...approvalRequest,\n resolve,\n reject,\n },\n config\n );\n });\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 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 // 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 != 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 event-driven pattern: dispatches ON_TOOL_APPROVAL_REQUIRED event\n // and waits for the host to resolve/reject with a 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 // Step 4: Return ToolMessage with processed string content\n if (isBaseMessage(output) && output._getType() === 'tool') {\n const toolMsg = output as ToolMessage;\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 });\n } else {\n return new ToolMessage({\n status: 'success',\n name: tool.name,\n content: processed.content,\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 * 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 const parsedArgs = typeof args === 'object' ? { ...args } : {};\n const recoveredFields: string[] = [];\n\n // Extract field names from the raw JSON string\n const fieldPattern = /\"([^\"]+)\"\\s*:/g;\n let match;\n const rawFieldNames: string[] = [];\n while ((match = fieldPattern.exec(rawArgs)) !== null) {\n rawFieldNames.push(match[1]);\n }\n\n for (const fieldName of rawFieldNames) {\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 * 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 // ========================================================================\n // HITL: Check approval for event-dispatched tools (browser, MCP, etc.)\n // before dispatching. Denied tools return denial messages immediately.\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 denialMessages;\n }\n\n const requests: t.ToolCallRequest[] = approvedCalls.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 eventMessages = 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 contentString =\n typeof result.content === 'string'\n ? result.content\n : JSON.stringify(result.content);\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 return [...denialMessages, ...eventMessages];\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 !(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, eventOutputs] = (await Promise.all([\n directCalls.length > 0\n ? Promise.all(directCalls.map((call) => this.runTool(call, config)))\n : [],\n eventCalls.length > 0\n ? this.dispatchToolEvents(eventCalls, config)\n : [],\n ])) as [(BaseMessage | Command)[], ToolMessage[]];\n\n if (directCalls.length > 0 && directOutputs.length > 0) {\n this.handleRunToolCompletions(directCalls, directOutputs, 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":["Send","RunnableCallable","ExecutionContext","safeDispatchCustomEvent","GraphEvents","Constants","ToolMessage","isCommand","isBaseMessage","processToolOutput","isGraphInterrupt","messages","isAIMessage","Command","END"],"mappings":";;;;;;;;;;;;;;AA2BA;;AAEG;AACH,SAAS,MAAM,CAAC,KAAc,EAAA;IAC5B,OAAO,KAAK,YAAYA,cAAI;AAC9B;AAEA;;;;AAIG;AACH,SAAS,oBAAoB,CAAC,OAAgB,EAAA;;AAE5C,IAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AAC/B,QAAA,OAAO,OAAO;IAChB;;AAGA,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QAC1B,MAAM,SAAS,GAAa,EAAE;AAC9B,QAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;AAC3B,YAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,gBAAA,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;YACvB;iBAAO,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;;gBAErD,MAAM,GAAG,GAAG,KAAgC;AAC5C,gBAAA,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;AACvD,oBAAA,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAC1B;AAAO,qBAAA,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;;AAEvC,oBAAA,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAC1B;YACF;QACF;AACA,QAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AACxB,YAAA,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QAC7B;IACF;;AAGA,IAAA,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;AAChC;AAEA;AACM,MAAO,QAAkB,SAAQC,oBAAsB,CAAA;AACnD,IAAA,OAAO;AACP,IAAA,gBAAgB;IACxB,gBAAgB,GAAG,IAAI;IACvB,KAAK,GAAG,KAAK;AACb,IAAA,eAAe;AACf,IAAA,YAAY;AACJ,IAAA,cAAc;;AAEd,IAAA,aAAa,GAAwB,IAAI,GAAG,EAAE;;AAE9C,IAAA,YAAY;;AAEZ,IAAA,iBAAiB;;AAEjB,IAAA,QAAQ;;IAER,eAAe,GAAY,KAAK;;AAEhC,IAAA,OAAO;;AAEP,IAAA,eAAe;;AAEf,IAAA,kBAAkB;;AAElB,IAAA,uBAAuB;AAE/B,IAAA,WAAA,CAAY,EACV,KAAK,EACL,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,QAAQ,EACR,eAAe,EACf,OAAO,EACP,eAAe,EACf,uBAAuB,EACvB,kBAAkB,GACU,EAAA;QAC5B,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;QACvE,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AACzE,QAAA,IAAI,CAAC,eAAe,GAAG,eAAe;QACtC,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,IAAI,IAAI,CAAC,gBAAgB;AACjE,QAAA,IAAI,CAAC,gBAAgB,GAAG,gBAAgB;AACxC,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY;AAChC,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,EAAkB;AAC/C,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY;AAChC,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,QAAA,IAAI,CAAC,eAAe,GAAG,eAAe,IAAI,KAAK;AAC/C,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;AACtB,QAAA,IAAI,CAAC,eAAe,GAAG,eAAe;AACtC,QAAA,IAAI,CAAC,uBAAuB,GAAG,uBAAuB;AACtD,QAAA,IAAI,CAAC,kBAAkB,GAAG,kBAAkB;IAC9C;AAEA;;;AAGG;IACK,oBAAoB,GAAA;QAC1B,IAAI,IAAI,CAAC,iBAAiB;YAAE,OAAO,IAAI,CAAC,iBAAiB;AAEzD,QAAA,MAAM,OAAO,GAAc,IAAI,GAAG,EAAE;QACpC,MAAM,QAAQ,GAAe,EAAE;AAE/B,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE;AAC/C,gBAAA,IACE,CAAC,OAAO,CAAC,eAAe,IAAI,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClE;AACA,oBAAA,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;oBACtB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACnC,oBAAA,IAAI,IAAI;AAAE,wBAAA,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;gBACnC;YACF;QACF;QAEA,IAAI,CAAC,iBAAiB,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE;QAC9C,OAAO,IAAI,CAAC,iBAAiB;IAC/B;AAEA;;;AAGG;IACI,kBAAkB,GAAA;QACvB,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACtC;AAEA;;;;AAIG;IACK,gBAAgB,CACtB,QAAgB,EAChB,IAA6B,EAAA;AAE7B,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;AAC5B,YAAA,OAAO,KAAK;QACd;QAEA,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAClD,IAAI,CAAC,kBAAkB;;AAGzB,QAAA,IAAI,gBAAgB,KAAKC,0BAAgB,CAAC,SAAS,EAAE;AACnD,YAAA,OAAO,KAAK;QACd;;;QAIA,IAAI,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE;AACvC,YAAA,OAAO,KAAK;QACd;;AAGA,QAAA,MAAM,YAAY,GAAG,SAAS,GAAG,QAAQ,CAAC;AAC1C,QAAA,MAAM,eAAe,GAAG,YAAY,IAAI,aAAa,IAAI,QAAQ;;AAGjE,QAAA,IAAI,eAAe,KAAK,QAAQ,EAAE;AAChC,YAAA,OAAO,IAAI;QACb;AAAO,aAAA,IAAI,eAAe,KAAK,OAAO,EAAE;AACtC,YAAA,OAAO,KAAK;QACd;aAAO;;AAEL,YAAA,OAAO,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC;QACxC;IACF;AAEA;;;;;;;;;;;AAWG;AACK,IAAA,MAAM,eAAe,CAC3B,IAAc,EACd,MAAsB,EAAA;AAEtB,QAAA,MAAM,eAAe,GAA0B;AAC7C,YAAA,IAAI,EAAE,wBAAwB;AAC9B,YAAA,UAAU,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;YACzB,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,QAAQ,EAAE,IAAI,CAAC,IAA+B;YAC9C,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,YAAA,WAAW,EAAE,CAAA,MAAA,EAAS,IAAI,CAAC,IAAI,CAAA,+CAAA,CAAiD;SACjF;QAED,OAAO,IAAI,OAAO,CAAyB,CAAC,OAAO,EAAE,MAAM,KAAI;AAC7D,YAAAC,8BAAuB,CACrBC,iBAAW,CAAC,yBAAyB,EACrC;AACE,gBAAA,GAAG,eAAe;gBAClB,OAAO;gBACP,MAAM;aACP,EACD,MAAM,CACP;AACH,QAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;AACO,IAAA,MAAM,OAAO,CACrB,IAAc,EACd,MAAsB,EAAA;AAEtB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;AACxC,QAAA,IAAI;AACF,YAAA,IAAI,IAAI,KAAK,SAAS,EAAE;gBACtB,MAAM,IAAI,KAAK,CAAC,CAAA,MAAA,EAAS,IAAI,CAAC,IAAI,CAAA,YAAA,CAAc,CAAC;YACnD;AACA,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACpD,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC;AAC5C,YAAA,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE;gBACrC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC;YACvC;AACA,YAAA,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI;AACpB,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC,IAAI,CAAC,EAAG,CAAC;;;;;AAMlD,YAAA,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,uBAAuB,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;AACzD,gBAAA,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC;gBAC1D,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7C;;AAGA,YAAA,IAAI,YAAY,GAA4B;AAC1C,gBAAA,GAAG,IAAI;gBACP,IAAI;AACJ,gBAAA,IAAI,EAAE,WAAW;gBACjB,MAAM;gBACN,IAAI;aACL;;YAGD,IAAI,IAAI,CAAC,IAAI,KAAKC,eAAS,CAAC,yBAAyB,EAAE;gBACrD,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,oBAAoB,EAAE;AACzD,gBAAA,YAAY,GAAG;AACb,oBAAA,GAAG,YAAY;oBACf,OAAO;oBACP,QAAQ;iBACT;YACH;iBAAO,IAAI,IAAI,CAAC,IAAI,KAAKA,eAAS,CAAC,WAAW,EAAE;AAC9C,gBAAA,YAAY,GAAG;AACb,oBAAA,GAAG,YAAY;oBACf,YAAY,EAAE,IAAI,CAAC,YAAY;iBAChC;YACH;AAEA;;;;;;;;AAQG;AACH,YAAA,IACE,IAAI,CAAC,IAAI,KAAKA,eAAS,CAAC,YAAY;AACpC,gBAAA,IAAI,CAAC,IAAI,KAAKA,eAAS,CAAC,yBAAyB,EACjD;AACA,gBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAACA,eAAS,CAAC,YAAY,CAEhD;gBACb,IAAI,WAAW,IAAI,IAAI,IAAI,WAAW,CAAC,UAAU,KAAK,EAAE,EAAE;AACxD;;;AAGG;AACH,oBAAA,YAAY,GAAG;AACb,wBAAA,GAAG,YAAY;wBACf,UAAU,EAAE,WAAW,CAAC,UAAU;qBACnC;AAED,oBAAA,IAAI,WAAW,CAAC,KAAK,IAAI,IAAI,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7D;;;;AAIG;AACH,wBAAA,MAAM,QAAQ,GAAoB,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;AACjE,4BAAA,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,WAAW,CAAC,UAAU;4BACrD,EAAE,EAAE,IAAI,CAAC,EAAE;4BACX,IAAI,EAAE,IAAI,CAAC,IAAI;AAChB,yBAAA,CAAC,CAAC;AACH,wBAAA,YAAY,GAAG;AACb,4BAAA,GAAG,YAAY;AACf,4BAAA,eAAe,EAAE,QAAQ;yBAC1B;oBACH;gBACF;YACF;;;;;;AAOA,YAAA,IACE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAA+B,CAAC,EACtE;gBACA,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC;AACjE,gBAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE;;oBAE9B,OAAO,IAAIC,oBAAW,CAAC;AACrB,wBAAA,MAAM,EAAE,OAAO;AACf,wBAAA,OAAO,EAAE,CAAA,WAAA,EAAc,IAAI,CAAC,IAAI,CAAA,yBAAA,EAA4B,gBAAgB,CAAC,QAAQ,IAAI,IAAI,IAAI,gBAAgB,CAAC,QAAQ,KAAK,EAAE,GAAG,CAAA,SAAA,EAAY,gBAAgB,CAAC,QAAQ,CAAA,CAAE,GAAG,EAAE,CAAA,uEAAA,CAAyE;wBACzP,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,wBAAA,YAAY,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AAC5B,qBAAA,CAAC;gBACJ;;AAEA,gBAAA,IAAI,gBAAgB,CAAC,YAAY,EAAE;AACjC,oBAAA,YAAY,GAAG;AACb,wBAAA,GAAG,YAAY;wBACf,IAAI,EAAE,gBAAgB,CAAC,YAAY;qBACpC;gBACH;YACF;YAEA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC;;AAGtD,YAAA,IAAIC,mBAAS,CAAC,MAAM,CAAC,EAAE;AACrB,gBAAA,OAAO,MAAM;YACf;;;;;;;;;AAWA,YAAA,IAAI,UAAkB;AACtB,YAAA,IAAIC,sBAAa,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,KAAK,MAAM,EAAE;gBACzD,MAAM,OAAO,GAAG,MAAqB;AACrC,gBAAA,UAAU,GAAG,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC;YACpD;iBAAO;AACL,gBAAA,UAAU,GAAG,oBAAoB,CAAC,MAAM,CAAC;YAC3C;;;;;AAMA,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,KAAK,cAAc;AAClD,YAAA,MAAM,SAAS,GAAGC,4BAAiB,CAAC,UAAU,EAAE;gBAC9C,SAAS,EAAE,MAAM;gBACjB,UAAU,EAAE,CAAC,aAAa;AAC1B,gBAAA,cAAc,EAAE,IAAI;gBACpB,mBAAmB,EAAE,EAAE;AACxB,aAAA,CAAC;;AAGF,YAAA,IAAID,sBAAa,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,KAAK,MAAM,EAAE;gBACzD,MAAM,OAAO,GAAG,MAAqB;gBACrC,OAAO,IAAIF,oBAAW,CAAC;oBACrB,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,OAAO,EAAE,SAAS,CAAC,OAAO;oBAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;AACnC,iBAAA,CAAC;YACJ;iBAAO;gBACL,OAAO,IAAIA,oBAAW,CAAC;AACrB,oBAAA,MAAM,EAAE,SAAS;oBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,SAAS,CAAC,OAAO;oBAC1B,YAAY,EAAE,IAAI,CAAC,EAAG;AACvB,iBAAA,CAAC;YACJ;QACF;QAAE,OAAO,EAAW,EAAE;YACpB,MAAM,CAAC,GAAG,EAAW;AACrB,YAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;AAC1B,gBAAA,MAAM,CAAC;YACT;AACA,YAAA,IAAII,0BAAgB,CAAC,CAAC,CAAC,EAAE;AACvB,gBAAA,MAAM,CAAC;YACT;AACA,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,gBAAA,IAAI;oBACF,MAAM,IAAI,CAAC,YAAY,CACrB;AACE,wBAAA,KAAK,EAAE,CAAC;wBACR,EAAE,EAAE,IAAI,CAAC,EAAG;wBACZ,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,KAAK,EAAE,IAAI,CAAC,IAAI;AACjB,qBAAA,EACD,MAAM,CAAC,QAAQ,CAChB;gBACH;gBAAE,OAAO,YAAY,EAAE;;AAErB,oBAAA,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE;wBACtC,QAAQ,EAAE,IAAI,CAAC,IAAI;wBACnB,UAAU,EAAE,IAAI,CAAC,EAAE;wBACnB,QAAQ,EAAE,IAAI,CAAC,IAAI;wBACnB,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC,IAAI,CAAC,EAAG,CAAC;wBAC3C,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;AACxC,wBAAA,aAAa,EAAE;4BACb,OAAO,EAAE,CAAC,CAAC,OAAO;AAClB,4BAAA,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,SAAS;AAC5B,yBAAA;wBACD,YAAY,EACV,YAAY,YAAY;AACtB,8BAAE;gCACE,OAAO,EAAE,YAAY,CAAC,OAAO;AAC7B,gCAAA,KAAK,EAAE,YAAY,CAAC,KAAK,IAAI,SAAS;AACvC;AACH,8BAAE;AACE,gCAAA,OAAO,EAAE,MAAM,CAAC,YAAY,CAAC;AAC7B,gCAAA,KAAK,EAAE,SAAS;AACjB,6BAAA;AACR,qBAAA,CAAC;gBACJ;YACF;YACA,OAAO,IAAIJ,oBAAW,CAAC;AACrB,gBAAA,MAAM,EAAE,OAAO;AACf,gBAAA,OAAO,EAAE,CAAA,OAAA,EAAU,CAAC,CAAC,OAAO,CAAA,4BAAA,CAA8B;gBAC1D,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,gBAAA,YAAY,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AAC5B,aAAA,CAAC;QACJ;IACF;AAEA;;;;;;;;;AASG;AACH;;;;;;;;;;;AAWG;;AAGK,IAAA,oBAAoB,CAC1B,QAAgB,EAChB,UAAkB,EAClB,IAAS,EAAA;;QAGT,IAAI,CAAC,IAAI,CAAC,uBAAuB;AAAE,YAAA,OAAO,IAAI;QAE9C,MAAM,OAAO,GAAG,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,UAAU,CAAC;AACnE,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,IAAI;AAEzB,QAAA,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM;;;QAI7B,IACE,IAAI,IAAI,IAAI;AACZ,aAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,EAC5D;AACA,YAAA,IAAI;;gBAEF,MAAM,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,4BAA4B,CAAC;AAClE,gBAAA,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC;gBAC3C,IACE,SAAS,IAAI,IAAI;oBACjB,OAAO,SAAS,KAAK,QAAQ;oBAC7B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EACjC;;oBAEA,OAAO,CAAC,IAAI,CACV,CAAA,0BAAA,EAA6B,QAAQ,CAAA,SAAA,EAAY,UAAU,CAAA,eAAA,EAAkB,MAAM,CAAA,EAAA,CAAI;AACrF,wBAAA,CAAA,kCAAA,EAAqC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,cAAA,CAAgB,CACxF;AACD,oBAAA,OAAO,SAAS;gBAClB;YACF;AAAE,YAAA,MAAM;;YAER;QACF;;AAGA,QAAA,MAAM,UAAU,GAAG,OAAO,IAAI,KAAK,QAAQ,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;QAC9D,MAAM,eAAe,GAAa,EAAE;;QAGpC,MAAM,YAAY,GAAG,gBAAgB;AACrC,QAAA,IAAI,KAAK;QACT,MAAM,aAAa,GAAa,EAAE;AAClC,QAAA,OAAO,CAAC,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE;YACpD,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC9B;AAEA,QAAA,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE;AACrC,YAAA,IACE,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI;AAC7B,gBAAA,UAAU,CAAC,SAAS,CAAC,KAAK,EAAE;AAC5B,gBAAA,UAAU,CAAC,SAAS,CAAC,KAAK,SAAS,EACnC;AACA,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,CAAC,iBAAiB,CAC7D,UAAU,EACV,SAAS,CACV;gBACD,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ,KAAK,EAAE,EAAE;AACvC,oBAAA,UAAU,CAAC,SAAS,CAAC,GAAG,QAAQ;AAChC,oBAAA,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC;gBACjC;YACF;QACF;AAEA,QAAA,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE;;YAE9B,OAAO,CAAC,IAAI,CACV,CAAA,0BAAA,EAA6B,QAAQ,CAAA,SAAA,EAAY,UAAU,CAAA,eAAA,EAAkB,MAAM,CAAA,EAAA,CAAI;gBACrF,CAAA,cAAA,EAAiB,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,oBAAA,EAAuB,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAA,CAAG,CACxG;QACH;AAEA,QAAA,OAAO,UAAU;IACnB;AAEA;;;AAGG;IACK,qBAAqB,GAAA;AAC3B,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAClB,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAACD,eAAS,CAAC,YAAY,CAE/C;QACb,IAAI,CAAC,WAAW,EAAE;AAChB,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,MAAM,OAAO,GAAyD;YACpE,UAAU,EAAE,WAAW,CAAC,UAAU;SACnC;AAED,QAAA,IAAI,WAAW,CAAC,KAAK,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACrD,YAAA,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;AAC/C,gBAAA,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,WAAW,CAAC,UAAU;gBACrD,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;AAChB,aAAA,CAAC,CAAC;QACL;AAEA,QAAA,OAAO,OAAO;IAChB;AAEA;;;AAGG;IACK,2BAA2B,CACjC,OAA8B,EAC9B,QAA6B,EAAA;AAE7B,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB;QACF;AAEA,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACvC,YAAA,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;AACzB,YAAA,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,IAAI,IAAI,EAAE;gBAC1D;YACF;AAEA,YAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,UAAU,CAAC;AAChE,YAAA,IACE,OAAO,EAAE,IAAI,KAAKA,eAAS,CAAC,YAAY;AACxC,gBAAA,OAAO,EAAE,IAAI,KAAKA,eAAS,CAAC,yBAAyB,EACrD;gBACA;YACF;AAEA,YAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAA+C;AACvE,YAAA,IAAI,QAAQ,EAAE,UAAU,IAAI,IAAI,IAAI,QAAQ,CAAC,UAAU,KAAK,EAAE,EAAE;gBAC9D;YACF;AAEA,YAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,IAAI,EAAE;AACrC,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAACA,eAAS,CAAC,YAAY,CAEnD;AACb,YAAA,MAAM,aAAa,GAAG,eAAe,EAAE,KAAK,IAAI,EAAE;AAElD,YAAA,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvB,MAAM,gBAAgB,GAAe,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;AAC3D,oBAAA,GAAG,IAAI;oBACP,UAAU,EAAE,QAAQ,CAAC,UAAU;AAChC,iBAAA,CAAC,CAAC;AAEH,gBAAA,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;gBACjE,MAAM,gBAAgB,GAAG,aAAa,CAAC,MAAM,CAC3C,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CACjC;gBAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAACA,eAAS,CAAC,YAAY,EAAE;oBACxC,UAAU,EAAE,QAAQ,CAAC,UAAU;AAC/B,oBAAA,KAAK,EAAE,CAAC,GAAG,gBAAgB,EAAE,GAAG,gBAAgB,CAAC;AACjD,oBAAA,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;AACxB,iBAAA,CAAC;YACJ;iBAAO;gBACL,IAAI,CAAC,QAAQ,CAAC,GAAG,CAACA,eAAS,CAAC,YAAY,EAAE;oBACxC,UAAU,EAAE,QAAQ,CAAC,UAAU;AAC/B,oBAAA,KAAK,EAAE,aAAa;AACpB,oBAAA,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;AACxB,iBAAA,CAAC;YACJ;QACF;IACF;AAEA;;;;;;;;AAQG;AACK,IAAA,wBAAwB,CAC9B,KAAiB,EACjB,OAAkC,EAClC,MAAsB,EAAA;AAEtB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;AACrB,YAAA,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;AACzB,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAG,CAAC,IAAI,CAAC;AAElD,YAAA,IAAIE,mBAAS,CAAC,MAAM,CAAC,EAAE;gBACrB;YACF;YAEA,MAAM,WAAW,GAAG,MAAqB;AACzC,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE;;;AAIhC,YAAA,IAAI,WAAW,CAAC,MAAM,KAAK,OAAO,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE;gBAC/D;YACF;;YAGA,IACE,IAAI,CAAC,QAAQ;AACb,iBAAC,IAAI,CAAC,IAAI,KAAKF,eAAS,CAAC,YAAY;oBACnC,IAAI,CAAC,IAAI,KAAKA,eAAS,CAAC,yBAAyB,CAAC,EACpD;AACA,gBAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,QAEhB;AACb,gBAAA,IAAI,QAAQ,EAAE,UAAU,IAAI,IAAI,IAAI,QAAQ,CAAC,UAAU,KAAK,EAAE,EAAE;AAC9D,oBAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,IAAI,EAAE;AACrC,oBAAA,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAACA,eAAS,CAAC,YAAY,CAEnD;AACb,oBAAA,MAAM,aAAa,GAAG,eAAe,EAAE,KAAK,IAAI,EAAE;AAElD,oBAAA,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;wBACvB,MAAM,gBAAgB,GAAe,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;AAC3D,4BAAA,GAAG,IAAI;4BACP,UAAU,EAAE,QAAQ,CAAC,UAAU;AAChC,yBAAA,CAAC,CAAC;AACH,wBAAA,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;wBACjE,MAAM,gBAAgB,GAAG,aAAa,CAAC,MAAM,CAC3C,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CACjC;wBACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAACA,eAAS,CAAC,YAAY,EAAE;4BACxC,UAAU,EAAE,QAAQ,CAAC,UAAU;AAC/B,4BAAA,KAAK,EAAE,CAAC,GAAG,gBAAgB,EAAE,GAAG,gBAAgB,CAAC;AACjD,4BAAA,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;AACxB,yBAAA,CAAC;oBACJ;yBAAO;wBACL,IAAI,CAAC,QAAQ,CAAC,GAAG,CAACA,eAAS,CAAC,YAAY,EAAE;4BACxC,UAAU,EAAE,QAAQ,CAAC,UAAU;AAC/B,4BAAA,KAAK,EAAE,aAAa;AACpB,4BAAA,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;AACxB,yBAAA,CAAC;oBACJ;gBACF;YACF;;AAGA,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE;YAC1D,IAAI,CAAC,MAAM,EAAE;gBACX;YACF;AAEA,YAAA,MAAM,aAAa,GACjB,OAAO,WAAW,CAAC,OAAO,KAAK;kBAC3B,WAAW,CAAC;kBACZ,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC;AAEzC,YAAA,MAAM,SAAS,GAAwB;AACrC,gBAAA,IAAI,EACF,OAAO,IAAI,CAAC,IAAI,KAAK;sBAChB,IAAI,CAAC;sBACN,IAAI,CAAC,SAAS,CAAE,IAAI,CAAC,IAAgB,IAAI,EAAE,CAAC;gBAClD,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,gBAAA,EAAE,EAAE,UAAU;AACd,gBAAA,MAAM,EAAE,aAAa;AACrB,gBAAA,QAAQ,EAAE,CAAC;aACZ;AAED,YAAAF,8BAAuB,CACrBC,iBAAW,CAAC,qBAAqB,EACjC;AACE,gBAAA,MAAM,EAAE;AACN,oBAAA,EAAE,EAAE,MAAM;AACV,oBAAA,KAAK,EAAE,IAAI;AACX,oBAAA,IAAI,EAAE,WAAoB;oBAC1B,SAAS;AACV,iBAAA;aACF,EACD,MAAM,CACP;QACH;IACF;AAEA;;;AAGG;AACK,IAAA,MAAM,kBAAkB,CAC9B,SAAqB,EACrB,MAAsB,EAAA;;;;;QAMtB,MAAM,aAAa,GAAe,EAAE;QACpC,MAAM,cAAc,GAAkB,EAAE;AAExC,QAAA,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE;AAC5B,YAAA,IACE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAA+B,CAAC,EACtE;gBACA,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC;AACjE,gBAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE;AAC9B,oBAAA,cAAc,CAAC,IAAI,CACjB,IAAIE,oBAAW,CAAC;AACd,wBAAA,MAAM,EAAE,OAAO;AACf,wBAAA,OAAO,EAAE,CAAA,WAAA,EAAc,IAAI,CAAC,IAAI,CAAA,yBAAA,EAA4B,gBAAgB,CAAC,QAAQ,IAAI,IAAI,IAAI,gBAAgB,CAAC,QAAQ,KAAK,EAAE,GAAG,CAAA,SAAA,EAAY,gBAAgB,CAAC,QAAQ,CAAA,CAAE,GAAG,EAAE,CAAA,uEAAA,CAAyE;wBACzP,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,wBAAA,YAAY,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AAC5B,qBAAA,CAAC,CACH;oBACD;gBACF;;AAEA,gBAAA,IAAI,gBAAgB,CAAC,YAAY,EAAE;AACjC,oBAAA,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC,YAAY;gBAC3C;YACF;AACA,YAAA,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1B;;AAGA,QAAA,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;AAC9B,YAAA,OAAO,cAAc;QACvB;QAEA,MAAM,QAAQ,GAAwB,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;AAC/D,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACpD,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC;;AAG5C,YAAA,IAAI,IAAI,GAAG,IAAI,CAAC,IAA+B;AAC/C,YAAA,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,uBAAuB,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;AACzD,gBAAA,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAGxD;gBACD,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7C;AAEA,YAAA,MAAM,OAAO,GAAsB;gBACjC,EAAE,EAAE,IAAI,CAAC,EAAG;gBACZ,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI;gBACJ,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC,IAAI,CAAC,EAAG,CAAC;gBAC3C,IAAI;aACL;AAED,YAAA,IACE,IAAI,CAAC,IAAI,KAAKD,eAAS,CAAC,YAAY;AACpC,gBAAA,IAAI,CAAC,IAAI,KAAKA,eAAS,CAAC,yBAAyB,EACjD;AACA,gBAAA,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,EAAE;YAC3D;AAEA,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,IAAI,OAAO,CAC/B,CAAC,OAAO,EAAE,MAAM,KAAI;AAClB,YAAA,MAAM,OAAO,GAA8B;AACzC,gBAAA,SAAS,EAAE,QAAQ;AACnB,gBAAA,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,OAA6B;gBAC1D,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,YAAY,EAAE,MAAM,CAAC,YAER;gBACb,QAAQ,EAAE,MAAM,CAAC,QAA+C;gBAChE,OAAO;gBACP,MAAM;aACP;YAEDF,8BAAuB,CAACC,iBAAW,CAAC,eAAe,EAAE,OAAO,EAAE,MAAM,CAAC;AACvE,QAAA,CAAC,CACF;AAED,QAAA,IAAI,CAAC,2BAA2B,CAAC,OAAO,EAAE,QAAQ,CAAC;QAEnD,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,KAAI;AAC3C,YAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,UAAU,CAAC;AAChE,YAAA,MAAM,QAAQ,GAAG,OAAO,EAAE,IAAI,IAAI,SAAS;AAC3C,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE;YACjE,IAAI,CAAC,MAAM,EAAE;;gBAEX,OAAO,CAAC,IAAI,CACV,CAAA,wDAAA,EAA2D,MAAM,CAAC,UAAU,CAAA,OAAA,EAAU,QAAQ,CAAA,GAAA,CAAK;oBACjG,yEAAyE;oBACzE,CAAA,UAAA,EAAa,IAAI,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,CAAA,CAAE,CACjD;YACH;AAEA,YAAA,IAAI,WAAwB;AAC5B,YAAA,IAAI,aAAqB;AAEzB,YAAA,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE;gBAC7B,aAAa,GAAG,UAAU,MAAM,CAAC,YAAY,IAAI,eAAe,8BAA8B;gBAC9F,WAAW,GAAG,IAAIE,oBAAW,CAAC;AAC5B,oBAAA,MAAM,EAAE,OAAO;AACf,oBAAA,OAAO,EAAE,aAAa;AACtB,oBAAA,IAAI,EAAE,QAAQ;oBACd,YAAY,EAAE,MAAM,CAAC,UAAU;AAChC,iBAAA,CAAC;YACJ;iBAAO;gBACL,aAAa;AACX,oBAAA,OAAO,MAAM,CAAC,OAAO,KAAK;0BACtB,MAAM,CAAC;0BACP,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;gBACpC,WAAW,GAAG,IAAIA,oBAAW,CAAC;AAC5B,oBAAA,MAAM,EAAE,SAAS;AACjB,oBAAA,IAAI,EAAE,QAAQ;AACd,oBAAA,OAAO,EAAE,aAAa;oBACtB,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,YAAY,EAAE,MAAM,CAAC,UAAU;AAChC,iBAAA,CAAC;YACJ;AAEA,YAAA,MAAM,SAAS,GAAwB;AACrC,gBAAA,IAAI,EACF,OAAO,OAAO,EAAE,IAAI,KAAK;sBACrB,OAAO,CAAC;sBACR,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC;AACzC,gBAAA,IAAI,EAAE,QAAQ;gBACd,EAAE,EAAE,MAAM,CAAC,UAAU;AACrB,gBAAA,MAAM,EAAE,aAAa;AACrB,gBAAA,QAAQ,EAAE,CAAC;aACZ;AAED,YAAA,MAAM,oBAAoB,GAAG;AAC3B,gBAAA,MAAM,EAAE;AACN,oBAAA,EAAE,EAAE,MAAM;AACV,oBAAA,KAAK,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC;AACzB,oBAAA,IAAI,EAAE,WAAoB;oBAC1B,SAAS;AACV,iBAAA;aACF;YAEDH,8BAAuB,CACrBC,iBAAW,CAAC,qBAAqB,EACjC,oBAAoB,EACpB,MAAM,CACP;AAED,YAAA,OAAO,WAAW;AACpB,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,CAAC,GAAG,cAAc,EAAE,GAAG,aAAa,CAAC;IAC9C;AAEA;;;AAGG;AACK,IAAA,MAAM,eAAe,CAC3B,SAAqB,EACrB,MAAsB;;IAEtB,KAAU,EAAA;QAEV,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,MAAM,CAAC;QAChE,QAAQ,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE;IAChE;;AAGU,IAAA,MAAM,GAAG,CAAC,KAAU,EAAE,MAAsB,EAAA;AACpD,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;AAC1B,QAAA,IAAI,OAAkC;AAEtC,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;AAC3B,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC;YACvE,IAAI,IAAI,CAAC,eAAe,IAAI,YAAY,KAAK,IAAI,EAAE;AACjD,gBAAA,OAAO,IAAI,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC;YAClE;AACA,YAAA,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;AAC1D,YAAA,IAAI,CAAC,wBAAwB,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC;QACtE;aAAO;AACL,YAAA,IAAIO,UAAuB;AAC3B,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBACxBA,UAAQ,GAAG,KAAK;YAClB;AAAO,iBAAA,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE;AACtC,gBAAAA,UAAQ,GAAG,KAAK,CAAC,QAAQ;YAC3B;iBAAO;AACL,gBAAA,MAAM,IAAI,KAAK,CACb,8EAA8E,CAC/E;YACH;AAEA,YAAA,MAAM,cAAc,GAAgB,IAAI,GAAG,CACzCA;AACG,iBAAA,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,EAAE,KAAK,MAAM;iBACzC,GAAG,CAAC,CAAC,GAAG,KAAM,GAAmB,CAAC,YAAY,CAAC,CACnD;AAED,YAAA,IAAI,SAAgC;AACpC,YAAA,KAAK,IAAI,CAAC,GAAGA,UAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AAC7C,gBAAA,MAAM,OAAO,GAAGA,UAAQ,CAAC,CAAC,CAAC;AAC3B,gBAAA,IAAIC,oBAAW,CAAC,OAAO,CAAC,EAAE;oBACxB,SAAS,GAAG,OAAO;oBACnB;gBACF;YACF;YAEA,IAAI,SAAS,IAAI,IAAI,IAAI,CAACA,oBAAW,CAAC,SAAS,CAAC,EAAE;AAChD,gBAAA,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC;YAC/D;AAEA,YAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,gBAAA,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAC9C,SAAS,CAAC,UAAU,IAAI,EAAE,CAC3B;AACD,gBAAA,IAAI,CAAC,OAAO;oBACV,OAAO,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAC5D,gBAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;YACrC;YAEA,MAAM,aAAa,GACjB,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,IAAI,KAAI;AACpC;;;;;AAKG;AACH,gBAAA,QACE,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AAChD,oBAAA,EAAE,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC;YAEhD,CAAC,CAAC,IAAI,EAAE;YAEV,IAAI,IAAI,CAAC,eAAe,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;AACpD,gBAAA,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,EAAE;oBAC5D,OAAO,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC;gBAC3D;gBAEA,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KACzC,IAAI,CAAC,eAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAClC;gBACD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CACrC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,eAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAC1C;;gBAGD,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,IAAI,MAAM,OAAO,CAAC,GAAG,CAAC;oBACvD,WAAW,CAAC,MAAM,GAAG;0BACjB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACnE,0BAAE,EAAE;oBACN,UAAU,CAAC,MAAM,GAAG;0BAChB,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,MAAM;AAC5C,0BAAE,EAAE;AACP,iBAAA,CAAC,CAA+C;AAEjD,gBAAA,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;oBACtD,IAAI,CAAC,wBAAwB,CAAC,WAAW,EAAE,aAAa,EAAE,MAAM,CAAC;gBACnE;gBAEA,OAAO,GAAG,CAAC,GAAG,aAAa,EAAE,GAAG,YAAY,CAAC;YAC/C;iBAAO;gBACL,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CACzB,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CACxD;gBACD,IAAI,CAAC,wBAAwB,CAAC,aAAa,EAAE,OAAO,EAAE,MAAM,CAAC;YAC/D;QACF;QAEA,IAAI,CAAC,OAAO,CAAC,IAAI,CAACL,mBAAS,CAAC,EAAE;YAC5B,QAAQ,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE;QAChE;QAEA,MAAM,eAAe,GAIf,EAAE;QACR,IAAI,aAAa,GAAmB,IAAI;AAExC;;;AAGG;QACH,MAAM,eAAe,GAAc,EAAE;AAGrC,QAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC5B,YAAA,IAAIA,mBAAS,CAAC,MAAM,CAAC,EAAE;AACrB,gBAAA,IACE,MAAM,CAAC,KAAK,KAAKM,iBAAO,CAAC,MAAM;AAC/B,oBAAA,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;AAC1B,oBAAA,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,KAAmB,MAAM,CAAC,IAAI,CAAC,CAAC,EACvD;;oBAEA,IAAI,aAAa,EAAE;wBAChB,aAAa,CAAC,IAAe,CAAC,IAAI,CAAC,GAAI,MAAM,CAAC,IAAe,CAAC;oBACjE;yBAAO;wBACL,aAAa,GAAG,IAAIA,iBAAO,CAAC;4BAC1B,KAAK,EAAEA,iBAAO,CAAC,MAAM;4BACrB,IAAI,EAAE,MAAM,CAAC,IAAI;AAClB,yBAAA,CAAC;oBACJ;gBACF;qBAAO,IAAI,MAAM,CAAC,KAAK,KAAKA,iBAAO,CAAC,MAAM,EAAE;AAC1C;;;;AAIG;AACH,oBAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI;AACxB,oBAAA,MAAM,kBAAkB,GAAG,OAAO,IAAI,KAAK,QAAQ;AACnD,oBAAA,MAAM,iBAAiB,GACrB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;wBACnB,IAAI,CAAC,MAAM,KAAK,CAAC;AACjB,wBAAA,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ;AAE7B,oBAAA,IAAI,kBAAkB,IAAI,iBAAiB,EAAE;AAC3C,wBAAA,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;oBAC9B;yBAAO;;AAEL,wBAAA,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;oBAC9B;gBACF;qBAAO;;AAEL,oBAAA,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC9B;YACF;iBAAO;gBAEL,eAAe,CAAC,IAAI,CAClB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,CACzD;YACH;QACF;AAEA;;;AAGG;AACH,QAAA,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE;AAC9B;;;;;AAKG;;YAGH,MAAM,eAAe,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;AAClD,gBAAA,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI;AACrB,gBAAA,OAAO,OAAO,IAAI,KAAK,QAAQ,GAAG,IAAI,GAAI,IAAiB,CAAC,CAAC,CAAC;AAChE,YAAA,CAAC,CAAC;YAEF,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,KAAI;AAC7C,gBAAA,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC;;AAExC,gBAAA,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC;;AAGjE,gBAAA,MAAM,MAAM,GAAG,GAAG,CAAC,MAAkD;AACrE,gBAAA,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,EAAE;AAC7B,oBAAA,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE;AACjC,wBAAA,IAAI,GAAG,CAAC,OAAO,EAAE,KAAK,MAAM,EAAE;4BAC3B,GAAmB,CAAC,iBAAiB,CAAC,yBAAyB;AAC9D,gCAAA,QAAQ;wBACZ;oBACF;gBACF;gBAEA,OAAO,IAAIb,cAAI,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC;AAC1C,YAAA,CAAC,CAAC;AAEF,YAAA,MAAM,eAAe,GAAG,IAAIa,iBAAO,CAAC;gBAClC,KAAK,EAAEA,iBAAO,CAAC,MAAM;AACrB,gBAAA,IAAI,EAAE,KAAK;AACZ,aAAA,CAAC;AACF,YAAA,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC;QACvC;AAAO,aAAA,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE;;YAEvC,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC1C;QAEA,IAAI,aAAa,EAAE;AACjB,YAAA,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC;QACrC;AAEA,QAAA,OAAO,eAAoB;IAC7B;AAEQ,IAAA,WAAW,CAAC,KAAc,EAAA;AAChC,QAAA,QACE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAI,IAAI,IAAI,cAAc,IAAI,KAAK;IAEzE;AAEQ,IAAA,eAAe,CACrB,KAAc,EAAA;AAEd,QAAA,QACE,OAAO,KAAK,KAAK,QAAQ;AACzB,YAAA,KAAK,IAAI,IAAI;AACb,YAAA,UAAU,IAAI,KAAK;AACnB,YAAA,KAAK,CAAC,OAAO,CAAE,KAA+B,CAAC,QAAQ,CAAC;YACvD,KAAiC,CAAC,QAAQ,CAAC,KAAK,CAACL,sBAAa,CAAC;IAEpE;AACD;AAED,SAAS,mBAAmB,CAC1B,OAAkB,EAClB,cAA4B,EAAA;AAE5B,IAAA,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,IAAI,KAAK,CAAC;AAAE,QAAA,OAAO,KAAK;AAC9D,IAAA,QACE,OAAO,CAAC,UAAU,EAAE,KAAK,CACvB,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAAE,IAAI,IAAI,IAAI,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CACrE,IAAI,KAAK;AAEd;SAEgB,cAAc,CAC5B,KAAsD,EACtD,QAAW,EACX,cAA4B,EAAA;AAE5B,IAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,QAAQ;IAC9D,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAA0B;AAEtE,IAAA,IACE,OAAO;AACP,QAAA,YAAY,IAAI,OAAO;QACvB,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC;AACrC,QAAA,CAAC,mBAAmB,CAAC,OAAO,EAAE,cAAc,CAAC,EAC7C;AACA,QAAA,OAAO,QAAQ;IACjB;AACA,IAAA,OAAOM,aAAG;AACZ;;;;;"}
1
+ {"version":3,"file":"ToolNode.cjs","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 { ExecutionContext } from './approval/constants';\nimport { RunnableCallable } from '@/utils';\nimport { processToolOutput } from '@/utils/toonFormat';\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/**\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\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 }: 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 }\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 tools (handoff/transfer tools) bypass HITL approval —\n // these are internal routing mechanisms, not user-facing tool executions\n if (this.directToolNames?.has(toolName)) {\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 via event dispatch.\n * Dispatches an ON_TOOL_APPROVAL_REQUIRED event and waits for the host\n * to resolve the promise with an approval response.\n *\n * This uses the same pattern as ON_TOOL_EXECUTE: a promise-based event\n * dispatch where the host calls resolve/reject when the human responds.\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 return new Promise<t.ToolApprovalResponse>((resolve, reject) => {\n safeDispatchCustomEvent(\n GraphEvents.ON_TOOL_APPROVAL_REQUIRED,\n {\n ...approvalRequest,\n resolve,\n reject,\n },\n config\n );\n });\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 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 // 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 != 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 event-driven pattern: dispatches ON_TOOL_APPROVAL_REQUIRED event\n // and waits for the host to resolve/reject with a 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 // Step 4: Return ToolMessage with processed string content\n if (isBaseMessage(output) && output._getType() === 'tool') {\n const toolMsg = output as ToolMessage;\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 });\n } else {\n return new ToolMessage({\n status: 'success',\n name: tool.name,\n content: processed.content,\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 * 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 const parsedArgs = typeof args === 'object' ? { ...args } : {};\n const recoveredFields: string[] = [];\n\n // Extract field names from the raw JSON string\n const fieldPattern = /\"([^\"]+)\"\\s*:/g;\n let match;\n const rawFieldNames: string[] = [];\n while ((match = fieldPattern.exec(rawArgs)) !== null) {\n rawFieldNames.push(match[1]);\n }\n\n for (const fieldName of rawFieldNames) {\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 * 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 // ========================================================================\n // HITL: Check approval for event-dispatched tools (browser, MCP, etc.)\n // before dispatching. Denied tools return denial messages immediately.\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 denialMessages;\n }\n\n const requests: t.ToolCallRequest[] = approvedCalls.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 eventMessages = 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 contentString =\n typeof result.content === 'string'\n ? result.content\n : JSON.stringify(result.content);\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 return [...denialMessages, ...eventMessages];\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 !(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, eventOutputs] = (await Promise.all([\n directCalls.length > 0\n ? Promise.all(directCalls.map((call) => this.runTool(call, config)))\n : [],\n eventCalls.length > 0\n ? this.dispatchToolEvents(eventCalls, config)\n : [],\n ])) as [(BaseMessage | Command)[], ToolMessage[]];\n\n if (directCalls.length > 0 && directOutputs.length > 0) {\n this.handleRunToolCompletions(directCalls, directOutputs, 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":["Send","RunnableCallable","ExecutionContext","safeDispatchCustomEvent","GraphEvents","Constants","ToolMessage","isCommand","isBaseMessage","processToolOutput","isGraphInterrupt","messages","isAIMessage","Command","END"],"mappings":"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"}
@@ -16,11 +16,15 @@
16
16
  *
17
17
  * - `INTERACTIVE`: User is present in the chat session — approval prompts are shown.
18
18
  * - `SCHEDULED`: Automated/scheduled execution — all approvals are auto-granted.
19
+ * - `HANDOFF`: Agent is running as a handoff/delegate/workflow target — approvals
20
+ * are auto-granted so the autonomous multi-agent pipeline isn't blocked.
21
+ * The primary agent retains HITL; only handoff agents bypass it.
19
22
  */
20
23
  exports.ExecutionContext = void 0;
21
24
  (function (ExecutionContext) {
22
25
  ExecutionContext["INTERACTIVE"] = "interactive";
23
26
  ExecutionContext["SCHEDULED"] = "scheduled";
27
+ ExecutionContext["HANDOFF"] = "handoff";
24
28
  })(exports.ExecutionContext || (exports.ExecutionContext = {}));
25
29
  // ============================================================================
26
30
  // Approval Policy
@@ -1 +1 @@
1
- {"version":3,"file":"constants.cjs","sources":["../../../../src/tools/approval/constants.ts"],"sourcesContent":["/**\n * Shared HITL (Human-in-the-Loop) constants and enums.\n *\n * Single source of truth for approval-related values consumed by\n * the agents library, ranger backend, and browser extension.\n *\n * @module approval/constants\n */\n\n// ============================================================================\n// Execution Context\n// ============================================================================\n\n/**\n * Execution context determines whether HITL approval is required.\n *\n * - `INTERACTIVE`: User is present in the chat session — approval prompts are shown.\n * - `SCHEDULED`: Automated/scheduled execution — all approvals are auto-granted.\n */\nexport enum ExecutionContext {\n INTERACTIVE = 'interactive',\n SCHEDULED = 'scheduled',\n}\n\n// ============================================================================\n// Approval Policy\n// ============================================================================\n\n/**\n * Static approval policy values.\n *\n * - `ALWAYS`: Every tool call requires approval (strictest).\n * - `NEVER`: No tool call requires approval (used for auto-approved tools).\n */\nexport enum ApprovalPolicy {\n ALWAYS = 'always',\n NEVER = 'never',\n}\n\n// ============================================================================\n// Approval Tier\n// ============================================================================\n\n/**\n * Three-tier policy evaluation pipeline.\n * Higher tiers are checked first; once a tier matches, lower tiers are skipped.\n *\n * - `AUTO_APPROVE`: Built-in tools that always skip approval (Tier 1).\n * - `RULE_BASED`: Per-tool argument-aware rules (Tier 2).\n * - `KEYWORD_FALLBACK`: Token-based keyword matching on tool name (Tier 3).\n */\nexport enum ApprovalTier {\n AUTO_APPROVE = 'auto_approve',\n RULE_BASED = 'rule_based',\n KEYWORD_FALLBACK = 'keyword_fallback',\n}\n\n// ============================================================================\n// Risk Level\n// ============================================================================\n\n/**\n * Risk classification for tool calls.\n * Used for audit logging and future UI customization (e.g., showing risk badges).\n *\n * - `NONE`: Read-only, no side effects (search, list, get).\n * - `LOW`: Minor side effects (bookmark, star, mark as read).\n * - `MEDIUM`: User-specific mutations (send email to known contact).\n * - `HIGH`: Destructive or irreversible (delete, modify critical data).\n * - `CRITICAL`: Multi-system impact (transfer funds, delete account).\n */\nexport enum RiskLevel {\n NONE = 'none',\n LOW = 'low',\n MEDIUM = 'medium',\n HIGH = 'high',\n CRITICAL = 'critical',\n}\n\n// ============================================================================\n// Action Category\n// ============================================================================\n\n/**\n * Semantic category for tool actions.\n * Maps action keywords to high-level intent for risk classification.\n */\nexport enum ActionCategory {\n READ = 'read',\n WRITE = 'write',\n DELETE = 'delete',\n SEND = 'send',\n EXECUTE = 'execute',\n FINANCIAL = 'financial',\n ACCOUNT = 'account',\n}\n\n// ============================================================================\n// MCP Delimiter\n// ============================================================================\n\n/**\n * Delimiter used in MCP tool names to separate the tool name from the server key.\n *\n * Example: `send_email_mcp_outlook` → tool = `send_email`, server = `outlook`\n *\n * Must match `Constants.mcp_delimiter` in `@ranger/data-provider`.\n */\nexport const MCP_DELIMITER = '_mcp_';\n"],"names":["ExecutionContext","ApprovalPolicy","ApprovalTier","RiskLevel","ActionCategory"],"mappings":";;AAAA;;;;;;;AAOG;AAEH;AACA;AACA;AAEA;;;;;AAKG;AACSA;AAAZ,CAAA,UAAY,gBAAgB,EAAA;AAC1B,IAAA,gBAAA,CAAA,aAAA,CAAA,GAAA,aAA2B;AAC3B,IAAA,gBAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACzB,CAAC,EAHWA,wBAAgB,KAAhBA,wBAAgB,GAAA,EAAA,CAAA,CAAA;AAK5B;AACA;AACA;AAEA;;;;;AAKG;AACSC;AAAZ,CAAA,UAAY,cAAc,EAAA;AACxB,IAAA,cAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,cAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACjB,CAAC,EAHWA,sBAAc,KAAdA,sBAAc,GAAA,EAAA,CAAA,CAAA;AAK1B;AACA;AACA;AAEA;;;;;;;AAOG;AACSC;AAAZ,CAAA,UAAY,YAAY,EAAA;AACtB,IAAA,YAAA,CAAA,cAAA,CAAA,GAAA,cAA6B;AAC7B,IAAA,YAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AACzB,IAAA,YAAA,CAAA,kBAAA,CAAA,GAAA,kBAAqC;AACvC,CAAC,EAJWA,oBAAY,KAAZA,oBAAY,GAAA,EAAA,CAAA,CAAA;AAMxB;AACA;AACA;AAEA;;;;;;;;;AASG;AACSC;AAAZ,CAAA,UAAY,SAAS,EAAA;AACnB,IAAA,SAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,SAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACX,IAAA,SAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,SAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,SAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACvB,CAAC,EANWA,iBAAS,KAATA,iBAAS,GAAA,EAAA,CAAA,CAAA;AAQrB;AACA;AACA;AAEA;;;AAGG;AACSC;AAAZ,CAAA,UAAY,cAAc,EAAA;AACxB,IAAA,cAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,cAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACf,IAAA,cAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,cAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,cAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,cAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACvB,IAAA,cAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACrB,CAAC,EARWA,sBAAc,KAAdA,sBAAc,GAAA,EAAA,CAAA,CAAA;AAU1B;AACA;AACA;AAEA;;;;;;AAMG;AACI,MAAM,aAAa,GAAG;;;;"}
1
+ {"version":3,"file":"constants.cjs","sources":["../../../../src/tools/approval/constants.ts"],"sourcesContent":["/**\n * Shared HITL (Human-in-the-Loop) constants and enums.\n *\n * Single source of truth for approval-related values consumed by\n * the agents library, ranger backend, and browser extension.\n *\n * @module approval/constants\n */\n\n// ============================================================================\n// Execution Context\n// ============================================================================\n\n/**\n * Execution context determines whether HITL approval is required.\n *\n * - `INTERACTIVE`: User is present in the chat session — approval prompts are shown.\n * - `SCHEDULED`: Automated/scheduled execution — all approvals are auto-granted.\n * - `HANDOFF`: Agent is running as a handoff/delegate/workflow target — approvals\n * are auto-granted so the autonomous multi-agent pipeline isn't blocked.\n * The primary agent retains HITL; only handoff agents bypass it.\n */\nexport enum ExecutionContext {\n INTERACTIVE = 'interactive',\n SCHEDULED = 'scheduled',\n HANDOFF = 'handoff',\n}\n\n// ============================================================================\n// Approval Policy\n// ============================================================================\n\n/**\n * Static approval policy values.\n *\n * - `ALWAYS`: Every tool call requires approval (strictest).\n * - `NEVER`: No tool call requires approval (used for auto-approved tools).\n */\nexport enum ApprovalPolicy {\n ALWAYS = 'always',\n NEVER = 'never',\n}\n\n// ============================================================================\n// Approval Tier\n// ============================================================================\n\n/**\n * Three-tier policy evaluation pipeline.\n * Higher tiers are checked first; once a tier matches, lower tiers are skipped.\n *\n * - `AUTO_APPROVE`: Built-in tools that always skip approval (Tier 1).\n * - `RULE_BASED`: Per-tool argument-aware rules (Tier 2).\n * - `KEYWORD_FALLBACK`: Token-based keyword matching on tool name (Tier 3).\n */\nexport enum ApprovalTier {\n AUTO_APPROVE = 'auto_approve',\n RULE_BASED = 'rule_based',\n KEYWORD_FALLBACK = 'keyword_fallback',\n}\n\n// ============================================================================\n// Risk Level\n// ============================================================================\n\n/**\n * Risk classification for tool calls.\n * Used for audit logging and future UI customization (e.g., showing risk badges).\n *\n * - `NONE`: Read-only, no side effects (search, list, get).\n * - `LOW`: Minor side effects (bookmark, star, mark as read).\n * - `MEDIUM`: User-specific mutations (send email to known contact).\n * - `HIGH`: Destructive or irreversible (delete, modify critical data).\n * - `CRITICAL`: Multi-system impact (transfer funds, delete account).\n */\nexport enum RiskLevel {\n NONE = 'none',\n LOW = 'low',\n MEDIUM = 'medium',\n HIGH = 'high',\n CRITICAL = 'critical',\n}\n\n// ============================================================================\n// Action Category\n// ============================================================================\n\n/**\n * Semantic category for tool actions.\n * Maps action keywords to high-level intent for risk classification.\n */\nexport enum ActionCategory {\n READ = 'read',\n WRITE = 'write',\n DELETE = 'delete',\n SEND = 'send',\n EXECUTE = 'execute',\n FINANCIAL = 'financial',\n ACCOUNT = 'account',\n}\n\n// ============================================================================\n// MCP Delimiter\n// ============================================================================\n\n/**\n * Delimiter used in MCP tool names to separate the tool name from the server key.\n *\n * Example: `send_email_mcp_outlook` → tool = `send_email`, server = `outlook`\n *\n * Must match `Constants.mcp_delimiter` in `@ranger/data-provider`.\n */\nexport const MCP_DELIMITER = '_mcp_';\n"],"names":["ExecutionContext","ApprovalPolicy","ApprovalTier","RiskLevel","ActionCategory"],"mappings":";;AAAA;;;;;;;AAOG;AAEH;AACA;AACA;AAEA;;;;;;;;AAQG;AACSA;AAAZ,CAAA,UAAY,gBAAgB,EAAA;AAC1B,IAAA,gBAAA,CAAA,aAAA,CAAA,GAAA,aAA2B;AAC3B,IAAA,gBAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACvB,IAAA,gBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACrB,CAAC,EAJWA,wBAAgB,KAAhBA,wBAAgB,GAAA,EAAA,CAAA,CAAA;AAM5B;AACA;AACA;AAEA;;;;;AAKG;AACSC;AAAZ,CAAA,UAAY,cAAc,EAAA;AACxB,IAAA,cAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,cAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACjB,CAAC,EAHWA,sBAAc,KAAdA,sBAAc,GAAA,EAAA,CAAA,CAAA;AAK1B;AACA;AACA;AAEA;;;;;;;AAOG;AACSC;AAAZ,CAAA,UAAY,YAAY,EAAA;AACtB,IAAA,YAAA,CAAA,cAAA,CAAA,GAAA,cAA6B;AAC7B,IAAA,YAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AACzB,IAAA,YAAA,CAAA,kBAAA,CAAA,GAAA,kBAAqC;AACvC,CAAC,EAJWA,oBAAY,KAAZA,oBAAY,GAAA,EAAA,CAAA,CAAA;AAMxB;AACA;AACA;AAEA;;;;;;;;;AASG;AACSC;AAAZ,CAAA,UAAY,SAAS,EAAA;AACnB,IAAA,SAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,SAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACX,IAAA,SAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,SAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,SAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACvB,CAAC,EANWA,iBAAS,KAATA,iBAAS,GAAA,EAAA,CAAA,CAAA;AAQrB;AACA;AACA;AAEA;;;AAGG;AACSC;AAAZ,CAAA,UAAY,cAAc,EAAA;AACxB,IAAA,cAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,cAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACf,IAAA,cAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,cAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,cAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,cAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACvB,IAAA,cAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACrB,CAAC,EARWA,sBAAc,KAAdA,sBAAc,GAAA,EAAA,CAAA,CAAA;AAU1B;AACA;AACA;AAEA;;;;;;AAMG;AACI,MAAM,aAAa,GAAG;;;;"}
@@ -133,9 +133,20 @@ class ToolNode extends RunnableCallable {
133
133
  if (!this.toolApprovalConfig) {
134
134
  return false;
135
135
  }
136
- const { defaultPolicy, overrides, executionContext } = this.toolApprovalConfig;
137
- // Scheduled executions bypass all approval checks
138
- if (executionContext === ExecutionContext.SCHEDULED) {
136
+ const { defaultPolicy, overrides, executionContext, agentExecutionContextOverrides, } = this.toolApprovalConfig;
137
+ // Resolve the effective execution context for this agent.
138
+ // Per-agent overrides take precedence — allows handoff agents to bypass HITL
139
+ // while the primary agent retains interactive approval.
140
+ const effectiveContext = (this.agentId && agentExecutionContextOverrides?.[this.agentId]) ?? executionContext;
141
+ // Scheduled executions bypass all approval checks — no user is present
142
+ if (effectiveContext === ExecutionContext.SCHEDULED) {
143
+ return false;
144
+ }
145
+ // Handoff/delegate/workflow agents bypass HITL approval — these agents run
146
+ // autonomously as part of a multi-agent pipeline. Blocking on user approval
147
+ // would stall the entire graph since all agents share the same SSE stream.
148
+ // The primary (user-facing) agent retains HITL; only delegated agents skip it.
149
+ if (effectiveContext === ExecutionContext.HANDOFF) {
139
150
  return false;
140
151
  }
141
152
  // Graph-managed tools (handoff/transfer tools) bypass HITL approval —
@@ -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 { ExecutionContext } from './approval/constants';\nimport { RunnableCallable } from '@/utils';\nimport { processToolOutput } from '@/utils/toonFormat';\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/**\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\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 }: 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 }\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 { defaultPolicy, overrides, executionContext } =\n this.toolApprovalConfig;\n\n // Scheduled executions bypass all approval checks\n if (executionContext === ExecutionContext.SCHEDULED) {\n return false;\n }\n\n // Graph-managed tools (handoff/transfer tools) bypass HITL approval —\n // these are internal routing mechanisms, not user-facing tool executions\n if (this.directToolNames?.has(toolName)) {\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 via event dispatch.\n * Dispatches an ON_TOOL_APPROVAL_REQUIRED event and waits for the host\n * to resolve the promise with an approval response.\n *\n * This uses the same pattern as ON_TOOL_EXECUTE: a promise-based event\n * dispatch where the host calls resolve/reject when the human responds.\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 return new Promise<t.ToolApprovalResponse>((resolve, reject) => {\n safeDispatchCustomEvent(\n GraphEvents.ON_TOOL_APPROVAL_REQUIRED,\n {\n ...approvalRequest,\n resolve,\n reject,\n },\n config\n );\n });\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 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 // 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 != 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 event-driven pattern: dispatches ON_TOOL_APPROVAL_REQUIRED event\n // and waits for the host to resolve/reject with a 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 // Step 4: Return ToolMessage with processed string content\n if (isBaseMessage(output) && output._getType() === 'tool') {\n const toolMsg = output as ToolMessage;\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 });\n } else {\n return new ToolMessage({\n status: 'success',\n name: tool.name,\n content: processed.content,\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 * 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 const parsedArgs = typeof args === 'object' ? { ...args } : {};\n const recoveredFields: string[] = [];\n\n // Extract field names from the raw JSON string\n const fieldPattern = /\"([^\"]+)\"\\s*:/g;\n let match;\n const rawFieldNames: string[] = [];\n while ((match = fieldPattern.exec(rawArgs)) !== null) {\n rawFieldNames.push(match[1]);\n }\n\n for (const fieldName of rawFieldNames) {\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 * 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 // ========================================================================\n // HITL: Check approval for event-dispatched tools (browser, MCP, etc.)\n // before dispatching. Denied tools return denial messages immediately.\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 denialMessages;\n }\n\n const requests: t.ToolCallRequest[] = approvedCalls.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 eventMessages = 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 contentString =\n typeof result.content === 'string'\n ? result.content\n : JSON.stringify(result.content);\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 return [...denialMessages, ...eventMessages];\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 !(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, eventOutputs] = (await Promise.all([\n directCalls.length > 0\n ? Promise.all(directCalls.map((call) => this.runTool(call, config)))\n : [],\n eventCalls.length > 0\n ? this.dispatchToolEvents(eventCalls, config)\n : [],\n ])) as [(BaseMessage | Command)[], ToolMessage[]];\n\n if (directCalls.length > 0 && directOutputs.length > 0) {\n this.handleRunToolCompletions(directCalls, directOutputs, 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 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 { ExecutionContext } from './approval/constants';\nimport { RunnableCallable } from '@/utils';\nimport { processToolOutput } from '@/utils/toonFormat';\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/**\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\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 }: 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 }\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 tools (handoff/transfer tools) bypass HITL approval —\n // these are internal routing mechanisms, not user-facing tool executions\n if (this.directToolNames?.has(toolName)) {\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 via event dispatch.\n * Dispatches an ON_TOOL_APPROVAL_REQUIRED event and waits for the host\n * to resolve the promise with an approval response.\n *\n * This uses the same pattern as ON_TOOL_EXECUTE: a promise-based event\n * dispatch where the host calls resolve/reject when the human responds.\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 return new Promise<t.ToolApprovalResponse>((resolve, reject) => {\n safeDispatchCustomEvent(\n GraphEvents.ON_TOOL_APPROVAL_REQUIRED,\n {\n ...approvalRequest,\n resolve,\n reject,\n },\n config\n );\n });\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 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 // 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 != 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 event-driven pattern: dispatches ON_TOOL_APPROVAL_REQUIRED event\n // and waits for the host to resolve/reject with a 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 // Step 4: Return ToolMessage with processed string content\n if (isBaseMessage(output) && output._getType() === 'tool') {\n const toolMsg = output as ToolMessage;\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 });\n } else {\n return new ToolMessage({\n status: 'success',\n name: tool.name,\n content: processed.content,\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 * 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 const parsedArgs = typeof args === 'object' ? { ...args } : {};\n const recoveredFields: string[] = [];\n\n // Extract field names from the raw JSON string\n const fieldPattern = /\"([^\"]+)\"\\s*:/g;\n let match;\n const rawFieldNames: string[] = [];\n while ((match = fieldPattern.exec(rawArgs)) !== null) {\n rawFieldNames.push(match[1]);\n }\n\n for (const fieldName of rawFieldNames) {\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 * 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 // ========================================================================\n // HITL: Check approval for event-dispatched tools (browser, MCP, etc.)\n // before dispatching. Denied tools return denial messages immediately.\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 denialMessages;\n }\n\n const requests: t.ToolCallRequest[] = approvedCalls.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 eventMessages = 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 contentString =\n typeof result.content === 'string'\n ? result.content\n : JSON.stringify(result.content);\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 return [...denialMessages, ...eventMessages];\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 !(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, eventOutputs] = (await Promise.all([\n directCalls.length > 0\n ? Promise.all(directCalls.map((call) => this.runTool(call, config)))\n : [],\n eventCalls.length > 0\n ? this.dispatchToolEvents(eventCalls, config)\n : [],\n ])) as [(BaseMessage | Command)[], ToolMessage[]];\n\n if (directCalls.length > 0 && directOutputs.length > 0) {\n this.handleRunToolCompletions(directCalls, directOutputs, 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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"}
@@ -14,11 +14,15 @@
14
14
  *
15
15
  * - `INTERACTIVE`: User is present in the chat session — approval prompts are shown.
16
16
  * - `SCHEDULED`: Automated/scheduled execution — all approvals are auto-granted.
17
+ * - `HANDOFF`: Agent is running as a handoff/delegate/workflow target — approvals
18
+ * are auto-granted so the autonomous multi-agent pipeline isn't blocked.
19
+ * The primary agent retains HITL; only handoff agents bypass it.
17
20
  */
18
21
  var ExecutionContext;
19
22
  (function (ExecutionContext) {
20
23
  ExecutionContext["INTERACTIVE"] = "interactive";
21
24
  ExecutionContext["SCHEDULED"] = "scheduled";
25
+ ExecutionContext["HANDOFF"] = "handoff";
22
26
  })(ExecutionContext || (ExecutionContext = {}));
23
27
  // ============================================================================
24
28
  // Approval Policy
@@ -1 +1 @@
1
- {"version":3,"file":"constants.mjs","sources":["../../../../src/tools/approval/constants.ts"],"sourcesContent":["/**\n * Shared HITL (Human-in-the-Loop) constants and enums.\n *\n * Single source of truth for approval-related values consumed by\n * the agents library, ranger backend, and browser extension.\n *\n * @module approval/constants\n */\n\n// ============================================================================\n// Execution Context\n// ============================================================================\n\n/**\n * Execution context determines whether HITL approval is required.\n *\n * - `INTERACTIVE`: User is present in the chat session — approval prompts are shown.\n * - `SCHEDULED`: Automated/scheduled execution — all approvals are auto-granted.\n */\nexport enum ExecutionContext {\n INTERACTIVE = 'interactive',\n SCHEDULED = 'scheduled',\n}\n\n// ============================================================================\n// Approval Policy\n// ============================================================================\n\n/**\n * Static approval policy values.\n *\n * - `ALWAYS`: Every tool call requires approval (strictest).\n * - `NEVER`: No tool call requires approval (used for auto-approved tools).\n */\nexport enum ApprovalPolicy {\n ALWAYS = 'always',\n NEVER = 'never',\n}\n\n// ============================================================================\n// Approval Tier\n// ============================================================================\n\n/**\n * Three-tier policy evaluation pipeline.\n * Higher tiers are checked first; once a tier matches, lower tiers are skipped.\n *\n * - `AUTO_APPROVE`: Built-in tools that always skip approval (Tier 1).\n * - `RULE_BASED`: Per-tool argument-aware rules (Tier 2).\n * - `KEYWORD_FALLBACK`: Token-based keyword matching on tool name (Tier 3).\n */\nexport enum ApprovalTier {\n AUTO_APPROVE = 'auto_approve',\n RULE_BASED = 'rule_based',\n KEYWORD_FALLBACK = 'keyword_fallback',\n}\n\n// ============================================================================\n// Risk Level\n// ============================================================================\n\n/**\n * Risk classification for tool calls.\n * Used for audit logging and future UI customization (e.g., showing risk badges).\n *\n * - `NONE`: Read-only, no side effects (search, list, get).\n * - `LOW`: Minor side effects (bookmark, star, mark as read).\n * - `MEDIUM`: User-specific mutations (send email to known contact).\n * - `HIGH`: Destructive or irreversible (delete, modify critical data).\n * - `CRITICAL`: Multi-system impact (transfer funds, delete account).\n */\nexport enum RiskLevel {\n NONE = 'none',\n LOW = 'low',\n MEDIUM = 'medium',\n HIGH = 'high',\n CRITICAL = 'critical',\n}\n\n// ============================================================================\n// Action Category\n// ============================================================================\n\n/**\n * Semantic category for tool actions.\n * Maps action keywords to high-level intent for risk classification.\n */\nexport enum ActionCategory {\n READ = 'read',\n WRITE = 'write',\n DELETE = 'delete',\n SEND = 'send',\n EXECUTE = 'execute',\n FINANCIAL = 'financial',\n ACCOUNT = 'account',\n}\n\n// ============================================================================\n// MCP Delimiter\n// ============================================================================\n\n/**\n * Delimiter used in MCP tool names to separate the tool name from the server key.\n *\n * Example: `send_email_mcp_outlook` → tool = `send_email`, server = `outlook`\n *\n * Must match `Constants.mcp_delimiter` in `@ranger/data-provider`.\n */\nexport const MCP_DELIMITER = '_mcp_';\n"],"names":[],"mappings":"AAAA;;;;;;;AAOG;AAEH;AACA;AACA;AAEA;;;;;AAKG;IACS;AAAZ,CAAA,UAAY,gBAAgB,EAAA;AAC1B,IAAA,gBAAA,CAAA,aAAA,CAAA,GAAA,aAA2B;AAC3B,IAAA,gBAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACzB,CAAC,EAHW,gBAAgB,KAAhB,gBAAgB,GAAA,EAAA,CAAA,CAAA;AAK5B;AACA;AACA;AAEA;;;;;AAKG;IACS;AAAZ,CAAA,UAAY,cAAc,EAAA;AACxB,IAAA,cAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,cAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACjB,CAAC,EAHW,cAAc,KAAd,cAAc,GAAA,EAAA,CAAA,CAAA;AAK1B;AACA;AACA;AAEA;;;;;;;AAOG;IACS;AAAZ,CAAA,UAAY,YAAY,EAAA;AACtB,IAAA,YAAA,CAAA,cAAA,CAAA,GAAA,cAA6B;AAC7B,IAAA,YAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AACzB,IAAA,YAAA,CAAA,kBAAA,CAAA,GAAA,kBAAqC;AACvC,CAAC,EAJW,YAAY,KAAZ,YAAY,GAAA,EAAA,CAAA,CAAA;AAMxB;AACA;AACA;AAEA;;;;;;;;;AASG;IACS;AAAZ,CAAA,UAAY,SAAS,EAAA;AACnB,IAAA,SAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,SAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACX,IAAA,SAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,SAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,SAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACvB,CAAC,EANW,SAAS,KAAT,SAAS,GAAA,EAAA,CAAA,CAAA;AAQrB;AACA;AACA;AAEA;;;AAGG;IACS;AAAZ,CAAA,UAAY,cAAc,EAAA;AACxB,IAAA,cAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,cAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACf,IAAA,cAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,cAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,cAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,cAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACvB,IAAA,cAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACrB,CAAC,EARW,cAAc,KAAd,cAAc,GAAA,EAAA,CAAA,CAAA;AAU1B;AACA;AACA;AAEA;;;;;;AAMG;AACI,MAAM,aAAa,GAAG;;;;"}
1
+ {"version":3,"file":"constants.mjs","sources":["../../../../src/tools/approval/constants.ts"],"sourcesContent":["/**\n * Shared HITL (Human-in-the-Loop) constants and enums.\n *\n * Single source of truth for approval-related values consumed by\n * the agents library, ranger backend, and browser extension.\n *\n * @module approval/constants\n */\n\n// ============================================================================\n// Execution Context\n// ============================================================================\n\n/**\n * Execution context determines whether HITL approval is required.\n *\n * - `INTERACTIVE`: User is present in the chat session — approval prompts are shown.\n * - `SCHEDULED`: Automated/scheduled execution — all approvals are auto-granted.\n * - `HANDOFF`: Agent is running as a handoff/delegate/workflow target — approvals\n * are auto-granted so the autonomous multi-agent pipeline isn't blocked.\n * The primary agent retains HITL; only handoff agents bypass it.\n */\nexport enum ExecutionContext {\n INTERACTIVE = 'interactive',\n SCHEDULED = 'scheduled',\n HANDOFF = 'handoff',\n}\n\n// ============================================================================\n// Approval Policy\n// ============================================================================\n\n/**\n * Static approval policy values.\n *\n * - `ALWAYS`: Every tool call requires approval (strictest).\n * - `NEVER`: No tool call requires approval (used for auto-approved tools).\n */\nexport enum ApprovalPolicy {\n ALWAYS = 'always',\n NEVER = 'never',\n}\n\n// ============================================================================\n// Approval Tier\n// ============================================================================\n\n/**\n * Three-tier policy evaluation pipeline.\n * Higher tiers are checked first; once a tier matches, lower tiers are skipped.\n *\n * - `AUTO_APPROVE`: Built-in tools that always skip approval (Tier 1).\n * - `RULE_BASED`: Per-tool argument-aware rules (Tier 2).\n * - `KEYWORD_FALLBACK`: Token-based keyword matching on tool name (Tier 3).\n */\nexport enum ApprovalTier {\n AUTO_APPROVE = 'auto_approve',\n RULE_BASED = 'rule_based',\n KEYWORD_FALLBACK = 'keyword_fallback',\n}\n\n// ============================================================================\n// Risk Level\n// ============================================================================\n\n/**\n * Risk classification for tool calls.\n * Used for audit logging and future UI customization (e.g., showing risk badges).\n *\n * - `NONE`: Read-only, no side effects (search, list, get).\n * - `LOW`: Minor side effects (bookmark, star, mark as read).\n * - `MEDIUM`: User-specific mutations (send email to known contact).\n * - `HIGH`: Destructive or irreversible (delete, modify critical data).\n * - `CRITICAL`: Multi-system impact (transfer funds, delete account).\n */\nexport enum RiskLevel {\n NONE = 'none',\n LOW = 'low',\n MEDIUM = 'medium',\n HIGH = 'high',\n CRITICAL = 'critical',\n}\n\n// ============================================================================\n// Action Category\n// ============================================================================\n\n/**\n * Semantic category for tool actions.\n * Maps action keywords to high-level intent for risk classification.\n */\nexport enum ActionCategory {\n READ = 'read',\n WRITE = 'write',\n DELETE = 'delete',\n SEND = 'send',\n EXECUTE = 'execute',\n FINANCIAL = 'financial',\n ACCOUNT = 'account',\n}\n\n// ============================================================================\n// MCP Delimiter\n// ============================================================================\n\n/**\n * Delimiter used in MCP tool names to separate the tool name from the server key.\n *\n * Example: `send_email_mcp_outlook` → tool = `send_email`, server = `outlook`\n *\n * Must match `Constants.mcp_delimiter` in `@ranger/data-provider`.\n */\nexport const MCP_DELIMITER = '_mcp_';\n"],"names":[],"mappings":"AAAA;;;;;;;AAOG;AAEH;AACA;AACA;AAEA;;;;;;;;AAQG;IACS;AAAZ,CAAA,UAAY,gBAAgB,EAAA;AAC1B,IAAA,gBAAA,CAAA,aAAA,CAAA,GAAA,aAA2B;AAC3B,IAAA,gBAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACvB,IAAA,gBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACrB,CAAC,EAJW,gBAAgB,KAAhB,gBAAgB,GAAA,EAAA,CAAA,CAAA;AAM5B;AACA;AACA;AAEA;;;;;AAKG;IACS;AAAZ,CAAA,UAAY,cAAc,EAAA;AACxB,IAAA,cAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,cAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACjB,CAAC,EAHW,cAAc,KAAd,cAAc,GAAA,EAAA,CAAA,CAAA;AAK1B;AACA;AACA;AAEA;;;;;;;AAOG;IACS;AAAZ,CAAA,UAAY,YAAY,EAAA;AACtB,IAAA,YAAA,CAAA,cAAA,CAAA,GAAA,cAA6B;AAC7B,IAAA,YAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AACzB,IAAA,YAAA,CAAA,kBAAA,CAAA,GAAA,kBAAqC;AACvC,CAAC,EAJW,YAAY,KAAZ,YAAY,GAAA,EAAA,CAAA,CAAA;AAMxB;AACA;AACA;AAEA;;;;;;;;;AASG;IACS;AAAZ,CAAA,UAAY,SAAS,EAAA;AACnB,IAAA,SAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,SAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACX,IAAA,SAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,SAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,SAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACvB,CAAC,EANW,SAAS,KAAT,SAAS,GAAA,EAAA,CAAA,CAAA;AAQrB;AACA;AACA;AAEA;;;AAGG;IACS;AAAZ,CAAA,UAAY,cAAc,EAAA;AACxB,IAAA,cAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,cAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACf,IAAA,cAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,cAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,cAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,cAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACvB,IAAA,cAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACrB,CAAC,EARW,cAAc,KAAd,cAAc,GAAA,EAAA,CAAA,CAAA;AAU1B;AACA;AACA;AAEA;;;;;;AAMG;AACI,MAAM,aAAa,GAAG;;;;"}
@@ -11,10 +11,14 @@
11
11
  *
12
12
  * - `INTERACTIVE`: User is present in the chat session — approval prompts are shown.
13
13
  * - `SCHEDULED`: Automated/scheduled execution — all approvals are auto-granted.
14
+ * - `HANDOFF`: Agent is running as a handoff/delegate/workflow target — approvals
15
+ * are auto-granted so the autonomous multi-agent pipeline isn't blocked.
16
+ * The primary agent retains HITL; only handoff agents bypass it.
14
17
  */
15
18
  export declare enum ExecutionContext {
16
19
  INTERACTIVE = "interactive",
17
- SCHEDULED = "scheduled"
20
+ SCHEDULED = "scheduled",
21
+ HANDOFF = "handoff"
18
22
  }
19
23
  /**
20
24
  * Static approval policy values.
@@ -216,9 +216,29 @@ export type ToolApprovalConfig = {
216
216
  overrides?: ToolApprovalOverrides;
217
217
  /**
218
218
  * Execution context. When 'scheduled', all approvals are auto-granted.
219
+ * When 'handoff', approvals are auto-granted for autonomous multi-agent pipelines.
219
220
  * @default 'interactive'
220
221
  */
221
222
  executionContext?: `${ExecutionContext}`;
223
+ /**
224
+ * Per-agent execution context overrides. Keys are agent IDs.
225
+ * Used to give handoff/delegate agents a different execution context than the
226
+ * primary agent. For example, the primary agent stays 'interactive' (HITL enabled)
227
+ * while all handoff agents are set to 'handoff' (HITL bypassed).
228
+ *
229
+ * When a ToolNode's agentId is found in this map, the override takes precedence
230
+ * over the top-level `executionContext`.
231
+ *
232
+ * @example
233
+ * {
234
+ * executionContext: 'interactive', // primary agent: HITL on
235
+ * agentExecutionContextOverrides: {
236
+ * 'research-agent': 'handoff', // handoff agent: HITL off
237
+ * 'data-agent': 'handoff', // handoff agent: HITL off
238
+ * },
239
+ * }
240
+ */
241
+ agentExecutionContextOverrides?: Record<string, `${ExecutionContext}`>;
222
242
  };
223
243
  /**
224
244
  * The interrupt payload sent to the host when a tool requires approval.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@illuma-ai/agents",
3
- "version": "1.1.17",
3
+ "version": "1.1.18",
4
4
  "main": "./dist/cjs/main.cjs",
5
5
  "module": "./dist/esm/main.mjs",
6
6
  "types": "./dist/types/index.d.ts",
@@ -177,11 +177,30 @@ export class ToolNode<T = any> extends RunnableCallable<T, T> {
177
177
  return false;
178
178
  }
179
179
 
180
- const { defaultPolicy, overrides, executionContext } =
181
- this.toolApprovalConfig;
180
+ const {
181
+ defaultPolicy,
182
+ overrides,
183
+ executionContext,
184
+ agentExecutionContextOverrides,
185
+ } = this.toolApprovalConfig;
186
+
187
+ // Resolve the effective execution context for this agent.
188
+ // Per-agent overrides take precedence — allows handoff agents to bypass HITL
189
+ // while the primary agent retains interactive approval.
190
+ const effectiveContext = (
191
+ this.agentId && agentExecutionContextOverrides?.[this.agentId]
192
+ ) ?? executionContext;
193
+
194
+ // Scheduled executions bypass all approval checks — no user is present
195
+ if (effectiveContext === ExecutionContext.SCHEDULED) {
196
+ return false;
197
+ }
182
198
 
183
- // Scheduled executions bypass all approval checks
184
- if (executionContext === ExecutionContext.SCHEDULED) {
199
+ // Handoff/delegate/workflow agents bypass HITL approval — these agents run
200
+ // autonomously as part of a multi-agent pipeline. Blocking on user approval
201
+ // would stall the entire graph since all agents share the same SSE stream.
202
+ // The primary (user-facing) agent retains HITL; only delegated agents skip it.
203
+ if (effectiveContext === ExecutionContext.HANDOFF) {
185
204
  return false;
186
205
  }
187
206
 
@@ -16,10 +16,14 @@
16
16
  *
17
17
  * - `INTERACTIVE`: User is present in the chat session — approval prompts are shown.
18
18
  * - `SCHEDULED`: Automated/scheduled execution — all approvals are auto-granted.
19
+ * - `HANDOFF`: Agent is running as a handoff/delegate/workflow target — approvals
20
+ * are auto-granted so the autonomous multi-agent pipeline isn't blocked.
21
+ * The primary agent retains HITL; only handoff agents bypass it.
19
22
  */
20
23
  export enum ExecutionContext {
21
24
  INTERACTIVE = 'interactive',
22
25
  SCHEDULED = 'scheduled',
26
+ HANDOFF = 'handoff',
23
27
  }
24
28
 
25
29
  // ============================================================================
@@ -258,9 +258,29 @@ export type ToolApprovalConfig = {
258
258
  overrides?: ToolApprovalOverrides;
259
259
  /**
260
260
  * Execution context. When 'scheduled', all approvals are auto-granted.
261
+ * When 'handoff', approvals are auto-granted for autonomous multi-agent pipelines.
261
262
  * @default 'interactive'
262
263
  */
263
264
  executionContext?: `${ExecutionContext}`;
265
+ /**
266
+ * Per-agent execution context overrides. Keys are agent IDs.
267
+ * Used to give handoff/delegate agents a different execution context than the
268
+ * primary agent. For example, the primary agent stays 'interactive' (HITL enabled)
269
+ * while all handoff agents are set to 'handoff' (HITL bypassed).
270
+ *
271
+ * When a ToolNode's agentId is found in this map, the override takes precedence
272
+ * over the top-level `executionContext`.
273
+ *
274
+ * @example
275
+ * {
276
+ * executionContext: 'interactive', // primary agent: HITL on
277
+ * agentExecutionContextOverrides: {
278
+ * 'research-agent': 'handoff', // handoff agent: HITL off
279
+ * 'data-agent': 'handoff', // handoff agent: HITL off
280
+ * },
281
+ * }
282
+ */
283
+ agentExecutionContextOverrides?: Record<string, `${ExecutionContext}`>;
264
284
  };
265
285
 
266
286
  /**