@hashgraphonline/conversational-agent 0.2.216 → 0.2.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 (312) hide show
  1. package/cli/readme.md +181 -0
  2. package/dist/cjs/index.cjs +1 -1
  3. package/dist/cjs/index.cjs.map +1 -1
  4. package/dist/cjs/index.d.ts +1 -0
  5. package/dist/cjs/plugins/community/swarm/SwarmPlugin.d.ts +17 -0
  6. package/dist/cjs/plugins/community/swarm/__tests__/SwarmPlugin.mocks.d.ts +1 -0
  7. package/dist/cjs/plugins/community/swarm/__tests__/SwarmPlugin.test.d.ts +1 -0
  8. package/dist/cjs/plugins/community/swarm/__tests__/tools/CreatePostageStampTool.test.d.ts +1 -0
  9. package/dist/cjs/plugins/community/swarm/__tests__/tools/DownloadDataTool.test.d.ts +1 -0
  10. package/dist/cjs/plugins/community/swarm/__tests__/tools/DownloadFilesTool.test.d.ts +1 -0
  11. package/dist/cjs/plugins/community/swarm/__tests__/tools/ExtendPostageStampTool.test.d.ts +1 -0
  12. package/dist/cjs/plugins/community/swarm/__tests__/tools/GetPostageStampTool.test.d.ts +1 -0
  13. package/dist/cjs/plugins/community/swarm/__tests__/tools/ListPostageStampsTool.test.d.ts +1 -0
  14. package/dist/cjs/plugins/community/swarm/__tests__/tools/QueryUploadProgressTool.test.d.ts +1 -0
  15. package/dist/cjs/plugins/community/swarm/__tests__/tools/ReadFeedTool.test.d.ts +1 -0
  16. package/dist/cjs/plugins/community/swarm/__tests__/tools/SwarmTool.mocks.d.ts +14 -0
  17. package/dist/cjs/plugins/community/swarm/__tests__/tools/UpdateFeedTool.test.d.ts +1 -0
  18. package/dist/cjs/plugins/community/swarm/__tests__/tools/UploadDataTool.test.d.ts +1 -0
  19. package/dist/cjs/plugins/community/swarm/__tests__/tools/UploadFileTool.test.d.ts +1 -0
  20. package/dist/cjs/plugins/community/swarm/__tests__/tools/UploadFolderTool.test.d.ts +1 -0
  21. package/dist/cjs/plugins/community/swarm/config.d.ts +6 -0
  22. package/dist/cjs/plugins/community/swarm/constants.d.ts +8 -0
  23. package/dist/cjs/plugins/community/swarm/index.d.ts +2 -0
  24. package/dist/cjs/plugins/community/swarm/model.d.ts +23 -0
  25. package/dist/cjs/plugins/community/swarm/tools/CreatePostageStampTool.d.ts +47 -0
  26. package/dist/cjs/plugins/community/swarm/tools/DownloadDataTool.d.ts +35 -0
  27. package/dist/cjs/plugins/community/swarm/tools/DownloadFilesTool.d.ts +41 -0
  28. package/dist/cjs/plugins/community/swarm/tools/ExtendPostageStampTool.d.ts +47 -0
  29. package/dist/cjs/plugins/community/swarm/tools/GetPostageStampTool.d.ts +35 -0
  30. package/dist/cjs/plugins/community/swarm/tools/ListPostageStampsTool.d.ts +53 -0
  31. package/dist/cjs/plugins/community/swarm/tools/QueryUploadProgressTool.d.ts +35 -0
  32. package/dist/cjs/plugins/community/swarm/tools/ReadFeedTool.d.ts +41 -0
  33. package/dist/cjs/plugins/community/swarm/tools/UpdateFeedTool.d.ts +47 -0
  34. package/dist/cjs/plugins/community/swarm/tools/UploadDataTool.d.ts +47 -0
  35. package/dist/cjs/plugins/community/swarm/tools/UploadFileTool.d.ts +53 -0
  36. package/dist/cjs/plugins/community/swarm/tools/UploadFolderTool.d.ts +47 -0
  37. package/dist/cjs/plugins/community/swarm/utils.d.ts +22 -0
  38. package/dist/cjs/plugins/index.d.ts +1 -0
  39. package/dist/esm/index.js +33 -31
  40. package/dist/esm/index.js.map +1 -1
  41. package/dist/esm/index10.js +13 -677
  42. package/dist/esm/index10.js.map +1 -1
  43. package/dist/esm/index11.js +601 -234
  44. package/dist/esm/index11.js.map +1 -1
  45. package/dist/esm/index12.js +296 -136
  46. package/dist/esm/index12.js.map +1 -1
  47. package/dist/esm/index13.js +127 -235
  48. package/dist/esm/index13.js.map +1 -1
  49. package/dist/esm/index14.js +247 -84
  50. package/dist/esm/index14.js.map +1 -1
  51. package/dist/esm/index15.js +81 -159
  52. package/dist/esm/index15.js.map +1 -1
  53. package/dist/esm/index16.js +155 -229
  54. package/dist/esm/index16.js.map +1 -1
  55. package/dist/esm/index17.js +238 -140
  56. package/dist/esm/index17.js.map +1 -1
  57. package/dist/esm/index18.js +139 -493
  58. package/dist/esm/index18.js.map +1 -1
  59. package/dist/esm/index19.js +479 -91
  60. package/dist/esm/index19.js.map +1 -1
  61. package/dist/esm/index20.js +88 -147
  62. package/dist/esm/index20.js.map +1 -1
  63. package/dist/esm/index21.js +127 -666
  64. package/dist/esm/index21.js.map +1 -1
  65. package/dist/esm/index22.js +698 -44
  66. package/dist/esm/index22.js.map +1 -1
  67. package/dist/esm/index23.js +45 -304
  68. package/dist/esm/index23.js.map +1 -1
  69. package/dist/esm/index24.js +303 -153
  70. package/dist/esm/index24.js.map +1 -1
  71. package/dist/esm/index25.js +150 -117
  72. package/dist/esm/index25.js.map +1 -1
  73. package/dist/esm/index26.js +154 -18
  74. package/dist/esm/index26.js.map +1 -1
  75. package/dist/esm/index27.js +18 -22
  76. package/dist/esm/index27.js.map +1 -1
  77. package/dist/esm/index28.js +15 -74
  78. package/dist/esm/index28.js.map +1 -1
  79. package/dist/esm/index29.js +70 -295
  80. package/dist/esm/index29.js.map +1 -1
  81. package/dist/esm/index30.js +279 -100
  82. package/dist/esm/index30.js.map +1 -1
  83. package/dist/esm/index31.js +86 -922
  84. package/dist/esm/index31.js.map +1 -1
  85. package/dist/esm/index32.js +904 -189
  86. package/dist/esm/index32.js.map +1 -1
  87. package/dist/esm/index33.js +185 -1169
  88. package/dist/esm/index33.js.map +1 -1
  89. package/dist/esm/index34.js +1218 -112
  90. package/dist/esm/index34.js.map +1 -1
  91. package/dist/esm/index35.js +111 -99
  92. package/dist/esm/index35.js.map +1 -1
  93. package/dist/esm/index36.js +113 -8
  94. package/dist/esm/index36.js.map +1 -1
  95. package/dist/esm/index37.js +8 -45
  96. package/dist/esm/index37.js.map +1 -1
  97. package/dist/esm/index38.js +41 -102
  98. package/dist/esm/index38.js.map +1 -1
  99. package/dist/esm/index39.js +96 -55
  100. package/dist/esm/index39.js.map +1 -1
  101. package/dist/esm/index4.js +1 -1
  102. package/dist/esm/index40.js +58 -71
  103. package/dist/esm/index40.js.map +1 -1
  104. package/dist/esm/index41.js +79 -21
  105. package/dist/esm/index41.js.map +1 -1
  106. package/dist/esm/index42.js +21 -5
  107. package/dist/esm/index42.js.map +1 -1
  108. package/dist/esm/index43.js +26 -11
  109. package/dist/esm/index43.js.map +1 -1
  110. package/dist/esm/index44.js +12 -322
  111. package/dist/esm/index44.js.map +1 -1
  112. package/dist/esm/index45.js +66 -173
  113. package/dist/esm/index45.js.map +1 -1
  114. package/dist/esm/index46.js +69 -24
  115. package/dist/esm/index46.js.map +1 -1
  116. package/dist/esm/index47.js +47 -88
  117. package/dist/esm/index47.js.map +1 -1
  118. package/dist/esm/index48.js +100 -7
  119. package/dist/esm/index48.js.map +1 -1
  120. package/dist/esm/index49.js +79 -0
  121. package/dist/esm/index49.js.map +1 -0
  122. package/dist/esm/index5.js +2 -2
  123. package/dist/esm/index50.js +75 -0
  124. package/dist/esm/index50.js.map +1 -0
  125. package/dist/esm/index51.js +124 -0
  126. package/dist/esm/index51.js.map +1 -0
  127. package/dist/esm/index52.js +58 -0
  128. package/dist/esm/index52.js.map +1 -0
  129. package/dist/esm/index53.js +83 -0
  130. package/dist/esm/index53.js.map +1 -0
  131. package/dist/esm/index54.js +100 -0
  132. package/dist/esm/index54.js.map +1 -0
  133. package/dist/esm/index55.js +118 -0
  134. package/dist/esm/index55.js.map +1 -0
  135. package/dist/esm/index56.js +108 -0
  136. package/dist/esm/index56.js.map +1 -0
  137. package/dist/esm/index57.js +8 -0
  138. package/dist/esm/index57.js.map +1 -0
  139. package/dist/esm/index58.js +325 -0
  140. package/dist/esm/index58.js.map +1 -0
  141. package/dist/esm/index59.js +187 -0
  142. package/dist/esm/index59.js.map +1 -0
  143. package/dist/esm/index6.js +132 -833
  144. package/dist/esm/index6.js.map +1 -1
  145. package/dist/esm/index60.js +10 -0
  146. package/dist/esm/index60.js.map +1 -0
  147. package/dist/esm/index61.js +98 -0
  148. package/dist/esm/index61.js.map +1 -0
  149. package/dist/esm/index62.js +131 -0
  150. package/dist/esm/index62.js.map +1 -0
  151. package/dist/esm/index63.js +19 -0
  152. package/dist/esm/index63.js.map +1 -0
  153. package/dist/esm/index7.js +826 -75
  154. package/dist/esm/index7.js.map +1 -1
  155. package/dist/esm/index8.js +91 -13
  156. package/dist/esm/index8.js.map +1 -1
  157. package/dist/esm/index9.js +13 -17
  158. package/dist/esm/index9.js.map +1 -1
  159. package/dist/types/index.d.ts +1 -0
  160. package/dist/types/plugins/community/swarm/SwarmPlugin.d.ts +17 -0
  161. package/dist/types/plugins/community/swarm/__tests__/SwarmPlugin.mocks.d.ts +1 -0
  162. package/dist/types/plugins/community/swarm/__tests__/SwarmPlugin.test.d.ts +1 -0
  163. package/dist/types/plugins/community/swarm/__tests__/tools/CreatePostageStampTool.test.d.ts +1 -0
  164. package/dist/types/plugins/community/swarm/__tests__/tools/DownloadDataTool.test.d.ts +1 -0
  165. package/dist/types/plugins/community/swarm/__tests__/tools/DownloadFilesTool.test.d.ts +1 -0
  166. package/dist/types/plugins/community/swarm/__tests__/tools/ExtendPostageStampTool.test.d.ts +1 -0
  167. package/dist/types/plugins/community/swarm/__tests__/tools/GetPostageStampTool.test.d.ts +1 -0
  168. package/dist/types/plugins/community/swarm/__tests__/tools/ListPostageStampsTool.test.d.ts +1 -0
  169. package/dist/types/plugins/community/swarm/__tests__/tools/QueryUploadProgressTool.test.d.ts +1 -0
  170. package/dist/types/plugins/community/swarm/__tests__/tools/ReadFeedTool.test.d.ts +1 -0
  171. package/dist/types/plugins/community/swarm/__tests__/tools/SwarmTool.mocks.d.ts +14 -0
  172. package/dist/types/plugins/community/swarm/__tests__/tools/UpdateFeedTool.test.d.ts +1 -0
  173. package/dist/types/plugins/community/swarm/__tests__/tools/UploadDataTool.test.d.ts +1 -0
  174. package/dist/types/plugins/community/swarm/__tests__/tools/UploadFileTool.test.d.ts +1 -0
  175. package/dist/types/plugins/community/swarm/__tests__/tools/UploadFolderTool.test.d.ts +1 -0
  176. package/dist/types/plugins/community/swarm/config.d.ts +6 -0
  177. package/dist/types/plugins/community/swarm/constants.d.ts +8 -0
  178. package/dist/types/plugins/community/swarm/index.d.ts +2 -0
  179. package/dist/types/plugins/community/swarm/model.d.ts +23 -0
  180. package/dist/types/plugins/community/swarm/tools/CreatePostageStampTool.d.ts +47 -0
  181. package/dist/types/plugins/community/swarm/tools/DownloadDataTool.d.ts +35 -0
  182. package/dist/types/plugins/community/swarm/tools/DownloadFilesTool.d.ts +41 -0
  183. package/dist/types/plugins/community/swarm/tools/ExtendPostageStampTool.d.ts +47 -0
  184. package/dist/types/plugins/community/swarm/tools/GetPostageStampTool.d.ts +35 -0
  185. package/dist/types/plugins/community/swarm/tools/ListPostageStampsTool.d.ts +53 -0
  186. package/dist/types/plugins/community/swarm/tools/QueryUploadProgressTool.d.ts +35 -0
  187. package/dist/types/plugins/community/swarm/tools/ReadFeedTool.d.ts +41 -0
  188. package/dist/types/plugins/community/swarm/tools/UpdateFeedTool.d.ts +47 -0
  189. package/dist/types/plugins/community/swarm/tools/UploadDataTool.d.ts +47 -0
  190. package/dist/types/plugins/community/swarm/tools/UploadFileTool.d.ts +53 -0
  191. package/dist/types/plugins/community/swarm/tools/UploadFolderTool.d.ts +47 -0
  192. package/dist/types/plugins/community/swarm/utils.d.ts +22 -0
  193. package/dist/types/plugins/index.d.ts +1 -0
  194. package/package.json +37 -27
  195. package/src/index.ts +1 -0
  196. package/src/plugins/community/swarm/README.md +279 -0
  197. package/src/plugins/community/swarm/SwarmPlugin.ts +178 -0
  198. package/src/plugins/community/swarm/__tests__/SwarmPlugin.mocks.ts +105 -0
  199. package/src/plugins/community/swarm/__tests__/SwarmPlugin.test.ts +93 -0
  200. package/src/plugins/community/swarm/__tests__/tools/CreatePostageStampTool.test.ts +152 -0
  201. package/src/plugins/community/swarm/__tests__/tools/DownloadDataTool.test.ts +93 -0
  202. package/src/plugins/community/swarm/__tests__/tools/DownloadFilesTool.test.ts +163 -0
  203. package/src/plugins/community/swarm/__tests__/tools/ExtendPostageStampTool.test.ts +132 -0
  204. package/src/plugins/community/swarm/__tests__/tools/GetPostageStampTool.test.ts +83 -0
  205. package/src/plugins/community/swarm/__tests__/tools/ListPostageStampsTool.test.ts +219 -0
  206. package/src/plugins/community/swarm/__tests__/tools/QueryUploadProgressTool.test.ts +169 -0
  207. package/src/plugins/community/swarm/__tests__/tools/ReadFeedTool.test.ts +133 -0
  208. package/src/plugins/community/swarm/__tests__/tools/SwarmTool.mocks.ts +67 -0
  209. package/src/plugins/community/swarm/__tests__/tools/UpdateFeedTool.test.ts +148 -0
  210. package/src/plugins/community/swarm/__tests__/tools/UploadDataTool.test.ts +125 -0
  211. package/src/plugins/community/swarm/__tests__/tools/UploadFileTool.test.ts +194 -0
  212. package/src/plugins/community/swarm/__tests__/tools/UploadFolderTool.test.ts +118 -0
  213. package/src/plugins/community/swarm/config.ts +6 -0
  214. package/src/plugins/community/swarm/constants.ts +12 -0
  215. package/src/plugins/community/swarm/index.ts +2 -0
  216. package/src/plugins/community/swarm/model.ts +23 -0
  217. package/src/plugins/community/swarm/tools/CreatePostageStampTool.ts +137 -0
  218. package/src/plugins/community/swarm/tools/DownloadDataTool.ts +79 -0
  219. package/src/plugins/community/swarm/tools/DownloadFilesTool.ts +155 -0
  220. package/src/plugins/community/swarm/tools/ExtendPostageStampTool.ts +112 -0
  221. package/src/plugins/community/swarm/tools/GetPostageStampTool.ts +92 -0
  222. package/src/plugins/community/swarm/tools/ListPostageStampsTool.ts +124 -0
  223. package/src/plugins/community/swarm/tools/QueryUploadProgressTool.ts +109 -0
  224. package/src/plugins/community/swarm/tools/ReadFeedTool.ts +110 -0
  225. package/src/plugins/community/swarm/tools/UpdateFeedTool.ts +149 -0
  226. package/src/plugins/community/swarm/tools/UploadDataTool.ts +109 -0
  227. package/src/plugins/community/swarm/tools/UploadFileTool.ts +163 -0
  228. package/src/plugins/community/swarm/tools/UploadFolderTool.ts +150 -0
  229. package/src/plugins/community/swarm/utils.ts +172 -0
  230. package/src/plugins/index.ts +1 -0
  231. package/cli/dist/CLIApp.d.ts +0 -11
  232. package/cli/dist/CLIApp.d.ts.map +0 -1
  233. package/cli/dist/CLIApp.js +0 -128
  234. package/cli/dist/CLIApp.js.map +0 -1
  235. package/cli/dist/LocalConversationalAgent.d.ts +0 -37
  236. package/cli/dist/LocalConversationalAgent.js +0 -58
  237. package/cli/dist/app.d.ts +0 -18
  238. package/cli/dist/app.d.ts.map +0 -1
  239. package/cli/dist/app.js +0 -14
  240. package/cli/dist/app.js.map +0 -1
  241. package/cli/dist/cli.d.ts +0 -3
  242. package/cli/dist/cli.d.ts.map +0 -1
  243. package/cli/dist/cli.js +0 -87
  244. package/cli/dist/cli.js.map +0 -1
  245. package/cli/dist/components/AppContainer.d.ts +0 -16
  246. package/cli/dist/components/AppContainer.js +0 -24
  247. package/cli/dist/components/AppScreens.d.ts +0 -2
  248. package/cli/dist/components/AppScreens.js +0 -259
  249. package/cli/dist/components/ChatScreen.d.ts +0 -21
  250. package/cli/dist/components/ChatScreen.d.ts.map +0 -1
  251. package/cli/dist/components/ChatScreen.js +0 -40
  252. package/cli/dist/components/ChatScreen.js.map +0 -1
  253. package/cli/dist/components/DebugLoadingScreen.d.ts +0 -5
  254. package/cli/dist/components/DebugLoadingScreen.js +0 -31
  255. package/cli/dist/components/LoadingScreen.d.ts +0 -3
  256. package/cli/dist/components/LoadingScreen.d.ts.map +0 -1
  257. package/cli/dist/components/LoadingScreen.js +0 -17
  258. package/cli/dist/components/LoadingScreen.js.map +0 -1
  259. package/cli/dist/components/LoadingScreenDebug.d.ts +0 -5
  260. package/cli/dist/components/LoadingScreenDebug.js +0 -27
  261. package/cli/dist/components/MCPConfigScreen.d.ts +0 -28
  262. package/cli/dist/components/MCPConfigScreen.d.ts.map +0 -1
  263. package/cli/dist/components/MCPConfigScreen.js +0 -186
  264. package/cli/dist/components/MCPConfigScreen.js.map +0 -1
  265. package/cli/dist/components/ScreenRouter.d.ts +0 -13
  266. package/cli/dist/components/ScreenRouter.d.ts.map +0 -1
  267. package/cli/dist/components/ScreenRouter.js +0 -23
  268. package/cli/dist/components/ScreenRouter.js.map +0 -1
  269. package/cli/dist/components/SetupScreen.d.ts +0 -16
  270. package/cli/dist/components/SetupScreen.d.ts.map +0 -1
  271. package/cli/dist/components/SetupScreen.js +0 -67
  272. package/cli/dist/components/SetupScreen.js.map +0 -1
  273. package/cli/dist/components/SingleLoadingScreen.d.ts +0 -5
  274. package/cli/dist/components/SingleLoadingScreen.js +0 -27
  275. package/cli/dist/components/StatusBadge.d.ts +0 -10
  276. package/cli/dist/components/StatusBadge.d.ts.map +0 -1
  277. package/cli/dist/components/StatusBadge.js +0 -24
  278. package/cli/dist/components/StatusBadge.js.map +0 -1
  279. package/cli/dist/components/TerminalWindow.d.ts +0 -9
  280. package/cli/dist/components/TerminalWindow.d.ts.map +0 -1
  281. package/cli/dist/components/TerminalWindow.js +0 -19
  282. package/cli/dist/components/TerminalWindow.js.map +0 -1
  283. package/cli/dist/components/WelcomeScreen.d.ts +0 -12
  284. package/cli/dist/components/WelcomeScreen.d.ts.map +0 -1
  285. package/cli/dist/components/WelcomeScreen.js +0 -47
  286. package/cli/dist/components/WelcomeScreen.js.map +0 -1
  287. package/cli/dist/context/AppContext.d.ts +0 -68
  288. package/cli/dist/context/AppContext.js +0 -363
  289. package/cli/dist/headless-runner.d.ts +0 -17
  290. package/cli/dist/headless-runner.d.ts.map +0 -1
  291. package/cli/dist/headless-runner.js +0 -128
  292. package/cli/dist/headless-runner.js.map +0 -1
  293. package/cli/dist/hooks/useInitializeAgent.d.ts +0 -19
  294. package/cli/dist/hooks/useInitializeAgent.d.ts.map +0 -1
  295. package/cli/dist/hooks/useInitializeAgent.js +0 -29
  296. package/cli/dist/hooks/useInitializeAgent.js.map +0 -1
  297. package/cli/dist/hooks/useStableState.d.ts +0 -38
  298. package/cli/dist/hooks/useStableState.d.ts.map +0 -1
  299. package/cli/dist/hooks/useStableState.js +0 -69
  300. package/cli/dist/hooks/useStableState.js.map +0 -1
  301. package/cli/dist/managers/AgentManager.d.ts +0 -58
  302. package/cli/dist/managers/AgentManager.d.ts.map +0 -1
  303. package/cli/dist/managers/AgentManager.js +0 -121
  304. package/cli/dist/managers/AgentManager.js.map +0 -1
  305. package/cli/dist/managers/ConfigManager.d.ts +0 -54
  306. package/cli/dist/managers/ConfigManager.d.ts.map +0 -1
  307. package/cli/dist/managers/ConfigManager.js +0 -188
  308. package/cli/dist/managers/ConfigManager.js.map +0 -1
  309. package/cli/dist/types.d.ts +0 -52
  310. package/cli/dist/types.d.ts.map +0 -1
  311. package/cli/dist/types.js +0 -34
  312. package/cli/dist/types.js.map +0 -1
@@ -1,104 +1,267 @@
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."
15
- }
16
- }),
1
+ import { Logger } from "@hashgraphonline/standards-sdk";
2
+ class FieldGuidanceRegistry {
3
+ constructor() {
4
+ this.configurations = [];
5
+ this.providers = [];
6
+ this.registerOrderCounter = 0;
7
+ this.logger = new Logger({ module: "FieldGuidanceRegistry" });
8
+ }
17
9
  /**
18
- * GitHub server for repository operations
10
+ * Register field guidance for a specific tool
19
11
  */
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
- }),
12
+ registerToolConfiguration(config) {
13
+ this.configurations.push(config);
14
+ }
28
15
  /**
29
- * Slack server for messaging operations
16
+ * Register a provider for dynamic field/global guidance
30
17
  */
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
- }),
18
+ registerToolProvider(toolPattern, provider, options) {
19
+ const id = options?.id ?? `provider-${this.providers.length + 1}`;
20
+ const priority = options?.priority ?? 0;
21
+ if (this.providers.some((p) => p.id === id)) {
22
+ this.logger.error("Duplicate provider id", { id });
23
+ throw new Error("DUPLICATE_PROVIDER_ID");
24
+ }
25
+ this.providers.push({
26
+ id,
27
+ priority,
28
+ pattern: toolPattern,
29
+ provider,
30
+ order: this.registerOrderCounter++
31
+ });
32
+ return id;
33
+ }
34
+ /** Unregister a provider by id */
35
+ unregisterProvider(id) {
36
+ this.providers = this.providers.filter((p) => p.id !== id);
37
+ }
38
+ /** List registered providers */
39
+ listProviders() {
40
+ return this.providers.map(({ id, priority, pattern }) => ({
41
+ id,
42
+ priority,
43
+ pattern
44
+ }));
45
+ }
39
46
  /**
40
- * Google Drive server for document operations
47
+ * Get field guidance for a specific tool and field
41
48
  */
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
- }),
49
+ getFieldGuidance(toolName, fieldName) {
50
+ if (process.env.CA_FORM_GUIDANCE_ENABLED === "false") {
51
+ return null;
52
+ }
53
+ for (const config of this.configurations) {
54
+ const matches = typeof config.toolPattern === "string" ? toolName.toLowerCase().includes(config.toolPattern.toLowerCase()) : config.toolPattern.test(toolName);
55
+ if (matches && config.fields[fieldName]) {
56
+ const staticGuidance = config.fields[fieldName];
57
+ const providers2 = this.pickMatchingProviders(toolName);
58
+ if (providers2.length === 0) return staticGuidance;
59
+ let merged = { ...staticGuidance };
60
+ for (const p of [...providers2].reverse()) {
61
+ const fromProvider = this.safeGetFieldGuidance(
62
+ p,
63
+ fieldName,
64
+ toolName
65
+ );
66
+ if (fromProvider) {
67
+ merged = this.mergeGuidance(merged, fromProvider);
68
+ }
69
+ }
70
+ return merged;
71
+ }
72
+ }
73
+ const providers = this.pickMatchingProviders(toolName);
74
+ if (providers.length > 0) {
75
+ let merged = {};
76
+ for (const p of [...providers].reverse()) {
77
+ const g = this.safeGetFieldGuidance(p, fieldName, toolName);
78
+ if (g) merged = this.mergeGuidance(merged, g);
79
+ }
80
+ return Object.keys(merged).length > 0 ? merged : null;
81
+ }
82
+ return null;
83
+ }
50
84
  /**
51
- * PostgreSQL server for database operations
85
+ * Get global guidance for a tool
52
86
  */
53
- postgres: (connectionString) => ({
54
- name: "postgres",
55
- command: "npx",
56
- args: ["-y", "@modelcontextprotocol/server-postgres", connectionString],
57
- transport: "stdio",
58
- autoConnect: true
59
- }),
87
+ getGlobalGuidance(toolName) {
88
+ if (process.env.CA_FORM_GUIDANCE_ENABLED === "false") {
89
+ return null;
90
+ }
91
+ for (const config of this.configurations) {
92
+ const matches = typeof config.toolPattern === "string" ? toolName.toLowerCase().includes(config.toolPattern.toLowerCase()) : config.toolPattern.test(toolName);
93
+ if (matches && config.globalGuidance) {
94
+ const base = config.globalGuidance;
95
+ const providers2 = this.pickMatchingProviders(toolName);
96
+ if (providers2.length === 0) return base;
97
+ let mergedWarnings = base.warnings;
98
+ let mergedQuality = base.qualityStandards;
99
+ for (const p of [...providers2].reverse()) {
100
+ const fromProvider = this.safeGetGlobalGuidance(p, toolName);
101
+ if (fromProvider) {
102
+ mergedWarnings = fromProvider.warnings ?? mergedWarnings;
103
+ mergedQuality = fromProvider.qualityStandards ?? mergedQuality;
104
+ }
105
+ }
106
+ const result = {};
107
+ if (mergedWarnings !== void 0) result.warnings = mergedWarnings;
108
+ if (mergedQuality !== void 0)
109
+ result.qualityStandards = mergedQuality;
110
+ return result;
111
+ }
112
+ }
113
+ const providers = this.pickMatchingProviders(toolName);
114
+ if (providers.length > 0) {
115
+ let mergedWarnings;
116
+ let mergedQuality;
117
+ for (const p of [...providers].reverse()) {
118
+ const g = this.safeGetGlobalGuidance(p, toolName);
119
+ if (g) {
120
+ mergedWarnings = g.warnings ?? mergedWarnings;
121
+ mergedQuality = g.qualityStandards ?? mergedQuality;
122
+ }
123
+ }
124
+ const result = {};
125
+ if (mergedWarnings !== void 0) result.warnings = mergedWarnings;
126
+ if (mergedQuality !== void 0) result.qualityStandards = mergedQuality;
127
+ return Object.keys(result).length > 0 ? result : null;
128
+ }
129
+ return null;
130
+ }
60
131
  /**
61
- * SQLite server for database operations
132
+ * Validate field value against guidance rules
62
133
  */
63
- sqlite: (dbPath) => ({
64
- name: "sqlite",
65
- command: "npx",
66
- args: ["-y", "@modelcontextprotocol/server-sqlite", dbPath],
67
- transport: "stdio",
68
- autoConnect: true
69
- }),
134
+ validateFieldValue(toolName, fieldName, value) {
135
+ const guidance = this.getFieldGuidance(toolName, fieldName);
136
+ const warnings = [];
137
+ const errors = [];
138
+ if (!guidance || typeof value !== "string") {
139
+ return { isValid: true, warnings, errors };
140
+ }
141
+ if (guidance.warnings) {
142
+ for (const warning of guidance.warnings) {
143
+ if (warning.pattern.test(value)) {
144
+ warnings.push(warning.message);
145
+ }
146
+ }
147
+ }
148
+ if (guidance.validationRules) {
149
+ const { rejectPatterns, qualityChecks } = guidance.validationRules;
150
+ if (rejectPatterns) {
151
+ for (const reject of rejectPatterns) {
152
+ if (reject.pattern.test(value)) {
153
+ errors.push(`Rejected: ${reject.reason}`);
154
+ }
155
+ }
156
+ }
157
+ if (qualityChecks) {
158
+ if (qualityChecks.forbidTechnicalTerms) {
159
+ const lowerValue = value.toLowerCase();
160
+ for (const term of qualityChecks.forbidTechnicalTerms) {
161
+ if (lowerValue.includes(term.toLowerCase())) {
162
+ errors.push(
163
+ `Avoid technical terms like "${term}" in NFT metadata`
164
+ );
165
+ }
166
+ }
167
+ }
168
+ if (qualityChecks.requireSpecificTerms) {
169
+ const lowerValue = value.toLowerCase();
170
+ const hasRequired = qualityChecks.requireSpecificTerms.some(
171
+ (term) => lowerValue.includes(term.toLowerCase())
172
+ );
173
+ if (!hasRequired) {
174
+ warnings.push(
175
+ `Consider including terms like: ${qualityChecks.requireSpecificTerms.join(
176
+ ", "
177
+ )}`
178
+ );
179
+ }
180
+ }
181
+ if (qualityChecks.minNonTechnicalWords) {
182
+ const words = value.split(/\s+/).filter((word) => word.length > 2);
183
+ if (words.length < qualityChecks.minNonTechnicalWords) {
184
+ warnings.push(
185
+ `Consider providing more descriptive content (at least ${qualityChecks.minNonTechnicalWords} meaningful words)`
186
+ );
187
+ }
188
+ }
189
+ }
190
+ }
191
+ return {
192
+ isValid: errors.length === 0,
193
+ warnings,
194
+ errors
195
+ };
196
+ }
70
197
  /**
71
- * Custom server configuration
198
+ * Clear all configurations (useful for testing)
72
199
  */
73
- custom: (config) => config
74
- };
75
- function validateServerConfig(config) {
76
- const errors = [];
77
- if (!config.name) {
78
- errors.push("Server name is required");
200
+ clear() {
201
+ this.configurations = [];
202
+ this.providers = [];
203
+ this.registerOrderCounter = 0;
204
+ }
205
+ /** Choose matching provider by priority then last-in wins */
206
+ pickMatchingProviders(toolName) {
207
+ const matches = this.providers.filter(
208
+ (p) => typeof p.pattern === "string" ? toolName.toLowerCase().includes(p.pattern.toLowerCase()) : p.pattern.test(toolName)
209
+ );
210
+ const sorted = matches.sort((a, b) => {
211
+ if (b.priority !== a.priority) return b.priority - a.priority;
212
+ return b.order - a.order;
213
+ });
214
+ return sorted.map((m) => ({
215
+ id: m.id,
216
+ provider: m.provider,
217
+ priority: m.priority,
218
+ order: m.order
219
+ }));
79
220
  }
80
- if (!config.command) {
81
- errors.push("Server command is required");
221
+ safeGetFieldGuidance(winner, fieldName, toolName) {
222
+ try {
223
+ return winner.provider.getFieldGuidance(fieldName, { toolName }) ?? null;
224
+ } catch (err) {
225
+ this.logger.warn("Provider getFieldGuidance failed", {
226
+ id: winner.id,
227
+ err
228
+ });
229
+ return null;
230
+ }
82
231
  }
83
- if (!config.args || !Array.isArray(config.args)) {
84
- errors.push("Server args must be an array");
232
+ safeGetGlobalGuidance(winner, toolName) {
233
+ try {
234
+ return winner.provider.getGlobalGuidance?.(toolName) ?? null;
235
+ } catch (err) {
236
+ this.logger.warn("Provider getGlobalGuidance failed", {
237
+ id: winner.id,
238
+ err
239
+ });
240
+ return null;
241
+ }
85
242
  }
86
- if (config.transport && !["stdio", "http", "websocket"].includes(config.transport)) {
87
- errors.push("Invalid transport type. Must be stdio, http, or websocket");
243
+ mergeGuidance(base, over) {
244
+ const out = {};
245
+ const suggestions = over.suggestions ?? base.suggestions;
246
+ if (suggestions !== void 0) out.suggestions = suggestions;
247
+ const predefinedOptions = over.predefinedOptions ?? base.predefinedOptions;
248
+ if (predefinedOptions !== void 0)
249
+ out.predefinedOptions = predefinedOptions;
250
+ const warnings = over.warnings ?? base.warnings;
251
+ if (warnings !== void 0) out.warnings = warnings;
252
+ const validationRules = over.validationRules ?? base.validationRules;
253
+ if (validationRules !== void 0) out.validationRules = validationRules;
254
+ const fieldTypeOverride = over.fieldTypeOverride ?? base.fieldTypeOverride;
255
+ if (fieldTypeOverride !== void 0)
256
+ out.fieldTypeOverride = fieldTypeOverride;
257
+ const contextualHelpText = over.contextualHelpText ?? base.contextualHelpText;
258
+ if (contextualHelpText !== void 0)
259
+ out.contextualHelpText = contextualHelpText;
260
+ return out;
88
261
  }
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
262
  }
263
+ const fieldGuidanceRegistry = new FieldGuidanceRegistry();
99
264
  export {
100
- MCPServers,
101
- createMCPConfig,
102
- validateServerConfig
265
+ fieldGuidanceRegistry
103
266
  };
104
267
  //# sourceMappingURL=index14.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index14.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":"index14.js","sources":["../../src/forms/field-guidance-registry.ts"],"sourcesContent":["import type { FormFieldType, FieldOption } from './types';\nimport { Logger } from '@hashgraphonline/standards-sdk';\n\n/**\n * Field guidance configuration for providing contextual help and suggestions\n */\nexport interface FieldGuidance {\n /**\n * Suggestions to show as placeholder or examples\n */\n suggestions?: string[];\n\n /**\n * Predefined options for select fields\n */\n predefinedOptions?: FieldOption[];\n\n /**\n * Warning messages for specific patterns to avoid\n */\n warnings?: {\n pattern: RegExp;\n message: string;\n }[];\n\n /**\n * Validation rules specific to the field context\n */\n validationRules?: {\n /**\n * Patterns that should be rejected\n */\n rejectPatterns?: {\n pattern: RegExp;\n reason: string;\n }[];\n\n /**\n * Minimum quality requirements\n */\n qualityChecks?: {\n minNonTechnicalWords?: number;\n requireSpecificTerms?: string[];\n forbidTechnicalTerms?: string[];\n };\n };\n\n /**\n * Field type override for specific contexts\n */\n fieldTypeOverride?: FormFieldType;\n\n /**\n * Help text specific to the tool context\n */\n contextualHelpText?: string;\n}\n\n/**\n * Tool-specific field configurations\n */\nexport interface ToolFieldConfiguration {\n /**\n * Tool name or pattern to match\n */\n toolPattern: string | RegExp;\n\n /**\n * Field-specific guidance\n */\n fields: Record<string, FieldGuidance>;\n\n /**\n * Global guidance for all fields in this tool\n */\n globalGuidance?: {\n /**\n * General warnings to show\n */\n warnings?: string[];\n\n /**\n * Quality standards for this tool\n */\n qualityStandards?: string[];\n };\n}\n\n/**\n * Registry for field guidance configurations\n */\nclass FieldGuidanceRegistry {\n private configurations: ToolFieldConfiguration[] = [];\n private providers: Array<{\n id: string;\n priority: number;\n pattern: string | RegExp;\n provider: FieldGuidanceProvider;\n order: number;\n }> = [];\n private registerOrderCounter = 0;\n private logger: Logger;\n\n constructor() {\n this.logger = new Logger({ module: 'FieldGuidanceRegistry' });\n }\n\n /**\n * Register field guidance for a specific tool\n */\n registerToolConfiguration(config: ToolFieldConfiguration): void {\n this.configurations.push(config);\n }\n\n /**\n * Register a provider for dynamic field/global guidance\n */\n registerToolProvider(\n toolPattern: string | RegExp,\n provider: FieldGuidanceProvider,\n options?: { id?: string; priority?: number }\n ): string {\n const id = options?.id ?? `provider-${this.providers.length + 1}`;\n const priority = options?.priority ?? 0;\n if (this.providers.some((p) => p.id === id)) {\n this.logger.error('Duplicate provider id', { id });\n throw new Error('DUPLICATE_PROVIDER_ID');\n }\n this.providers.push({\n id,\n priority,\n pattern: toolPattern,\n provider,\n order: this.registerOrderCounter++,\n });\n return id;\n }\n\n /** Unregister a provider by id */\n unregisterProvider(id: string): void {\n this.providers = this.providers.filter((p) => p.id !== id);\n }\n\n /** List registered providers */\n listProviders(): Array<{\n id: string;\n priority: number;\n pattern: string | RegExp;\n }> {\n return this.providers.map(({ id, priority, pattern }) => ({\n id,\n priority,\n pattern,\n }));\n }\n\n /**\n * Get field guidance for a specific tool and field\n */\n getFieldGuidance(toolName: string, fieldName: string): FieldGuidance | null {\n if (process.env.CA_FORM_GUIDANCE_ENABLED === 'false') {\n return null;\n }\n for (const config of this.configurations) {\n const matches =\n typeof config.toolPattern === 'string'\n ? toolName.toLowerCase().includes(config.toolPattern.toLowerCase())\n : config.toolPattern.test(toolName);\n\n if (matches && config.fields[fieldName]) {\n const staticGuidance = config.fields[fieldName];\n const providers = this.pickMatchingProviders(toolName);\n if (providers.length === 0) return staticGuidance;\n let merged: FieldGuidance = { ...staticGuidance };\n for (const p of [...providers].reverse()) {\n const fromProvider = this.safeGetFieldGuidance(\n p,\n fieldName,\n toolName\n );\n if (fromProvider) {\n merged = this.mergeGuidance(merged, fromProvider);\n }\n }\n return merged;\n }\n }\n const providers = this.pickMatchingProviders(toolName);\n if (providers.length > 0) {\n let merged: FieldGuidance = {};\n for (const p of [...providers].reverse()) {\n const g = this.safeGetFieldGuidance(p, fieldName, toolName);\n if (g) merged = this.mergeGuidance(merged, g);\n }\n return Object.keys(merged).length > 0 ? merged : null;\n }\n return null;\n }\n\n /**\n * Get global guidance for a tool\n */\n getGlobalGuidance(\n toolName: string\n ): ToolFieldConfiguration['globalGuidance'] | null {\n if (process.env.CA_FORM_GUIDANCE_ENABLED === 'false') {\n return null;\n }\n for (const config of this.configurations) {\n const matches =\n typeof config.toolPattern === 'string'\n ? toolName.toLowerCase().includes(config.toolPattern.toLowerCase())\n : config.toolPattern.test(toolName);\n\n if (matches && config.globalGuidance) {\n const base = config.globalGuidance;\n const providers = this.pickMatchingProviders(toolName);\n if (providers.length === 0) return base;\n let mergedWarnings: string[] | undefined = base.warnings;\n let mergedQuality: string[] | undefined = base.qualityStandards;\n for (const p of [...providers].reverse()) {\n const fromProvider = this.safeGetGlobalGuidance(p, toolName);\n if (fromProvider) {\n mergedWarnings = fromProvider.warnings ?? mergedWarnings;\n mergedQuality = fromProvider.qualityStandards ?? mergedQuality;\n }\n }\n const result: NonNullable<ToolFieldConfiguration['globalGuidance']> =\n {};\n if (mergedWarnings !== undefined) result.warnings = mergedWarnings;\n if (mergedQuality !== undefined)\n result.qualityStandards = mergedQuality;\n return result;\n }\n }\n const providers = this.pickMatchingProviders(toolName);\n if (providers.length > 0) {\n let mergedWarnings: string[] | undefined;\n let mergedQuality: string[] | undefined;\n for (const p of [...providers].reverse()) {\n const g = this.safeGetGlobalGuidance(p, toolName);\n if (g) {\n mergedWarnings = g.warnings ?? mergedWarnings;\n mergedQuality = g.qualityStandards ?? mergedQuality;\n }\n }\n const result: NonNullable<ToolFieldConfiguration['globalGuidance']> = {};\n if (mergedWarnings !== undefined) result.warnings = mergedWarnings;\n if (mergedQuality !== undefined) result.qualityStandards = mergedQuality;\n return Object.keys(result).length > 0 ? result : null;\n }\n return null;\n }\n\n /**\n * Validate field value against guidance rules\n */\n validateFieldValue(\n toolName: string,\n fieldName: string,\n value: unknown\n ): {\n isValid: boolean;\n warnings: string[];\n errors: string[];\n } {\n const guidance = this.getFieldGuidance(toolName, fieldName);\n const warnings: string[] = [];\n const errors: string[] = [];\n\n if (!guidance || typeof value !== 'string') {\n return { isValid: true, warnings, errors };\n }\n\n if (guidance.warnings) {\n for (const warning of guidance.warnings) {\n if (warning.pattern.test(value)) {\n warnings.push(warning.message);\n }\n }\n }\n\n if (guidance.validationRules) {\n const { rejectPatterns, qualityChecks } = guidance.validationRules;\n\n if (rejectPatterns) {\n for (const reject of rejectPatterns) {\n if (reject.pattern.test(value)) {\n errors.push(`Rejected: ${reject.reason}`);\n }\n }\n }\n\n if (qualityChecks) {\n if (qualityChecks.forbidTechnicalTerms) {\n const lowerValue = value.toLowerCase();\n for (const term of qualityChecks.forbidTechnicalTerms) {\n if (lowerValue.includes(term.toLowerCase())) {\n errors.push(\n `Avoid technical terms like \"${term}\" in NFT metadata`\n );\n }\n }\n }\n\n if (qualityChecks.requireSpecificTerms) {\n const lowerValue = value.toLowerCase();\n const hasRequired = qualityChecks.requireSpecificTerms.some((term) =>\n lowerValue.includes(term.toLowerCase())\n );\n if (!hasRequired) {\n warnings.push(\n `Consider including terms like: ${qualityChecks.requireSpecificTerms.join(\n ', '\n )}`\n );\n }\n }\n\n if (qualityChecks.minNonTechnicalWords) {\n const words = value.split(/\\s+/).filter((word) => word.length > 2);\n if (words.length < qualityChecks.minNonTechnicalWords) {\n warnings.push(\n `Consider providing more descriptive content (at least ${qualityChecks.minNonTechnicalWords} meaningful words)`\n );\n }\n }\n }\n }\n\n return {\n isValid: errors.length === 0,\n warnings,\n errors,\n };\n }\n\n /**\n * Clear all configurations (useful for testing)\n */\n clear(): void {\n this.configurations = [];\n this.providers = [];\n this.registerOrderCounter = 0;\n }\n\n /** Choose matching provider by priority then last-in wins */\n private pickMatchingProviders(toolName: string): Array<{\n id: string;\n provider: FieldGuidanceProvider;\n priority: number;\n order: number;\n }> {\n const matches = this.providers.filter((p) =>\n typeof p.pattern === 'string'\n ? toolName.toLowerCase().includes((p.pattern as string).toLowerCase())\n : (p.pattern as RegExp).test(toolName)\n );\n const sorted = matches.sort((a, b) => {\n if (b.priority !== a.priority) return b.priority - a.priority;\n return b.order - a.order; // last-in wins when equal priority\n });\n return sorted.map((m) => ({\n id: m.id,\n provider: m.provider,\n priority: m.priority,\n order: m.order,\n }));\n }\n\n private safeGetFieldGuidance(\n winner: { id: string; provider: FieldGuidanceProvider },\n fieldName: string,\n toolName: string\n ): FieldGuidance | null {\n try {\n return winner.provider.getFieldGuidance(fieldName, { toolName }) ?? null;\n } catch (err) {\n this.logger.warn('Provider getFieldGuidance failed', {\n id: winner.id,\n err,\n });\n return null;\n }\n }\n\n private safeGetGlobalGuidance(\n winner: { id: string; provider: FieldGuidanceProvider },\n toolName: string\n ): ToolFieldConfiguration['globalGuidance'] | null {\n try {\n return winner.provider.getGlobalGuidance?.(toolName) ?? null;\n } catch (err) {\n this.logger.warn('Provider getGlobalGuidance failed', {\n id: winner.id,\n err,\n });\n return null;\n }\n }\n\n private mergeGuidance(\n base: FieldGuidance,\n over: FieldGuidance\n ): FieldGuidance {\n const out: FieldGuidance = {};\n const suggestions = over.suggestions ?? base.suggestions;\n if (suggestions !== undefined) out.suggestions = suggestions;\n const predefinedOptions = over.predefinedOptions ?? base.predefinedOptions;\n if (predefinedOptions !== undefined)\n out.predefinedOptions = predefinedOptions;\n const warnings = over.warnings ?? base.warnings;\n if (warnings !== undefined) out.warnings = warnings;\n const validationRules = over.validationRules ?? base.validationRules;\n if (validationRules !== undefined) out.validationRules = validationRules;\n const fieldTypeOverride = over.fieldTypeOverride ?? base.fieldTypeOverride;\n if (fieldTypeOverride !== undefined)\n out.fieldTypeOverride = fieldTypeOverride;\n const contextualHelpText =\n over.contextualHelpText ?? base.contextualHelpText;\n if (contextualHelpText !== undefined)\n out.contextualHelpText = contextualHelpText;\n return out;\n }\n}\n\nexport const fieldGuidanceRegistry = new FieldGuidanceRegistry();\n\n/**\n * Provider interface (optional, for dynamic guidance)\n */\nexport interface FieldGuidanceProvider {\n getFieldGuidance(\n fieldName: string,\n ctx: { toolName: string }\n ): FieldGuidance | null;\n getGlobalGuidance?(\n toolName: string\n ): ToolFieldConfiguration['globalGuidance'] | null;\n}\n"],"names":["providers"],"mappings":"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"}