@hashgraphonline/conversational-agent 0.1.217 → 0.1.219
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli/readme.md +181 -0
- package/dist/cjs/constants/entity-references.d.ts +18 -0
- package/dist/cjs/constants/form-priorities.d.ts +24 -0
- package/dist/cjs/constants/index.d.ts +4 -0
- package/dist/cjs/constants/messages.d.ts +19 -0
- package/dist/cjs/constants/test-constants.d.ts +42 -0
- package/dist/cjs/conversational-agent.d.ts +3 -8
- package/dist/{types/core/ToolRegistry.d.ts → cjs/core/tool-registry.d.ts} +11 -1
- package/dist/{types/execution/ExecutionPipeline.d.ts → cjs/execution/execution-pipeline.d.ts} +3 -3
- package/dist/cjs/forms/field-guidance-registry.d.ts +108 -0
- package/dist/cjs/forms/form-generator.d.ts +2 -7
- package/dist/cjs/forms/index.d.ts +3 -0
- package/dist/cjs/forms/types.d.ts +9 -1
- package/dist/cjs/index.cjs +1 -1
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.ts +7 -12
- package/dist/cjs/langchain/external-tool-wrapper.d.ts +101 -0
- package/dist/{types/langchain/FormAwareAgentExecutor.d.ts → cjs/langchain/form-aware-agent-executor.d.ts} +19 -4
- package/dist/cjs/langchain/index.d.ts +3 -0
- package/dist/{types → cjs/langchain}/langchain-agent.d.ts +15 -7
- package/dist/cjs/mcp/adapters/index.d.ts +1 -0
- package/dist/cjs/mcp/adapters/langchain.d.ts +1 -1
- package/dist/{types/mcp/ContentProcessor.d.ts → cjs/mcp/content-processor.d.ts} +1 -1
- package/dist/cjs/mcp/index.d.ts +5 -0
- package/dist/{types/mcp/MCPClientManager.d.ts → cjs/mcp/mcp-client-manager.d.ts} +1 -1
- package/dist/cjs/memory/{ContentStorage.d.ts → content-storage.d.ts} +4 -4
- package/dist/cjs/memory/index.d.ts +5 -7
- package/dist/{types/memory/MemoryWindow.d.ts → cjs/memory/memory-window.d.ts} +1 -1
- package/dist/{types/memory/SmartMemoryManager.d.ts → cjs/memory/smart-memory-manager.d.ts} +1 -1
- package/dist/cjs/services/{ContentStoreManager.d.ts → content-store-manager.d.ts} +6 -6
- package/dist/cjs/services/context/resolution-context.d.ts +49 -0
- package/dist/cjs/services/entity-resolver.d.ts +58 -0
- package/dist/cjs/services/formatters/converters/index.d.ts +2 -0
- package/dist/cjs/services/formatters/converters/string-normalization-converter.d.ts +13 -0
- package/dist/cjs/services/formatters/converters/topic-id-to-hrl-converter.d.ts +17 -0
- package/dist/cjs/services/formatters/format-converter-registry.d.ts +66 -0
- package/dist/cjs/services/formatters/index.d.ts +3 -0
- package/dist/cjs/services/formatters/types.d.ts +29 -0
- package/dist/cjs/services/index.d.ts +3 -0
- package/dist/cjs/services/resolution/resolution-pipeline.d.ts +44 -0
- package/dist/cjs/tools/index.d.ts +1 -0
- package/dist/cjs/utils/index.d.ts +1 -0
- package/dist/esm/index.js +40 -13
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index10.js +669 -13
- package/dist/esm/index10.js.map +1 -1
- package/dist/esm/index11.js +310 -95
- package/dist/esm/index11.js.map +1 -1
- package/dist/esm/index12.js +130 -95
- package/dist/esm/index12.js.map +1 -1
- package/dist/esm/index13.js +262 -153
- package/dist/esm/index13.js.map +1 -1
- package/dist/esm/index14.js +100 -664
- package/dist/esm/index14.js.map +1 -1
- package/dist/esm/index15.js +135 -408
- package/dist/esm/index15.js.map +1 -1
- package/dist/esm/index16.js +240 -122
- package/dist/esm/index16.js.map +1 -1
- package/dist/esm/index17.js +147 -135
- package/dist/esm/index17.js.map +1 -1
- package/dist/esm/index18.js +376 -533
- package/dist/esm/index18.js.map +1 -1
- package/dist/esm/index19.js +87 -214
- package/dist/esm/index19.js.map +1 -1
- package/dist/esm/index2.js +21 -4
- package/dist/esm/index2.js.map +1 -1
- package/dist/esm/index20.js +158 -92
- package/dist/esm/index20.js.map +1 -1
- package/dist/esm/index21.js +717 -44
- package/dist/esm/index21.js.map +1 -1
- package/dist/esm/index22.js +58 -96
- package/dist/esm/index22.js.map +1 -1
- package/dist/esm/index23.js +324 -34
- package/dist/esm/index23.js.map +1 -1
- package/dist/esm/index24.js +125 -712
- package/dist/esm/index24.js.map +1 -1
- package/dist/esm/index25.js +113 -133
- package/dist/esm/index25.js.map +1 -1
- package/dist/esm/index26.js +18 -152
- package/dist/esm/index26.js.map +1 -1
- package/dist/esm/index27.js +14 -210
- package/dist/esm/index27.js.map +1 -1
- package/dist/esm/index28.js +70 -173
- package/dist/esm/index28.js.map +1 -1
- package/dist/esm/index29.js +882 -220
- package/dist/esm/index29.js.map +1 -1
- package/dist/esm/index30.js +218 -126
- package/dist/esm/index30.js.map +1 -1
- package/dist/esm/index31.js +1258 -44
- package/dist/esm/index31.js.map +1 -1
- package/dist/esm/index32.js +132 -24
- package/dist/esm/index32.js.map +1 -1
- package/dist/esm/index33.js +104 -82
- package/dist/esm/index33.js.map +1 -1
- package/dist/esm/index34.js +43 -239
- package/dist/esm/index34.js.map +1 -1
- package/dist/esm/index35.js +106 -0
- package/dist/esm/index35.js.map +1 -0
- package/dist/esm/index36.js +24 -0
- package/dist/esm/index36.js.map +1 -0
- package/dist/esm/index37.js +8 -0
- package/dist/esm/index37.js.map +1 -0
- package/dist/esm/index38.js +15 -0
- package/dist/esm/index38.js.map +1 -0
- package/dist/esm/index39.js +258 -0
- package/dist/esm/index39.js.map +1 -0
- package/dist/esm/index40.js +187 -0
- package/dist/esm/index40.js.map +1 -0
- package/dist/esm/index41.js +30 -0
- package/dist/esm/index41.js.map +1 -0
- package/dist/esm/index42.js +10 -0
- package/dist/esm/index42.js.map +1 -0
- package/dist/esm/index43.js +95 -0
- package/dist/esm/index43.js.map +1 -0
- package/dist/esm/index5.js +2 -2
- package/dist/esm/index5.js.map +1 -1
- package/dist/esm/index6.js +44 -67
- package/dist/esm/index6.js.map +1 -1
- package/dist/esm/index7.js +9 -0
- package/dist/esm/index7.js.map +1 -1
- package/dist/esm/index8.js +13 -1095
- package/dist/esm/index8.js.map +1 -1
- package/dist/esm/index9.js +17 -13
- package/dist/esm/index9.js.map +1 -1
- package/dist/types/constants/entity-references.d.ts +18 -0
- package/dist/types/constants/form-priorities.d.ts +24 -0
- package/dist/types/constants/index.d.ts +4 -0
- package/dist/types/constants/messages.d.ts +19 -0
- package/dist/types/constants/test-constants.d.ts +42 -0
- package/dist/types/conversational-agent.d.ts +3 -8
- package/dist/{cjs/core/ToolRegistry.d.ts → types/core/tool-registry.d.ts} +11 -1
- package/dist/{cjs/execution/ExecutionPipeline.d.ts → types/execution/execution-pipeline.d.ts} +3 -3
- package/dist/types/forms/field-guidance-registry.d.ts +108 -0
- package/dist/types/forms/form-generator.d.ts +2 -7
- package/dist/types/forms/index.d.ts +3 -0
- package/dist/types/forms/types.d.ts +9 -1
- package/dist/types/index.d.ts +7 -12
- package/dist/types/langchain/external-tool-wrapper.d.ts +101 -0
- package/dist/{cjs/langchain/FormAwareAgentExecutor.d.ts → types/langchain/form-aware-agent-executor.d.ts} +19 -4
- package/dist/types/langchain/index.d.ts +3 -0
- package/dist/{cjs → types/langchain}/langchain-agent.d.ts +15 -7
- package/dist/types/mcp/adapters/index.d.ts +1 -0
- package/dist/types/mcp/adapters/langchain.d.ts +1 -1
- package/dist/{cjs/mcp/ContentProcessor.d.ts → types/mcp/content-processor.d.ts} +1 -1
- package/dist/types/mcp/index.d.ts +5 -0
- package/dist/{cjs/mcp/MCPClientManager.d.ts → types/mcp/mcp-client-manager.d.ts} +1 -1
- package/dist/types/memory/{ContentStorage.d.ts → content-storage.d.ts} +4 -4
- package/dist/types/memory/index.d.ts +5 -7
- package/dist/{cjs/memory/MemoryWindow.d.ts → types/memory/memory-window.d.ts} +1 -1
- package/dist/{cjs/memory/SmartMemoryManager.d.ts → types/memory/smart-memory-manager.d.ts} +1 -1
- package/dist/types/services/{ContentStoreManager.d.ts → content-store-manager.d.ts} +6 -6
- package/dist/types/services/context/resolution-context.d.ts +49 -0
- package/dist/types/services/entity-resolver.d.ts +58 -0
- package/dist/types/services/formatters/converters/index.d.ts +2 -0
- package/dist/types/services/formatters/converters/string-normalization-converter.d.ts +13 -0
- package/dist/types/services/formatters/converters/topic-id-to-hrl-converter.d.ts +17 -0
- package/dist/types/services/formatters/format-converter-registry.d.ts +66 -0
- package/dist/types/services/formatters/index.d.ts +3 -0
- package/dist/types/services/formatters/types.d.ts +29 -0
- package/dist/types/services/index.d.ts +3 -0
- package/dist/types/services/resolution/resolution-pipeline.d.ts +44 -0
- package/dist/types/tools/index.d.ts +1 -0
- package/dist/types/utils/index.d.ts +1 -0
- package/package.json +30 -27
- package/src/agent-factory.ts +1 -1
- package/src/base-agent.ts +9 -0
- package/src/config/system-message.ts +2 -15
- package/src/constants/entity-references.ts +23 -0
- package/src/constants/form-priorities.ts +25 -0
- package/src/constants/index.ts +4 -0
- package/src/constants/messages.ts +20 -0
- package/src/constants/test-constants.ts +49 -0
- package/src/conversational-agent.ts +42 -69
- package/src/core/{ToolRegistry.ts → tool-registry.ts} +71 -1
- package/src/examples/external-tool-wrapper-example.ts +56 -0
- package/src/execution/{ExecutionPipeline.ts → execution-pipeline.ts} +3 -3
- package/src/forms/field-guidance-registry.ts +415 -0
- package/src/forms/field-type-registry.ts +49 -48
- package/src/forms/{FormEngine.ts → form-engine.ts} +66 -43
- package/src/forms/form-generator.ts +91 -17
- package/src/forms/index.ts +4 -1
- package/src/forms/types.ts +9 -1
- package/src/index.ts +7 -37
- package/src/langchain/external-tool-wrapper.ts +90 -0
- package/src/langchain/{FormAwareAgentExecutor.ts → form-aware-agent-executor.ts} +615 -231
- package/src/langchain/{FormValidatingToolWrapper.ts → form-validating-tool-wrapper.ts} +2 -1
- package/src/langchain/index.ts +3 -0
- package/src/{langchain-agent.ts → langchain/langchain-agent.ts} +389 -113
- package/src/mcp/adapters/index.ts +1 -0
- package/src/mcp/adapters/langchain.ts +27 -18
- package/src/mcp/{ContentProcessor.ts → content-processor.ts} +71 -47
- package/src/mcp/index.ts +5 -0
- package/src/mcp/{MCPClientManager.ts → mcp-client-manager.ts} +2 -2
- package/src/memory/{ContentStorage.ts → content-storage.ts} +263 -167
- package/src/memory/index.ts +5 -8
- package/src/memory/{MemoryWindow.ts → memory-window.ts} +47 -24
- package/src/memory/{SmartMemoryManager.ts → smart-memory-manager.ts} +49 -22
- package/src/plugins/hbar/HbarPlugin.ts +1 -1
- package/src/plugins/hcs-10/HCS10Plugin.ts +46 -28
- package/src/scripts/test-external-tool-wrapper.ts +6 -6
- package/src/scripts/test-inscribe-form-generation.ts +22 -21
- package/src/scripts/test-inscribe-wrapper-verification.ts +5 -4
- package/src/services/{ContentStoreManager.ts → content-store-manager.ts} +75 -33
- package/src/services/context/resolution-context.ts +80 -0
- package/src/services/entity-resolver.ts +425 -0
- package/src/services/formatters/converters/index.ts +2 -0
- package/src/services/formatters/converters/string-normalization-converter.ts +106 -0
- package/src/services/formatters/converters/topic-id-to-hrl-converter.ts +25 -0
- package/src/services/formatters/format-converter-registry.ts +229 -0
- package/src/services/formatters/index.ts +3 -0
- package/src/services/formatters/types.ts +31 -0
- package/src/services/index.ts +3 -0
- package/src/services/resolution/resolution-pipeline.ts +106 -0
- package/src/tools/index.ts +1 -0
- package/src/types/content-reference.ts +87 -60
- package/src/utils/index.ts +1 -0
- package/cli/dist/CLIApp.d.ts +0 -9
- package/cli/dist/CLIApp.js +0 -127
- package/cli/dist/LocalConversationalAgent.d.ts +0 -37
- package/cli/dist/LocalConversationalAgent.js +0 -58
- package/cli/dist/app.d.ts +0 -16
- package/cli/dist/app.js +0 -13
- package/cli/dist/cli.d.ts +0 -2
- package/cli/dist/cli.js +0 -51
- package/cli/dist/components/AppContainer.d.ts +0 -16
- package/cli/dist/components/AppContainer.js +0 -24
- package/cli/dist/components/AppScreens.d.ts +0 -2
- package/cli/dist/components/AppScreens.js +0 -259
- package/cli/dist/components/ChatScreen.d.ts +0 -15
- package/cli/dist/components/ChatScreen.js +0 -39
- package/cli/dist/components/DebugLoadingScreen.d.ts +0 -5
- package/cli/dist/components/DebugLoadingScreen.js +0 -31
- package/cli/dist/components/LoadingScreen.d.ts +0 -2
- package/cli/dist/components/LoadingScreen.js +0 -16
- package/cli/dist/components/LoadingScreenDebug.d.ts +0 -5
- package/cli/dist/components/LoadingScreenDebug.js +0 -27
- package/cli/dist/components/MCPConfigScreen.d.ts +0 -28
- package/cli/dist/components/MCPConfigScreen.js +0 -168
- package/cli/dist/components/ScreenRouter.d.ts +0 -12
- package/cli/dist/components/ScreenRouter.js +0 -22
- package/cli/dist/components/SetupScreen.d.ts +0 -15
- package/cli/dist/components/SetupScreen.js +0 -65
- package/cli/dist/components/SingleLoadingScreen.d.ts +0 -5
- package/cli/dist/components/SingleLoadingScreen.js +0 -27
- package/cli/dist/components/StatusBadge.d.ts +0 -7
- package/cli/dist/components/StatusBadge.js +0 -28
- package/cli/dist/components/TerminalWindow.d.ts +0 -8
- package/cli/dist/components/TerminalWindow.js +0 -24
- package/cli/dist/components/WelcomeScreen.d.ts +0 -11
- package/cli/dist/components/WelcomeScreen.js +0 -47
- package/cli/dist/context/AppContext.d.ts +0 -68
- package/cli/dist/context/AppContext.js +0 -363
- package/cli/dist/hooks/useInitializeAgent.d.ts +0 -19
- package/cli/dist/hooks/useInitializeAgent.js +0 -28
- package/cli/dist/hooks/useStableState.d.ts +0 -38
- package/cli/dist/hooks/useStableState.js +0 -68
- package/cli/dist/managers/AgentManager.d.ts +0 -57
- package/cli/dist/managers/AgentManager.js +0 -119
- package/cli/dist/managers/ConfigManager.d.ts +0 -53
- package/cli/dist/managers/ConfigManager.js +0 -173
- package/cli/dist/types.d.ts +0 -31
- package/cli/dist/types.js +0 -19
- package/dist/cjs/context/ReferenceContextManager.d.ts +0 -84
- package/dist/cjs/context/ReferenceResponseProcessor.d.ts +0 -76
- package/dist/cjs/services/EntityResolver.d.ts +0 -26
- package/dist/types/context/ReferenceContextManager.d.ts +0 -84
- package/dist/types/context/ReferenceResponseProcessor.d.ts +0 -76
- package/dist/types/services/EntityResolver.d.ts +0 -26
- package/src/context/ReferenceContextManager.ts +0 -350
- package/src/context/ReferenceResponseProcessor.ts +0 -295
- package/src/scripts/test-hedera-kit-wrapper.ts +0 -265
- package/src/services/EntityResolver.ts +0 -128
- /package/dist/cjs/forms/{FormEngine.d.ts → form-engine.d.ts} +0 -0
- /package/dist/cjs/langchain/{FormValidatingToolWrapper.d.ts → form-validating-tool-wrapper.d.ts} +0 -0
- /package/dist/cjs/memory/{ReferenceIdGenerator.d.ts → reference-id-generator.d.ts} +0 -0
- /package/dist/cjs/memory/{TokenCounter.d.ts → token-counter.d.ts} +0 -0
- /package/dist/cjs/tools/{EntityResolverTool.d.ts → entity-resolver-tool.d.ts} +0 -0
- /package/dist/cjs/utils/{ResponseFormatter.d.ts → response-formatter.d.ts} +0 -0
- /package/dist/types/forms/{FormEngine.d.ts → form-engine.d.ts} +0 -0
- /package/dist/types/langchain/{FormValidatingToolWrapper.d.ts → form-validating-tool-wrapper.d.ts} +0 -0
- /package/dist/types/memory/{ReferenceIdGenerator.d.ts → reference-id-generator.d.ts} +0 -0
- /package/dist/types/memory/{TokenCounter.d.ts → token-counter.d.ts} +0 -0
- /package/dist/types/tools/{EntityResolverTool.d.ts → entity-resolver-tool.d.ts} +0 -0
- /package/dist/types/utils/{ResponseFormatter.d.ts → response-formatter.d.ts} +0 -0
- /package/src/memory/{ReferenceIdGenerator.ts → reference-id-generator.ts} +0 -0
- /package/src/memory/{TokenCounter.ts → token-counter.ts} +0 -0
- /package/src/tools/{EntityResolverTool.ts → entity-resolver-tool.ts} +0 -0
- /package/src/utils/{ResponseFormatter.ts → response-formatter.ts} +0 -0
package/dist/esm/index29.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index29.js","sources":["../../src/forms/FormEngine.ts"],"sourcesContent":["import { StructuredTool } from '@langchain/core/tools';\nimport { ZodError, z } from 'zod';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport { FormGenerator } from './form-generator';\nimport { isFormValidatable } from '@hashgraphonline/standards-agent-kit';\nimport type { FormMessage, FormSubmission } from './types';\n\n/**\n * Tool execution result with optional form requirement\n */\nexport interface ToolExecutionResult {\n success: boolean;\n output: string;\n metadata?: Record<string, unknown>;\n requiresForm?: boolean;\n formMessage?: FormMessage;\n error?: string;\n}\n\n/**\n * Context for form generation operations\n */\nexport interface FormGenerationContext {\n tool: StructuredTool;\n input: unknown;\n sessionId?: string;\n userId?: string;\n missingFields?: Set<string>;\n}\n\n/**\n * FormEngine handles all form generation and validation logic\n */\nexport class FormEngine {\n private formGenerator: FormGenerator;\n private logger: Logger;\n\n constructor(logger?: Logger) {\n this.formGenerator = new FormGenerator();\n this.logger = logger || new Logger({ module: 'FormEngine' });\n }\n\n /**\n * Generate a form for a tool with the given input\n */\n async generateForm(\n toolName: string,\n tool: StructuredTool,\n input: unknown,\n context?: Partial<FormGenerationContext>\n ): Promise<FormMessage | null> {\n const fullContext: FormGenerationContext = {\n tool,\n input,\n ...context\n };\n\n try {\n if (isFormValidatable(tool)) {\n return await this.generateFormValidatableForm(tool, input, fullContext);\n }\n\n if (input instanceof ZodError) {\n return await this.generateErrorBasedForm(tool, input, fullContext);\n }\n\n if (this.hasRenderConfig(tool)) {\n return await this.generateRenderConfigForm(tool, input, fullContext);\n }\n\n if (this.isZodObject(tool.schema)) {\n return await this.generateSchemaBasedForm(tool, input, fullContext);\n }\n\n return null;\n } catch (error) {\n this.logger.error(`Failed to generate form for tool: ${toolName}`, {\n error: error instanceof Error ? error.message : String(error)\n });\n throw error;\n }\n }\n\n /**\n * Process a form submission\n */\n async processSubmission(\n submission: FormSubmission,\n context?: {\n originalInput?: Record<string, unknown>;\n schema?: unknown;\n }\n ): Promise<Record<string, unknown>> {\n this.validateSubmission(submission);\n \n const baseToolInput = this.extractBaseToolInput(context);\n const submissionData = this.extractSubmissionData(submission);\n \n return this.mergeInputData(baseToolInput, submissionData);\n }\n\n /**\n * Check if a tool requires form generation based on input\n */\n shouldGenerateForm(tool: StructuredTool, input: unknown): boolean {\n const inputRecord = input as Record<string, unknown>;\n if (inputRecord?.__fromForm === true || inputRecord?.renderForm === false) {\n return false;\n }\n\n if (isFormValidatable(tool)) {\n try {\n const formValidatableTool = tool as {\n shouldGenerateForm: (input: unknown) => boolean;\n };\n return formValidatableTool.shouldGenerateForm(input);\n } catch (error) {\n this.logger.error(`Error calling shouldGenerateForm() on ${tool.name}:`, error);\n return false;\n }\n }\n\n const validation = this.validateInput(tool, input);\n return !validation.isValid;\n }\n\n /**\n * Generate form from error context\n */\n async generateFormFromError(\n error: ZodError,\n toolName: string,\n toolSchema: z.ZodSchema,\n originalPrompt: string\n ): Promise<FormMessage> {\n return this.formGenerator.generateFormFromError(\n error,\n toolSchema as z.ZodType<unknown, z.ZodTypeDef, unknown>,\n toolName,\n originalPrompt\n );\n }\n\n /**\n * Generate form for FormValidatable tools\n */\n private async generateFormValidatableForm(\n tool: StructuredTool,\n input: unknown,\n _context: FormGenerationContext\n ): Promise<FormMessage> {\n const { schemaToUse, isFocusedSchema } = this.resolveFormSchema(tool);\n const missingFields = this.determineMissingFields(tool, input, schemaToUse, isFocusedSchema);\n \n return this.generateFormWithSchema(tool, input, schemaToUse, missingFields);\n }\n\n /**\n * Generate form based on schema validation\n */\n private async generateSchemaBasedForm(\n tool: StructuredTool,\n input: unknown,\n context: FormGenerationContext\n ): Promise<FormMessage> {\n const schema = tool.schema;\n\n const formMessage = await this.formGenerator.generateFormFromSchema(\n schema as z.ZodType<unknown, z.ZodTypeDef, unknown>,\n input,\n {\n toolName: tool.name,\n toolDescription: tool.description\n },\n context.missingFields\n );\n\n if (this.isZodObject(schema)) {\n try {\n const { jsonSchema, uiSchema } = this.formGenerator.generateJsonSchemaForm(\n schema,\n input as Record<string, unknown> | undefined,\n context.missingFields || new Set()\n );\n formMessage.jsonSchema = jsonSchema;\n formMessage.uiSchema = uiSchema;\n } catch (error) {\n this.logger.warn('Failed to generate JSON Schema for schema-based tool:', error);\n }\n }\n\n formMessage.partialInput = input;\n return formMessage;\n }\n\n /**\n * Generate form based on render config\n */\n private async generateRenderConfigForm(\n tool: StructuredTool,\n input: unknown,\n context: FormGenerationContext\n ): Promise<FormMessage> {\n const schema = tool.schema;\n const renderConfig = this.extractRenderConfig(tool);\n\n const formMessage = await this.formGenerator.generateFormFromSchema(\n schema as z.ZodType<unknown, z.ZodTypeDef, unknown>,\n input,\n {\n toolName: tool.name,\n toolDescription: tool.description\n },\n context.missingFields\n );\n\n if (renderConfig) {\n formMessage.formConfig.metadata = {\n ...formMessage.formConfig.metadata,\n renderConfig\n };\n }\n \n formMessage.partialInput = input;\n return formMessage;\n }\n\n /**\n * Generate form from Zod validation error\n */\n private async generateErrorBasedForm(\n tool: StructuredTool,\n error: ZodError,\n context: FormGenerationContext\n ): Promise<FormMessage> {\n return this.formGenerator.generateFormFromError(\n error,\n tool.schema as z.ZodType<unknown, z.ZodTypeDef, unknown>,\n tool.name,\n context.input ? String(context.input) : ''\n );\n }\n\n /**\n * Validate input against tool schema\n */\n private validateInput(\n tool: StructuredTool,\n input: unknown\n ): { isValid: boolean; errors?: string[] } {\n try {\n const zodSchema = tool.schema as z.ZodType<unknown, z.ZodTypeDef, unknown>;\n zodSchema.parse(input);\n return { isValid: true };\n } catch (error) {\n if (error instanceof ZodError) {\n const errors = error.errors.map(\n (err) => `${err.path.join('.')}: ${err.message}`\n );\n return { isValid: false, errors };\n }\n return { isValid: false, errors: ['Validation failed'] };\n }\n }\n\n /**\n * Check if schema is 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 * Check if tool has render configuration\n */\n private hasRenderConfig(tool: StructuredTool): boolean {\n const schema = tool.schema as Record<string, unknown>;\n return !!(schema && schema._renderConfig);\n }\n\n /**\n * Extract render configuration from tool\n */\n private extractRenderConfig(tool: StructuredTool): Record<string, unknown> | undefined {\n const schema = tool.schema as Record<string, unknown>;\n return schema?._renderConfig as Record<string, unknown> | undefined;\n }\n\n /**\n * Resolve form schema for FormValidatable tools\n */\n private resolveFormSchema(tool: StructuredTool): { \n schemaToUse: z.ZodSchema; \n isFocusedSchema: boolean \n } {\n const formValidatableTool = tool as {\n getFormSchema?: () => z.ZodSchema | null;\n };\n \n if (formValidatableTool.getFormSchema) {\n const focusedSchema = formValidatableTool.getFormSchema();\n if (focusedSchema) {\n return { schemaToUse: focusedSchema, isFocusedSchema: true };\n }\n }\n \n return { schemaToUse: tool.schema as z.ZodSchema, isFocusedSchema: false };\n }\n\n /**\n * Determine missing fields for form generation\n */\n private determineMissingFields(\n tool: StructuredTool,\n input: unknown,\n _schema: z.ZodSchema,\n _isFocusedSchema: boolean\n ): Set<string> {\n const missingFields = new Set<string>();\n \n if (!input || typeof input !== 'object') {\n return missingFields;\n }\n \n const inputRecord = input as Record<string, unknown>;\n const formValidatableTool = tool as {\n isFieldEmpty?: (fieldName: string, value: unknown) => boolean;\n getEssentialFields?: () => string[];\n };\n \n if (formValidatableTool.getEssentialFields) {\n const essentialFields = formValidatableTool.getEssentialFields();\n for (const field of essentialFields) {\n if (!(field in inputRecord) || \n (formValidatableTool.isFieldEmpty && \n formValidatableTool.isFieldEmpty(field, inputRecord[field]))) {\n missingFields.add(field);\n }\n }\n }\n \n return missingFields;\n }\n\n /**\n * Generate form with resolved schema\n */\n private async generateFormWithSchema(\n tool: StructuredTool,\n input: unknown,\n schema: z.ZodSchema,\n missingFields: Set<string>\n ): Promise<FormMessage> {\n const formMessage = await this.formGenerator.generateFormFromSchema(\n schema as z.ZodType<unknown, z.ZodTypeDef, unknown>,\n input,\n {\n toolName: tool.name,\n toolDescription: tool.description\n },\n missingFields\n );\n \n if (this.isZodObject(schema)) {\n try {\n const { jsonSchema, uiSchema } = this.formGenerator.generateJsonSchemaForm(\n schema,\n input as Record<string, unknown> | undefined,\n missingFields\n );\n formMessage.jsonSchema = jsonSchema;\n formMessage.uiSchema = uiSchema;\n } catch (error) {\n this.logger.warn('Failed to generate JSON Schema:', error);\n }\n }\n \n formMessage.partialInput = input;\n return formMessage;\n }\n\n /**\n * Validate form submission\n */\n private validateSubmission(submission: FormSubmission): void {\n if (!submission.toolName) {\n throw new Error('Tool name is required in form submission');\n }\n if (!submission.parameters) {\n throw new Error('Parameters are required in form submission');\n }\n }\n\n /**\n * Extract base tool input from context\n */\n private extractBaseToolInput(context?: {\n originalInput?: Record<string, unknown>;\n }): Record<string, unknown> {\n return context?.originalInput || {};\n }\n\n /**\n * Extract submission data\n */\n private extractSubmissionData(submission: FormSubmission): Record<string, unknown> {\n return {\n ...submission.parameters,\n __fromForm: true\n };\n }\n\n /**\n * Merge input data\n */\n private mergeInputData(\n baseInput: Record<string, unknown>,\n submissionData: Record<string, unknown>\n ): Record<string, unknown> {\n return {\n ...baseInput,\n ...submissionData\n };\n }\n\n /**\n * Get registered strategies\n */\n getRegisteredStrategies(): string[] {\n return ['FormValidatable', 'SchemaBased', 'RenderConfig', 'ZodErrorBased'];\n }\n\n /**\n * Get registered middleware\n */\n getRegisteredMiddleware(): string[] {\n return ['FormSubmissionValidator'];\n }\n}"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index29.js","sources":["../../src/langchain/form-aware-agent-executor.ts"],"sourcesContent":["import { AgentExecutor } from 'langchain/agents';\nimport { ZodError, z } from 'zod';\nimport { FormGenerator } from '../forms/form-generator';\nimport type { FormMessage, FormSubmission } from '../forms/types';\nimport { FormEngine } from '../forms/form-engine';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport type { AgentAction, AgentFinish, AgentStep } from 'langchain/agents';\nimport type { ToolInterface } from '@langchain/core/tools';\nimport { isFormValidatable } from '@hashgraphonline/standards-agent-kit';\nimport type { ChainValues } from '@langchain/core/utils/types';\nimport type { CallbackManagerForChainRun } from '@langchain/core/callbacks/manager';\nimport type { RunnableConfig } from '@langchain/core/runnables';\nimport { ResponseFormatter } from '../utils/response-formatter';\n\ntype BasicFieldType = 'text' | 'number' | 'select' | 'checkbox' | 'textarea';\n\nconst globalPendingForms: Map<string, PendingFormData> = new Map();\n\ninterface HashLinkBlock {\n blockId: string;\n hashLink: string;\n template: string;\n attributes: Record<string, unknown>;\n}\n\ninterface HashLinkResponse {\n hasHashLinkBlocks: boolean;\n hashLinkBlock?: HashLinkBlock;\n message: string;\n}\n\ninterface PendingFormData {\n toolName: string;\n originalInput: unknown;\n originalToolInput?: unknown;\n schema: unknown;\n toolRef?: ToolInterface | undefined;\n originalToolRef?:\n | { call?: (args: Record<string, unknown>) => Promise<string> }\n | 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\ninterface HashLinkBlock {\n blockId: string;\n hashLink: string;\n template: string;\n attributes: Record<string, unknown>;\n}\n\ninterface ResponseMetadataWithHashLink {\n hashLinkBlock?: HashLinkBlock;\n [key: string]: unknown;\n}\n\n/**\n * Parameter preprocessing callback interface\n */\nexport interface ParameterPreprocessingCallback {\n (toolName: string, parameters: Record<string, unknown>): Promise<\n Record<string, unknown>\n >;\n}\n\n/**\n * Agent executor that intercepts Zod validation errors and generates forms,\n * and processes HashLink block responses for rich UI rendering\n */\nexport class FormAwareAgentExecutor extends AgentExecutor {\n private formGenerator: FormGenerator;\n private formEngine: FormEngine;\n private formLogger: Logger;\n private pendingForms: Map<string, PendingFormData> = new Map();\n private parameterPreprocessingCallback:\n | ParameterPreprocessingCallback\n | undefined;\n\n /**\n * Type guard to check if a Zod type is a ZodObject\n */\n private isZodObject(schema: unknown): schema is z.ZodObject<z.ZodRawShape> {\n return schema instanceof z.ZodObject;\n }\n\n /**\n * Type guard to check if metadata has hashLinkBlock\n */\n private hasHashLinkBlock(\n metadata: unknown\n ): metadata is ResponseMetadataWithHashLink & {\n hashLinkBlock: HashLinkBlock;\n } {\n return (\n typeof metadata === 'object' &&\n metadata !== null &&\n 'hashLinkBlock' in metadata &&\n typeof (metadata as Record<string, unknown>).hashLinkBlock === 'object' &&\n (metadata as Record<string, unknown>).hashLinkBlock !== null\n );\n }\n\n constructor(...args: ConstructorParameters<typeof AgentExecutor>) {\n super(...args);\n this.formGenerator = new FormGenerator();\n this.formEngine = new FormEngine(\n new Logger({ module: 'FormAwareAgentExecutor.FormEngine' })\n );\n this.formLogger = new Logger({ module: 'FormAwareAgentExecutor' });\n this.parameterPreprocessingCallback = undefined;\n }\n\n /**\n * Set parameter preprocessing callback\n */\n setParameterPreprocessingCallback(\n callback: ParameterPreprocessingCallback | undefined\n ): void {\n this.parameterPreprocessingCallback = callback;\n }\n\n /**\n * BULLETPROOF TOOL INTERCEPTION\n * Override the single-step execution to intercept tool calls BEFORE LangChain processes them\n */\n override async _takeNextStep(\n nameToolMap: Record<string, ToolInterface>,\n inputs: ChainValues,\n intermediateSteps: AgentStep[],\n runManager?: CallbackManagerForChainRun,\n config?: RunnableConfig\n ): Promise<AgentFinish | AgentStep[]> {\n this.formLogger.info('🛡️ BULLETPROOF INTERCEPTION: _takeNextStep called', {\n availableTools: Object.keys(nameToolMap),\n inputKeys: Object.keys(inputs),\n });\n\n const result = await this.agent.plan(\n intermediateSteps,\n inputs,\n runManager?.getChild()\n );\n\n if ('returnValues' in result) {\n this.formLogger.info('Agent returned finish action, passing through');\n return result;\n }\n\n const action = result as AgentAction;\n const toolName = action.tool;\n const toolInput = action.toolInput;\n\n this.formLogger.info(`🎯 INTERCEPTING TOOL CALL: ${toolName}`, {\n toolInput,\n hasInNameToolMap: toolName in nameToolMap,\n toolInputKeys: Object.keys(toolInput || {}),\n });\n\n const tool =\n nameToolMap[toolName] || this.tools.find((t) => t.name === toolName);\n\n if (!tool) {\n this.formLogger.error(`Tool ${toolName} not found in registry`);\n throw new Error(`Tool \"${toolName}\" not found`);\n }\n\n let shouldGenerateForm = false;\n\n if (isFormValidatable(tool)) {\n this.formLogger.info(\n `🔍 Tool ${toolName} implements FormValidatable, checking shouldGenerateForm()`,\n {\n toolInput,\n }\n );\n\n try {\n shouldGenerateForm = tool.shouldGenerateForm(toolInput);\n this.formLogger.info(\n `FormValidatable.shouldGenerateForm() result: ${shouldGenerateForm}`,\n {\n toolName,\n toolInput,\n }\n );\n } catch (error) {\n this.formLogger.error(\n `Error calling shouldGenerateForm() on ${toolName}:`,\n error\n );\n shouldGenerateForm = false;\n }\n }\n\n if (shouldGenerateForm) {\n this.formLogger.info(`🚨 FORM GENERATION TRIGGERED for ${toolName}`);\n\n try {\n let schemaToUse: z.ZodSchema;\n let isFocusedSchema = false;\n\n if (isFormValidatable(tool)) {\n this.formLogger.info(\n `🎯 Tool ${toolName} is FormValidatable, attempting to get focused schema`\n );\n try {\n const focusedSchema = tool.getFormSchema();\n if (focusedSchema) {\n schemaToUse = focusedSchema;\n isFocusedSchema = true;\n this.formLogger.info(\n `✅ Successfully obtained focused schema for ${toolName}`\n );\n } else {\n this.formLogger.warn(\n `getFormSchema() returned null/undefined for ${toolName}, using default schema`\n );\n schemaToUse = tool.schema;\n isFocusedSchema = false;\n }\n } catch (error) {\n this.formLogger.error(\n `Failed to get focused schema from ${toolName}:`,\n error\n );\n this.formLogger.info(\n `Falling back to default schema for ${toolName}`\n );\n schemaToUse = tool.schema;\n isFocusedSchema = false;\n }\n } else {\n this.formLogger.info(\n `Tool ${toolName} is not FormValidatable, using default schema`\n );\n schemaToUse = tool.schema;\n isFocusedSchema = false;\n }\n\n let schemaFieldCount = 'unknown';\n try {\n if (this.isZodObject(schemaToUse)) {\n const zodObject = schemaToUse as z.ZodObject<z.ZodRawShape>;\n const shape = zodObject.shape;\n if (shape && typeof shape === 'object') {\n schemaFieldCount = Object.keys(shape).length.toString();\n }\n }\n } catch {}\n\n this.formLogger.info(\n `📋 Generating form with ${\n isFocusedSchema ? 'FOCUSED' : 'DEFAULT'\n } schema`,\n {\n toolName,\n schemaType: schemaToUse?.constructor?.name,\n estimatedFieldCount: schemaFieldCount,\n isFocusedSchema,\n }\n );\n\n let missingFields: Set<string> | undefined;\n\n if (isFocusedSchema) {\n this.formLogger.info(\n `⭐ Using focused schema - letting FormGenerator determine fields from schema`\n );\n missingFields = undefined;\n } else {\n missingFields = new Set<string>();\n if (this.isZodObject(schemaToUse)) {\n const zodObject = schemaToUse as z.ZodObject<z.ZodRawShape>;\n const shape = zodObject.shape || {};\n for (const fieldName of Object.keys(shape)) {\n const value = (toolInput || {})[fieldName];\n\n const isEmpty =\n isFormValidatable(tool) && tool.isFieldEmpty\n ? tool.isFieldEmpty(fieldName, value)\n : value === undefined ||\n value === '' ||\n value === null ||\n (Array.isArray(value) && value.length === 0);\n\n const isRequired = this.isFieldRequired(schemaToUse, fieldName);\n\n const isEssential =\n isFormValidatable(tool) && tool.getEssentialFields\n ? tool.getEssentialFields().includes(fieldName)\n : false;\n\n this.formLogger.info(`🔍 Field analysis: ${fieldName}`, {\n value: value,\n isEmpty: isEmpty,\n isRequired: isRequired,\n isEssential: isEssential,\n willAddToMissingFields: isEmpty && (isRequired || isEssential),\n });\n\n if (isEmpty && (isRequired || isEssential)) {\n missingFields.add(fieldName);\n }\n }\n }\n\n this.formLogger.info(`📋 Missing fields analysis complete`, {\n totalFields: this.isZodObject(schemaToUse)\n ? Object.keys(schemaToUse.shape).length\n : 0,\n missingFieldsCount: missingFields.size,\n missingFields: Array.from(missingFields),\n });\n }\n\n const formMessage = await this.formGenerator.generateFormFromSchema(\n schemaToUse,\n toolInput,\n {\n toolName: toolName,\n toolDescription: tool.description,\n },\n missingFields // Pass undefined for focused schemas, Set<string> for others\n );\n\n if (this.isZodObject(schemaToUse)) {\n try {\n const { jsonSchema, uiSchema } =\n this.formGenerator.generateJsonSchemaForm(\n schemaToUse,\n toolInput as Record<string, unknown> | undefined,\n missingFields\n );\n formMessage.jsonSchema = jsonSchema;\n formMessage.uiSchema = uiSchema;\n } catch (error) {\n this.formLogger.warn(\n 'Failed to generate JSON Schema for RJSF:',\n error\n );\n }\n }\n\n formMessage.partialInput = toolInput;\n\n const formData: PendingFormData = {\n toolName: toolName,\n originalInput: inputs,\n originalToolInput: toolInput,\n schema: schemaToUse,\n toolRef: tool as ToolInterface | undefined,\n originalToolRef: (\n tool as unknown as {\n originalTool?: {\n call?: (args: Record<string, unknown>) => Promise<string>;\n };\n }\n ).originalTool,\n };\n this.pendingForms.set(formMessage.id, formData);\n globalPendingForms.set(formMessage.id, formData);\n\n this.formLogger.info(`✅ FORM INTERCEPT SUCCESS for ${toolName}`);\n\n const formResult = {\n requiresForm: true,\n formMessage,\n };\n\n return [\n {\n action: action,\n observation: JSON.stringify(formResult),\n },\n ];\n } catch (error) {\n this.formLogger.error(`Form generation failed for ${toolName}:`, error);\n }\n }\n\n this.formLogger.info(\n `⚪ Passing through to normal tool execution for ${toolName}`\n );\n\n if (this.parameterPreprocessingCallback && toolInput) {\n this.formLogger.info(\n `🔄 Applying parameter preprocessing for ${toolName}`\n );\n try {\n const preprocessedInput = await this.parameterPreprocessingCallback(\n toolName,\n toolInput as Record<string, unknown>\n );\n\n if (\n preprocessedInput &&\n typeof preprocessedInput === 'object' &&\n '__requestForm' in (preprocessedInput as Record<string, unknown>)\n ) {\n const rf = (preprocessedInput as Record<string, unknown>).__requestForm as {\n id?: string;\n title?: string;\n description?: string;\n fields?: Array<{\n name: string;\n label: string;\n type: string;\n required?: boolean;\n options?: Array<{ value: string; label: string }>;\n }>;\n submitLabel?: string;\n };\n\n const formId = rf.id || `form_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n const formMessage = {\n type: 'form',\n id: formId,\n originalPrompt: 'Parameter validation required',\n toolName,\n formConfig: {\n title: rf.title || 'Complete required parameters',\n description:\n rf.description ||\n 'One or more parameters require confirmation. Please review and submit.',\n submitLabel: rf.submitLabel || 'Continue',\n fields: (rf.fields || []).map((f) => {\n const allowedTypes: BasicFieldType[] = [\n 'text',\n 'number',\n 'select',\n 'checkbox',\n 'textarea',\n ];\n const resolvedType: BasicFieldType = allowedTypes.includes(\n f.type as BasicFieldType\n )\n ? (f.type as BasicFieldType)\n : 'text';\n\n return {\n name: f.name,\n label: f.label,\n type: resolvedType,\n required: f.required ?? true,\n options: f.options,\n };\n }),\n },\n };\n\n const resolvedSchema = isFormValidatable(tool)\n ? (() => {\n try {\n const s = tool.getFormSchema();\n return s || tool.schema;\n } catch {\n return tool.schema;\n }\n })()\n : tool.schema;\n\n this.pendingForms.set(formId, {\n toolName,\n originalInput: inputs,\n originalToolInput: toolInput,\n schema: resolvedSchema,\n toolRef: tool as ToolInterface | undefined,\n originalToolRef: (\n tool as unknown as { originalTool?: { call?: (a: Record<string, unknown>) => Promise<string> } }\n ).originalTool,\n });\n globalPendingForms.set(formId, {\n toolName,\n originalInput: inputs,\n originalToolInput: toolInput,\n schema: resolvedSchema,\n });\n\n return [\n {\n action,\n observation: JSON.stringify({ requiresForm: true, formMessage }),\n },\n ];\n }\n\n if (JSON.stringify(preprocessedInput) !== JSON.stringify(toolInput)) {\n this.formLogger.info(`📝 Parameters preprocessed for ${toolName}:`, {\n original: Object.keys(toolInput as Record<string, unknown>),\n preprocessed: Object.keys(preprocessedInput),\n hasChanges: true,\n });\n\n try {\n (action as unknown as { toolInput?: Record<string, unknown> }).toolInput =\n preprocessedInput as Record<string, unknown>;\n } catch {}\n } else {\n this.formLogger.debug(`No parameter changes needed for ${toolName}`);\n }\n } catch (preprocessError) {\n this.formLogger.warn(\n `Parameter preprocessing failed for ${toolName}, using original parameters:`,\n preprocessError\n );\n }\n }\n\n return super._takeNextStep(\n nameToolMap,\n inputs,\n intermediateSteps,\n runManager,\n config\n );\n }\n\n /**\n * Helper to determine if a field is required in the schema\n */\n private isFieldRequired(schema: unknown, fieldPath: string): boolean {\n if (!schema || !fieldPath) {\n return false;\n }\n\n try {\n const obj = schema as { _def?: { typeName?: string; shape?: unknown } };\n const def = obj._def;\n if (!def || def.typeName !== 'ZodObject') {\n return false;\n }\n const rawShape: unknown =\n 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 = (\n s as unknown as {\n _def?: { typeName?: string; innerType?: z.ZodTypeAny };\n }\n )._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 = (\n unwrapped as unknown as {\n _def?: { typeName?: string; defaultValue?: unknown };\n }\n )._def;\n if (!fdef) {\n return true;\n }\n if (fdef.typeName === 'ZodOptional' || fdef.typeName === 'ZodDefault') {\n return false;\n }\n if (fdef.defaultValue !== undefined) {\n return false;\n }\n return true;\n } catch (error) {\n this.formLogger.debug(\n `Could not determine if field ${fieldPath} is required:`,\n error\n );\n }\n return false;\n }\n\n /**\n * Override _call to intercept Zod validation errors at the execution level\n */\n override async _call(\n inputs: Record<string, unknown>\n ): Promise<Record<string, unknown>> {\n try {\n const result = await super._call(inputs);\n\n if (result.intermediateSteps && Array.isArray(result.intermediateSteps)) {\n for (const step of result.intermediateSteps) {\n if (step.observation) {\n try {\n const parsed: ToolResponse =\n typeof step.observation === 'string'\n ? JSON.parse(step.observation)\n : (step.observation as ToolResponse);\n\n if (parsed.requiresForm && parsed.formMessage) {\n this.formLogger.info('Tool requested form generation', {\n toolName: step.action?.tool,\n hasForm: true,\n });\n\n const actionToolName =\n (step as IntermediateStepData).action?.tool || 'unknown';\n const toolInstance = this.tools.find(\n (t) => t.name === actionToolName\n ) as ToolInterface | undefined;\n const originalToolCandidate =\n (toolInstance as unknown as {\n originalTool?: {\n call?: (args: Record<string, unknown>) => Promise<string>;\n };\n }) || {};\n const pf: PendingFormData = {\n toolName: actionToolName,\n originalInput: inputs,\n originalToolInput: (step as IntermediateStepData).action\n ?.toolInput as Record<string, unknown> | undefined,\n schema: null,\n toolRef: toolInstance,\n originalToolRef: originalToolCandidate?.originalTool,\n };\n this.pendingForms.set(parsed.formMessage.id, pf);\n globalPendingForms.set(parsed.formMessage.id, pf);\n\n return {\n ...result,\n requiresForm: true,\n formMessage: parsed.formMessage,\n output:\n parsed.message || 'Please complete the form to continue.',\n };\n }\n\n if (\n parsed.hashLinkBlock ||\n (parsed.success && parsed.inscription && parsed.hashLinkBlock)\n ) {\n this.formLogger.info('Tool returned HashLink blocks', {\n toolName: (step as IntermediateStepData).action?.tool,\n hasHashLink: true,\n blockId: parsed.hashLinkBlock?.blockId,\n });\n\n const hashLinkResponse = this.processHashLinkResponse(parsed);\n\n return {\n ...result,\n hasHashLinkBlocks: true,\n hashLinkBlock: hashLinkResponse.hashLinkBlock,\n output: hashLinkResponse.message,\n };\n }\n } catch {}\n }\n }\n }\n\n return result;\n } catch (error) {\n if (error instanceof ZodError) {\n this.formLogger.info('Intercepted ZodError during agent execution');\n return this.handleValidationError(error, inputs, []);\n }\n throw error;\n }\n }\n\n /**\n * Handles Zod validation errors by generating forms\n */\n private async handleValidationError(\n error: ZodError,\n inputs: Record<string, unknown>,\n intermediateSteps: AgentStep[]\n ): Promise<Record<string, unknown>> {\n this.formLogger.info('Zod validation error detected, generating form', {\n errorIssues: error.issues.length,\n inputKeys: Object.keys(inputs),\n });\n\n let toolInfo = this.extractToolInfoFromError(\n error,\n inputs,\n intermediateSteps\n );\n\n if (!toolInfo) {\n this.formLogger.warn(\n 'Could not extract tool info from validation error, trying fallback detection'\n );\n const fallbackTool = this.detectToolFromErrorContext(error);\n if (!fallbackTool) {\n this.formLogger.error(\n 'No tool detected for form generation, rethrowing error'\n );\n throw error;\n }\n toolInfo = fallbackTool;\n }\n\n this.formLogger.info('Generating form for tool:', {\n toolName: toolInfo.toolName,\n hasSchema: !!toolInfo.schema,\n });\n\n const formMessage = this.formGenerator.generateFormFromError(\n error,\n toolInfo.schema as z.ZodType<unknown, z.ZodTypeDef, unknown>,\n toolInfo.toolName,\n (inputs.input as string) || ''\n );\n\n this.pendingForms.set(formMessage.id, {\n toolName: toolInfo.toolName,\n originalInput: inputs,\n schema: toolInfo.schema,\n });\n\n globalPendingForms.set(formMessage.id, {\n toolName: toolInfo.toolName,\n originalInput: inputs,\n schema: toolInfo.schema,\n });\n\n return {\n output: this.formatFormResponse(formMessage),\n formMessage,\n requiresForm: true,\n intermediateSteps: intermediateSteps || [],\n };\n }\n\n /**\n * Get a copy of pending forms for preservation during executor recreation\n */\n getPendingForms(): Map<string, PendingFormData> {\n return new Map(this.pendingForms);\n }\n\n /**\n * Restore pending forms from a previous executor instance\n */\n restorePendingForms(forms: Map<string, PendingFormData>): void {\n for (const [formId, formData] of forms) {\n this.pendingForms.set(formId, formData);\n }\n }\n\n /**\n * Processes form submission and continues tool execution\n */\n async processFormSubmission(\n submission: FormSubmission\n ): Promise<Record<string, unknown>> {\n this.formLogger.info(\n '🚀 FormAwareAgentExecutor.processFormSubmission called!',\n {\n submissionFormId: submission.formId,\n submissionToolName: submission.toolName,\n }\n );\n if (!submission) {\n throw new Error('Form submission is null or undefined');\n }\n\n if (!submission.formId) {\n throw new Error('Form submission missing formId');\n }\n\n if (\n !submission.parameters ||\n submission.parameters === null ||\n typeof submission.parameters !== 'object' ||\n Array.isArray(submission.parameters)\n ) {\n throw new Error(\n `Form submission parameters are invalid: ${typeof submission.parameters}, isNull: ${\n submission.parameters === null\n }, isArray: ${Array.isArray(\n submission.parameters\n )}, parameters: ${JSON.stringify(submission.parameters)}`\n );\n }\n\n this.formLogger.info('Processing form submission:', {\n formId: submission.formId,\n toolName: submission.toolName,\n parameterKeys: Object.keys(submission.parameters),\n parametersType: typeof submission.parameters,\n parametersIsNull: submission.parameters === null,\n parametersIsUndefined: submission.parameters === undefined,\n hasContext: !!submission.context,\n });\n\n let pendingForm = this.pendingForms.get(submission.formId);\n\n if (!pendingForm) {\n pendingForm = globalPendingForms.get(submission.formId);\n if (!pendingForm) {\n throw new Error(`No pending form found for ID: ${submission.formId}`);\n }\n }\n\n this.pendingForms.delete(submission.formId);\n globalPendingForms.delete(submission.formId);\n\n const tool =\n pendingForm.toolRef ||\n this.tools.find((t) => t.name === pendingForm.toolName);\n if (!tool) {\n throw new Error(\n `Tool not found for form submission: ${pendingForm.toolName}`\n );\n }\n\n let baseToolInput: Record<string, unknown> = {};\n try {\n if (\n pendingForm.originalToolInput &&\n typeof pendingForm.originalToolInput === 'object'\n ) {\n baseToolInput = {\n ...(pendingForm.originalToolInput as Record<string, unknown>),\n };\n }\n } catch (error) {\n this.formLogger.warn(\n 'Failed to extract base tool input, using empty object:',\n error\n );\n baseToolInput = {};\n }\n\n let submissionData: Record<string, unknown> = {};\n try {\n if (submission.parameters && typeof submission.parameters === 'object') {\n submissionData = {\n ...(submission.parameters as Record<string, unknown>),\n };\n }\n } catch (error) {\n this.formLogger.warn(\n 'Failed to extract submission parameters, using empty object:',\n error\n );\n submissionData = {};\n }\n\n const mergedToolInput: Record<string, unknown> = {};\n try {\n Object.keys(baseToolInput).forEach((key) => {\n const value = baseToolInput[key];\n if (value !== undefined && value !== null) {\n mergedToolInput[key] = value;\n }\n });\n\n Object.keys(submissionData).forEach((key) => {\n const value = submissionData[key];\n if (value !== undefined && value !== null) {\n mergedToolInput[key] = value;\n }\n });\n\n mergedToolInput.renderForm = false;\n mergedToolInput.__fromForm = true;\n\n this.formLogger.info('Successfully merged tool input:', {\n baseKeys: Object.keys(baseToolInput),\n submissionKeys: Object.keys(submissionData),\n mergedKeys: Object.keys(mergedToolInput),\n });\n } catch (error) {\n this.formLogger.error('Failed to merge tool input data:', error);\n throw new Error(\n `Failed to merge tool input data: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n );\n }\n\n try {\n const maybeWrapper = tool as unknown as {\n executeOriginal?: (args: Record<string, unknown>) => Promise<string>;\n getOriginalTool?: () => {\n _call?: (args: Record<string, unknown>) => Promise<string>;\n call?: (args: Record<string, unknown>) => Promise<string>;\n };\n originalTool?: {\n _call?: (args: Record<string, unknown>) => Promise<string>;\n call?: (args: Record<string, unknown>) => Promise<string>;\n };\n call?: (args: Record<string, unknown>) => Promise<string>;\n };\n 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 {\n call?: (a: Record<string, unknown>) => Promise<string>;\n };\n if (typeof tcall.call === 'function') {\n toolOutput = await tcall.call(mergedToolInput);\n } else {\n throw new Error(\n 'No callable tool implementation found for form submission'\n );\n }\n }\n } else if (\n maybeWrapper.originalTool &&\n typeof maybeWrapper.originalTool._call === 'function'\n ) {\n toolOutput = await maybeWrapper.originalTool._call(mergedToolInput);\n } else if (\n maybeWrapper.originalTool &&\n typeof maybeWrapper.originalTool.call === 'function'\n ) {\n toolOutput = await maybeWrapper.originalTool.call(mergedToolInput);\n } else if (\n typeof (\n tool as unknown as {\n call?: (a: Record<string, unknown>) => Promise<string>;\n }\n ).call === 'function'\n ) {\n toolOutput = await (\n tool as unknown as {\n call: (a: Record<string, unknown>) => Promise<string>;\n }\n ).call(mergedToolInput);\n } else {\n throw new Error(\n 'No callable tool implementation found for form submission'\n );\n }\n\n let responseMetadata: Record<string, unknown> = {};\n let formattedOutput: string;\n\n this.formLogger.info('🔍 METADATA EXTRACTION: Analyzing tool output', {\n outputType: typeof toolOutput,\n outputLength: toolOutput?.length || 0,\n isString: typeof toolOutput === 'string',\n firstChars:\n typeof toolOutput === 'string'\n ? toolOutput.substring(0, 100)\n : 'not-string',\n });\n\n try {\n const parsed = JSON.parse(toolOutput);\n this.formLogger.info(\n '✅ METADATA EXTRACTION: Successfully parsed JSON',\n {\n jsonKeys: Object.keys(parsed),\n hasHashLinkBlock: !!(parsed as Record<string, unknown>)\n .hashLinkBlock,\n }\n );\n\n if (parsed && typeof parsed === 'object') {\n if (ResponseFormatter.isHashLinkResponse(parsed)) {\n this.formLogger.info(\n '🔗 HASHLINK DETECTED: Processing HashLink response separately to preserve metadata'\n );\n\n responseMetadata = {\n ...responseMetadata,\n hashLinkBlock: (parsed as Record<string, unknown>).hashLinkBlock,\n };\n\n formattedOutput = ResponseFormatter.formatHashLinkResponse(parsed);\n\n this.formLogger.info(\n '🔗 METADATA PRESERVED: HashLink metadata extracted for component rendering',\n {\n blockId: this.hasHashLinkBlock(responseMetadata)\n ? responseMetadata.hashLinkBlock.blockId\n : undefined,\n hasTemplate: this.hasHashLinkBlock(responseMetadata)\n ? !!responseMetadata.hashLinkBlock.template\n : false,\n }\n );\n } else {\n formattedOutput = ResponseFormatter.formatResponse(toolOutput);\n\n responseMetadata = {\n ...responseMetadata,\n hashLinkBlock: (parsed as Record<string, unknown>).hashLinkBlock,\n };\n }\n } else {\n formattedOutput = ResponseFormatter.formatResponse(toolOutput);\n }\n } catch (error) {\n this.formLogger.warn(\n '❌ METADATA EXTRACTION: Tool output is not JSON',\n {\n error: error instanceof Error ? error.message : 'unknown error',\n outputSample:\n typeof toolOutput === 'string'\n ? toolOutput.substring(0, 200)\n : 'not-string',\n }\n );\n\n formattedOutput = ResponseFormatter.formatResponse(toolOutput);\n }\n\n return {\n output: formattedOutput,\n formCompleted: true,\n originalFormId: submission.formId,\n intermediateSteps: [],\n metadata: responseMetadata,\n rawToolOutput: toolOutput,\n toolName: pendingForm.toolName,\n };\n } catch (error) {\n if (error instanceof ZodError) {\n return this.handleValidationError(error, mergedToolInput, []);\n }\n throw error;\n }\n }\n\n /**\n * Extracts tool information from the execution context\n */\n private extractToolInfoFromError(\n error: ZodError,\n inputs: Record<string, unknown>,\n intermediateSteps: AgentStep[]\n ): { toolName: string; schema: unknown } | null {\n try {\n if (intermediateSteps.length > 0) {\n const lastStep = intermediateSteps[intermediateSteps.length - 1];\n if (lastStep.action && lastStep.action.tool) {\n const tool = this.tools.find((t) => t.name === lastStep.action.tool);\n if (tool && 'schema' in tool) {\n this.formLogger.info(\n 'Found tool from intermediate steps:',\n lastStep.action.tool\n );\n return {\n toolName: lastStep.action.tool,\n schema: (tool as 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(\n 'Found tool from context:',\n toolFromContext.toolName\n );\n return toolFromContext;\n }\n\n return null;\n } catch (err) {\n this.formLogger.error('Error extracting tool info:', err);\n return null;\n }\n }\n\n /**\n * Attempts to find tool from execution context\n */\n private findToolFromContext(inputs: Record<string, unknown>): {\n toolName: string;\n schema: unknown;\n } | null {\n const inputText = (inputs.input as string) || '';\n\n for (const tool of this.tools) {\n const keywords = this.extractToolKeywords(tool.name);\n\n if (\n keywords.some((keyword) =>\n inputText.toLowerCase().includes(keyword.toLowerCase())\n )\n ) {\n if ('schema' in tool) {\n return {\n toolName: tool.name,\n schema: (tool as 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(\n 'Detected tool from error path analysis:',\n tool.name\n );\n return {\n toolName: tool.name,\n schema: toolSchema,\n };\n }\n }\n }\n\n return null;\n }\n\n /**\n * Checks if a schema structure matches error paths\n */\n private schemaMatchesErrorPaths(\n schema: unknown,\n errorPaths: string[]\n ): boolean {\n const schemaRecord = schema as Record<string, unknown>;\n if (!schemaRecord || !schemaRecord._def) return false;\n\n try {\n const def = schemaRecord._def as Record<string, unknown>;\n if (def.typeName === 'ZodObject') {\n const shape = def.shape as Record<string, unknown>;\n const schemaKeys = Object.keys(shape || {});\n return errorPaths.some((path) => {\n const topLevelKey = path.split('.')[0];\n return schemaKeys.includes(topLevelKey);\n });\n }\n } catch (err) {\n this.formLogger.debug('Error analyzing schema structure:', err);\n }\n\n return false;\n }\n\n /**\n * Extracts keywords from tool name for matching\n */\n private extractToolKeywords(toolName: string): string[] {\n const words = toolName\n .replace(/([A-Z])/g, ' $1')\n .toLowerCase()\n .split(/[\\s_-]+/)\n .filter((w) => w.length > 2);\n\n return [...words, toolName.toLowerCase()];\n }\n\n /**\n * Formats the form message for display\n */\n private formatFormResponse(formMessage: FormMessage): string {\n const fieldCount = formMessage.formConfig.fields.length;\n const fieldList = formMessage.formConfig.fields\n .slice(0, 3)\n .map((f) => `• ${f.label}`)\n .join('\\n');\n\n return `I need some additional information to complete your request.\n\n${formMessage.formConfig.description}\n\nRequired fields:\n${fieldList}${fieldCount > 3 ? `\\n... and ${fieldCount - 3} more` : ''}\n\nPlease fill out the form below to continue.`;\n }\n\n /**\n * Check if there are pending forms\n */\n hasPendingForms(): boolean {\n return this.pendingForms.size > 0;\n }\n\n /**\n * Get information about pending forms\n */\n getPendingFormsInfo(): Array<{ formId: string; toolName: string }> {\n return Array.from(this.pendingForms.entries()).map(([formId, info]) => ({\n formId,\n toolName: info.toolName,\n }));\n }\n\n /**\n * Processes HashLink block responses from tools\n */\n private processHashLinkResponse(\n toolResponse: ToolResponse\n ): HashLinkResponse {\n try {\n let hashLinkBlock: HashLinkBlock | undefined;\n\n if (toolResponse.hashLinkBlock) {\n hashLinkBlock = toolResponse.hashLinkBlock;\n } else if (\n toolResponse.success &&\n toolResponse.inscription &&\n toolResponse.hashLinkBlock\n ) {\n hashLinkBlock = toolResponse.hashLinkBlock;\n }\n\n if (!hashLinkBlock) {\n throw new Error('HashLink block data not found in response');\n }\n\n if (\n !hashLinkBlock.blockId ||\n !hashLinkBlock.hashLink ||\n !hashLinkBlock.attributes\n ) {\n throw new Error(\n 'Invalid HashLink block structure - missing required fields'\n );\n }\n\n let message = 'Content processed successfully!';\n\n if (toolResponse.success && toolResponse.inscription) {\n const inscription = toolResponse.inscription;\n const metadata = toolResponse.metadata || {};\n\n message = `✅ ${inscription.standard} Hashinal inscription completed!\\n\\n`;\n\n if (metadata.name) {\n message += `**${metadata.name}**\\n`;\n }\n\n if (metadata.description) {\n message += `${metadata.description}\\n\\n`;\n }\n\n message += `📍 **Topic ID:** ${inscription.topicId}\\n`;\n message += `🔗 **HRL:** ${inscription.hrl}\\n`;\n\n if (inscription.cdnUrl) {\n message += `🌐 **CDN URL:** ${inscription.cdnUrl}\\n`;\n }\n\n if (metadata.creator) {\n message += `👤 **Creator:** ${metadata.creator}\\n`;\n }\n }\n\n this.formLogger.info('Processed HashLink response', {\n blockId: hashLinkBlock.blockId,\n hashLink: hashLinkBlock.hashLink,\n hasTemplate: !!hashLinkBlock.template,\n attributeCount: Object.keys(hashLinkBlock.attributes || {}).length,\n });\n\n return {\n hasHashLinkBlocks: true,\n hashLinkBlock,\n message,\n };\n } catch (error) {\n this.formLogger.error('Error processing HashLink response:', error);\n\n return {\n hasHashLinkBlocks: false,\n message: 'Content processed, but interactive display is not available.',\n };\n }\n }\n\n /**\n * Get FormEngine statistics for debugging\n */\n getFormEngineStatistics(): {\n strategies: string[];\n middleware: string[];\n } {\n return {\n strategies: this.formEngine.getRegisteredStrategies(),\n middleware: this.formEngine.getRegisteredMiddleware(),\n };\n }\n}\n"],"names":[],"mappings":";;;;;;;AAgBA,MAAM,yCAAuD,IAAA;AAwEtD,MAAM,+BAA+B,cAAc;AAAA,EAiCxD,eAAe,MAAmD;AAChE,UAAM,GAAG,IAAI;AA9Bf,SAAQ,mCAAiD,IAAA;AA+BvD,SAAK,gBAAgB,IAAI,cAAA;AACzB,SAAK,aAAa,IAAI;AAAA,MACpB,IAAI,OAAO,EAAE,QAAQ,qCAAqC;AAAA,IAAA;AAE5D,SAAK,aAAa,IAAI,OAAO,EAAE,QAAQ,0BAA0B;AACjE,SAAK,iCAAiC;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EA7BQ,YAAY,QAAuD;AACzE,WAAO,kBAAkB,EAAE;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKQ,iBACN,UAGA;AACA,WACE,OAAO,aAAa,YACpB,aAAa,QACb,mBAAmB,YACnB,OAAQ,SAAqC,kBAAkB,YAC9D,SAAqC,kBAAkB;AAAA,EAE5D;AAAA;AAAA;AAAA;AAAA,EAeA,kCACE,UACM;AACN,SAAK,iCAAiC;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAe,cACb,aACA,QACA,mBACA,YACA,QACoC;AACpC,SAAK,WAAW,KAAK,sDAAsD;AAAA,MACzE,gBAAgB,OAAO,KAAK,WAAW;AAAA,MACvC,WAAW,OAAO,KAAK,MAAM;AAAA,IAAA,CAC9B;AAED,UAAM,SAAS,MAAM,KAAK,MAAM;AAAA,MAC9B;AAAA,MACA;AAAA,MACA,YAAY,SAAA;AAAA,IAAS;AAGvB,QAAI,kBAAkB,QAAQ;AAC5B,WAAK,WAAW,KAAK,+CAA+C;AACpE,aAAO;AAAA,IACT;AAEA,UAAM,SAAS;AACf,UAAM,WAAW,OAAO;AACxB,UAAM,YAAY,OAAO;AAEzB,SAAK,WAAW,KAAK,8BAA8B,QAAQ,IAAI;AAAA,MAC7D;AAAA,MACA,kBAAkB,YAAY;AAAA,MAC9B,eAAe,OAAO,KAAK,aAAa,CAAA,CAAE;AAAA,IAAA,CAC3C;AAED,UAAM,OACJ,YAAY,QAAQ,KAAK,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ;AAErE,QAAI,CAAC,MAAM;AACT,WAAK,WAAW,MAAM,QAAQ,QAAQ,wBAAwB;AAC9D,YAAM,IAAI,MAAM,SAAS,QAAQ,aAAa;AAAA,IAChD;AAEA,QAAI,qBAAqB;AAEzB,QAAI,kBAAkB,IAAI,GAAG;AAC3B,WAAK,WAAW;AAAA,QACd,WAAW,QAAQ;AAAA,QACnB;AAAA,UACE;AAAA,QAAA;AAAA,MACF;AAGF,UAAI;AACF,6BAAqB,KAAK,mBAAmB,SAAS;AACtD,aAAK,WAAW;AAAA,UACd,gDAAgD,kBAAkB;AAAA,UAClE;AAAA,YACE;AAAA,YACA;AAAA,UAAA;AAAA,QACF;AAAA,MAEJ,SAAS,OAAO;AACd,aAAK,WAAW;AAAA,UACd,yCAAyC,QAAQ;AAAA,UACjD;AAAA,QAAA;AAEF,6BAAqB;AAAA,MACvB;AAAA,IACF;AAEA,QAAI,oBAAoB;AACtB,WAAK,WAAW,KAAK,oCAAoC,QAAQ,EAAE;AAEnE,UAAI;AACF,YAAI;AACJ,YAAI,kBAAkB;AAEtB,YAAI,kBAAkB,IAAI,GAAG;AAC3B,eAAK,WAAW;AAAA,YACd,WAAW,QAAQ;AAAA,UAAA;AAErB,cAAI;AACF,kBAAM,gBAAgB,KAAK,cAAA;AAC3B,gBAAI,eAAe;AACjB,4BAAc;AACd,gCAAkB;AAClB,mBAAK,WAAW;AAAA,gBACd,8CAA8C,QAAQ;AAAA,cAAA;AAAA,YAE1D,OAAO;AACL,mBAAK,WAAW;AAAA,gBACd,+CAA+C,QAAQ;AAAA,cAAA;AAEzD,4BAAc,KAAK;AACnB,gCAAkB;AAAA,YACpB;AAAA,UACF,SAAS,OAAO;AACd,iBAAK,WAAW;AAAA,cACd,qCAAqC,QAAQ;AAAA,cAC7C;AAAA,YAAA;AAEF,iBAAK,WAAW;AAAA,cACd,sCAAsC,QAAQ;AAAA,YAAA;AAEhD,0BAAc,KAAK;AACnB,8BAAkB;AAAA,UACpB;AAAA,QACF,OAAO;AACL,eAAK,WAAW;AAAA,YACd,QAAQ,QAAQ;AAAA,UAAA;AAElB,wBAAc,KAAK;AACnB,4BAAkB;AAAA,QACpB;AAEA,YAAI,mBAAmB;AACvB,YAAI;AACF,cAAI,KAAK,YAAY,WAAW,GAAG;AACjC,kBAAM,YAAY;AAClB,kBAAM,QAAQ,UAAU;AACxB,gBAAI,SAAS,OAAO,UAAU,UAAU;AACtC,iCAAmB,OAAO,KAAK,KAAK,EAAE,OAAO,SAAA;AAAA,YAC/C;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAAC;AAET,aAAK,WAAW;AAAA,UACd,2BACE,kBAAkB,YAAY,SAChC;AAAA,UACA;AAAA,YACE;AAAA,YACA,YAAY,aAAa,aAAa;AAAA,YACtC,qBAAqB;AAAA,YACrB;AAAA,UAAA;AAAA,QACF;AAGF,YAAI;AAEJ,YAAI,iBAAiB;AACnB,eAAK,WAAW;AAAA,YACd;AAAA,UAAA;AAEF,0BAAgB;AAAA,QAClB,OAAO;AACL,8CAAoB,IAAA;AACpB,cAAI,KAAK,YAAY,WAAW,GAAG;AACjC,kBAAM,YAAY;AAClB,kBAAM,QAAQ,UAAU,SAAS,CAAA;AACjC,uBAAW,aAAa,OAAO,KAAK,KAAK,GAAG;AAC1C,oBAAM,SAAS,aAAa,CAAA,GAAI,SAAS;AAEzC,oBAAM,UACJ,kBAAkB,IAAI,KAAK,KAAK,eAC5B,KAAK,aAAa,WAAW,KAAK,IAClC,UAAU,UACV,UAAU,MACV,UAAU,QACT,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW;AAEhD,oBAAM,aAAa,KAAK,gBAAgB,aAAa,SAAS;AAE9D,oBAAM,cACJ,kBAAkB,IAAI,KAAK,KAAK,qBAC5B,KAAK,mBAAA,EAAqB,SAAS,SAAS,IAC5C;AAEN,mBAAK,WAAW,KAAK,sBAAsB,SAAS,IAAI;AAAA,gBACtD;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,wBAAwB,YAAY,cAAc;AAAA,cAAA,CACnD;AAED,kBAAI,YAAY,cAAc,cAAc;AAC1C,8BAAc,IAAI,SAAS;AAAA,cAC7B;AAAA,YACF;AAAA,UACF;AAEA,eAAK,WAAW,KAAK,uCAAuC;AAAA,YAC1D,aAAa,KAAK,YAAY,WAAW,IACrC,OAAO,KAAK,YAAY,KAAK,EAAE,SAC/B;AAAA,YACJ,oBAAoB,cAAc;AAAA,YAClC,eAAe,MAAM,KAAK,aAAa;AAAA,UAAA,CACxC;AAAA,QACH;AAEA,cAAM,cAAc,MAAM,KAAK,cAAc;AAAA,UAC3C;AAAA,UACA;AAAA,UACA;AAAA,YACE;AAAA,YACA,iBAAiB,KAAK;AAAA,UAAA;AAAA,UAExB;AAAA;AAAA,QAAA;AAGF,YAAI,KAAK,YAAY,WAAW,GAAG;AACjC,cAAI;AACF,kBAAM,EAAE,YAAY,SAAA,IAClB,KAAK,cAAc;AAAA,cACjB;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAEJ,wBAAY,aAAa;AACzB,wBAAY,WAAW;AAAA,UACzB,SAAS,OAAO;AACd,iBAAK,WAAW;AAAA,cACd;AAAA,cACA;AAAA,YAAA;AAAA,UAEJ;AAAA,QACF;AAEA,oBAAY,eAAe;AAE3B,cAAM,WAA4B;AAAA,UAChC;AAAA,UACA,eAAe;AAAA,UACf,mBAAmB;AAAA,UACnB,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,iBACE,KAKA;AAAA,QAAA;AAEJ,aAAK,aAAa,IAAI,YAAY,IAAI,QAAQ;AAC9C,2BAAmB,IAAI,YAAY,IAAI,QAAQ;AAE/C,aAAK,WAAW,KAAK,gCAAgC,QAAQ,EAAE;AAE/D,cAAM,aAAa;AAAA,UACjB,cAAc;AAAA,UACd;AAAA,QAAA;AAGF,eAAO;AAAA,UACL;AAAA,YACE;AAAA,YACA,aAAa,KAAK,UAAU,UAAU;AAAA,UAAA;AAAA,QACxC;AAAA,MAEJ,SAAS,OAAO;AACd,aAAK,WAAW,MAAM,8BAA8B,QAAQ,KAAK,KAAK;AAAA,MACxE;AAAA,IACF;AAEA,SAAK,WAAW;AAAA,MACd,kDAAkD,QAAQ;AAAA,IAAA;AAG5D,QAAI,KAAK,kCAAkC,WAAW;AACpD,WAAK,WAAW;AAAA,QACd,2CAA2C,QAAQ;AAAA,MAAA;AAErD,UAAI;AACF,cAAM,oBAAoB,MAAM,KAAK;AAAA,UACnC;AAAA,UACA;AAAA,QAAA;AAGF,YACE,qBACA,OAAO,sBAAsB,YAC7B,mBAAoB,mBACpB;AACA,gBAAM,KAAM,kBAA8C;AAc1D,gBAAM,SAAS,GAAG,MAAM,QAAQ,KAAK,KAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AACjF,gBAAM,cAAc;AAAA,YAClB,MAAM;AAAA,YACN,IAAI;AAAA,YACJ,gBAAgB;AAAA,YAChB;AAAA,YACA,YAAY;AAAA,cACV,OAAO,GAAG,SAAS;AAAA,cACnB,aACE,GAAG,eACH;AAAA,cACF,aAAa,GAAG,eAAe;AAAA,cAC/B,SAAS,GAAG,UAAU,CAAA,GAAI,IAAI,CAAC,MAAM;AACnC,sBAAM,eAAiC;AAAA,kBACrC;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,gBAAA;AAEF,sBAAM,eAA+B,aAAa;AAAA,kBAChD,EAAE;AAAA,gBAAA,IAEC,EAAE,OACH;AAEJ,uBAAO;AAAA,kBACL,MAAM,EAAE;AAAA,kBACR,OAAO,EAAE;AAAA,kBACT,MAAM;AAAA,kBACN,UAAU,EAAE,YAAY;AAAA,kBACxB,SAAS,EAAE;AAAA,gBAAA;AAAA,cAEf,CAAC;AAAA,YAAA;AAAA,UACH;AAGF,gBAAM,iBAAiB,kBAAkB,IAAI,KACxC,MAAM;AACL,gBAAI;AACF,oBAAM,IAAI,KAAK,cAAA;AACf,qBAAO,KAAK,KAAK;AAAA,YACnB,QAAQ;AACN,qBAAO,KAAK;AAAA,YACd;AAAA,UACF,GAAA,IACA,KAAK;AAET,eAAK,aAAa,IAAI,QAAQ;AAAA,YAC5B;AAAA,YACA,eAAe;AAAA,YACf,mBAAmB;AAAA,YACnB,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,iBACE,KACA;AAAA,UAAA,CACH;AACD,6BAAmB,IAAI,QAAQ;AAAA,YAC7B;AAAA,YACA,eAAe;AAAA,YACf,mBAAmB;AAAA,YACnB,QAAQ;AAAA,UAAA,CACT;AAED,iBAAO;AAAA,YACL;AAAA,cACE;AAAA,cACA,aAAa,KAAK,UAAU,EAAE,cAAc,MAAM,aAAa;AAAA,YAAA;AAAA,UACjE;AAAA,QAEJ;AAEA,YAAI,KAAK,UAAU,iBAAiB,MAAM,KAAK,UAAU,SAAS,GAAG;AACnE,eAAK,WAAW,KAAK,kCAAkC,QAAQ,KAAK;AAAA,YAClE,UAAU,OAAO,KAAK,SAAoC;AAAA,YAC1D,cAAc,OAAO,KAAK,iBAAiB;AAAA,YAC3C,YAAY;AAAA,UAAA,CACb;AAED,cAAI;AACD,mBAA8D,YAC7D;AAAA,UACJ,QAAQ;AAAA,UAAC;AAAA,QACX,OAAO;AACL,eAAK,WAAW,MAAM,mCAAmC,QAAQ,EAAE;AAAA,QACrE;AAAA,MACF,SAAS,iBAAiB;AACxB,aAAK,WAAW;AAAA,UACd,sCAAsC,QAAQ;AAAA,UAC9C;AAAA,QAAA;AAAA,MAEJ;AAAA,IACF;AAEA,WAAO,MAAM;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,QAAiB,WAA4B;AACnE,QAAI,CAAC,UAAU,CAAC,WAAW;AACzB,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,MAAM;AACZ,YAAM,MAAM,IAAI;AAChB,UAAI,CAAC,OAAO,IAAI,aAAa,aAAa;AACxC,eAAO;AAAA,MACT;AACA,YAAM,WACJ,OAAQ,IAA4B,UAAU,aACzC,IAAsD,UACtD,IAAiD;AACxD,UAAI,CAAC,YAAY,OAAO,aAAa,UAAU;AAC7C,eAAO;AAAA,MACT;AACA,YAAM,QAAQ;AACd,YAAM,cAAc,MAAM,SAAS;AACnC,UAAI,CAAC,aAAa;AAChB,eAAO;AAAA,MACT;AACA,YAAM,iBAAiB,CAAC,MAAkC;AACxD,cAAM,QACJ,EAGA;AACF,YAAI,SAAS,MAAM,aAAa,iBAAiB,MAAM,WAAW;AAChE,iBAAO,MAAM;AAAA,QACf;AACA,eAAO;AAAA,MACT;AACA,YAAM,YAAY,eAAe,WAAW;AAC5C,YAAM,OACJ,UAGA;AACF,UAAI,CAAC,MAAM;AACT,eAAO;AAAA,MACT;AACA,UAAI,KAAK,aAAa,iBAAiB,KAAK,aAAa,cAAc;AACrE,eAAO;AAAA,MACT;AACA,UAAI,KAAK,iBAAiB,QAAW;AACnC,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,WAAK,WAAW;AAAA,QACd,gCAAgC,SAAS;AAAA,QACzC;AAAA,MAAA;AAAA,IAEJ;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAe,MACb,QACkC;AAClC,QAAI;AACF,YAAM,SAAS,MAAM,MAAM,MAAM,MAAM;AAEvC,UAAI,OAAO,qBAAqB,MAAM,QAAQ,OAAO,iBAAiB,GAAG;AACvE,mBAAW,QAAQ,OAAO,mBAAmB;AAC3C,cAAI,KAAK,aAAa;AACpB,gBAAI;AACF,oBAAM,SACJ,OAAO,KAAK,gBAAgB,WACxB,KAAK,MAAM,KAAK,WAAW,IAC1B,KAAK;AAEZ,kBAAI,OAAO,gBAAgB,OAAO,aAAa;AAC7C,qBAAK,WAAW,KAAK,kCAAkC;AAAA,kBACrD,UAAU,KAAK,QAAQ;AAAA,kBACvB,SAAS;AAAA,gBAAA,CACV;AAED,sBAAM,iBACH,KAA8B,QAAQ,QAAQ;AACjD,sBAAM,eAAe,KAAK,MAAM;AAAA,kBAC9B,CAAC,MAAM,EAAE,SAAS;AAAA,gBAAA;AAEpB,sBAAM,wBACH,gBAIK,CAAA;AACR,sBAAM,KAAsB;AAAA,kBAC1B,UAAU;AAAA,kBACV,eAAe;AAAA,kBACf,mBAAoB,KAA8B,QAC9C;AAAA,kBACJ,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,iBAAiB,uBAAuB;AAAA,gBAAA;AAE1C,qBAAK,aAAa,IAAI,OAAO,YAAY,IAAI,EAAE;AAC/C,mCAAmB,IAAI,OAAO,YAAY,IAAI,EAAE;AAEhD,uBAAO;AAAA,kBACL,GAAG;AAAA,kBACH,cAAc;AAAA,kBACd,aAAa,OAAO;AAAA,kBACpB,QACE,OAAO,WAAW;AAAA,gBAAA;AAAA,cAExB;AAEA,kBACE,OAAO,iBACN,OAAO,WAAW,OAAO,eAAe,OAAO,eAChD;AACA,qBAAK,WAAW,KAAK,iCAAiC;AAAA,kBACpD,UAAW,KAA8B,QAAQ;AAAA,kBACjD,aAAa;AAAA,kBACb,SAAS,OAAO,eAAe;AAAA,gBAAA,CAChC;AAED,sBAAM,mBAAmB,KAAK,wBAAwB,MAAM;AAE5D,uBAAO;AAAA,kBACL,GAAG;AAAA,kBACH,mBAAmB;AAAA,kBACnB,eAAe,iBAAiB;AAAA,kBAChC,QAAQ,iBAAiB;AAAA,gBAAA;AAAA,cAE7B;AAAA,YACF,QAAQ;AAAA,YAAC;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,iBAAiB,UAAU;AAC7B,aAAK,WAAW,KAAK,6CAA6C;AAClE,eAAO,KAAK,sBAAsB,OAAO,QAAQ,CAAA,CAAE;AAAA,MACrD;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,sBACZ,OACA,QACA,mBACkC;AAClC,SAAK,WAAW,KAAK,kDAAkD;AAAA,MACrE,aAAa,MAAM,OAAO;AAAA,MAC1B,WAAW,OAAO,KAAK,MAAM;AAAA,IAAA,CAC9B;AAED,QAAI,WAAW,KAAK;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAGF,QAAI,CAAC,UAAU;AACb,WAAK,WAAW;AAAA,QACd;AAAA,MAAA;AAEF,YAAM,eAAe,KAAK,2BAA2B,KAAK;AAC1D,UAAI,CAAC,cAAc;AACjB,aAAK,WAAW;AAAA,UACd;AAAA,QAAA;AAEF,cAAM;AAAA,MACR;AACA,iBAAW;AAAA,IACb;AAEA,SAAK,WAAW,KAAK,6BAA6B;AAAA,MAChD,UAAU,SAAS;AAAA,MACnB,WAAW,CAAC,CAAC,SAAS;AAAA,IAAA,CACvB;AAED,UAAM,cAAc,KAAK,cAAc;AAAA,MACrC;AAAA,MACA,SAAS;AAAA,MACT,SAAS;AAAA,MACR,OAAO,SAAoB;AAAA,IAAA;AAG9B,SAAK,aAAa,IAAI,YAAY,IAAI;AAAA,MACpC,UAAU,SAAS;AAAA,MACnB,eAAe;AAAA,MACf,QAAQ,SAAS;AAAA,IAAA,CAClB;AAED,uBAAmB,IAAI,YAAY,IAAI;AAAA,MACrC,UAAU,SAAS;AAAA,MACnB,eAAe;AAAA,MACf,QAAQ,SAAS;AAAA,IAAA,CAClB;AAED,WAAO;AAAA,MACL,QAAQ,KAAK,mBAAmB,WAAW;AAAA,MAC3C;AAAA,MACA,cAAc;AAAA,MACd,mBAAmB,qBAAqB,CAAA;AAAA,IAAC;AAAA,EAE7C;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAgD;AAC9C,WAAO,IAAI,IAAI,KAAK,YAAY;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,OAA2C;AAC7D,eAAW,CAAC,QAAQ,QAAQ,KAAK,OAAO;AACtC,WAAK,aAAa,IAAI,QAAQ,QAAQ;AAAA,IACxC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBACJ,YACkC;AAClC,SAAK,WAAW;AAAA,MACd;AAAA,MACA;AAAA,QACE,kBAAkB,WAAW;AAAA,QAC7B,oBAAoB,WAAW;AAAA,MAAA;AAAA,IACjC;AAEF,QAAI,CAAC,YAAY;AACf,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AAEA,QAAI,CAAC,WAAW,QAAQ;AACtB,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,QACE,CAAC,WAAW,cACZ,WAAW,eAAe,QAC1B,OAAO,WAAW,eAAe,YACjC,MAAM,QAAQ,WAAW,UAAU,GACnC;AACA,YAAM,IAAI;AAAA,QACR,2CAA2C,OAAO,WAAW,UAAU,aACrE,WAAW,eAAe,IAC5B,cAAc,MAAM;AAAA,UAClB,WAAW;AAAA,QAAA,CACZ,iBAAiB,KAAK,UAAU,WAAW,UAAU,CAAC;AAAA,MAAA;AAAA,IAE3D;AAEA,SAAK,WAAW,KAAK,+BAA+B;AAAA,MAClD,QAAQ,WAAW;AAAA,MACnB,UAAU,WAAW;AAAA,MACrB,eAAe,OAAO,KAAK,WAAW,UAAU;AAAA,MAChD,gBAAgB,OAAO,WAAW;AAAA,MAClC,kBAAkB,WAAW,eAAe;AAAA,MAC5C,uBAAuB,WAAW,eAAe;AAAA,MACjD,YAAY,CAAC,CAAC,WAAW;AAAA,IAAA,CAC1B;AAED,QAAI,cAAc,KAAK,aAAa,IAAI,WAAW,MAAM;AAEzD,QAAI,CAAC,aAAa;AAChB,oBAAc,mBAAmB,IAAI,WAAW,MAAM;AACtD,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI,MAAM,iCAAiC,WAAW,MAAM,EAAE;AAAA,MACtE;AAAA,IACF;AAEA,SAAK,aAAa,OAAO,WAAW,MAAM;AAC1C,uBAAmB,OAAO,WAAW,MAAM;AAE3C,UAAM,OACJ,YAAY,WACZ,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,YAAY,QAAQ;AACxD,QAAI,CAAC,MAAM;AACT,YAAM,IAAI;AAAA,QACR,uCAAuC,YAAY,QAAQ;AAAA,MAAA;AAAA,IAE/D;AAEA,QAAI,gBAAyC,CAAA;AAC7C,QAAI;AACF,UACE,YAAY,qBACZ,OAAO,YAAY,sBAAsB,UACzC;AACA,wBAAgB;AAAA,UACd,GAAI,YAAY;AAAA,QAAA;AAAA,MAEpB;AAAA,IACF,SAAS,OAAO;AACd,WAAK,WAAW;AAAA,QACd;AAAA,QACA;AAAA,MAAA;AAEF,sBAAgB,CAAA;AAAA,IAClB;AAEA,QAAI,iBAA0C,CAAA;AAC9C,QAAI;AACF,UAAI,WAAW,cAAc,OAAO,WAAW,eAAe,UAAU;AACtE,yBAAiB;AAAA,UACf,GAAI,WAAW;AAAA,QAAA;AAAA,MAEnB;AAAA,IACF,SAAS,OAAO;AACd,WAAK,WAAW;AAAA,QACd;AAAA,QACA;AAAA,MAAA;AAEF,uBAAiB,CAAA;AAAA,IACnB;AAEA,UAAM,kBAA2C,CAAA;AACjD,QAAI;AACF,aAAO,KAAK,aAAa,EAAE,QAAQ,CAAC,QAAQ;AAC1C,cAAM,QAAQ,cAAc,GAAG;AAC/B,YAAI,UAAU,UAAa,UAAU,MAAM;AACzC,0BAAgB,GAAG,IAAI;AAAA,QACzB;AAAA,MACF,CAAC;AAED,aAAO,KAAK,cAAc,EAAE,QAAQ,CAAC,QAAQ;AAC3C,cAAM,QAAQ,eAAe,GAAG;AAChC,YAAI,UAAU,UAAa,UAAU,MAAM;AACzC,0BAAgB,GAAG,IAAI;AAAA,QACzB;AAAA,MACF,CAAC;AAED,sBAAgB,aAAa;AAC7B,sBAAgB,aAAa;AAE7B,WAAK,WAAW,KAAK,mCAAmC;AAAA,QACtD,UAAU,OAAO,KAAK,aAAa;AAAA,QACnC,gBAAgB,OAAO,KAAK,cAAc;AAAA,QAC1C,YAAY,OAAO,KAAK,eAAe;AAAA,MAAA,CACxC;AAAA,IACH,SAAS,OAAO;AACd,WAAK,WAAW,MAAM,oCAAoC,KAAK;AAC/D,YAAM,IAAI;AAAA,QACR,oCACE,iBAAiB,QAAQ,MAAM,UAAU,eAC3C;AAAA,MAAA;AAAA,IAEJ;AAEA,QAAI;AACF,YAAM,eAAe;AAYrB,UAAI;AACJ,UAAI,OAAO,aAAa,oBAAoB,YAAY;AACtD,qBAAa,MAAM,aAAa,gBAAgB,eAAe;AAAA,MACjE,WAAW,OAAO,aAAa,oBAAoB,YAAY;AAC7D,cAAM,KAAK,aAAa,gBAAA;AACxB,cAAM,SAAS;AAIf,YAAI,MAAM,OAAO,OAAO,UAAU,YAAY;AAC5C,uBAAa,MAAM,OAAO,MAAM,eAAe;AAAA,QACjD,WAAW,MAAM,OAAO,OAAO,SAAS,YAAY;AAClD,uBAAa,MAAM,OAAO,KAAK,eAAe;AAAA,QAChD,OAAO;AACL,gBAAM,QAAQ;AAGd,cAAI,OAAO,MAAM,SAAS,YAAY;AACpC,yBAAa,MAAM,MAAM,KAAK,eAAe;AAAA,UAC/C,OAAO;AACL,kBAAM,IAAI;AAAA,cACR;AAAA,YAAA;AAAA,UAEJ;AAAA,QACF;AAAA,MACF,WACE,aAAa,gBACb,OAAO,aAAa,aAAa,UAAU,YAC3C;AACA,qBAAa,MAAM,aAAa,aAAa,MAAM,eAAe;AAAA,MACpE,WACE,aAAa,gBACb,OAAO,aAAa,aAAa,SAAS,YAC1C;AACA,qBAAa,MAAM,aAAa,aAAa,KAAK,eAAe;AAAA,MACnE,WACE,OACE,KAGA,SAAS,YACX;AACA,qBAAa,MACX,KAGA,KAAK,eAAe;AAAA,MACxB,OAAO;AACL,cAAM,IAAI;AAAA,UACR;AAAA,QAAA;AAAA,MAEJ;AAEA,UAAI,mBAA4C,CAAA;AAChD,UAAI;AAEJ,WAAK,WAAW,KAAK,iDAAiD;AAAA,QACpE,YAAY,OAAO;AAAA,QACnB,cAAc,YAAY,UAAU;AAAA,QACpC,UAAU,OAAO,eAAe;AAAA,QAChC,YACE,OAAO,eAAe,WAClB,WAAW,UAAU,GAAG,GAAG,IAC3B;AAAA,MAAA,CACP;AAED,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,UAAU;AACpC,aAAK,WAAW;AAAA,UACd;AAAA,UACA;AAAA,YACE,UAAU,OAAO,KAAK,MAAM;AAAA,YAC5B,kBAAkB,CAAC,CAAE,OAClB;AAAA,UAAA;AAAA,QACL;AAGF,YAAI,UAAU,OAAO,WAAW,UAAU;AACxC,cAAI,kBAAkB,mBAAmB,MAAM,GAAG;AAChD,iBAAK,WAAW;AAAA,cACd;AAAA,YAAA;AAGF,+BAAmB;AAAA,cACjB,GAAG;AAAA,cACH,eAAgB,OAAmC;AAAA,YAAA;AAGrD,8BAAkB,kBAAkB,uBAAuB,MAAM;AAEjE,iBAAK,WAAW;AAAA,cACd;AAAA,cACA;AAAA,gBACE,SAAS,KAAK,iBAAiB,gBAAgB,IAC3C,iBAAiB,cAAc,UAC/B;AAAA,gBACJ,aAAa,KAAK,iBAAiB,gBAAgB,IAC/C,CAAC,CAAC,iBAAiB,cAAc,WACjC;AAAA,cAAA;AAAA,YACN;AAAA,UAEJ,OAAO;AACL,8BAAkB,kBAAkB,eAAe,UAAU;AAE7D,+BAAmB;AAAA,cACjB,GAAG;AAAA,cACH,eAAgB,OAAmC;AAAA,YAAA;AAAA,UAEvD;AAAA,QACF,OAAO;AACL,4BAAkB,kBAAkB,eAAe,UAAU;AAAA,QAC/D;AAAA,MACF,SAAS,OAAO;AACd,aAAK,WAAW;AAAA,UACd;AAAA,UACA;AAAA,YACE,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,YAChD,cACE,OAAO,eAAe,WAClB,WAAW,UAAU,GAAG,GAAG,IAC3B;AAAA,UAAA;AAAA,QACR;AAGF,0BAAkB,kBAAkB,eAAe,UAAU;AAAA,MAC/D;AAEA,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,eAAe;AAAA,QACf,gBAAgB,WAAW;AAAA,QAC3B,mBAAmB,CAAA;AAAA,QACnB,UAAU;AAAA,QACV,eAAe;AAAA,QACf,UAAU,YAAY;AAAA,MAAA;AAAA,IAE1B,SAAS,OAAO;AACd,UAAI,iBAAiB,UAAU;AAC7B,eAAO,KAAK,sBAAsB,OAAO,iBAAiB,CAAA,CAAE;AAAA,MAC9D;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,yBACN,OACA,QACA,mBAC8C;AAC9C,QAAI;AACF,UAAI,kBAAkB,SAAS,GAAG;AAChC,cAAM,WAAW,kBAAkB,kBAAkB,SAAS,CAAC;AAC/D,YAAI,SAAS,UAAU,SAAS,OAAO,MAAM;AAC3C,gBAAM,OAAO,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS,OAAO,IAAI;AACnE,cAAI,QAAQ,YAAY,MAAM;AAC5B,iBAAK,WAAW;AAAA,cACd;AAAA,cACA,SAAS,OAAO;AAAA,YAAA;AAElB,mBAAO;AAAA,cACL,UAAU,SAAS,OAAO;AAAA,cAC1B,QAAS,KAA4C;AAAA,YAAA;AAAA,UAEzD;AAAA,QACF;AAAA,MACF;AAEA,YAAM,aAAc,OAAO,qBAAmC,CAAA;AAC9D,UAAI,WAAW,SAAS,GAAG;AACzB,cAAM,WAAW,WAAW,WAAW,SAAS,CAAC;AACjD,YAAI;AAEJ,YAAI,MAAM,QAAQ,QAAQ,KAAK,SAAS,SAAS,GAAG;AAClD,mBAAS,SAAS,CAAC;AAAA,QACrB,WAAY,SAAqC,QAAQ;AACvD,mBAAU,SAAqC;AAAA,QACjD,OAAO;AACL,mBAAS;AAAA,QACX;AAEA,YAAI,UAAU,OAAO,MAAM;AACzB,gBAAM,OAAO,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO,IAAI;AAC1D,cAAI,QAAQ,YAAY,MAAM;AAC5B,iBAAK,WAAW,KAAK,gCAAgC,OAAO,IAAI;AAChE,mBAAO;AAAA,cACL,UAAU,OAAO;AAAA,cACjB,QAAS,KAA4C;AAAA,YAAA;AAAA,UAEzD;AAAA,QACF;AAAA,MACF;AAEA,YAAM,kBAAkB,KAAK,oBAAoB,MAAM;AACvD,UAAI,iBAAiB;AACnB,aAAK,WAAW;AAAA,UACd;AAAA,UACA,gBAAgB;AAAA,QAAA;AAElB,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,WAAK,WAAW,MAAM,+BAA+B,GAAG;AACxD,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,QAGnB;AACP,UAAM,YAAa,OAAO,SAAoB;AAE9C,eAAW,QAAQ,KAAK,OAAO;AAC7B,YAAM,WAAW,KAAK,oBAAoB,KAAK,IAAI;AAEnD,UACE,SAAS;AAAA,QAAK,CAAC,YACb,UAAU,YAAA,EAAc,SAAS,QAAQ,aAAa;AAAA,MAAA,GAExD;AACA,YAAI,YAAY,MAAM;AACpB,iBAAO;AAAA,YACL,UAAU,KAAK;AAAA,YACf,QAAS,KAA4C;AAAA,UAAA;AAAA,QAEzD;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,2BACN,OAC8C;AAC9C,UAAM,aAAa,MAAM,OAAO,IAAI,CAAC,UAAU,MAAM,KAAK,KAAK,GAAG,CAAC;AAEnE,eAAW,QAAQ,KAAK,OAAO;AAC7B,UAAI,YAAY,MAAM;AACpB,cAAM,aAAc,KAA4C;AAChE,YAAI,KAAK,wBAAwB,YAAY,UAAU,GAAG;AACxD,eAAK,WAAW;AAAA,YACd;AAAA,YACA,KAAK;AAAA,UAAA;AAEP,iBAAO;AAAA,YACL,UAAU,KAAK;AAAA,YACf,QAAQ;AAAA,UAAA;AAAA,QAEZ;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,wBACN,QACA,YACS;AACT,UAAM,eAAe;AACrB,QAAI,CAAC,gBAAgB,CAAC,aAAa,KAAM,QAAO;AAEhD,QAAI;AACF,YAAM,MAAM,aAAa;AACzB,UAAI,IAAI,aAAa,aAAa;AAChC,cAAM,QAAQ,IAAI;AAClB,cAAM,aAAa,OAAO,KAAK,SAAS,CAAA,CAAE;AAC1C,eAAO,WAAW,KAAK,CAAC,SAAS;AAC/B,gBAAM,cAAc,KAAK,MAAM,GAAG,EAAE,CAAC;AACrC,iBAAO,WAAW,SAAS,WAAW;AAAA,QACxC,CAAC;AAAA,MACH;AAAA,IACF,SAAS,KAAK;AACZ,WAAK,WAAW,MAAM,qCAAqC,GAAG;AAAA,IAChE;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,UAA4B;AACtD,UAAM,QAAQ,SACX,QAAQ,YAAY,KAAK,EACzB,YAAA,EACA,MAAM,SAAS,EACf,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAE7B,WAAO,CAAC,GAAG,OAAO,SAAS,aAAa;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,aAAkC;AAC3D,UAAM,aAAa,YAAY,WAAW,OAAO;AACjD,UAAM,YAAY,YAAY,WAAW,OACtC,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,MAAM,KAAK,EAAE,KAAK,EAAE,EACzB,KAAK,IAAI;AAEZ,WAAO;AAAA;AAAA,EAET,YAAY,WAAW,WAAW;AAAA;AAAA;AAAA,EAGlC,SAAS,GAAG,aAAa,IAAI;AAAA,UAAa,aAAa,CAAC,UAAU,EAAE;AAAA;AAAA;AAAA,EAGpE;AAAA;AAAA;AAAA;AAAA,EAKA,kBAA2B;AACzB,WAAO,KAAK,aAAa,OAAO;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAmE;AACjE,WAAO,MAAM,KAAK,KAAK,aAAa,SAAS,EAAE,IAAI,CAAC,CAAC,QAAQ,IAAI,OAAO;AAAA,MACtE;AAAA,MACA,UAAU,KAAK;AAAA,IAAA,EACf;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,wBACN,cACkB;AAClB,QAAI;AACF,UAAI;AAEJ,UAAI,aAAa,eAAe;AAC9B,wBAAgB,aAAa;AAAA,MAC/B,WACE,aAAa,WACb,aAAa,eACb,aAAa,eACb;AACA,wBAAgB,aAAa;AAAA,MAC/B;AAEA,UAAI,CAAC,eAAe;AAClB,cAAM,IAAI,MAAM,2CAA2C;AAAA,MAC7D;AAEA,UACE,CAAC,cAAc,WACf,CAAC,cAAc,YACf,CAAC,cAAc,YACf;AACA,cAAM,IAAI;AAAA,UACR;AAAA,QAAA;AAAA,MAEJ;AAEA,UAAI,UAAU;AAEd,UAAI,aAAa,WAAW,aAAa,aAAa;AACpD,cAAM,cAAc,aAAa;AACjC,cAAM,WAAW,aAAa,YAAY,CAAA;AAE1C,kBAAU,KAAK,YAAY,QAAQ;AAAA;AAAA;AAEnC,YAAI,SAAS,MAAM;AACjB,qBAAW,KAAK,SAAS,IAAI;AAAA;AAAA,QAC/B;AAEA,YAAI,SAAS,aAAa;AACxB,qBAAW,GAAG,SAAS,WAAW;AAAA;AAAA;AAAA,QACpC;AAEA,mBAAW,oBAAoB,YAAY,OAAO;AAAA;AAClD,mBAAW,eAAe,YAAY,GAAG;AAAA;AAEzC,YAAI,YAAY,QAAQ;AACtB,qBAAW,mBAAmB,YAAY,MAAM;AAAA;AAAA,QAClD;AAEA,YAAI,SAAS,SAAS;AACpB,qBAAW,mBAAmB,SAAS,OAAO;AAAA;AAAA,QAChD;AAAA,MACF;AAEA,WAAK,WAAW,KAAK,+BAA+B;AAAA,QAClD,SAAS,cAAc;AAAA,QACvB,UAAU,cAAc;AAAA,QACxB,aAAa,CAAC,CAAC,cAAc;AAAA,QAC7B,gBAAgB,OAAO,KAAK,cAAc,cAAc,CAAA,CAAE,EAAE;AAAA,MAAA,CAC7D;AAED,aAAO;AAAA,QACL,mBAAmB;AAAA,QACnB;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ,SAAS,OAAO;AACd,WAAK,WAAW,MAAM,uCAAuC,KAAK;AAElE,aAAO;AAAA,QACL,mBAAmB;AAAA,QACnB,SAAS;AAAA,MAAA;AAAA,IAEb;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,0BAGE;AACA,WAAO;AAAA,MACL,YAAY,KAAK,WAAW,wBAAA;AAAA,MAC5B,YAAY,KAAK,WAAW,wBAAA;AAAA,IAAwB;AAAA,EAExD;AACF;"}
|
package/dist/esm/index30.js
CHANGED
|
@@ -1,159 +1,251 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { StructuredTool } from "@langchain/core/tools";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { Logger } from "@hashgraphonline/standards-sdk";
|
|
4
|
+
import { isFormValidatable } from "@hashgraphonline/standards-agent-kit";
|
|
5
|
+
class FormValidatingToolWrapper extends StructuredTool {
|
|
6
|
+
constructor(originalTool, formGenerator, config = {}) {
|
|
7
|
+
super();
|
|
8
|
+
this.originalTool = originalTool;
|
|
9
|
+
this.formGenerator = formGenerator;
|
|
10
|
+
this.validationConfig = config;
|
|
11
|
+
this.logger = new Logger({ module: "FormValidatingToolWrapper" });
|
|
12
|
+
this.name = originalTool.name;
|
|
13
|
+
this.description = originalTool.description;
|
|
14
|
+
this.schema = originalTool.schema;
|
|
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
|
+
});
|
|
5
20
|
}
|
|
6
21
|
/**
|
|
7
|
-
*
|
|
22
|
+
* Validate the input against the schema
|
|
8
23
|
*/
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
24
|
+
validateInput(input) {
|
|
25
|
+
try {
|
|
26
|
+
this.schema.parse(input);
|
|
27
|
+
return { isValid: true };
|
|
28
|
+
} catch (error) {
|
|
29
|
+
if (error instanceof z.ZodError) {
|
|
30
|
+
const errors = error.errors.filter((err) => {
|
|
31
|
+
const fieldName = err.path[0];
|
|
32
|
+
return !this.validationConfig.skipFields?.includes(fieldName);
|
|
33
|
+
}).map((err) => `${err.path.join(".")}: ${err.message}`);
|
|
34
|
+
return { isValid: false, errors };
|
|
35
|
+
}
|
|
36
|
+
return { isValid: false, errors: ["Validation failed"] };
|
|
12
37
|
}
|
|
13
|
-
return FieldTypeRegistry.instance;
|
|
14
38
|
}
|
|
15
39
|
/**
|
|
16
|
-
*
|
|
40
|
+
* Gets the shape keys from the schema if it's a ZodObject
|
|
17
41
|
*/
|
|
18
|
-
|
|
19
|
-
this.
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
});
|
|
24
|
-
this.register("numeric-supply", {
|
|
25
|
-
pattern: /supply$/i,
|
|
26
|
-
type: "number",
|
|
27
|
-
priority: 10
|
|
28
|
-
});
|
|
29
|
-
this.register("numeric-amounts", {
|
|
30
|
-
pattern: /(?:amount|quantity|count|total|sum|value)$/i,
|
|
31
|
-
type: "number",
|
|
32
|
-
priority: 8
|
|
33
|
-
});
|
|
34
|
-
this.register("numeric-time", {
|
|
35
|
-
pattern: /(?:period|duration|time|timeout|delay|interval)$/i,
|
|
36
|
-
type: "number",
|
|
37
|
-
priority: 8
|
|
38
|
-
});
|
|
39
|
-
this.register("numeric-limits", {
|
|
40
|
-
pattern: /(?:limit|max|min|threshold|size|length)$/i,
|
|
41
|
-
type: "number",
|
|
42
|
-
priority: 7
|
|
43
|
-
});
|
|
44
|
-
this.register("currency", {
|
|
45
|
-
pattern: /(?:price|cost|fee|payment|balance|amount)$/i,
|
|
46
|
-
type: "currency",
|
|
47
|
-
priority: 9
|
|
48
|
-
});
|
|
49
|
-
this.register("percentage", {
|
|
50
|
-
pattern: /(?:percent|percentage|rate|ratio)$/i,
|
|
51
|
-
type: "percentage",
|
|
52
|
-
priority: 9
|
|
53
|
-
});
|
|
54
|
-
this.register("boolean-freeze", {
|
|
55
|
-
pattern: ["freezeDefault", "freeze"],
|
|
56
|
-
type: "checkbox",
|
|
57
|
-
priority: 10
|
|
58
|
-
});
|
|
59
|
-
this.register("boolean-flags", {
|
|
60
|
-
pattern: /(?:is|has|can|should|enable|disable|active|default|allow)(?:[A-Z]|$)/,
|
|
61
|
-
type: "checkbox",
|
|
62
|
-
priority: 8
|
|
63
|
-
});
|
|
64
|
-
this.register("textarea", {
|
|
65
|
-
pattern: /(?:memo|description|notes|comment|message|content|body|text)$/i,
|
|
66
|
-
type: "textarea",
|
|
67
|
-
priority: 8
|
|
68
|
-
});
|
|
69
|
-
this.register("array-fees", {
|
|
70
|
-
pattern: ["customFees", "fees"],
|
|
71
|
-
type: "array",
|
|
72
|
-
priority: 10
|
|
73
|
-
});
|
|
74
|
-
this.register("array-general", {
|
|
75
|
-
pattern: /(?:list|items|array|collection)$/i,
|
|
76
|
-
type: "array",
|
|
77
|
-
priority: 7
|
|
78
|
-
});
|
|
79
|
-
this.register("object-options", {
|
|
80
|
-
pattern: ["metaOptions", "options"],
|
|
81
|
-
type: "object",
|
|
82
|
-
priority: 10
|
|
83
|
-
});
|
|
84
|
-
this.register("object-config", {
|
|
85
|
-
pattern: /(?:config|settings|configuration|metadata|data|info)$/i,
|
|
86
|
-
type: "object",
|
|
87
|
-
priority: 7
|
|
88
|
-
});
|
|
89
|
-
this.register("select-type", {
|
|
90
|
-
pattern: /(?:type|kind|category|status|state|mode)$/i,
|
|
91
|
-
type: "select",
|
|
92
|
-
priority: 7
|
|
93
|
-
});
|
|
42
|
+
getSchemaShape() {
|
|
43
|
+
if (this.isZodObject(this.schema)) {
|
|
44
|
+
return Object.keys(this.schema.shape);
|
|
45
|
+
}
|
|
46
|
+
return [];
|
|
94
47
|
}
|
|
95
48
|
/**
|
|
96
|
-
*
|
|
49
|
+
* Executes the wrapped tool's original implementation directly, bypassing wrapper logic.
|
|
97
50
|
*/
|
|
98
|
-
|
|
99
|
-
this.
|
|
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");
|
|
100
60
|
}
|
|
101
61
|
/**
|
|
102
|
-
*
|
|
62
|
+
* Provides access to the wrapped tool instance for executors that want to bypass the wrapper.
|
|
103
63
|
*/
|
|
104
|
-
|
|
105
|
-
return this.
|
|
64
|
+
getOriginalTool() {
|
|
65
|
+
return this.originalTool;
|
|
106
66
|
}
|
|
107
67
|
/**
|
|
108
|
-
*
|
|
68
|
+
* Checks if tool implements FormValidatable method
|
|
109
69
|
*/
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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);
|
|
126
113
|
}
|
|
127
114
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
+
}
|
|
131
145
|
}
|
|
132
|
-
|
|
146
|
+
formMessage.partialInput = input;
|
|
147
|
+
return formMessage;
|
|
133
148
|
}
|
|
134
149
|
/**
|
|
135
|
-
*
|
|
150
|
+
* Type guard to check if a schema is a ZodObject
|
|
136
151
|
*/
|
|
137
|
-
|
|
138
|
-
|
|
152
|
+
isZodObject(schema) {
|
|
153
|
+
const def = schema._def;
|
|
154
|
+
return !!(def && def.typeName === "ZodObject");
|
|
139
155
|
}
|
|
140
156
|
/**
|
|
141
|
-
*
|
|
157
|
+
* Check if we should generate a form for this tool invocation
|
|
142
158
|
*/
|
|
143
|
-
|
|
144
|
-
this.
|
|
159
|
+
shouldGenerateForm(input) {
|
|
160
|
+
this.logger.info(`shouldGenerateForm called for ${this.name}/${this.originalTool.name}`, {
|
|
161
|
+
input,
|
|
162
|
+
hasCustomValidation: !!this.validationConfig.customValidation
|
|
163
|
+
});
|
|
164
|
+
if (this.validationConfig.customValidation) {
|
|
165
|
+
const result = !this.validationConfig.customValidation(input);
|
|
166
|
+
this.logger.info(`Custom validation result: ${result}`);
|
|
167
|
+
return result;
|
|
168
|
+
}
|
|
169
|
+
if (isFormValidatable(this.originalTool)) {
|
|
170
|
+
this.logger.info(`Tool ${this.originalTool.name} implements FormValidatable, using custom logic`);
|
|
171
|
+
return this.originalTool.shouldGenerateForm(input);
|
|
172
|
+
}
|
|
173
|
+
this.logger.info(`Tool ${this.originalTool.name} using schema validation only`);
|
|
174
|
+
const validation = this.validateInput(input);
|
|
175
|
+
this.logger.info(`Schema validation for ${this.originalTool.name}:`, {
|
|
176
|
+
isValid: validation.isValid,
|
|
177
|
+
errors: validation.errors
|
|
178
|
+
});
|
|
179
|
+
return !validation.isValid;
|
|
145
180
|
}
|
|
146
181
|
/**
|
|
147
|
-
*
|
|
182
|
+
* Checks if input has bypass flags that skip form generation
|
|
148
183
|
*/
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
184
|
+
hasFormBypassFlags(input) {
|
|
185
|
+
return input.__fromForm === true || input.renderForm === false;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Override _call to intercept tool execution
|
|
189
|
+
*/
|
|
190
|
+
async _call(input, runManager) {
|
|
191
|
+
this.logger.info(`🚨🚨🚨 FormValidatingToolWrapper._call INTERCEPTING ${this.name} 🚨🚨🚨`, {
|
|
192
|
+
input,
|
|
193
|
+
inputKeys: Object.keys(input),
|
|
194
|
+
schemaShape: this.getSchemaShape(),
|
|
195
|
+
stackTrace: new Error().stack?.split("\n").slice(0, 5)
|
|
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
|
+
}
|
|
202
|
+
const shouldGenerate = this.shouldGenerateForm(input);
|
|
203
|
+
this.logger.info(`FormValidatingToolWrapper decision for ${this.name}:`, {
|
|
204
|
+
shouldGenerateForm: shouldGenerate,
|
|
205
|
+
toolName: this.name,
|
|
206
|
+
originalToolName: this.originalTool.name
|
|
207
|
+
});
|
|
208
|
+
if (shouldGenerate) {
|
|
209
|
+
this.logger.info(`Generating form for incomplete input in ${this.name}`);
|
|
210
|
+
try {
|
|
211
|
+
const isCustom = isFormValidatable(this.originalTool);
|
|
212
|
+
const schemaToUse = isCustom ? this.getFormSchema() : this.schema;
|
|
213
|
+
const missingFields = this.calculateMissingFields(
|
|
214
|
+
input,
|
|
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
|
|
228
|
+
);
|
|
229
|
+
const result = {
|
|
230
|
+
requiresForm: true,
|
|
231
|
+
formMessage,
|
|
232
|
+
message: `Please complete the form to provide the required information for ${this.name}.`
|
|
233
|
+
};
|
|
234
|
+
this.logger.info(`FormValidatingToolWrapper returning form result for ${this.name}`);
|
|
235
|
+
return JSON.stringify(result);
|
|
236
|
+
} catch (error) {
|
|
237
|
+
this.logger.error("Failed to generate form:", error);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
this.logger.info(`FormValidatingToolWrapper passing through to original tool ${this.name}`);
|
|
241
|
+
return this.executeOriginal(input, runManager);
|
|
152
242
|
}
|
|
153
243
|
}
|
|
154
|
-
|
|
244
|
+
function wrapToolWithFormValidation(tool, formGenerator, config = {}) {
|
|
245
|
+
return new FormValidatingToolWrapper(tool, formGenerator, config);
|
|
246
|
+
}
|
|
155
247
|
export {
|
|
156
|
-
|
|
157
|
-
|
|
248
|
+
FormValidatingToolWrapper,
|
|
249
|
+
wrapToolWithFormValidation
|
|
158
250
|
};
|
|
159
251
|
//# sourceMappingURL=index30.js.map
|
package/dist/esm/index30.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index30.js","sources":["../../src/forms/field-type-registry.ts"],"sourcesContent":["/**\n * Registry for field type detection patterns\n * @module FieldTypeRegistry\n */\n\nimport type { FormFieldType } from './types';\n\n/**\n * Pattern-based field type detection rule\n */\nexport interface FieldTypePattern {\n pattern: RegExp | string[];\n type: FormFieldType;\n priority?: number;\n}\n\n/**\n * Registry for managing field type detection patterns\n */\nexport class FieldTypeRegistry {\n private static instance: FieldTypeRegistry;\n private patterns: Map<string, FieldTypePattern> = new Map();\n \n private constructor() {\n this.initializeDefaultPatterns();\n }\n \n /**\n * Get singleton instance\n */\n static getInstance(): FieldTypeRegistry {\n if (!FieldTypeRegistry.instance) {\n FieldTypeRegistry.instance = new FieldTypeRegistry();\n }\n return FieldTypeRegistry.instance;\n }\n \n /**\n * Initialize default field type patterns\n */\n private initializeDefaultPatterns(): void {\n this.register('numeric-supply-exact', {\n pattern: ['maxSupply', 'minSupply', 'totalSupply'],\n type: 'number',\n priority: 15\n });\n \n this.register('numeric-supply', {\n pattern: /supply$/i,\n type: 'number',\n priority: 10\n });\n \n this.register('numeric-amounts', {\n pattern: /(?:amount|quantity|count|total|sum|value)$/i,\n type: 'number',\n priority: 8\n });\n \n this.register('numeric-time', {\n pattern: /(?:period|duration|time|timeout|delay|interval)$/i,\n type: 'number',\n priority: 8\n });\n \n this.register('numeric-limits', {\n pattern: /(?:limit|max|min|threshold|size|length)$/i,\n type: 'number',\n priority: 7\n });\n \n this.register('currency', {\n pattern: /(?:price|cost|fee|payment|balance|amount)$/i,\n type: 'currency',\n priority: 9\n });\n \n this.register('percentage', {\n pattern: /(?:percent|percentage|rate|ratio)$/i,\n type: 'percentage',\n priority: 9\n });\n \n this.register('boolean-freeze', {\n pattern: ['freezeDefault', 'freeze'],\n type: 'checkbox',\n priority: 10\n });\n \n this.register('boolean-flags', {\n pattern: /(?:is|has|can|should|enable|disable|active|default|allow)(?:[A-Z]|$)/,\n type: 'checkbox',\n priority: 8\n });\n \n this.register('textarea', {\n pattern: /(?:memo|description|notes|comment|message|content|body|text)$/i,\n type: 'textarea',\n priority: 8\n });\n \n this.register('array-fees', {\n pattern: ['customFees', 'fees'],\n type: 'array',\n priority: 10\n });\n \n this.register('array-general', {\n pattern: /(?:list|items|array|collection)$/i,\n type: 'array',\n priority: 7\n });\n \n this.register('object-options', {\n pattern: ['metaOptions', 'options'],\n type: 'object',\n priority: 10\n });\n \n this.register('object-config', {\n pattern: /(?:config|settings|configuration|metadata|data|info)$/i,\n type: 'object',\n priority: 7\n });\n \n this.register('select-type', {\n pattern: /(?:type|kind|category|status|state|mode)$/i,\n type: 'select',\n priority: 7\n });\n }\n \n /**\n * Register a field type pattern\n */\n register(key: string, pattern: FieldTypePattern): void {\n this.patterns.set(key, pattern);\n }\n \n /**\n * Unregister a field type pattern\n */\n unregister(key: string): boolean {\n return this.patterns.delete(key);\n }\n \n /**\n * Detect field type based on field name\n */\n detectType(fieldName: string): FormFieldType | null {\n const matches: Array<{ type: FormFieldType; priority: number }> = [];\n \n for (const pattern of this.patterns.values()) {\n let isMatch = false;\n \n if (Array.isArray(pattern.pattern)) {\n isMatch = pattern.pattern.some(p => \n fieldName === p || fieldName.toLowerCase() === p.toLowerCase()\n );\n } else if (pattern.pattern instanceof RegExp) {\n isMatch = pattern.pattern.test(fieldName);\n }\n \n if (isMatch) {\n matches.push({\n type: pattern.type,\n priority: pattern.priority ?? 5\n });\n }\n }\n \n if (matches.length > 0) {\n matches.sort((a, b) => b.priority - a.priority);\n return matches[0].type;\n }\n \n return null;\n }\n \n /**\n * Get all registered patterns\n */\n getPatterns(): Map<string, FieldTypePattern> {\n return new Map(this.patterns);\n }\n \n /**\n * Clear all patterns\n */\n clear(): void {\n this.patterns.clear();\n }\n \n /**\n * Reset to default patterns\n */\n reset(): void {\n this.clear();\n this.initializeDefaultPatterns();\n }\n}\n\nexport const fieldTypeRegistry = FieldTypeRegistry.getInstance();"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index30.js","sources":["../../src/langchain/form-validating-tool-wrapper.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';\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 ): Promise<FormMessage> {\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":";;;;AAqBO,MAAM,kCAEH,eAAwB;AAAA,EAUhC,YACE,cACA,eACA,SAA+B,CAAA,GAC/B;AACA,UAAA;AACA,SAAK,eAAe;AACpB,SAAK,gBAAgB;AACrB,SAAK,mBAAmB;AACxB,SAAK,SAAS,IAAI,OAAO,EAAE,QAAQ,6BAA6B;AAEhE,SAAK,OAAO,aAAa;AACzB,SAAK,cAAc,aAAa;AAChC,SAAK,SAAS,aAAa;AAE3B,SAAK,OAAO,KAAK,kDAAkD,KAAK,IAAI,IAAI;AAAA,MAC9E,kBAAkB,aAAa;AAAA,MAC/B,kBAAkB,aAAa,YAAY;AAAA,MAC3C,aAAa,KAAK,YAAY;AAAA,IAAA,CAC/B;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,OAAyE;AAC7F,QAAI;AACF,WAAK,OAAO,MAAM,KAAK;AACvB,aAAO,EAAE,SAAS,KAAA;AAAA,IACpB,SAAS,OAAO;AACd,UAAI,iBAAiB,EAAE,UAAU;AAC/B,cAAM,SAAS,MAAM,OAClB,OAAO,CAAA,QAAO;AACb,gBAAM,YAAY,IAAI,KAAK,CAAC;AAC5B,iBAAO,CAAC,KAAK,iBAAiB,YAAY,SAAS,SAAS;AAAA,QAC9D,CAAC,EACA,IAAI,CAAA,QAAO,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC,KAAK,IAAI,OAAO,EAAE;AACrD,eAAO,EAAE,SAAS,OAAO,OAAA;AAAA,MAC3B;AACA,aAAO,EAAE,SAAS,OAAO,QAAQ,CAAC,mBAAmB,EAAA;AAAA,IACvD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAA2B;AACjC,QAAI,KAAK,YAAY,KAAK,MAAM,GAAG;AACjC,aAAO,OAAO,KAAK,KAAK,OAAO,KAAK;AAAA,IACtC;AACA,WAAO,CAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,gBACX,OACA,YACiB;AAMjB,UAAM,OAAO,KAAK;AAElB,QAAI,WAAW,QAAQ,OAAO,KAAK,UAAU,YAAY;AACvD,aAAQ,KAAK,MAAyB,OAAO,UAAU;AAAA,IACzD;AACA,QAAI,UAAU,QAAQ,OAAO,KAAK,SAAS,YAAY;AACrD,aAAQ,KAAK,KAAwB,OAAO,UAAU;AAAA,IACxD;AACA,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKO,kBAA2C;AAChD,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,yBACN,MACA,YAC2B;AAC3B,WACE,SAAS,QACT,OAAO,SAAS,YAChB,cAAc,QACd,OAAQ,KAAiC,UAAU,MAAM;AAAA,EAE7D;AAAA;AAAA;AAAA;AAAA,EAKO,gBAA6B;AAClC,QAAI,KAAK,yBAA4C,KAAK,cAAc,eAAe,GAAG;AACxF,aAAO,KAAK,aAAa,cAAA;AAAA,IAC3B;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,qBAA+B;AACpC,QAAI,KAAK,yBAAyC,KAAK,cAAc,oBAAoB,GAAG;AAC1F,aAAO,KAAK,aAAa,mBAAA;AAAA,IAC3B;AACA,WAAO,CAAA;AAAA,EACT;AAAA,EAEO,aAAa,WAAmB,OAAyB;AAC9D,QAAI,KAAK,yBAA6D,KAAK,cAAc,cAAc,GAAG;AACxG,aAAO,KAAK,aAAa,aAAa,WAAW,KAAK;AAAA,IACxD;AACA,QAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,IAAI;AACzD,aAAO;AAAA,IACT;AACA,QAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG;AAC9C,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,uBACN,OACA,UACa;AACb,UAAM,oCAAoB,IAAA;AAE1B,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AAEA,UAAM,kBAAkB,KAAK,mBAAA;AAC7B,eAAW,aAAa,iBAAiB;AACvC,YAAM,QAAQ,MAAM,SAAS;AAC7B,UAAI,KAAK,aAAa,WAAW,KAAK,GAAG;AACvC,sBAAc,IAAI,SAAS;AAAA,MAC7B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,kBACZ,QACA,OACA,eACsB;AACtB,QAAI,cAAc,MAAM,KAAK,cAAc;AAAA,MACzC;AAAA,MACA;AAAA,MACA;AAAA,QACE,UAAU,KAAK;AAAA,QACf,iBAAiB,KAAK;AAAA,MAAA;AAAA,MAExB;AAAA,IAAA;AAGF,QAAI,KAAK,YAAY,MAAM,GAAG;AAC5B,UAAI;AACF,cAAM,EAAE,YAAY,SAAA,IAAa,KAAK,cAAc;AAAA,UAClD;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAEF,sBAAc;AAAA,UACZ,GAAG;AAAA,UACH;AAAA,UACA;AAAA,QAAA;AAAA,MAEJ,SAAS,OAAO;AACd,aAAK,OAAO,KAAK,4CAA4C,KAAK;AAAA,MACpE;AAAA,IACF;AAEA,gBAAY,eAAe;AAC3B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,QAA2D;AAC7E,UAAM,MAAO,OAAqB;AAClC,WAAO,CAAC,EAAE,OAAO,IAAI,aAAa;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,OAAyC;AAClE,SAAK,OAAO,KAAK,iCAAiC,KAAK,IAAI,IAAI,KAAK,aAAa,IAAI,IAAI;AAAA,MACvF;AAAA,MACA,qBAAqB,CAAC,CAAC,KAAK,iBAAiB;AAAA,IAAA,CAC9C;AAED,QAAI,KAAK,iBAAiB,kBAAkB;AAC1C,YAAM,SAAS,CAAC,KAAK,iBAAiB,iBAAiB,KAAK;AAC5D,WAAK,OAAO,KAAK,6BAA6B,MAAM,EAAE;AACtD,aAAO;AAAA,IACT;AAEA,QAAI,kBAAkB,KAAK,YAAY,GAAG;AACxC,WAAK,OAAO,KAAK,QAAQ,KAAK,aAAa,IAAI,iDAAiD;AAChG,aAAO,KAAK,aAAa,mBAAmB,KAAK;AAAA,IACnD;AAEA,SAAK,OAAO,KAAK,QAAQ,KAAK,aAAa,IAAI,+BAA+B;AAC9E,UAAM,aAAa,KAAK,cAAc,KAAK;AAC3C,SAAK,OAAO,KAAK,yBAAyB,KAAK,aAAa,IAAI,KAAK;AAAA,MACnE,SAAS,WAAW;AAAA,MACpB,QAAQ,WAAW;AAAA,IAAA,CACpB;AACD,WAAO,CAAC,WAAW;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,OAAyC;AAClE,WACG,MAAM,eAAe,QACrB,MAAM,eAAe;AAAA,EAE1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,MACd,OACA,YACiB;AACjB,SAAK,OAAO,KAAK,uDAAuD,KAAK,IAAI,WAAW;AAAA,MAC1F;AAAA,MACA,WAAW,OAAO,KAAK,KAAgC;AAAA,MACvD,aAAa,KAAK,eAAA;AAAA,MAClB,YAAY,IAAI,MAAA,EAAQ,OAAO,MAAM,IAAI,EAAE,MAAM,GAAG,CAAC;AAAA,IAAA,CACtD;AAED,UAAM,cAAc;AAEpB,QAAI,KAAK,mBAAmB,WAAW,GAAG;AACxC,WAAK,OAAO,KAAK,+EAA+E;AAChG,aAAO,KAAK,gBAAgB,aAAa,UAAU;AAAA,IACrD;AAEA,UAAM,iBAAiB,KAAK,mBAAmB,KAAgC;AAC/E,SAAK,OAAO,KAAK,0CAA0C,KAAK,IAAI,KAAK;AAAA,MACvE,oBAAoB;AAAA,MACpB,UAAU,KAAK;AAAA,MACf,kBAAkB,KAAK,aAAa;AAAA,IAAA,CACrC;AAED,QAAI,gBAAgB;AAClB,WAAK,OAAO,KAAK,2CAA2C,KAAK,IAAI,EAAE;AAEvE,UAAI;AACF,cAAM,WAAW,kBAAkB,KAAK,YAAY;AACpD,cAAM,cAAc,WAAW,KAAK,cAAA,IAAkB,KAAK;AAC3D,cAAM,gBAAgB,KAAK;AAAA,UACzB;AAAA,UACA;AAAA,QAAA;AAGF,cAAM,eAAe,KAAK,YAAY,WAAW,IAC7C,OAAO,KAAK,YAAY,KAAK,IAC7B,CAAA;AAEJ,aAAK,OAAO,KAAK,SAAS,WAAW,WAAW,SAAS,+BAA+B;AAAA,UACtF,UAAU,KAAK,aAAa;AAAA,UAC5B,YAAY,YAAY,aAAa;AAAA,UACrC;AAAA,UACA,gBAAgB;AAAA,QAAA,CACjB;AAED,cAAM,cAAc,MAAM,KAAK;AAAA,UAC7B;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAGF,cAAM,SAAS;AAAA,UACb,cAAc;AAAA,UACd;AAAA,UACA,SAAS,oEAAoE,KAAK,IAAI;AAAA,QAAA;AAGxF,aAAK,OAAO,KAAK,uDAAuD,KAAK,IAAI,EAAE;AACnF,eAAO,KAAK,UAAU,MAAM;AAAA,MAC9B,SAAS,OAAO;AACd,aAAK,OAAO,MAAM,4BAA4B,KAAK;AAAA,MACrD;AAAA,IACF;AAEA,SAAK,OAAO,KAAK,8DAA8D,KAAK,IAAI,EAAE;AAC1F,WAAO,KAAK,gBAAgB,OAAkC,UAAU;AAAA,EAC1E;AAEF;AAKO,SAAS,2BACd,MACA,eACA,SAA+B,CAAA,GACK;AACpC,SAAO,IAAI,0BAA0B,MAAM,eAAe,MAAM;AAClE;"}
|