@hashgraphonline/conversational-agent 0.2.0 → 0.2.101
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/cjs/conversational-agent.d.ts +11 -1
- package/dist/cjs/index.cjs +1 -1
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/services/attachment-processor.d.ts +41 -0
- package/dist/cjs/services/index.d.ts +2 -0
- package/dist/cjs/services/parameter-service.d.ts +43 -0
- package/dist/cjs/tools/entity-resolver-tool.d.ts +5 -3
- package/dist/esm/index.js +9 -5
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index10.js +2 -2
- package/dist/esm/index21.js +1 -1
- package/dist/esm/index23.js +3 -3
- package/dist/esm/index24.js +20 -4
- package/dist/esm/index24.js.map +1 -1
- package/dist/esm/index29.js +248 -903
- package/dist/esm/index29.js.map +1 -1
- package/dist/esm/index30.js +98 -219
- package/dist/esm/index30.js.map +1 -1
- package/dist/esm/index31.js +834 -1085
- package/dist/esm/index31.js.map +1 -1
- package/dist/esm/index32.js +228 -115
- package/dist/esm/index32.js.map +1 -1
- package/dist/esm/index33.js +1185 -79
- package/dist/esm/index33.js.map +1 -1
- package/dist/esm/index34.js +119 -39
- package/dist/esm/index34.js.map +1 -1
- package/dist/esm/index35.js +103 -96
- package/dist/esm/index35.js.map +1 -1
- package/dist/esm/index36.js +46 -21
- package/dist/esm/index36.js.map +1 -1
- package/dist/esm/index37.js +104 -24
- package/dist/esm/index37.js.map +1 -1
- package/dist/esm/index38.js +21 -12
- package/dist/esm/index38.js.map +1 -1
- package/dist/esm/index39.js +4 -6
- package/dist/esm/index39.js.map +1 -1
- package/dist/esm/index40.js +11 -4
- package/dist/esm/index40.js.map +1 -1
- package/dist/esm/index41.js +1 -1
- package/dist/esm/index43.js +24 -89
- package/dist/esm/index43.js.map +1 -1
- package/dist/esm/index44.js +10 -0
- package/dist/esm/index44.js.map +1 -0
- package/dist/esm/index45.js +95 -0
- package/dist/esm/index45.js.map +1 -0
- package/dist/esm/index5.js +2 -2
- package/dist/esm/index6.js +76 -6
- package/dist/esm/index6.js.map +1 -1
- package/dist/esm/index8.js +1 -1
- package/dist/types/conversational-agent.d.ts +11 -1
- package/dist/types/services/attachment-processor.d.ts +41 -0
- package/dist/types/services/index.d.ts +2 -0
- package/dist/types/services/parameter-service.d.ts +43 -0
- package/dist/types/tools/entity-resolver-tool.d.ts +5 -3
- package/package.json +3 -2
- package/src/conversational-agent.ts +97 -5
- package/src/langchain/langchain-agent.ts +9 -1
- package/src/services/attachment-processor.ts +163 -0
- package/src/services/content-store-manager.ts +32 -4
- package/src/services/index.ts +2 -0
- package/src/services/parameter-service.ts +430 -0
- package/src/tools/entity-resolver-tool.ts +12 -18
package/dist/esm/index31.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index31.js","sources":["../../src/langchain/langchain-agent.ts"],"sourcesContent":["import type { BaseChatModel } from '@langchain/core/language_models/chat_models';\nimport type { StructuredTool } from '@langchain/core/tools';\nimport { createOpenAIToolsAgent } from 'langchain/agents';\nimport {\n FormAwareAgentExecutor,\n type ParameterPreprocessingCallback,\n} from './form-aware-agent-executor';\nimport {\n ChatPromptTemplate,\n MessagesPlaceholder,\n} from '@langchain/core/prompts';\nimport { ChatOpenAI } from '@langchain/openai';\nimport {\n calculateTokenCostSync,\n getAllHederaCorePlugins,\n HederaAgentKit,\n TokenUsageCallbackHandler,\n} from 'hedera-agent-kit';\nimport type { TokenUsage, CostCalculation } from 'hedera-agent-kit';\nimport {\n BaseAgent,\n type ConversationContext,\n type ChatResponse,\n type OperationalMode,\n type UsageStats,\n} from '../base-agent';\nimport { MCPClientManager } from '../mcp/mcp-client-manager';\nimport { convertMCPToolToLangChain } from '../mcp/adapters/langchain';\nimport { SmartMemoryManager } from '../memory/smart-memory-manager';\nimport type { MCPConnectionStatus, MCPServerConfig } from '../mcp/types';\nimport { ResponseFormatter } from '../utils/response-formatter';\nimport type { FormSubmission } from '../forms/types';\nimport type { ToolRegistrationOptions } from '../core/tool-registry';\nimport { ERROR_MESSAGES } from '../constants';\nimport {\n HumanMessage,\n AIMessage,\n SystemMessage,\n BaseMessage as _BaseMessage,\n} from '@langchain/core/messages';\nimport { ToolRegistry } from '../core/tool-registry';\nimport {\n ExecutionPipeline,\n SessionContext,\n} from '../execution/execution-pipeline';\nimport { FormEngine } from '../forms/form-engine';\nimport type { ChainValues } from '@langchain/core/utils/types';\n\ninterface RenderConfigSchema {\n _renderConfig?: Record<string, unknown>;\n}\n\ninterface ToolExecutionData {\n type: string;\n formId?: string;\n parameters?: Record<string, unknown>;\n toolName?: string;\n}\n\ninterface ToolWithOriginal {\n originalTool?: {\n call?: (args: Record<string, unknown>) => Promise<string>;\n };\n}\n\ninterface ExecutorWithRestore {\n restorePendingForms?: (p: Map<string, unknown>) => void;\n}\n\ninterface ResultWithToolName {\n toolName?: string;\n}\n\ninterface IntermediateStep {\n action?: {\n tool?: string;\n toolInput?: Record<string, unknown>;\n };\n observation?: unknown;\n}\n\ninterface HashLinkBlock {\n blockId: string;\n hashLink: string;\n template: string;\n attributes: Record<string, unknown>;\n}\n\ninterface MetadataWithHashLink {\n hashLinkBlock?: HashLinkBlock;\n memoryStats?: {\n activeMessages: number;\n tokenUsage: number;\n maxTokens: number;\n usagePercentage: number;\n };\n [key: string]: unknown;\n}\n\nfunction _isMetadataWithHashLink(\n metadata: unknown\n): metadata is MetadataWithHashLink {\n if (!metadata || typeof metadata !== 'object') {\n return false;\n }\n const meta = metadata as Record<string, unknown>;\n return 'hashLinkBlock' in meta || 'memoryStats' in meta;\n}\n\nfunction hasHashLinkBlock(\n metadata: unknown\n): metadata is { hashLinkBlock: HashLinkBlock } {\n if (!metadata || typeof metadata !== 'object') {\n return false;\n }\n const meta = metadata as Record<string, unknown>;\n if (\n !('hashLinkBlock' in meta) ||\n !meta.hashLinkBlock ||\n typeof meta.hashLinkBlock !== 'object'\n ) {\n return false;\n }\n const block = meta.hashLinkBlock as Record<string, unknown>;\n return (\n 'blockId' in block &&\n 'hashLink' in block &&\n 'template' in block &&\n 'attributes' in block &&\n typeof block.blockId === 'string' &&\n typeof block.hashLink === 'string' &&\n typeof block.template === 'string' &&\n typeof block.attributes === 'object'\n );\n}\n\nexport class LangChainAgent extends BaseAgent {\n private executor: FormAwareAgentExecutor | undefined;\n private systemMessage = '';\n private mcpManager?: MCPClientManager;\n private smartMemory: SmartMemoryManager | undefined;\n private mcpConnectionStatus: Map<string, MCPConnectionStatus> = new Map();\n private toolRegistry!: ToolRegistry;\n private executionPipeline!: ExecutionPipeline;\n private formEngine!: FormEngine;\n private addToolRawToMemory(name: string, payload: string): void {\n try {\n const content = `[tool-raw:${name}] ${payload}`;\n this.smartMemory!.addMessage(new SystemMessage(content));\n } catch {}\n }\n private persistToolRaw(toolName: string, output: unknown): void {\n try {\n let payload = '';\n if (typeof output === 'string') {\n payload = this.isJSON(output) ? output : JSON.stringify({ output });\n } else if (output !== undefined) {\n try {\n payload = JSON.stringify(output);\n } catch {\n payload = String(output);\n }\n } else {\n payload = JSON.stringify({ observation: null });\n }\n this.addToolRawToMemory(toolName, payload);\n } catch {}\n }\n private persistIntermediateSteps(\n steps: IntermediateStep[] | undefined\n ): void {\n if (!steps || !Array.isArray(steps)) {\n return;\n }\n try {\n for (const step of steps) {\n const name = step?.action?.tool || 'unknown';\n const obs = step?.observation;\n this.persistToolRaw(name, obs);\n }\n } catch {}\n }\n private pendingParameterPreprocessingCallback:\n | ParameterPreprocessingCallback\n | undefined;\n\n /**\n * Get inscription tool by capability instead of hardcoded name\n */\n private getInscriptionTool(): StructuredTool | null {\n const criticalTools = this.toolRegistry.getToolsByCapability(\n 'priority',\n 'critical'\n );\n\n for (const entry of criticalTools) {\n const tool = entry.tool;\n const name = tool.name.toLowerCase();\n const desc = tool.description?.toLowerCase() || '';\n\n if (\n name.includes('inscribe') ||\n name.includes('hashinal') ||\n desc.includes('inscribe') ||\n desc.includes('hashinal')\n ) {\n return tool;\n }\n }\n\n const allTools = this.toolRegistry.getAllRegistryEntries();\n for (const entry of allTools) {\n const tool = entry.tool;\n const name = tool.name.toLowerCase();\n const desc = tool.description?.toLowerCase() || '';\n\n if (\n name.includes('inscribe') ||\n name.includes('hashinal') ||\n desc.includes('inscribe') ||\n desc.includes('hashinal')\n ) {\n return tool;\n }\n }\n\n return null;\n }\n\n /**\n * Execute a tool directly with parameters, optionally using ExecutionPipeline\n */\n private async executeToolDirect(\n toolName: string,\n parameters: Record<string, unknown>,\n useExecutionPipeline = false\n ): Promise<string> {\n if (useExecutionPipeline && this.executionPipeline && this.smartMemory) {\n const sessionContext: SessionContext = {\n sessionId: `session-${Date.now()}`,\n timestamp: Date.now(),\n };\n\n const result = await this.executionPipeline.execute(\n toolName,\n parameters,\n sessionContext\n );\n\n if (!result.success) {\n throw new Error(result.error || 'Pipeline execution failed');\n }\n\n return result.output;\n }\n\n const entry = this.toolRegistry.getTool(toolName);\n if (!entry) {\n throw new Error(`Tool not found: ${toolName}`);\n }\n\n let processedParameters = { ...parameters };\n\n if (this.pendingParameterPreprocessingCallback) {\n this.logger.info(\n 'Applying parameter preprocessing in executeToolDirect',\n {\n toolName,\n hasCallback: true,\n parameterKeys: Object.keys(parameters),\n }\n );\n\n try {\n processedParameters = await this.pendingParameterPreprocessingCallback(\n toolName,\n parameters\n );\n\n if (\n JSON.stringify(processedParameters) !== JSON.stringify(parameters)\n ) {\n this.logger.info('Parameters preprocessed successfully', {\n toolName,\n originalKeys: Object.keys(parameters),\n processedKeys: Object.keys(processedParameters),\n changes: Object.keys(processedParameters).filter(\n (key) => processedParameters[key] !== parameters[key]\n ),\n });\n }\n } catch (error) {\n this.logger.warn(\n 'Parameter preprocessing failed, using original parameters',\n {\n toolName,\n error: error instanceof Error ? error.message : 'Unknown error',\n }\n );\n processedParameters = parameters;\n }\n }\n\n const mergedArgs = { ...processedParameters, renderForm: false };\n\n if (entry.wrapper) {\n const maybeWrapper = entry.tool as ToolWithOriginal;\n if (maybeWrapper.originalTool?.call) {\n return await maybeWrapper.originalTool.call(mergedArgs);\n }\n }\n\n return await entry.tool.call(mergedArgs);\n }\n\n /**\n * Create a standard ChatResponse from tool output\n */\n private createToolResponse(toolOutput: string): ChatResponse {\n return {\n output: toolOutput,\n message: toolOutput,\n notes: [],\n };\n }\n\n /**\n * Handle TOOL_EXECUTION format messages\n */\n private async handleToolExecution(\n message: string,\n context?: ConversationContext\n ): Promise<ChatResponse | null> {\n let isToolExecution = false;\n let toolExecutionData: ToolExecutionData | null = null;\n\n try {\n if (message.includes('TOOL_EXECUTION')) {\n const parsed = JSON.parse(message);\n if (parsed.type === 'TOOL_EXECUTION') {\n isToolExecution = true;\n toolExecutionData = parsed;\n }\n }\n } catch {}\n\n if (!isToolExecution || !toolExecutionData?.formId) {\n return null;\n }\n\n try {\n const params = (toolExecutionData.parameters || {}) as Record<\n string,\n unknown\n >;\n const toolName = toolExecutionData.toolName;\n\n if (toolName) {\n const toolOutput = await this.executeToolDirect(toolName, params);\n try {\n const payload = this.isJSON(toolOutput)\n ? toolOutput\n : JSON.stringify({ output: toolOutput });\n this.addToolRawToMemory(toolName, payload);\n } catch {}\n return this.createToolResponse(toolOutput);\n }\n } catch {}\n\n const formSubmission: FormSubmission = {\n formId: toolExecutionData.formId,\n toolName: toolExecutionData.toolName || '',\n parameters: toolExecutionData.parameters || {},\n timestamp: Date.now(),\n };\n\n if (\n this.executor &&\n 'processFormSubmission' in this.executor &&\n typeof this.executor.processFormSubmission === 'function'\n ) {\n return this.processFormSubmission(formSubmission, context);\n }\n\n return null;\n }\n\n /**\n * Handle direct tool execution commands\n */\n private async handleDirectToolExecution(\n message: string\n ): Promise<ChatResponse | null> {\n if (\n typeof message !== 'string' ||\n !message.includes('Please execute the following tool:')\n ) {\n return null;\n }\n\n try {\n const toolLineMatch = message.match(/Tool:\\s*(.+)/);\n const argsLineIndex = message.indexOf('Arguments:');\n\n if (toolLineMatch && argsLineIndex !== -1) {\n const toolName = toolLineMatch[1].trim();\n const argsText = message\n .slice(argsLineIndex + 'Arguments:'.length)\n .trim();\n\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(argsText);\n } catch {}\n\n const toolOutput = await this.executeToolDirect(toolName, args);\n try {\n const payload = this.isJSON(toolOutput)\n ? toolOutput\n : JSON.stringify({ output: toolOutput });\n this.addToolRawToMemory(toolName, payload);\n } catch {}\n return this.createToolResponse(toolOutput);\n }\n } catch {}\n\n return null;\n }\n\n /**\n * Handle JSON format tool calls and form submissions\n */\n private async handleJsonToolCalls(\n message: string,\n context?: ConversationContext\n ): Promise<ChatResponse | null> {\n if (typeof message !== 'string') {\n return null;\n }\n\n try {\n const trimmed = message.trim();\n if (\n !(trimmed.startsWith('{') && trimmed.endsWith('}')) &&\n !(trimmed.startsWith('[') && trimmed.endsWith(']'))\n ) {\n return null;\n }\n\n const obj = JSON.parse(trimmed) as Record<string, unknown>;\n const formId = obj['formId'] as string | undefined;\n const toolName = (obj['toolName'] as string) || '';\n const parameters = (obj['parameters'] as Record<string, unknown>) || {};\n\n if (\n formId &&\n this.executor &&\n 'processFormSubmission' in this.executor &&\n typeof this.executor.processFormSubmission === 'function'\n ) {\n return this.processFormSubmission(\n { formId, toolName, parameters, timestamp: Date.now() },\n context\n );\n }\n\n if (toolName) {\n const toolOutput = await this.executeToolDirect(toolName, parameters);\n try {\n const payload = this.isJSON(toolOutput)\n ? toolOutput\n : JSON.stringify({ output: toolOutput });\n this.addToolRawToMemory(toolName, payload);\n } catch {}\n return this.createToolResponse(toolOutput);\n }\n } catch {}\n\n return null;\n }\n\n /**\n * Handle content-ref messages for inscription tools\n */\n private async handleContentRefMessages(\n message: string\n ): Promise<ChatResponse | null> {\n if (typeof message !== 'string' || !message.includes('content-ref:')) {\n return null;\n }\n\n try {\n const tool = this.getInscriptionTool();\n if (!tool) {\n return null;\n }\n\n const idMatch =\n message.match(/content-ref:([A-Za-z0-9_\\-]+)/i) ||\n message.match(/content-ref:([^\\s)]+)/i);\n const contentRef =\n idMatch && idMatch[1]\n ? `content-ref:${idMatch[1]}`\n : message.match(/content-ref:[^\\s)]+/i)?.[0] || undefined;\n\n const args = contentRef\n ? ({ contentRef, renderForm: true, withHashLinkBlocks: true } as Record<\n string,\n unknown\n >)\n : ({ renderForm: true, withHashLinkBlocks: true } as Record<\n string,\n unknown\n >);\n\n const toolOutput = await tool.call(args);\n let parsed: Record<string, unknown> | undefined;\n\n try {\n parsed =\n typeof toolOutput === 'string'\n ? (JSON.parse(toolOutput) as Record<string, unknown>)\n : (toolOutput as Record<string, unknown>);\n } catch {}\n\n if (parsed && parsed['requiresForm'] && parsed['formMessage']) {\n const pending = new Map<\n string,\n {\n toolName: string;\n originalInput: Record<string, unknown>;\n originalToolInput?: Record<string, unknown>;\n schema: unknown;\n }\n >();\n\n const originalInput = {\n input: message,\n chat_history: this.smartMemory!.getMessages(),\n } as Record<string, unknown>;\n\n const formMessage = parsed['formMessage'] as { id: string };\n pending.set(formMessage.id, {\n toolName: tool.name,\n originalInput,\n originalToolInput: args,\n schema: null,\n });\n\n const maybeRestore = this.executor as ExecutorWithRestore;\n\n if (typeof maybeRestore.restorePendingForms === 'function') {\n maybeRestore.restorePendingForms!(pending);\n }\n\n const outputMsg =\n (parsed['message'] as string) ||\n 'Please complete the form to continue.';\n\n return {\n output: outputMsg,\n message: outputMsg,\n notes: [],\n requiresForm: true,\n formMessage: formMessage as ChatResponse['formMessage'],\n } as ChatResponse;\n }\n } catch {}\n\n return null;\n }\n\n /**\n * Process executor result and format response\n */\n private async processExecutorResult(\n result: ChainValues\n ): Promise<ChatResponse> {\n let outputStr = '';\n if (typeof result.output === 'string') {\n outputStr = result.output;\n } else if (result.output) {\n try {\n outputStr = JSON.stringify(result.output);\n } catch {\n outputStr = String(result.output);\n }\n }\n\n let response: ChatResponse = {\n output: outputStr,\n message: outputStr,\n notes: [],\n intermediateSteps: result.intermediateSteps,\n };\n\n if (result.requiresForm && result.formMessage) {\n response.formMessage = result.formMessage;\n response.requiresForm = true;\n }\n\n if (result.intermediateSteps && Array.isArray(result.intermediateSteps)) {\n const toolCalls = result.intermediateSteps.map(\n (step: IntermediateStep, index: number) => ({\n id: `call_${index}`,\n name: step.action?.tool || 'unknown',\n args: step.action?.toolInput || {},\n output:\n typeof step.observation === 'string'\n ? step.observation\n : JSON.stringify(step.observation),\n })\n );\n\n if (toolCalls.length > 0) {\n response.tool_calls = toolCalls;\n }\n\n this.persistIntermediateSteps(\n result.intermediateSteps as IntermediateStep[]\n );\n }\n\n const parsedSteps = result?.intermediateSteps?.[0]?.observation;\n if (\n parsedSteps &&\n typeof parsedSteps === 'string' &&\n this.isJSON(parsedSteps)\n ) {\n try {\n const parsed = JSON.parse(parsedSteps);\n\n if (ResponseFormatter.isInscriptionResponse(parsed)) {\n const formattedMessage =\n ResponseFormatter.formatInscriptionResponse(parsed);\n response.output = formattedMessage;\n response.message = formattedMessage;\n\n if (parsed.inscription) {\n response.inscription = parsed.inscription;\n }\n if (parsed.metadata) {\n response.metadata = {\n ...response.metadata,\n ...parsed.metadata,\n };\n }\n } else {\n response = { ...response, ...parsed };\n }\n\n const blockMetadata = this.processHashLinkBlocks(parsed);\n if (blockMetadata.hashLinkBlock) {\n response.metadata = {\n ...response.metadata,\n ...blockMetadata,\n };\n }\n } catch (error) {\n this.logger.error('Error parsing intermediate steps:', error);\n }\n }\n\n if (!response.output || response.output.trim() === '') {\n response.output = 'Agent action complete.';\n }\n\n if (response.output) {\n this.smartMemory!.addMessage(new AIMessage(response.output));\n }\n\n if (this.tokenTracker) {\n const tokenUsage = this.tokenTracker.getLatestTokenUsage();\n if (tokenUsage) {\n response.tokenUsage = tokenUsage;\n response.cost = calculateTokenCostSync(tokenUsage);\n }\n }\n\n const finalMemoryStats = this.smartMemory!.getMemoryStats();\n response.metadata = {\n ...response.metadata,\n memoryStats: {\n activeMessages: finalMemoryStats.totalActiveMessages,\n tokenUsage: finalMemoryStats.currentTokenCount,\n maxTokens: finalMemoryStats.maxTokens,\n usagePercentage: finalMemoryStats.usagePercentage,\n },\n };\n\n this.logger.info('LangChainAgent.chat returning response:', response);\n return response;\n }\n\n /**\n * Normalize context messages into LangChain message instances and load into memory\n */\n /**\n * Loads context messages into memory, merging with existing messages\n */\n private loadContextMessages(context?: ConversationContext): void {\n if (\n !this.smartMemory ||\n !context?.messages ||\n context.messages.length === 0\n ) {\n return;\n }\n\n const existingMessages = this.smartMemory.getMessages();\n const existingContent = new Set(\n existingMessages.map((m) => `${m.constructor.name}:${m.content}`)\n );\n\n for (const msg of context.messages as unknown[]) {\n let messageClass:\n | typeof HumanMessage\n | typeof AIMessage\n | typeof SystemMessage;\n let content: string;\n\n if (\n msg instanceof HumanMessage ||\n msg instanceof AIMessage ||\n msg instanceof SystemMessage\n ) {\n messageClass = msg.constructor as\n | typeof HumanMessage\n | typeof AIMessage\n | typeof SystemMessage;\n content = msg.content as string;\n } else if (\n msg &&\n typeof msg === 'object' &&\n 'content' in msg &&\n 'type' in msg\n ) {\n content = String((msg as { content: unknown }).content);\n const type = String((msg as { type: unknown }).type);\n\n if (type === 'human') messageClass = HumanMessage;\n else if (type === 'ai') messageClass = AIMessage;\n else if (type === 'system') messageClass = SystemMessage;\n else continue;\n } else {\n continue;\n }\n\n const key = `${messageClass.name}:${content}`;\n if (!existingContent.has(key)) {\n this.smartMemory.addMessage(new messageClass(content));\n existingContent.add(key);\n }\n }\n }\n\n async boot(): Promise<void> {\n this.logger.info('🚨🚨🚨 LANGCHAIN AGENT BOOT METHOD CALLED 🚨🚨🚨');\n\n if (this.initialized) {\n this.logger.warn('Agent already initialized');\n return;\n }\n\n try {\n this.agentKit = await this.createAgentKit();\n await this.agentKit.initialize();\n\n const modelName =\n this.config.ai?.modelName ||\n process.env.OPENAI_MODEL_NAME ||\n 'gpt-4o-mini';\n this.tokenTracker = new TokenUsageCallbackHandler(modelName);\n\n this.toolRegistry = new ToolRegistry(this.logger);\n\n const allTools = this.agentKit.getAggregatedLangChainTools();\n this.logger.info('=== TOOL REGISTRATION START ===');\n this.logger.info(\n 'All tools from agentKit:',\n allTools.map((t) => t.name)\n );\n\n const filteredTools = this.filterTools(allTools);\n this.logger.info(\n 'Filtered tools for registration:',\n filteredTools.map((t) => t.name)\n );\n\n for (const tool of filteredTools) {\n this.logger.info(`🔧 Registering tool: ${tool.name}`);\n\n const options: ToolRegistrationOptions = {};\n\n const name = tool.name.toLowerCase();\n const desc = tool.description?.toLowerCase() || '';\n\n if (tool.name === 'hedera-hts-mint-nft') {\n const originalCall = tool.call.bind(tool);\n tool.call = async (args: Record<string, unknown>) => {\n if (args.metaOptions && typeof args.metaOptions === 'object') {\n const metaOptions = args.metaOptions as Record<string, unknown>;\n if (metaOptions.transactionMemo) {\n console.warn(\n '🚨 WORKAROUND: Stripping transactionMemo from hedera-hts-mint-nft to avoid bug',\n { originalMemo: metaOptions.transactionMemo }\n );\n delete metaOptions.transactionMemo;\n }\n }\n return originalCall(args);\n };\n }\n\n if (\n name.includes('inscribe') ||\n name.includes('hashinal') ||\n desc.includes('inscribe') ||\n desc.includes('hashinal')\n ) {\n options.forceWrapper = true;\n options.metadata = {\n category: 'core' as const,\n version: '1.0.0',\n dependencies: [],\n };\n\n this.logger.info(`🎯 CRITICAL TOOL DEBUG - ${tool.name} schema:`, {\n hasSchema: !!tool.schema,\n schemaType: tool.schema?.constructor?.name,\n hasRenderConfig: !!(tool.schema as RenderConfigSchema)\n ?._renderConfig,\n renderConfig: (tool.schema as RenderConfigSchema)?._renderConfig,\n });\n }\n\n this.toolRegistry.registerTool(tool, options);\n }\n\n this.tools = this.toolRegistry.getAllTools();\n\n this.logger.info(`🚀 TOOLS REGISTERED: ${this.tools.length} tools`);\n\n const stats = this.toolRegistry.getStatistics();\n this.logger.info('📊 Tool Registry Statistics:', {\n total: stats.totalTools,\n wrapped: stats.wrappedTools,\n unwrapped: stats.unwrappedTools,\n categories: stats.categoryCounts,\n priorities: stats.priorityCounts,\n });\n\n const inscriptionTool = this.getInscriptionTool();\n if (inscriptionTool) {\n const entry = this.toolRegistry.getTool(inscriptionTool.name);\n if (entry) {\n this.logger.info(\n `✅ Inscription tool registered: ${inscriptionTool.name}`\n );\n }\n }\n\n const toolNames = this.toolRegistry.getToolNames();\n const uniqueNames = new Set(toolNames);\n if (toolNames.length !== uniqueNames.size) {\n this.logger.error('DUPLICATE TOOL NAMES DETECTED in registry!');\n const duplicates = toolNames.filter(\n (name, index) => toolNames.indexOf(name) !== index\n );\n throw new Error(\n `Duplicate tool names detected: ${duplicates.join(', ')}`\n );\n }\n\n if (this.config.mcp?.servers && this.config.mcp.servers.length > 0) {\n if (this.config.mcp.autoConnect !== false) {\n await this.initializeMCP();\n } else {\n this.logger.info(\n 'MCP servers configured but autoConnect=false, skipping synchronous connection'\n );\n this.mcpManager = new MCPClientManager(this.logger);\n }\n }\n\n this.smartMemory = new SmartMemoryManager({\n modelName,\n maxTokens: 90000,\n reserveTokens: 10000,\n storageLimit: 1000,\n });\n\n this.logger.info('SmartMemoryManager initialized:', {\n modelName,\n toolsCount: this.tools.length,\n maxTokens: 90000,\n reserveTokens: 10000,\n });\n\n this.formEngine = new FormEngine(this.logger);\n\n this.executionPipeline = new ExecutionPipeline(\n this.toolRegistry,\n this.formEngine,\n this.smartMemory,\n this.logger\n );\n\n this.systemMessage = this.buildSystemPrompt();\n\n this.smartMemory.setSystemPrompt(this.systemMessage);\n\n await this.createExecutor();\n\n this.initialized = true;\n this.logger.info('LangChain Hedera agent initialized with ToolRegistry');\n } catch (error) {\n this.logger.error('Failed to initialize agent:', error);\n throw error;\n }\n }\n\n async chat(\n message: string,\n context?: ConversationContext\n ): Promise<ChatResponse> {\n if (!this.initialized || !this.executor || !this.smartMemory) {\n throw new Error('Agent not initialized. Call boot() first.');\n }\n\n try {\n const toolExecutionResult = await this.handleToolExecution(\n message,\n context\n );\n if (toolExecutionResult) {\n return toolExecutionResult;\n }\n\n const directToolResult = await this.handleDirectToolExecution(message);\n if (directToolResult) {\n return directToolResult;\n }\n\n const jsonToolResult = await this.handleJsonToolCalls(message, context);\n if (jsonToolResult) {\n return jsonToolResult;\n }\n\n const contentRefResult = await this.handleContentRefMessages(message);\n if (contentRefResult) {\n return contentRefResult;\n }\n\n this.logger.info('LangChainAgent.chat called with:', {\n message,\n contextLength: context?.messages?.length || 0,\n });\n\n this.loadContextMessages(context);\n this.smartMemory.addMessage(new HumanMessage(message));\n\n const memoryStats = this.smartMemory.getMemoryStats();\n this.logger.info('Memory stats before execution:', {\n totalMessages: memoryStats.totalActiveMessages,\n currentTokens: memoryStats.currentTokenCount,\n maxTokens: memoryStats.maxTokens,\n usagePercentage: memoryStats.usagePercentage,\n toolsCount: this.tools.length,\n });\n\n const currentMessages = this.smartMemory.getMessages();\n this.logger.info('Current messages in memory:', {\n count: currentMessages.length,\n });\n try {\n const instr = currentMessages\n .map((m) => String((m as { content: unknown }).content || ''))\n .filter(\n (c) =>\n typeof c === 'string' &&\n (c.includes('[instruction:') || c.includes('[tool-next-steps:'))\n );\n if (instr.length > 0) {\n this.logger.info('Instruction/next-steps messages in memory:', {\n messages: instr,\n });\n }\n } catch {}\n\n const result = await this.executor.invoke({\n input: message,\n chat_history: currentMessages,\n });\n\n this.logger.info('LangChainAgent executor result:', result);\n\n return this.processExecutorResult(result);\n } catch (error) {\n this.logger.error('LangChainAgent.chat error:', error);\n return this.handleError(error);\n }\n }\n\n async shutdown(): Promise<void> {\n if (this.mcpManager) {\n await this.mcpManager.disconnectAll();\n }\n\n if (this.smartMemory) {\n this.smartMemory.dispose();\n this.smartMemory = undefined;\n }\n\n if (this.toolRegistry) {\n this.toolRegistry.clear();\n }\n\n this.executor = undefined;\n this.agentKit = undefined;\n this.tools = [];\n this.initialized = false;\n this.logger.info('Agent cleaned up');\n }\n\n switchMode(mode: OperationalMode): void {\n if (this.config.execution) {\n this.config.execution.operationalMode = mode;\n } else {\n this.config.execution = { operationalMode: mode };\n }\n\n if (this.agentKit) {\n this.agentKit.operationalMode = mode;\n }\n\n this.systemMessage = this.buildSystemPrompt();\n this.logger.info(`Operational mode switched to: ${mode}`);\n }\n\n getUsageStats(): UsageStats {\n if (!this.tokenTracker) {\n return {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n cost: { totalCost: 0 } as CostCalculation,\n };\n }\n\n const usage = this.tokenTracker.getTotalTokenUsage();\n const cost = calculateTokenCostSync(usage);\n return { ...usage, cost };\n }\n\n getUsageLog(): UsageStats[] {\n if (!this.tokenTracker) {\n return [];\n }\n\n return this.tokenTracker.getTokenUsageHistory().map((usage) => ({\n ...usage,\n cost: calculateTokenCostSync(usage),\n }));\n }\n\n clearUsageStats(): void {\n if (this.tokenTracker) {\n this.tokenTracker.reset();\n this.logger.info('Usage statistics cleared');\n }\n }\n\n getMCPConnectionStatus(): Map<string, MCPConnectionStatus> {\n return new Map(this.mcpConnectionStatus);\n }\n\n /**\n * Processes form submission and continues with tool execution\n */\n async processFormSubmission(\n submission: FormSubmission,\n context?: ConversationContext\n ): Promise<ChatResponse> {\n if (!this.initialized || !this.executor || !this.smartMemory) {\n throw new Error('Agent not initialized. Call boot() first.');\n }\n\n try {\n if (!submission.parameters || typeof submission.parameters !== 'object') {\n this.logger.error('Invalid form submission parameters:', {\n parameters: submission.parameters,\n type: typeof submission.parameters,\n });\n const errorInfo = JSON.stringify(submission, null, 2);\n return this.handleError(\n new Error(`Invalid form submission parameters: ${errorInfo}`)\n );\n }\n\n this.loadContextMessages(context);\n\n const safeSubmission = {\n ...submission,\n parameters: submission.parameters || {},\n };\n\n const result = await this.executor.processFormSubmission(safeSubmission);\n\n const preservedMetadata = result?.metadata ? { ...result.metadata } : {};\n\n try {\n const maybeRaw = (\n result as unknown as {\n rawToolOutput?: string;\n toolName?: string;\n }\n ).rawToolOutput;\n const toolName = (result as ResultWithToolName).toolName || 'unknown';\n if (typeof maybeRaw === 'string' && maybeRaw.trim().length > 0) {\n const payload = this.isJSON(maybeRaw)\n ? maybeRaw\n : JSON.stringify({ output: maybeRaw });\n this.addToolRawToMemory(toolName, payload);\n }\n } catch {}\n\n let outputMessage = 'Form processed successfully.';\n if (typeof result.output === 'string') {\n outputMessage = result.output;\n } else if (result.output) {\n try {\n outputMessage = JSON.stringify(result.output);\n } catch {\n outputMessage = String(result.output);\n }\n }\n\n let response: ChatResponse = {\n output: outputMessage,\n message: outputMessage,\n notes: [],\n intermediateSteps: result.intermediateSteps as IntermediateStep[],\n };\n\n if (result.metadata) {\n response.metadata = {\n ...response.metadata,\n ...result.metadata,\n };\n this.logger.info('🔍 DEBUG: Metadata after merge from result:', {\n hasMetadata: !!response.metadata,\n metadataKeys: response.metadata ? Object.keys(response.metadata) : [],\n hasHashLinkBlock: hasHashLinkBlock(response.metadata),\n hashLinkBlockContent: hasHashLinkBlock(response.metadata)\n ? response.metadata.hashLinkBlock\n : undefined,\n });\n }\n\n if (result.requiresForm && result.formMessage) {\n response.formMessage = result.formMessage;\n response.requiresForm = true;\n }\n\n if (result.intermediateSteps && Array.isArray(result.intermediateSteps)) {\n const toolCalls = result.intermediateSteps.map(\n (step: IntermediateStep, index: number) => {\n const name = step?.action?.tool || 'unknown';\n const args = step?.action?.toolInput || {};\n const obs = step?.observation;\n let output = '';\n if (typeof obs === 'string') {\n output = obs;\n } else if (obs && typeof obs === 'object') {\n try {\n output = JSON.stringify(obs);\n } catch {\n output = String(obs);\n }\n } else if (obs !== undefined) {\n output = String(obs);\n }\n return { id: `call_${index}`, name, args, output };\n }\n );\n if (toolCalls.length > 0) {\n response.tool_calls = toolCalls;\n }\n this.persistIntermediateSteps(\n result.intermediateSteps as IntermediateStep[]\n );\n }\n\n const parsedSteps = result?.intermediateSteps?.[0]?.observation;\n if (\n parsedSteps &&\n typeof parsedSteps === 'string' &&\n this.isJSON(parsedSteps)\n ) {\n try {\n const parsed = JSON.parse(parsedSteps);\n response = { ...response, ...parsed };\n\n const blockMetadata = this.processHashLinkBlocks(parsed);\n if (blockMetadata.hashLinkBlock) {\n response.metadata = {\n ...response.metadata,\n ...blockMetadata,\n };\n }\n } catch (error) {\n this.logger.error('Error parsing intermediate steps:', error);\n }\n }\n\n if (response.output) {\n this.smartMemory.addMessage(new AIMessage(response.output));\n }\n\n if (this.tokenTracker) {\n const tokenUsage = this.tokenTracker.getLatestTokenUsage();\n if (tokenUsage) {\n response.tokenUsage = tokenUsage;\n response.cost = calculateTokenCostSync(tokenUsage);\n }\n }\n\n const finalMemoryStats = this.smartMemory.getMemoryStats();\n this.logger.info('🔍 DEBUG: Metadata before memoryStats merge:', {\n hasMetadata: !!response.metadata,\n metadataKeys: response.metadata ? Object.keys(response.metadata) : [],\n hasHashLinkBlock: hasHashLinkBlock(response.metadata),\n });\n\n response.metadata = {\n ...preservedMetadata,\n ...response.metadata,\n memoryStats: {\n activeMessages: finalMemoryStats.totalActiveMessages,\n tokenUsage: finalMemoryStats.currentTokenCount,\n maxTokens: finalMemoryStats.maxTokens,\n usagePercentage: finalMemoryStats.usagePercentage,\n },\n };\n\n this.logger.info('🔍 DEBUG: Final response metadata before return:', {\n hasMetadata: !!response.metadata,\n metadataKeys: response.metadata ? Object.keys(response.metadata) : [],\n hasHashLinkBlock: hasHashLinkBlock(response.metadata),\n fullMetadata: response.metadata,\n });\n\n if (\n hasHashLinkBlock(preservedMetadata) &&\n !hasHashLinkBlock(response.metadata)\n ) {\n this.logger.error(\n '❌ CRITICAL: HashLink metadata was lost during processing!'\n );\n this.logger.error(\n 'Original metadata had hashLinkBlock:',\n preservedMetadata.hashLinkBlock\n );\n this.logger.error('Final metadata missing hashLinkBlock');\n }\n\n return response;\n } catch (error) {\n this.logger.error('Form submission processing error:', error);\n return this.handleError(error);\n }\n }\n\n /**\n * Check if the agent has pending forms that need to be completed\n */\n hasPendingForms(): boolean {\n return this.executor ? this.executor.hasPendingForms() : false;\n }\n\n /**\n * Get information about pending forms\n */\n getPendingFormsInfo(): Array<{ formId: string; toolName: string }> {\n return this.executor ? this.executor.getPendingFormsInfo() : [];\n }\n\n private async createAgentKit(): Promise<HederaAgentKit> {\n const corePlugins = getAllHederaCorePlugins();\n const extensionPlugins = this.config.extensions?.plugins || [];\n const plugins = [...corePlugins, ...extensionPlugins];\n\n const operationalMode =\n this.config.execution?.operationalMode || 'returnBytes';\n const modelName = this.config.ai?.modelName || 'gpt-4o';\n\n return new HederaAgentKit(\n this.config.signer,\n { plugins },\n operationalMode,\n this.config.execution?.userAccountId,\n this.config.execution?.scheduleUserTransactionsInBytesMode ?? false,\n undefined,\n modelName,\n this.config.extensions?.mirrorConfig,\n this.config.debug?.silent ?? false\n );\n }\n\n private async createExecutor(): Promise<void> {\n const existingPendingForms = this.executor?.getPendingForms() || new Map();\n\n let llm: BaseChatModel;\n if (this.config.ai?.provider && this.config.ai.provider.getModel) {\n llm = this.config.ai.provider.getModel() as BaseChatModel;\n } else if (this.config.ai?.llm) {\n llm = this.config.ai.llm as BaseChatModel;\n } else {\n const apiKey = this.config.ai?.apiKey || process.env.OPENAI_API_KEY;\n if (!apiKey) {\n throw new Error('OpenAI API key required');\n }\n\n const modelName = this.config.ai?.modelName || 'gpt-4o-mini';\n const isGPT5Model =\n modelName.toLowerCase().includes('gpt-5') ||\n modelName.toLowerCase().includes('gpt5');\n\n llm = new ChatOpenAI({\n apiKey,\n modelName,\n callbacks: this.tokenTracker ? [this.tokenTracker] : [],\n ...(isGPT5Model ? { temperature: 1 } : {}),\n });\n }\n\n const prompt = ChatPromptTemplate.fromMessages([\n ['system', this.systemMessage],\n new MessagesPlaceholder('chat_history'),\n ['human', '{input}'],\n new MessagesPlaceholder('agent_scratchpad'),\n ]);\n\n const langchainTools = this.tools as StructuredTool[];\n\n const inscriptionTool = this.getInscriptionTool();\n if (inscriptionTool) {\n const entry = this.toolRegistry.getTool(inscriptionTool.name);\n if (entry) {\n this.logger.info(\n `✅ Inscription tool registered: ${inscriptionTool.name}`\n );\n }\n }\n\n const stats = this.toolRegistry.getStatistics();\n this.logger.info('🛡️ TOOL SECURITY REPORT:', {\n totalTools: stats.totalTools,\n wrappedTools: stats.wrappedTools,\n unwrappedTools: stats.unwrappedTools,\n categories: stats.categoryCounts,\n priorities: stats.priorityCounts,\n });\n\n this.logger.info(\n `📊 Tool Security Summary: ${stats.wrappedTools} wrapped, ${stats.unwrappedTools} unwrapped`\n );\n\n const agent = await createOpenAIToolsAgent({\n llm,\n tools: langchainTools,\n prompt,\n });\n\n this.executor = new FormAwareAgentExecutor({\n agent,\n tools: langchainTools,\n verbose: this.config.debug?.verbose ?? false,\n returnIntermediateSteps: true,\n });\n\n if (this.pendingParameterPreprocessingCallback) {\n this.executor.setParameterPreprocessingCallback(\n this.pendingParameterPreprocessingCallback\n );\n this.logger.info(\n 'Parameter preprocessing callback re-applied to new executor',\n { hasCallback: true }\n );\n }\n\n if (existingPendingForms.size > 0) {\n this.logger.info(\n `Restoring ${existingPendingForms.size} pending forms to new executor`\n );\n this.executor.restorePendingForms(existingPendingForms);\n }\n\n this.logger.info('FormAwareAgentExecutor initialization complete');\n }\n\n /**\n * Set parameter preprocessing callback for tool parameter format conversion\n */\n setParameterPreprocessingCallback(\n callback: ParameterPreprocessingCallback | undefined\n ): void {\n this.pendingParameterPreprocessingCallback = callback;\n if (this.executor) {\n this.executor.setParameterPreprocessingCallback(callback);\n this.logger.info('Parameter preprocessing callback configured', {\n hasCallback: !!callback,\n });\n } else {\n this.logger.warn(\n 'Cannot set parameter preprocessing callback: executor not initialized'\n );\n }\n }\n\n private handleError(error: unknown): ChatResponse {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n this.logger.error('Chat error:', error);\n\n let tokenUsage: TokenUsage | undefined;\n let cost: CostCalculation | undefined;\n\n if (this.tokenTracker) {\n tokenUsage = this.tokenTracker.getLatestTokenUsage();\n if (tokenUsage) {\n cost = calculateTokenCostSync(tokenUsage);\n }\n }\n\n let userFriendlyMessage = errorMessage;\n let userFriendlyOutput = errorMessage;\n\n if (errorMessage.includes('429')) {\n if (errorMessage.includes('quota')) {\n userFriendlyMessage =\n 'API quota exceeded. Please check your OpenAI billing and usage limits.';\n userFriendlyOutput =\n \"I'm currently unable to respond because the API quota has been exceeded. Please check your OpenAI account billing and usage limits, then try again.\";\n } else {\n userFriendlyMessage = ERROR_MESSAGES.TOO_MANY_REQUESTS;\n userFriendlyOutput = ERROR_MESSAGES.RATE_LIMITED;\n }\n } else if (\n errorMessage.includes('401') ||\n errorMessage.includes('unauthorized')\n ) {\n userFriendlyMessage =\n 'API authentication failed. Please check your API key configuration.';\n userFriendlyOutput =\n \"There's an issue with the API authentication. Please check your OpenAI API key configuration in settings.\";\n } else if (errorMessage.includes('timeout')) {\n userFriendlyMessage = 'Request timed out. Please try again.';\n userFriendlyOutput =\n 'The request took too long to process. Please try again.';\n } else if (\n errorMessage.includes('network') ||\n errorMessage.includes('fetch')\n ) {\n userFriendlyMessage =\n 'Network error. Please check your internet connection and try again.';\n userFriendlyOutput =\n 'There was a network error. Please check your internet connection and try again.';\n } else if (errorMessage.includes('400')) {\n userFriendlyMessage = errorMessage;\n userFriendlyOutput = errorMessage;\n }\n\n const errorResponse: ChatResponse = {\n output: userFriendlyOutput,\n message: userFriendlyMessage,\n error: errorMessage,\n notes: [],\n };\n\n if (tokenUsage) {\n errorResponse.tokenUsage = tokenUsage;\n }\n\n if (cost) {\n errorResponse.cost = cost;\n }\n\n return errorResponse;\n }\n\n private async initializeMCP(): Promise<void> {\n this.mcpManager = new MCPClientManager(this.logger);\n\n for (const serverConfig of this.config.mcp!.servers!) {\n if (serverConfig.autoConnect === false) {\n this.logger.info(\n `Skipping MCP server ${serverConfig.name} (autoConnect=false)`\n );\n continue;\n }\n\n const status = await this.mcpManager.connectServer(serverConfig);\n\n if (status.connected) {\n this.logger.info(\n `Connected to MCP server ${status.serverName} with ${status.tools.length} tools`\n );\n\n for (const mcpTool of status.tools) {\n const langchainTool = convertMCPToolToLangChain(\n mcpTool,\n this.mcpManager,\n serverConfig\n );\n\n this.toolRegistry.registerTool(langchainTool, {\n metadata: {\n category: 'mcp',\n version: '1.0.0',\n dependencies: [serverConfig.name],\n },\n });\n }\n\n this.tools = this.toolRegistry.getAllTools();\n } else {\n this.logger.error(\n `Failed to connect to MCP server ${status.serverName}: ${status.error}`\n );\n }\n }\n }\n\n /**\n * Connect to MCP servers asynchronously after agent boot with background timeout pattern\n */\n async connectMCPServers(): Promise<void> {\n if (!this.config.mcp?.servers || this.config.mcp.servers.length === 0) {\n return;\n }\n\n if (!this.mcpManager) {\n this.mcpManager = new MCPClientManager(this.logger);\n }\n\n this.logger.info(\n `Starting background MCP server connections for ${this.config.mcp.servers.length} servers...`\n );\n\n this.config.mcp.servers.forEach((serverConfig) => {\n this.connectServerInBackground(serverConfig);\n });\n\n this.logger.info('MCP server connections initiated in background');\n }\n\n /**\n * Connect to a single MCP server in background with timeout\n */\n private connectServerInBackground(serverConfig: MCPServerConfig): void {\n const serverName = serverConfig.name;\n\n setTimeout(async () => {\n try {\n this.logger.info(`Background connecting to MCP server: ${serverName}`);\n\n const status = await this.mcpManager!.connectServer(serverConfig);\n this.mcpConnectionStatus.set(serverName, status);\n\n if (status.connected) {\n this.logger.info(\n `Successfully connected to MCP server ${status.serverName} with ${status.tools.length} tools`\n );\n\n for (const mcpTool of status.tools) {\n const langchainTool = convertMCPToolToLangChain(\n mcpTool,\n this.mcpManager!,\n serverConfig\n );\n\n this.toolRegistry.registerTool(langchainTool, {\n metadata: {\n category: 'mcp',\n version: '1.0.0',\n dependencies: [serverConfig.name],\n },\n });\n }\n\n this.tools = this.toolRegistry.getAllTools();\n\n if (this.initialized && this.executor) {\n this.logger.info(\n `Recreating executor with ${this.tools.length} total tools`\n );\n await this.createExecutor();\n }\n } else {\n this.logger.error(\n `Failed to connect to MCP server ${status.serverName}: ${status.error}`\n );\n }\n } catch (error) {\n this.logger.error(\n `Background connection failed for MCP server ${serverName}:`,\n error\n );\n\n this.mcpConnectionStatus.set(serverName, {\n connected: false,\n serverName,\n tools: [],\n error: error instanceof Error ? error.message : 'Connection failed',\n });\n }\n }, 1000);\n }\n\n /**\n * Detects and processes HashLink blocks from tool responses\n * @param parsedResponse - The parsed JSON response from a tool\n * @returns Metadata object containing hashLinkBlock if detected\n */\n private processHashLinkBlocks(parsedResponse: unknown): {\n hashLinkBlock?: Record<string, unknown>;\n } {\n try {\n const responseRecord = parsedResponse as Record<string, unknown>;\n if (\n parsedResponse &&\n typeof parsedResponse === 'object' &&\n responseRecord.hashLinkBlock &&\n typeof responseRecord.hashLinkBlock === 'object'\n ) {\n const block = responseRecord.hashLinkBlock as Record<string, unknown>;\n\n if (\n block.blockId &&\n block.hashLink &&\n block.template &&\n block.attributes &&\n typeof block.blockId === 'string' &&\n typeof block.hashLink === 'string' &&\n typeof block.template === 'string' &&\n typeof block.attributes === 'object'\n ) {\n this.logger.info('HashLink block detected:', {\n blockId: block.blockId,\n hashLink: block.hashLink,\n template: block.template,\n attributeKeys: Object.keys(block.attributes),\n });\n\n return {\n hashLinkBlock: {\n blockId: block.blockId,\n hashLink: block.hashLink,\n template: block.template,\n attributes: block.attributes,\n },\n };\n } else {\n this.logger.warn('Invalid HashLink block structure detected:', block);\n }\n }\n } catch (error) {\n this.logger.error('Error processing HashLink blocks:', error);\n }\n\n return {};\n }\n\n /**\n * Check if a string is valid JSON\n */\n private isJSON(str: string): boolean {\n if (typeof str !== 'string') return false;\n\n const trimmed = str.trim();\n if (!trimmed) return false;\n\n if (\n !(trimmed.startsWith('{') && trimmed.endsWith('}')) &&\n !(trimmed.startsWith('[') && trimmed.endsWith(']'))\n ) {\n return false;\n }\n\n try {\n JSON.parse(trimmed);\n return true;\n } catch {\n return false;\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index31.js","sources":["../../src/langchain/form-aware-agent-executor.ts"],"sourcesContent":["import { AgentExecutor } from 'langchain/agents';\nimport { ZodError, z } from 'zod';\nimport { FormGenerator } from '../forms/form-generator';\nimport type { FormMessage, FormSubmission } from '../forms/types';\nimport { FormEngine } from '../forms/form-engine';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport type { AgentAction, AgentFinish, AgentStep } from 'langchain/agents';\nimport type { ToolInterface } from '@langchain/core/tools';\nimport { isFormValidatable } from '@hashgraphonline/standards-agent-kit';\nimport type { ChainValues } from '@langchain/core/utils/types';\nimport type { CallbackManagerForChainRun } from '@langchain/core/callbacks/manager';\nimport type { RunnableConfig } from '@langchain/core/runnables';\nimport { ResponseFormatter } from '../utils/response-formatter';\n\ntype BasicFieldType = 'text' | 'number' | 'select' | 'checkbox' | 'textarea';\n\nconst globalPendingForms: Map<string, PendingFormData> = new Map();\n\ninterface HashLinkBlock {\n blockId: string;\n hashLink: string;\n template: string;\n attributes: Record<string, unknown>;\n}\n\ninterface HashLinkResponse {\n hasHashLinkBlocks: boolean;\n hashLinkBlock?: HashLinkBlock;\n message: string;\n}\n\ninterface ToolWithOriginal {\n originalTool?: {\n call?: (args: Record<string, unknown>) => Promise<string>;\n };\n}\n\ninterface ActionWithToolInput {\n toolInput?: Record<string, unknown>;\n}\n\ninterface ZodSchemaDefinition {\n _def?: {\n typeName?: string;\n shape?: (() => Record<string, z.ZodTypeAny>) | Record<string, z.ZodTypeAny>;\n innerType?: z.ZodTypeAny;\n defaultValue?: unknown;\n };\n}\n\ninterface ToolWrapper {\n executeOriginal?: (args: Record<string, unknown>) => Promise<string>;\n getOriginalTool?: () => {\n _call?: (args: Record<string, unknown>) => Promise<string>;\n call?: (args: Record<string, unknown>) => Promise<string>;\n };\n originalTool?: {\n _call?: (args: Record<string, unknown>) => Promise<string>;\n call?: (args: Record<string, unknown>) => Promise<string>;\n };\n call?: (args: Record<string, unknown>) => Promise<string>;\n}\n\ninterface CallableTool {\n _call?: (args: Record<string, unknown>) => Promise<string>;\n call?: (args: Record<string, unknown>) => Promise<string>;\n}\n\ninterface ToolWithSchema {\n schema?: Record<string, unknown>;\n}\n\ninterface PendingFormData {\n toolName: string;\n originalInput: unknown;\n originalToolInput?: unknown;\n schema: unknown;\n toolRef?: ToolInterface | undefined;\n originalToolRef?: ToolWithOriginal['originalTool'];\n}\n\ninterface ToolResponse {\n requiresForm?: boolean;\n formMessage?: {\n id: string;\n [key: string]: unknown;\n };\n message?: string;\n hashLinkBlock?: HashLinkBlock;\n success?: boolean;\n inscription?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}\n\ninterface IntermediateStepData {\n action?: {\n tool?: string;\n [key: string]: unknown;\n };\n observation?: unknown;\n}\n\ninterface HashLinkBlock {\n blockId: string;\n hashLink: string;\n template: string;\n attributes: Record<string, unknown>;\n}\n\ninterface ResponseMetadataWithHashLink {\n hashLinkBlock?: HashLinkBlock;\n [key: string]: unknown;\n}\n\n/**\n * Parameter preprocessing callback interface\n */\nexport interface ParameterPreprocessingCallback {\n (toolName: string, parameters: Record<string, unknown>): Promise<\n Record<string, unknown>\n >;\n}\n\n/**\n * Agent executor that intercepts Zod validation errors and generates forms,\n * and processes HashLink block responses for rich UI rendering\n */\nexport class FormAwareAgentExecutor extends AgentExecutor {\n private formGenerator: FormGenerator;\n private formEngine: FormEngine;\n private formLogger: Logger;\n private pendingForms: Map<string, PendingFormData> = new Map();\n private parameterPreprocessingCallback:\n | ParameterPreprocessingCallback\n | undefined;\n\n /**\n * Type guard to check if a Zod type is a ZodObject\n */\n private isZodObject(schema: unknown): schema is z.ZodObject<z.ZodRawShape> {\n return schema instanceof z.ZodObject;\n }\n\n /**\n * Type guard to check if metadata has hashLinkBlock\n */\n private hasHashLinkBlock(\n metadata: unknown\n ): metadata is ResponseMetadataWithHashLink & {\n hashLinkBlock: HashLinkBlock;\n } {\n return (\n typeof metadata === 'object' &&\n metadata !== null &&\n 'hashLinkBlock' in metadata &&\n typeof (metadata as Record<string, unknown>).hashLinkBlock === 'object' &&\n (metadata as Record<string, unknown>).hashLinkBlock !== null\n );\n }\n\n constructor(...args: ConstructorParameters<typeof AgentExecutor>) {\n super(...args);\n this.formGenerator = new FormGenerator();\n this.formEngine = new FormEngine(\n new Logger({ module: 'FormAwareAgentExecutor.FormEngine' })\n );\n this.formLogger = new Logger({ module: 'FormAwareAgentExecutor' });\n this.parameterPreprocessingCallback = undefined;\n }\n\n /**\n * Set parameter preprocessing callback\n */\n setParameterPreprocessingCallback(\n callback: ParameterPreprocessingCallback | undefined\n ): void {\n this.parameterPreprocessingCallback = callback;\n }\n\n /**\n * BULLETPROOF TOOL INTERCEPTION\n * Override the single-step execution to intercept tool calls BEFORE LangChain processes them\n */\n override async _takeNextStep(\n nameToolMap: Record<string, ToolInterface>,\n inputs: ChainValues,\n intermediateSteps: AgentStep[],\n runManager?: CallbackManagerForChainRun,\n config?: RunnableConfig\n ): Promise<AgentFinish | AgentStep[]> {\n this.formLogger.info('🛡️ BULLETPROOF INTERCEPTION: _takeNextStep called', {\n availableTools: Object.keys(nameToolMap),\n inputKeys: Object.keys(inputs),\n });\n\n const result = await this.agent.plan(\n intermediateSteps,\n inputs,\n runManager?.getChild()\n );\n\n if ('returnValues' in result) {\n this.formLogger.info('Agent returned finish action, passing through');\n return result;\n }\n\n const action = result as AgentAction;\n const toolName = action.tool;\n const toolInput = action.toolInput;\n\n this.formLogger.info(`🎯 INTERCEPTING TOOL CALL: ${toolName}`, {\n toolInput,\n hasInNameToolMap: toolName in nameToolMap,\n toolInputKeys: Object.keys(toolInput || {}),\n });\n\n const tool =\n nameToolMap[toolName] || this.tools.find((t) => t.name === toolName);\n\n if (!tool) {\n this.formLogger.error(`Tool ${toolName} not found in registry`);\n throw new Error(`Tool \"${toolName}\" not found`);\n }\n\n let shouldGenerateForm = false;\n\n if (isFormValidatable(tool)) {\n this.formLogger.info(\n `🔍 Tool ${toolName} implements FormValidatable, checking shouldGenerateForm()`,\n {\n toolInput,\n }\n );\n\n try {\n shouldGenerateForm = tool.shouldGenerateForm(toolInput);\n this.formLogger.info(\n `FormValidatable.shouldGenerateForm() result: ${shouldGenerateForm}`,\n {\n toolName,\n toolInput,\n }\n );\n } catch (error) {\n this.formLogger.error(\n `Error calling shouldGenerateForm() on ${toolName}:`,\n error\n );\n shouldGenerateForm = false;\n }\n }\n\n if (shouldGenerateForm) {\n this.formLogger.info(`🚨 FORM GENERATION TRIGGERED for ${toolName}`);\n\n try {\n let schemaToUse: z.ZodSchema;\n let isFocusedSchema = false;\n\n if (isFormValidatable(tool)) {\n this.formLogger.info(\n `🎯 Tool ${toolName} is FormValidatable, attempting to get focused schema`\n );\n try {\n const focusedSchema = tool.getFormSchema();\n if (focusedSchema) {\n schemaToUse = focusedSchema;\n isFocusedSchema = true;\n this.formLogger.info(\n `✅ Successfully obtained focused schema for ${toolName}`\n );\n } else {\n this.formLogger.warn(\n `getFormSchema() returned null/undefined for ${toolName}, using default schema`\n );\n schemaToUse = tool.schema;\n isFocusedSchema = false;\n }\n } catch (error) {\n this.formLogger.error(\n `Failed to get focused schema from ${toolName}:`,\n error\n );\n this.formLogger.info(\n `Falling back to default schema for ${toolName}`\n );\n schemaToUse = tool.schema;\n isFocusedSchema = false;\n }\n } else {\n this.formLogger.info(\n `Tool ${toolName} is not FormValidatable, using default schema`\n );\n schemaToUse = tool.schema;\n isFocusedSchema = false;\n }\n\n let schemaFieldCount = 'unknown';\n try {\n if (this.isZodObject(schemaToUse)) {\n const zodObject = schemaToUse as z.ZodObject<z.ZodRawShape>;\n const shape = zodObject.shape;\n if (shape && typeof shape === 'object') {\n schemaFieldCount = Object.keys(shape).length.toString();\n }\n }\n } catch {}\n\n this.formLogger.info(\n `📋 Generating form with ${\n isFocusedSchema ? 'FOCUSED' : 'DEFAULT'\n } schema`,\n {\n toolName,\n schemaType: schemaToUse?.constructor?.name,\n estimatedFieldCount: schemaFieldCount,\n isFocusedSchema,\n }\n );\n\n let missingFields: Set<string> | undefined;\n\n if (isFocusedSchema) {\n this.formLogger.info(\n `⭐ Using focused schema - letting FormGenerator determine fields from schema`\n );\n missingFields = undefined;\n } else {\n missingFields = new Set<string>();\n if (this.isZodObject(schemaToUse)) {\n const zodObject = schemaToUse as z.ZodObject<z.ZodRawShape>;\n const shape = zodObject.shape || {};\n for (const fieldName of Object.keys(shape)) {\n const value = (toolInput || {})[fieldName];\n\n const isEmpty =\n isFormValidatable(tool) && tool.isFieldEmpty\n ? tool.isFieldEmpty(fieldName, value)\n : value === undefined ||\n value === '' ||\n value === null ||\n (Array.isArray(value) && value.length === 0);\n\n const isRequired = this.isFieldRequired(schemaToUse, fieldName);\n\n const isEssential =\n isFormValidatable(tool) && tool.getEssentialFields\n ? tool.getEssentialFields().includes(fieldName)\n : false;\n\n this.formLogger.info(`🔍 Field analysis: ${fieldName}`, {\n value: value,\n isEmpty: isEmpty,\n isRequired: isRequired,\n isEssential: isEssential,\n willAddToMissingFields: isEmpty && (isRequired || isEssential),\n });\n\n if (isEmpty && (isRequired || isEssential)) {\n missingFields.add(fieldName);\n }\n }\n }\n\n this.formLogger.info(`📋 Missing fields analysis complete`, {\n totalFields: this.isZodObject(schemaToUse)\n ? Object.keys(schemaToUse.shape).length\n : 0,\n missingFieldsCount: missingFields.size,\n missingFields: Array.from(missingFields),\n });\n }\n\n const formMessage = await this.formGenerator.generateFormFromSchema(\n schemaToUse,\n toolInput,\n {\n toolName: toolName,\n toolDescription: tool.description,\n },\n missingFields // Pass undefined for focused schemas, Set<string> for others\n );\n\n if (this.isZodObject(schemaToUse)) {\n try {\n const { jsonSchema, uiSchema } =\n this.formGenerator.generateJsonSchemaForm(\n schemaToUse,\n toolInput as Record<string, unknown> | undefined,\n missingFields\n );\n formMessage.jsonSchema = jsonSchema;\n formMessage.uiSchema = uiSchema;\n } catch (error) {\n this.formLogger.warn(\n 'Failed to generate JSON Schema for RJSF:',\n error\n );\n }\n }\n\n formMessage.partialInput = toolInput;\n\n const formData: PendingFormData = {\n toolName: toolName,\n originalInput: inputs,\n originalToolInput: toolInput,\n schema: schemaToUse,\n toolRef: tool as ToolInterface | undefined,\n originalToolRef: (tool as ToolWithOriginal).originalTool,\n };\n this.pendingForms.set(formMessage.id, formData);\n globalPendingForms.set(formMessage.id, formData);\n\n this.formLogger.info(`✅ FORM INTERCEPT SUCCESS for ${toolName}`);\n\n const formResult = {\n requiresForm: true,\n formMessage,\n };\n\n return [\n {\n action: action,\n observation: JSON.stringify(formResult),\n },\n ];\n } catch (error) {\n this.formLogger.error(`Form generation failed for ${toolName}:`, error);\n }\n }\n\n this.formLogger.info(\n `⚪ Passing through to normal tool execution for ${toolName}`\n );\n\n if (this.parameterPreprocessingCallback && toolInput) {\n this.formLogger.info(\n `🔄 Applying parameter preprocessing for ${toolName}`\n );\n try {\n const preprocessedInput = await this.parameterPreprocessingCallback(\n toolName,\n toolInput as Record<string, unknown>\n );\n\n if (\n preprocessedInput &&\n typeof preprocessedInput === 'object' &&\n '__requestForm' in (preprocessedInput as Record<string, unknown>)\n ) {\n const rf = (preprocessedInput as Record<string, unknown>)\n .__requestForm as {\n id?: string;\n title?: string;\n description?: string;\n fields?: Array<{\n name: string;\n label: string;\n type: string;\n required?: boolean;\n options?: Array<{ value: string; label: string }>;\n }>;\n submitLabel?: string;\n };\n\n const formId =\n rf.id ||\n `form_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n const formMessage = {\n type: 'form',\n id: formId,\n originalPrompt: 'Parameter validation required',\n toolName,\n formConfig: {\n title: rf.title || 'Complete required parameters',\n description:\n rf.description ||\n 'One or more parameters require confirmation. Please review and submit.',\n submitLabel: rf.submitLabel || 'Continue',\n fields: (rf.fields || []).map((f) => {\n const allowedTypes: BasicFieldType[] = [\n 'text',\n 'number',\n 'select',\n 'checkbox',\n 'textarea',\n ];\n const resolvedType: BasicFieldType = allowedTypes.includes(\n f.type as BasicFieldType\n )\n ? (f.type as BasicFieldType)\n : 'text';\n\n return {\n name: f.name,\n label: f.label,\n type: resolvedType,\n required: f.required ?? true,\n options: f.options,\n };\n }),\n },\n };\n\n const resolvedSchema = isFormValidatable(tool)\n ? (() => {\n try {\n const s = tool.getFormSchema();\n return s || tool.schema;\n } catch {\n return tool.schema;\n }\n })()\n : tool.schema;\n\n this.pendingForms.set(formId, {\n toolName,\n originalInput: inputs,\n originalToolInput: toolInput,\n schema: resolvedSchema,\n toolRef: tool as ToolInterface | undefined,\n originalToolRef: (tool as ToolWithOriginal).originalTool,\n });\n globalPendingForms.set(formId, {\n toolName,\n originalInput: inputs,\n originalToolInput: toolInput,\n schema: resolvedSchema,\n });\n\n return [\n {\n action,\n observation: JSON.stringify({ requiresForm: true, formMessage }),\n },\n ];\n }\n\n if (JSON.stringify(preprocessedInput) !== JSON.stringify(toolInput)) {\n this.formLogger.info(`📝 Parameters preprocessed for ${toolName}:`, {\n original: Object.keys(toolInput as Record<string, unknown>),\n preprocessed: Object.keys(preprocessedInput),\n hasChanges: true,\n });\n\n try {\n (action as ActionWithToolInput).toolInput = preprocessedInput;\n } catch {}\n } else {\n this.formLogger.debug(`No parameter changes needed for ${toolName}`);\n }\n } catch (preprocessError) {\n this.formLogger.warn(\n `Parameter preprocessing failed for ${toolName}, using original parameters:`,\n preprocessError\n );\n }\n }\n\n return super._takeNextStep(\n nameToolMap,\n inputs,\n intermediateSteps,\n runManager,\n config\n );\n }\n\n /**\n * Helper to determine if a field is required in the schema\n */\n private isFieldRequired(schema: unknown, fieldPath: string): boolean {\n if (!schema || !fieldPath) {\n return false;\n }\n\n try {\n const obj = schema as ZodSchemaDefinition;\n const def = obj._def;\n if (!def || def.typeName !== 'ZodObject') {\n return false;\n }\n const rawShape: unknown =\n typeof def.shape === 'function' ? def.shape() : def.shape;\n if (!rawShape || typeof rawShape !== 'object') {\n return false;\n }\n const shape = rawShape as Record<string, z.ZodTypeAny>;\n const fieldSchema = shape[fieldPath];\n if (!fieldSchema) {\n return false;\n }\n const unwrapOptional = (s: z.ZodTypeAny): z.ZodTypeAny => {\n const inner = (s as ZodSchemaDefinition)._def;\n if (inner && inner.typeName === 'ZodOptional' && inner.innerType) {\n return inner.innerType;\n }\n return s;\n };\n const unwrapped = unwrapOptional(fieldSchema);\n const fdef = (unwrapped as ZodSchemaDefinition)._def;\n if (!fdef) {\n return true;\n }\n if (fdef.typeName === 'ZodOptional' || fdef.typeName === 'ZodDefault') {\n return false;\n }\n if (fdef.defaultValue !== undefined) {\n return false;\n }\n return true;\n } catch (error) {\n this.formLogger.debug(\n `Could not determine if field ${fieldPath} is required:`,\n error\n );\n }\n return false;\n }\n\n /**\n * Override _call to intercept Zod validation errors at the execution level\n */\n override async _call(\n inputs: Record<string, unknown>\n ): Promise<Record<string, unknown>> {\n try {\n const result = await super._call(inputs);\n\n if (result.intermediateSteps && Array.isArray(result.intermediateSteps)) {\n for (const step of result.intermediateSteps) {\n if (step.observation) {\n try {\n const parsed: ToolResponse =\n typeof step.observation === 'string'\n ? JSON.parse(step.observation)\n : (step.observation as ToolResponse);\n\n if (parsed.requiresForm && parsed.formMessage) {\n this.formLogger.info('Tool requested form generation', {\n toolName: step.action?.tool,\n hasForm: true,\n });\n\n const actionToolName =\n (step as IntermediateStepData).action?.tool || 'unknown';\n const toolInstance = this.tools.find(\n (t) => t.name === actionToolName\n ) as ToolInterface | undefined;\n const originalToolCandidate =\n (toolInstance as ToolWithOriginal) || {};\n const pf: PendingFormData = {\n toolName: actionToolName,\n originalInput: inputs,\n originalToolInput: (step as IntermediateStepData).action\n ?.toolInput as Record<string, unknown> | undefined,\n schema: null,\n toolRef: toolInstance,\n originalToolRef: originalToolCandidate?.originalTool,\n };\n this.pendingForms.set(parsed.formMessage.id, pf);\n globalPendingForms.set(parsed.formMessage.id, pf);\n\n return {\n ...result,\n requiresForm: true,\n formMessage: parsed.formMessage,\n output:\n parsed.message || 'Please complete the form to continue.',\n };\n }\n\n if (\n parsed.hashLinkBlock ||\n (parsed.success && parsed.inscription && parsed.hashLinkBlock)\n ) {\n this.formLogger.info('Tool returned HashLink blocks', {\n toolName: (step as IntermediateStepData).action?.tool,\n hasHashLink: true,\n blockId: parsed.hashLinkBlock?.blockId,\n });\n\n const hashLinkResponse = this.processHashLinkResponse(parsed);\n\n return {\n ...result,\n hasHashLinkBlocks: true,\n hashLinkBlock: hashLinkResponse.hashLinkBlock,\n output: hashLinkResponse.message,\n };\n }\n } catch {}\n }\n }\n }\n\n return result;\n } catch (error) {\n if (error instanceof ZodError) {\n this.formLogger.info('Intercepted ZodError during agent execution');\n return this.handleValidationError(error, inputs, []);\n }\n throw error;\n }\n }\n\n /**\n * Handles Zod validation errors by generating forms\n */\n private async handleValidationError(\n error: ZodError,\n inputs: Record<string, unknown>,\n intermediateSteps: AgentStep[]\n ): Promise<Record<string, unknown>> {\n this.formLogger.info('Zod validation error detected, generating form', {\n errorIssues: error.issues.length,\n inputKeys: Object.keys(inputs),\n });\n\n let toolInfo = this.extractToolInfoFromError(\n error,\n inputs,\n intermediateSteps\n );\n\n if (!toolInfo) {\n this.formLogger.warn(\n 'Could not extract tool info from validation error, trying fallback detection'\n );\n const fallbackTool = this.detectToolFromErrorContext(error);\n if (!fallbackTool) {\n this.formLogger.error(\n 'No tool detected for form generation, rethrowing error'\n );\n throw error;\n }\n toolInfo = fallbackTool;\n }\n\n this.formLogger.info('Generating form for tool:', {\n toolName: toolInfo.toolName,\n hasSchema: !!toolInfo.schema,\n });\n\n const formMessage = this.formGenerator.generateFormFromError(\n error,\n toolInfo.schema as z.ZodType<unknown, z.ZodTypeDef, unknown>,\n toolInfo.toolName,\n (inputs.input as string) || ''\n );\n\n this.pendingForms.set(formMessage.id, {\n toolName: toolInfo.toolName,\n originalInput: inputs,\n schema: toolInfo.schema,\n });\n\n globalPendingForms.set(formMessage.id, {\n toolName: toolInfo.toolName,\n originalInput: inputs,\n schema: toolInfo.schema,\n });\n\n return {\n output: this.formatFormResponse(formMessage),\n formMessage,\n requiresForm: true,\n intermediateSteps: intermediateSteps || [],\n };\n }\n\n /**\n * Get a copy of pending forms for preservation during executor recreation\n */\n getPendingForms(): Map<string, PendingFormData> {\n return new Map(this.pendingForms);\n }\n\n /**\n * Restore pending forms from a previous executor instance\n */\n restorePendingForms(forms: Map<string, PendingFormData>): void {\n for (const [formId, formData] of forms) {\n this.pendingForms.set(formId, formData);\n }\n }\n\n /**\n * Processes form submission and continues tool execution\n */\n async processFormSubmission(\n submission: FormSubmission\n ): Promise<Record<string, unknown>> {\n this.formLogger.info(\n '🚀 FormAwareAgentExecutor.processFormSubmission called!',\n {\n submissionFormId: submission.formId,\n submissionToolName: submission.toolName,\n }\n );\n if (!submission) {\n throw new Error('Form submission is null or undefined');\n }\n\n if (!submission.formId) {\n throw new Error('Form submission missing formId');\n }\n\n if (\n !submission.parameters ||\n submission.parameters === null ||\n typeof submission.parameters !== 'object' ||\n Array.isArray(submission.parameters)\n ) {\n throw new Error(\n `Form submission parameters are invalid: ${typeof submission.parameters}, isNull: ${\n submission.parameters === null\n }, isArray: ${Array.isArray(\n submission.parameters\n )}, parameters: ${JSON.stringify(submission.parameters)}`\n );\n }\n\n this.formLogger.info('Processing form submission:', {\n formId: submission.formId,\n toolName: submission.toolName,\n parameterKeys: Object.keys(submission.parameters),\n parametersType: typeof submission.parameters,\n parametersIsNull: submission.parameters === null,\n parametersIsUndefined: submission.parameters === undefined,\n hasContext: !!submission.context,\n });\n\n let pendingForm = this.pendingForms.get(submission.formId);\n\n if (!pendingForm) {\n pendingForm = globalPendingForms.get(submission.formId);\n if (!pendingForm) {\n throw new Error(`No pending form found for ID: ${submission.formId}`);\n }\n }\n\n this.pendingForms.delete(submission.formId);\n globalPendingForms.delete(submission.formId);\n\n const tool =\n pendingForm.toolRef ||\n this.tools.find((t) => t.name === pendingForm.toolName);\n if (!tool) {\n throw new Error(\n `Tool not found for form submission: ${pendingForm.toolName}`\n );\n }\n\n let baseToolInput: Record<string, unknown> = {};\n try {\n if (\n pendingForm.originalToolInput &&\n typeof pendingForm.originalToolInput === 'object'\n ) {\n baseToolInput = {\n ...(pendingForm.originalToolInput as Record<string, unknown>),\n };\n }\n } catch (error) {\n this.formLogger.warn(\n 'Failed to extract base tool input, using empty object:',\n error\n );\n baseToolInput = {};\n }\n\n let submissionData: Record<string, unknown> = {};\n try {\n if (submission.parameters && typeof submission.parameters === 'object') {\n submissionData = {\n ...(submission.parameters as Record<string, unknown>),\n };\n }\n } catch (error) {\n this.formLogger.warn(\n 'Failed to extract submission parameters, using empty object:',\n error\n );\n submissionData = {};\n }\n\n const mergedToolInput: Record<string, unknown> = {};\n try {\n Object.keys(baseToolInput).forEach((key) => {\n const value = baseToolInput[key];\n if (value !== undefined && value !== null) {\n mergedToolInput[key] = value;\n }\n });\n\n Object.keys(submissionData).forEach((key) => {\n const value = submissionData[key];\n if (value !== undefined && value !== null) {\n mergedToolInput[key] = value;\n }\n });\n\n mergedToolInput.renderForm = false;\n mergedToolInput.__fromForm = true;\n\n this.formLogger.info('Successfully merged tool input:', {\n baseKeys: Object.keys(baseToolInput),\n submissionKeys: Object.keys(submissionData),\n mergedKeys: Object.keys(mergedToolInput),\n });\n } catch (error) {\n this.formLogger.error('Failed to merge tool input data:', error);\n throw new Error(\n `Failed to merge tool input data: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n );\n }\n\n try {\n const maybeWrapper = tool as ToolWrapper;\n let toolOutput: string;\n if (typeof maybeWrapper.executeOriginal === 'function') {\n toolOutput = await maybeWrapper.executeOriginal(mergedToolInput);\n } else if (typeof maybeWrapper.getOriginalTool === 'function') {\n const ot = maybeWrapper.getOriginalTool();\n const otCall = ot as CallableTool;\n if (ot && typeof otCall._call === 'function') {\n toolOutput = await otCall._call(mergedToolInput);\n } else if (ot && typeof otCall.call === 'function') {\n toolOutput = await otCall.call(mergedToolInput);\n } else {\n const tcall = tool as CallableTool;\n if (typeof tcall.call === 'function') {\n toolOutput = await tcall.call(mergedToolInput);\n } else {\n throw new Error(\n 'No callable tool implementation found for form submission'\n );\n }\n }\n } else if (\n maybeWrapper.originalTool &&\n typeof maybeWrapper.originalTool._call === 'function'\n ) {\n toolOutput = await maybeWrapper.originalTool._call(mergedToolInput);\n } else if (\n maybeWrapper.originalTool &&\n typeof maybeWrapper.originalTool.call === 'function'\n ) {\n toolOutput = await maybeWrapper.originalTool.call(mergedToolInput);\n } else if (typeof (tool as CallableTool).call === 'function') {\n toolOutput = await (tool as CallableTool).call!(mergedToolInput);\n } else {\n throw new Error(\n 'No callable tool implementation found for form submission'\n );\n }\n\n let responseMetadata: Record<string, unknown> = {};\n let formattedOutput: string;\n\n try {\n const parsed = JSON.parse(toolOutput);\n this.formLogger.info(\n '✅ METADATA EXTRACTION: Successfully parsed JSON',\n {\n jsonKeys: Object.keys(parsed),\n hasHashLinkBlock: !!(parsed as Record<string, unknown>)\n .hashLinkBlock,\n }\n );\n\n if (parsed && typeof parsed === 'object') {\n if (ResponseFormatter.isHashLinkResponse(parsed)) {\n this.formLogger.info(\n '🔗 HASHLINK DETECTED: Processing HashLink response separately to preserve metadata'\n );\n\n responseMetadata = {\n ...responseMetadata,\n hashLinkBlock: (parsed as Record<string, unknown>).hashLinkBlock,\n };\n\n formattedOutput = ResponseFormatter.formatHashLinkResponse(parsed);\n\n this.formLogger.info(\n '🔗 METADATA PRESERVED: HashLink metadata extracted for component rendering',\n {\n blockId: this.hasHashLinkBlock(responseMetadata)\n ? responseMetadata.hashLinkBlock.blockId\n : undefined,\n hasTemplate: this.hasHashLinkBlock(responseMetadata)\n ? !!responseMetadata.hashLinkBlock.template\n : false,\n }\n );\n } else {\n formattedOutput = ResponseFormatter.formatResponse(toolOutput);\n\n responseMetadata = {\n ...responseMetadata,\n hashLinkBlock: (parsed as Record<string, unknown>).hashLinkBlock,\n };\n }\n } else {\n formattedOutput = ResponseFormatter.formatResponse(toolOutput);\n }\n } catch (error) {\n this.formLogger.warn(\n '❌ METADATA EXTRACTION: Tool output is not JSON',\n {\n error: error instanceof Error ? error.message : 'unknown error',\n outputSample:\n typeof toolOutput === 'string'\n ? toolOutput.substring(0, 200)\n : 'not-string',\n }\n );\n\n formattedOutput = ResponseFormatter.formatResponse(toolOutput);\n }\n\n return {\n output: formattedOutput,\n formCompleted: true,\n originalFormId: submission.formId,\n intermediateSteps: [],\n metadata: responseMetadata,\n rawToolOutput: toolOutput,\n toolName: pendingForm.toolName,\n };\n } catch (error) {\n if (error instanceof ZodError) {\n return this.handleValidationError(error, mergedToolInput, []);\n }\n throw error;\n }\n }\n\n /**\n * Extracts tool information from the execution context\n */\n private extractToolInfoFromError(\n error: ZodError,\n inputs: Record<string, unknown>,\n intermediateSteps: AgentStep[]\n ): { toolName: string; schema: unknown } | null {\n try {\n if (intermediateSteps.length > 0) {\n const lastStep = intermediateSteps[intermediateSteps.length - 1];\n if (lastStep.action && lastStep.action.tool) {\n const tool = this.tools.find((t) => t.name === lastStep.action.tool);\n if (tool && 'schema' in tool) {\n this.formLogger.info(\n 'Found tool from intermediate steps:',\n lastStep.action.tool\n );\n return {\n toolName: lastStep.action.tool,\n schema: (tool as ToolWithSchema).schema,\n };\n }\n }\n }\n\n const inputSteps = (inputs.intermediateSteps as unknown[]) || [];\n if (inputSteps.length > 0) {\n const lastStep = inputSteps[inputSteps.length - 1];\n let action: AgentAction;\n\n if (Array.isArray(lastStep) && lastStep.length > 0) {\n action = lastStep[0] as AgentAction;\n } else if ((lastStep as Record<string, unknown>).action) {\n action = (lastStep as Record<string, unknown>).action as AgentAction;\n } else {\n action = lastStep as AgentAction;\n }\n\n if (action && action.tool) {\n const tool = this.tools.find((t) => t.name === action.tool);\n if (tool && 'schema' in tool) {\n this.formLogger.info('Found tool from input steps:', action.tool);\n return {\n toolName: action.tool,\n schema: (tool as ToolWithSchema).schema,\n };\n }\n }\n }\n\n const toolFromContext = this.findToolFromContext(inputs);\n if (toolFromContext) {\n this.formLogger.info(\n 'Found tool from context:',\n toolFromContext.toolName\n );\n return toolFromContext;\n }\n\n return null;\n } catch (err) {\n this.formLogger.error('Error extracting tool info:', err);\n return null;\n }\n }\n\n /**\n * Attempts to find tool from execution context\n */\n private findToolFromContext(inputs: Record<string, unknown>): {\n toolName: string;\n schema: unknown;\n } | null {\n const inputText = (inputs.input as string) || '';\n\n for (const tool of this.tools) {\n const keywords = this.extractToolKeywords(tool.name);\n\n if (\n keywords.some((keyword) =>\n inputText.toLowerCase().includes(keyword.toLowerCase())\n )\n ) {\n if ('schema' in tool) {\n return {\n toolName: tool.name,\n schema: (tool as ToolWithSchema).schema,\n };\n }\n }\n }\n\n return null;\n }\n\n /**\n * Additional fallback to detect tool from error context\n */\n private detectToolFromErrorContext(\n error: ZodError\n ): { toolName: string; schema: unknown } | null {\n const errorPaths = error.issues.map((issue) => issue.path.join('.'));\n\n for (const tool of this.tools) {\n if ('schema' in tool) {\n const toolSchema = (tool as ToolWithSchema).schema;\n if (this.schemaMatchesErrorPaths(toolSchema, errorPaths)) {\n this.formLogger.info(\n 'Detected tool from error path analysis:',\n tool.name\n );\n return {\n toolName: tool.name,\n schema: toolSchema,\n };\n }\n }\n }\n\n return null;\n }\n\n /**\n * Checks if a schema structure matches error paths\n */\n private schemaMatchesErrorPaths(\n schema: unknown,\n errorPaths: string[]\n ): boolean {\n const schemaRecord = schema as Record<string, unknown>;\n if (!schemaRecord || !schemaRecord._def) return false;\n\n try {\n const def = schemaRecord._def as Record<string, unknown>;\n if (def.typeName === 'ZodObject') {\n const shape = def.shape as Record<string, unknown>;\n const schemaKeys = Object.keys(shape || {});\n return errorPaths.some((path) => {\n const topLevelKey = path.split('.')[0];\n return schemaKeys.includes(topLevelKey);\n });\n }\n } catch (err) {\n this.formLogger.debug('Error analyzing schema structure:', err);\n }\n\n return false;\n }\n\n /**\n * Extracts keywords from tool name for matching\n */\n private extractToolKeywords(toolName: string): string[] {\n const words = toolName\n .replace(/([A-Z])/g, ' $1')\n .toLowerCase()\n .split(/[\\s_-]+/)\n .filter((w) => w.length > 2);\n\n return [...words, toolName.toLowerCase()];\n }\n\n /**\n * Formats the form message for display\n */\n private formatFormResponse(formMessage: FormMessage): string {\n const fieldCount = formMessage.formConfig.fields.length;\n const fieldList = formMessage.formConfig.fields\n .slice(0, 3)\n .map((f) => `• ${f.label}`)\n .join('\\n');\n\n return `I need some additional information to complete your request.\n\n${formMessage.formConfig.description}\n\nRequired fields:\n${fieldList}${fieldCount > 3 ? `\\n... and ${fieldCount - 3} more` : ''}\n\nPlease fill out the form below to continue.`;\n }\n\n /**\n * Check if there are pending forms\n */\n hasPendingForms(): boolean {\n return this.pendingForms.size > 0;\n }\n\n /**\n * Get information about pending forms\n */\n getPendingFormsInfo(): Array<{ formId: string; toolName: string }> {\n return Array.from(this.pendingForms.entries()).map(([formId, info]) => ({\n formId,\n toolName: info.toolName,\n }));\n }\n\n /**\n * Processes HashLink block responses from tools\n */\n private processHashLinkResponse(\n toolResponse: ToolResponse\n ): HashLinkResponse {\n try {\n let hashLinkBlock: HashLinkBlock | undefined;\n\n if (toolResponse.hashLinkBlock) {\n hashLinkBlock = toolResponse.hashLinkBlock;\n } else if (\n toolResponse.success &&\n toolResponse.inscription &&\n toolResponse.hashLinkBlock\n ) {\n hashLinkBlock = toolResponse.hashLinkBlock;\n }\n\n if (!hashLinkBlock) {\n throw new Error('HashLink block data not found in response');\n }\n\n if (\n !hashLinkBlock.blockId ||\n !hashLinkBlock.hashLink ||\n !hashLinkBlock.attributes\n ) {\n throw new Error(\n 'Invalid HashLink block structure - missing required fields'\n );\n }\n\n let message = 'Content processed successfully!';\n\n if (toolResponse.success && toolResponse.inscription) {\n const inscription = toolResponse.inscription;\n const metadata = toolResponse.metadata || {};\n\n message = `✅ ${inscription.standard} Hashinal inscription completed!\\n\\n`;\n\n if (metadata.name) {\n message += `**${metadata.name}**\\n`;\n }\n\n if (metadata.description) {\n message += `${metadata.description}\\n\\n`;\n }\n\n message += `📍 **Topic ID:** ${inscription.topicId}\\n`;\n message += `🔗 **HRL:** ${inscription.hrl}\\n`;\n\n if (inscription.cdnUrl) {\n message += `🌐 **CDN URL:** ${inscription.cdnUrl}\\n`;\n }\n\n if (metadata.creator) {\n message += `👤 **Creator:** ${metadata.creator}\\n`;\n }\n }\n\n this.formLogger.info('Processed HashLink response', {\n blockId: hashLinkBlock.blockId,\n hashLink: hashLinkBlock.hashLink,\n hasTemplate: !!hashLinkBlock.template,\n attributeCount: Object.keys(hashLinkBlock.attributes || {}).length,\n });\n\n return {\n hasHashLinkBlocks: true,\n hashLinkBlock,\n message,\n };\n } catch (error) {\n this.formLogger.error('Error processing HashLink response:', error);\n\n return {\n hasHashLinkBlocks: false,\n message: 'Content processed, but interactive display is not available.',\n };\n }\n }\n\n /**\n * Get FormEngine statistics for debugging\n */\n getFormEngineStatistics(): {\n strategies: string[];\n middleware: string[];\n } {\n return {\n strategies: this.formEngine.getRegisteredStrategies(),\n middleware: this.formEngine.getRegisteredMiddleware(),\n };\n }\n}\n"],"names":[],"mappings":"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"}
|