@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,267 +1,159 @@
1
- import { Logger } from "@hashgraphonline/standards-sdk";
2
- class FieldGuidanceRegistry {
1
+ class FieldTypeRegistry {
3
2
  constructor() {
4
- this.configurations = [];
5
- this.providers = [];
6
- this.registerOrderCounter = 0;
7
- this.logger = new Logger({ module: "FieldGuidanceRegistry" });
3
+ this.patterns = /* @__PURE__ */ new Map();
4
+ this.initializeDefaultPatterns();
8
5
  }
9
6
  /**
10
- * Register field guidance for a specific tool
7
+ * Get singleton instance
11
8
  */
12
- registerToolConfiguration(config) {
13
- this.configurations.push(config);
9
+ static getInstance() {
10
+ if (!FieldTypeRegistry.instance) {
11
+ FieldTypeRegistry.instance = new FieldTypeRegistry();
12
+ }
13
+ return FieldTypeRegistry.instance;
14
14
  }
15
15
  /**
16
- * Register a provider for dynamic field/global guidance
16
+ * Initialize default field type patterns
17
17
  */
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++
18
+ initializeDefaultPatterns() {
19
+ this.register("numeric-supply-exact", {
20
+ pattern: ["maxSupply", "minSupply", "totalSupply"],
21
+ type: "number",
22
+ priority: 15
23
+ });
24
+ this.register("numeric-supply", {
25
+ pattern: /supply$/i,
26
+ type: "number",
27
+ priority: 10
28
+ });
29
+ this.register("numeric-amounts", {
30
+ pattern: /(?:amount|quantity|count|total|sum|value)$/i,
31
+ type: "number",
32
+ priority: 8
33
+ });
34
+ this.register("numeric-time", {
35
+ pattern: /(?:period|duration|time|timeout|delay|interval)$/i,
36
+ type: "number",
37
+ priority: 8
38
+ });
39
+ this.register("numeric-limits", {
40
+ pattern: /(?:limit|max|min|threshold|size|length)$/i,
41
+ type: "number",
42
+ priority: 7
43
+ });
44
+ this.register("currency", {
45
+ pattern: /(?:price|cost|fee|payment|balance|amount)$/i,
46
+ type: "currency",
47
+ priority: 9
48
+ });
49
+ this.register("percentage", {
50
+ pattern: /(?:percent|percentage|rate|ratio)$/i,
51
+ type: "percentage",
52
+ priority: 9
53
+ });
54
+ this.register("boolean-freeze", {
55
+ pattern: ["freezeDefault", "freeze"],
56
+ type: "checkbox",
57
+ priority: 10
58
+ });
59
+ this.register("boolean-flags", {
60
+ pattern: /(?:is|has|can|should|enable|disable|active|default|allow)(?:[A-Z]|$)/,
61
+ type: "checkbox",
62
+ priority: 8
63
+ });
64
+ this.register("textarea", {
65
+ pattern: /(?:memo|description|notes|comment|message|content|body|text)$/i,
66
+ type: "textarea",
67
+ priority: 8
68
+ });
69
+ this.register("array-fees", {
70
+ pattern: ["customFees", "fees"],
71
+ type: "array",
72
+ priority: 10
73
+ });
74
+ this.register("array-general", {
75
+ pattern: /(?:list|items|array|collection)$/i,
76
+ type: "array",
77
+ priority: 7
78
+ });
79
+ this.register("object-options", {
80
+ pattern: ["metaOptions", "options"],
81
+ type: "object",
82
+ priority: 10
83
+ });
84
+ this.register("object-config", {
85
+ pattern: /(?:config|settings|configuration|metadata|data|info)$/i,
86
+ type: "object",
87
+ priority: 7
88
+ });
89
+ this.register("select-type", {
90
+ pattern: /(?:type|kind|category|status|state|mode)$/i,
91
+ type: "select",
92
+ priority: 7
31
93
  });
32
- return id;
33
- }
34
- /** Unregister a provider by id */
35
- unregisterProvider(id) {
36
- this.providers = this.providers.filter((p) => p.id !== id);
37
94
  }
38
- /** List registered providers */
39
- listProviders() {
40
- return this.providers.map(({ id, priority, pattern }) => ({
41
- id,
42
- priority,
43
- pattern
44
- }));
95
+ /**
96
+ * Register a field type pattern
97
+ */
98
+ register(key, pattern) {
99
+ this.patterns.set(key, pattern);
45
100
  }
46
101
  /**
47
- * Get field guidance for a specific tool and field
102
+ * Unregister a field type pattern
48
103
  */
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;
104
+ unregister(key) {
105
+ return this.patterns.delete(key);
83
106
  }
84
107
  /**
85
- * Get global guidance for a tool
108
+ * Detect field type based on field name
86
109
  */
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;
110
+ detectType(fieldName) {
111
+ const matches = [];
112
+ for (const pattern of this.patterns.values()) {
113
+ let isMatch = false;
114
+ if (Array.isArray(pattern.pattern)) {
115
+ isMatch = pattern.pattern.some(
116
+ (p) => fieldName === p || fieldName.toLowerCase() === p.toLowerCase()
117
+ );
118
+ } else if (pattern.pattern instanceof RegExp) {
119
+ isMatch = pattern.pattern.test(fieldName);
111
120
  }
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
- }
121
+ if (isMatch) {
122
+ matches.push({
123
+ type: pattern.type,
124
+ priority: pattern.priority ?? 5
125
+ });
123
126
  }
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;
127
+ }
128
+ if (matches.length > 0) {
129
+ matches.sort((a, b) => b.priority - a.priority);
130
+ return matches[0].type;
128
131
  }
129
132
  return null;
130
133
  }
131
134
  /**
132
- * Validate field value against guidance rules
135
+ * Get all registered patterns
133
136
  */
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
- };
137
+ getPatterns() {
138
+ return new Map(this.patterns);
196
139
  }
197
140
  /**
198
- * Clear all configurations (useful for testing)
141
+ * Clear all patterns
199
142
  */
200
143
  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
- }));
220
- }
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
- }
231
- }
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
- }
144
+ this.patterns.clear();
242
145
  }
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;
146
+ /**
147
+ * Reset to default patterns
148
+ */
149
+ reset() {
150
+ this.clear();
151
+ this.initializeDefaultPatterns();
261
152
  }
262
153
  }
263
- const fieldGuidanceRegistry = new FieldGuidanceRegistry();
154
+ const fieldTypeRegistry = FieldTypeRegistry.getInstance();
264
155
  export {
265
- fieldGuidanceRegistry
156
+ FieldTypeRegistry,
157
+ fieldTypeRegistry
266
158
  };
267
159
  //# sourceMappingURL=index13.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index13.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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"}
1
+ {"version":3,"file":"index13.js","sources":["../../src/forms/field-type-registry.ts"],"sourcesContent":["/**\n * Registry for field type detection patterns\n * @module FieldTypeRegistry\n */\n\nimport type { FormFieldType } from './types';\n\n/**\n * Pattern-based field type detection rule\n */\nexport interface FieldTypePattern {\n pattern: RegExp | string[];\n type: FormFieldType;\n priority?: number;\n}\n\n/**\n * Registry for managing field type detection patterns\n */\nexport class FieldTypeRegistry {\n private static instance: FieldTypeRegistry;\n private patterns: Map<string, FieldTypePattern> = new Map();\n\n private constructor() {\n this.initializeDefaultPatterns();\n }\n\n /**\n * Get singleton instance\n */\n static getInstance(): FieldTypeRegistry {\n if (!FieldTypeRegistry.instance) {\n FieldTypeRegistry.instance = new FieldTypeRegistry();\n }\n return FieldTypeRegistry.instance;\n }\n\n /**\n * Initialize default field type patterns\n */\n private initializeDefaultPatterns(): void {\n this.register('numeric-supply-exact', {\n pattern: ['maxSupply', 'minSupply', 'totalSupply'],\n type: 'number',\n priority: 15,\n });\n\n this.register('numeric-supply', {\n pattern: /supply$/i,\n type: 'number',\n priority: 10,\n });\n\n this.register('numeric-amounts', {\n pattern: /(?:amount|quantity|count|total|sum|value)$/i,\n type: 'number',\n priority: 8,\n });\n\n this.register('numeric-time', {\n pattern: /(?:period|duration|time|timeout|delay|interval)$/i,\n type: 'number',\n priority: 8,\n });\n\n this.register('numeric-limits', {\n pattern: /(?:limit|max|min|threshold|size|length)$/i,\n type: 'number',\n priority: 7,\n });\n\n this.register('currency', {\n pattern: /(?:price|cost|fee|payment|balance|amount)$/i,\n type: 'currency',\n priority: 9,\n });\n\n this.register('percentage', {\n pattern: /(?:percent|percentage|rate|ratio)$/i,\n type: 'percentage',\n priority: 9,\n });\n\n this.register('boolean-freeze', {\n pattern: ['freezeDefault', 'freeze'],\n type: 'checkbox',\n priority: 10,\n });\n\n this.register('boolean-flags', {\n pattern:\n /(?:is|has|can|should|enable|disable|active|default|allow)(?:[A-Z]|$)/,\n type: 'checkbox',\n priority: 8,\n });\n\n this.register('textarea', {\n pattern: /(?:memo|description|notes|comment|message|content|body|text)$/i,\n type: 'textarea',\n priority: 8,\n });\n\n this.register('array-fees', {\n pattern: ['customFees', 'fees'],\n type: 'array',\n priority: 10,\n });\n\n this.register('array-general', {\n pattern: /(?:list|items|array|collection)$/i,\n type: 'array',\n priority: 7,\n });\n\n this.register('object-options', {\n pattern: ['metaOptions', 'options'],\n type: 'object',\n priority: 10,\n });\n\n this.register('object-config', {\n pattern: /(?:config|settings|configuration|metadata|data|info)$/i,\n type: 'object',\n priority: 7,\n });\n\n this.register('select-type', {\n pattern: /(?:type|kind|category|status|state|mode)$/i,\n type: 'select',\n priority: 7,\n });\n }\n\n /**\n * Register a field type pattern\n */\n register(key: string, pattern: FieldTypePattern): void {\n this.patterns.set(key, pattern);\n }\n\n /**\n * Unregister a field type pattern\n */\n unregister(key: string): boolean {\n return this.patterns.delete(key);\n }\n\n /**\n * Detect field type based on field name\n */\n detectType(fieldName: string): FormFieldType | null {\n const matches: Array<{ type: FormFieldType; priority: number }> = [];\n\n for (const pattern of this.patterns.values()) {\n let isMatch = false;\n\n if (Array.isArray(pattern.pattern)) {\n isMatch = pattern.pattern.some(\n (p) => fieldName === p || fieldName.toLowerCase() === p.toLowerCase()\n );\n } else if (pattern.pattern instanceof RegExp) {\n isMatch = pattern.pattern.test(fieldName);\n }\n\n if (isMatch) {\n matches.push({\n type: pattern.type,\n priority: pattern.priority ?? 5,\n });\n }\n }\n\n if (matches.length > 0) {\n matches.sort((a, b) => b.priority - a.priority);\n return matches[0].type;\n }\n\n return null;\n }\n\n /**\n * Get all registered patterns\n */\n getPatterns(): Map<string, FieldTypePattern> {\n return new Map(this.patterns);\n }\n\n /**\n * Clear all patterns\n */\n clear(): void {\n this.patterns.clear();\n }\n\n /**\n * Reset to default patterns\n */\n reset(): void {\n this.clear();\n this.initializeDefaultPatterns();\n }\n}\n\nexport const fieldTypeRegistry = FieldTypeRegistry.getInstance();\n"],"names":[],"mappings":"AAmBO,MAAM,kBAAkB;AAAA,EAIrB,cAAc;AAFtB,SAAQ,+BAA8C,IAAA;AAGpD,SAAK,0BAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,cAAiC;AACtC,QAAI,CAAC,kBAAkB,UAAU;AAC/B,wBAAkB,WAAW,IAAI,kBAAA;AAAA,IACnC;AACA,WAAO,kBAAkB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKQ,4BAAkC;AACxC,SAAK,SAAS,wBAAwB;AAAA,MACpC,SAAS,CAAC,aAAa,aAAa,aAAa;AAAA,MACjD,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AAED,SAAK,SAAS,kBAAkB;AAAA,MAC9B,SAAS;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AAED,SAAK,SAAS,mBAAmB;AAAA,MAC/B,SAAS;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AAED,SAAK,SAAS,gBAAgB;AAAA,MAC5B,SAAS;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AAED,SAAK,SAAS,kBAAkB;AAAA,MAC9B,SAAS;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AAED,SAAK,SAAS,YAAY;AAAA,MACxB,SAAS;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AAED,SAAK,SAAS,cAAc;AAAA,MAC1B,SAAS;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AAED,SAAK,SAAS,kBAAkB;AAAA,MAC9B,SAAS,CAAC,iBAAiB,QAAQ;AAAA,MACnC,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AAED,SAAK,SAAS,iBAAiB;AAAA,MAC7B,SACE;AAAA,MACF,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AAED,SAAK,SAAS,YAAY;AAAA,MACxB,SAAS;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AAED,SAAK,SAAS,cAAc;AAAA,MAC1B,SAAS,CAAC,cAAc,MAAM;AAAA,MAC9B,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AAED,SAAK,SAAS,iBAAiB;AAAA,MAC7B,SAAS;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AAED,SAAK,SAAS,kBAAkB;AAAA,MAC9B,SAAS,CAAC,eAAe,SAAS;AAAA,MAClC,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AAED,SAAK,SAAS,iBAAiB;AAAA,MAC7B,SAAS;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AAED,SAAK,SAAS,eAAe;AAAA,MAC3B,SAAS;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,KAAa,SAAiC;AACrD,SAAK,SAAS,IAAI,KAAK,OAAO;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,KAAsB;AAC/B,WAAO,KAAK,SAAS,OAAO,GAAG;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,WAAyC;AAClD,UAAM,UAA4D,CAAA;AAElE,eAAW,WAAW,KAAK,SAAS,OAAA,GAAU;AAC5C,UAAI,UAAU;AAEd,UAAI,MAAM,QAAQ,QAAQ,OAAO,GAAG;AAClC,kBAAU,QAAQ,QAAQ;AAAA,UACxB,CAAC,MAAM,cAAc,KAAK,UAAU,YAAA,MAAkB,EAAE,YAAA;AAAA,QAAY;AAAA,MAExE,WAAW,QAAQ,mBAAmB,QAAQ;AAC5C,kBAAU,QAAQ,QAAQ,KAAK,SAAS;AAAA,MAC1C;AAEA,UAAI,SAAS;AACX,gBAAQ,KAAK;AAAA,UACX,MAAM,QAAQ;AAAA,UACd,UAAU,QAAQ,YAAY;AAAA,QAAA,CAC/B;AAAA,MACH;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,GAAG;AACtB,cAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ;AAC9C,aAAO,QAAQ,CAAC,EAAE;AAAA,IACpB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,cAA6C;AAC3C,WAAO,IAAI,IAAI,KAAK,QAAQ;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,SAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,MAAA;AACL,SAAK,0BAAA;AAAA,EACP;AACF;AAEO,MAAM,oBAAoB,kBAAkB,YAAA;"}