@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":"index18.js","sources":["../../src/forms/form-generator.ts"],"sourcesContent":["import { z, ZodError } from 'zod';\nimport type {\n FormConfig,\n FormField,\n ValidationError,\n FormMessage,\n FormFieldType,\n} from './types';\nimport {\n extractRenderConfigs,\n generateFieldOrdering,\n type RenderConfigSchema,\n type ZodSchemaWithRender,\n type ExtractedRenderConfig,\n} from '@hashgraphonline/standards-agent-kit';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport { fieldTypeRegistry } from './field-type-registry';\n\n/**\n * Generates forms from Zod validation failures\n */\nexport class FormGenerator {\n private logger: Logger;\n\n constructor() {\n this.logger = new Logger({ module: 'FormGenerator' });\n }\n\n /**\n * Creates a form message from a Zod validation error\n * @param error The Zod validation error\n * @param schema The original Zod schema\n * @param toolName Name of the tool that failed validation\n * @param originalPrompt The user's original request\n * @returns FormMessage to send to the chat UI\n */\n generateFormFromError(\n error: ZodError,\n schema: z.ZodSchema,\n toolName: string,\n originalPrompt: string\n ): FormMessage {\n const validationErrors = this.extractValidationErrors(error);\n const missingFields = this.identifyMissingFields(validationErrors, schema);\n const formConfig = this.createFormConfig(schema, missingFields, toolName);\n\n return {\n type: 'form',\n id: `form_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n formConfig,\n originalPrompt,\n toolName,\n validationErrors,\n };\n }\n\n /**\n * Generates a form from a schema and partial input\n * @param schema The Zod schema to generate a form from\n * @param partialInput Any partial input already provided\n * @param context Additional context about the tool\n * @returns FormMessage to send to the chat UI\n */\n async generateFormFromSchema(\n schema: z.ZodSchema,\n partialInput: any,\n context: { toolName: string; toolDescription?: string }\n ): Promise<FormMessage> {\n const missingFields = new Set<string>();\n\n // Identify which fields are missing from the input\n if (schema && (schema as any).shape) {\n const shape = (schema as any).shape;\n for (const fieldName of Object.keys(shape)) {\n if (\n partialInput[fieldName] === undefined ||\n partialInput[fieldName] === ''\n ) {\n missingFields.add(fieldName);\n }\n }\n }\n\n const formConfig = this.createFormConfig(\n schema,\n missingFields,\n context.toolName\n );\n\n return {\n type: 'form',\n id: `form_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n formConfig,\n originalPrompt: context.toolDescription || `Complete ${context.toolName}`,\n toolName: context.toolName,\n validationErrors: [],\n };\n }\n\n /**\n * Extracts validation errors from ZodError\n */\n private extractValidationErrors(error: ZodError): ValidationError[] {\n return error.issues.map((issue) => ({\n path: issue.path.map((p) => String(p)),\n message: issue.message,\n code: issue.code,\n }));\n }\n\n /**\n * Identifies which fields are missing or invalid from validation errors\n */\n private identifyMissingFields(\n errors: ValidationError[],\n schema: z.ZodSchema\n ): Set<string> {\n const missingFields = new Set<string>();\n\n errors.forEach((error) => {\n const fieldPath = error.path.join('.');\n if (fieldPath) {\n missingFields.add(fieldPath);\n }\n });\n\n return missingFields;\n }\n\n /**\n * Creates form configuration from schema\n */\n private createFormConfig(\n schema: z.ZodSchema,\n missingFields: Set<string>,\n toolName: string\n ): FormConfig {\n const extractedConfig = this.extractRenderConfigsSafely(schema);\n const fieldOrdering = this.generateFieldOrderingSafely(schema);\n const fields = this.generateFormFields(\n schema,\n extractedConfig,\n missingFields,\n fieldOrdering\n );\n\n return {\n title: this.generateFormTitle(toolName),\n description: this.generateFormDescription(toolName, missingFields.size),\n fields,\n submitLabel: 'Continue',\n cancelLabel: 'Cancel',\n metadata: {\n toolName,\n missingFieldCount: missingFields.size,\n },\n };\n }\n\n /**\n * Safely extracts render configs from schema\n */\n private extractRenderConfigsSafely(\n schema: z.ZodSchema\n ): ExtractedRenderConfig {\n try {\n if (typeof extractRenderConfigs === 'function') {\n return extractRenderConfigs(schema as ZodSchemaWithRender);\n }\n } catch (error) {\n this.logger.warn('Could not extract render configs:', error);\n }\n return {\n fields: {},\n groups: {},\n order: [],\n metadata: {},\n };\n }\n\n /**\n * Safely generates field ordering from schema\n */\n private generateFieldOrderingSafely(schema: z.ZodSchema): {\n sections: Array<{ fields: string[] }>;\n } {\n try {\n if (typeof generateFieldOrdering === 'function') {\n const ordering = generateFieldOrdering(schema as ZodSchemaWithRender);\n // Convert to expected format\n const sections = Object.values(ordering.sections).map((section) => ({\n fields: section.fields,\n }));\n return { sections };\n }\n } catch (error) {\n this.logger.warn('Could not generate field ordering:', error);\n }\n return { sections: [] };\n }\n\n /**\n * Generates form fields from schema and validation errors\n */\n private generateFormFields(\n schema: z.ZodSchema,\n extractedConfig: ExtractedRenderConfig,\n missingFields: Set<string>,\n fieldOrdering: { sections: Array<{ fields: string[] }> }\n ): FormField[] {\n const fields: FormField[] = [];\n\n // Determine field priority for progressive disclosure\n const getFieldPriority = (\n name: string\n ): 'essential' | 'common' | 'advanced' | 'expert' => {\n const essentialFields = [\n 'tokenSymbol',\n 'treasuryAccountId',\n 'maxSupply',\n 'tokenName',\n 'name',\n 'description',\n 'contentRef',\n ];\n const commonFields = ['creator', 'type', 'fileStandard', 'supplyType'];\n const expertFields = [\n 'apiKey',\n 'chunkSize',\n 'timeoutMs',\n 'quoteOnly',\n 'waitForConfirmation',\n ];\n\n if (essentialFields.includes(name)) return 'essential';\n if (commonFields.includes(name)) return 'common';\n if (expertFields.includes(name)) return 'expert';\n\n // Keys and technical fields are advanced\n if (\n name.toLowerCase().includes('key') ||\n name.includes('Period') ||\n name.includes('Fees') ||\n name.includes('autoRenew')\n ) {\n return 'advanced';\n }\n\n return 'advanced'; // Default to advanced for unknown fields\n };\n\n // For progressive disclosure, include only required fields and essential fields that are missing\n const allSchemaFields = this.extractFieldsFromSchema(schema);\n const fieldsToInclude = new Set<string>();\n\n allSchemaFields.forEach((fieldName) => {\n const priority = getFieldPriority(fieldName);\n const isRequired = this.isFieldRequired(schema, fieldName);\n\n // Include field if it's missing and required, or if it's essential (so users see key fields)\n if (\n (missingFields.has(fieldName) && isRequired) ||\n priority === 'essential'\n ) {\n fieldsToInclude.add(fieldName);\n }\n });\n\n // If we have field ordering from render configs, use that first\n if (fieldOrdering.sections.length > 0) {\n const orderedFieldNames = fieldOrdering.sections.flatMap((s) => s.fields);\n\n orderedFieldNames.forEach((fieldName) => {\n if (fieldsToInclude.has(fieldName)) {\n const field = this.createFormField(\n fieldName,\n extractedConfig.fields[fieldName],\n schema,\n fieldName\n );\n if (field) {\n fields.push(field);\n }\n }\n });\n }\n\n // Add any remaining fields not in ordering\n fieldsToInclude.forEach((fieldName) => {\n // Don't duplicate fields already added\n if (!fields.some((f) => f.name === fieldName)) {\n const field = this.createFormField(\n fieldName,\n extractedConfig.fields[fieldName],\n schema,\n fieldName\n );\n if (field) {\n fields.push(field);\n }\n }\n });\n\n // If still no fields (shouldn't happen), fall back to missing fields\n if (fields.length === 0) {\n missingFields.forEach((fieldName) => {\n const field = this.createFormField(\n fieldName,\n extractedConfig.fields[fieldName],\n schema,\n fieldName\n );\n if (field) {\n fields.push(field);\n }\n });\n }\n\n return fields;\n }\n\n /**\n * Creates a single form field\n */\n private createFormField(\n fieldName: string,\n renderConfig?: RenderConfigSchema,\n schema?: z.ZodSchema,\n fieldPath?: string\n ): FormField {\n const type = this.mapFieldType(renderConfig?.fieldType, schema, fieldPath);\n\n // Determine field priority for progressive disclosure\n const getFieldPriority = (\n name: string\n ): 'essential' | 'common' | 'advanced' | 'expert' => {\n const essentialFields = [\n 'tokenSymbol',\n 'treasuryAccountId',\n 'maxSupply',\n 'tokenName',\n 'name',\n 'description',\n 'contentRef',\n ];\n const commonFields = ['creator', 'type', 'fileStandard', 'supplyType'];\n const expertFields = [\n 'apiKey',\n 'chunkSize',\n 'timeoutMs',\n 'quoteOnly',\n 'waitForConfirmation',\n ];\n\n if (essentialFields.includes(name)) return 'essential';\n if (commonFields.includes(name)) return 'common';\n if (expertFields.includes(name)) return 'expert';\n\n // Keys and technical fields are advanced\n if (\n name.toLowerCase().includes('key') ||\n name.includes('Period') ||\n name.includes('Fees') ||\n name.includes('autoRenew')\n ) {\n return 'advanced';\n }\n\n return 'advanced'; // Default to advanced for unknown fields\n };\n\n // Determine if field is required from schema\n const isRequired = this.isFieldRequired(schema, fieldPath || fieldName);\n\n const field: FormField = {\n name: fieldName,\n label: renderConfig?.ui?.label || this.humanizeFieldName(fieldName),\n type,\n required: isRequired,\n priority: getFieldPriority(fieldName),\n };\n\n if (renderConfig) {\n field.renderConfig = renderConfig;\n }\n\n if (renderConfig?.ui?.placeholder) {\n field.placeholder = renderConfig.ui.placeholder;\n }\n\n if (renderConfig?.ui?.helpText) {\n field.helpText = renderConfig.ui.helpText;\n }\n\n if (renderConfig?.constraints) {\n const validation: Record<string, unknown> = {};\n if (renderConfig.constraints.min !== undefined)\n validation.min = renderConfig.constraints.min;\n if (renderConfig.constraints.max !== undefined)\n validation.max = renderConfig.constraints.max;\n if (renderConfig.constraints.minLength !== undefined)\n validation.minLength = renderConfig.constraints.minLength;\n if (renderConfig.constraints.maxLength !== undefined)\n validation.maxLength = renderConfig.constraints.maxLength;\n if (renderConfig.constraints.pattern !== undefined)\n validation.pattern = renderConfig.constraints.pattern;\n\n if (Object.keys(validation).length > 0) {\n field.validation = validation;\n }\n }\n\n if (renderConfig?.options) {\n field.options = renderConfig.options.map((opt) => ({\n value: String(opt.value),\n label: opt.label,\n ...(opt.disabled !== undefined && { disabled: opt.disabled }),\n }));\n }\n\n return field;\n }\n\n /**\n * Maps render config field type to form field type with fallback inference\n */\n private mapFieldType(\n fieldType?: string,\n schema?: z.ZodSchema,\n fieldPath?: string\n ): FormFieldType {\n // First try schema inference if no explicit fieldType\n if (!fieldType && schema && fieldPath) {\n const inferredType = this.inferTypeFromSchema(schema, fieldPath);\n if (inferredType) {\n return inferredType;\n }\n }\n\n // If no fieldType and schema inference failed, use registry pattern detection\n if (!fieldType && fieldPath) {\n const registryType = fieldTypeRegistry.detectType(fieldPath);\n if (registryType) {\n return registryType;\n }\n }\n\n if (!fieldType) {\n return 'text';\n }\n\n const normalizedType = fieldType.toLowerCase();\n\n if (['text', 'string'].includes(normalizedType)) return 'text';\n if (['number', 'integer', 'float', 'decimal'].includes(normalizedType))\n return 'number';\n if (['select', 'enum', 'dropdown'].includes(normalizedType))\n return 'select';\n if (['checkbox', 'boolean', 'bool'].includes(normalizedType))\n return 'checkbox';\n if (['textarea', 'longtext', 'multiline'].includes(normalizedType))\n return 'textarea';\n if (['file', 'upload', 'attachment'].includes(normalizedType))\n return 'file';\n if (['array', 'list'].includes(normalizedType)) return 'array';\n if (['object', 'json'].includes(normalizedType)) return 'object';\n if (['currency', 'money', 'price'].includes(normalizedType))\n return 'currency';\n if (['percentage', 'percent'].includes(normalizedType)) return 'percentage';\n\n return 'text';\n }\n\n /**\n * Converts field name to human-readable label\n */\n private humanizeFieldName(fieldName: string): string {\n return fieldName\n .replace(/([A-Z])/g, ' $1')\n .replace(/_/g, ' ')\n .replace(/\\./g, ' ')\n .trim()\n .split(' ')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n }\n\n /**\n * Generates a title for the form\n */\n private generateFormTitle(toolName: string): string {\n const cleanName = toolName\n .replace(/Tool$/, '')\n .replace(/Hedera/g, '')\n .replace(/([A-Z])/g, ' $1')\n .trim();\n\n return `Complete ${cleanName} Information`;\n }\n\n /**\n * Extracts field names from Zod schema structure\n */\n private extractFieldsFromSchema(schema: z.ZodSchema): string[] {\n const fields: string[] = [];\n\n try {\n if (schema && (schema as any)._def) {\n const def = (schema as any)._def;\n\n if (def.typeName === 'ZodObject' && def.shape) {\n fields.push(...Object.keys(def.shape));\n } else if (def.typeName === 'ZodUnion' && def.options) {\n // For unions, try to extract from the first option\n const firstOption = def.options[0];\n if (firstOption && firstOption._def && firstOption._def.shape) {\n fields.push(...Object.keys(firstOption._def.shape));\n }\n }\n }\n } catch (error) {\n this.logger.debug(\n 'Could not extract fields from schema structure:',\n error\n );\n }\n\n return fields;\n }\n\n /**\n * Infers field type from Zod schema\n */\n private inferTypeFromSchema(\n schema: z.ZodSchema,\n fieldPath: string\n ): FormFieldType | null {\n try {\n const def = (schema as any)._def;\n\n if (def && def.typeName === 'ZodObject') {\n let shape;\n if (typeof def.shape === 'function') {\n shape = def.shape();\n } else {\n shape = def.shape;\n }\n\n if (shape) {\n let fieldSchema = shape[fieldPath];\n\n // Handle optional fields by unwrapping ZodOptional\n if (\n fieldSchema &&\n fieldSchema._def &&\n fieldSchema._def.typeName === 'ZodOptional'\n ) {\n fieldSchema = fieldSchema._def.innerType;\n }\n\n if (fieldSchema && fieldSchema._def) {\n const fieldTypeName = fieldSchema._def.typeName;\n\n switch (fieldTypeName) {\n case 'ZodString':\n // Check for special string patterns\n if (\n fieldPath.toLowerCase().includes('memo') ||\n fieldPath.toLowerCase().includes('description')\n ) {\n return 'textarea';\n }\n return 'text';\n case 'ZodNumber':\n // Check for special number patterns\n if (fieldPath.toLowerCase().includes('percent')) {\n return 'percentage';\n }\n if (\n fieldPath.toLowerCase().includes('price') ||\n fieldPath.toLowerCase().includes('cost')\n ) {\n return 'currency';\n }\n return 'number';\n case 'ZodBoolean':\n return 'checkbox';\n case 'ZodEnum':\n case 'ZodNativeEnum':\n return 'select';\n case 'ZodArray':\n return 'array';\n case 'ZodObject':\n return 'object';\n default:\n return 'text';\n }\n }\n }\n }\n } catch (error) {\n this.logger.debug('Could not infer type from schema:', error);\n }\n return null;\n }\n\n /**\n * Determines if a field is required based on the Zod schema\n */\n private isFieldRequired(schema?: z.ZodSchema, fieldPath?: string): boolean {\n if (!schema || !fieldPath) {\n return false; // If we can't determine, assume optional\n }\n\n try {\n const def = (schema as any)._def;\n\n if (def && def.typeName === 'ZodObject') {\n let shape;\n if (typeof def.shape === 'function') {\n shape = def.shape();\n } else {\n shape = def.shape;\n }\n\n if (shape && shape[fieldPath]) {\n const fieldSchema = shape[fieldPath];\n\n // Check if field is wrapped in ZodOptional\n if (\n fieldSchema &&\n fieldSchema._def &&\n fieldSchema._def.typeName === 'ZodOptional'\n ) {\n return false; // Optional field\n }\n\n // Check if field has a default value (making it effectively optional)\n if (\n fieldSchema &&\n fieldSchema._def &&\n fieldSchema._def.defaultValue !== undefined\n ) {\n return false; // Has default, so optional\n }\n\n // Check for ZodDefault wrapper\n if (\n fieldSchema &&\n fieldSchema._def &&\n fieldSchema._def.typeName === 'ZodDefault'\n ) {\n return false; // Has default, so optional\n }\n\n return true; // Required field\n }\n }\n } catch (error) {\n this.logger.debug(\n `Could not determine if field ${fieldPath} is required:`,\n error\n );\n }\n\n return false; // Default to optional if we can't determine\n }\n\n /**\n * Generates a description for the form\n */\n private generateFormDescription(\n toolName: string,\n fieldCount: number\n ): string {\n if (fieldCount === 0) {\n return 'Please provide the required information to continue with your request.';\n }\n\n return `Please provide the following ${fieldCount} required field${\n fieldCount !== 1 ? 's' : ''\n } to continue with your request.`;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index18.js","sources":["../../src/forms/form-generator.ts"],"sourcesContent":["import { z, ZodError } from 'zod';\nimport { zodToJsonSchema } from 'zod-to-json-schema';\nimport type {\n FormConfig,\n FormField,\n ValidationError,\n FormMessage,\n FormFieldType,\n} from './types';\nimport {\n extractRenderConfigs,\n generateFieldOrdering,\n type RenderConfigSchema,\n type ZodSchemaWithRender,\n type ExtractedRenderConfig,\n} from '@hashgraphonline/standards-agent-kit';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport { fieldTypeRegistry } from './field-type-registry';\n\ntype FieldPriority = 'essential' | 'common' | 'advanced' | 'expert';\n\n/**\n * Generates forms from Zod validation failures\n */\nexport class FormGenerator {\n private logger: Logger;\n\n constructor() {\n this.logger = new Logger({ module: 'FormGenerator' });\n }\n\n /**\n * Creates a form message from a Zod validation error\n * @param error The Zod validation error\n * @param schema The original Zod schema\n * @param toolName Name of the tool that failed validation\n * @param originalPrompt The user's original request\n * @returns FormMessage to send to the chat UI\n */\n generateFormFromError(\n error: ZodError,\n schema: z.ZodSchema,\n toolName: string,\n originalPrompt: string\n ): FormMessage {\n const validationErrors = this.extractValidationErrors(error);\n const missingFields = this.identifyMissingFields(validationErrors, schema);\n const formConfig = this.createFormConfig(schema, missingFields, toolName);\n\n return {\n type: 'form',\n id: `form_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n formConfig,\n originalPrompt,\n toolName,\n validationErrors,\n };\n }\n\n /**\n * Generates a form from a schema and partial input\n * @param schema The Zod schema to generate a form from\n * @param partialInput Any partial input already provided\n * @param context Additional context about the tool\n * @param preCalculatedMissingFields Optional pre-calculated missing fields set. If undefined, includes all fields from schema.\n * @returns FormMessage to send to the chat UI\n */\n async generateFormFromSchema(\n schema: z.ZodSchema,\n partialInput: unknown,\n context: { toolName: string; toolDescription?: string },\n preCalculatedMissingFields?: Set<string>\n ): Promise<FormMessage> {\n let missingFields: Set<string>;\n\n this.logger.info(`🏁 FormGenerator.generateFormFromSchema starting`, {\n toolName: context.toolName,\n partialInput,\n hasSchema: !!schema,\n hasShape: !!(schema && (schema as any).shape),\n hasPreCalculatedFields: preCalculatedMissingFields !== undefined,\n preCalculatedFieldsSize: preCalculatedMissingFields?.size || 0,\n });\n\n if (preCalculatedMissingFields !== undefined) {\n missingFields = preCalculatedMissingFields;\n this.logger.info(`📋 Using pre-calculated missing fields`, {\n missingFieldsCount: missingFields.size,\n missingFields: Array.from(missingFields),\n });\n } else {\n missingFields = new Set<string>();\n\n const zodObject = this.extractZodObject(schema);\n if (zodObject) {\n const shape = zodObject.shape;\n for (const fieldName of Object.keys(shape)) {\n missingFields.add(fieldName);\n this.logger.info(\n `⭐ Including all fields from focused schema: ${fieldName}`\n );\n }\n }\n\n this.logger.info(`📋 Using ALL fields from focused schema`, {\n totalFields: zodObject ? Object.keys(zodObject.shape).length : 0,\n missingFieldsCount: missingFields.size,\n missingFields: Array.from(missingFields),\n });\n }\n\n const formConfig = this.createFormConfig(\n schema,\n missingFields,\n context.toolName,\n preCalculatedMissingFields\n );\n\n return {\n type: 'form',\n id: `form_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n formConfig,\n originalPrompt: context.toolDescription || `Complete ${context.toolName}`,\n toolName: context.toolName,\n validationErrors: [],\n };\n }\n\n /**\n * Extracts validation errors from ZodError\n */\n private extractValidationErrors(error: ZodError): ValidationError[] {\n return error.issues.map((issue) => ({\n path: issue.path.map((p) => String(p)),\n message: issue.message,\n code: issue.code,\n }));\n }\n\n /**\n * Identifies which fields are missing or invalid from validation errors\n */\n private identifyMissingFields(\n errors: ValidationError[],\n _schema: z.ZodSchema\n ): Set<string> {\n const missingFields = new Set<string>();\n\n errors.forEach((error) => {\n const fieldPath = error.path.join('.');\n if (fieldPath) {\n missingFields.add(fieldPath);\n }\n });\n\n return missingFields;\n }\n\n /**\n * Creates form configuration from schema\n */\n private createFormConfig(\n schema: z.ZodSchema,\n missingFields: Set<string>,\n toolName: string,\n preCalculatedMissingFields?: Set<string>\n ): FormConfig {\n const extractedConfig = this.extractRenderConfigsSafely(schema);\n const fieldOrdering = this.generateFieldOrderingSafely(schema);\n const fields = this.generateFormFields(\n schema,\n extractedConfig,\n missingFields,\n fieldOrdering,\n preCalculatedMissingFields\n );\n\n return {\n title: this.generateFormTitle(toolName),\n description: this.generateFormDescription(toolName, missingFields.size),\n fields,\n submitLabel: 'Continue',\n cancelLabel: 'Cancel',\n metadata: {\n toolName,\n missingFieldCount: missingFields.size,\n },\n };\n }\n\n /**\n * Safely extracts render configs from schema\n */\n private extractRenderConfigsSafely(\n schema: z.ZodSchema\n ): ExtractedRenderConfig {\n try {\n if (typeof extractRenderConfigs === 'function') {\n return extractRenderConfigs(schema as unknown as ZodSchemaWithRender);\n }\n } catch (error) {\n this.logger.warn('Could not extract render configs:', error);\n }\n return {\n fields: {},\n groups: {},\n order: [],\n metadata: {},\n };\n }\n\n /**\n * Safely generates field ordering from schema\n */\n private generateFieldOrderingSafely(schema: z.ZodSchema): {\n sections: Array<{ fields: string[] }>;\n } {\n try {\n if (typeof generateFieldOrdering === 'function') {\n const ordering = generateFieldOrdering(\n schema as unknown as ZodSchemaWithRender\n );\n\n const sections = Object.values(ordering.sections).map((section) => ({\n fields: section.fields,\n }));\n return { sections };\n }\n } catch (error) {\n this.logger.warn('Could not generate field ordering:', error);\n }\n return { sections: [] };\n }\n\n /**\n * Determines field priority for progressive disclosure\n */\n private getFieldPriority(\n name: string,\n renderConfig?: RenderConfigSchema,\n isRequired?: boolean\n ): FieldPriority {\n if (renderConfig?.ui?.priority) {\n const priority = renderConfig.ui.priority as string;\n if (['essential', 'common', 'advanced', 'expert'].includes(priority)) {\n return priority as FieldPriority;\n }\n }\n\n if (isRequired === true) {\n return 'essential';\n }\n\n const ui = renderConfig?.ui as Record<string, unknown> | undefined;\n if (ui?.advanced === true) {\n return 'advanced';\n }\n\n if (ui?.expert === true) {\n return 'expert';\n }\n\n return 'common';\n }\n\n /**\n * Determines which fields should be included in the form\n */\n private determineFieldsToInclude(\n schema: z.ZodSchema,\n missingFields: Set<string>,\n preCalculatedMissingFields?: Set<string>\n ): Set<string> {\n const fieldsToInclude = new Set<string>();\n\n if (preCalculatedMissingFields === undefined) {\n this.logger.info(\n `⭐ Focused schema mode - including ALL fields from schema`\n );\n const allSchemaFields = this.extractFieldsFromSchema(schema);\n allSchemaFields.forEach((fieldName) => {\n fieldsToInclude.add(fieldName);\n this.logger.info(`✅ Including focused schema field: ${fieldName}`);\n });\n } else if (preCalculatedMissingFields.size > 0) {\n this.logger.info(\n `📋 Using ONLY pre-calculated missing fields (${preCalculatedMissingFields.size} fields)`,\n { fields: Array.from(preCalculatedMissingFields) }\n );\n preCalculatedMissingFields.forEach((fieldName) => {\n fieldsToInclude.add(fieldName);\n this.logger.info(`✅ Including pre-calculated field: ${fieldName}`);\n });\n } else {\n this.logger.info(\n '⚠️ No pre-calculated fields, falling back to schema analysis'\n );\n this.includeRequiredMissingFields(schema, missingFields, fieldsToInclude);\n }\n\n return fieldsToInclude;\n }\n\n /**\n * Includes required fields that are missing\n */\n private includeRequiredMissingFields(\n schema: z.ZodSchema,\n missingFields: Set<string>,\n fieldsToInclude: Set<string>\n ): void {\n const allSchemaFields = this.extractFieldsFromSchema(schema);\n allSchemaFields.forEach((fieldName) => {\n const isRequired = this.isFieldRequired(schema, fieldName);\n const isMissing = missingFields.has(fieldName);\n const shouldInclude = isMissing && isRequired;\n\n this.logger.info(`🔍 FormGenerator field inclusion check: ${fieldName}`, {\n isRequired,\n isMissing,\n shouldInclude,\n });\n\n if (shouldInclude) {\n fieldsToInclude.add(fieldName);\n }\n });\n }\n\n /**\n * Creates form fields from ordered field names\n */\n private createOrderedFields(\n fieldsToInclude: Set<string>,\n fieldOrdering: { sections: Array<{ fields: string[] }> },\n extractedConfig: ExtractedRenderConfig,\n schema: z.ZodSchema\n ): FormField[] {\n const fields: FormField[] = [];\n const processedFields = new Set<string>();\n\n if (fieldOrdering.sections.length > 0) {\n const orderedFieldNames = fieldOrdering.sections.flatMap((s) => s.fields);\n orderedFieldNames.forEach((fieldName) => {\n if (fieldsToInclude.has(fieldName) && !processedFields.has(fieldName)) {\n const field = this.createFormField(\n fieldName,\n extractedConfig.fields[fieldName],\n schema,\n fieldName\n );\n if (field) {\n fields.push(field);\n processedFields.add(fieldName);\n }\n }\n });\n }\n\n fieldsToInclude.forEach((fieldName) => {\n if (!processedFields.has(fieldName)) {\n const field = this.createFormField(\n fieldName,\n extractedConfig.fields[fieldName],\n schema,\n fieldName\n );\n if (field) {\n fields.push(field);\n }\n }\n });\n\n return fields;\n }\n\n /**\n * Generates form fields from schema and validation errors\n */\n private generateFormFields(\n schema: z.ZodSchema,\n extractedConfig: ExtractedRenderConfig,\n missingFields: Set<string>,\n fieldOrdering: { sections: Array<{ fields: string[] }> },\n preCalculatedMissingFields?: Set<string>\n ): FormField[] {\n const fieldsToInclude = this.determineFieldsToInclude(\n schema,\n missingFields,\n preCalculatedMissingFields\n );\n\n let fields = this.createOrderedFields(\n fieldsToInclude,\n fieldOrdering,\n extractedConfig,\n schema\n );\n\n if (fields.length === 0 && missingFields.size > 0) {\n fields = Array.from(missingFields)\n .map((fieldName) =>\n this.createFormField(\n fieldName,\n extractedConfig.fields[fieldName],\n schema,\n fieldName\n )\n )\n .filter(\n (field): field is FormField => field !== null && field !== undefined\n );\n }\n\n return fields;\n }\n\n /**\n * Creates a single form field\n */\n private createFormField(\n fieldName: string,\n renderConfig?: RenderConfigSchema,\n schema?: z.ZodSchema,\n fieldPath?: string\n ): FormField {\n const type = this.mapFieldType(renderConfig?.fieldType, schema, fieldPath);\n const isRequired = this.isFieldRequired(schema, fieldPath || fieldName);\n\n const field: FormField = {\n name: fieldName,\n label: renderConfig?.ui?.label || this.humanizeFieldName(fieldName),\n type,\n required: isRequired,\n priority: this.getFieldPriority(fieldName, renderConfig, isRequired),\n };\n\n if (renderConfig) {\n field.renderConfig = renderConfig;\n }\n\n if (renderConfig?.ui?.placeholder) {\n field.placeholder = renderConfig.ui.placeholder;\n }\n\n if (renderConfig?.ui?.helpText) {\n field.helpText = renderConfig.ui.helpText;\n }\n\n if (renderConfig?.constraints) {\n const validation: Record<string, unknown> = {};\n if (renderConfig.constraints.min !== undefined)\n validation.min = renderConfig.constraints.min;\n if (renderConfig.constraints.max !== undefined)\n validation.max = renderConfig.constraints.max;\n if (renderConfig.constraints.minLength !== undefined)\n validation.minLength = renderConfig.constraints.minLength;\n if (renderConfig.constraints.maxLength !== undefined)\n validation.maxLength = renderConfig.constraints.maxLength;\n if (renderConfig.constraints.pattern !== undefined)\n validation.pattern = renderConfig.constraints.pattern;\n\n if (Object.keys(validation).length > 0) {\n field.validation = validation;\n }\n }\n\n if (renderConfig?.options) {\n field.options = renderConfig.options.map((opt) => ({\n value: String(opt.value),\n label: opt.label,\n ...(opt.disabled !== undefined && { disabled: opt.disabled }),\n }));\n }\n\n return field;\n }\n\n /**\n * Maps render config field type to form field type with fallback inference\n */\n private mapFieldType(\n fieldType?: string,\n schema?: z.ZodSchema,\n fieldPath?: string\n ): FormFieldType {\n if (!fieldType && schema && fieldPath) {\n const inferredType = this.inferTypeFromSchema(schema, fieldPath);\n if (inferredType) {\n return inferredType;\n }\n }\n\n if (!fieldType && fieldPath) {\n const registryType = fieldTypeRegistry.detectType(fieldPath);\n if (registryType) {\n return registryType;\n }\n }\n\n if (!fieldType) {\n return 'text';\n }\n\n const normalizedType = fieldType.toLowerCase();\n\n if (['text', 'string'].includes(normalizedType)) return 'text';\n if (['number', 'integer', 'float', 'decimal'].includes(normalizedType))\n return 'number';\n if (['select', 'enum', 'dropdown'].includes(normalizedType))\n return 'select';\n if (['checkbox', 'boolean', 'bool'].includes(normalizedType))\n return 'checkbox';\n if (['textarea', 'longtext', 'multiline'].includes(normalizedType))\n return 'textarea';\n if (['file', 'upload', 'attachment'].includes(normalizedType))\n return 'file';\n if (['array', 'list'].includes(normalizedType)) return 'array';\n if (['object', 'json'].includes(normalizedType)) return 'object';\n if (['currency', 'money', 'price'].includes(normalizedType))\n return 'currency';\n if (['percentage', 'percent'].includes(normalizedType)) return 'percentage';\n\n return 'text';\n }\n\n /**\n * Converts field name to human-readable label\n */\n private humanizeFieldName(fieldName: string): string {\n return fieldName\n .replace(/([A-Z])/g, ' $1')\n .replace(/_/g, ' ')\n .replace(/\\./g, ' ')\n .trim()\n .split(' ')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n }\n\n /**\n * Generates a title for the form\n */\n private generateFormTitle(toolName: string): string {\n const cleanName = toolName\n .replace(/Tool$/, '')\n .replace(/Hedera/g, '')\n .replace(/([A-Z])/g, ' $1')\n .trim();\n\n return `Complete ${cleanName} Information`;\n }\n\n /**\n * Safely extracts ZodObject from a schema, returns null if not an object schema\n */\n private extractZodObject(\n schema: z.ZodSchema\n ): z.ZodObject<z.ZodRawShape> | null {\n try {\n const def = (schema as z.ZodType)._def as { typeName?: string };\n if (def && def.typeName === 'ZodObject') {\n return schema as z.ZodObject<z.ZodRawShape>;\n }\n } catch (error) {\n this.logger.debug('Could not extract ZodObject from schema:', error);\n }\n return null;\n }\n\n /**\n * Extracts field names from Zod schema structure\n */\n private extractFieldsFromSchema(schema: z.ZodSchema): string[] {\n const fields: string[] = [];\n\n const zodObject = this.extractZodObject(schema);\n if (zodObject) {\n fields.push(...Object.keys(zodObject.shape));\n return fields;\n }\n\n try {\n const def = (schema as z.ZodType)._def as {\n typeName?: string;\n options?: z.ZodType[];\n };\n if (def && def.typeName === 'ZodUnion' && def.options) {\n const firstOption = def.options[0];\n const firstOptionObject = this.extractZodObject(firstOption);\n if (firstOptionObject) {\n fields.push(...Object.keys(firstOptionObject.shape));\n }\n }\n } catch (error) {\n this.logger.debug(\n 'Could not extract fields from schema structure:',\n error\n );\n }\n\n return fields;\n }\n\n /**\n * Infers field type from Zod schema\n */\n private inferTypeFromSchema(\n schema: z.ZodSchema,\n fieldPath: string\n ): FormFieldType | null {\n try {\n const zodObject = this.extractZodObject(schema);\n if (!zodObject) return null;\n\n const shape = zodObject.shape;\n if (!shape) return null;\n\n let fieldSchema = shape[fieldPath] as z.ZodType | undefined;\n if (!fieldSchema) return null;\n\n const fieldDef = fieldSchema._def as {\n typeName?: string;\n innerType?: z.ZodType;\n };\n if (\n fieldDef &&\n fieldDef.typeName === 'ZodOptional' &&\n fieldDef.innerType\n ) {\n fieldSchema = fieldDef.innerType;\n }\n\n if (!fieldSchema || !fieldSchema._def) return null;\n\n const typeDef = fieldSchema._def as { typeName?: string };\n const fieldTypeName = typeDef.typeName;\n const lowerPath = fieldPath.toLowerCase();\n\n switch (fieldTypeName) {\n case 'ZodString':\n if (lowerPath.includes('memo') || lowerPath.includes('description')) {\n return 'textarea';\n }\n return 'text';\n case 'ZodNumber':\n if (lowerPath.includes('percent')) {\n return 'percentage';\n }\n if (lowerPath.includes('price') || lowerPath.includes('cost')) {\n return 'currency';\n }\n return 'number';\n case 'ZodBoolean':\n return 'checkbox';\n case 'ZodEnum':\n case 'ZodNativeEnum':\n return 'select';\n case 'ZodArray':\n return 'array';\n case 'ZodObject':\n return 'object';\n default:\n return 'text';\n }\n } catch (error) {\n this.logger.debug('Could not infer type from schema:', error);\n }\n return null;\n }\n\n /**\n * Determines if a field is required based on the Zod schema\n */\n private isFieldRequired(schema?: z.ZodSchema, fieldPath?: string): boolean {\n if (!schema || !fieldPath) {\n return false;\n }\n\n try {\n const zodObject = this.extractZodObject(schema);\n if (!zodObject) return false;\n\n const shape = zodObject.shape;\n if (!shape || !shape[fieldPath]) return false;\n\n const fieldSchema = shape[fieldPath] as z.ZodType;\n if (!fieldSchema || !fieldSchema._def) return true;\n\n const fieldDef = fieldSchema._def as {\n typeName?: string;\n defaultValue?: unknown;\n };\n const typeName = fieldDef.typeName;\n\n if (typeName === 'ZodOptional') {\n return false;\n }\n\n if (typeName === 'ZodDefault') {\n return false;\n }\n\n if (fieldDef.defaultValue !== undefined) {\n return false;\n }\n\n return true;\n } catch (error) {\n this.logger.debug(\n `Could not determine if field ${fieldPath} is required:`,\n error\n );\n }\n\n return false;\n }\n\n /**\n * Generates a description for the form\n */\n private generateFormDescription(\n toolName: string,\n fieldCount: number\n ): string {\n if (fieldCount === 0) {\n return 'Please provide the required information to continue with your request.';\n }\n\n return `Please provide the following ${fieldCount} required field${\n fieldCount !== 1 ? 's' : ''\n } to continue with your request.`;\n }\n\n /**\n * Generates JSON Schema and uiSchema from a Zod schema for use with @rjsf/core\n * @param zodSchema The Zod schema to convert\n * @param partialInput Existing input data to filter out fields that already have values\n * @param missingFields Set of fields that are missing and should be shown\n * @returns Object containing jsonSchema and uiSchema\n */\n public generateJsonSchemaForm(\n zodSchema: z.ZodObject<z.ZodRawShape>,\n partialInput?: Record<string, unknown>,\n missingFields?: Set<string>\n ) {\n const fullJsonSchema = zodToJsonSchema(zodSchema, {\n target: 'jsonSchema7',\n });\n\n const uiSchema: Record<string, Record<string, unknown>> = {};\n\n let jsonSchema = fullJsonSchema;\n if (missingFields && missingFields.size > 0) {\n const fullSchemaAsObject = fullJsonSchema as {\n properties?: Record<string, unknown>;\n required?: string[];\n [key: string]: unknown;\n };\n if (\n fullSchemaAsObject.properties &&\n typeof fullSchemaAsObject.properties === 'object'\n ) {\n const filteredSchema = {\n ...fullSchemaAsObject,\n type: 'object' as const,\n properties: {} as Record<string, unknown>,\n required: [] as string[],\n };\n\n let fieldsAdded = 0;\n missingFields.forEach((fieldName) => {\n if (\n fullSchemaAsObject.properties &&\n fullSchemaAsObject.properties[fieldName]\n ) {\n filteredSchema.properties[fieldName] =\n fullSchemaAsObject.properties[fieldName];\n fieldsAdded++;\n }\n });\n\n if (Array.isArray(fullSchemaAsObject.required)) {\n filteredSchema.required = fullSchemaAsObject.required.filter(\n (field: string) => missingFields.has(field)\n );\n }\n\n if (fieldsAdded > 0) {\n jsonSchema = filteredSchema;\n }\n }\n }\n\n const fieldNames = this.extractFieldsFromSchema(zodSchema);\n\n fieldNames.forEach((fieldName) => {\n const isRequired = this.isFieldRequired(zodSchema, fieldName);\n const priority = this.getFieldPriority(fieldName, undefined, isRequired);\n const lower = fieldName.toLowerCase();\n\n if (\n lower === 'attributes' ||\n lower === 'metadata' ||\n lower === 'properties'\n ) {\n uiSchema[fieldName] = {\n 'ui:options': {\n collapsible: true,\n collapsed: true,\n },\n };\n }\n\n switch (priority) {\n case 'essential':\n if (isRequired) {\n uiSchema[fieldName] = {\n ...uiSchema[fieldName],\n 'ui:help': 'Required field',\n };\n }\n break;\n case 'advanced':\n case 'expert':\n uiSchema[fieldName] = {\n ...uiSchema[fieldName],\n 'ui:options': {\n ...(uiSchema[fieldName]?.['ui:options'] as\n | Record<string, unknown>\n | undefined),\n collapsed: true,\n },\n };\n break;\n }\n });\n\n return { jsonSchema, uiSchema };\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { StructuredTool } from "@langchain/core/tools";
2
2
  import { z } from "zod";
3
3
  import { Logger } from "@hashgraphonline/standards-sdk";
4
+ import { isFormValidatable } from "@hashgraphonline/standards-agent-kit";
4
5
  class FormValidatingToolWrapper extends StructuredTool {
5
6
  constructor(originalTool, formGenerator, config = {}) {
6
7
  super();
@@ -11,28 +12,11 @@ class FormValidatingToolWrapper extends StructuredTool {
11
12
  this.name = originalTool.name;
12
13
  this.description = originalTool.description;
13
14
  this.schema = originalTool.schema;
14
- }
15
- /**
16
- * Check if input has missing required fields based on schema
17
- */
18
- checkMissingFields(input) {
19
- const missingFields = [];
20
- const schemaShape = this.schema.shape;
21
- if (!schemaShape) return missingFields;
22
- for (const [fieldName, fieldSchema] of Object.entries(schemaShape)) {
23
- if (this.validationConfig.skipFields?.includes(fieldName)) {
24
- continue;
25
- }
26
- const fieldDef = fieldSchema._def;
27
- const isOptional = typeof fieldSchema.isOptional === "function" ? fieldSchema.isOptional() : fieldDef?.typeName === "ZodOptional";
28
- if (!isOptional) {
29
- const value = input[fieldName];
30
- if (value === void 0 || value === null || value === "") {
31
- missingFields.push(fieldName);
32
- }
33
- }
34
- }
35
- return missingFields;
15
+ this.logger.info(`🔧 FormValidatingToolWrapper created for tool: ${this.name}`, {
16
+ originalToolName: originalTool.name,
17
+ originalToolType: originalTool.constructor.name,
18
+ wrapperType: this.constructor.name
19
+ });
36
20
  }
37
21
  /**
38
22
  * Validate the input against the schema
@@ -52,6 +36,123 @@ class FormValidatingToolWrapper extends StructuredTool {
52
36
  return { isValid: false, errors: ["Validation failed"] };
53
37
  }
54
38
  }
39
+ /**
40
+ * Gets the shape keys from the schema if it's a ZodObject
41
+ */
42
+ getSchemaShape() {
43
+ if (this.isZodObject(this.schema)) {
44
+ return Object.keys(this.schema.shape);
45
+ }
46
+ return [];
47
+ }
48
+ /**
49
+ * Executes the wrapped tool's original implementation directly, bypassing wrapper logic.
50
+ */
51
+ async executeOriginal(input, runManager) {
52
+ const tool = this.originalTool;
53
+ if ("_call" in tool && typeof tool._call === "function") {
54
+ return tool._call(input, runManager);
55
+ }
56
+ if ("call" in tool && typeof tool.call === "function") {
57
+ return tool.call(input, runManager);
58
+ }
59
+ throw new Error("Original tool has no callable implementation");
60
+ }
61
+ /**
62
+ * Provides access to the wrapped tool instance for executors that want to bypass the wrapper.
63
+ */
64
+ getOriginalTool() {
65
+ return this.originalTool;
66
+ }
67
+ /**
68
+ * Checks if tool implements FormValidatable method
69
+ */
70
+ hasFormValidatableMethod(tool, methodName) {
71
+ return tool !== null && typeof tool === "object" && methodName in tool && typeof tool[methodName] === "function";
72
+ }
73
+ /**
74
+ * Expose FormValidatable methods by delegating to the underlying tool when available.
75
+ */
76
+ getFormSchema() {
77
+ if (this.hasFormValidatableMethod(this.originalTool, "getFormSchema")) {
78
+ return this.originalTool.getFormSchema();
79
+ }
80
+ return this.schema;
81
+ }
82
+ getEssentialFields() {
83
+ if (this.hasFormValidatableMethod(this.originalTool, "getEssentialFields")) {
84
+ return this.originalTool.getEssentialFields();
85
+ }
86
+ return [];
87
+ }
88
+ isFieldEmpty(fieldName, value) {
89
+ if (this.hasFormValidatableMethod(this.originalTool, "isFieldEmpty")) {
90
+ return this.originalTool.isFieldEmpty(fieldName, value);
91
+ }
92
+ if (value === void 0 || value === null || value === "") {
93
+ return true;
94
+ }
95
+ if (Array.isArray(value) && value.length === 0) {
96
+ return true;
97
+ }
98
+ return false;
99
+ }
100
+ /**
101
+ * Calculates which fields are missing from the input
102
+ */
103
+ calculateMissingFields(input, isCustom) {
104
+ const missingFields = /* @__PURE__ */ new Set();
105
+ if (!isCustom) {
106
+ return missingFields;
107
+ }
108
+ const essentialFields = this.getEssentialFields();
109
+ for (const fieldName of essentialFields) {
110
+ const value = input[fieldName];
111
+ if (this.isFieldEmpty(fieldName, value)) {
112
+ missingFields.add(fieldName);
113
+ }
114
+ }
115
+ return missingFields;
116
+ }
117
+ /**
118
+ * Creates a form message with optional JSON schema
119
+ */
120
+ async createFormMessage(schema, input, missingFields) {
121
+ let formMessage = await this.formGenerator.generateFormFromSchema(
122
+ schema,
123
+ input,
124
+ {
125
+ toolName: this.name,
126
+ toolDescription: this.description
127
+ },
128
+ missingFields
129
+ );
130
+ if (this.isZodObject(schema)) {
131
+ try {
132
+ const { jsonSchema, uiSchema } = this.formGenerator.generateJsonSchemaForm(
133
+ schema,
134
+ input,
135
+ missingFields
136
+ );
137
+ formMessage = {
138
+ ...formMessage,
139
+ jsonSchema,
140
+ uiSchema
141
+ };
142
+ } catch (error) {
143
+ this.logger.warn("Failed to generate JSON Schema for RJSF:", error);
144
+ }
145
+ }
146
+ formMessage.partialInput = input;
147
+ return formMessage;
148
+ }
149
+ /**
150
+ * Type guard to check if a schema is a ZodObject
151
+ */
152
+ isZodObject(schema) {
153
+ const def = schema._def;
154
+ return !!(def && def.typeName === "ZodObject");
155
+ }
55
156
  /**
56
157
  * Check if we should generate a form for this tool invocation
57
158
  */
@@ -65,38 +166,11 @@ class FormValidatingToolWrapper extends StructuredTool {
65
166
  this.logger.info(`Custom validation result: ${result}`);
66
167
  return result;
67
168
  }
68
- if (this.originalTool.name === "inscribeHashinal") {
69
- this.logger.info("InscribeHashinalTool: Checking all required fields for form generation", {
70
- inputKeys: Object.keys(input),
71
- inputValues: input
72
- });
73
- const validation2 = this.validateInput(input);
74
- this.logger.info("InscribeHashinalTool: Schema validation result", {
75
- isValid: validation2.isValid,
76
- errors: validation2.errors
77
- });
78
- if (!validation2.isValid) {
79
- this.logger.info("InscribeHashinalTool: Schema validation failed, generating form", {
80
- errors: validation2.errors
81
- });
82
- return true;
83
- }
84
- const hasMinimalMetadata = !!(input.name && input.description);
85
- this.logger.info("InscribeHashinalTool: Metadata check", {
86
- hasName: !!input.name,
87
- hasDescription: !!input.description,
88
- hasMinimalMetadata,
89
- nameValue: input.name,
90
- descriptionValue: input.description
91
- });
92
- if (!hasMinimalMetadata) {
93
- this.logger.info("InscribeHashinalTool: Missing minimal metadata (name/description), generating form");
94
- return true;
95
- }
96
- this.logger.info("InscribeHashinalTool: All required fields present, allowing execution");
97
- return false;
169
+ if (isFormValidatable(this.originalTool)) {
170
+ this.logger.info(`Tool ${this.originalTool.name} implements FormValidatable, using custom logic`);
171
+ return this.originalTool.shouldGenerateForm(input);
98
172
  }
99
- this.logger.info(`Non-InscribeHashinal tool (${this.originalTool.name}): Using schema validation only`);
173
+ this.logger.info(`Tool ${this.originalTool.name} using schema validation only`);
100
174
  const validation = this.validateInput(input);
101
175
  this.logger.info(`Schema validation for ${this.originalTool.name}:`, {
102
176
  isValid: validation.isValid,
@@ -104,16 +178,27 @@ class FormValidatingToolWrapper extends StructuredTool {
104
178
  });
105
179
  return !validation.isValid;
106
180
  }
181
+ /**
182
+ * Checks if input has bypass flags that skip form generation
183
+ */
184
+ hasFormBypassFlags(input) {
185
+ return input.__fromForm === true || input.renderForm === false;
186
+ }
107
187
  /**
108
188
  * Override _call to intercept tool execution
109
189
  */
110
190
  async _call(input, runManager) {
111
- this.logger.info(`FormValidatingToolWrapper intercepting ${this.name}`, {
191
+ this.logger.info(`🚨🚨🚨 FormValidatingToolWrapper._call INTERCEPTING ${this.name} 🚨🚨🚨`, {
112
192
  input,
113
- hasRenderConfig: !!this.schema._renderConfig,
114
193
  inputKeys: Object.keys(input),
115
- schemaShape: Object.keys(this.schema?.shape || {})
194
+ schemaShape: this.getSchemaShape(),
195
+ stackTrace: new Error().stack?.split("\n").slice(0, 5)
116
196
  });
197
+ const inputRecord = input;
198
+ if (this.hasFormBypassFlags(inputRecord)) {
199
+ this.logger.info("Bypassing form generation and executing original tool due to submission flags");
200
+ return this.executeOriginal(inputRecord, runManager);
201
+ }
117
202
  const shouldGenerate = this.shouldGenerateForm(input);
118
203
  this.logger.info(`FormValidatingToolWrapper decision for ${this.name}:`, {
119
204
  shouldGenerateForm: shouldGenerate,
@@ -123,15 +208,24 @@ class FormValidatingToolWrapper extends StructuredTool {
123
208
  if (shouldGenerate) {
124
209
  this.logger.info(`Generating form for incomplete input in ${this.name}`);
125
210
  try {
126
- const formMessage = await this.formGenerator.generateFormFromSchema(
127
- this.schema,
211
+ const isCustom = isFormValidatable(this.originalTool);
212
+ const schemaToUse = isCustom ? this.getFormSchema() : this.schema;
213
+ const missingFields = this.calculateMissingFields(
128
214
  input,
129
- {
130
- toolName: this.name,
131
- toolDescription: this.description
132
- }
215
+ isCustom
216
+ );
217
+ const schemaFields = this.isZodObject(schemaToUse) ? Object.keys(schemaToUse.shape) : [];
218
+ this.logger.info(`Using ${isCustom ? "CUSTOM" : "DEFAULT"} schema for form generation`, {
219
+ toolName: this.originalTool.name,
220
+ schemaType: schemaToUse.constructor?.name,
221
+ schemaFields,
222
+ isCustomSchema: isCustom
223
+ });
224
+ const formMessage = await this.createFormMessage(
225
+ schemaToUse,
226
+ input,
227
+ missingFields
133
228
  );
134
- formMessage.partialInput = input;
135
229
  const result = {
136
230
  requiresForm: true,
137
231
  formMessage,
@@ -144,8 +238,7 @@ class FormValidatingToolWrapper extends StructuredTool {
144
238
  }
145
239
  }
146
240
  this.logger.info(`FormValidatingToolWrapper passing through to original tool ${this.name}`);
147
- const tool = this.originalTool;
148
- return tool._call(input, runManager);
241
+ return this.executeOriginal(input, runManager);
149
242
  }
150
243
  }
151
244
  function wrapToolWithFormValidation(tool, formGenerator, config = {}) {
@@ -1 +1 @@
1
- {"version":3,"file":"index19.js","sources":["../../src/langchain/FormValidatingToolWrapper.ts"],"sourcesContent":["import { StructuredTool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport { FormGenerator } from '../forms/form-generator';\nimport type { FormMessage } from '../forms/types';\n\nexport interface FormValidationConfig {\n requireAllFields?: boolean;\n skipFields?: string[];\n customValidation?: (input: unknown) => boolean;\n}\n\n/**\n * Wrapper for StructuredTools that intercepts execution to check for missing required fields\n * and generates forms when validation would benefit from user input\n */\nexport class FormValidatingToolWrapper<\n TSchema extends z.ZodObject<z.ZodRawShape, z.UnknownKeysParam, z.ZodTypeAny>\n> extends StructuredTool<TSchema> {\n private originalTool: StructuredTool<TSchema>;\n private formGenerator: FormGenerator;\n private validationConfig: FormValidationConfig;\n private logger: Logger;\n\n name: string;\n description: string;\n schema: TSchema;\n\n constructor(\n originalTool: StructuredTool<TSchema>,\n formGenerator: FormGenerator,\n config: FormValidationConfig = {}\n ) {\n super();\n this.originalTool = originalTool;\n this.formGenerator = formGenerator;\n this.validationConfig = config;\n this.logger = new Logger({ module: 'FormValidatingToolWrapper' });\n \n this.name = originalTool.name;\n this.description = originalTool.description;\n this.schema = originalTool.schema;\n }\n\n /**\n * Check if input has missing required fields based on schema\n */\n private checkMissingFields(input: Record<string, unknown>): string[] {\n const missingFields: string[] = [];\n const schemaShape = (this.schema as Record<string, unknown>).shape as Record<string, z.ZodTypeAny>;\n \n if (!schemaShape) return missingFields;\n\n for (const [fieldName, fieldSchema] of Object.entries(schemaShape)) {\n if (this.validationConfig.skipFields?.includes(fieldName)) {\n continue;\n }\n\n const fieldDef = (fieldSchema as unknown as Record<string, unknown>)._def as Record<string, unknown>;\n const isOptional = typeof (fieldSchema as unknown as Record<string, unknown>).isOptional === 'function' \n ? (fieldSchema as unknown as { isOptional(): boolean }).isOptional()\n : fieldDef?.typeName === 'ZodOptional';\n \n if (!isOptional) {\n const value = input[fieldName];\n if (value === undefined || value === null || value === '') {\n missingFields.push(fieldName);\n }\n }\n }\n\n return missingFields;\n }\n\n /**\n * Validate the input against the schema\n */\n private validateInput(input: Record<string, unknown>): { isValid: boolean; errors?: string[] } {\n try {\n this.schema.parse(input);\n return { isValid: true };\n } catch (error) {\n if (error instanceof z.ZodError) {\n const errors = error.errors\n .filter(err => {\n const fieldName = err.path[0] as string;\n return !this.validationConfig.skipFields?.includes(fieldName);\n })\n .map(err => `${err.path.join('.')}: ${err.message}`);\n return { isValid: false, errors };\n }\n return { isValid: false, errors: ['Validation failed'] };\n }\n }\n\n /**\n * Check if we should generate a form for this tool invocation\n */\n private shouldGenerateForm(input: Record<string, unknown>): boolean {\n this.logger.info(`shouldGenerateForm called for ${this.name}/${this.originalTool.name}`, {\n input,\n hasCustomValidation: !!this.validationConfig.customValidation\n });\n\n if (this.validationConfig.customValidation) {\n const result = !this.validationConfig.customValidation(input);\n this.logger.info(`Custom validation result: ${result}`);\n return result;\n }\n\n // For InscribeHashinalTool, we want to generate a form if ANY required metadata is missing\n // The original special case was too permissive - it only checked for content source\n // but ignored other required fields like attributes, creator, etc.\n if (this.originalTool.name === 'inscribeHashinal') {\n this.logger.info('InscribeHashinalTool: Checking all required fields for form generation', {\n inputKeys: Object.keys(input),\n inputValues: input\n });\n \n // Check schema validation - if it fails, we need a form\n const validation = this.validateInput(input);\n this.logger.info('InscribeHashinalTool: Schema validation result', {\n isValid: validation.isValid,\n errors: validation.errors\n });\n \n if (!validation.isValid) {\n this.logger.info('InscribeHashinalTool: Schema validation failed, generating form', {\n errors: validation.errors\n });\n return true; // Generate form for missing/invalid fields\n }\n \n // Even if schema validation passes, check for important metadata fields\n // that would benefit from user input for better NFT quality\n const hasMinimalMetadata = !!(input.name && input.description);\n this.logger.info('InscribeHashinalTool: Metadata check', {\n hasName: !!input.name,\n hasDescription: !!input.description,\n hasMinimalMetadata,\n nameValue: input.name,\n descriptionValue: input.description\n });\n \n if (!hasMinimalMetadata) {\n this.logger.info('InscribeHashinalTool: Missing minimal metadata (name/description), generating form');\n return true; // Generate form for better metadata\n }\n \n this.logger.info('InscribeHashinalTool: All required fields present, allowing execution');\n return false; // All good, let tool execute\n }\n\n // For all other tools, simply check if the input is valid according to Zod schema\n // If it fails validation, we need a form\n this.logger.info(`Non-InscribeHashinal tool (${this.originalTool.name}): Using schema validation only`);\n const validation = this.validateInput(input);\n this.logger.info(`Schema validation for ${this.originalTool.name}:`, {\n isValid: validation.isValid,\n errors: validation.errors\n });\n return !validation.isValid;\n }\n\n /**\n * Override _call to intercept tool execution\n */\n protected async _call(\n input: z.infer<TSchema>,\n runManager?: CallbackManagerForToolRun\n ): Promise<string> {\n this.logger.info(`FormValidatingToolWrapper intercepting ${this.name}`, {\n input,\n hasRenderConfig: !!(this.schema as any)._renderConfig,\n inputKeys: Object.keys(input as Record<string, unknown>),\n schemaShape: Object.keys((this.schema as any)?.shape || {})\n });\n\n const shouldGenerate = this.shouldGenerateForm(input as Record<string, unknown>);\n this.logger.info(`FormValidatingToolWrapper decision for ${this.name}:`, {\n shouldGenerateForm: shouldGenerate,\n toolName: this.name,\n originalToolName: this.originalTool.name\n });\n\n if (shouldGenerate) {\n this.logger.info(`Generating form for incomplete input in ${this.name}`);\n \n try {\n const formMessage = await this.formGenerator.generateFormFromSchema(\n this.schema,\n input,\n {\n toolName: this.name,\n toolDescription: this.description\n }\n );\n\n // Store the original partial input in the form message\n // This will be needed when the form is submitted\n formMessage.partialInput = input;\n\n const result = {\n requiresForm: true,\n formMessage,\n message: `Please complete the form to provide the required information for ${this.name}.`\n };\n\n this.logger.info(`FormValidatingToolWrapper returning form result for ${this.name}`);\n return JSON.stringify(result);\n } catch (error) {\n this.logger.error('Failed to generate form:', error);\n }\n }\n\n this.logger.info(`FormValidatingToolWrapper passing through to original tool ${this.name}`);\n const tool = this.originalTool as any;\n return tool._call(input, runManager) as Promise<string>;\n }\n}\n\n/**\n * Wrap a tool with form validation capabilities\n */\nexport function wrapToolWithFormValidation<TSchema extends z.ZodObject<z.ZodRawShape, z.UnknownKeysParam, z.ZodTypeAny>>(\n tool: StructuredTool<TSchema>,\n formGenerator: FormGenerator,\n config: FormValidationConfig = {}\n): FormValidatingToolWrapper<TSchema> {\n return new FormValidatingToolWrapper(tool, formGenerator, config);\n}"],"names":["validation"],"mappings":"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"}
1
+ {"version":3,"file":"index19.js","sources":["../../src/langchain/FormValidatingToolWrapper.ts"],"sourcesContent":["import { StructuredTool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport { FormGenerator } from '../forms/form-generator';\nimport { isFormValidatable } from '@hashgraphonline/standards-agent-kit';\n\nexport interface FormValidationConfig {\n requireAllFields?: boolean;\n skipFields?: string[];\n customValidation?: (input: unknown) => boolean;\n}\n\n/**\n * Generic wrapper for StructuredTools that intercepts execution to check for missing required fields\n * and generates forms when validation would benefit from user input.\n *\n * Tools can implement the FormValidatable interface to provide custom validation logic.\n * Otherwise, falls back to schema-based validation.\n */\nexport class FormValidatingToolWrapper<\n TSchema extends z.ZodObject<z.ZodRawShape, z.UnknownKeysParam, z.ZodTypeAny>\n> extends StructuredTool<TSchema> {\n private originalTool: StructuredTool<TSchema>;\n private formGenerator: FormGenerator;\n private validationConfig: FormValidationConfig;\n private logger: Logger;\n\n name: string;\n description: string;\n schema: TSchema;\n\n constructor(\n originalTool: StructuredTool<TSchema>,\n formGenerator: FormGenerator,\n config: FormValidationConfig = {}\n ) {\n super();\n this.originalTool = originalTool;\n this.formGenerator = formGenerator;\n this.validationConfig = config;\n this.logger = new Logger({ module: 'FormValidatingToolWrapper' });\n\n this.name = originalTool.name;\n this.description = originalTool.description;\n this.schema = originalTool.schema;\n \n this.logger.info(`🔧 FormValidatingToolWrapper created for tool: ${this.name}`, {\n originalToolName: originalTool.name,\n originalToolType: originalTool.constructor.name,\n wrapperType: this.constructor.name\n });\n }\n\n /**\n * Validate the input against the schema\n */\n private validateInput(input: Record<string, unknown>): { isValid: boolean; errors?: string[] } {\n try {\n this.schema.parse(input);\n return { isValid: true };\n } catch (error) {\n if (error instanceof z.ZodError) {\n const errors = error.errors\n .filter(err => {\n const fieldName = err.path[0] as string;\n return !this.validationConfig.skipFields?.includes(fieldName);\n })\n .map(err => `${err.path.join('.')}: ${err.message}`);\n return { isValid: false, errors };\n }\n return { isValid: false, errors: ['Validation failed'] };\n }\n }\n\n /**\n * Gets the shape keys from the schema if it's a ZodObject\n */\n private getSchemaShape(): string[] {\n if (this.isZodObject(this.schema)) {\n return Object.keys(this.schema.shape);\n }\n return [];\n }\n\n /**\n * Executes the wrapped tool's original implementation directly, bypassing wrapper logic.\n */\n public async executeOriginal(\n input: Record<string, unknown>,\n runManager?: CallbackManagerForToolRun\n ): Promise<string> {\n type CallableMethod = (\n args: Record<string, unknown>,\n runManager?: CallbackManagerForToolRun\n ) => Promise<string>;\n \n const tool = this.originalTool as unknown as Record<string, unknown>;\n \n if ('_call' in tool && typeof tool._call === 'function') {\n return (tool._call as CallableMethod)(input, runManager);\n }\n if ('call' in tool && typeof tool.call === 'function') {\n return (tool.call as CallableMethod)(input, runManager);\n }\n throw new Error('Original tool has no callable implementation');\n }\n\n /**\n * Provides access to the wrapped tool instance for executors that want to bypass the wrapper.\n */\n public getOriginalTool(): StructuredTool<TSchema> {\n return this.originalTool;\n }\n\n /**\n * Checks if tool implements FormValidatable method\n */\n private hasFormValidatableMethod<T>(\n tool: unknown,\n methodName: string\n ): tool is Record<string, T> {\n return (\n tool !== null &&\n typeof tool === 'object' &&\n methodName in tool &&\n typeof (tool as Record<string, unknown>)[methodName] === 'function'\n );\n }\n\n /**\n * Expose FormValidatable methods by delegating to the underlying tool when available.\n */\n public getFormSchema(): z.ZodSchema {\n if (this.hasFormValidatableMethod<() => z.ZodSchema>(this.originalTool, 'getFormSchema')) {\n return this.originalTool.getFormSchema();\n }\n return this.schema as z.ZodSchema;\n }\n\n public getEssentialFields(): string[] {\n if (this.hasFormValidatableMethod<() => string[]>(this.originalTool, 'getEssentialFields')) {\n return this.originalTool.getEssentialFields();\n }\n return [];\n }\n\n public isFieldEmpty(fieldName: string, value: unknown): boolean {\n if (this.hasFormValidatableMethod<(n: string, v: unknown) => boolean>(this.originalTool, 'isFieldEmpty')) {\n return this.originalTool.isFieldEmpty(fieldName, value);\n }\n if (value === undefined || value === null || value === '') {\n return true;\n }\n if (Array.isArray(value) && value.length === 0) {\n return true;\n }\n return false;\n }\n\n /**\n * Calculates which fields are missing from the input\n */\n private calculateMissingFields(\n input: Record<string, unknown>,\n isCustom: boolean\n ): Set<string> {\n const missingFields = new Set<string>();\n \n if (!isCustom) {\n return missingFields;\n }\n\n const essentialFields = this.getEssentialFields();\n for (const fieldName of essentialFields) {\n const value = input[fieldName];\n if (this.isFieldEmpty(fieldName, value)) {\n missingFields.add(fieldName);\n }\n }\n \n return missingFields;\n }\n\n /**\n * Creates a form message with optional JSON schema\n */\n private async createFormMessage(\n schema: z.ZodSchema,\n input: Record<string, unknown>,\n missingFields: Set<string>\n ) {\n let formMessage = await this.formGenerator.generateFormFromSchema(\n schema,\n input,\n {\n toolName: this.name,\n toolDescription: this.description\n },\n missingFields\n );\n\n if (this.isZodObject(schema)) {\n try {\n const { jsonSchema, uiSchema } = this.formGenerator.generateJsonSchemaForm(\n schema,\n input,\n missingFields\n );\n formMessage = {\n ...formMessage,\n jsonSchema,\n uiSchema\n };\n } catch (error) {\n this.logger.warn('Failed to generate JSON Schema for RJSF:', error);\n }\n }\n\n formMessage.partialInput = input;\n return formMessage;\n }\n\n /**\n * Type guard to check if a schema is a ZodObject\n */\n private isZodObject(schema: z.ZodSchema): schema is z.ZodObject<z.ZodRawShape> {\n const def = (schema as z.ZodType)._def as { typeName?: string };\n return !!(def && def.typeName === 'ZodObject');\n }\n\n /**\n * Check if we should generate a form for this tool invocation\n */\n private shouldGenerateForm(input: Record<string, unknown>): boolean {\n this.logger.info(`shouldGenerateForm called for ${this.name}/${this.originalTool.name}`, {\n input,\n hasCustomValidation: !!this.validationConfig.customValidation\n });\n\n if (this.validationConfig.customValidation) {\n const result = !this.validationConfig.customValidation(input);\n this.logger.info(`Custom validation result: ${result}`);\n return result;\n }\n\n if (isFormValidatable(this.originalTool)) {\n this.logger.info(`Tool ${this.originalTool.name} implements FormValidatable, using custom logic`);\n return this.originalTool.shouldGenerateForm(input);\n }\n\n this.logger.info(`Tool ${this.originalTool.name} using schema validation only`);\n const validation = this.validateInput(input);\n this.logger.info(`Schema validation for ${this.originalTool.name}:`, {\n isValid: validation.isValid,\n errors: validation.errors\n });\n return !validation.isValid;\n }\n\n /**\n * Checks if input has bypass flags that skip form generation\n */\n private hasFormBypassFlags(input: Record<string, unknown>): boolean {\n return (\n (input.__fromForm === true) ||\n (input.renderForm === false)\n );\n }\n\n /**\n * Override _call to intercept tool execution\n */\n protected async _call(\n input: z.infer<TSchema>,\n runManager?: CallbackManagerForToolRun\n ): Promise<string> {\n this.logger.info(`🚨🚨🚨 FormValidatingToolWrapper._call INTERCEPTING ${this.name} 🚨🚨🚨`, {\n input,\n inputKeys: Object.keys(input as Record<string, unknown>),\n schemaShape: this.getSchemaShape(),\n stackTrace: new Error().stack?.split('\\n').slice(0, 5)\n });\n\n const inputRecord = input as unknown as Record<string, unknown>;\n \n if (this.hasFormBypassFlags(inputRecord)) {\n this.logger.info('Bypassing form generation and executing original tool due to submission flags');\n return this.executeOriginal(inputRecord, runManager);\n }\n\n const shouldGenerate = this.shouldGenerateForm(input as Record<string, unknown>);\n this.logger.info(`FormValidatingToolWrapper decision for ${this.name}:`, {\n shouldGenerateForm: shouldGenerate,\n toolName: this.name,\n originalToolName: this.originalTool.name\n });\n\n if (shouldGenerate) {\n this.logger.info(`Generating form for incomplete input in ${this.name}`);\n\n try {\n const isCustom = isFormValidatable(this.originalTool);\n const schemaToUse = isCustom ? this.getFormSchema() : this.schema;\n const missingFields = this.calculateMissingFields(\n input as Record<string, unknown>,\n isCustom\n );\n\n const schemaFields = this.isZodObject(schemaToUse) \n ? Object.keys(schemaToUse.shape)\n : [];\n \n this.logger.info(`Using ${isCustom ? 'CUSTOM' : 'DEFAULT'} schema for form generation`, {\n toolName: this.originalTool.name,\n schemaType: schemaToUse.constructor?.name,\n schemaFields,\n isCustomSchema: isCustom\n });\n\n const formMessage = await this.createFormMessage(\n schemaToUse,\n input as Record<string, unknown>,\n missingFields\n );\n\n const result = {\n requiresForm: true,\n formMessage,\n message: `Please complete the form to provide the required information for ${this.name}.`\n };\n\n this.logger.info(`FormValidatingToolWrapper returning form result for ${this.name}`);\n return JSON.stringify(result);\n } catch (error) {\n this.logger.error('Failed to generate form:', error);\n }\n }\n\n this.logger.info(`FormValidatingToolWrapper passing through to original tool ${this.name}`);\n return this.executeOriginal(input as Record<string, unknown>, runManager);\n }\n\n}\n\n/**\n * Wrap a tool with form validation capabilities\n */\nexport function wrapToolWithFormValidation<TSchema extends z.ZodObject<z.ZodRawShape, z.UnknownKeysParam, z.ZodTypeAny>>(\n tool: StructuredTool<TSchema>,\n formGenerator: FormGenerator,\n config: FormValidationConfig = {}\n): FormValidatingToolWrapper<TSchema> {\n return new FormValidatingToolWrapper(tool, formGenerator, config);\n}"],"names":[],"mappings":"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"}