@hashgraphonline/conversational-agent 0.1.215 → 0.1.217

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/dist/cjs/conversational-agent.d.ts +8 -0
  2. package/dist/cjs/core/ToolRegistry.d.ts +130 -0
  3. package/dist/cjs/execution/ExecutionPipeline.d.ts +81 -0
  4. package/dist/cjs/forms/FormEngine.d.ts +121 -0
  5. package/dist/cjs/forms/form-generator.d.ts +39 -2
  6. package/dist/cjs/forms/types.d.ts +21 -2
  7. package/dist/cjs/index.cjs +1 -1
  8. package/dist/cjs/index.cjs.map +1 -1
  9. package/dist/cjs/index.d.ts +3 -4
  10. package/dist/cjs/langchain/FormAwareAgentExecutor.d.ts +53 -4
  11. package/dist/cjs/langchain/FormValidatingToolWrapper.d.ts +43 -6
  12. package/dist/cjs/langchain-agent.d.ts +49 -0
  13. package/dist/cjs/memory/ContentStorage.d.ts +7 -0
  14. package/dist/cjs/memory/SmartMemoryManager.d.ts +1 -0
  15. package/dist/cjs/services/ContentStoreManager.d.ts +11 -1
  16. package/dist/cjs/utils/ResponseFormatter.d.ts +26 -0
  17. package/dist/esm/index.js +2 -6
  18. package/dist/esm/index12.js +1 -1
  19. package/dist/esm/index12.js.map +1 -1
  20. package/dist/esm/index14.js +23 -5
  21. package/dist/esm/index14.js.map +1 -1
  22. package/dist/esm/index15.js +25 -4
  23. package/dist/esm/index15.js.map +1 -1
  24. package/dist/esm/index16.js +4 -2
  25. package/dist/esm/index16.js.map +1 -1
  26. package/dist/esm/index17.js +2 -7
  27. package/dist/esm/index17.js.map +1 -1
  28. package/dist/esm/index18.js +292 -150
  29. package/dist/esm/index18.js.map +1 -1
  30. package/dist/esm/index19.js +158 -65
  31. package/dist/esm/index19.js.map +1 -1
  32. package/dist/esm/index20.js +94 -270
  33. package/dist/esm/index20.js.map +1 -1
  34. package/dist/esm/index21.js +1 -1
  35. package/dist/esm/index23.js +14 -0
  36. package/dist/esm/index23.js.map +1 -1
  37. package/dist/esm/index24.js +508 -12
  38. package/dist/esm/index24.js.map +1 -1
  39. package/dist/esm/index25.js +1 -1
  40. package/dist/esm/index25.js.map +1 -1
  41. package/dist/esm/index26.js +1 -1
  42. package/dist/esm/index26.js.map +1 -1
  43. package/dist/esm/index27.js +189 -128
  44. package/dist/esm/index27.js.map +1 -1
  45. package/dist/esm/index28.js +164 -45
  46. package/dist/esm/index28.js.map +1 -1
  47. package/dist/esm/index29.js +302 -24
  48. package/dist/esm/index29.js.map +1 -1
  49. package/dist/esm/index30.js +144 -80
  50. package/dist/esm/index30.js.map +1 -1
  51. package/dist/esm/index31.js +63 -7
  52. package/dist/esm/index31.js.map +1 -1
  53. package/dist/esm/index32.js +24 -236
  54. package/dist/esm/index32.js.map +1 -1
  55. package/dist/esm/index33.js +95 -0
  56. package/dist/esm/index33.js.map +1 -0
  57. package/dist/esm/index34.js +245 -0
  58. package/dist/esm/index34.js.map +1 -0
  59. package/dist/esm/index5.js.map +1 -1
  60. package/dist/esm/index6.js +61 -22
  61. package/dist/esm/index6.js.map +1 -1
  62. package/dist/esm/index8.js +653 -131
  63. package/dist/esm/index8.js.map +1 -1
  64. package/dist/types/conversational-agent.d.ts +8 -0
  65. package/dist/types/core/ToolRegistry.d.ts +130 -0
  66. package/dist/types/execution/ExecutionPipeline.d.ts +81 -0
  67. package/dist/types/forms/FormEngine.d.ts +121 -0
  68. package/dist/types/forms/form-generator.d.ts +39 -2
  69. package/dist/types/forms/types.d.ts +21 -2
  70. package/dist/types/index.d.ts +3 -4
  71. package/dist/types/langchain/FormAwareAgentExecutor.d.ts +53 -4
  72. package/dist/types/langchain/FormValidatingToolWrapper.d.ts +43 -6
  73. package/dist/types/langchain-agent.d.ts +49 -0
  74. package/dist/types/memory/ContentStorage.d.ts +7 -0
  75. package/dist/types/memory/SmartMemoryManager.d.ts +1 -0
  76. package/dist/types/services/ContentStoreManager.d.ts +11 -1
  77. package/dist/types/utils/ResponseFormatter.d.ts +26 -0
  78. package/package.json +13 -10
  79. package/src/config/system-message.ts +14 -0
  80. package/src/context/ReferenceContextManager.ts +1 -1
  81. package/src/conversational-agent.ts +91 -36
  82. package/src/core/ToolRegistry.ts +358 -0
  83. package/src/execution/ExecutionPipeline.ts +301 -0
  84. package/src/forms/FormEngine.ts +443 -0
  85. package/src/forms/field-type-registry.ts +1 -13
  86. package/src/forms/form-generator.ts +394 -237
  87. package/src/forms/types.ts +20 -3
  88. package/src/index.ts +6 -10
  89. package/src/langchain/FormAwareAgentExecutor.ts +653 -22
  90. package/src/langchain/FormValidatingToolWrapper.ts +216 -93
  91. package/src/langchain-agent.ts +924 -185
  92. package/src/mcp/ContentProcessor.ts +20 -4
  93. package/src/mcp/MCPClientManager.ts +1 -1
  94. package/src/mcp/adapters/langchain.ts +1 -1
  95. package/src/memory/ContentStorage.ts +25 -5
  96. package/src/memory/SmartMemoryManager.ts +27 -4
  97. package/src/memory/TokenCounter.ts +1 -1
  98. package/src/plugins/hbar/HbarPlugin.ts +0 -1
  99. package/src/scripts/test-external-tool-wrapper.ts +3 -12
  100. package/src/scripts/test-hedera-kit-wrapper.ts +6 -22
  101. package/src/scripts/test-inscribe-form-generation.ts +24 -42
  102. package/src/scripts/test-inscribe-wrapper-verification.ts +1 -7
  103. package/src/services/ContentStoreManager.ts +23 -9
  104. package/src/services/EntityResolver.ts +2 -9
  105. package/src/tools/EntityResolverTool.ts +5 -8
  106. package/src/utils/ResponseFormatter.ts +146 -0
  107. package/dist/cjs/examples/external-tool-wrapper-example.d.ts +0 -131
  108. package/dist/cjs/langchain/ContentAwareAgentExecutor.d.ts +0 -14
  109. package/dist/cjs/langchain/external-tool-wrapper.d.ts +0 -179
  110. package/dist/cjs/scripts/test-external-tool-wrapper.d.ts +0 -5
  111. package/dist/cjs/scripts/test-hedera-kit-wrapper.d.ts +0 -36
  112. package/dist/cjs/scripts/test-inscribe-form-generation.d.ts +0 -15
  113. package/dist/cjs/scripts/test-inscribe-wrapper-verification.d.ts +0 -13
  114. package/dist/types/examples/external-tool-wrapper-example.d.ts +0 -131
  115. package/dist/types/langchain/ContentAwareAgentExecutor.d.ts +0 -14
  116. package/dist/types/langchain/external-tool-wrapper.d.ts +0 -179
  117. package/dist/types/scripts/test-external-tool-wrapper.d.ts +0 -5
  118. package/dist/types/scripts/test-hedera-kit-wrapper.d.ts +0 -36
  119. package/dist/types/scripts/test-inscribe-form-generation.d.ts +0 -15
  120. package/dist/types/scripts/test-inscribe-wrapper-verification.d.ts +0 -13
  121. package/src/examples/external-tool-wrapper-example.ts +0 -227
  122. package/src/langchain/ContentAwareAgentExecutor.ts +0 -19
  123. package/src/langchain/external-tool-wrapper.ts +0 -486
@@ -1 +1 @@
1
- {"version":3,"file":"index24.js","sources":["../../src/langchain/FormAwareAgentExecutor.ts"],"sourcesContent":["import { ContentAwareAgentExecutor } from './ContentAwareAgentExecutor';\nimport { ZodError, z } from 'zod';\nimport { FormGenerator } from '../forms/form-generator';\nimport type { FormMessage, FormSubmission } from '../forms/types';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport type { AgentAction, AgentFinish, AgentStep } from 'langchain/agents';\nimport type { StructuredTool } from '@langchain/core/tools';\n\ninterface PendingFormData {\n toolName: string;\n originalInput: unknown;\n schema: unknown;\n}\n\n/**\n * Agent executor that intercepts Zod validation errors and generates forms\n */\nexport class FormAwareAgentExecutor extends ContentAwareAgentExecutor {\n private formGenerator: FormGenerator;\n private formLogger: Logger;\n private pendingForms: Map<string, PendingFormData> = new Map();\n\n constructor(...args: ConstructorParameters<typeof ContentAwareAgentExecutor>) {\n super(...args);\n this.formGenerator = new FormGenerator();\n this.formLogger = new Logger({ module: 'FormAwareAgentExecutor' });\n }\n\n /**\n * Override _call to intercept Zod validation errors at the execution level\n */\n override async _call(inputs: Record<string, unknown>): 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 = typeof step.observation === 'string' \n ? JSON.parse(step.observation) \n : step.observation;\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 return {\n ...result,\n requiresForm: true,\n formMessage: parsed.formMessage,\n output: parsed.message || 'Please complete the form to continue.'\n };\n }\n } catch {\n \n }\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 /**\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(error, inputs, intermediateSteps);\n \n if (!toolInfo) {\n this.formLogger.warn('Could not extract tool info from validation error, trying fallback detection');\n const fallbackTool = this.detectToolFromErrorContext(error, inputs);\n if (!fallbackTool) {\n this.formLogger.error('No tool detected for form generation, rethrowing error');\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<any, any, any>,\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 return {\n output: this.formatFormResponse(formMessage),\n formMessage,\n requiresForm: true,\n intermediateSteps: intermediateSteps || []\n };\n }\n\n /**\n * Processes form submission and continues tool execution\n */\n async processFormSubmission(submission: FormSubmission): Promise<Record<string, unknown>> {\n const pendingForm = this.pendingForms.get(submission.formId);\n \n if (!pendingForm) {\n throw new Error(`No pending form found for ID: ${submission.formId}`);\n }\n\n this.pendingForms.delete(submission.formId);\n\n const mergedInput = Object.assign({}, pendingForm.originalInput as Record<string, unknown>, submission.data);\n\n try {\n const result = await super._call(mergedInput);\n return Object.assign({}, result, {\n formCompleted: true,\n originalFormId: submission.formId\n });\n } catch (error) {\n if (error instanceof ZodError) {\n return this.handleValidationError(error, mergedInput, []);\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('Found tool from intermediate steps:', lastStep.action.tool);\n return {\n toolName: lastStep.action.tool,\n schema: (tool as unknown as Record<string, unknown>).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 unknown as Record<string, unknown>).schema\n };\n }\n }\n }\n\n const toolFromContext = this.findToolFromContext(inputs);\n if (toolFromContext) {\n this.formLogger.info('Found tool from context:', toolFromContext.toolName);\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 (keywords.some(keyword => \n inputText.toLowerCase().includes(keyword.toLowerCase())\n )) {\n if ('schema' in tool) {\n return {\n toolName: tool.name,\n schema: (tool as unknown as Record<string, unknown>).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 inputs: Record<string, unknown>\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 unknown as Record<string, unknown>).schema;\n if (this.schemaMatchesErrorPaths(toolSchema, errorPaths)) {\n this.formLogger.info('Detected tool from error path analysis:', tool.name);\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(schema: unknown, errorPaths: string[]): 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}"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index24.js","sources":["../../src/langchain/FormAwareAgentExecutor.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/FormEngine';\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/ResponseFormatter';\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 PendingFormData {\n toolName: string;\n originalInput: unknown;\n originalToolInput?: unknown;\n schema: unknown;\n toolRef?: ToolInterface | undefined;\n originalToolRef?: { call?: (args: Record<string, unknown>) => Promise<string> } | undefined;\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\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\n constructor(...args: ConstructorParameters<typeof AgentExecutor>) {\n super(...args);\n this.formGenerator = new FormGenerator();\n this.formEngine = new FormEngine(new Logger({ module: 'FormAwareAgentExecutor.FormEngine' }));\n this.formLogger = new Logger({ module: 'FormAwareAgentExecutor' });\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(intermediateSteps, inputs, runManager?.getChild());\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 = 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(`🔍 Tool ${toolName} implements FormValidatable, checking shouldGenerateForm()`, {\n toolInput\n });\n \n try {\n shouldGenerateForm = tool.shouldGenerateForm(toolInput);\n this.formLogger.info(`FormValidatable.shouldGenerateForm() result: ${shouldGenerateForm}`, {\n toolName,\n toolInput\n });\n } catch (error) {\n this.formLogger.error(`Error calling shouldGenerateForm() on ${toolName}:`, error);\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(`🎯 Tool ${toolName} is FormValidatable, attempting to get focused schema`);\n try {\n const focusedSchema = tool.getFormSchema();\n if (focusedSchema) {\n schemaToUse = focusedSchema;\n isFocusedSchema = true;\n this.formLogger.info(`✅ Successfully obtained focused schema for ${toolName}`);\n } else {\n this.formLogger.warn(`getFormSchema() returned null/undefined for ${toolName}, using default schema`);\n schemaToUse = tool.schema;\n isFocusedSchema = false;\n }\n } catch (error) {\n this.formLogger.error(`Failed to get focused schema from ${toolName}:`, error);\n this.formLogger.info(`Falling back to default schema for ${toolName}`);\n schemaToUse = tool.schema;\n isFocusedSchema = false;\n }\n } else {\n this.formLogger.info(`Tool ${toolName} is not FormValidatable, using default schema`);\n schemaToUse = tool.schema;\n isFocusedSchema = false;\n }\n\n let schemaFieldCount = 'unknown';\n try {\n if (schemaToUse && typeof schemaToUse === 'object' && 'shape' in schemaToUse) {\n const shape = (schemaToUse as any).shape;\n if (shape && typeof shape === 'object') {\n schemaFieldCount = Object.keys(shape).length.toString();\n }\n }\n } catch {\n }\n \n this.formLogger.info(`📋 Generating form with ${isFocusedSchema ? 'FOCUSED' : 'DEFAULT'} schema`, {\n toolName,\n schemaType: schemaToUse?.constructor?.name,\n estimatedFieldCount: schemaFieldCount,\n isFocusedSchema\n });\n\n let missingFields: Set<string> | undefined;\n \n if (isFocusedSchema) {\n this.formLogger.info(`⭐ Using focused schema - letting FormGenerator determine fields from schema`);\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 = (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 = (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) ? Object.keys(schemaToUse.shape).length : 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 } = 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('Failed to generate JSON Schema for RJSF:', error);\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 unknown as { originalTool?: { call?: (args: Record<string, unknown>) => Promise<string> } }).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 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\n this.formLogger.info(`⚪ Passing through to normal tool execution for ${toolName}`);\n return super._takeNextStep(nameToolMap, inputs, intermediateSteps, runManager, config);\n }\n\n /**\n * Type guard to check if a schema is a ZodObject\n */\n private isZodObject(schema: unknown): schema is z.ZodObject<z.ZodRawShape> {\n if (!schema || typeof schema !== 'object') {\n return false;\n }\n const candidate = schema as { _def?: { typeName?: string } };\n return Boolean(candidate._def && candidate._def.typeName === 'ZodObject');\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 { _def?: { typeName?: string; shape?: unknown } };\n const def = obj._def;\n if (!def || def.typeName !== 'ZodObject') {\n return false;\n }\n const rawShape: unknown = typeof (def as { shape?: unknown }).shape === 'function'\n ? (def as { shape: () => Record<string, z.ZodTypeAny> }).shape()\n : (def as { shape?: Record<string, z.ZodTypeAny> }).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 unknown as { _def?: { typeName?: string; innerType?: z.ZodTypeAny } })._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 unknown as { _def?: { typeName?: string; defaultValue?: unknown } })._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(`Could not determine if field ${fieldPath} is required:`, error);\n }\n return false;\n }\n\n /**\n * Override _call to intercept Zod validation errors at the execution level\n */\n override async _call(inputs: Record<string, unknown>): 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 = 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 = (step as IntermediateStepData).action?.tool || 'unknown';\n const toolInstance = this.tools.find(t => t.name === actionToolName) as ToolInterface | undefined;\n const originalToolCandidate = (toolInstance as unknown as { originalTool?: { call?: (args: Record<string, unknown>) => Promise<string> } }) || {};\n const pf: PendingFormData = {\n toolName: actionToolName,\n originalInput: inputs,\n originalToolInput: (step as IntermediateStepData).action?.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: parsed.message || 'Please complete the form to continue.'\n };\n }\n \n if (parsed.hashLinkBlock || (parsed.success && parsed.inscription && parsed.hashLinkBlock)) {\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 }\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(error, inputs, intermediateSteps);\n \n if (!toolInfo) {\n this.formLogger.warn('Could not extract tool info from validation error, trying fallback detection');\n const fallbackTool = this.detectToolFromErrorContext(error);\n if (!fallbackTool) {\n this.formLogger.error('No tool detected for form generation, rethrowing error');\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(submission: FormSubmission): Promise<Record<string, unknown>> {\n this.formLogger.info('🚀 FormAwareAgentExecutor.processFormSubmission called!', {\n submissionFormId: submission.formId,\n submissionToolName: submission.toolName\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 (!submission.parameters || submission.parameters === null || typeof submission.parameters !== 'object' || Array.isArray(submission.parameters)) {\n throw new Error(`Form submission parameters are invalid: ${typeof submission.parameters}, isNull: ${submission.parameters === null}, isArray: ${Array.isArray(submission.parameters)}, parameters: ${JSON.stringify(submission.parameters)}`);\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 = pendingForm.toolRef || this.tools.find(t => t.name === pendingForm.toolName);\n if (!tool) {\n throw new Error(`Tool not found for form submission: ${pendingForm.toolName}`);\n }\n\n let baseToolInput: Record<string, unknown> = {};\n try {\n if (pendingForm.originalToolInput && typeof pendingForm.originalToolInput === 'object') {\n baseToolInput = { ...(pendingForm.originalToolInput as Record<string, unknown>) };\n }\n } catch (error) {\n this.formLogger.warn('Failed to extract base tool input, using empty object:', error);\n baseToolInput = {};\n }\n\n let submissionData: Record<string, unknown> = {};\n try {\n if (submission.parameters && typeof submission.parameters === 'object') {\n submissionData = { ...(submission.parameters as Record<string, unknown>) };\n }\n } catch (error) {\n this.formLogger.warn('Failed to extract submission parameters, using empty object:', error);\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\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(`Failed to merge tool input data: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n\n try {\n const maybeWrapper = tool as unknown as {\n executeOriginal?: (args: Record<string, unknown>) => Promise<string>;\n getOriginalTool?: () => { _call?: (args: Record<string, unknown>) => Promise<string>; call?: (args: Record<string, unknown>) => Promise<string> };\n originalTool?: { _call?: (args: Record<string, unknown>) => Promise<string>; call?: (args: Record<string, unknown>) => Promise<string> };\n call?: (args: Record<string, unknown>) => Promise<string>;\n };\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 unknown as {\n _call?: (a: Record<string, unknown>) => Promise<string>;\n call?: (a: Record<string, unknown>) => Promise<string>;\n };\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 unknown as { call?: (a: Record<string, unknown>) => Promise<string> };\n if (typeof tcall.call === 'function') {\n toolOutput = await tcall.call(mergedToolInput);\n } else {\n throw new Error('No callable tool implementation found for form submission');\n }\n }\n } else if (maybeWrapper.originalTool && typeof maybeWrapper.originalTool._call === 'function') {\n toolOutput = await maybeWrapper.originalTool._call(mergedToolInput);\n } else if (maybeWrapper.originalTool && typeof maybeWrapper.originalTool.call === 'function') {\n toolOutput = await maybeWrapper.originalTool.call(mergedToolInput);\n } else if (typeof (tool as unknown as { call?: (a: Record<string, unknown>) => Promise<string> }).call === 'function') {\n toolOutput = await (tool as unknown as { call: (a: Record<string, unknown>) => Promise<string> }).call(mergedToolInput);\n } else {\n throw new Error('No callable tool implementation found for form submission');\n }\n\n let responseMetadata: Record<string, unknown> = {};\n let formattedOutput: string;\n \n this.formLogger.info('🔍 METADATA EXTRACTION: Analyzing tool output', {\n outputType: typeof toolOutput,\n outputLength: toolOutput?.length || 0,\n isString: typeof toolOutput === 'string',\n firstChars: typeof toolOutput === 'string' ? toolOutput.substring(0, 100) : 'not-string'\n });\n \n try {\n const parsed = JSON.parse(toolOutput);\n this.formLogger.info('✅ METADATA EXTRACTION: Successfully parsed JSON', {\n jsonKeys: Object.keys(parsed),\n hasHashLinkBlock: !!(parsed as Record<string, unknown>).hashLinkBlock\n });\n \n if (parsed && typeof parsed === 'object') {\n if (ResponseFormatter.isHashLinkResponse(parsed)) {\n this.formLogger.info('🔗 HASHLINK DETECTED: Processing HashLink response separately to preserve metadata');\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('🔗 METADATA PRESERVED: HashLink metadata extracted for component rendering', {\n blockId: (responseMetadata.hashLinkBlock as any)?.blockId,\n hasTemplate: !!(responseMetadata.hashLinkBlock as any)?.template\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('❌ METADATA EXTRACTION: Tool output is not JSON', {\n error: error instanceof Error ? error.message : 'unknown error',\n outputSample: typeof toolOutput === 'string' ? toolOutput.substring(0, 200) : 'not-string'\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 };\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('Found tool from intermediate steps:', lastStep.action.tool);\n return {\n toolName: lastStep.action.tool,\n schema: (tool as unknown as Record<string, unknown>).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 unknown as Record<string, unknown>).schema\n };\n }\n }\n }\n\n const toolFromContext = this.findToolFromContext(inputs);\n if (toolFromContext) {\n this.formLogger.info('Found tool from context:', toolFromContext.toolName);\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 (keywords.some(keyword => \n inputText.toLowerCase().includes(keyword.toLowerCase())\n )) {\n if ('schema' in tool) {\n return {\n toolName: tool.name,\n schema: (tool as unknown as Record<string, unknown>).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 unknown as Record<string, unknown>).schema;\n if (this.schemaMatchesErrorPaths(toolSchema, errorPaths)) {\n this.formLogger.info('Detected tool from error path analysis:', tool.name);\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(schema: unknown, errorPaths: string[]): 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(toolResponse: ToolResponse): HashLinkResponse {\n try {\n\n let hashLinkBlock: HashLinkBlock | undefined;\n \n if (toolResponse.hashLinkBlock) {\n hashLinkBlock = toolResponse.hashLinkBlock;\n } else if (toolResponse.success && toolResponse.inscription && toolResponse.hashLinkBlock) {\n hashLinkBlock = toolResponse.hashLinkBlock;\n }\n \n if (!hashLinkBlock) {\n throw new Error('HashLink block data not found in response');\n }\n \n if (!hashLinkBlock.blockId || !hashLinkBlock.hashLink || !hashLinkBlock.attributes) {\n throw new Error('Invalid HashLink block structure - missing required fields');\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 return {\n strategies: this.formEngine.getRegisteredStrategies(),\n middleware: this.formEngine.getRegisteredMiddleware(),\n };\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
2
  import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
3
- import { MCPContentProcessor } from "./index32.js";
3
+ import { MCPContentProcessor } from "./index34.js";
4
4
  class MCPClientManager {
5
5
  constructor(logger, contentStorage) {
6
6
  this.clients = /* @__PURE__ */ new Map();
@@ -1 +1 @@
1
- {"version":3,"file":"index25.js","sources":["../../src/mcp/MCPClientManager.ts"],"sourcesContent":["import { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';\nimport type { MCPServerConfig, MCPToolInfo, MCPConnectionStatus } from './types';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport type { ContentStorage } from '../memory/ContentStorage';\nimport { MCPContentProcessor, ProcessedResponse } from './ContentProcessor';\n\n/**\n * Manages connections to MCP servers and tool discovery\n */\nexport class MCPClientManager {\n private clients: Map<string, Client> = new Map();\n private tools: Map<string, MCPToolInfo[]> = new Map();\n private logger: Logger;\n private contentProcessor?: MCPContentProcessor;\n\n constructor(logger: Logger, contentStorage?: ContentStorage) {\n this.logger = logger;\n if (contentStorage) {\n this.contentProcessor = new MCPContentProcessor(contentStorage, logger);\n }\n }\n\n /**\n * Connect to an MCP server and discover its tools\n */\n async connectServer(config: MCPServerConfig): Promise<MCPConnectionStatus> {\n try {\n if (this.isServerConnected(config.name)) {\n return {\n serverName: config.name,\n connected: false,\n error: `Server ${config.name} is already connected`,\n tools: [],\n };\n }\n\n if (config.transport && config.transport !== 'stdio') {\n throw new Error(`Transport ${config.transport} not yet supported`);\n }\n\n const transport = new StdioClientTransport({\n command: config.command,\n args: config.args,\n ...(config.env && { env: config.env }),\n });\n\n const client = new Client({\n name: `conversational-agent-${config.name}`,\n version: '1.0.0',\n }, {\n capabilities: {},\n });\n\n await client.connect(transport);\n this.clients.set(config.name, client);\n\n const toolsResponse = await client.listTools();\n const toolsWithServer: MCPToolInfo[] = toolsResponse.tools.map(tool => ({\n ...tool,\n serverName: config.name,\n }));\n\n this.tools.set(config.name, toolsWithServer);\n this.logger.info(`Connected to MCP server ${config.name} with ${toolsWithServer.length} tools`);\n\n return {\n serverName: config.name,\n connected: true,\n tools: toolsWithServer,\n };\n } catch (error) {\n this.logger.error(`Failed to connect to MCP server ${config.name}:`, error);\n return {\n serverName: config.name,\n connected: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n tools: [],\n };\n }\n }\n\n /**\n * Execute a tool on a specific MCP server\n */\n async executeTool(serverName: string, toolName: string, args: Record<string, unknown>): Promise<unknown> {\n const client = this.clients.get(serverName);\n if (!client) {\n throw new Error(`MCP server ${serverName} not connected`);\n }\n\n this.logger.debug(`Executing MCP tool ${toolName} on server ${serverName}`, args);\n\n try {\n const result = await client.callTool({\n name: toolName,\n arguments: args,\n });\n\n if (this.contentProcessor) {\n const processed = await this.contentProcessor.processResponse(result, serverName, toolName);\n \n if (processed.wasProcessed) {\n this.logger.debug(\n `Processed MCP response from ${serverName}::${toolName}`,\n {\n referenceCreated: processed.referenceCreated,\n originalSize: processed.originalSize,\n errors: processed.errors\n }\n );\n\n if (processed.errors && processed.errors.length > 0) {\n this.logger.warn(`Content processing warnings for ${serverName}::${toolName}:`, processed.errors);\n }\n }\n\n return processed.content;\n }\n\n return result;\n } catch (error) {\n this.logger.error(`Error executing MCP tool ${toolName}:`, error);\n throw error;\n }\n }\n\n /**\n * Disconnect all MCP servers\n */\n async disconnectAll(): Promise<void> {\n for (const [name, client] of this.clients) {\n try {\n await client.close();\n this.logger.info(`Disconnected from MCP server ${name}`);\n } catch (error) {\n this.logger.error(`Error disconnecting MCP server ${name}:`, error);\n }\n }\n this.clients.clear();\n this.tools.clear();\n }\n\n /**\n * Get all discovered tools from all connected servers\n */\n getAllTools(): MCPToolInfo[] {\n const allTools: MCPToolInfo[] = [];\n for (const tools of this.tools.values()) {\n allTools.push(...tools);\n }\n return allTools;\n }\n\n /**\n * Get tools from a specific server\n */\n getServerTools(serverName: string): MCPToolInfo[] {\n return this.tools.get(serverName) || [];\n }\n\n /**\n * Check if a server is connected\n */\n isServerConnected(serverName: string): boolean {\n return this.clients.has(serverName);\n }\n\n /**\n * Get list of connected server names\n */\n getConnectedServers(): string[] {\n return Array.from(this.clients.keys());\n }\n\n /**\n * Enable content processing with content storage\n */\n enableContentProcessing(contentStorage: ContentStorage): void {\n this.contentProcessor = new MCPContentProcessor(contentStorage, this.logger);\n this.logger.info('Content processing enabled for MCP responses');\n }\n\n /**\n * Disable content processing\n */\n disableContentProcessing(): void {\n delete this.contentProcessor;\n this.logger.info('Content processing disabled for MCP responses');\n }\n\n /**\n * Check if content processing is enabled\n */\n isContentProcessingEnabled(): boolean {\n return this.contentProcessor !== undefined;\n }\n\n /**\n * Analyze a response without processing it (for testing/debugging)\n */\n analyzeResponseContent(response: unknown): unknown {\n if (!this.contentProcessor) {\n throw new Error('Content processing is not enabled');\n }\n return this.contentProcessor.analyzeResponse(response);\n }\n}"],"names":[],"mappings":";;;AAUO,MAAM,iBAAiB;AAAA,EAM5B,YAAY,QAAgB,gBAAiC;AAL7D,SAAQ,8BAAmC,IAAA;AAC3C,SAAQ,4BAAwC,IAAA;AAK9C,SAAK,SAAS;AACd,QAAI,gBAAgB;AAClB,WAAK,mBAAmB,IAAI,oBAAoB,gBAAgB,MAAM;AAAA,IACxE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,QAAuD;AACzE,QAAI;AACF,UAAI,KAAK,kBAAkB,OAAO,IAAI,GAAG;AACvC,eAAO;AAAA,UACL,YAAY,OAAO;AAAA,UACnB,WAAW;AAAA,UACX,OAAO,UAAU,OAAO,IAAI;AAAA,UAC5B,OAAO,CAAA;AAAA,QAAC;AAAA,MAEZ;AAEA,UAAI,OAAO,aAAa,OAAO,cAAc,SAAS;AACpD,cAAM,IAAI,MAAM,aAAa,OAAO,SAAS,oBAAoB;AAAA,MACnE;AAEA,YAAM,YAAY,IAAI,qBAAqB;AAAA,QACzC,SAAS,OAAO;AAAA,QAChB,MAAM,OAAO;AAAA,QACb,GAAI,OAAO,OAAO,EAAE,KAAK,OAAO,IAAA;AAAA,MAAI,CACrC;AAED,YAAM,SAAS,IAAI,OAAO;AAAA,QACxB,MAAM,wBAAwB,OAAO,IAAI;AAAA,QACzC,SAAS;AAAA,MAAA,GACR;AAAA,QACD,cAAc,CAAA;AAAA,MAAC,CAChB;AAED,YAAM,OAAO,QAAQ,SAAS;AAC9B,WAAK,QAAQ,IAAI,OAAO,MAAM,MAAM;AAEpC,YAAM,gBAAgB,MAAM,OAAO,UAAA;AACnC,YAAM,kBAAiC,cAAc,MAAM,IAAI,CAAA,UAAS;AAAA,QACtE,GAAG;AAAA,QACH,YAAY,OAAO;AAAA,MAAA,EACnB;AAEF,WAAK,MAAM,IAAI,OAAO,MAAM,eAAe;AAC3C,WAAK,OAAO,KAAK,2BAA2B,OAAO,IAAI,SAAS,gBAAgB,MAAM,QAAQ;AAE9F,aAAO;AAAA,QACL,YAAY,OAAO;AAAA,QACnB,WAAW;AAAA,QACX,OAAO;AAAA,MAAA;AAAA,IAEX,SAAS,OAAO;AACd,WAAK,OAAO,MAAM,mCAAmC,OAAO,IAAI,KAAK,KAAK;AAC1E,aAAO;AAAA,QACL,YAAY,OAAO;AAAA,QACnB,WAAW;AAAA,QACX,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QAChD,OAAO,CAAA;AAAA,MAAC;AAAA,IAEZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,YAAoB,UAAkB,MAAiD;AACvG,UAAM,SAAS,KAAK,QAAQ,IAAI,UAAU;AAC1C,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,cAAc,UAAU,gBAAgB;AAAA,IAC1D;AAEA,SAAK,OAAO,MAAM,sBAAsB,QAAQ,cAAc,UAAU,IAAI,IAAI;AAEhF,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,SAAS;AAAA,QACnC,MAAM;AAAA,QACN,WAAW;AAAA,MAAA,CACZ;AAED,UAAI,KAAK,kBAAkB;AACzB,cAAM,YAAY,MAAM,KAAK,iBAAiB,gBAAgB,QAAQ,YAAY,QAAQ;AAE1F,YAAI,UAAU,cAAc;AAC1B,eAAK,OAAO;AAAA,YACV,+BAA+B,UAAU,KAAK,QAAQ;AAAA,YACtD;AAAA,cACE,kBAAkB,UAAU;AAAA,cAC5B,cAAc,UAAU;AAAA,cACxB,QAAQ,UAAU;AAAA,YAAA;AAAA,UACpB;AAGF,cAAI,UAAU,UAAU,UAAU,OAAO,SAAS,GAAG;AACnD,iBAAK,OAAO,KAAK,mCAAmC,UAAU,KAAK,QAAQ,KAAK,UAAU,MAAM;AAAA,UAClG;AAAA,QACF;AAEA,eAAO,UAAU;AAAA,MACnB;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,WAAK,OAAO,MAAM,4BAA4B,QAAQ,KAAK,KAAK;AAChE,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAA+B;AACnC,eAAW,CAAC,MAAM,MAAM,KAAK,KAAK,SAAS;AACzC,UAAI;AACF,cAAM,OAAO,MAAA;AACb,aAAK,OAAO,KAAK,gCAAgC,IAAI,EAAE;AAAA,MACzD,SAAS,OAAO;AACd,aAAK,OAAO,MAAM,kCAAkC,IAAI,KAAK,KAAK;AAAA,MACpE;AAAA,IACF;AACA,SAAK,QAAQ,MAAA;AACb,SAAK,MAAM,MAAA;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAKA,cAA6B;AAC3B,UAAM,WAA0B,CAAA;AAChC,eAAW,SAAS,KAAK,MAAM,OAAA,GAAU;AACvC,eAAS,KAAK,GAAG,KAAK;AAAA,IACxB;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,YAAmC;AAChD,WAAO,KAAK,MAAM,IAAI,UAAU,KAAK,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,YAA6B;AAC7C,WAAO,KAAK,QAAQ,IAAI,UAAU;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAgC;AAC9B,WAAO,MAAM,KAAK,KAAK,QAAQ,MAAM;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAwB,gBAAsC;AAC5D,SAAK,mBAAmB,IAAI,oBAAoB,gBAAgB,KAAK,MAAM;AAC3E,SAAK,OAAO,KAAK,8CAA8C;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,2BAAiC;AAC/B,WAAO,KAAK;AACZ,SAAK,OAAO,KAAK,+CAA+C;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,6BAAsC;AACpC,WAAO,KAAK,qBAAqB;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAuB,UAA4B;AACjD,QAAI,CAAC,KAAK,kBAAkB;AAC1B,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AACA,WAAO,KAAK,iBAAiB,gBAAgB,QAAQ;AAAA,EACvD;AACF;"}
1
+ {"version":3,"file":"index25.js","sources":["../../src/mcp/MCPClientManager.ts"],"sourcesContent":["import { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';\nimport type { MCPServerConfig, MCPToolInfo, MCPConnectionStatus } from './types';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport type { ContentStorage } from '../memory/ContentStorage';\nimport { MCPContentProcessor } from './ContentProcessor';\n\n/**\n * Manages connections to MCP servers and tool discovery\n */\nexport class MCPClientManager {\n private clients: Map<string, Client> = new Map();\n private tools: Map<string, MCPToolInfo[]> = new Map();\n private logger: Logger;\n private contentProcessor?: MCPContentProcessor;\n\n constructor(logger: Logger, contentStorage?: ContentStorage) {\n this.logger = logger;\n if (contentStorage) {\n this.contentProcessor = new MCPContentProcessor(contentStorage, logger);\n }\n }\n\n /**\n * Connect to an MCP server and discover its tools\n */\n async connectServer(config: MCPServerConfig): Promise<MCPConnectionStatus> {\n try {\n if (this.isServerConnected(config.name)) {\n return {\n serverName: config.name,\n connected: false,\n error: `Server ${config.name} is already connected`,\n tools: [],\n };\n }\n\n if (config.transport && config.transport !== 'stdio') {\n throw new Error(`Transport ${config.transport} not yet supported`);\n }\n\n const transport = new StdioClientTransport({\n command: config.command,\n args: config.args,\n ...(config.env && { env: config.env }),\n });\n\n const client = new Client({\n name: `conversational-agent-${config.name}`,\n version: '1.0.0',\n }, {\n capabilities: {},\n });\n\n await client.connect(transport);\n this.clients.set(config.name, client);\n\n const toolsResponse = await client.listTools();\n const toolsWithServer: MCPToolInfo[] = toolsResponse.tools.map(tool => ({\n ...tool,\n serverName: config.name,\n }));\n\n this.tools.set(config.name, toolsWithServer);\n this.logger.info(`Connected to MCP server ${config.name} with ${toolsWithServer.length} tools`);\n\n return {\n serverName: config.name,\n connected: true,\n tools: toolsWithServer,\n };\n } catch (error) {\n this.logger.error(`Failed to connect to MCP server ${config.name}:`, error);\n return {\n serverName: config.name,\n connected: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n tools: [],\n };\n }\n }\n\n /**\n * Execute a tool on a specific MCP server\n */\n async executeTool(serverName: string, toolName: string, args: Record<string, unknown>): Promise<unknown> {\n const client = this.clients.get(serverName);\n if (!client) {\n throw new Error(`MCP server ${serverName} not connected`);\n }\n\n this.logger.debug(`Executing MCP tool ${toolName} on server ${serverName}`, args);\n\n try {\n const result = await client.callTool({\n name: toolName,\n arguments: args,\n });\n\n if (this.contentProcessor) {\n const processed = await this.contentProcessor.processResponse(result, serverName, toolName);\n \n if (processed.wasProcessed) {\n this.logger.debug(\n `Processed MCP response from ${serverName}::${toolName}`,\n {\n referenceCreated: processed.referenceCreated,\n originalSize: processed.originalSize,\n errors: processed.errors\n }\n );\n\n if (processed.errors && processed.errors.length > 0) {\n this.logger.warn(`Content processing warnings for ${serverName}::${toolName}:`, processed.errors);\n }\n }\n\n return processed.content;\n }\n\n return result;\n } catch (error) {\n this.logger.error(`Error executing MCP tool ${toolName}:`, error);\n throw error;\n }\n }\n\n /**\n * Disconnect all MCP servers\n */\n async disconnectAll(): Promise<void> {\n for (const [name, client] of this.clients) {\n try {\n await client.close();\n this.logger.info(`Disconnected from MCP server ${name}`);\n } catch (error) {\n this.logger.error(`Error disconnecting MCP server ${name}:`, error);\n }\n }\n this.clients.clear();\n this.tools.clear();\n }\n\n /**\n * Get all discovered tools from all connected servers\n */\n getAllTools(): MCPToolInfo[] {\n const allTools: MCPToolInfo[] = [];\n for (const tools of this.tools.values()) {\n allTools.push(...tools);\n }\n return allTools;\n }\n\n /**\n * Get tools from a specific server\n */\n getServerTools(serverName: string): MCPToolInfo[] {\n return this.tools.get(serverName) || [];\n }\n\n /**\n * Check if a server is connected\n */\n isServerConnected(serverName: string): boolean {\n return this.clients.has(serverName);\n }\n\n /**\n * Get list of connected server names\n */\n getConnectedServers(): string[] {\n return Array.from(this.clients.keys());\n }\n\n /**\n * Enable content processing with content storage\n */\n enableContentProcessing(contentStorage: ContentStorage): void {\n this.contentProcessor = new MCPContentProcessor(contentStorage, this.logger);\n this.logger.info('Content processing enabled for MCP responses');\n }\n\n /**\n * Disable content processing\n */\n disableContentProcessing(): void {\n delete this.contentProcessor;\n this.logger.info('Content processing disabled for MCP responses');\n }\n\n /**\n * Check if content processing is enabled\n */\n isContentProcessingEnabled(): boolean {\n return this.contentProcessor !== undefined;\n }\n\n /**\n * Analyze a response without processing it (for testing/debugging)\n */\n analyzeResponseContent(response: unknown): unknown {\n if (!this.contentProcessor) {\n throw new Error('Content processing is not enabled');\n }\n return this.contentProcessor.analyzeResponse(response);\n }\n}"],"names":[],"mappings":"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"}
@@ -59,7 +59,7 @@ Context: ${serverConfig.additionalContext}`;
59
59
  originalSize: responseBuffer.length
60
60
  });
61
61
  return `content-ref:${referenceId}`;
62
- } catch (storeError) {
62
+ } catch {
63
63
  }
64
64
  }
65
65
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index26.js","sources":["../../src/mcp/adapters/langchain.ts"],"sourcesContent":["import { DynamicStructuredTool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport type { MCPToolInfo, MCPServerConfig } from '../types';\nimport type { MCPClientManager } from '../MCPClientManager';\nimport { ContentStoreService, shouldUseReference } from '@hashgraphonline/standards-sdk';\nimport type { ContentSource } from '../../types/content-reference';\n\n/**\n * Convert an MCP tool to a LangChain DynamicStructuredTool\n */\nexport function convertMCPToolToLangChain(\n tool: MCPToolInfo,\n mcpManager: MCPClientManager,\n serverConfig?: MCPServerConfig\n): DynamicStructuredTool {\n const zodSchema = jsonSchemaToZod(tool.inputSchema);\n\n const sanitizedName = `${tool.serverName}_${tool.name}`.replace(\n /[^a-zA-Z0-9_]/g,\n '_'\n );\n\n let description = tool.description || `MCP tool ${tool.name} from ${tool.serverName}`;\n \n if (serverConfig?.toolDescriptions?.[tool.name]) {\n description = `${description}\\n\\n${serverConfig.toolDescriptions[tool.name]}`;\n }\n \n if (serverConfig?.additionalContext) {\n description = `${description}\\n\\nContext: ${serverConfig.additionalContext}`;\n }\n\n return new DynamicStructuredTool({\n name: sanitizedName,\n description,\n schema: zodSchema,\n func: async (input) => {\n try {\n const result = await mcpManager.executeTool(\n tool.serverName,\n tool.name,\n input\n );\n\n let responseText = '';\n \n if (typeof result === 'string') {\n responseText = result;\n } else if (\n result &&\n typeof result === 'object' &&\n 'content' in result\n ) {\n const content = (result as { content: unknown }).content;\n if (Array.isArray(content)) {\n const textParts = content\n .filter(\n (item): item is { type: string; text: string } =>\n typeof item === 'object' &&\n item !== null &&\n 'type' in item &&\n item.type === 'text' &&\n 'text' in item\n )\n .map((item) => item.text);\n responseText = textParts.join('\\n');\n } else {\n responseText = JSON.stringify(content);\n }\n } else {\n responseText = JSON.stringify(result);\n }\n\n const responseBuffer = Buffer.from(responseText, 'utf8');\n \n const MCP_REFERENCE_THRESHOLD = 10 * 1024;\n const shouldStoreMCPContent = responseBuffer.length > MCP_REFERENCE_THRESHOLD;\n \n if (shouldStoreMCPContent || shouldUseReference(responseBuffer)) {\n const contentStore = ContentStoreService.getInstance();\n if (contentStore) {\n try {\n const referenceId = await contentStore.storeContent(responseBuffer, {\n contentType: 'text' as ContentSource,\n source: 'mcp',\n mcpToolName: `${tool.serverName}_${tool.name}`,\n originalSize: responseBuffer.length\n });\n return `content-ref:${referenceId}`;\n } catch (storeError) {\n }\n }\n }\n\n return responseText;\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n return `Error executing MCP tool ${tool.name}: ${errorMessage}`;\n }\n },\n });\n}\n\n/**\n * Convert JSON Schema to Zod schema\n * This is a simplified converter that handles common cases\n */\nfunction jsonSchemaToZod(schema: unknown): z.ZodTypeAny {\n if (!schema || typeof schema !== 'object') {\n return z.object({});\n }\n\n const schemaObj = schema as Record<string, unknown>;\n\n if (schemaObj.type && schemaObj.type !== 'object') {\n return convertType(schemaObj);\n }\n\n if (!schemaObj.properties || typeof schemaObj.properties !== 'object') {\n return z.object({});\n }\n\n const shape: Record<string, z.ZodTypeAny> = {};\n\n for (const [key, value] of Object.entries(schemaObj.properties)) {\n let zodType = convertType(value);\n\n const isRequired =\n Array.isArray(schemaObj.required) && schemaObj.required.includes(key);\n if (!isRequired) {\n zodType = zodType.optional();\n }\n\n shape[key] = zodType;\n }\n\n return z.object(shape);\n}\n\n/**\n * Convert a single JSON Schema type to Zod\n */\nfunction convertType(schema: unknown): z.ZodTypeAny {\n if (!schema || typeof schema !== 'object' || !('type' in schema)) {\n return z.unknown();\n }\n\n const schemaObj = schema as {\n type: string;\n enum?: unknown[];\n items?: unknown;\n };\n let zodType: z.ZodTypeAny;\n\n switch (schemaObj.type) {\n case 'string':\n zodType = z.string();\n if (schemaObj.enum && Array.isArray(schemaObj.enum)) {\n zodType = z.enum(schemaObj.enum as [string, ...string[]]);\n }\n break;\n\n case 'number':\n zodType = z.number();\n if ('minimum' in schemaObj && typeof schemaObj.minimum === 'number') {\n zodType = (zodType as z.ZodNumber).min(schemaObj.minimum);\n }\n if ('maximum' in schemaObj && typeof schemaObj.maximum === 'number') {\n zodType = (zodType as z.ZodNumber).max(schemaObj.maximum);\n }\n break;\n\n case 'integer':\n zodType = z.number().int();\n if ('minimum' in schemaObj && typeof schemaObj.minimum === 'number') {\n zodType = (zodType as z.ZodNumber).min(schemaObj.minimum);\n }\n if ('maximum' in schemaObj && typeof schemaObj.maximum === 'number') {\n zodType = (zodType as z.ZodNumber).max(schemaObj.maximum);\n }\n break;\n\n case 'boolean':\n zodType = z.boolean();\n break;\n\n case 'array':\n if (schemaObj.items) {\n zodType = z.array(convertType(schemaObj.items));\n } else {\n zodType = z.array(z.unknown());\n }\n break;\n\n case 'object':\n if ('properties' in schemaObj) {\n zodType = jsonSchemaToZod(schemaObj);\n } else {\n zodType = z.object({}).passthrough();\n }\n break;\n\n default:\n zodType = z.unknown();\n }\n\n if ('description' in schemaObj && typeof schemaObj.description === 'string') {\n zodType = zodType.describe(schemaObj.description);\n }\n\n return zodType;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index26.js","sources":["../../src/mcp/adapters/langchain.ts"],"sourcesContent":["import { DynamicStructuredTool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport type { MCPToolInfo, MCPServerConfig } from '../types';\nimport type { MCPClientManager } from '../MCPClientManager';\nimport { ContentStoreService, shouldUseReference } from '@hashgraphonline/standards-sdk';\nimport type { ContentSource } from '../../types/content-reference';\n\n/**\n * Convert an MCP tool to a LangChain DynamicStructuredTool\n */\nexport function convertMCPToolToLangChain(\n tool: MCPToolInfo,\n mcpManager: MCPClientManager,\n serverConfig?: MCPServerConfig\n): DynamicStructuredTool {\n const zodSchema = jsonSchemaToZod(tool.inputSchema);\n\n const sanitizedName = `${tool.serverName}_${tool.name}`.replace(\n /[^a-zA-Z0-9_]/g,\n '_'\n );\n\n let description = tool.description || `MCP tool ${tool.name} from ${tool.serverName}`;\n \n if (serverConfig?.toolDescriptions?.[tool.name]) {\n description = `${description}\\n\\n${serverConfig.toolDescriptions[tool.name]}`;\n }\n \n if (serverConfig?.additionalContext) {\n description = `${description}\\n\\nContext: ${serverConfig.additionalContext}`;\n }\n\n return new DynamicStructuredTool({\n name: sanitizedName,\n description,\n schema: zodSchema,\n func: async (input) => {\n try {\n const result = await mcpManager.executeTool(\n tool.serverName,\n tool.name,\n input\n );\n\n let responseText = '';\n \n if (typeof result === 'string') {\n responseText = result;\n } else if (\n result &&\n typeof result === 'object' &&\n 'content' in result\n ) {\n const content = (result as { content: unknown }).content;\n if (Array.isArray(content)) {\n const textParts = content\n .filter(\n (item): item is { type: string; text: string } =>\n typeof item === 'object' &&\n item !== null &&\n 'type' in item &&\n item.type === 'text' &&\n 'text' in item\n )\n .map((item) => item.text);\n responseText = textParts.join('\\n');\n } else {\n responseText = JSON.stringify(content);\n }\n } else {\n responseText = JSON.stringify(result);\n }\n\n const responseBuffer = Buffer.from(responseText, 'utf8');\n \n const MCP_REFERENCE_THRESHOLD = 10 * 1024;\n const shouldStoreMCPContent = responseBuffer.length > MCP_REFERENCE_THRESHOLD;\n \n if (shouldStoreMCPContent || shouldUseReference(responseBuffer)) {\n const contentStore = ContentStoreService.getInstance();\n if (contentStore) {\n try {\n const referenceId = await contentStore.storeContent(responseBuffer, {\n contentType: 'text' as ContentSource,\n source: 'mcp',\n mcpToolName: `${tool.serverName}_${tool.name}`,\n originalSize: responseBuffer.length\n });\n return `content-ref:${referenceId}`;\n } catch {\n }\n }\n }\n\n return responseText;\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n return `Error executing MCP tool ${tool.name}: ${errorMessage}`;\n }\n },\n });\n}\n\n/**\n * Convert JSON Schema to Zod schema\n * This is a simplified converter that handles common cases\n */\nfunction jsonSchemaToZod(schema: unknown): z.ZodTypeAny {\n if (!schema || typeof schema !== 'object') {\n return z.object({});\n }\n\n const schemaObj = schema as Record<string, unknown>;\n\n if (schemaObj.type && schemaObj.type !== 'object') {\n return convertType(schemaObj);\n }\n\n if (!schemaObj.properties || typeof schemaObj.properties !== 'object') {\n return z.object({});\n }\n\n const shape: Record<string, z.ZodTypeAny> = {};\n\n for (const [key, value] of Object.entries(schemaObj.properties)) {\n let zodType = convertType(value);\n\n const isRequired =\n Array.isArray(schemaObj.required) && schemaObj.required.includes(key);\n if (!isRequired) {\n zodType = zodType.optional();\n }\n\n shape[key] = zodType;\n }\n\n return z.object(shape);\n}\n\n/**\n * Convert a single JSON Schema type to Zod\n */\nfunction convertType(schema: unknown): z.ZodTypeAny {\n if (!schema || typeof schema !== 'object' || !('type' in schema)) {\n return z.unknown();\n }\n\n const schemaObj = schema as {\n type: string;\n enum?: unknown[];\n items?: unknown;\n };\n let zodType: z.ZodTypeAny;\n\n switch (schemaObj.type) {\n case 'string':\n zodType = z.string();\n if (schemaObj.enum && Array.isArray(schemaObj.enum)) {\n zodType = z.enum(schemaObj.enum as [string, ...string[]]);\n }\n break;\n\n case 'number':\n zodType = z.number();\n if ('minimum' in schemaObj && typeof schemaObj.minimum === 'number') {\n zodType = (zodType as z.ZodNumber).min(schemaObj.minimum);\n }\n if ('maximum' in schemaObj && typeof schemaObj.maximum === 'number') {\n zodType = (zodType as z.ZodNumber).max(schemaObj.maximum);\n }\n break;\n\n case 'integer':\n zodType = z.number().int();\n if ('minimum' in schemaObj && typeof schemaObj.minimum === 'number') {\n zodType = (zodType as z.ZodNumber).min(schemaObj.minimum);\n }\n if ('maximum' in schemaObj && typeof schemaObj.maximum === 'number') {\n zodType = (zodType as z.ZodNumber).max(schemaObj.maximum);\n }\n break;\n\n case 'boolean':\n zodType = z.boolean();\n break;\n\n case 'array':\n if (schemaObj.items) {\n zodType = z.array(convertType(schemaObj.items));\n } else {\n zodType = z.array(z.unknown());\n }\n break;\n\n case 'object':\n if ('properties' in schemaObj) {\n zodType = jsonSchemaToZod(schemaObj);\n } else {\n zodType = z.object({}).passthrough();\n }\n break;\n\n default:\n zodType = z.unknown();\n }\n\n if ('description' in schemaObj && typeof schemaObj.description === 'string') {\n zodType = zodType.describe(schemaObj.description);\n }\n\n return zodType;\n}\n"],"names":[],"mappings":";;;AAUO,SAAS,0BACd,MACA,YACA,cACuB;AACvB,QAAM,YAAY,gBAAgB,KAAK,WAAW;AAElD,QAAM,gBAAgB,GAAG,KAAK,UAAU,IAAI,KAAK,IAAI,GAAG;AAAA,IACtD;AAAA,IACA;AAAA,EAAA;AAGF,MAAI,cAAc,KAAK,eAAe,YAAY,KAAK,IAAI,SAAS,KAAK,UAAU;AAEnF,MAAI,cAAc,mBAAmB,KAAK,IAAI,GAAG;AAC/C,kBAAc,GAAG,WAAW;AAAA;AAAA,EAAO,aAAa,iBAAiB,KAAK,IAAI,CAAC;AAAA,EAC7E;AAEA,MAAI,cAAc,mBAAmB;AACnC,kBAAc,GAAG,WAAW;AAAA;AAAA,WAAgB,aAAa,iBAAiB;AAAA,EAC5E;AAEA,SAAO,IAAI,sBAAsB;AAAA,IAC/B,MAAM;AAAA,IACN;AAAA,IACA,QAAQ;AAAA,IACR,MAAM,OAAO,UAAU;AACrB,UAAI;AACF,cAAM,SAAS,MAAM,WAAW;AAAA,UAC9B,KAAK;AAAA,UACL,KAAK;AAAA,UACL;AAAA,QAAA;AAGF,YAAI,eAAe;AAEnB,YAAI,OAAO,WAAW,UAAU;AAC9B,yBAAe;AAAA,QACjB,WACE,UACA,OAAO,WAAW,YAClB,aAAa,QACb;AACA,gBAAM,UAAW,OAAgC;AACjD,cAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,kBAAM,YAAY,QACf;AAAA,cACC,CAAC,SACC,OAAO,SAAS,YAChB,SAAS,QACT,UAAU,QACV,KAAK,SAAS,UACd,UAAU;AAAA,YAAA,EAEb,IAAI,CAAC,SAAS,KAAK,IAAI;AAC1B,2BAAe,UAAU,KAAK,IAAI;AAAA,UACpC,OAAO;AACL,2BAAe,KAAK,UAAU,OAAO;AAAA,UACvC;AAAA,QACF,OAAO;AACL,yBAAe,KAAK,UAAU,MAAM;AAAA,QACtC;AAEA,cAAM,iBAAiB,OAAO,KAAK,cAAc,MAAM;AAEvD,cAAM,0BAA0B,KAAK;AACrC,cAAM,wBAAwB,eAAe,SAAS;AAEtD,YAAI,yBAAyB,mBAAmB,cAAc,GAAG;AAC/D,gBAAM,eAAe,oBAAoB,YAAA;AACzC,cAAI,cAAc;AAChB,gBAAI;AACF,oBAAM,cAAc,MAAM,aAAa,aAAa,gBAAgB;AAAA,gBAClE,aAAa;AAAA,gBACb,QAAQ;AAAA,gBACR,aAAa,GAAG,KAAK,UAAU,IAAI,KAAK,IAAI;AAAA,gBAC5C,cAAc,eAAe;AAAA,cAAA,CAC9B;AACD,qBAAO,eAAe,WAAW;AAAA,YACnC,QAAQ;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,MACT,SAAS,OAAO;AACd,cAAM,eACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,eAAO,4BAA4B,KAAK,IAAI,KAAK,YAAY;AAAA,MAC/D;AAAA,IACF;AAAA,EAAA,CACD;AACH;AAMA,SAAS,gBAAgB,QAA+B;AACtD,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,WAAO,EAAE,OAAO,EAAE;AAAA,EACpB;AAEA,QAAM,YAAY;AAElB,MAAI,UAAU,QAAQ,UAAU,SAAS,UAAU;AACjD,WAAO,YAAY,SAAS;AAAA,EAC9B;AAEA,MAAI,CAAC,UAAU,cAAc,OAAO,UAAU,eAAe,UAAU;AACrE,WAAO,EAAE,OAAO,EAAE;AAAA,EACpB;AAEA,QAAM,QAAsC,CAAA;AAE5C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,UAAU,GAAG;AAC/D,QAAI,UAAU,YAAY,KAAK;AAE/B,UAAM,aACJ,MAAM,QAAQ,UAAU,QAAQ,KAAK,UAAU,SAAS,SAAS,GAAG;AACtE,QAAI,CAAC,YAAY;AACf,gBAAU,QAAQ,SAAA;AAAA,IACpB;AAEA,UAAM,GAAG,IAAI;AAAA,EACf;AAEA,SAAO,EAAE,OAAO,KAAK;AACvB;AAKA,SAAS,YAAY,QAA+B;AAClD,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,EAAE,UAAU,SAAS;AAChE,WAAO,EAAE,QAAA;AAAA,EACX;AAEA,QAAM,YAAY;AAKlB,MAAI;AAEJ,UAAQ,UAAU,MAAA;AAAA,IAChB,KAAK;AACH,gBAAU,EAAE,OAAA;AACZ,UAAI,UAAU,QAAQ,MAAM,QAAQ,UAAU,IAAI,GAAG;AACnD,kBAAU,EAAE,KAAK,UAAU,IAA6B;AAAA,MAC1D;AACA;AAAA,IAEF,KAAK;AACH,gBAAU,EAAE,OAAA;AACZ,UAAI,aAAa,aAAa,OAAO,UAAU,YAAY,UAAU;AACnE,kBAAW,QAAwB,IAAI,UAAU,OAAO;AAAA,MAC1D;AACA,UAAI,aAAa,aAAa,OAAO,UAAU,YAAY,UAAU;AACnE,kBAAW,QAAwB,IAAI,UAAU,OAAO;AAAA,MAC1D;AACA;AAAA,IAEF,KAAK;AACH,gBAAU,EAAE,OAAA,EAAS,IAAA;AACrB,UAAI,aAAa,aAAa,OAAO,UAAU,YAAY,UAAU;AACnE,kBAAW,QAAwB,IAAI,UAAU,OAAO;AAAA,MAC1D;AACA,UAAI,aAAa,aAAa,OAAO,UAAU,YAAY,UAAU;AACnE,kBAAW,QAAwB,IAAI,UAAU,OAAO;AAAA,MAC1D;AACA;AAAA,IAEF,KAAK;AACH,gBAAU,EAAE,QAAA;AACZ;AAAA,IAEF,KAAK;AACH,UAAI,UAAU,OAAO;AACnB,kBAAU,EAAE,MAAM,YAAY,UAAU,KAAK,CAAC;AAAA,MAChD,OAAO;AACL,kBAAU,EAAE,MAAM,EAAE,QAAA,CAAS;AAAA,MAC/B;AACA;AAAA,IAEF,KAAK;AACH,UAAI,gBAAgB,WAAW;AAC7B,kBAAU,gBAAgB,SAAS;AAAA,MACrC,OAAO;AACL,kBAAU,EAAE,OAAO,CAAA,CAAE,EAAE,YAAA;AAAA,MACzB;AACA;AAAA,IAEF;AACE,gBAAU,EAAE,QAAA;AAAA,EAAQ;AAGxB,MAAI,iBAAiB,aAAa,OAAO,UAAU,gBAAgB,UAAU;AAC3E,cAAU,QAAQ,SAAS,UAAU,WAAW;AAAA,EAClD;AAEA,SAAO;AACT;"}
@@ -1,160 +1,221 @@
1
- class FieldTypeRegistry {
2
- constructor() {
3
- this.patterns = /* @__PURE__ */ new Map();
4
- this.initializeDefaultPatterns();
1
+ import { z } from "zod";
2
+ import { Logger } from "@hashgraphonline/standards-sdk";
3
+ import { wrapToolWithFormValidation } from "./index19.js";
4
+ import { FormGenerator } from "./index18.js";
5
+ import { isFormValidatable } from "@hashgraphonline/standards-agent-kit";
6
+ class ToolRegistry {
7
+ constructor(logger) {
8
+ this.tools = /* @__PURE__ */ new Map();
9
+ this.formGenerator = new FormGenerator();
10
+ this.logger = logger || new Logger({ module: "ToolRegistry" });
5
11
  }
6
12
  /**
7
- * Get singleton instance
13
+ * Register a tool with the registry
8
14
  */
9
- static getInstance() {
10
- if (!FieldTypeRegistry.instance) {
11
- FieldTypeRegistry.instance = new FieldTypeRegistry();
15
+ registerTool(tool, options = {}) {
16
+ const capabilities = this.analyzeToolCapabilities(tool);
17
+ const metadata = {
18
+ name: tool.name,
19
+ version: "1.0.0",
20
+ category: options.metadata?.category || "core",
21
+ description: tool.description,
22
+ capabilities,
23
+ dependencies: [],
24
+ schema: tool.schema,
25
+ ...options.metadata
26
+ };
27
+ let finalTool = tool;
28
+ let wrapper;
29
+ if (this.shouldWrapTool(tool, capabilities, options)) {
30
+ wrapper = wrapToolWithFormValidation(
31
+ tool,
32
+ this.formGenerator,
33
+ {
34
+ requireAllFields: false,
35
+ skipFields: ["metaOptions"],
36
+ ...options.wrapperConfig
37
+ }
38
+ );
39
+ finalTool = wrapper;
12
40
  }
13
- return FieldTypeRegistry.instance;
41
+ const entry = {
42
+ tool: finalTool,
43
+ metadata,
44
+ wrapper,
45
+ originalTool: tool
46
+ };
47
+ this.tools.set(tool.name, entry);
14
48
  }
15
49
  /**
16
- * Initialize default field type patterns
50
+ * Get a tool by name
17
51
  */
18
- initializeDefaultPatterns() {
19
- this.register("numeric-supply-exact", {
20
- pattern: ["maxSupply", "minSupply", "totalSupply"],
21
- type: "number",
22
- priority: 15
23
- // Highest priority for exact matches
24
- });
25
- this.register("numeric-supply", {
26
- pattern: /supply$/i,
27
- type: "number",
28
- priority: 10
29
- });
30
- this.register("numeric-amounts", {
31
- pattern: /(?:amount|quantity|count|total|sum|value)$/i,
32
- type: "number",
33
- priority: 8
34
- });
35
- this.register("numeric-time", {
36
- pattern: /(?:period|duration|time|timeout|delay|interval)$/i,
37
- type: "number",
38
- priority: 8
39
- });
40
- this.register("numeric-limits", {
41
- pattern: /(?:limit|max|min|threshold|size|length)$/i,
42
- type: "number",
43
- priority: 7
44
- });
45
- this.register("currency", {
46
- pattern: /(?:price|cost|fee|payment|balance|amount)$/i,
47
- type: "currency",
48
- priority: 9
49
- });
50
- this.register("percentage", {
51
- pattern: /(?:percent|percentage|rate|ratio)$/i,
52
- type: "percentage",
53
- priority: 9
54
- });
55
- this.register("boolean-freeze", {
56
- pattern: ["freezeDefault", "freeze"],
57
- type: "checkbox",
58
- priority: 10
59
- });
60
- this.register("boolean-flags", {
61
- pattern: /(?:is|has|can|should|enable|disable|active|default|allow)(?:[A-Z]|$)/,
62
- type: "checkbox",
63
- priority: 8
64
- });
65
- this.register("textarea", {
66
- pattern: /(?:memo|description|notes|comment|message|content|body|text)$/i,
67
- type: "textarea",
68
- priority: 8
69
- });
70
- this.register("array-fees", {
71
- pattern: ["customFees", "fees"],
72
- type: "array",
73
- priority: 10
74
- });
75
- this.register("array-general", {
76
- pattern: /(?:list|items|array|collection)$/i,
77
- type: "array",
78
- priority: 7
79
- });
80
- this.register("object-options", {
81
- pattern: ["metaOptions", "options"],
82
- type: "object",
83
- priority: 10
84
- });
85
- this.register("object-config", {
86
- pattern: /(?:config|settings|configuration|metadata|data|info)$/i,
87
- type: "object",
88
- priority: 7
89
- });
90
- this.register("select-type", {
91
- pattern: /(?:type|kind|category|status|state|mode)$/i,
92
- type: "select",
93
- priority: 7
94
- });
52
+ getTool(name) {
53
+ return this.tools.get(name) || null;
95
54
  }
96
55
  /**
97
- * Register a field type pattern
56
+ * Get tools by capability
98
57
  */
99
- register(key, pattern) {
100
- this.patterns.set(key, pattern);
58
+ getToolsByCapability(capability, value) {
59
+ const results = [];
60
+ for (const entry of this.tools.values()) {
61
+ if (value !== void 0) {
62
+ if (entry.metadata.capabilities[capability] === value) {
63
+ results.push(entry);
64
+ }
65
+ } else if (entry.metadata.capabilities[capability]) {
66
+ results.push(entry);
67
+ }
68
+ }
69
+ return results;
101
70
  }
102
71
  /**
103
- * Unregister a field type pattern
72
+ * Get tools by query
104
73
  */
105
- unregister(key) {
106
- return this.patterns.delete(key);
74
+ getToolsByQuery(query) {
75
+ const results = [];
76
+ for (const entry of this.tools.values()) {
77
+ let matches = true;
78
+ if (query.name && entry.metadata.name !== query.name) {
79
+ matches = false;
80
+ }
81
+ if (query.category && entry.metadata.category !== query.category) {
82
+ matches = false;
83
+ }
84
+ if (query.capabilities) {
85
+ for (const [key, value] of Object.entries(query.capabilities)) {
86
+ if (entry.metadata.capabilities[key] !== value) {
87
+ matches = false;
88
+ break;
89
+ }
90
+ }
91
+ }
92
+ if (matches) {
93
+ results.push(entry);
94
+ }
95
+ }
96
+ return results;
107
97
  }
108
98
  /**
109
- * Detect field type based on field name
99
+ * Get all registered tools
110
100
  */
111
- detectType(fieldName) {
112
- const matches = [];
113
- for (const pattern of this.patterns.values()) {
114
- let isMatch = false;
115
- if (Array.isArray(pattern.pattern)) {
116
- isMatch = pattern.pattern.some(
117
- (p) => fieldName === p || fieldName.toLowerCase() === p.toLowerCase()
118
- );
119
- } else if (pattern.pattern instanceof RegExp) {
120
- isMatch = pattern.pattern.test(fieldName);
121
- }
122
- if (isMatch) {
123
- matches.push({
124
- type: pattern.type,
125
- priority: pattern.priority ?? 5
126
- });
127
- }
101
+ getAllTools() {
102
+ return Array.from(this.tools.values()).map((entry) => entry.tool);
103
+ }
104
+ /**
105
+ * Get all registry entries
106
+ */
107
+ getAllRegistryEntries() {
108
+ return Array.from(this.tools.values());
109
+ }
110
+ /**
111
+ * Get all tool names
112
+ */
113
+ getToolNames() {
114
+ return Array.from(this.tools.keys());
115
+ }
116
+ /**
117
+ * Check if a tool is registered
118
+ */
119
+ hasTool(name) {
120
+ return this.tools.has(name);
121
+ }
122
+ /**
123
+ * Unregister a tool
124
+ */
125
+ unregisterTool(name) {
126
+ return this.tools.delete(name);
127
+ }
128
+ /**
129
+ * Clear all tools
130
+ */
131
+ clear() {
132
+ this.tools.clear();
133
+ }
134
+ /**
135
+ * Analyze tool capabilities
136
+ */
137
+ analyzeToolCapabilities(tool) {
138
+ const implementsFormValidatable = isFormValidatable(tool);
139
+ const hasRenderConfig = this.hasRenderConfig(tool);
140
+ const isZodObjectLike = this.isZodObjectLike(tool.schema);
141
+ const supportsFormValidation = implementsFormValidatable || hasRenderConfig;
142
+ const requiresWrapper = supportsFormValidation && isZodObjectLike;
143
+ let priority = "medium";
144
+ let category = "core";
145
+ if (supportsFormValidation && requiresWrapper) {
146
+ priority = "critical";
147
+ } else if (supportsFormValidation) {
148
+ priority = "high";
149
+ } else if (tool.description?.toLowerCase().includes("query") || tool.description?.toLowerCase().includes("search")) {
150
+ priority = "low";
128
151
  }
129
- if (matches.length > 0) {
130
- matches.sort((a, b) => b.priority - a.priority);
131
- return matches[0].type;
152
+ const toolAsAny = tool;
153
+ if (tool.constructor.name.includes("MCP") || toolAsAny.isMCPTool) {
154
+ category = "mcp";
155
+ } else if (toolAsAny.isExtension || tool.constructor.name.includes("Extension")) {
156
+ category = "extension";
132
157
  }
133
- return null;
158
+ return {
159
+ supportsFormValidation,
160
+ requiresWrapper,
161
+ priority,
162
+ category
163
+ };
134
164
  }
135
165
  /**
136
- * Get all registered patterns
166
+ * Check if tool has render configuration
137
167
  */
138
- getPatterns() {
139
- return new Map(this.patterns);
168
+ hasRenderConfig(tool) {
169
+ const schema = tool.schema;
170
+ return !!(schema && schema._renderConfig);
140
171
  }
141
172
  /**
142
- * Clear all patterns
173
+ * Determine if tool should be wrapped
143
174
  */
144
- clear() {
145
- this.patterns.clear();
175
+ shouldWrapTool(tool, capabilities, options) {
176
+ if (options.skipWrapper) {
177
+ return false;
178
+ }
179
+ if (options.forceWrapper) {
180
+ return true;
181
+ }
182
+ return capabilities.requiresWrapper;
146
183
  }
147
184
  /**
148
- * Reset to default patterns
185
+ * Check if schema is ZodObject-like
149
186
  */
150
- reset() {
151
- this.clear();
152
- this.initializeDefaultPatterns();
187
+ isZodObjectLike(schema) {
188
+ if (!schema || typeof schema !== "object") {
189
+ return false;
190
+ }
191
+ const schemaRecord = schema;
192
+ const schemaDef = schemaRecord._def;
193
+ return schema instanceof z.ZodObject || schemaDef?.typeName === "ZodObject" || "shape" in schemaRecord && typeof schemaRecord.shape === "object";
194
+ }
195
+ /**
196
+ * Get statistics about the registry
197
+ */
198
+ getStatistics() {
199
+ const stats = {
200
+ totalTools: this.tools.size,
201
+ wrappedTools: 0,
202
+ unwrappedTools: 0,
203
+ categoryCounts: { core: 0, extension: 0, mcp: 0 },
204
+ priorityCounts: { low: 0, medium: 0, high: 0, critical: 0 }
205
+ };
206
+ for (const entry of this.tools.values()) {
207
+ if (entry.wrapper) {
208
+ stats.wrappedTools++;
209
+ } else {
210
+ stats.unwrappedTools++;
211
+ }
212
+ stats.categoryCounts[entry.metadata.category]++;
213
+ stats.priorityCounts[entry.metadata.capabilities.priority]++;
214
+ }
215
+ return stats;
153
216
  }
154
217
  }
155
- const fieldTypeRegistry = FieldTypeRegistry.getInstance();
156
218
  export {
157
- FieldTypeRegistry,
158
- fieldTypeRegistry
219
+ ToolRegistry
159
220
  };
160
221
  //# sourceMappingURL=index27.js.map