@hashgraphonline/conversational-agent 0.1.217 → 0.1.218

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) hide show
  1. package/cli/readme.md +181 -0
  2. package/dist/cjs/constants/entity-references.d.ts +18 -0
  3. package/dist/cjs/constants/form-priorities.d.ts +24 -0
  4. package/dist/cjs/constants/index.d.ts +4 -0
  5. package/dist/cjs/constants/messages.d.ts +19 -0
  6. package/dist/cjs/constants/test-constants.d.ts +42 -0
  7. package/dist/cjs/conversational-agent.d.ts +3 -8
  8. package/dist/cjs/core/{ToolRegistry.d.ts → tool-registry.d.ts} +10 -7
  9. package/dist/{types/execution/ExecutionPipeline.d.ts → cjs/execution/execution-pipeline.d.ts} +3 -3
  10. package/dist/cjs/forms/field-guidance-registry.d.ts +108 -0
  11. package/dist/cjs/forms/form-generator.d.ts +2 -7
  12. package/dist/cjs/forms/index.d.ts +3 -0
  13. package/dist/cjs/forms/types.d.ts +9 -1
  14. package/dist/cjs/index.cjs +1 -1
  15. package/dist/cjs/index.cjs.map +1 -1
  16. package/dist/cjs/index.d.ts +7 -12
  17. package/dist/cjs/langchain/external-tool-wrapper.d.ts +101 -0
  18. package/dist/{types/langchain/FormAwareAgentExecutor.d.ts → cjs/langchain/form-aware-agent-executor.d.ts} +19 -12
  19. package/dist/cjs/langchain/index.d.ts +2 -0
  20. package/dist/{types → cjs/langchain}/langchain-agent.d.ts +15 -7
  21. package/dist/cjs/mcp/adapters/index.d.ts +1 -0
  22. package/dist/cjs/mcp/adapters/langchain.d.ts +1 -1
  23. package/dist/{types/mcp/ContentProcessor.d.ts → cjs/mcp/content-processor.d.ts} +1 -1
  24. package/dist/cjs/mcp/index.d.ts +5 -0
  25. package/dist/{types/mcp/MCPClientManager.d.ts → cjs/mcp/mcp-client-manager.d.ts} +1 -1
  26. package/dist/cjs/memory/{ContentStorage.d.ts → content-storage.d.ts} +4 -4
  27. package/dist/cjs/memory/index.d.ts +5 -7
  28. package/dist/{types/memory/MemoryWindow.d.ts → cjs/memory/memory-window.d.ts} +1 -1
  29. package/dist/{types/memory/SmartMemoryManager.d.ts → cjs/memory/smart-memory-manager.d.ts} +1 -1
  30. package/dist/cjs/services/{ContentStoreManager.d.ts → content-store-manager.d.ts} +6 -6
  31. package/dist/cjs/services/context/resolution-context.d.ts +49 -0
  32. package/dist/cjs/services/entity-resolver.d.ts +58 -0
  33. package/dist/cjs/services/formatters/converters/index.d.ts +2 -0
  34. package/dist/cjs/services/formatters/converters/string-normalization-converter.d.ts +13 -0
  35. package/dist/cjs/services/formatters/converters/topic-id-to-hrl-converter.d.ts +17 -0
  36. package/dist/cjs/services/formatters/format-converter-registry.d.ts +66 -0
  37. package/dist/cjs/services/formatters/index.d.ts +3 -0
  38. package/dist/cjs/services/formatters/types.d.ts +29 -0
  39. package/dist/cjs/services/index.d.ts +3 -0
  40. package/dist/cjs/services/resolution/resolution-pipeline.d.ts +44 -0
  41. package/dist/cjs/tools/index.d.ts +1 -0
  42. package/dist/cjs/utils/index.d.ts +1 -0
  43. package/dist/esm/index.js +40 -16
  44. package/dist/esm/index.js.map +1 -1
  45. package/dist/esm/index10.js +669 -13
  46. package/dist/esm/index10.js.map +1 -1
  47. package/dist/esm/index11.js +310 -95
  48. package/dist/esm/index11.js.map +1 -1
  49. package/dist/esm/index12.js +130 -95
  50. package/dist/esm/index12.js.map +1 -1
  51. package/dist/esm/index13.js +262 -153
  52. package/dist/esm/index13.js.map +1 -1
  53. package/dist/esm/index14.js +100 -664
  54. package/dist/esm/index14.js.map +1 -1
  55. package/dist/esm/index15.js +135 -408
  56. package/dist/esm/index15.js.map +1 -1
  57. package/dist/esm/index16.js +240 -122
  58. package/dist/esm/index16.js.map +1 -1
  59. package/dist/esm/index17.js +147 -135
  60. package/dist/esm/index17.js.map +1 -1
  61. package/dist/esm/index18.js +376 -533
  62. package/dist/esm/index18.js.map +1 -1
  63. package/dist/esm/index19.js +87 -214
  64. package/dist/esm/index19.js.map +1 -1
  65. package/dist/esm/index2.js +21 -4
  66. package/dist/esm/index2.js.map +1 -1
  67. package/dist/esm/index20.js +158 -92
  68. package/dist/esm/index20.js.map +1 -1
  69. package/dist/esm/index21.js +717 -44
  70. package/dist/esm/index21.js.map +1 -1
  71. package/dist/esm/index22.js +58 -96
  72. package/dist/esm/index22.js.map +1 -1
  73. package/dist/esm/index23.js +324 -34
  74. package/dist/esm/index23.js.map +1 -1
  75. package/dist/esm/index24.js +125 -712
  76. package/dist/esm/index24.js.map +1 -1
  77. package/dist/esm/index25.js +113 -133
  78. package/dist/esm/index25.js.map +1 -1
  79. package/dist/esm/index26.js +18 -152
  80. package/dist/esm/index26.js.map +1 -1
  81. package/dist/esm/index27.js +14 -210
  82. package/dist/esm/index27.js.map +1 -1
  83. package/dist/esm/index28.js +70 -173
  84. package/dist/esm/index28.js.map +1 -1
  85. package/dist/esm/index29.js +811 -224
  86. package/dist/esm/index29.js.map +1 -1
  87. package/dist/esm/index30.js +1245 -122
  88. package/dist/esm/index30.js.map +1 -1
  89. package/dist/esm/index31.js +126 -56
  90. package/dist/esm/index31.js.map +1 -1
  91. package/dist/esm/index32.js +111 -24
  92. package/dist/esm/index32.js.map +1 -1
  93. package/dist/esm/index33.js +41 -87
  94. package/dist/esm/index33.js.map +1 -1
  95. package/dist/esm/index34.js +88 -227
  96. package/dist/esm/index34.js.map +1 -1
  97. package/dist/esm/index35.js +24 -0
  98. package/dist/esm/index35.js.map +1 -0
  99. package/dist/esm/index36.js +15 -0
  100. package/dist/esm/index36.js.map +1 -0
  101. package/dist/esm/index37.js +10 -0
  102. package/dist/esm/index37.js.map +1 -0
  103. package/dist/esm/index38.js +8 -0
  104. package/dist/esm/index38.js.map +1 -0
  105. package/dist/esm/index39.js +227 -0
  106. package/dist/esm/index39.js.map +1 -0
  107. package/dist/esm/index40.js +187 -0
  108. package/dist/esm/index40.js.map +1 -0
  109. package/dist/esm/index41.js +30 -0
  110. package/dist/esm/index41.js.map +1 -0
  111. package/dist/esm/index42.js +95 -0
  112. package/dist/esm/index42.js.map +1 -0
  113. package/dist/esm/index5.js +2 -2
  114. package/dist/esm/index5.js.map +1 -1
  115. package/dist/esm/index6.js +44 -67
  116. package/dist/esm/index6.js.map +1 -1
  117. package/dist/esm/index7.js +9 -0
  118. package/dist/esm/index7.js.map +1 -1
  119. package/dist/esm/index8.js +13 -1095
  120. package/dist/esm/index8.js.map +1 -1
  121. package/dist/esm/index9.js +17 -13
  122. package/dist/esm/index9.js.map +1 -1
  123. package/dist/types/constants/entity-references.d.ts +18 -0
  124. package/dist/types/constants/form-priorities.d.ts +24 -0
  125. package/dist/types/constants/index.d.ts +4 -0
  126. package/dist/types/constants/messages.d.ts +19 -0
  127. package/dist/types/constants/test-constants.d.ts +42 -0
  128. package/dist/types/conversational-agent.d.ts +3 -8
  129. package/dist/types/core/{ToolRegistry.d.ts → tool-registry.d.ts} +10 -7
  130. package/dist/{cjs/execution/ExecutionPipeline.d.ts → types/execution/execution-pipeline.d.ts} +3 -3
  131. package/dist/types/forms/field-guidance-registry.d.ts +108 -0
  132. package/dist/types/forms/form-generator.d.ts +2 -7
  133. package/dist/types/forms/index.d.ts +3 -0
  134. package/dist/types/forms/types.d.ts +9 -1
  135. package/dist/types/index.d.ts +7 -12
  136. package/dist/types/langchain/external-tool-wrapper.d.ts +101 -0
  137. package/dist/{cjs/langchain/FormAwareAgentExecutor.d.ts → types/langchain/form-aware-agent-executor.d.ts} +19 -12
  138. package/dist/types/langchain/index.d.ts +2 -0
  139. package/dist/{cjs → types/langchain}/langchain-agent.d.ts +15 -7
  140. package/dist/types/mcp/adapters/index.d.ts +1 -0
  141. package/dist/types/mcp/adapters/langchain.d.ts +1 -1
  142. package/dist/{cjs/mcp/ContentProcessor.d.ts → types/mcp/content-processor.d.ts} +1 -1
  143. package/dist/types/mcp/index.d.ts +5 -0
  144. package/dist/{cjs/mcp/MCPClientManager.d.ts → types/mcp/mcp-client-manager.d.ts} +1 -1
  145. package/dist/types/memory/{ContentStorage.d.ts → content-storage.d.ts} +4 -4
  146. package/dist/types/memory/index.d.ts +5 -7
  147. package/dist/{cjs/memory/MemoryWindow.d.ts → types/memory/memory-window.d.ts} +1 -1
  148. package/dist/{cjs/memory/SmartMemoryManager.d.ts → types/memory/smart-memory-manager.d.ts} +1 -1
  149. package/dist/types/services/{ContentStoreManager.d.ts → content-store-manager.d.ts} +6 -6
  150. package/dist/types/services/context/resolution-context.d.ts +49 -0
  151. package/dist/types/services/entity-resolver.d.ts +58 -0
  152. package/dist/types/services/formatters/converters/index.d.ts +2 -0
  153. package/dist/types/services/formatters/converters/string-normalization-converter.d.ts +13 -0
  154. package/dist/types/services/formatters/converters/topic-id-to-hrl-converter.d.ts +17 -0
  155. package/dist/types/services/formatters/format-converter-registry.d.ts +66 -0
  156. package/dist/types/services/formatters/index.d.ts +3 -0
  157. package/dist/types/services/formatters/types.d.ts +29 -0
  158. package/dist/types/services/index.d.ts +3 -0
  159. package/dist/types/services/resolution/resolution-pipeline.d.ts +44 -0
  160. package/dist/types/tools/index.d.ts +1 -0
  161. package/dist/types/utils/index.d.ts +1 -0
  162. package/package.json +30 -27
  163. package/src/agent-factory.ts +1 -1
  164. package/src/base-agent.ts +9 -0
  165. package/src/config/system-message.ts +2 -15
  166. package/src/constants/entity-references.ts +23 -0
  167. package/src/constants/form-priorities.ts +25 -0
  168. package/src/constants/index.ts +4 -0
  169. package/src/constants/messages.ts +20 -0
  170. package/src/constants/test-constants.ts +49 -0
  171. package/src/conversational-agent.ts +42 -69
  172. package/src/core/{ToolRegistry.ts → tool-registry.ts} +70 -44
  173. package/src/examples/external-tool-wrapper-example.ts +56 -0
  174. package/src/execution/{ExecutionPipeline.ts → execution-pipeline.ts} +3 -3
  175. package/src/forms/field-guidance-registry.ts +415 -0
  176. package/src/forms/field-type-registry.ts +49 -48
  177. package/src/forms/{FormEngine.ts → form-engine.ts} +66 -43
  178. package/src/forms/form-generator.ts +91 -17
  179. package/src/forms/index.ts +4 -1
  180. package/src/forms/types.ts +9 -1
  181. package/src/index.ts +7 -37
  182. package/src/langchain/external-tool-wrapper.ts +90 -0
  183. package/src/langchain/{FormAwareAgentExecutor.ts → form-aware-agent-executor.ts} +579 -351
  184. package/src/langchain/index.ts +2 -0
  185. package/src/{langchain-agent.ts → langchain/langchain-agent.ts} +389 -113
  186. package/src/mcp/adapters/index.ts +1 -0
  187. package/src/mcp/adapters/langchain.ts +27 -18
  188. package/src/mcp/{ContentProcessor.ts → content-processor.ts} +71 -47
  189. package/src/mcp/index.ts +5 -0
  190. package/src/mcp/{MCPClientManager.ts → mcp-client-manager.ts} +2 -2
  191. package/src/memory/{ContentStorage.ts → content-storage.ts} +263 -167
  192. package/src/memory/index.ts +5 -8
  193. package/src/memory/{MemoryWindow.ts → memory-window.ts} +47 -24
  194. package/src/memory/{SmartMemoryManager.ts → smart-memory-manager.ts} +49 -22
  195. package/src/plugins/hbar/HbarPlugin.ts +1 -1
  196. package/src/plugins/hcs-10/HCS10Plugin.ts +46 -28
  197. package/src/scripts/test-external-tool-wrapper.ts +6 -6
  198. package/src/scripts/test-inscribe-form-generation.ts +22 -21
  199. package/src/scripts/test-inscribe-wrapper-verification.ts +5 -4
  200. package/src/services/{ContentStoreManager.ts → content-store-manager.ts} +75 -33
  201. package/src/services/context/resolution-context.ts +80 -0
  202. package/src/services/entity-resolver.ts +425 -0
  203. package/src/services/formatters/converters/index.ts +2 -0
  204. package/src/services/formatters/converters/string-normalization-converter.ts +106 -0
  205. package/src/services/formatters/converters/topic-id-to-hrl-converter.ts +25 -0
  206. package/src/services/formatters/format-converter-registry.ts +229 -0
  207. package/src/services/formatters/index.ts +3 -0
  208. package/src/services/formatters/types.ts +31 -0
  209. package/src/services/index.ts +3 -0
  210. package/src/services/resolution/resolution-pipeline.ts +106 -0
  211. package/src/tools/index.ts +1 -0
  212. package/src/types/content-reference.ts +87 -60
  213. package/src/utils/index.ts +1 -0
  214. package/cli/dist/CLIApp.d.ts +0 -9
  215. package/cli/dist/CLIApp.js +0 -127
  216. package/cli/dist/LocalConversationalAgent.d.ts +0 -37
  217. package/cli/dist/LocalConversationalAgent.js +0 -58
  218. package/cli/dist/app.d.ts +0 -16
  219. package/cli/dist/app.js +0 -13
  220. package/cli/dist/cli.d.ts +0 -2
  221. package/cli/dist/cli.js +0 -51
  222. package/cli/dist/components/AppContainer.d.ts +0 -16
  223. package/cli/dist/components/AppContainer.js +0 -24
  224. package/cli/dist/components/AppScreens.d.ts +0 -2
  225. package/cli/dist/components/AppScreens.js +0 -259
  226. package/cli/dist/components/ChatScreen.d.ts +0 -15
  227. package/cli/dist/components/ChatScreen.js +0 -39
  228. package/cli/dist/components/DebugLoadingScreen.d.ts +0 -5
  229. package/cli/dist/components/DebugLoadingScreen.js +0 -31
  230. package/cli/dist/components/LoadingScreen.d.ts +0 -2
  231. package/cli/dist/components/LoadingScreen.js +0 -16
  232. package/cli/dist/components/LoadingScreenDebug.d.ts +0 -5
  233. package/cli/dist/components/LoadingScreenDebug.js +0 -27
  234. package/cli/dist/components/MCPConfigScreen.d.ts +0 -28
  235. package/cli/dist/components/MCPConfigScreen.js +0 -168
  236. package/cli/dist/components/ScreenRouter.d.ts +0 -12
  237. package/cli/dist/components/ScreenRouter.js +0 -22
  238. package/cli/dist/components/SetupScreen.d.ts +0 -15
  239. package/cli/dist/components/SetupScreen.js +0 -65
  240. package/cli/dist/components/SingleLoadingScreen.d.ts +0 -5
  241. package/cli/dist/components/SingleLoadingScreen.js +0 -27
  242. package/cli/dist/components/StatusBadge.d.ts +0 -7
  243. package/cli/dist/components/StatusBadge.js +0 -28
  244. package/cli/dist/components/TerminalWindow.d.ts +0 -8
  245. package/cli/dist/components/TerminalWindow.js +0 -24
  246. package/cli/dist/components/WelcomeScreen.d.ts +0 -11
  247. package/cli/dist/components/WelcomeScreen.js +0 -47
  248. package/cli/dist/context/AppContext.d.ts +0 -68
  249. package/cli/dist/context/AppContext.js +0 -363
  250. package/cli/dist/hooks/useInitializeAgent.d.ts +0 -19
  251. package/cli/dist/hooks/useInitializeAgent.js +0 -28
  252. package/cli/dist/hooks/useStableState.d.ts +0 -38
  253. package/cli/dist/hooks/useStableState.js +0 -68
  254. package/cli/dist/managers/AgentManager.d.ts +0 -57
  255. package/cli/dist/managers/AgentManager.js +0 -119
  256. package/cli/dist/managers/ConfigManager.d.ts +0 -53
  257. package/cli/dist/managers/ConfigManager.js +0 -173
  258. package/cli/dist/types.d.ts +0 -31
  259. package/cli/dist/types.js +0 -19
  260. package/dist/cjs/context/ReferenceContextManager.d.ts +0 -84
  261. package/dist/cjs/context/ReferenceResponseProcessor.d.ts +0 -76
  262. package/dist/cjs/langchain/FormValidatingToolWrapper.d.ts +0 -81
  263. package/dist/cjs/services/EntityResolver.d.ts +0 -26
  264. package/dist/types/context/ReferenceContextManager.d.ts +0 -84
  265. package/dist/types/context/ReferenceResponseProcessor.d.ts +0 -76
  266. package/dist/types/langchain/FormValidatingToolWrapper.d.ts +0 -81
  267. package/dist/types/services/EntityResolver.d.ts +0 -26
  268. package/src/context/ReferenceContextManager.ts +0 -350
  269. package/src/context/ReferenceResponseProcessor.ts +0 -295
  270. package/src/langchain/FormValidatingToolWrapper.ts +0 -355
  271. package/src/scripts/test-hedera-kit-wrapper.ts +0 -265
  272. package/src/services/EntityResolver.ts +0 -128
  273. /package/dist/cjs/forms/{FormEngine.d.ts → form-engine.d.ts} +0 -0
  274. /package/dist/cjs/memory/{ReferenceIdGenerator.d.ts → reference-id-generator.d.ts} +0 -0
  275. /package/dist/cjs/memory/{TokenCounter.d.ts → token-counter.d.ts} +0 -0
  276. /package/dist/cjs/tools/{EntityResolverTool.d.ts → entity-resolver-tool.d.ts} +0 -0
  277. /package/dist/cjs/utils/{ResponseFormatter.d.ts → response-formatter.d.ts} +0 -0
  278. /package/dist/types/forms/{FormEngine.d.ts → form-engine.d.ts} +0 -0
  279. /package/dist/types/memory/{ReferenceIdGenerator.d.ts → reference-id-generator.d.ts} +0 -0
  280. /package/dist/types/memory/{TokenCounter.d.ts → token-counter.d.ts} +0 -0
  281. /package/dist/types/tools/{EntityResolverTool.d.ts → entity-resolver-tool.d.ts} +0 -0
  282. /package/dist/types/utils/{ResponseFormatter.d.ts → response-formatter.d.ts} +0 -0
  283. /package/src/memory/{ReferenceIdGenerator.ts → reference-id-generator.ts} +0 -0
  284. /package/src/memory/{TokenCounter.ts → token-counter.ts} +0 -0
  285. /package/src/tools/{EntityResolverTool.ts → entity-resolver-tool.ts} +0 -0
  286. /package/src/utils/{ResponseFormatter.ts → response-formatter.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index10.js","sources":["../../src/providers.ts"],"sourcesContent":["import type { \n BaseLanguageModelCallOptions\n} from '@langchain/core/language_models/base';\nimport type { BaseChatModel } from '@langchain/core/language_models/chat_models';\n\n/**\n * Framework-agnostic AI provider interface for multi-framework support\n */\nexport interface AIProvider {\n /**\n * Generate a response from the AI model\n */\n generate(\n prompt: string,\n options?: BaseLanguageModelCallOptions\n ): Promise<string>;\n\n /**\n * Stream a response from the AI model\n */\n stream?(\n prompt: string,\n options?: BaseLanguageModelCallOptions\n ): AsyncGenerator<string>;\n\n /**\n * Get the underlying model if available\n */\n getModel?(): BaseChatModel | unknown;\n}\n\n/**\n * LangChain AI provider implementation\n */\nexport class LangChainProvider implements AIProvider {\n constructor(private model: BaseChatModel) {}\n\n async generate(\n prompt: string,\n options?: BaseLanguageModelCallOptions\n ): Promise<string> {\n const result = await this.model.invoke(prompt, options);\n return typeof result === 'string' ? result : result.toString();\n }\n\n async *stream(\n prompt: string,\n options?: BaseLanguageModelCallOptions\n ): AsyncGenerator<string> {\n const stream = await this.model.stream(prompt, options);\n for await (const chunk of stream) {\n yield typeof chunk === 'string' ? chunk : chunk.toString();\n }\n }\n\n getModel(): BaseChatModel {\n return this.model;\n }\n}\n\n/**\n * Vercel AI SDK provider interface (forward-thinking)\n */\nexport interface VercelAIProvider extends AIProvider {\n /**\n * Use Vercel AI SDK's streamText function\n */\n streamText?(prompt: string, options?: unknown): Promise<unknown>;\n}\n\n/**\n * BAML provider interface (forward-thinking)\n */\nexport interface BAMLProvider extends AIProvider {\n /**\n * Execute a BAML function\n */\n executeFunction?(\n name: string,\n args: Record<string, unknown>\n ): Promise<unknown>;\n}"],"names":[],"mappings":"AAkCO,MAAM,kBAAwC;AAAA,EACnD,YAAoB,OAAsB;AAAtB,SAAA,QAAA;AAAA,EAAuB;AAAA,EAE3C,MAAM,SACJ,QACA,SACiB;AACjB,UAAM,SAAS,MAAM,KAAK,MAAM,OAAO,QAAQ,OAAO;AACtD,WAAO,OAAO,WAAW,WAAW,SAAS,OAAO,SAAA;AAAA,EACtD;AAAA,EAEA,OAAO,OACL,QACA,SACwB;AACxB,UAAM,SAAS,MAAM,KAAK,MAAM,OAAO,QAAQ,OAAO;AACtD,qBAAiB,SAAS,QAAQ;AAChC,YAAM,OAAO,UAAU,WAAW,QAAQ,MAAM,SAAA;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,WAA0B;AACxB,WAAO,KAAK;AAAA,EACd;AACF;"}
1
+ {"version":3,"file":"index10.js","sources":["../../src/forms/form-generator.ts"],"sourcesContent":["import { z, ZodError } from 'zod';\nimport { zodToJsonSchema } from 'zod-to-json-schema';\nimport type {\n FormConfig,\n FormField,\n ValidationError,\n FormMessage,\n FormFieldType,\n} from './types';\nimport {\n extractRenderConfigs,\n generateFieldOrdering,\n type RenderConfigSchema,\n type ZodSchemaWithRender,\n type ExtractedRenderConfig,\n} from '@hashgraphonline/standards-agent-kit';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport { fieldTypeRegistry } from './field-type-registry';\nimport { fieldGuidanceRegistry } from './field-guidance-registry';\nimport { FIELD_PRIORITIES } from '../constants';\n\ninterface ZodObjectSchema extends z.ZodSchema {\n shape?: Record<string, z.ZodSchema>;\n}\n\nfunction isZodObjectSchema(schema: z.ZodSchema): schema is ZodObjectSchema {\n return typeof schema === 'object' && schema !== null && 'shape' in schema;\n}\n\ntype FieldPriority = 'essential' | 'common' | 'advanced' | 'expert';\n\n/**\n * Generates forms from Zod validation failures\n */\nexport class FormGenerator {\n private logger: Logger;\n\n constructor() {\n this.logger = new Logger({ module: 'FormGenerator' });\n }\n\n /**\n * Creates a form message from a Zod validation error\n * @param error The Zod validation error\n * @param schema The original Zod schema\n * @param toolName Name of the tool that failed validation\n * @param originalPrompt The user's original request\n * @returns FormMessage to send to the chat UI\n */\n generateFormFromError(\n error: ZodError,\n schema: z.ZodSchema,\n toolName: string,\n originalPrompt: string\n ): FormMessage {\n const validationErrors = this.extractValidationErrors(error);\n const missingFields = this.identifyMissingFields(validationErrors, schema);\n const formConfig = this.createFormConfig(schema, missingFields, toolName);\n\n return {\n type: 'form',\n id: `form_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n formConfig,\n originalPrompt,\n toolName,\n validationErrors,\n };\n }\n\n /**\n * Generates a form from a schema and partial input\n * @param schema The Zod schema to generate a form from\n * @param partialInput Any partial input already provided\n * @param context Additional context about the tool\n * @param preCalculatedMissingFields Optional pre-calculated missing fields set. If undefined, includes all fields from schema.\n * @returns FormMessage to send to the chat UI\n */\n async generateFormFromSchema(\n schema: z.ZodSchema,\n partialInput: unknown,\n context: { toolName: string; toolDescription?: string },\n preCalculatedMissingFields?: Set<string>\n ): Promise<FormMessage> {\n let missingFields: Set<string>;\n\n this.logger.info(`🏁 FormGenerator.generateFormFromSchema starting`, {\n toolName: context.toolName,\n partialInput,\n hasSchema: !!schema,\n hasShape: !!(schema && isZodObjectSchema(schema)),\n hasPreCalculatedFields: preCalculatedMissingFields !== undefined,\n preCalculatedFieldsSize: preCalculatedMissingFields?.size || 0,\n });\n\n if (preCalculatedMissingFields !== undefined) {\n missingFields = preCalculatedMissingFields;\n this.logger.info(`📋 Using pre-calculated missing fields`, {\n missingFieldsCount: missingFields.size,\n missingFields: Array.from(missingFields),\n });\n } else {\n missingFields = new Set<string>();\n\n const zodObject = this.extractZodObject(schema);\n if (zodObject) {\n const shape = zodObject.shape;\n for (const fieldName of Object.keys(shape)) {\n missingFields.add(fieldName);\n this.logger.info(\n `⭐ Including all fields from focused schema: ${fieldName}`\n );\n }\n }\n\n this.logger.info(`📋 Using ALL fields from focused schema`, {\n totalFields: zodObject ? Object.keys(zodObject.shape).length : 0,\n missingFieldsCount: missingFields.size,\n missingFields: Array.from(missingFields),\n });\n }\n\n const formConfig = this.createFormConfig(\n schema,\n missingFields,\n context.toolName,\n preCalculatedMissingFields\n );\n\n return {\n type: 'form',\n id: `form_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n formConfig,\n originalPrompt: context.toolDescription || `Complete ${context.toolName}`,\n toolName: context.toolName,\n validationErrors: [],\n };\n }\n\n /**\n * Extracts validation errors from ZodError\n */\n private extractValidationErrors(error: ZodError): ValidationError[] {\n return error.issues.map((issue) => ({\n path: issue.path.map((p) => String(p)),\n message: issue.message,\n code: issue.code,\n }));\n }\n\n /**\n * Identifies which fields are missing or invalid from validation errors\n */\n private identifyMissingFields(\n errors: ValidationError[],\n _schema: z.ZodSchema\n ): Set<string> {\n const missingFields = new Set<string>();\n\n errors.forEach((error) => {\n const fieldPath = error.path.join('.');\n if (fieldPath) {\n missingFields.add(fieldPath);\n }\n });\n\n return missingFields;\n }\n\n /**\n * Creates form configuration from schema\n */\n private createFormConfig(\n schema: z.ZodSchema,\n missingFields: Set<string>,\n toolName: string,\n preCalculatedMissingFields?: Set<string>\n ): FormConfig {\n const extractedConfig = this.extractRenderConfigsSafely(schema);\n const fieldOrdering = this.generateFieldOrderingSafely(schema);\n const fields = this.generateFormFields(\n schema,\n extractedConfig,\n missingFields,\n fieldOrdering,\n preCalculatedMissingFields,\n toolName\n );\n\n const globalGuidance = fieldGuidanceRegistry.getGlobalGuidance(toolName);\n let description = this.generateFormDescription(toolName, missingFields.size);\n \n if (globalGuidance?.qualityStandards) {\n description += '\\n\\nQuality Guidelines:\\n' + \n globalGuidance.qualityStandards.map(standard => `• ${standard}`).join('\\n');\n }\n\n return {\n title: this.generateFormTitle(toolName),\n description,\n fields,\n submitLabel: 'Continue',\n cancelLabel: 'Cancel',\n metadata: {\n toolName,\n missingFieldCount: missingFields.size,\n globalGuidance\n },\n };\n }\n\n /**\n * Safely extracts render configs from schema\n */\n private extractRenderConfigsSafely(\n schema: z.ZodSchema\n ): ExtractedRenderConfig {\n try {\n if (typeof extractRenderConfigs === 'function') {\n return extractRenderConfigs(schema as unknown as ZodSchemaWithRender);\n }\n } catch (error) {\n this.logger.warn('Could not extract render configs:', error);\n }\n return {\n fields: {},\n groups: {},\n order: [],\n metadata: {},\n };\n }\n\n /**\n * Safely generates field ordering from schema\n */\n private generateFieldOrderingSafely(schema: z.ZodSchema): {\n sections: Array<{ fields: string[] }>;\n } {\n try {\n if (typeof generateFieldOrdering === 'function') {\n const ordering = generateFieldOrdering(\n schema as unknown as ZodSchemaWithRender\n );\n\n const sections = Object.values(ordering.sections).map((section) => ({\n fields: section.fields,\n }));\n return { sections };\n }\n } catch (error) {\n this.logger.warn('Could not generate field ordering:', error);\n }\n return { sections: [] };\n }\n\n /**\n * Determines field priority for progressive disclosure\n */\n private getFieldPriority(\n name: string,\n renderConfig?: RenderConfigSchema,\n isRequired?: boolean\n ): FieldPriority {\n if (renderConfig?.ui?.priority) {\n const priority = renderConfig.ui.priority as string;\n if (Object.values(FIELD_PRIORITIES).includes(priority as FieldPriority)) {\n return priority as FieldPriority;\n }\n }\n\n if (isRequired === true) {\n return FIELD_PRIORITIES.ESSENTIAL;\n }\n\n const ui = renderConfig?.ui as Record<string, unknown> | undefined;\n if (ui?.advanced === true) {\n return FIELD_PRIORITIES.ADVANCED;\n }\n\n if (ui?.expert === true) {\n return FIELD_PRIORITIES.EXPERT;\n }\n\n return FIELD_PRIORITIES.COMMON;\n }\n\n /**\n * Determines which fields should be included in the form\n */\n private determineFieldsToInclude(\n schema: z.ZodSchema,\n missingFields: Set<string>,\n preCalculatedMissingFields?: Set<string>\n ): Set<string> {\n const fieldsToInclude = new Set<string>();\n\n if (preCalculatedMissingFields === undefined) {\n this.logger.info(\n `⭐ Focused schema mode - including ALL fields from schema`\n );\n const allSchemaFields = this.extractFieldsFromSchema(schema);\n allSchemaFields.forEach((fieldName) => {\n fieldsToInclude.add(fieldName);\n this.logger.info(`✅ Including focused schema field: ${fieldName}`);\n });\n } else if (preCalculatedMissingFields.size > 0) {\n this.logger.info(\n `📋 Using ONLY pre-calculated missing fields (${preCalculatedMissingFields.size} fields)`,\n { fields: Array.from(preCalculatedMissingFields) }\n );\n preCalculatedMissingFields.forEach((fieldName) => {\n fieldsToInclude.add(fieldName);\n this.logger.info(`✅ Including pre-calculated field: ${fieldName}`);\n });\n } else {\n this.logger.info(\n '⚠️ No pre-calculated fields, falling back to schema analysis'\n );\n this.includeRequiredMissingFields(schema, missingFields, fieldsToInclude);\n }\n\n return fieldsToInclude;\n }\n\n /**\n * Includes required fields that are missing\n */\n private includeRequiredMissingFields(\n schema: z.ZodSchema,\n missingFields: Set<string>,\n fieldsToInclude: Set<string>\n ): void {\n const allSchemaFields = this.extractFieldsFromSchema(schema);\n allSchemaFields.forEach((fieldName) => {\n const isRequired = this.isFieldRequired(schema, fieldName);\n const isMissing = missingFields.has(fieldName);\n const shouldInclude = isMissing && isRequired;\n\n this.logger.info(`🔍 FormGenerator field inclusion check: ${fieldName}`, {\n isRequired,\n isMissing,\n shouldInclude,\n });\n\n if (shouldInclude) {\n fieldsToInclude.add(fieldName);\n }\n });\n }\n\n /**\n * Creates form fields from ordered field names\n */\n private createOrderedFields(\n fieldsToInclude: Set<string>,\n fieldOrdering: { sections: Array<{ fields: string[] }> },\n extractedConfig: ExtractedRenderConfig,\n schema: z.ZodSchema,\n toolName?: string\n ): FormField[] {\n const fields: FormField[] = [];\n const processedFields = new Set<string>();\n\n if (fieldOrdering.sections.length > 0) {\n const orderedFieldNames = fieldOrdering.sections.flatMap((s) => s.fields);\n orderedFieldNames.forEach((fieldName) => {\n if (fieldsToInclude.has(fieldName) && !processedFields.has(fieldName)) {\n const field = this.createFormField(\n fieldName,\n extractedConfig.fields[fieldName],\n schema,\n fieldName,\n toolName\n );\n if (field) {\n fields.push(field);\n processedFields.add(fieldName);\n }\n }\n });\n }\n\n fieldsToInclude.forEach((fieldName) => {\n if (!processedFields.has(fieldName)) {\n const field = this.createFormField(\n fieldName,\n extractedConfig.fields[fieldName],\n schema,\n fieldName,\n toolName\n );\n if (field) {\n fields.push(field);\n }\n }\n });\n\n return fields;\n }\n\n /**\n * Generates form fields from schema and validation errors\n */\n private generateFormFields(\n schema: z.ZodSchema,\n extractedConfig: ExtractedRenderConfig,\n missingFields: Set<string>,\n fieldOrdering: { sections: Array<{ fields: string[] }> },\n preCalculatedMissingFields?: Set<string>,\n toolName?: string\n ): FormField[] {\n const fieldsToInclude = this.determineFieldsToInclude(\n schema,\n missingFields,\n preCalculatedMissingFields\n );\n\n let fields = this.createOrderedFields(\n fieldsToInclude,\n fieldOrdering,\n extractedConfig,\n schema,\n toolName\n );\n\n if (fields.length === 0 && missingFields.size > 0) {\n fields = Array.from(missingFields)\n .map((fieldName) =>\n this.createFormField(\n fieldName,\n extractedConfig.fields[fieldName],\n schema,\n fieldName,\n toolName\n )\n )\n .filter(\n (field): field is FormField => field !== null && field !== undefined\n );\n }\n\n return fields;\n }\n\n /**\n * Creates a single form field\n */\n private createFormField(\n fieldName: string,\n renderConfig?: RenderConfigSchema,\n schema?: z.ZodSchema,\n fieldPath?: string,\n toolName?: string\n ): FormField {\n const type = this.mapFieldType(renderConfig?.fieldType, schema, fieldPath);\n const isRequired = this.isFieldRequired(schema, fieldPath || fieldName);\n \n const guidance = toolName ? fieldGuidanceRegistry.getFieldGuidance(toolName, fieldName) : null;\n const finalType = guidance?.fieldTypeOverride || type;\n\n const field: FormField = {\n name: fieldName,\n label: renderConfig?.ui?.label || this.humanizeFieldName(fieldName),\n type: finalType,\n required: isRequired,\n priority: this.getFieldPriority(fieldName, renderConfig, isRequired),\n };\n\n if (guidance) {\n if (guidance.suggestions && guidance.suggestions.length > 0) {\n field.suggestions = guidance.suggestions;\n if (!field.placeholder) {\n field.placeholder = `e.g., ${guidance.suggestions[0]}`;\n }\n }\n\n if (guidance.predefinedOptions) {\n field.options = [...(field.options || []), ...guidance.predefinedOptions];\n }\n\n if (guidance.contextualHelpText) {\n field.helpText = guidance.contextualHelpText;\n }\n\n if (guidance.warnings) {\n field.warnings = guidance.warnings.map(w => w.message);\n }\n\n if (guidance.validationRules) {\n const { qualityChecks } = guidance.validationRules;\n if (qualityChecks) {\n field.contextualGuidance = {\n qualityStandards: [],\n examples: guidance.suggestions || [],\n avoidPatterns: qualityChecks.forbidTechnicalTerms || []\n };\n\n if (qualityChecks.minNonTechnicalWords) {\n field.contextualGuidance.qualityStandards?.push(\n `Use at least ${qualityChecks.minNonTechnicalWords} meaningful words`\n );\n }\n\n if (qualityChecks.forbidTechnicalTerms) {\n field.contextualGuidance.qualityStandards?.push(\n `Avoid technical terms like: ${qualityChecks.forbidTechnicalTerms.join(', ')}`\n );\n }\n }\n }\n }\n\n if (renderConfig) {\n field.renderConfig = renderConfig;\n }\n\n if (renderConfig?.ui?.placeholder) {\n field.placeholder = renderConfig.ui.placeholder;\n }\n\n if (renderConfig?.ui?.helpText) {\n field.helpText = renderConfig.ui.helpText;\n }\n\n if (renderConfig?.constraints) {\n const validation: Record<string, unknown> = {};\n if (renderConfig.constraints.min !== undefined)\n validation.min = renderConfig.constraints.min;\n if (renderConfig.constraints.max !== undefined)\n validation.max = renderConfig.constraints.max;\n if (renderConfig.constraints.minLength !== undefined)\n validation.minLength = renderConfig.constraints.minLength;\n if (renderConfig.constraints.maxLength !== undefined)\n validation.maxLength = renderConfig.constraints.maxLength;\n if (renderConfig.constraints.pattern !== undefined)\n validation.pattern = renderConfig.constraints.pattern;\n\n if (Object.keys(validation).length > 0) {\n field.validation = validation;\n }\n }\n\n if (renderConfig?.options) {\n field.options = renderConfig.options.map((opt) => ({\n value: String(opt.value),\n label: opt.label,\n ...(opt.disabled !== undefined && { disabled: opt.disabled }),\n }));\n }\n\n return field;\n }\n\n /**\n * Maps render config field type to form field type with fallback inference\n */\n private mapFieldType(\n fieldType?: string,\n schema?: z.ZodSchema,\n fieldPath?: string\n ): FormFieldType {\n if (!fieldType && schema && fieldPath) {\n const inferredType = this.inferTypeFromSchema(schema, fieldPath);\n if (inferredType) {\n return inferredType;\n }\n }\n\n if (!fieldType && fieldPath) {\n const registryType = fieldTypeRegistry.detectType(fieldPath);\n if (registryType) {\n return registryType;\n }\n }\n\n if (!fieldType) {\n return 'text';\n }\n\n const normalizedType = fieldType.toLowerCase();\n\n if (['text', 'string'].includes(normalizedType)) return 'text';\n if (['number', 'integer', 'float', 'decimal'].includes(normalizedType))\n return 'number';\n if (['select', 'enum', 'dropdown'].includes(normalizedType))\n return 'select';\n if (['checkbox', 'boolean', 'bool'].includes(normalizedType))\n return 'checkbox';\n if (['textarea', 'longtext', 'multiline'].includes(normalizedType))\n return 'textarea';\n if (['file', 'upload', 'attachment'].includes(normalizedType))\n return 'file';\n if (['array', 'list'].includes(normalizedType)) return 'array';\n if (['object', 'json'].includes(normalizedType)) return 'object';\n if (['currency', 'money', 'price'].includes(normalizedType))\n return 'currency';\n if (['percentage', 'percent'].includes(normalizedType)) return 'percentage';\n\n return 'text';\n }\n\n /**\n * Converts field name to human-readable label\n */\n private humanizeFieldName(fieldName: string): string {\n return fieldName\n .replace(/([A-Z])/g, ' $1')\n .replace(/_/g, ' ')\n .replace(/\\./g, ' ')\n .trim()\n .split(' ')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n }\n\n /**\n * Generates a title for the form\n */\n private generateFormTitle(toolName: string): string {\n const cleanName = toolName\n .replace(/Tool$/, '')\n .replace(/Hedera/g, '')\n .replace(/([A-Z])/g, ' $1')\n .trim();\n\n return `Complete ${cleanName} Information`;\n }\n\n /**\n * Safely extracts ZodObject from a schema, returns null if not an object schema\n */\n private extractZodObject(\n schema: z.ZodSchema\n ): z.ZodObject<z.ZodRawShape> | null {\n try {\n const def = (schema as z.ZodType)._def as { typeName?: string };\n if (def && def.typeName === 'ZodObject') {\n return schema as z.ZodObject<z.ZodRawShape>;\n }\n } catch (error) {\n this.logger.debug('Could not extract ZodObject from schema:', error);\n }\n return null;\n }\n\n /**\n * Extracts field names from Zod schema structure\n */\n private extractFieldsFromSchema(schema: z.ZodSchema): string[] {\n const fields: string[] = [];\n\n const zodObject = this.extractZodObject(schema);\n if (zodObject) {\n fields.push(...Object.keys(zodObject.shape));\n return fields;\n }\n\n try {\n const def = (schema as z.ZodType)._def as {\n typeName?: string;\n options?: z.ZodType[];\n };\n if (def && def.typeName === 'ZodUnion' && def.options) {\n const firstOption = def.options[0];\n const firstOptionObject = this.extractZodObject(firstOption);\n if (firstOptionObject) {\n fields.push(...Object.keys(firstOptionObject.shape));\n }\n }\n } catch (error) {\n this.logger.debug(\n 'Could not extract fields from schema structure:',\n error\n );\n }\n\n return fields;\n }\n\n /**\n * Infers field type from Zod schema\n */\n private inferTypeFromSchema(\n schema: z.ZodSchema,\n fieldPath: string\n ): FormFieldType | null {\n try {\n const zodObject = this.extractZodObject(schema);\n if (!zodObject) return null;\n\n const shape = zodObject.shape;\n if (!shape) return null;\n\n let fieldSchema = shape[fieldPath] as z.ZodType | undefined;\n if (!fieldSchema) return null;\n\n const fieldDef = fieldSchema._def as {\n typeName?: string;\n innerType?: z.ZodType;\n };\n if (\n fieldDef &&\n fieldDef.typeName === 'ZodOptional' &&\n fieldDef.innerType\n ) {\n fieldSchema = fieldDef.innerType;\n }\n\n if (!fieldSchema || !fieldSchema._def) return null;\n\n const typeDef = fieldSchema._def as { typeName?: string };\n const fieldTypeName = typeDef.typeName;\n const lowerPath = fieldPath.toLowerCase();\n\n switch (fieldTypeName) {\n case 'ZodString':\n if (lowerPath.includes('memo') || lowerPath.includes('description')) {\n return 'textarea';\n }\n return 'text';\n case 'ZodNumber':\n if (lowerPath.includes('percent')) {\n return 'percentage';\n }\n if (lowerPath.includes('price') || lowerPath.includes('cost')) {\n return 'currency';\n }\n return 'number';\n case 'ZodBoolean':\n return 'checkbox';\n case 'ZodEnum':\n case 'ZodNativeEnum':\n return 'select';\n case 'ZodArray':\n return 'array';\n case 'ZodObject':\n return 'object';\n default:\n return 'text';\n }\n } catch (error) {\n this.logger.debug('Could not infer type from schema:', error);\n }\n return null;\n }\n\n /**\n * Determines if a field is required based on the Zod schema\n */\n private isFieldRequired(schema?: z.ZodSchema, fieldPath?: string): boolean {\n if (!schema || !fieldPath) {\n return false;\n }\n\n try {\n const zodObject = this.extractZodObject(schema);\n if (!zodObject) return false;\n\n const shape = zodObject.shape;\n if (!shape || !shape[fieldPath]) return false;\n\n const fieldSchema = shape[fieldPath] as z.ZodType;\n if (!fieldSchema || !fieldSchema._def) return true;\n\n const fieldDef = fieldSchema._def as {\n typeName?: string;\n defaultValue?: unknown;\n };\n const typeName = fieldDef.typeName;\n\n if (typeName === 'ZodOptional') {\n return false;\n }\n\n if (typeName === 'ZodDefault') {\n return false;\n }\n\n if (fieldDef.defaultValue !== undefined) {\n return false;\n }\n\n return true;\n } catch (error) {\n this.logger.debug(\n `Could not determine if field ${fieldPath} is required:`,\n error\n );\n }\n\n return false;\n }\n\n /**\n * Generates a description for the form\n */\n private generateFormDescription(\n toolName: string,\n fieldCount: number\n ): string {\n if (fieldCount === 0) {\n return 'Please provide the required information to continue with your request.';\n }\n\n return `Please provide the following ${fieldCount} required field${\n fieldCount !== 1 ? 's' : ''\n } to continue with your request.`;\n }\n\n /**\n * Generates JSON Schema and uiSchema from a Zod schema for use with @rjsf/core\n * @param zodSchema The Zod schema to convert\n * @param partialInput Existing input data to filter out fields that already have values\n * @param missingFields Set of fields that are missing and should be shown\n * @returns Object containing jsonSchema and uiSchema\n */\n public generateJsonSchemaForm(\n zodSchema: z.ZodObject<z.ZodRawShape>,\n partialInput?: Record<string, unknown>,\n missingFields?: Set<string>\n ): { jsonSchema: Record<string, unknown>; uiSchema: Record<string, unknown> } {\n const fullJsonSchema = zodToJsonSchema(zodSchema, {\n target: 'jsonSchema7',\n });\n\n const uiSchema: Record<string, Record<string, unknown>> = {};\n\n let jsonSchema = fullJsonSchema;\n if (missingFields && missingFields.size > 0) {\n const fullSchemaAsObject = fullJsonSchema as {\n properties?: Record<string, unknown>;\n required?: string[];\n [key: string]: unknown;\n };\n if (\n fullSchemaAsObject.properties &&\n typeof fullSchemaAsObject.properties === 'object'\n ) {\n const filteredSchema = {\n ...fullSchemaAsObject,\n type: 'object' as const,\n properties: {} as Record<string, unknown>,\n required: [] as string[],\n };\n\n let fieldsAdded = 0;\n missingFields.forEach((fieldName) => {\n if (\n fullSchemaAsObject.properties &&\n fullSchemaAsObject.properties[fieldName]\n ) {\n filteredSchema.properties[fieldName] =\n fullSchemaAsObject.properties[fieldName];\n fieldsAdded++;\n }\n });\n\n if (Array.isArray(fullSchemaAsObject.required)) {\n filteredSchema.required = fullSchemaAsObject.required.filter(\n (field: string) => missingFields.has(field)\n );\n }\n\n if (fieldsAdded > 0) {\n jsonSchema = filteredSchema;\n }\n }\n }\n\n const fieldNames = this.extractFieldsFromSchema(zodSchema);\n\n fieldNames.forEach((fieldName) => {\n const isRequired = this.isFieldRequired(zodSchema, fieldName);\n const priority = this.getFieldPriority(fieldName, undefined, isRequired);\n const lower = fieldName.toLowerCase();\n\n if (\n lower === 'attributes' ||\n lower === 'metadata' ||\n lower === 'properties'\n ) {\n uiSchema[fieldName] = {\n 'ui:options': {\n collapsible: true,\n collapsed: true,\n },\n };\n }\n\n switch (priority) {\n case 'essential':\n if (isRequired) {\n uiSchema[fieldName] = {\n ...uiSchema[fieldName],\n 'ui:help': 'Required field',\n };\n }\n break;\n case 'advanced':\n case 'expert':\n uiSchema[fieldName] = {\n ...uiSchema[fieldName],\n 'ui:options': {\n ...(uiSchema[fieldName]?.['ui:options'] as\n | Record<string, unknown>\n | undefined),\n collapsed: true,\n },\n };\n break;\n }\n });\n\n return { jsonSchema, uiSchema };\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,104 +1,319 @@
1
- const MCPServers = {
2
- /**
3
- * Filesystem server for file operations
4
- */
5
- filesystem: (path) => ({
6
- name: "filesystem",
7
- command: "npx",
8
- args: ["-y", "@modelcontextprotocol/server-filesystem", path],
9
- transport: "stdio",
10
- autoConnect: true,
11
- additionalContext: "This server provides access to files and directories in the current working directory.",
12
- toolDescriptions: {
13
- list_directory: 'Use this tool when users ask about files in the "current directory" or "working directory".',
14
- read_file: "Use this tool when users ask to see or check files in the current directory."
1
+ import { ZodError } from "zod";
2
+ import { Logger } from "@hashgraphonline/standards-sdk";
3
+ import { FormGenerator } from "./index10.js";
4
+ import { isFormValidatable } from "@hashgraphonline/standards-agent-kit";
5
+ class FormEngine {
6
+ constructor(logger) {
7
+ this.formGenerator = new FormGenerator();
8
+ this.logger = logger || new Logger({ module: "FormEngine" });
9
+ }
10
+ /**
11
+ * Generate a form for a tool with the given input
12
+ */
13
+ async generateForm(toolName, tool, input, context) {
14
+ const fullContext = {
15
+ tool,
16
+ input,
17
+ ...context
18
+ };
19
+ try {
20
+ if (isFormValidatable(tool)) {
21
+ return await this.generateFormValidatableForm(tool, input, fullContext);
22
+ }
23
+ if (input instanceof ZodError) {
24
+ return await this.generateErrorBasedForm(tool, input, fullContext);
25
+ }
26
+ if (this.hasRenderConfig(tool)) {
27
+ return await this.generateRenderConfigForm(tool, input, fullContext);
28
+ }
29
+ if (this.isZodObject(tool.schema)) {
30
+ return await this.generateSchemaBasedForm(tool, input, fullContext);
31
+ }
32
+ return null;
33
+ } catch (error) {
34
+ this.logger.error(`Failed to generate form for tool: ${toolName}`, {
35
+ error: error instanceof Error ? error.message : String(error)
36
+ });
37
+ throw error;
15
38
  }
16
- }),
17
- /**
18
- * GitHub server for repository operations
19
- */
20
- github: (token) => ({
21
- name: "github",
22
- command: "npx",
23
- args: ["-y", "@modelcontextprotocol/server-github"],
24
- ...token && { env: { GITHUB_TOKEN: token } },
25
- transport: "stdio",
26
- autoConnect: true
27
- }),
28
- /**
29
- * Slack server for messaging operations
30
- */
31
- slack: (token) => ({
32
- name: "slack",
33
- command: "npx",
34
- args: ["-y", "@modelcontextprotocol/server-slack"],
35
- env: { SLACK_TOKEN: token },
36
- transport: "stdio",
37
- autoConnect: true
38
- }),
39
- /**
40
- * Google Drive server for document operations
41
- */
42
- googleDrive: (credentials) => ({
43
- name: "google-drive",
44
- command: "npx",
45
- args: ["-y", "@modelcontextprotocol/server-google-drive"],
46
- env: { GOOGLE_CREDENTIALS: credentials },
47
- transport: "stdio",
48
- autoConnect: true
49
- }),
50
- /**
51
- * PostgreSQL server for database operations
52
- */
53
- postgres: (connectionString) => ({
54
- name: "postgres",
55
- command: "npx",
56
- args: ["-y", "@modelcontextprotocol/server-postgres", connectionString],
57
- transport: "stdio",
58
- autoConnect: true
59
- }),
60
- /**
61
- * SQLite server for database operations
62
- */
63
- sqlite: (dbPath) => ({
64
- name: "sqlite",
65
- command: "npx",
66
- args: ["-y", "@modelcontextprotocol/server-sqlite", dbPath],
67
- transport: "stdio",
68
- autoConnect: true
69
- }),
70
- /**
71
- * Custom server configuration
72
- */
73
- custom: (config) => config
74
- };
75
- function validateServerConfig(config) {
76
- const errors = [];
77
- if (!config.name) {
78
- errors.push("Server name is required");
79
39
  }
80
- if (!config.command) {
81
- errors.push("Server command is required");
40
+ /**
41
+ * Process a form submission
42
+ */
43
+ async processSubmission(submission, context) {
44
+ this.validateSubmission(submission);
45
+ const baseToolInput = this.extractBaseToolInput(context);
46
+ const submissionData = this.extractSubmissionData(submission);
47
+ return this.mergeInputData(baseToolInput, submissionData);
82
48
  }
83
- if (!config.args || !Array.isArray(config.args)) {
84
- errors.push("Server args must be an array");
49
+ /**
50
+ * Check if a tool requires form generation based on input
51
+ */
52
+ shouldGenerateForm(tool, input) {
53
+ const inputRecord = input;
54
+ if (inputRecord?.__fromForm === true || inputRecord?.renderForm === false) {
55
+ return false;
56
+ }
57
+ if (isFormValidatable(tool)) {
58
+ try {
59
+ const formValidatableTool = tool;
60
+ return formValidatableTool.shouldGenerateForm(input);
61
+ } catch (error) {
62
+ this.logger.error(
63
+ `Error calling shouldGenerateForm() on ${tool.name}:`,
64
+ error
65
+ );
66
+ return false;
67
+ }
68
+ }
69
+ const validation = this.validateInput(tool, input);
70
+ return !validation.isValid;
85
71
  }
86
- if (config.transport && !["stdio", "http", "websocket"].includes(config.transport)) {
87
- errors.push("Invalid transport type. Must be stdio, http, or websocket");
72
+ /**
73
+ * Generate form from error context
74
+ */
75
+ async generateFormFromError(error, toolName, toolSchema, originalPrompt) {
76
+ return this.formGenerator.generateFormFromError(
77
+ error,
78
+ toolSchema,
79
+ toolName,
80
+ originalPrompt
81
+ );
82
+ }
83
+ /**
84
+ * Generate form for FormValidatable tools
85
+ */
86
+ async generateFormValidatableForm(tool, input, _context) {
87
+ const { schemaToUse, isFocusedSchema } = this.resolveFormSchema(tool);
88
+ const missingFields = this.determineMissingFields(
89
+ tool,
90
+ input,
91
+ schemaToUse,
92
+ isFocusedSchema
93
+ );
94
+ return this.generateFormWithSchema(tool, input, schemaToUse, missingFields);
95
+ }
96
+ /**
97
+ * Generate form based on schema validation
98
+ */
99
+ async generateSchemaBasedForm(tool, input, context) {
100
+ const schema = tool.schema;
101
+ const formMessage = await this.formGenerator.generateFormFromSchema(
102
+ schema,
103
+ input,
104
+ {
105
+ toolName: tool.name,
106
+ toolDescription: tool.description
107
+ },
108
+ context.missingFields
109
+ );
110
+ if (this.isZodObject(schema)) {
111
+ try {
112
+ const { jsonSchema, uiSchema } = this.formGenerator.generateJsonSchemaForm(
113
+ schema,
114
+ input,
115
+ context.missingFields || /* @__PURE__ */ new Set()
116
+ );
117
+ formMessage.jsonSchema = jsonSchema;
118
+ formMessage.uiSchema = uiSchema;
119
+ } catch (error) {
120
+ this.logger.warn(
121
+ "Failed to generate JSON Schema for schema-based tool:",
122
+ error
123
+ );
124
+ }
125
+ }
126
+ formMessage.partialInput = input;
127
+ return formMessage;
128
+ }
129
+ /**
130
+ * Generate form based on render config
131
+ */
132
+ async generateRenderConfigForm(tool, input, context) {
133
+ const schema = tool.schema;
134
+ const renderConfig = this.extractRenderConfig(tool);
135
+ const formMessage = await this.formGenerator.generateFormFromSchema(
136
+ schema,
137
+ input,
138
+ {
139
+ toolName: tool.name,
140
+ toolDescription: tool.description
141
+ },
142
+ context.missingFields
143
+ );
144
+ if (renderConfig) {
145
+ formMessage.formConfig.metadata = {
146
+ ...formMessage.formConfig.metadata,
147
+ renderConfig
148
+ };
149
+ }
150
+ formMessage.partialInput = input;
151
+ return formMessage;
152
+ }
153
+ /**
154
+ * Generate form from Zod validation error
155
+ */
156
+ async generateErrorBasedForm(tool, error, context) {
157
+ return this.formGenerator.generateFormFromError(
158
+ error,
159
+ tool.schema,
160
+ tool.name,
161
+ context.input ? String(context.input) : ""
162
+ );
163
+ }
164
+ /**
165
+ * Validate input against tool schema
166
+ */
167
+ validateInput(tool, input) {
168
+ try {
169
+ const zodSchema = tool.schema;
170
+ zodSchema.parse(input);
171
+ return { isValid: true };
172
+ } catch (error) {
173
+ if (error instanceof ZodError) {
174
+ const errors = error.errors.map(
175
+ (err) => `${err.path.join(".")}: ${err.message}`
176
+ );
177
+ return { isValid: false, errors };
178
+ }
179
+ return { isValid: false, errors: ["Validation failed"] };
180
+ }
181
+ }
182
+ /**
183
+ * Check if schema is ZodObject
184
+ */
185
+ isZodObject(schema) {
186
+ if (!schema || typeof schema !== "object") {
187
+ return false;
188
+ }
189
+ const candidate = schema;
190
+ return Boolean(candidate._def && candidate._def.typeName === "ZodObject");
191
+ }
192
+ /**
193
+ * Check if tool has render configuration
194
+ */
195
+ hasRenderConfig(tool) {
196
+ const schema = tool.schema;
197
+ return !!(schema && schema._renderConfig);
198
+ }
199
+ /**
200
+ * Extract render configuration from tool
201
+ */
202
+ extractRenderConfig(tool) {
203
+ const schema = tool.schema;
204
+ return schema?._renderConfig;
205
+ }
206
+ /**
207
+ * Resolve form schema for FormValidatable tools
208
+ */
209
+ resolveFormSchema(tool) {
210
+ const formValidatableTool = tool;
211
+ if (formValidatableTool.getFormSchema) {
212
+ const focusedSchema = formValidatableTool.getFormSchema();
213
+ if (focusedSchema) {
214
+ return { schemaToUse: focusedSchema, isFocusedSchema: true };
215
+ }
216
+ }
217
+ return { schemaToUse: tool.schema, isFocusedSchema: false };
218
+ }
219
+ /**
220
+ * Determine missing fields for form generation
221
+ */
222
+ determineMissingFields(tool, input, _schema, _isFocusedSchema) {
223
+ const missingFields = /* @__PURE__ */ new Set();
224
+ if (!input || typeof input !== "object") {
225
+ return missingFields;
226
+ }
227
+ const inputRecord = input;
228
+ const formValidatableTool = tool;
229
+ if (formValidatableTool.getEssentialFields) {
230
+ const essentialFields = formValidatableTool.getEssentialFields();
231
+ for (const field of essentialFields) {
232
+ if (!(field in inputRecord) || formValidatableTool.isFieldEmpty && formValidatableTool.isFieldEmpty(field, inputRecord[field])) {
233
+ missingFields.add(field);
234
+ }
235
+ }
236
+ }
237
+ return missingFields;
238
+ }
239
+ /**
240
+ * Generate form with resolved schema
241
+ */
242
+ async generateFormWithSchema(tool, input, schema, missingFields) {
243
+ const formMessage = await this.formGenerator.generateFormFromSchema(
244
+ schema,
245
+ input,
246
+ {
247
+ toolName: tool.name,
248
+ toolDescription: tool.description
249
+ },
250
+ missingFields
251
+ );
252
+ if (this.isZodObject(schema)) {
253
+ try {
254
+ const { jsonSchema, uiSchema } = this.formGenerator.generateJsonSchemaForm(
255
+ schema,
256
+ input,
257
+ missingFields
258
+ );
259
+ formMessage.jsonSchema = jsonSchema;
260
+ formMessage.uiSchema = uiSchema;
261
+ } catch (error) {
262
+ this.logger.warn("Failed to generate JSON Schema:", error);
263
+ }
264
+ }
265
+ formMessage.partialInput = input;
266
+ return formMessage;
267
+ }
268
+ /**
269
+ * Validate form submission
270
+ */
271
+ validateSubmission(submission) {
272
+ if (!submission.toolName) {
273
+ throw new Error("Tool name is required in form submission");
274
+ }
275
+ if (!submission.parameters) {
276
+ throw new Error("Parameters are required in form submission");
277
+ }
278
+ }
279
+ /**
280
+ * Extract base tool input from context
281
+ */
282
+ extractBaseToolInput(context) {
283
+ return context?.originalInput || {};
284
+ }
285
+ /**
286
+ * Extract submission data
287
+ */
288
+ extractSubmissionData(submission) {
289
+ return {
290
+ ...submission.parameters,
291
+ __fromForm: true
292
+ };
293
+ }
294
+ /**
295
+ * Merge input data
296
+ */
297
+ mergeInputData(baseInput, submissionData) {
298
+ return {
299
+ ...baseInput,
300
+ ...submissionData
301
+ };
302
+ }
303
+ /**
304
+ * Get registered strategies
305
+ */
306
+ getRegisteredStrategies() {
307
+ return ["FormValidatable", "SchemaBased", "RenderConfig", "ZodErrorBased"];
308
+ }
309
+ /**
310
+ * Get registered middleware
311
+ */
312
+ getRegisteredMiddleware() {
313
+ return ["FormSubmissionValidator"];
88
314
  }
89
- return errors;
90
- }
91
- function createMCPConfig(servers, autoConnect = true) {
92
- return {
93
- mcpServers: servers.map((server) => ({
94
- ...server,
95
- autoConnect: server.autoConnect ?? autoConnect
96
- }))
97
- };
98
315
  }
99
316
  export {
100
- MCPServers,
101
- createMCPConfig,
102
- validateServerConfig
317
+ FormEngine
103
318
  };
104
319
  //# sourceMappingURL=index11.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index11.js","sources":["../../src/mcp/helpers.ts"],"sourcesContent":["import type { MCPServerConfig } from './types';\n\n/**\n * Common MCP server configurations for easy setup\n */\nexport const MCPServers = {\n /**\n * Filesystem server for file operations\n */\n filesystem: (path: string): MCPServerConfig => ({\n name: 'filesystem',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-filesystem', path],\n transport: 'stdio',\n autoConnect: true,\n additionalContext: 'This server provides access to files and directories in the current working directory.',\n toolDescriptions: {\n list_directory: 'Use this tool when users ask about files in the \"current directory\" or \"working directory\".',\n read_file: 'Use this tool when users ask to see or check files in the current directory.',\n },\n }),\n\n /**\n * GitHub server for repository operations\n */\n github: (token?: string): MCPServerConfig => ({\n name: 'github',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-github'],\n ...(token && { env: { GITHUB_TOKEN: token } }),\n transport: 'stdio',\n autoConnect: true,\n }),\n\n /**\n * Slack server for messaging operations\n */\n slack: (token: string): MCPServerConfig => ({\n name: 'slack',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-slack'],\n env: { SLACK_TOKEN: token },\n transport: 'stdio',\n autoConnect: true,\n }),\n\n /**\n * Google Drive server for document operations\n */\n googleDrive: (credentials: string): MCPServerConfig => ({\n name: 'google-drive',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-google-drive'],\n env: { GOOGLE_CREDENTIALS: credentials },\n transport: 'stdio',\n autoConnect: true,\n }),\n\n /**\n * PostgreSQL server for database operations\n */\n postgres: (connectionString: string): MCPServerConfig => ({\n name: 'postgres',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-postgres', connectionString],\n transport: 'stdio',\n autoConnect: true,\n }),\n\n /**\n * SQLite server for database operations\n */\n sqlite: (dbPath: string): MCPServerConfig => ({\n name: 'sqlite',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-sqlite', dbPath],\n transport: 'stdio',\n autoConnect: true,\n }),\n\n /**\n * Custom server configuration\n */\n custom: (config: MCPServerConfig): MCPServerConfig => config,\n};\n\n/**\n * Validate MCP server configuration\n */\nexport function validateServerConfig(config: MCPServerConfig): string[] {\n const errors: string[] = [];\n\n if (!config.name) {\n errors.push('Server name is required');\n }\n\n if (!config.command) {\n errors.push('Server command is required');\n }\n\n if (!config.args || !Array.isArray(config.args)) {\n errors.push('Server args must be an array');\n }\n\n if (config.transport && !['stdio', 'http', 'websocket'].includes(config.transport)) {\n errors.push('Invalid transport type. Must be stdio, http, or websocket');\n }\n\n return errors;\n}\n\n/**\n * Create a typed MCP configuration for ConversationalAgent\n */\nexport function createMCPConfig(servers: MCPServerConfig[], autoConnect = true): { mcpServers: MCPServerConfig[] } {\n return {\n mcpServers: servers.map(server => ({\n ...server,\n autoConnect: server.autoConnect ?? autoConnect,\n })),\n };\n}"],"names":[],"mappings":"AAKO,MAAM,aAAa;AAAA;AAAA;AAAA;AAAA,EAIxB,YAAY,CAAC,UAAmC;AAAA,IAC9C,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,MAAM,2CAA2C,IAAI;AAAA,IAC5D,WAAW;AAAA,IACX,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,MAChB,gBAAgB;AAAA,MAChB,WAAW;AAAA,IAAA;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAMF,QAAQ,CAAC,WAAqC;AAAA,IAC5C,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,MAAM,qCAAqC;AAAA,IAClD,GAAI,SAAS,EAAE,KAAK,EAAE,cAAc,QAAM;AAAA,IAC1C,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMf,OAAO,CAAC,WAAoC;AAAA,IAC1C,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,MAAM,oCAAoC;AAAA,IACjD,KAAK,EAAE,aAAa,MAAA;AAAA,IACpB,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMf,aAAa,CAAC,iBAA0C;AAAA,IACtD,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,MAAM,2CAA2C;AAAA,IACxD,KAAK,EAAE,oBAAoB,YAAA;AAAA,IAC3B,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMf,UAAU,CAAC,sBAA+C;AAAA,IACxD,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,MAAM,yCAAyC,gBAAgB;AAAA,IACtE,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMf,QAAQ,CAAC,YAAqC;AAAA,IAC5C,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,MAAM,uCAAuC,MAAM;AAAA,IAC1D,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMf,QAAQ,CAAC,WAA6C;AACxD;AAKO,SAAS,qBAAqB,QAAmC;AACtE,QAAM,SAAmB,CAAA;AAEzB,MAAI,CAAC,OAAO,MAAM;AAChB,WAAO,KAAK,yBAAyB;AAAA,EACvC;AAEA,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,KAAK,4BAA4B;AAAA,EAC1C;AAEA,MAAI,CAAC,OAAO,QAAQ,CAAC,MAAM,QAAQ,OAAO,IAAI,GAAG;AAC/C,WAAO,KAAK,8BAA8B;AAAA,EAC5C;AAEA,MAAI,OAAO,aAAa,CAAC,CAAC,SAAS,QAAQ,WAAW,EAAE,SAAS,OAAO,SAAS,GAAG;AAClF,WAAO,KAAK,2DAA2D;AAAA,EACzE;AAEA,SAAO;AACT;AAKO,SAAS,gBAAgB,SAA4B,cAAc,MAAyC;AACjH,SAAO;AAAA,IACL,YAAY,QAAQ,IAAI,CAAA,YAAW;AAAA,MACjC,GAAG;AAAA,MACH,aAAa,OAAO,eAAe;AAAA,IAAA,EACnC;AAAA,EAAA;AAEN;"}
1
+ {"version":3,"file":"index11.js","sources":["../../src/forms/form-engine.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(\n `Error calling shouldGenerateForm() on ${tool.name}:`,\n error\n );\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(\n tool,\n input,\n schemaToUse,\n isFocusedSchema\n );\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 } =\n 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(\n 'Failed to generate JSON Schema for schema-based tool:',\n error\n );\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<\n unknown,\n z.ZodTypeDef,\n unknown\n >;\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(\n tool: StructuredTool\n ): 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 (\n !(field in inputRecord) ||\n (formValidatableTool.isFieldEmpty &&\n formValidatableTool.isFieldEmpty(field, inputRecord[field]))\n ) {\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 } =\n 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(\n submission: FormSubmission\n ): 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}\n"],"names":[],"mappings":"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"}