d365fo-mcp 1.0.0

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 (1055) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +205 -0
  3. package/dist/bridge/bridgeAdapter.d.ts +319 -0
  4. package/dist/bridge/bridgeAdapter.d.ts.map +1 -0
  5. package/dist/bridge/bridgeAdapter.js +2003 -0
  6. package/dist/bridge/bridgeAdapter.js.map +1 -0
  7. package/dist/bridge/bridgeClient.d.ts +255 -0
  8. package/dist/bridge/bridgeClient.d.ts.map +1 -0
  9. package/dist/bridge/bridgeClient.js +741 -0
  10. package/dist/bridge/bridgeClient.js.map +1 -0
  11. package/dist/bridge/bridgeTypes.d.ts +561 -0
  12. package/dist/bridge/bridgeTypes.d.ts.map +1 -0
  13. package/dist/bridge/bridgeTypes.js +6 -0
  14. package/dist/bridge/bridgeTypes.js.map +1 -0
  15. package/dist/bridge/debouncedRefresh.d.ts +16 -0
  16. package/dist/bridge/debouncedRefresh.d.ts.map +1 -0
  17. package/dist/bridge/debouncedRefresh.js +77 -0
  18. package/dist/bridge/debouncedRefresh.js.map +1 -0
  19. package/dist/bridge/index.d.ts +21 -0
  20. package/dist/bridge/index.d.ts.map +1 -0
  21. package/dist/bridge/index.js +20 -0
  22. package/dist/bridge/index.js.map +1 -0
  23. package/dist/cli/commands/config.d.ts +8 -0
  24. package/dist/cli/commands/config.d.ts.map +1 -0
  25. package/dist/cli/commands/config.js +77 -0
  26. package/dist/cli/commands/config.js.map +1 -0
  27. package/dist/cli/commands/doctor.d.ts +2 -0
  28. package/dist/cli/commands/doctor.d.ts.map +1 -0
  29. package/dist/cli/commands/doctor.js +177 -0
  30. package/dist/cli/commands/doctor.js.map +1 -0
  31. package/dist/cli/commands/indexCmd.d.ts +8 -0
  32. package/dist/cli/commands/indexCmd.d.ts.map +1 -0
  33. package/dist/cli/commands/indexCmd.js +78 -0
  34. package/dist/cli/commands/indexCmd.js.map +1 -0
  35. package/dist/cli/commands/instance.d.ts +4 -0
  36. package/dist/cli/commands/instance.d.ts.map +1 -0
  37. package/dist/cli/commands/instance.js +183 -0
  38. package/dist/cli/commands/instance.js.map +1 -0
  39. package/dist/cli/commands/setup.d.ts +4 -0
  40. package/dist/cli/commands/setup.d.ts.map +1 -0
  41. package/dist/cli/commands/setup.js +246 -0
  42. package/dist/cli/commands/setup.js.map +1 -0
  43. package/dist/cli/commands/start.d.ts +2 -0
  44. package/dist/cli/commands/start.d.ts.map +1 -0
  45. package/dist/cli/commands/start.js +49 -0
  46. package/dist/cli/commands/start.js.map +1 -0
  47. package/dist/cli/commands/update.d.ts +4 -0
  48. package/dist/cli/commands/update.d.ts.map +1 -0
  49. package/dist/cli/commands/update.js +55 -0
  50. package/dist/cli/commands/update.js.map +1 -0
  51. package/dist/cli/context.d.ts +26 -0
  52. package/dist/cli/context.d.ts.map +1 -0
  53. package/dist/cli/context.js +38 -0
  54. package/dist/cli/context.js.map +1 -0
  55. package/dist/cli/envFile.d.ts +23 -0
  56. package/dist/cli/envFile.d.ts.map +1 -0
  57. package/dist/cli/envFile.js +79 -0
  58. package/dist/cli/envFile.js.map +1 -0
  59. package/dist/cli/exec.d.ts +13 -0
  60. package/dist/cli/exec.d.ts.map +1 -0
  61. package/dist/cli/exec.js +47 -0
  62. package/dist/cli/exec.js.map +1 -0
  63. package/dist/cli/index.d.ts +3 -0
  64. package/dist/cli/index.d.ts.map +1 -0
  65. package/dist/cli/index.js +122 -0
  66. package/dist/cli/index.js.map +1 -0
  67. package/dist/cli/instances.d.ts +19 -0
  68. package/dist/cli/instances.d.ts.map +1 -0
  69. package/dist/cli/instances.js +60 -0
  70. package/dist/cli/instances.js.map +1 -0
  71. package/dist/cli/mcpJson.d.ts +15 -0
  72. package/dist/cli/mcpJson.d.ts.map +1 -0
  73. package/dist/cli/mcpJson.js +44 -0
  74. package/dist/cli/mcpJson.js.map +1 -0
  75. package/dist/cli/settingsPrompt.d.ts +20 -0
  76. package/dist/cli/settingsPrompt.d.ts.map +1 -0
  77. package/dist/cli/settingsPrompt.js +150 -0
  78. package/dist/cli/settingsPrompt.js.map +1 -0
  79. package/dist/cli/settingsStore.d.ts +47 -0
  80. package/dist/cli/settingsStore.d.ts.map +1 -0
  81. package/dist/cli/settingsStore.js +144 -0
  82. package/dist/cli/settingsStore.js.map +1 -0
  83. package/dist/cli/target.d.ts +23 -0
  84. package/dist/cli/target.d.ts.map +1 -0
  85. package/dist/cli/target.js +62 -0
  86. package/dist/cli/target.js.map +1 -0
  87. package/dist/cli/ui.d.ts +26 -0
  88. package/dist/cli/ui.d.ts.map +1 -0
  89. package/dist/cli/ui.js +48 -0
  90. package/dist/cli/ui.js.map +1 -0
  91. package/dist/cli/xppConfig.d.ts +35 -0
  92. package/dist/cli/xppConfig.d.ts.map +1 -0
  93. package/dist/cli/xppConfig.js +97 -0
  94. package/dist/cli/xppConfig.js.map +1 -0
  95. package/dist/config/configFile.d.ts +50 -0
  96. package/dist/config/configFile.d.ts.map +1 -0
  97. package/dist/config/configFile.js +152 -0
  98. package/dist/config/configFile.js.map +1 -0
  99. package/dist/config/settings.d.ts +58 -0
  100. package/dist/config/settings.d.ts.map +1 -0
  101. package/dist/config/settings.js +641 -0
  102. package/dist/config/settings.js.map +1 -0
  103. package/dist/database/download.d.ts +27 -0
  104. package/dist/database/download.d.ts.map +1 -0
  105. package/dist/database/download.js +241 -0
  106. package/dist/database/download.js.map +1 -0
  107. package/dist/eval/audit/knowledgeAudit.d.ts +66 -0
  108. package/dist/eval/audit/knowledgeAudit.d.ts.map +1 -0
  109. package/dist/eval/audit/knowledgeAudit.js +117 -0
  110. package/dist/eval/audit/knowledgeAudit.js.map +1 -0
  111. package/dist/eval/audit/knowledgeAuditCli.d.ts +17 -0
  112. package/dist/eval/audit/knowledgeAuditCli.d.ts.map +1 -0
  113. package/dist/eval/audit/knowledgeAuditCli.js +83 -0
  114. package/dist/eval/audit/knowledgeAuditCli.js.map +1 -0
  115. package/dist/eval/audit/knowledgeRefs.d.ts +37 -0
  116. package/dist/eval/audit/knowledgeRefs.d.ts.map +1 -0
  117. package/dist/eval/audit/knowledgeRefs.js +150 -0
  118. package/dist/eval/audit/knowledgeRefs.js.map +1 -0
  119. package/dist/eval/audit/symbolLookup.d.ts +23 -0
  120. package/dist/eval/audit/symbolLookup.d.ts.map +1 -0
  121. package/dist/eval/audit/symbolLookup.js +80 -0
  122. package/dist/eval/audit/symbolLookup.js.map +1 -0
  123. package/dist/eval/coverage/coverage.d.ts +65 -0
  124. package/dist/eval/coverage/coverage.d.ts.map +1 -0
  125. package/dist/eval/coverage/coverage.js +136 -0
  126. package/dist/eval/coverage/coverage.js.map +1 -0
  127. package/dist/eval/coverage/coverageCli.d.ts +13 -0
  128. package/dist/eval/coverage/coverageCli.d.ts.map +1 -0
  129. package/dist/eval/coverage/coverageCli.js +106 -0
  130. package/dist/eval/coverage/coverageCli.js.map +1 -0
  131. package/dist/eval/coverage/sources.d.ts +17 -0
  132. package/dist/eval/coverage/sources.d.ts.map +1 -0
  133. package/dist/eval/coverage/sources.js +40 -0
  134. package/dist/eval/coverage/sources.js.map +1 -0
  135. package/dist/eval/coverage/taxonomy.d.ts +59 -0
  136. package/dist/eval/coverage/taxonomy.d.ts.map +1 -0
  137. package/dist/eval/coverage/taxonomy.js +400 -0
  138. package/dist/eval/coverage/taxonomy.js.map +1 -0
  139. package/dist/eval/improver/caseMining.d.ts +55 -0
  140. package/dist/eval/improver/caseMining.d.ts.map +1 -0
  141. package/dist/eval/improver/caseMining.js +64 -0
  142. package/dist/eval/improver/caseMining.js.map +1 -0
  143. package/dist/eval/improver/caseMiningCli.d.ts +10 -0
  144. package/dist/eval/improver/caseMiningCli.d.ts.map +1 -0
  145. package/dist/eval/improver/caseMiningCli.js +50 -0
  146. package/dist/eval/improver/caseMiningCli.js.map +1 -0
  147. package/dist/eval/improver/cli.d.ts +11 -0
  148. package/dist/eval/improver/cli.d.ts.map +1 -0
  149. package/dist/eval/improver/cli.js +73 -0
  150. package/dist/eval/improver/cli.js.map +1 -0
  151. package/dist/eval/improver/cluster.d.ts +47 -0
  152. package/dist/eval/improver/cluster.d.ts.map +1 -0
  153. package/dist/eval/improver/cluster.js +0 -0
  154. package/dist/eval/improver/cluster.js.map +1 -0
  155. package/dist/eval/improver/corpusIO.d.ts +26 -0
  156. package/dist/eval/improver/corpusIO.d.ts.map +1 -0
  157. package/dist/eval/improver/corpusIO.js +50 -0
  158. package/dist/eval/improver/corpusIO.js.map +1 -0
  159. package/dist/eval/improver/fixBrief.d.ts +34 -0
  160. package/dist/eval/improver/fixBrief.d.ts.map +1 -0
  161. package/dist/eval/improver/fixBrief.js +69 -0
  162. package/dist/eval/improver/fixBrief.js.map +1 -0
  163. package/dist/eval/improver/fixBriefCli.d.ts +11 -0
  164. package/dist/eval/improver/fixBriefCli.d.ts.map +1 -0
  165. package/dist/eval/improver/fixBriefCli.js +46 -0
  166. package/dist/eval/improver/fixBriefCli.js.map +1 -0
  167. package/dist/eval/improver/flakeDetection.d.ts +50 -0
  168. package/dist/eval/improver/flakeDetection.d.ts.map +1 -0
  169. package/dist/eval/improver/flakeDetection.js +0 -0
  170. package/dist/eval/improver/flakeDetection.js.map +1 -0
  171. package/dist/eval/improver/flakeDetectionCli.d.ts +8 -0
  172. package/dist/eval/improver/flakeDetectionCli.d.ts.map +1 -0
  173. package/dist/eval/improver/flakeDetectionCli.js +27 -0
  174. package/dist/eval/improver/flakeDetectionCli.js.map +1 -0
  175. package/dist/eval/improver/heldout.d.ts +44 -0
  176. package/dist/eval/improver/heldout.d.ts.map +1 -0
  177. package/dist/eval/improver/heldout.js +52 -0
  178. package/dist/eval/improver/heldout.js.map +1 -0
  179. package/dist/eval/improver/knowledgeFeedback.d.ts +56 -0
  180. package/dist/eval/improver/knowledgeFeedback.d.ts.map +1 -0
  181. package/dist/eval/improver/knowledgeFeedback.js +88 -0
  182. package/dist/eval/improver/knowledgeFeedback.js.map +1 -0
  183. package/dist/eval/improver/knowledgeFeedbackCli.d.ts +8 -0
  184. package/dist/eval/improver/knowledgeFeedbackCli.d.ts.map +1 -0
  185. package/dist/eval/improver/knowledgeFeedbackCli.js +28 -0
  186. package/dist/eval/improver/knowledgeFeedbackCli.js.map +1 -0
  187. package/dist/eval/improver/report.d.ts +36 -0
  188. package/dist/eval/improver/report.d.ts.map +1 -0
  189. package/dist/eval/improver/report.js +61 -0
  190. package/dist/eval/improver/report.js.map +1 -0
  191. package/dist/eval/improver/reportCli.d.ts +7 -0
  192. package/dist/eval/improver/reportCli.d.ts.map +1 -0
  193. package/dist/eval/improver/reportCli.js +27 -0
  194. package/dist/eval/improver/reportCli.js.map +1 -0
  195. package/dist/eval/oracle/actualArtifactResolution.d.ts +49 -0
  196. package/dist/eval/oracle/actualArtifactResolution.d.ts.map +1 -0
  197. package/dist/eval/oracle/actualArtifactResolution.js +73 -0
  198. package/dist/eval/oracle/actualArtifactResolution.js.map +1 -0
  199. package/dist/eval/oracle/cli.d.ts +30 -0
  200. package/dist/eval/oracle/cli.d.ts.map +1 -0
  201. package/dist/eval/oracle/cli.js +179 -0
  202. package/dist/eval/oracle/cli.js.map +1 -0
  203. package/dist/eval/oracle/diff.d.ts +26 -0
  204. package/dist/eval/oracle/diff.d.ts.map +1 -0
  205. package/dist/eval/oracle/diff.js +51 -0
  206. package/dist/eval/oracle/diff.js.map +1 -0
  207. package/dist/eval/oracle/index.d.ts +81 -0
  208. package/dist/eval/oracle/index.d.ts.map +1 -0
  209. package/dist/eval/oracle/index.js +55 -0
  210. package/dist/eval/oracle/index.js.map +1 -0
  211. package/dist/eval/oracle/normalize.d.ts +85 -0
  212. package/dist/eval/oracle/normalize.d.ts.map +1 -0
  213. package/dist/eval/oracle/normalize.js +321 -0
  214. package/dist/eval/oracle/normalize.js.map +1 -0
  215. package/dist/eval/oracle/score.d.ts +26 -0
  216. package/dist/eval/oracle/score.d.ts.map +1 -0
  217. package/dist/eval/oracle/score.js +15 -0
  218. package/dist/eval/oracle/score.js.map +1 -0
  219. package/dist/eval/oracle/systest.d.ts +30 -0
  220. package/dist/eval/oracle/systest.d.ts.map +1 -0
  221. package/dist/eval/oracle/systest.js +98 -0
  222. package/dist/eval/oracle/systest.js.map +1 -0
  223. package/dist/index.d.ts +6 -0
  224. package/dist/index.d.ts.map +1 -0
  225. package/dist/index.js +753 -0
  226. package/dist/index.js.map +1 -0
  227. package/dist/knowledge/formPatterns/catalog/subPatterns/customFilters.d.ts +10 -0
  228. package/dist/knowledge/formPatterns/catalog/subPatterns/customFilters.d.ts.map +1 -0
  229. package/dist/knowledge/formPatterns/catalog/subPatterns/customFilters.js +38 -0
  230. package/dist/knowledge/formPatterns/catalog/subPatterns/customFilters.js.map +1 -0
  231. package/dist/knowledge/formPatterns/catalog/subPatterns/fields.d.ts +21 -0
  232. package/dist/knowledge/formPatterns/catalog/subPatterns/fields.d.ts.map +1 -0
  233. package/dist/knowledge/formPatterns/catalog/subPatterns/fields.js +168 -0
  234. package/dist/knowledge/formPatterns/catalog/subPatterns/fields.js.map +1 -0
  235. package/dist/knowledge/formPatterns/catalog/subPatterns/panels.d.ts +9 -0
  236. package/dist/knowledge/formPatterns/catalog/subPatterns/panels.d.ts.map +1 -0
  237. package/dist/knowledge/formPatterns/catalog/subPatterns/panels.js +47 -0
  238. package/dist/knowledge/formPatterns/catalog/subPatterns/panels.js.map +1 -0
  239. package/dist/knowledge/formPatterns/catalog/subPatterns/toolbar.d.ts +16 -0
  240. package/dist/knowledge/formPatterns/catalog/subPatterns/toolbar.d.ts.map +1 -0
  241. package/dist/knowledge/formPatterns/catalog/subPatterns/toolbar.js +124 -0
  242. package/dist/knowledge/formPatterns/catalog/subPatterns/toolbar.js.map +1 -0
  243. package/dist/knowledge/formPatterns/catalog/subPatterns/workspaceSections.d.ts +12 -0
  244. package/dist/knowledge/formPatterns/catalog/subPatterns/workspaceSections.d.ts.map +1 -0
  245. package/dist/knowledge/formPatterns/catalog/subPatterns/workspaceSections.js +36 -0
  246. package/dist/knowledge/formPatterns/catalog/subPatterns/workspaceSections.js.map +1 -0
  247. package/dist/knowledge/formPatterns/catalog/topLevel/common.d.ts +11 -0
  248. package/dist/knowledge/formPatterns/catalog/topLevel/common.d.ts.map +1 -0
  249. package/dist/knowledge/formPatterns/catalog/topLevel/common.js +37 -0
  250. package/dist/knowledge/formPatterns/catalog/topLevel/common.js.map +1 -0
  251. package/dist/knowledge/formPatterns/catalog/topLevel/detailsMaster.d.ts +8 -0
  252. package/dist/knowledge/formPatterns/catalog/topLevel/detailsMaster.d.ts.map +1 -0
  253. package/dist/knowledge/formPatterns/catalog/topLevel/detailsMaster.js +86 -0
  254. package/dist/knowledge/formPatterns/catalog/topLevel/detailsMaster.js.map +1 -0
  255. package/dist/knowledge/formPatterns/catalog/topLevel/detailsTransaction.d.ts +7 -0
  256. package/dist/knowledge/formPatterns/catalog/topLevel/detailsTransaction.d.ts.map +1 -0
  257. package/dist/knowledge/formPatterns/catalog/topLevel/detailsTransaction.js +69 -0
  258. package/dist/knowledge/formPatterns/catalog/topLevel/detailsTransaction.js.map +1 -0
  259. package/dist/knowledge/formPatterns/catalog/topLevel/dialog.d.ts +14 -0
  260. package/dist/knowledge/formPatterns/catalog/topLevel/dialog.d.ts.map +1 -0
  261. package/dist/knowledge/formPatterns/catalog/topLevel/dialog.js +187 -0
  262. package/dist/knowledge/formPatterns/catalog/topLevel/dialog.js.map +1 -0
  263. package/dist/knowledge/formPatterns/catalog/topLevel/factBox.d.ts +10 -0
  264. package/dist/knowledge/formPatterns/catalog/topLevel/factBox.d.ts.map +1 -0
  265. package/dist/knowledge/formPatterns/catalog/topLevel/factBox.js +54 -0
  266. package/dist/knowledge/formPatterns/catalog/topLevel/factBox.js.map +1 -0
  267. package/dist/knowledge/formPatterns/catalog/topLevel/listPage.d.ts +7 -0
  268. package/dist/knowledge/formPatterns/catalog/topLevel/listPage.d.ts.map +1 -0
  269. package/dist/knowledge/formPatterns/catalog/topLevel/listPage.js +33 -0
  270. package/dist/knowledge/formPatterns/catalog/topLevel/listPage.js.map +1 -0
  271. package/dist/knowledge/formPatterns/catalog/topLevel/lookup.d.ts +10 -0
  272. package/dist/knowledge/formPatterns/catalog/topLevel/lookup.d.ts.map +1 -0
  273. package/dist/knowledge/formPatterns/catalog/topLevel/lookup.js +95 -0
  274. package/dist/knowledge/formPatterns/catalog/topLevel/lookup.js.map +1 -0
  275. package/dist/knowledge/formPatterns/catalog/topLevel/simpleDetails.d.ts +16 -0
  276. package/dist/knowledge/formPatterns/catalog/topLevel/simpleDetails.d.ts.map +1 -0
  277. package/dist/knowledge/formPatterns/catalog/topLevel/simpleDetails.js +158 -0
  278. package/dist/knowledge/formPatterns/catalog/topLevel/simpleDetails.js.map +1 -0
  279. package/dist/knowledge/formPatterns/catalog/topLevel/simpleList.d.ts +7 -0
  280. package/dist/knowledge/formPatterns/catalog/topLevel/simpleList.d.ts.map +1 -0
  281. package/dist/knowledge/formPatterns/catalog/topLevel/simpleList.js +34 -0
  282. package/dist/knowledge/formPatterns/catalog/topLevel/simpleList.js.map +1 -0
  283. package/dist/knowledge/formPatterns/catalog/topLevel/simpleListDetails.d.ts +9 -0
  284. package/dist/knowledge/formPatterns/catalog/topLevel/simpleListDetails.d.ts.map +1 -0
  285. package/dist/knowledge/formPatterns/catalog/topLevel/simpleListDetails.js +99 -0
  286. package/dist/knowledge/formPatterns/catalog/topLevel/simpleListDetails.js.map +1 -0
  287. package/dist/knowledge/formPatterns/catalog/topLevel/tableOfContents.d.ts +8 -0
  288. package/dist/knowledge/formPatterns/catalog/topLevel/tableOfContents.d.ts.map +1 -0
  289. package/dist/knowledge/formPatterns/catalog/topLevel/tableOfContents.js +95 -0
  290. package/dist/knowledge/formPatterns/catalog/topLevel/tableOfContents.js.map +1 -0
  291. package/dist/knowledge/formPatterns/catalog/topLevel/task.d.ts +9 -0
  292. package/dist/knowledge/formPatterns/catalog/topLevel/task.d.ts.map +1 -0
  293. package/dist/knowledge/formPatterns/catalog/topLevel/task.js +42 -0
  294. package/dist/knowledge/formPatterns/catalog/topLevel/task.js.map +1 -0
  295. package/dist/knowledge/formPatterns/catalog/topLevel/wizard.d.ts +7 -0
  296. package/dist/knowledge/formPatterns/catalog/topLevel/wizard.d.ts.map +1 -0
  297. package/dist/knowledge/formPatterns/catalog/topLevel/wizard.js +42 -0
  298. package/dist/knowledge/formPatterns/catalog/topLevel/wizard.js.map +1 -0
  299. package/dist/knowledge/formPatterns/catalog/topLevel/workspace.d.ts +17 -0
  300. package/dist/knowledge/formPatterns/catalog/topLevel/workspace.d.ts.map +1 -0
  301. package/dist/knowledge/formPatterns/catalog/topLevel/workspace.js +157 -0
  302. package/dist/knowledge/formPatterns/catalog/topLevel/workspace.js.map +1 -0
  303. package/dist/knowledge/formPatterns/crossCheck.d.ts +44 -0
  304. package/dist/knowledge/formPatterns/crossCheck.d.ts.map +1 -0
  305. package/dist/knowledge/formPatterns/crossCheck.js +109 -0
  306. package/dist/knowledge/formPatterns/crossCheck.js.map +1 -0
  307. package/dist/knowledge/formPatterns/index.d.ts +30 -0
  308. package/dist/knowledge/formPatterns/index.d.ts.map +1 -0
  309. package/dist/knowledge/formPatterns/index.js +158 -0
  310. package/dist/knowledge/formPatterns/index.js.map +1 -0
  311. package/dist/knowledge/formPatterns/methodStubs.d.ts +45 -0
  312. package/dist/knowledge/formPatterns/methodStubs.d.ts.map +1 -0
  313. package/dist/knowledge/formPatterns/methodStubs.js +257 -0
  314. package/dist/knowledge/formPatterns/methodStubs.js.map +1 -0
  315. package/dist/knowledge/formPatterns/types.d.ts +115 -0
  316. package/dist/knowledge/formPatterns/types.d.ts.map +1 -0
  317. package/dist/knowledge/formPatterns/types.js +44 -0
  318. package/dist/knowledge/formPatterns/types.js.map +1 -0
  319. package/dist/metadata/enhancedParser.d.ts +91 -0
  320. package/dist/metadata/enhancedParser.d.ts.map +1 -0
  321. package/dist/metadata/enhancedParser.js +379 -0
  322. package/dist/metadata/enhancedParser.js.map +1 -0
  323. package/dist/metadata/formPatternMiner.d.ts +78 -0
  324. package/dist/metadata/formPatternMiner.d.ts.map +1 -0
  325. package/dist/metadata/formPatternMiner.js +220 -0
  326. package/dist/metadata/formPatternMiner.js.map +1 -0
  327. package/dist/metadata/labelParser.d.ts +71 -0
  328. package/dist/metadata/labelParser.d.ts.map +1 -0
  329. package/dist/metadata/labelParser.js +258 -0
  330. package/dist/metadata/labelParser.js.map +1 -0
  331. package/dist/metadata/symbolCountsWorker.d.ts +16 -0
  332. package/dist/metadata/symbolCountsWorker.d.ts.map +1 -0
  333. package/dist/metadata/symbolCountsWorker.js +42 -0
  334. package/dist/metadata/symbolCountsWorker.js.map +1 -0
  335. package/dist/metadata/symbolIndex.d.ts +474 -0
  336. package/dist/metadata/symbolIndex.d.ts.map +1 -0
  337. package/dist/metadata/symbolIndex.js +3152 -0
  338. package/dist/metadata/symbolIndex.js.map +1 -0
  339. package/dist/metadata/types.d.ts +267 -0
  340. package/dist/metadata/types.d.ts.map +1 -0
  341. package/dist/metadata/types.js +5 -0
  342. package/dist/metadata/types.js.map +1 -0
  343. package/dist/metadata/xmlParser.d.ts +232 -0
  344. package/dist/metadata/xmlParser.d.ts.map +1 -0
  345. package/dist/metadata/xmlParser.js +1021 -0
  346. package/dist/metadata/xmlParser.js.map +1 -0
  347. package/dist/metadata/xppDeclaration.d.ts +116 -0
  348. package/dist/metadata/xppDeclaration.d.ts.map +1 -0
  349. package/dist/metadata/xppDeclaration.js +350 -0
  350. package/dist/metadata/xppDeclaration.js.map +1 -0
  351. package/dist/middleware/apiKeyAuth.d.ts +7 -0
  352. package/dist/middleware/apiKeyAuth.d.ts.map +1 -0
  353. package/dist/middleware/apiKeyAuth.js +70 -0
  354. package/dist/middleware/apiKeyAuth.js.map +1 -0
  355. package/dist/middleware/rateLimiter.d.ts +7 -0
  356. package/dist/middleware/rateLimiter.d.ts.map +1 -0
  357. package/dist/middleware/rateLimiter.js +78 -0
  358. package/dist/middleware/rateLimiter.js.map +1 -0
  359. package/dist/prompts/codeReview.d.ts +8 -0
  360. package/dist/prompts/codeReview.d.ts.map +1 -0
  361. package/dist/prompts/codeReview.js +619 -0
  362. package/dist/prompts/codeReview.js.map +1 -0
  363. package/dist/prompts/index.d.ts +6 -0
  364. package/dist/prompts/index.d.ts.map +1 -0
  365. package/dist/prompts/index.js +6 -0
  366. package/dist/prompts/index.js.map +1 -0
  367. package/dist/prompts/systemInstructions.d.ts +33 -0
  368. package/dist/prompts/systemInstructions.d.ts.map +1 -0
  369. package/dist/prompts/systemInstructions.js +154 -0
  370. package/dist/prompts/systemInstructions.js.map +1 -0
  371. package/dist/resources/classResource.d.ts +17 -0
  372. package/dist/resources/classResource.d.ts.map +1 -0
  373. package/dist/resources/classResource.js +33 -0
  374. package/dist/resources/classResource.js.map +1 -0
  375. package/dist/resources/index.d.ts +20 -0
  376. package/dist/resources/index.d.ts.map +1 -0
  377. package/dist/resources/index.js +154 -0
  378. package/dist/resources/index.js.map +1 -0
  379. package/dist/server/mcpServer.d.ts +11 -0
  380. package/dist/server/mcpServer.d.ts.map +1 -0
  381. package/dist/server/mcpServer.js +185 -0
  382. package/dist/server/mcpServer.js.map +1 -0
  383. package/dist/server/serverMode.d.ts +53 -0
  384. package/dist/server/serverMode.d.ts.map +1 -0
  385. package/dist/server/serverMode.js +72 -0
  386. package/dist/server/serverMode.js.map +1 -0
  387. package/dist/server/toolAnnotations.d.ts +28 -0
  388. package/dist/server/toolAnnotations.d.ts.map +1 -0
  389. package/dist/server/toolAnnotations.js +70 -0
  390. package/dist/server/toolAnnotations.js.map +1 -0
  391. package/dist/server/toolSchemas/analyzeCode.d.ts +71 -0
  392. package/dist/server/toolSchemas/analyzeCode.d.ts.map +1 -0
  393. package/dist/server/toolSchemas/analyzeCode.js +50 -0
  394. package/dist/server/toolSchemas/analyzeCode.js.map +1 -0
  395. package/dist/server/toolSchemas/batchGetInfo.d.ts +32 -0
  396. package/dist/server/toolSchemas/batchGetInfo.d.ts.map +1 -0
  397. package/dist/server/toolSchemas/batchGetInfo.js +35 -0
  398. package/dist/server/toolSchemas/batchGetInfo.js.map +1 -0
  399. package/dist/server/toolSchemas/buildD365foProject.d.ts +44 -0
  400. package/dist/server/toolSchemas/buildD365foProject.d.ts.map +1 -0
  401. package/dist/server/toolSchemas/buildD365foProject.js +47 -0
  402. package/dist/server/toolSchemas/buildD365foProject.js.map +1 -0
  403. package/dist/server/toolSchemas/d365foFile.d.ts +99 -0
  404. package/dist/server/toolSchemas/d365foFile.d.ts.map +1 -0
  405. package/dist/server/toolSchemas/d365foFile.js +163 -0
  406. package/dist/server/toolSchemas/d365foFile.js.map +1 -0
  407. package/dist/server/toolSchemas/extensionInfo.d.ts +65 -0
  408. package/dist/server/toolSchemas/extensionInfo.d.ts.map +1 -0
  409. package/dist/server/toolSchemas/extensionInfo.js +73 -0
  410. package/dist/server/toolSchemas/extensionInfo.js.map +1 -0
  411. package/dist/server/toolSchemas/findReferences.d.ts +35 -0
  412. package/dist/server/toolSchemas/findReferences.d.ts.map +1 -0
  413. package/dist/server/toolSchemas/findReferences.js +35 -0
  414. package/dist/server/toolSchemas/findReferences.js.map +1 -0
  415. package/dist/server/toolSchemas/generateObject.d.ts +246 -0
  416. package/dist/server/toolSchemas/generateObject.d.ts.map +1 -0
  417. package/dist/server/toolSchemas/generateObject.js +158 -0
  418. package/dist/server/toolSchemas/generateObject.js.map +1 -0
  419. package/dist/server/toolSchemas/getKnowledge.d.ts +39 -0
  420. package/dist/server/toolSchemas/getKnowledge.d.ts.map +1 -0
  421. package/dist/server/toolSchemas/getKnowledge.js +46 -0
  422. package/dist/server/toolSchemas/getKnowledge.js.map +1 -0
  423. package/dist/server/toolSchemas/getMethod.d.ts +30 -0
  424. package/dist/server/toolSchemas/getMethod.d.ts.map +1 -0
  425. package/dist/server/toolSchemas/getMethod.js +34 -0
  426. package/dist/server/toolSchemas/getMethod.js.map +1 -0
  427. package/dist/server/toolSchemas/getObjectInfo.d.ts +24 -0
  428. package/dist/server/toolSchemas/getObjectInfo.d.ts.map +1 -0
  429. package/dist/server/toolSchemas/getObjectInfo.js +30 -0
  430. package/dist/server/toolSchemas/getObjectInfo.js.map +1 -0
  431. package/dist/server/toolSchemas/getWorkspaceInfo.d.ts +29 -0
  432. package/dist/server/toolSchemas/getWorkspaceInfo.d.ts.map +1 -0
  433. package/dist/server/toolSchemas/getWorkspaceInfo.js +29 -0
  434. package/dist/server/toolSchemas/getWorkspaceInfo.js.map +1 -0
  435. package/dist/server/toolSchemas/index.d.ts +1142 -0
  436. package/dist/server/toolSchemas/index.d.ts.map +1 -0
  437. package/dist/server/toolSchemas/index.js +60 -0
  438. package/dist/server/toolSchemas/index.js.map +1 -0
  439. package/dist/server/toolSchemas/labels.d.ts +172 -0
  440. package/dist/server/toolSchemas/labels.d.ts.map +1 -0
  441. package/dist/server/toolSchemas/labels.js +159 -0
  442. package/dist/server/toolSchemas/labels.js.map +1 -0
  443. package/dist/server/toolSchemas/objectPatterns.d.ts +93 -0
  444. package/dist/server/toolSchemas/objectPatterns.d.ts.map +1 -0
  445. package/dist/server/toolSchemas/objectPatterns.js +104 -0
  446. package/dist/server/toolSchemas/objectPatterns.js.map +1 -0
  447. package/dist/server/toolSchemas/prepare.d.ts +49 -0
  448. package/dist/server/toolSchemas/prepare.d.ts.map +1 -0
  449. package/dist/server/toolSchemas/prepare.js +57 -0
  450. package/dist/server/toolSchemas/prepare.js.map +1 -0
  451. package/dist/server/toolSchemas/reviewWorkspaceChanges.d.ts +20 -0
  452. package/dist/server/toolSchemas/reviewWorkspaceChanges.d.ts.map +1 -0
  453. package/dist/server/toolSchemas/reviewWorkspaceChanges.js +19 -0
  454. package/dist/server/toolSchemas/reviewWorkspaceChanges.js.map +1 -0
  455. package/dist/server/toolSchemas/runBpCheck.d.ts +36 -0
  456. package/dist/server/toolSchemas/runBpCheck.d.ts.map +1 -0
  457. package/dist/server/toolSchemas/runBpCheck.js +21 -0
  458. package/dist/server/toolSchemas/runBpCheck.js.map +1 -0
  459. package/dist/server/toolSchemas/runSystestClass.d.ts +32 -0
  460. package/dist/server/toolSchemas/runSystestClass.d.ts.map +1 -0
  461. package/dist/server/toolSchemas/runSystestClass.js +20 -0
  462. package/dist/server/toolSchemas/runSystestClass.js.map +1 -0
  463. package/dist/server/toolSchemas/search.d.ts +109 -0
  464. package/dist/server/toolSchemas/search.d.ts.map +1 -0
  465. package/dist/server/toolSchemas/search.js +123 -0
  466. package/dist/server/toolSchemas/search.js.map +1 -0
  467. package/dist/server/toolSchemas/securityInfo.d.ts +45 -0
  468. package/dist/server/toolSchemas/securityInfo.d.ts.map +1 -0
  469. package/dist/server/toolSchemas/securityInfo.js +39 -0
  470. package/dist/server/toolSchemas/securityInfo.js.map +1 -0
  471. package/dist/server/toolSchemas/suggestEdt.d.ts +29 -0
  472. package/dist/server/toolSchemas/suggestEdt.d.ts.map +1 -0
  473. package/dist/server/toolSchemas/suggestEdt.js +29 -0
  474. package/dist/server/toolSchemas/suggestEdt.js.map +1 -0
  475. package/dist/server/toolSchemas/triggerDbSync.d.ts +47 -0
  476. package/dist/server/toolSchemas/triggerDbSync.d.ts.map +1 -0
  477. package/dist/server/toolSchemas/triggerDbSync.js +31 -0
  478. package/dist/server/toolSchemas/triggerDbSync.js.map +1 -0
  479. package/dist/server/toolSchemas/undoLastModification.d.ts +20 -0
  480. package/dist/server/toolSchemas/undoLastModification.d.ts.map +1 -0
  481. package/dist/server/toolSchemas/undoLastModification.js +17 -0
  482. package/dist/server/toolSchemas/undoLastModification.js.map +1 -0
  483. package/dist/server/toolSchemas/updateSymbolIndex.d.ts +19 -0
  484. package/dist/server/toolSchemas/updateSymbolIndex.d.ts.map +1 -0
  485. package/dist/server/toolSchemas/updateSymbolIndex.js +18 -0
  486. package/dist/server/toolSchemas/updateSymbolIndex.js.map +1 -0
  487. package/dist/server/toolSchemas/validateCode.d.ts +35 -0
  488. package/dist/server/toolSchemas/validateCode.d.ts.map +1 -0
  489. package/dist/server/toolSchemas/validateCode.js +38 -0
  490. package/dist/server/toolSchemas/validateCode.js.map +1 -0
  491. package/dist/server/toolSchemas/validateObjectNaming.d.ts +33 -0
  492. package/dist/server/toolSchemas/validateObjectNaming.d.ts.map +1 -0
  493. package/dist/server/toolSchemas/validateObjectNaming.js +32 -0
  494. package/dist/server/toolSchemas/validateObjectNaming.js.map +1 -0
  495. package/dist/server/toolSchemas/verifyD365foProject.d.ts +50 -0
  496. package/dist/server/toolSchemas/verifyD365foProject.d.ts.map +1 -0
  497. package/dist/server/toolSchemas/verifyD365foProject.js +46 -0
  498. package/dist/server/toolSchemas/verifyD365foProject.js.map +1 -0
  499. package/dist/server/transport.d.ts +30 -0
  500. package/dist/server/transport.d.ts.map +1 -0
  501. package/dist/server/transport.js +391 -0
  502. package/dist/server/transport.js.map +1 -0
  503. package/dist/tools/analyzeCode.d.ts +17 -0
  504. package/dist/tools/analyzeCode.d.ts.map +1 -0
  505. package/dist/tools/analyzeCode.js +63 -0
  506. package/dist/tools/analyzeCode.js.map +1 -0
  507. package/dist/tools/analyzeCompleteness.d.ts +20 -0
  508. package/dist/tools/analyzeCompleteness.d.ts.map +1 -0
  509. package/dist/tools/analyzeCompleteness.js +103 -0
  510. package/dist/tools/analyzeCompleteness.js.map +1 -0
  511. package/dist/tools/analyzeExtensionPoints.d.ts +21 -0
  512. package/dist/tools/analyzeExtensionPoints.d.ts.map +1 -0
  513. package/dist/tools/analyzeExtensionPoints.js +343 -0
  514. package/dist/tools/analyzeExtensionPoints.js.map +1 -0
  515. package/dist/tools/analyzePatterns.d.ts +20 -0
  516. package/dist/tools/analyzePatterns.d.ts.map +1 -0
  517. package/dist/tools/analyzePatterns.js +71 -0
  518. package/dist/tools/analyzePatterns.js.map +1 -0
  519. package/dist/tools/apiUsagePatterns.d.ts +20 -0
  520. package/dist/tools/apiUsagePatterns.d.ts.map +1 -0
  521. package/dist/tools/apiUsagePatterns.js +136 -0
  522. package/dist/tools/apiUsagePatterns.js.map +1 -0
  523. package/dist/tools/batchGetInfo.d.ts +50 -0
  524. package/dist/tools/batchGetInfo.d.ts.map +1 -0
  525. package/dist/tools/batchGetInfo.js +52 -0
  526. package/dist/tools/batchGetInfo.js.map +1 -0
  527. package/dist/tools/batchSearch.d.ts +64 -0
  528. package/dist/tools/batchSearch.d.ts.map +1 -0
  529. package/dist/tools/batchSearch.js +265 -0
  530. package/dist/tools/batchSearch.js.map +1 -0
  531. package/dist/tools/buildProject.d.ts +28 -0
  532. package/dist/tools/buildProject.d.ts.map +1 -0
  533. package/dist/tools/buildProject.js +929 -0
  534. package/dist/tools/buildProject.js.map +1 -0
  535. package/dist/tools/classInfo.d.ts +8 -0
  536. package/dist/tools/classInfo.d.ts.map +1 -0
  537. package/dist/tools/classInfo.js +235 -0
  538. package/dist/tools/classInfo.js.map +1 -0
  539. package/dist/tools/codeGen.d.ts +19 -0
  540. package/dist/tools/codeGen.d.ts.map +1 -0
  541. package/dist/tools/codeGen.js +1956 -0
  542. package/dist/tools/codeGen.js.map +1 -0
  543. package/dist/tools/completion.d.ts +8 -0
  544. package/dist/tools/completion.d.ts.map +1 -0
  545. package/dist/tools/completion.js +272 -0
  546. package/dist/tools/completion.js.map +1 -0
  547. package/dist/tools/configKeyInfo.d.ts +22 -0
  548. package/dist/tools/configKeyInfo.d.ts.map +1 -0
  549. package/dist/tools/configKeyInfo.js +74 -0
  550. package/dist/tools/configKeyInfo.js.map +1 -0
  551. package/dist/tools/createD365File.d.ts +479 -0
  552. package/dist/tools/createD365File.d.ts.map +1 -0
  553. package/dist/tools/createD365File.js +4185 -0
  554. package/dist/tools/createD365File.js.map +1 -0
  555. package/dist/tools/createLabel.d.ts +51 -0
  556. package/dist/tools/createLabel.d.ts.map +1 -0
  557. package/dist/tools/createLabel.js +761 -0
  558. package/dist/tools/createLabel.js.map +1 -0
  559. package/dist/tools/d365foErrorHelp.d.ts +29 -0
  560. package/dist/tools/d365foErrorHelp.d.ts.map +1 -0
  561. package/dist/tools/d365foErrorHelp.js +389 -0
  562. package/dist/tools/d365foErrorHelp.js.map +1 -0
  563. package/dist/tools/d365foFile.d.ts +20 -0
  564. package/dist/tools/d365foFile.d.ts.map +1 -0
  565. package/dist/tools/d365foFile.js +58 -0
  566. package/dist/tools/d365foFile.js.map +1 -0
  567. package/dist/tools/d365foFileOpSpecs.d.ts +41 -0
  568. package/dist/tools/d365foFileOpSpecs.d.ts.map +1 -0
  569. package/dist/tools/d365foFileOpSpecs.js +336 -0
  570. package/dist/tools/d365foFileOpSpecs.js.map +1 -0
  571. package/dist/tools/dataEntityInfo.d.ts +23 -0
  572. package/dist/tools/dataEntityInfo.d.ts.map +1 -0
  573. package/dist/tools/dataEntityInfo.js +45 -0
  574. package/dist/tools/dataEntityInfo.js.map +1 -0
  575. package/dist/tools/dataEntityXml.d.ts +31 -0
  576. package/dist/tools/dataEntityXml.d.ts.map +1 -0
  577. package/dist/tools/dataEntityXml.js +131 -0
  578. package/dist/tools/dataEntityXml.js.map +1 -0
  579. package/dist/tools/dbSync.d.ts +8 -0
  580. package/dist/tools/dbSync.d.ts.map +1 -0
  581. package/dist/tools/dbSync.js +285 -0
  582. package/dist/tools/dbSync.js.map +1 -0
  583. package/dist/tools/edtInfo.d.ts +23 -0
  584. package/dist/tools/edtInfo.d.ts.map +1 -0
  585. package/dist/tools/edtInfo.js +122 -0
  586. package/dist/tools/edtInfo.js.map +1 -0
  587. package/dist/tools/enumInfo.d.ts +17 -0
  588. package/dist/tools/enumInfo.d.ts.map +1 -0
  589. package/dist/tools/enumInfo.js +44 -0
  590. package/dist/tools/enumInfo.js.map +1 -0
  591. package/dist/tools/extensionInfo.d.ts +26 -0
  592. package/dist/tools/extensionInfo.d.ts.map +1 -0
  593. package/dist/tools/extensionInfo.js +73 -0
  594. package/dist/tools/extensionInfo.js.map +1 -0
  595. package/dist/tools/extensionSearch.d.ts +20 -0
  596. package/dist/tools/extensionSearch.d.ts.map +1 -0
  597. package/dist/tools/extensionSearch.js +72 -0
  598. package/dist/tools/extensionSearch.js.map +1 -0
  599. package/dist/tools/extensionStrategyAdvisor.d.ts +15 -0
  600. package/dist/tools/extensionStrategyAdvisor.d.ts.map +1 -0
  601. package/dist/tools/extensionStrategyAdvisor.js +519 -0
  602. package/dist/tools/extensionStrategyAdvisor.js.map +1 -0
  603. package/dist/tools/findCocExtensions.d.ts +20 -0
  604. package/dist/tools/findCocExtensions.d.ts.map +1 -0
  605. package/dist/tools/findCocExtensions.js +285 -0
  606. package/dist/tools/findCocExtensions.js.map +1 -0
  607. package/dist/tools/findEventHandlers.d.ts +21 -0
  608. package/dist/tools/findEventHandlers.d.ts.map +1 -0
  609. package/dist/tools/findEventHandlers.js +196 -0
  610. package/dist/tools/findEventHandlers.js.map +1 -0
  611. package/dist/tools/findReferences.d.ts +30 -0
  612. package/dist/tools/findReferences.d.ts.map +1 -0
  613. package/dist/tools/findReferences.js +551 -0
  614. package/dist/tools/findReferences.js.map +1 -0
  615. package/dist/tools/formInfo.d.ts +13 -0
  616. package/dist/tools/formInfo.d.ts.map +1 -0
  617. package/dist/tools/formInfo.js +407 -0
  618. package/dist/tools/formInfo.js.map +1 -0
  619. package/dist/tools/formPattern.d.ts +19 -0
  620. package/dist/tools/formPattern.d.ts.map +1 -0
  621. package/dist/tools/formPattern.js +52 -0
  622. package/dist/tools/formPattern.js.map +1 -0
  623. package/dist/tools/generateD365Xml.d.ts +12 -0
  624. package/dist/tools/generateD365Xml.d.ts.map +1 -0
  625. package/dist/tools/generateD365Xml.js +1454 -0
  626. package/dist/tools/generateD365Xml.js.map +1 -0
  627. package/dist/tools/generateFindMethods.d.ts +69 -0
  628. package/dist/tools/generateFindMethods.d.ts.map +1 -0
  629. package/dist/tools/generateFindMethods.js +207 -0
  630. package/dist/tools/generateFindMethods.js.map +1 -0
  631. package/dist/tools/generateMetadata.d.ts +37 -0
  632. package/dist/tools/generateMetadata.d.ts.map +1 -0
  633. package/dist/tools/generateMetadata.js +213 -0
  634. package/dist/tools/generateMetadata.js.map +1 -0
  635. package/dist/tools/generateObject.d.ts +34 -0
  636. package/dist/tools/generateObject.d.ts.map +1 -0
  637. package/dist/tools/generateObject.js +47 -0
  638. package/dist/tools/generateObject.js.map +1 -0
  639. package/dist/tools/generateRelationXpp.d.ts +45 -0
  640. package/dist/tools/generateRelationXpp.d.ts.map +1 -0
  641. package/dist/tools/generateRelationXpp.js +129 -0
  642. package/dist/tools/generateRelationXpp.js.map +1 -0
  643. package/dist/tools/generateSmart.d.ts +32 -0
  644. package/dist/tools/generateSmart.d.ts.map +1 -0
  645. package/dist/tools/generateSmart.js +52 -0
  646. package/dist/tools/generateSmart.js.map +1 -0
  647. package/dist/tools/generateSmartForm.d.ts +82 -0
  648. package/dist/tools/generateSmartForm.d.ts.map +1 -0
  649. package/dist/tools/generateSmartForm.js +996 -0
  650. package/dist/tools/generateSmartForm.js.map +1 -0
  651. package/dist/tools/generateSmartReport.d.ts +90 -0
  652. package/dist/tools/generateSmartReport.d.ts.map +1 -0
  653. package/dist/tools/generateSmartReport.js +1254 -0
  654. package/dist/tools/generateSmartReport.js.map +1 -0
  655. package/dist/tools/generateSmartTable.d.ts +138 -0
  656. package/dist/tools/generateSmartTable.d.ts.map +1 -0
  657. package/dist/tools/generateSmartTable.js +1305 -0
  658. package/dist/tools/generateSmartTable.js.map +1 -0
  659. package/dist/tools/generateTableFields.d.ts +48 -0
  660. package/dist/tools/generateTableFields.d.ts.map +1 -0
  661. package/dist/tools/generateTableFields.js +186 -0
  662. package/dist/tools/generateTableFields.js.map +1 -0
  663. package/dist/tools/generateTableRelation.d.ts +35 -0
  664. package/dist/tools/generateTableRelation.d.ts.map +1 -0
  665. package/dist/tools/generateTableRelation.js +161 -0
  666. package/dist/tools/generateTableRelation.js.map +1 -0
  667. package/dist/tools/getFormPatternSpec.d.ts +13 -0
  668. package/dist/tools/getFormPatternSpec.d.ts.map +1 -0
  669. package/dist/tools/getFormPatternSpec.js +290 -0
  670. package/dist/tools/getFormPatternSpec.js.map +1 -0
  671. package/dist/tools/getFormPatterns.d.ts +68 -0
  672. package/dist/tools/getFormPatterns.d.ts.map +1 -0
  673. package/dist/tools/getFormPatterns.js +471 -0
  674. package/dist/tools/getFormPatterns.js.map +1 -0
  675. package/dist/tools/getKnowledge.d.ts +27 -0
  676. package/dist/tools/getKnowledge.d.ts.map +1 -0
  677. package/dist/tools/getKnowledge.js +50 -0
  678. package/dist/tools/getKnowledge.js.map +1 -0
  679. package/dist/tools/getLabelInfo.d.ts +21 -0
  680. package/dist/tools/getLabelInfo.d.ts.map +1 -0
  681. package/dist/tools/getLabelInfo.js +138 -0
  682. package/dist/tools/getLabelInfo.js.map +1 -0
  683. package/dist/tools/getMethod.d.ts +19 -0
  684. package/dist/tools/getMethod.d.ts.map +1 -0
  685. package/dist/tools/getMethod.js +77 -0
  686. package/dist/tools/getMethod.js.map +1 -0
  687. package/dist/tools/getMethodSource.d.ts +17 -0
  688. package/dist/tools/getMethodSource.d.ts.map +1 -0
  689. package/dist/tools/getMethodSource.js +161 -0
  690. package/dist/tools/getMethodSource.js.map +1 -0
  691. package/dist/tools/getObjectInfo.d.ts +17 -0
  692. package/dist/tools/getObjectInfo.d.ts.map +1 -0
  693. package/dist/tools/getObjectInfo.js +88 -0
  694. package/dist/tools/getObjectInfo.js.map +1 -0
  695. package/dist/tools/getTablePatterns.d.ts +45 -0
  696. package/dist/tools/getTablePatterns.d.ts.map +1 -0
  697. package/dist/tools/getTablePatterns.js +235 -0
  698. package/dist/tools/getTablePatterns.js.map +1 -0
  699. package/dist/tools/index.d.ts +11 -0
  700. package/dist/tools/index.d.ts.map +1 -0
  701. package/dist/tools/index.js +11 -0
  702. package/dist/tools/index.js.map +1 -0
  703. package/dist/tools/labels.d.ts +25 -0
  704. package/dist/tools/labels.d.ts.map +1 -0
  705. package/dist/tools/labels.js +111 -0
  706. package/dist/tools/labels.js.map +1 -0
  707. package/dist/tools/macroInfo.d.ts +23 -0
  708. package/dist/tools/macroInfo.d.ts.map +1 -0
  709. package/dist/tools/macroInfo.js +62 -0
  710. package/dist/tools/macroInfo.js.map +1 -0
  711. package/dist/tools/mapInfo.d.ts +21 -0
  712. package/dist/tools/mapInfo.d.ts.map +1 -0
  713. package/dist/tools/mapInfo.js +54 -0
  714. package/dist/tools/mapInfo.js.map +1 -0
  715. package/dist/tools/mapXml.d.ts +26 -0
  716. package/dist/tools/mapXml.d.ts.map +1 -0
  717. package/dist/tools/mapXml.js +88 -0
  718. package/dist/tools/mapXml.js.map +1 -0
  719. package/dist/tools/menuItemInfo.d.ts +20 -0
  720. package/dist/tools/menuItemInfo.d.ts.map +1 -0
  721. package/dist/tools/menuItemInfo.js +185 -0
  722. package/dist/tools/menuItemInfo.js.map +1 -0
  723. package/dist/tools/methodSignature.d.ts +33 -0
  724. package/dist/tools/methodSignature.d.ts.map +1 -0
  725. package/dist/tools/methodSignature.js +348 -0
  726. package/dist/tools/methodSignature.js.map +1 -0
  727. package/dist/tools/modifyD365File.d.ts +130 -0
  728. package/dist/tools/modifyD365File.d.ts.map +1 -0
  729. package/dist/tools/modifyD365File.js +2179 -0
  730. package/dist/tools/modifyD365File.js.map +1 -0
  731. package/dist/tools/objectInfoRegistry.d.ts +36 -0
  732. package/dist/tools/objectInfoRegistry.d.ts.map +1 -0
  733. package/dist/tools/objectInfoRegistry.js +98 -0
  734. package/dist/tools/objectInfoRegistry.js.map +1 -0
  735. package/dist/tools/objectPatterns.d.ts +16 -0
  736. package/dist/tools/objectPatterns.d.ts.map +1 -0
  737. package/dist/tools/objectPatterns.js +84 -0
  738. package/dist/tools/objectPatterns.js.map +1 -0
  739. package/dist/tools/prepare.d.ts +18 -0
  740. package/dist/tools/prepare.d.ts.map +1 -0
  741. package/dist/tools/prepare.js +47 -0
  742. package/dist/tools/prepare.js.map +1 -0
  743. package/dist/tools/prepareChange.d.ts +43 -0
  744. package/dist/tools/prepareChange.d.ts.map +1 -0
  745. package/dist/tools/prepareChange.js +327 -0
  746. package/dist/tools/prepareChange.js.map +1 -0
  747. package/dist/tools/prepareCreate.d.ts +45 -0
  748. package/dist/tools/prepareCreate.d.ts.map +1 -0
  749. package/dist/tools/prepareCreate.js +263 -0
  750. package/dist/tools/prepareCreate.js.map +1 -0
  751. package/dist/tools/queryInfo.d.ts +17 -0
  752. package/dist/tools/queryInfo.d.ts.map +1 -0
  753. package/dist/tools/queryInfo.js +46 -0
  754. package/dist/tools/queryInfo.js.map +1 -0
  755. package/dist/tools/queryViewXml.d.ts +36 -0
  756. package/dist/tools/queryViewXml.d.ts.map +1 -0
  757. package/dist/tools/queryViewXml.js +129 -0
  758. package/dist/tools/queryViewXml.js.map +1 -0
  759. package/dist/tools/renameLabel.d.ts +29 -0
  760. package/dist/tools/renameLabel.d.ts.map +1 -0
  761. package/dist/tools/renameLabel.js +377 -0
  762. package/dist/tools/renameLabel.js.map +1 -0
  763. package/dist/tools/repairFormControls.d.ts +21 -0
  764. package/dist/tools/repairFormControls.d.ts.map +1 -0
  765. package/dist/tools/repairFormControls.js +151 -0
  766. package/dist/tools/repairFormControls.js.map +1 -0
  767. package/dist/tools/reportInfo.d.ts +14 -0
  768. package/dist/tools/reportInfo.d.ts.map +1 -0
  769. package/dist/tools/reportInfo.js +302 -0
  770. package/dist/tools/reportInfo.js.map +1 -0
  771. package/dist/tools/resolveReferences.d.ts +89 -0
  772. package/dist/tools/resolveReferences.d.ts.map +1 -0
  773. package/dist/tools/resolveReferences.js +791 -0
  774. package/dist/tools/resolveReferences.js.map +1 -0
  775. package/dist/tools/reviewWorkspaceChanges.d.ts +14 -0
  776. package/dist/tools/reviewWorkspaceChanges.d.ts.map +1 -0
  777. package/dist/tools/reviewWorkspaceChanges.js +73 -0
  778. package/dist/tools/reviewWorkspaceChanges.js.map +1 -0
  779. package/dist/tools/runBpCheck.d.ts +14 -0
  780. package/dist/tools/runBpCheck.d.ts.map +1 -0
  781. package/dist/tools/runBpCheck.js +241 -0
  782. package/dist/tools/runBpCheck.js.map +1 -0
  783. package/dist/tools/search.d.ts +20 -0
  784. package/dist/tools/search.d.ts.map +1 -0
  785. package/dist/tools/search.js +246 -0
  786. package/dist/tools/search.js.map +1 -0
  787. package/dist/tools/searchLabels.d.ts +26 -0
  788. package/dist/tools/searchLabels.d.ts.map +1 -0
  789. package/dist/tools/searchLabels.js +91 -0
  790. package/dist/tools/searchLabels.js.map +1 -0
  791. package/dist/tools/searchUnified.d.ts +28 -0
  792. package/dist/tools/searchUnified.d.ts.map +1 -0
  793. package/dist/tools/searchUnified.js +48 -0
  794. package/dist/tools/searchUnified.js.map +1 -0
  795. package/dist/tools/securityArtifactInfo.d.ts +14 -0
  796. package/dist/tools/securityArtifactInfo.d.ts.map +1 -0
  797. package/dist/tools/securityArtifactInfo.js +192 -0
  798. package/dist/tools/securityArtifactInfo.js.map +1 -0
  799. package/dist/tools/securityCoverageInfo.d.ts +21 -0
  800. package/dist/tools/securityCoverageInfo.d.ts.map +1 -0
  801. package/dist/tools/securityCoverageInfo.js +248 -0
  802. package/dist/tools/securityCoverageInfo.js.map +1 -0
  803. package/dist/tools/securityInfo.d.ts +22 -0
  804. package/dist/tools/securityInfo.d.ts.map +1 -0
  805. package/dist/tools/securityInfo.js +43 -0
  806. package/dist/tools/securityInfo.js.map +1 -0
  807. package/dist/tools/securityPolicyInfo.d.ts +22 -0
  808. package/dist/tools/securityPolicyInfo.d.ts.map +1 -0
  809. package/dist/tools/securityPolicyInfo.js +49 -0
  810. package/dist/tools/securityPolicyInfo.js.map +1 -0
  811. package/dist/tools/securityPrivilegeXml.d.ts +21 -0
  812. package/dist/tools/securityPrivilegeXml.d.ts.map +1 -0
  813. package/dist/tools/securityPrivilegeXml.js +61 -0
  814. package/dist/tools/securityPrivilegeXml.js.map +1 -0
  815. package/dist/tools/serviceInfo.d.ts +25 -0
  816. package/dist/tools/serviceInfo.d.ts.map +1 -0
  817. package/dist/tools/serviceInfo.js +93 -0
  818. package/dist/tools/serviceInfo.js.map +1 -0
  819. package/dist/tools/suggestEdt.d.ts +15 -0
  820. package/dist/tools/suggestEdt.d.ts.map +1 -0
  821. package/dist/tools/suggestEdt.js +348 -0
  822. package/dist/tools/suggestEdt.js.map +1 -0
  823. package/dist/tools/suggestImplementation.d.ts +20 -0
  824. package/dist/tools/suggestImplementation.d.ts.map +1 -0
  825. package/dist/tools/suggestImplementation.js +144 -0
  826. package/dist/tools/suggestImplementation.js.map +1 -0
  827. package/dist/tools/sysTestRunner.d.ts +14 -0
  828. package/dist/tools/sysTestRunner.d.ts.map +1 -0
  829. package/dist/tools/sysTestRunner.js +145 -0
  830. package/dist/tools/sysTestRunner.js.map +1 -0
  831. package/dist/tools/tableExtensionInfo.d.ts +91 -0
  832. package/dist/tools/tableExtensionInfo.d.ts.map +1 -0
  833. package/dist/tools/tableExtensionInfo.js +305 -0
  834. package/dist/tools/tableExtensionInfo.js.map +1 -0
  835. package/dist/tools/tableInfo.d.ts +23 -0
  836. package/dist/tools/tableInfo.d.ts.map +1 -0
  837. package/dist/tools/tableInfo.js +125 -0
  838. package/dist/tools/tableInfo.js.map +1 -0
  839. package/dist/tools/toolHandler.d.ts +4 -0
  840. package/dist/tools/toolHandler.d.ts.map +1 -0
  841. package/dist/tools/toolHandler.js +508 -0
  842. package/dist/tools/toolHandler.js.map +1 -0
  843. package/dist/tools/undoLastModification.d.ts +15 -0
  844. package/dist/tools/undoLastModification.d.ts.map +1 -0
  845. package/dist/tools/undoLastModification.js +147 -0
  846. package/dist/tools/undoLastModification.js.map +1 -0
  847. package/dist/tools/updateSymbolIndex.d.ts +15 -0
  848. package/dist/tools/updateSymbolIndex.d.ts.map +1 -0
  849. package/dist/tools/updateSymbolIndex.js +520 -0
  850. package/dist/tools/updateSymbolIndex.js.map +1 -0
  851. package/dist/tools/validateCode.d.ts +24 -0
  852. package/dist/tools/validateCode.d.ts.map +1 -0
  853. package/dist/tools/validateCode.js +201 -0
  854. package/dist/tools/validateCode.js.map +1 -0
  855. package/dist/tools/validateFormPattern.d.ts +51 -0
  856. package/dist/tools/validateFormPattern.d.ts.map +1 -0
  857. package/dist/tools/validateFormPattern.js +201 -0
  858. package/dist/tools/validateFormPattern.js.map +1 -0
  859. package/dist/tools/validateObjectNaming.d.ts +21 -0
  860. package/dist/tools/validateObjectNaming.d.ts.map +1 -0
  861. package/dist/tools/validateObjectNaming.js +319 -0
  862. package/dist/tools/validateObjectNaming.js.map +1 -0
  863. package/dist/tools/validateXpp.d.ts +79 -0
  864. package/dist/tools/validateXpp.d.ts.map +1 -0
  865. package/dist/tools/validateXpp.js +705 -0
  866. package/dist/tools/validateXpp.js.map +1 -0
  867. package/dist/tools/verifyD365Project.d.ts +21 -0
  868. package/dist/tools/verifyD365Project.d.ts.map +1 -0
  869. package/dist/tools/verifyD365Project.js +299 -0
  870. package/dist/tools/verifyD365Project.js.map +1 -0
  871. package/dist/tools/viewInfo.d.ts +17 -0
  872. package/dist/tools/viewInfo.d.ts.map +1 -0
  873. package/dist/tools/viewInfo.js +46 -0
  874. package/dist/tools/viewInfo.js.map +1 -0
  875. package/dist/tools/xppKnowledge.d.ts +45 -0
  876. package/dist/tools/xppKnowledge.d.ts.map +1 -0
  877. package/dist/tools/xppKnowledge.js +2815 -0
  878. package/dist/tools/xppKnowledge.js.map +1 -0
  879. package/dist/types/context.d.ts +56 -0
  880. package/dist/types/context.d.ts.map +1 -0
  881. package/dist/types/context.js +5 -0
  882. package/dist/types/context.js.map +1 -0
  883. package/dist/utils/callDedup.d.ts +29 -0
  884. package/dist/utils/callDedup.d.ts.map +1 -0
  885. package/dist/utils/callDedup.js +87 -0
  886. package/dist/utils/callDedup.js.map +1 -0
  887. package/dist/utils/configManager.d.ts +307 -0
  888. package/dist/utils/configManager.d.ts.map +1 -0
  889. package/dist/utils/configManager.js +1169 -0
  890. package/dist/utils/configManager.js.map +1 -0
  891. package/dist/utils/d365XmlNormalizer.d.ts +9 -0
  892. package/dist/utils/d365XmlNormalizer.d.ts.map +1 -0
  893. package/dist/utils/d365XmlNormalizer.js +24 -0
  894. package/dist/utils/d365XmlNormalizer.js.map +1 -0
  895. package/dist/utils/edtExtensionValidator.d.ts +110 -0
  896. package/dist/utils/edtExtensionValidator.d.ts.map +1 -0
  897. package/dist/utils/edtExtensionValidator.js +367 -0
  898. package/dist/utils/edtExtensionValidator.js.map +1 -0
  899. package/dist/utils/eolUtils.d.ts +15 -0
  900. package/dist/utils/eolUtils.d.ts.map +1 -0
  901. package/dist/utils/eolUtils.js +21 -0
  902. package/dist/utils/eolUtils.js.map +1 -0
  903. package/dist/utils/extractManifest.d.ts +34 -0
  904. package/dist/utils/extractManifest.d.ts.map +1 -0
  905. package/dist/utils/extractManifest.js +43 -0
  906. package/dist/utils/extractManifest.js.map +1 -0
  907. package/dist/utils/fieldControlTypes.d.ts +44 -0
  908. package/dist/utils/fieldControlTypes.d.ts.map +1 -0
  909. package/dist/utils/fieldControlTypes.js +97 -0
  910. package/dist/utils/fieldControlTypes.js.map +1 -0
  911. package/dist/utils/formCloner.d.ts +77 -0
  912. package/dist/utils/formCloner.d.ts.map +1 -0
  913. package/dist/utils/formCloner.js +364 -0
  914. package/dist/utils/formCloner.js.map +1 -0
  915. package/dist/utils/formControlExpander.d.ts +68 -0
  916. package/dist/utils/formControlExpander.d.ts.map +1 -0
  917. package/dist/utils/formControlExpander.js +207 -0
  918. package/dist/utils/formControlExpander.js.map +1 -0
  919. package/dist/utils/formControlRepair.d.ts +81 -0
  920. package/dist/utils/formControlRepair.d.ts.map +1 -0
  921. package/dist/utils/formControlRepair.js +203 -0
  922. package/dist/utils/formControlRepair.js.map +1 -0
  923. package/dist/utils/formExtensionShapeValidator.d.ts +44 -0
  924. package/dist/utils/formExtensionShapeValidator.d.ts.map +1 -0
  925. package/dist/utils/formExtensionShapeValidator.js +99 -0
  926. package/dist/utils/formExtensionShapeValidator.js.map +1 -0
  927. package/dist/utils/formPatternTemplates.d.ts +77 -0
  928. package/dist/utils/formPatternTemplates.d.ts.map +1 -0
  929. package/dist/utils/formPatternTemplates.js +1917 -0
  930. package/dist/utils/formPatternTemplates.js.map +1 -0
  931. package/dist/utils/fsExtensionScanner.d.ts +76 -0
  932. package/dist/utils/fsExtensionScanner.d.ts.map +1 -0
  933. package/dist/utils/fsExtensionScanner.js +271 -0
  934. package/dist/utils/fsExtensionScanner.js.map +1 -0
  935. package/dist/utils/fuzzyMatching.d.ts +41 -0
  936. package/dist/utils/fuzzyMatching.d.ts.map +1 -0
  937. package/dist/utils/fuzzyMatching.js +186 -0
  938. package/dist/utils/fuzzyMatching.js.map +1 -0
  939. package/dist/utils/indexStaleness.d.ts +30 -0
  940. package/dist/utils/indexStaleness.d.ts.map +1 -0
  941. package/dist/utils/indexStaleness.js +104 -0
  942. package/dist/utils/indexStaleness.js.map +1 -0
  943. package/dist/utils/loadEnv.d.ts +32 -0
  944. package/dist/utils/loadEnv.d.ts.map +1 -0
  945. package/dist/utils/loadEnv.js +83 -0
  946. package/dist/utils/loadEnv.js.map +1 -0
  947. package/dist/utils/logger.d.ts +4 -0
  948. package/dist/utils/logger.d.ts.map +1 -0
  949. package/dist/utils/logger.js +11 -0
  950. package/dist/utils/logger.js.map +1 -0
  951. package/dist/utils/metadataResolver.d.ts +155 -0
  952. package/dist/utils/metadataResolver.d.ts.map +1 -0
  953. package/dist/utils/metadataResolver.js +277 -0
  954. package/dist/utils/metadataResolver.js.map +1 -0
  955. package/dist/utils/modelClassifier.d.ts +180 -0
  956. package/dist/utils/modelClassifier.d.ts.map +1 -0
  957. package/dist/utils/modelClassifier.js +373 -0
  958. package/dist/utils/modelClassifier.js.map +1 -0
  959. package/dist/utils/operationLocks.d.ts +26 -0
  960. package/dist/utils/operationLocks.d.ts.map +1 -0
  961. package/dist/utils/operationLocks.js +182 -0
  962. package/dist/utils/operationLocks.js.map +1 -0
  963. package/dist/utils/packageResolver.d.ts +52 -0
  964. package/dist/utils/packageResolver.d.ts.map +1 -0
  965. package/dist/utils/packageResolver.js +174 -0
  966. package/dist/utils/packageResolver.js.map +1 -0
  967. package/dist/utils/pathContainment.d.ts +60 -0
  968. package/dist/utils/pathContainment.d.ts.map +1 -0
  969. package/dist/utils/pathContainment.js +270 -0
  970. package/dist/utils/pathContainment.js.map +1 -0
  971. package/dist/utils/projectUtils.d.ts +14 -0
  972. package/dist/utils/projectUtils.d.ts.map +1 -0
  973. package/dist/utils/projectUtils.js +48 -0
  974. package/dist/utils/projectUtils.js.map +1 -0
  975. package/dist/utils/provenanceStore.d.ts +54 -0
  976. package/dist/utils/provenanceStore.d.ts.map +1 -0
  977. package/dist/utils/provenanceStore.js +203 -0
  978. package/dist/utils/provenanceStore.js.map +1 -0
  979. package/dist/utils/richContext.d.ts +45 -0
  980. package/dist/utils/richContext.d.ts.map +1 -0
  981. package/dist/utils/richContext.js +316 -0
  982. package/dist/utils/richContext.js.map +1 -0
  983. package/dist/utils/smartXmlBuilder.d.ts +187 -0
  984. package/dist/utils/smartXmlBuilder.d.ts.map +1 -0
  985. package/dist/utils/smartXmlBuilder.js +504 -0
  986. package/dist/utils/smartXmlBuilder.js.map +1 -0
  987. package/dist/utils/stdioSessionInfo.d.ts +53 -0
  988. package/dist/utils/stdioSessionInfo.d.ts.map +1 -0
  989. package/dist/utils/stdioSessionInfo.js +47 -0
  990. package/dist/utils/stdioSessionInfo.js.map +1 -0
  991. package/dist/utils/suggestionEngine.d.ts +20 -0
  992. package/dist/utils/suggestionEngine.d.ts.map +1 -0
  993. package/dist/utils/suggestionEngine.js +145 -0
  994. package/dist/utils/suggestionEngine.js.map +1 -0
  995. package/dist/utils/symbolLookup.d.ts +60 -0
  996. package/dist/utils/symbolLookup.d.ts.map +1 -0
  997. package/dist/utils/symbolLookup.js +0 -0
  998. package/dist/utils/symbolLookup.js.map +1 -0
  999. package/dist/utils/terminalUi.d.ts +85 -0
  1000. package/dist/utils/terminalUi.d.ts.map +1 -0
  1001. package/dist/utils/terminalUi.js +182 -0
  1002. package/dist/utils/terminalUi.js.map +1 -0
  1003. package/dist/utils/toolMetrics.d.ts +32 -0
  1004. package/dist/utils/toolMetrics.d.ts.map +1 -0
  1005. package/dist/utils/toolMetrics.js +89 -0
  1006. package/dist/utils/toolMetrics.js.map +1 -0
  1007. package/dist/utils/toolProgressMessage.d.ts +8 -0
  1008. package/dist/utils/toolProgressMessage.d.ts.map +1 -0
  1009. package/dist/utils/toolProgressMessage.js +182 -0
  1010. package/dist/utils/toolProgressMessage.js.map +1 -0
  1011. package/dist/utils/workspaceDetector.d.ts +51 -0
  1012. package/dist/utils/workspaceDetector.d.ts.map +1 -0
  1013. package/dist/utils/workspaceDetector.js +328 -0
  1014. package/dist/utils/workspaceDetector.js.map +1 -0
  1015. package/dist/utils/xppConfigProvider.d.ts +48 -0
  1016. package/dist/utils/xppConfigProvider.d.ts.map +1 -0
  1017. package/dist/utils/xppConfigProvider.js +121 -0
  1018. package/dist/utils/xppConfigProvider.js.map +1 -0
  1019. package/dist/utils/xppDocGen.d.ts +39 -0
  1020. package/dist/utils/xppDocGen.d.ts.map +1 -0
  1021. package/dist/utils/xppDocGen.js +518 -0
  1022. package/dist/utils/xppDocGen.js.map +1 -0
  1023. package/dist/utils/xppFormat.d.ts +21 -0
  1024. package/dist/utils/xppFormat.d.ts.map +1 -0
  1025. package/dist/utils/xppFormat.js +102 -0
  1026. package/dist/utils/xppFormat.js.map +1 -0
  1027. package/dist/utils/xppSelectLint.d.ts +18 -0
  1028. package/dist/utils/xppSelectLint.d.ts.map +1 -0
  1029. package/dist/utils/xppSelectLint.js +80 -0
  1030. package/dist/utils/xppSelectLint.js.map +1 -0
  1031. package/dist/validation/formPatternValidator.d.ts +53 -0
  1032. package/dist/validation/formPatternValidator.d.ts.map +1 -0
  1033. package/dist/validation/formPatternValidator.js +454 -0
  1034. package/dist/validation/formPatternValidator.js.map +1 -0
  1035. package/dist/workspace/contextRanker.d.ts +58 -0
  1036. package/dist/workspace/contextRanker.d.ts.map +1 -0
  1037. package/dist/workspace/contextRanker.js +216 -0
  1038. package/dist/workspace/contextRanker.js.map +1 -0
  1039. package/dist/workspace/contextSnapshot.d.ts +68 -0
  1040. package/dist/workspace/contextSnapshot.d.ts.map +1 -0
  1041. package/dist/workspace/contextSnapshot.js +193 -0
  1042. package/dist/workspace/contextSnapshot.js.map +1 -0
  1043. package/dist/workspace/hybridSearch.d.ts +39 -0
  1044. package/dist/workspace/hybridSearch.d.ts.map +1 -0
  1045. package/dist/workspace/hybridSearch.js +96 -0
  1046. package/dist/workspace/hybridSearch.js.map +1 -0
  1047. package/dist/workspace/workspaceScanner.d.ts +95 -0
  1048. package/dist/workspace/workspaceScanner.d.ts.map +1 -0
  1049. package/dist/workspace/workspaceScanner.js +247 -0
  1050. package/dist/workspace/workspaceScanner.js.map +1 -0
  1051. package/dist/workspace/workspaceUtils.d.ts +23 -0
  1052. package/dist/workspace/workspaceUtils.d.ts.map +1 -0
  1053. package/dist/workspace/workspaceUtils.js +77 -0
  1054. package/dist/workspace/workspaceUtils.js.map +1 -0
  1055. package/package.json +94 -0
@@ -0,0 +1,1305 @@
1
+ /**
2
+ * Generate Smart Table Tool
3
+ * AI-driven table generation using indexed metadata patterns
4
+ */
5
+ import { SmartXmlBuilder } from '../utils/smartXmlBuilder.js';
6
+ import { bridgeCreateSmartTable } from '../bridge/index.js';
7
+ import path from 'path';
8
+ import fs from 'fs';
9
+ import { getConfigManager } from '../utils/configManager.js';
10
+ import { resolveObjectPrefix, applyObjectPrefix, getObjectSuffix, applyObjectSuffix } from '../utils/modelClassifier.js';
11
+ import { ProjectFileManager } from './createD365File.js';
12
+ import { extractModelFromProject, findProjectInSolution } from '../utils/projectUtils.js';
13
+ import { normalizeD365Xml } from '../utils/d365XmlNormalizer.js';
14
+ import { lookupSymbolNocase } from '../utils/symbolLookup.js';
15
+ export const generateSmartTableTool = {
16
+ name: 'generate_smart_table',
17
+ description: 'Generate AxTable XML with AI-driven field/index/relation suggestions based on indexed patterns. Can copy structure from existing tables, analyze table group patterns, or use field hints.',
18
+ inputSchema: {
19
+ type: 'object',
20
+ properties: {
21
+ name: {
22
+ type: 'string',
23
+ description: 'Table name (e.g., "MyCustomTable")',
24
+ },
25
+ label: {
26
+ type: 'string',
27
+ description: 'Optional label for the table',
28
+ },
29
+ tableGroup: {
30
+ type: 'string',
31
+ description: 'Table group (business role). Defined by the system enum TableGroup (source: MSDN). ' +
32
+ 'Valid values: ' +
33
+ '"Miscellaneous" = DEFAULT for new tables, does not fit other categories (e.g. TableExpImpDef); ' +
34
+ '"Main" = principal/master table for a central business object, static base data (e.g. CustTable, VendTable); ' +
35
+ '"Transaction" = transaction data, usually not edited directly (e.g. CustTrans, VendTrans); ' +
36
+ '"Parameter" = setup/parameter data for a Main table, typically one record per company (e.g. CustParameters); ' +
37
+ '"Group" = categorisation for a Main table, one-to-many with Main (e.g. CustGroup, VendGroup); ' +
38
+ '"WorksheetHeader" = worksheet header that categorises WorksheetLine rows (e.g. SalesTable); ' +
39
+ '"WorksheetLine" = lines to be validated and turned into transactions, may be deleted safely (e.g. SalesLine); ' +
40
+ '"Reference" = shared reference/lookup data across modules; ' +
41
+ '"Framework" = internal Microsoft framework/infrastructure tables. ' +
42
+ '⛔ NEVER pass "TempDB" or "InMemory" here — those are TableType values, NOT TableGroup values. ' +
43
+ 'For temporary tables use tableType="TempDB" and keep tableGroup as "Main" (typical choice for Tmp tables).',
44
+ },
45
+ tableType: {
46
+ type: 'string',
47
+ description: 'Table storage type (TableType property, source: MSDN). Valid values: ' +
48
+ '"Regular" / "RegularTable" = DEFAULT, permanent table in main database — omit for regular tables; ' +
49
+ '"TempDB" = temporary table in SQL Server TempDB, dropped when no longer used by current method, ' +
50
+ 'joins and set operations are EFFICIENT — use for SSRS report tmp tables and session-scoped data; ' +
51
+ '"InMemory" = temporary ISAM file on AOS/client tier, SQL Server has no connection to it, ' +
52
+ 'joins and set operations are usually INEFFICIENT — equivalent to old AX 2009 "Temporary" property. ' +
53
+ '⛔ NEVER pass this value as tableGroup — they are completely separate properties.',
54
+ },
55
+ copyFrom: {
56
+ type: 'string',
57
+ description: 'Optional: Copy structure from existing table (name)',
58
+ },
59
+ fieldsHint: {
60
+ type: 'string',
61
+ description: 'REQUIRED when the user mentions any fields, columns, or data. ' +
62
+ 'Extract ALL field names from the user description and pass them here as a comma-separated list. ' +
63
+ 'WITHOUT this parameter only generic default fields are generated and the table will be INCOMPLETE. ' +
64
+ 'Natural language → fieldsHint mapping examples: ' +
65
+ '"Account number" → "AccountNum", ' +
66
+ '"Name" → "Name", ' +
67
+ '"Description" or "popis" → "Description", ' +
68
+ '"platnost od" or "ValidFrom" or "from date" → "ValidFrom", ' +
69
+ '"platnost do" or "ValidTo" or "to date" → "ValidTo", ' +
70
+ '"active" or "active flag" → "Active", ' +
71
+ '"customer" or "customer account" → "CustAccount". ' +
72
+ 'Example call: fieldsHint="AccountNum, Name, Description, ValidFrom, ValidTo". ' +
73
+ '⚠️ EDT auto-suggestion is index-based: custom EDTs/enums created in the SAME SESSION are not yet in the ' +
74
+ 'index and those fields will fall back to String255. Call update_symbol_index BEFORE scaffolding to ensure ' +
75
+ 'the new custom EDTs are resolved correctly.',
76
+ },
77
+ primaryKeyFields: {
78
+ type: 'array',
79
+ items: { type: 'string' },
80
+ description: 'REQUIRED when user specifies a composite primary key (multiple fields). ' +
81
+ 'List ALL fields that form the primary key index. ' +
82
+ 'Without this, only the first mandatory field is used as PK — composite PKs will be WRONG. ' +
83
+ 'Example: user says "primary key is Account number and Name" → primaryKeyFields=["AccountNum", "Name"]. ' +
84
+ 'Single-field PK can be omitted — the tool auto-detects it from fieldsHint mandatory fields.',
85
+ },
86
+ generateCommonFields: {
87
+ type: 'boolean',
88
+ description: 'If true, analyze table group patterns and generate common fields automatically',
89
+ },
90
+ modelName: {
91
+ type: 'string',
92
+ description: 'Model name for file creation (auto-detected from projectPath)',
93
+ },
94
+ projectPath: {
95
+ type: 'string',
96
+ description: 'Path to .rnrproj file (used to extract correct ModelName)',
97
+ },
98
+ solutionPath: {
99
+ type: 'string',
100
+ description: 'Path to solution directory (alternative to projectPath)',
101
+ },
102
+ packagePath: {
103
+ type: 'string',
104
+ description: 'Base packages directory path (e.g. "C:\\AosService\\PackagesLocalDirectory"). ' +
105
+ 'Auto-detected from .mcp.json; only needed when the default K: fallback is wrong.',
106
+ },
107
+ methods: {
108
+ type: 'array',
109
+ items: { type: 'string' },
110
+ description: 'ALWAYS pass ["find", "exist"] when the user asks for those methods. ' +
111
+ 'Methods are embedded directly in the generated XML. ' +
112
+ 'Supported values: "find", "exist". ' +
113
+ '⛔ NEVER omit this and then call d365fo_file(action="modify") to add methods afterwards — ' +
114
+ 'd365fo_file(action="modify") CANNOT write files on Azure/Linux.',
115
+ },
116
+ },
117
+ required: ['name'],
118
+ },
119
+ };
120
+ export async function handleGenerateSmartTable(args, symbolIndex, bridge) {
121
+ const { name, label, tableGroup = 'Main', tableType, copyFrom, fieldsHint, primaryKeyFields, generateCommonFields, modelName, projectPath, solutionPath, packagePath: argPackagePath, methods: requestedMethods, } = args;
122
+ // Guard: 'TempDB' and 'InMemory' are NOT valid TableGroup values.
123
+ if (tableGroup === 'TempDB' || tableGroup === 'InMemory') {
124
+ return {
125
+ content: [{
126
+ type: 'text',
127
+ text: [
128
+ `❌ **Invalid parameter: tableGroup="${tableGroup}"**`,
129
+ ``,
130
+ `'${tableGroup}' is a **TableType** value, NOT a **TableGroup** value.`,
131
+ `These are two completely different D365FO table properties:`,
132
+ ``,
133
+ `| Property | Purpose | Valid values |`,
134
+ `|----------|---------|--------------|`,
135
+ `| **TableType** | Storage type | RegularTable, TempDB, InMemory |`,
136
+ `| **TableGroup** | Business role | Miscellaneous (default), Main, Transaction, Parameter, Group, WorksheetHeader, WorksheetLine, Reference, Framework |`,
137
+ ``,
138
+ `TableGroup meanings (source: MSDN / system enum TableGroup):`,
139
+ ` Miscellaneous — DEFAULT for new tables; does not fit any other category`,
140
+ ` Main — master/base object table, static data (e.g. CustTable, VendTable)`,
141
+ ` Transaction — transaction data, not edited directly (e.g. CustTrans, VendTrans)`,
142
+ ` Parameter — setup data for a Main table, usually one record/company (e.g. CustParameters)`,
143
+ ` Group — categorisation for a Main table, one-to-many with Main (e.g. CustGroup)`,
144
+ ` WorksheetHeader — worksheet header, one-to-many with WorksheetLine (e.g. SalesTable)`,
145
+ ` WorksheetLine — lines to validate → transactions, may be deleted safely (e.g. SalesLine)`,
146
+ ` Reference — shared reference/lookup data across modules`,
147
+ ` Framework — internal Microsoft framework/infrastructure tables`,
148
+ ``,
149
+ `🔄 **Call generate again** with the corrected parameters:`,
150
+ `\`\`\``,
151
+ `generate_object(mode="scaffold", `,
152
+ ` objectType="table",`,
153
+ ` name="${name}",`,
154
+ ` tableType="${tableGroup}", ← move here`,
155
+ ` tableGroup="Main", ← use a valid TableGroup value`,
156
+ ` fieldsHint="...",`,
157
+ `)`,
158
+ `\`\`\``,
159
+ ].join('\n'),
160
+ }],
161
+ isError: true,
162
+ };
163
+ }
164
+ console.log(`[generateSmartTable] Generating table: ${name}, tableGroup=${tableGroup}, tableType=${tableType ?? 'Regular'}, copyFrom=${copyFrom}`);
165
+ const builder = new SmartXmlBuilder(symbolIndex);
166
+ let fields = [];
167
+ let indexes = [];
168
+ let relations = [];
169
+ let usedFallback = false; // true when fieldsHint was missing and generic defaults were used
170
+ // Strategy 1: Copy from existing table
171
+ if (copyFrom) {
172
+ console.log(`[generateSmartTable] Copying structure from: ${copyFrom}`);
173
+ try {
174
+ const db = symbolIndex.getReadDb();
175
+ const dbFields = db.prepare(`
176
+ SELECT name, signature FROM symbols
177
+ WHERE type = 'field' AND parent_name = ?
178
+ ORDER BY name
179
+ `).all(copyFrom);
180
+ if (dbFields.length === 0) {
181
+ throw new Error(`Table "${copyFrom}" not found or has no indexed fields`);
182
+ }
183
+ fields = dbFields.map((f) => ({
184
+ name: f.name,
185
+ edt: f.signature || undefined,
186
+ }));
187
+ const dbRelations = db.prepare(`
188
+ SELECT relation_name, target_table, constraint_fields FROM table_relations
189
+ WHERE source_table = ?
190
+ `).all(copyFrom);
191
+ relations = dbRelations.map((rel) => ({
192
+ name: rel.relation_name.replace(copyFrom, name),
193
+ targetTable: rel.target_table,
194
+ constraints: rel.constraint_fields ? JSON.parse(rel.constraint_fields) : [],
195
+ }));
196
+ console.log(`[generateSmartTable] Copied ${fields.length} fields, ${relations.length} relations from ${copyFrom}`);
197
+ }
198
+ catch (error) {
199
+ console.error(`[generateSmartTable] Failed to copy from ${copyFrom}:`, error);
200
+ throw new Error(`Failed to copy structure from ${copyFrom}: ${error instanceof Error ? error.message : String(error)}`);
201
+ }
202
+ }
203
+ // Strategy 2: Generate common fields based on table group patterns.
204
+ // Skipped when explicit fieldsHint is given (the caller stated the fields).
205
+ if (generateCommonFields && !copyFrom && !fieldsHint) {
206
+ console.log(`[generateSmartTable] Analyzing patterns for table group: ${tableGroup}`);
207
+ try {
208
+ const db = symbolIndex.getReadDb();
209
+ const namePatterns = {
210
+ Transaction: '%Trans%',
211
+ Parameter: '%Parameters',
212
+ Main: '%Table',
213
+ };
214
+ const namePattern = namePatterns[tableGroup];
215
+ const sampleTables = db.prepare(`
216
+ SELECT DISTINCT name FROM symbols
217
+ WHERE type = 'table'
218
+ ${namePattern ? 'AND name LIKE ?' : ''}
219
+ LIMIT 20
220
+ `).all(...(namePattern ? [namePattern] : []));
221
+ if (sampleTables.length > 0) {
222
+ const fieldFrequency = new Map();
223
+ for (const table of sampleTables) {
224
+ const tableFields = db.prepare(`
225
+ SELECT name, signature FROM symbols
226
+ WHERE type = 'field' AND parent_name = ?
227
+ `).all(table.name);
228
+ for (const field of tableFields) {
229
+ if (!field.signature)
230
+ continue;
231
+ const key = `${field.name}:${field.signature}`;
232
+ const existing = fieldFrequency.get(key);
233
+ if (existing) {
234
+ existing.count++;
235
+ }
236
+ else {
237
+ fieldFrequency.set(key, { edt: field.signature, count: 1 });
238
+ }
239
+ }
240
+ }
241
+ // Add fields appearing in 30%+ of sample tables, excluding infrastructure fields.
242
+ const threshold = Math.max(1, Math.floor(sampleTables.length * 0.3));
243
+ const commonFields = Array.from(fieldFrequency.entries())
244
+ .filter(([key, data]) => data.count >= threshold && !isInfrastructureField(key.split(':')[0]))
245
+ .sort((a, b) => b[1].count - a[1].count)
246
+ .slice(0, 10);
247
+ for (const [key, data] of commonFields) {
248
+ const fieldName = key.split(':')[0];
249
+ if (!fields.find(f => f.name === fieldName)) {
250
+ fields.push({ name: fieldName, edt: data.edt });
251
+ }
252
+ }
253
+ console.log(`[generateSmartTable] Generated ${fields.length} fields from ${tableGroup} table group patterns`);
254
+ }
255
+ }
256
+ catch (error) {
257
+ console.warn(`[generateSmartTable] Pattern analysis failed:`, error);
258
+ // Continue without pattern-based fields
259
+ }
260
+ }
261
+ // Strategy 3: Parse field hints and suggest EDTs
262
+ if (fieldsHint && !copyFrom) {
263
+ console.log(`[generateSmartTable] Parsing field hints: ${fieldsHint}`);
264
+ const hintFields = fieldsHint.split(',').map(s => s.trim()).filter(s => s.length > 0);
265
+ // Guard: reject reserved system field names before any generation attempt.
266
+ // Adding a field named e.g. "CreatedDateTime" produces a compiler error:
267
+ // "Invalid field name; 'CreatedDateTime' is reserved for system fields."
268
+ // The platform auto-provides these fields; users should NOT declare them.
269
+ const reservedHits = hintFields.filter(f => RESERVED_SYSTEM_FIELD_NAMES.has(f.toLowerCase()));
270
+ if (reservedHits.length > 0) {
271
+ return {
272
+ content: [{
273
+ type: 'text',
274
+ text: [
275
+ `❌ **Reserved system field name(s): ${reservedHits.map(f => `"${f}"`).join(', ')}**`,
276
+ ``,
277
+ `These names are reserved by the D365FO platform. Adding a custom field with one of`,
278
+ `these names causes the compiler error:`,
279
+ ` "Invalid field name; '<name>' is reserved for system fields."`,
280
+ ``,
281
+ `**The platform auto-provides these fields** at the table level — you do NOT need to declare them:`,
282
+ ` • \`CreatedDateTime\`, \`ModifiedDateTime\` — auto-tracked creation/modification timestamps`,
283
+ ` • \`CreatedBy\`, \`ModifiedBy\` — auto-tracked user references`,
284
+ ` • \`RecId\`, \`RecVersion\` — system record identity/concurrency`,
285
+ ` • \`DataAreaId\`, \`Partition\` — multi-company/partition isolation`,
286
+ ``,
287
+ `**To fix:** rename the field(s) to a non-reserved name. Examples:`,
288
+ `${reservedHits.map(f => {
289
+ const suggestions = {
290
+ createddatetime: '"NoteDateTime", "DocumentDateTime", "EventDateTime"',
291
+ modifieddatetime: '"LastModifiedOn", "UpdatedDateTime"',
292
+ createdby: '"AuthorId", "RequestedBy"',
293
+ modifiedby: '"LastModifiedUser"',
294
+ };
295
+ return ` • "${f}" → ${suggestions[f.toLowerCase()] ?? '"CustomFieldName"'}`;
296
+ }).join('\n')}`,
297
+ ``,
298
+ `🔄 **Call generate again** with the corrected \`fieldsHint\`.`,
299
+ ].join('\n'),
300
+ }],
301
+ isError: true,
302
+ };
303
+ }
304
+ const hintDb = symbolIndex.getReadDb();
305
+ for (const hint of hintFields) {
306
+ // On duplicate hint names, suffix the second occurrence instead of dropping it.
307
+ let fieldName = hint;
308
+ if (fields.find(f => f.name === fieldName)) {
309
+ let suffix = 2;
310
+ while (fields.find(f => f.name === `${hint}${suffix}`))
311
+ suffix++;
312
+ fieldName = `${hint}${suffix}`;
313
+ console.warn(`[generateSmartTable] Duplicate hint "${hint}" → renamed to "${fieldName}"`);
314
+ }
315
+ const edt = resolveBestEdt(hint, hintDb);
316
+ const hintLower = hint.toLowerCase();
317
+ // Mandatory only when the name IS an identifier (ends with 'Id', or a known PK pattern) —
318
+ // not when it merely contains 'id' mid-word (e.g. ValidFrom, Description).
319
+ const isMandatory = hintLower === 'recid' ||
320
+ /id$/.test(hintLower) ||
321
+ hintLower === 'accountnum' ||
322
+ hintLower === 'accountnumber' ||
323
+ hintLower === 'num' ||
324
+ hintLower === 'code';
325
+ fields.push({
326
+ name: fieldName,
327
+ edt,
328
+ mandatory: isMandatory,
329
+ });
330
+ }
331
+ console.log(`[generateSmartTable] Added ${hintFields.length} fields from hints`);
332
+ }
333
+ // Fallback: Generate sensible defaults when no fields were provided at all
334
+ if (fields.length === 0) {
335
+ usedFallback = true;
336
+ console.warn(`[generateSmartTable] No fieldsHint provided — generating GENERIC defaults only. The table will be incomplete!`);
337
+ const nameLower = name.toLowerCase();
338
+ if (nameLower.includes('account') || tableGroup === 'Main') {
339
+ fields.push({ name: 'AccountNum', edt: 'CustAccount', mandatory: true });
340
+ fields.push({ name: 'Name', edt: 'Name' });
341
+ fields.push({ name: 'Description', edt: 'Description' });
342
+ }
343
+ else if (tableGroup === 'Transaction') {
344
+ fields.push({ name: 'AccountNum', edt: 'LedgerAccount', mandatory: true });
345
+ fields.push({ name: 'TransDate', edt: 'TransDate' });
346
+ fields.push({ name: 'Amount', edt: 'AmountMST' });
347
+ }
348
+ else if (tableGroup === 'Parameter') {
349
+ fields.push({ name: 'Key', edt: 'String255', mandatory: true });
350
+ fields.push({ name: 'Value', edt: 'String255' });
351
+ }
352
+ else {
353
+ fields.push({ name: 'RecId', edt: 'RecId', mandatory: true });
354
+ }
355
+ }
356
+ // Resolve each field's base type from edt_metadata (EDT fields otherwise default to
357
+ // AxTableFieldString even for Real/Date/Int64 EDTs), and validate EDTs exist in the index.
358
+ const edtWarnings = [];
359
+ const missingEdts = [];
360
+ {
361
+ const db = symbolIndex.getReadDb();
362
+ for (const f of fields) {
363
+ // A resolved "EDT" may actually be an enum name; an enum-backed field needs
364
+ // AxTableFieldEnum + EnumType, not AxTableFieldString + ExtendedDataType.
365
+ if (f.edt && !f.enumType && isEnumName(f.edt, db)) {
366
+ f.enumType = f.edt;
367
+ f.type = 'Enum';
368
+ f.edt = undefined;
369
+ continue;
370
+ }
371
+ if (f.edt && !f.type) {
372
+ // Prefer the bridge (live IMetadataProvider) for the base type: the symbol index
373
+ // stores extends=null for ROOT Date/Real/Int64 EDTs, so it can't distinguish them
374
+ // from String-based EDTs. Fall back to the index/heuristic when no bridge is available.
375
+ f.type = await bridgeEdtBaseType(bridge, f.edt)
376
+ ?? resolveEdtBaseType(f.edt, db)
377
+ ?? heuristicEdtBaseType(f.edt);
378
+ }
379
+ // Validate EDT exists in the symbol index
380
+ if (f.edt) {
381
+ const edtExists = validateEdtExists(f.edt, db);
382
+ if (!edtExists) {
383
+ edtWarnings.push(`⚠️ Field "${f.name}": "${f.edt}" not found in indexed metadata as an EDT or enum — if it is a same-session custom type, call update_symbol_index on its file first, then regenerate. Otherwise this will cause a build error.`);
384
+ missingEdts.push({ field: f.name, edt: f.edt });
385
+ }
386
+ }
387
+ }
388
+ }
389
+ // BP rule BPErrorEDTNotMigrated: a field whose EDT carries an implicit relation
390
+ // (e.g. ItemId → InventTable) requires an explicit table relation. Auto-detect
391
+ // from edt_metadata.reference_table and generate matching relations.
392
+ {
393
+ const db = symbolIndex.getReadDb();
394
+ for (const f of fields) {
395
+ if (!f.edt)
396
+ continue;
397
+ // Skip if a relation for this field already exists
398
+ if (relations.some(r => r.constraints.some(c => c.field === f.name)))
399
+ continue;
400
+ try {
401
+ const edtRow = db.prepare(`SELECT reference_table FROM edt_metadata WHERE edt_name = ? AND reference_table IS NOT NULL AND reference_table != '' LIMIT 1`).get(f.edt);
402
+ if (edtRow?.reference_table) {
403
+ // The EDT name is typically the PK field name on the target table too
404
+ // (e.g. ItemId EDT → InventTable.ItemId).
405
+ const relatedField = f.edt;
406
+ relations.push({
407
+ name: f.name,
408
+ targetTable: edtRow.reference_table,
409
+ constraints: [{ field: f.name, relatedField }],
410
+ });
411
+ console.log(`[generateSmartTable] Auto-migrated EDT relation: ${f.name} (${f.edt}) → ${edtRow.reference_table}.${relatedField}`);
412
+ }
413
+ }
414
+ catch {
415
+ // Skip if edt_metadata query fails
416
+ }
417
+ }
418
+ }
419
+ // If primaryKeyFields is specified, mark those fields as mandatory (overrides auto-detection)
420
+ if (primaryKeyFields && primaryKeyFields.length > 0) {
421
+ for (const pkFieldName of primaryKeyFields) {
422
+ const f = fields.find(f => f.name === pkFieldName);
423
+ if (f) {
424
+ f.mandatory = true;
425
+ }
426
+ }
427
+ }
428
+ // Ensure primary key index exists
429
+ const hasAnyUniqueIndex = indexes.some(idx => idx.unique || idx.clustered);
430
+ if (!hasAnyUniqueIndex && fields.length > 0) {
431
+ if (primaryKeyFields && primaryKeyFields.length > 0) {
432
+ // Use explicitly provided composite/single PK fields
433
+ indexes.unshift(builder.buildPrimaryKeyIndex(name, primaryKeyFields));
434
+ console.log(`[generateSmartTable] Added primary key index on [${primaryKeyFields.join(', ')}] (from primaryKeyFields)`);
435
+ }
436
+ else {
437
+ // Auto-detect: prefer first mandatory non-RecId field, fall back to RecId
438
+ const pkField = fields.find(f => f.mandatory && f.name !== 'RecId')?.name
439
+ ?? fields.find(f => f.name === 'RecId')?.name
440
+ ?? fields[0].name;
441
+ indexes.unshift(builder.buildPrimaryKeyIndex(name, [pkField]));
442
+ console.log(`[generateSmartTable] Added primary key index on ${pkField}`);
443
+ }
444
+ }
445
+ // Determine package path
446
+ // Ensure .mcp.json is loaded before reading packagePath — getPackagePath() is synchronous
447
+ // and may miss packagePath from config if ensureLoaded() was not yet called.
448
+ const configManager = getConfigManager();
449
+ await configManager.ensureLoaded();
450
+ // Prefer the bridge's custom packages root (where bridge-backed writes actually land,
451
+ // e.g. a repo metadata checkout like K:\repos\…\metadata) so the exists-guard, the
452
+ // fallback write target, and the reported path all match the real write location.
453
+ // Falls back to the standard PackagesLocalDirectory for traditional environments.
454
+ const customPackagesRoot = await configManager.getCustomPackagesPath();
455
+ const resolvedPackagePath = argPackagePath || customPackagesRoot || configManager.getPackagePath();
456
+ // getPackagePath() already probes C:\ and K:\ well-known locations before returning null,
457
+ // so reaching here with null means neither location exists on this machine.
458
+ if (!resolvedPackagePath && process.platform === 'win32') {
459
+ throw new Error('\u274c Cannot determine PackagesLocalDirectory path.\n\n' +
460
+ 'Neither C:\\AosService\\PackagesLocalDirectory nor K:\\AosService\\PackagesLocalDirectory were found.\n\n' +
461
+ 'If your D365FO installation is on a different drive, add one of the following to your .mcp.json:\n' +
462
+ ' \u2022 "packagePath": "<drive>:\\\\AosService\\\\PackagesLocalDirectory"\n' +
463
+ ' \u2022 "workspacePath": "<drive>:\\\\AosService\\\\PackagesLocalDirectory\\\\YourModel"\n' +
464
+ ' \u2022 "projectPath": "<drive>:\\\\VSProjects\\\\YourSolution\\\\YourProject\\\\YourProject.rnrproj"\n\n' +
465
+ 'Or pass packagePath directly to this tool call.\n\n' +
466
+ 'UDE environments: packagePath is not used — configure customPackagesPath/microsoftPackagesPath instead.');
467
+ }
468
+ const packagePath = resolvedPackagePath || 'K:\\AosService\\PackagesLocalDirectory';
469
+ // Resolve project/solution path — fall back to configManager (from .mcp.json / auto-detection)
470
+ let resolvedProjectPath = projectPath;
471
+ let resolvedSolutionPath = solutionPath;
472
+ if (!resolvedProjectPath && !resolvedSolutionPath) {
473
+ resolvedProjectPath = (await configManager.getProjectPath()) || undefined;
474
+ resolvedSolutionPath = (await configManager.getSolutionPath()) || undefined;
475
+ if (resolvedProjectPath) {
476
+ console.log(`[generateSmartTable] Using projectPath from config/auto-detect: ${resolvedProjectPath}`);
477
+ }
478
+ else if (resolvedSolutionPath) {
479
+ console.log(`[generateSmartTable] Using solutionPath from config/auto-detect: ${resolvedSolutionPath}`);
480
+ }
481
+ }
482
+ // Resolve actual model name — always prefer extracting from .rnrproj over using modelName arg
483
+ let resolvedModel = modelName;
484
+ if (resolvedProjectPath) {
485
+ const extracted = extractModelFromProject(resolvedProjectPath);
486
+ if (extracted) {
487
+ resolvedModel = extracted;
488
+ console.log(`[generateSmartTable] Extracted model from .rnrproj: ${resolvedModel}`);
489
+ }
490
+ }
491
+ else if (resolvedSolutionPath) {
492
+ const project = findProjectInSolution(resolvedSolutionPath);
493
+ if (project) {
494
+ const extracted = extractModelFromProject(project);
495
+ if (extracted) {
496
+ resolvedModel = extracted;
497
+ console.log(`[generateSmartTable] Extracted model from solution .rnrproj: ${resolvedModel}`);
498
+ }
499
+ }
500
+ }
501
+ const isNonWindows = process.platform !== 'win32';
502
+ if (!resolvedModel) {
503
+ // Both Windows and Azure/Linux: .rnrproj extraction failed (or wasn't attempted).
504
+ // Fall back in this order:
505
+ // 1. .mcp.json context (modelName field or last segment of workspacePath) — user explicitly configured
506
+ // 2. Auto-detected model name (async) — e.g. from PackagesLocalDirectory regex in well-known paths scan
507
+ // 3. D365FO_MODEL_NAME env var
508
+ // 4. modelName arg — LAST because the AI often passes a placeholder like "any" or "whatever"
509
+ // Only throw when every source is exhausted.
510
+ const configModel = configManager.getModelName();
511
+ const autoModel = configModel ? null : (await configManager.getAutoDetectedModelName());
512
+ resolvedModel = configModel || autoModel || process.env.D365FO_MODEL_NAME || modelName || undefined;
513
+ if (resolvedModel) {
514
+ const ctx = configManager.getContext();
515
+ const source = configModel === resolvedModel
516
+ ? (ctx?.modelName ? 'modelName (mcp.json)' : 'workspacePath (mcp.json)')
517
+ : autoModel === resolvedModel ? 'auto-detected (well-known paths)'
518
+ : process.env.D365FO_MODEL_NAME === resolvedModel ? 'D365FO_MODEL_NAME env var'
519
+ : 'modelName arg (fallback)';
520
+ console.log(`[generateSmartTable] Using model from ${source}: ${resolvedModel}`);
521
+ }
522
+ else if (!isNonWindows) {
523
+ // Windows VM: all sources exhausted — tell the user exactly what to configure.
524
+ throw new Error('Could not resolve model name. Provide modelName, projectPath, or solutionPath, ' +
525
+ 'or configure projectPath/solutionPath in .mcp.json or set D365FO_MODEL_NAME env var.');
526
+ }
527
+ // Non-Windows: if still null we continue without a prefix (XML will be returned as text).
528
+ }
529
+ console.log(`[generateSmartTable] Using model: ${resolvedModel ?? '(none — no prefix)'}`);
530
+ // Apply extension prefix to table name (skip when model unknown)
531
+ const objectPrefix = resolvedModel ? resolveObjectPrefix(resolvedModel) : '';
532
+ let finalName = objectPrefix ? applyObjectPrefix(name, objectPrefix) : name;
533
+ const objectSuffix = getObjectSuffix();
534
+ finalName = applyObjectSuffix(finalName, objectSuffix);
535
+ if (finalName !== name) {
536
+ console.log(`[generateSmartTable] Applied naming: ${name} → ${finalName}`);
537
+ }
538
+ // Generate standard methods (find, exist) based on primary key fields
539
+ const generatedMethods = [];
540
+ if (requestedMethods && requestedMethods.length > 0) {
541
+ // Determine primary key fields from unique non-RecId index, or first non-RecId fields
542
+ const uniqueIdx = indexes.find(idx => idx.unique && !idx.fields.every(f => f === 'RecId'));
543
+ const pkFields = uniqueIdx
544
+ ? uniqueIdx.fields.filter(f => f !== 'RecId')
545
+ : fields.filter(f => f.name !== 'RecId').slice(0, 1).map(f => f.name);
546
+ const buildParams = (withType) => pkFields.map(f => {
547
+ const edt = fields.find(fld => fld.name === f)?.edt || 'str';
548
+ return withType ? `${edt} _${f.charAt(0).toLowerCase() + f.slice(1)}` : `_${f.charAt(0).toLowerCase() + f.slice(1)}`;
549
+ }).join(', ');
550
+ const whereClause = pkFields
551
+ .map(f => `${finalName}.${f} == _${f.charAt(0).toLowerCase() + f.slice(1)}`)
552
+ .join('\n && ');
553
+ for (const methodName of requestedMethods) {
554
+ if (methodName === 'find') {
555
+ const params = buildParams(true);
556
+ generatedMethods.push({
557
+ name: 'find',
558
+ source: [
559
+ `public static ${finalName} find(${params}, boolean _forupdate = false)`,
560
+ `{`,
561
+ ` ${finalName} local;`,
562
+ ``,
563
+ ` if (_forupdate)`,
564
+ ` {`,
565
+ ` local.selectForUpdate(_forupdate);`,
566
+ ` }`,
567
+ ``,
568
+ ` select firstOnly local`,
569
+ ` where ${whereClause};`,
570
+ ``,
571
+ ` return local;`,
572
+ `}`,
573
+ ].join('\n'),
574
+ });
575
+ }
576
+ else if (methodName === 'exist') {
577
+ const params = buildParams(true);
578
+ generatedMethods.push({
579
+ name: 'exist',
580
+ source: [
581
+ `public static boolean exist(${params})`,
582
+ `{`,
583
+ ` return (select firstOnly RecId from ${finalName}`,
584
+ ` where ${whereClause}).RecId != 0;`,
585
+ `}`,
586
+ ].join('\n'),
587
+ });
588
+ }
589
+ }
590
+ if (generatedMethods.length > 0) {
591
+ console.log(`[generateSmartTable] Generated methods: ${generatedMethods.map(m => m.name).join(', ')}`);
592
+ }
593
+ }
594
+ // HARD-BLOCK: when no fieldsHint was provided (and no copyFrom / generateCommonFields),
595
+ // return an error immediately — do NOT generate any XML that the AI might use.
596
+ // The AI MUST retry with explicit fieldsHint extracted from the user's description.
597
+ if (usedFallback) {
598
+ console.error(`[generateSmartTable] ❌ BLOCKED — fieldsHint not provided for table "${name}"`);
599
+ return {
600
+ content: [{
601
+ type: 'text',
602
+ text: [
603
+ `❌ **CANNOT GENERATE TABLE — \`fieldsHint\` is REQUIRED!**`,
604
+ ``,
605
+ `The user described specific fields but you did NOT pass \`fieldsHint\`. Without it the table`,
606
+ `will be empty (no fields, no indexes, no methods). No XML has been generated.`,
607
+ ``,
608
+ `🔄 **YOU MUST call \`generate\` AGAIN** with ALL fields extracted from the user's description:`,
609
+ ``,
610
+ `\`\`\``,
611
+ `generate_object(mode="scaffold", `,
612
+ ` objectType="table",`,
613
+ ` name="${name}", ← base name WITHOUT model prefix`,
614
+ ` fieldsHint="Field1, Field2, Field3", ← REQUIRED: extract ALL fields from the user`,
615
+ ` primaryKeyFields=["Field1", "Field2"], ← ALL PK fields (omit for single-field PK)`,
616
+ ` methods=["find", "exist"], ← include if user requested these`,
617
+ ` tableGroup="${tableGroup}",`,
618
+ `)`,
619
+ `\`\`\``,
620
+ ``,
621
+ `**Common Czech → D365FO field name mappings:**`,
622
+ `| User phrase | fieldsHint value |`,
623
+ `|-------------|-----------------|`,
624
+ `| "Account number" / "číslo účtu" | \`AccountNum\` |`,
625
+ `| "Name" / "název" | \`Name\` |`,
626
+ `| "Description" / "popis" | \`Description\` |`,
627
+ `| "platnost od" / "from date" / "valid from" | \`ValidFrom\` |`,
628
+ `| "platnost do" / "to date" / "valid to" | \`ValidTo\` |`,
629
+ `| "active" / "aktivní" / "flag" | \`Active\` |`,
630
+ ``,
631
+ `⛔ NEVER call \`d365fo_file(action="create")\` without first regenerating — there is no XML to use.`,
632
+ `⛔ NEVER call \`d365fo_file(action="modify")\` to add missing fields — it CANNOT write on Azure/Linux.`,
633
+ ].join('\n'),
634
+ }],
635
+ isError: true,
636
+ };
637
+ }
638
+ // On non-Windows (Azure/Linux): generate XML via SmartXmlBuilder and return as text
639
+ // The bridge is not available on non-Windows — file writing is handled by the local companion.
640
+ if (isNonWindows) {
641
+ const xml = builder.buildTableXml({
642
+ name: finalName,
643
+ label: label || finalName,
644
+ tableGroup,
645
+ tableType,
646
+ fields,
647
+ indexes,
648
+ relations,
649
+ methods: generatedMethods.length > 0 ? generatedMethods : undefined,
650
+ });
651
+ console.log(`[generateSmartTable] Generated XML for Azure/Linux (${xml.length} bytes)`);
652
+ const noModelNote = resolvedModel
653
+ ? ''
654
+ : `\n> ⚠️ No model resolved — XML generated without prefix. Pass \`modelName\` with the actual model name from .mcp.json (e.g. \`"ContosoExt"\`) for correct object naming.\n> 🚨 **IMPORTANT**: Do NOT add a prefix to the \`name\` parameter when calling this tool — the tool applies the prefix automatically from \`modelName\`. Passing a name that already includes the prefix will result in double-prefixing.`;
655
+ const nextStep = [
656
+ ``,
657
+ `**✅ MANDATORY NEXT STEP — immediately call \`d365fo_file(action="create")\` with the XML below:**`,
658
+ `\`\`\``,
659
+ `d365fo_file(action="create", `,
660
+ ` objectType="table",`,
661
+ ` objectName="${finalName}",`,
662
+ ` xmlContent="<copy the full XML block below>",`,
663
+ ` addToProject=true`,
664
+ `)`,
665
+ `\`\`\``,
666
+ `⛔ NEVER use \`create_file\`, PowerShell scripts, or any built-in file tool — they corrupt D365FO metadata and break VS project integration.`,
667
+ `⛔ NEVER call \`d365fo_file(action="modify")\` to add methods — the \`methods\` parameter in \`generate\` already embedded them in the XML above.`,
668
+ `⛔ NEVER call \`analyze_code(mode="implementations")\` or \`analyze_code(mode="api-usage")\` between this step and \`d365fo_file(action="create")\` — those tools are expensive and their result is not needed for file creation. Call them AFTER the file is created if the user explicitly asks.`,
669
+ ].join('\n');
670
+ const edtWarningBlock = edtWarnings.length > 0
671
+ ? `\n### ⚠️ EDT Validation Warnings\n${edtWarnings.join('\n')}\n`
672
+ : '';
673
+ return {
674
+ content: [{
675
+ type: 'text',
676
+ text: [
677
+ `✅ Table XML generated for **${finalName}**` + (resolvedModel ? ` (model: ${resolvedModel})` : ''),
678
+ ` Fields: ${fields.length}, Indexes: ${indexes.length}, Relations: ${relations.length}`,
679
+ edtWarningBlock,
680
+ noModelNote,
681
+ ``,
682
+ `ℹ️ MCP server is running on Azure/Linux — file writing is handled by the local Windows companion. This is the expected hybrid workflow.`,
683
+ nextStep,
684
+ ``,
685
+ `\`\`\`xml`,
686
+ xml,
687
+ `\`\`\``,
688
+ ].join('\n'),
689
+ }],
690
+ };
691
+ }
692
+ // ── Windows: Bridge-first creation via C# CreateSmartTable ──
693
+ // The C# bridge applies all BP-smart defaults (CacheLookup, FieldGroups, DeleteActions,
694
+ // TitleField1/2, PrimaryIndex/ClusteredIndex) using the official IMetadataProvider API.
695
+ // Falls back to SmartXmlBuilder → fs.writeFile if bridge is unavailable.
696
+ // Guard: refuse to overwrite an existing table file via bridge path (would destroy existing methods, fields, etc.)
697
+ if (resolvedModel) {
698
+ const bridgeTargetPath = path.join(packagePath, resolvedModel, resolvedModel, 'AxTable', `${finalName}.xml`).replace(/\//g, '\\');
699
+ if (fs.existsSync(bridgeTargetPath)) {
700
+ throw new Error(`⚠️ Table "${finalName}" already exists at:\n${bridgeTargetPath}\n\n` +
701
+ `\`generate_object(mode="scaffold", objectType="table")\` is for **NEW** tables only.\n` +
702
+ `Use \`d365fo_file(action="modify")\` to add fields, methods, or indexes to an existing table.\n` +
703
+ `Use \`get_object_info(objectType="table", name="${finalName}")\` to inspect the current structure.`);
704
+ }
705
+ }
706
+ if (bridge && resolvedModel) {
707
+ // ── Pre-write reference gate ──────────────────────────────────────────────
708
+ // scaffold's bridge path writes the table to disk in one shot, bypassing the
709
+ // validate_code gate that d365fo_file(create) runs. Refuse to write when a
710
+ // field references an EDT that exists neither in the index NOR on disk — that
711
+ // always fails at build ("metadata error / BPErrorEDT"). An EDT that is on
712
+ // disk but unindexed (a same-session custom type) is allowed through: xppc
713
+ // reads it from disk, so the table builds. (Only the bridge write path is
714
+ // gated; the Azure/Linux text + fs-fallback paths keep their advisory
715
+ // warnings, since the index may legitimately be incomplete there.)
716
+ const modelDir = path.join(packagePath, resolvedModel, resolvedModel).replace(/\//g, '\\');
717
+ const unbuildable = selectUnbuildableEdts(missingEdts, modelDir);
718
+ if (unbuildable.length > 0) {
719
+ return {
720
+ isError: true,
721
+ content: [{
722
+ type: 'text',
723
+ text: [
724
+ `⛔ Refusing to write table **${finalName}** — ${unbuildable.length} field(s) reference an EDT that exists neither in the index nor on disk:`,
725
+ ...unbuildable.map(u => ` • Field "${u.field}" → EDT "${u.edt}" (not found)`),
726
+ ``,
727
+ `Writing now would produce a table that fails to build. Fix the EDT name(s) — use`,
728
+ `suggest_edt or search to find the correct one. For a same-session custom EDT, create`,
729
+ `the EDT first (and call \`update_symbol_index\` on its file), then re-run scaffold.`,
730
+ ].join('\n'),
731
+ }],
732
+ };
733
+ }
734
+ console.log(`[generateSmartTable] Attempting bridge-first creation for ${finalName}...`);
735
+ const bridgeResult = await bridgeCreateSmartTable(bridge, {
736
+ objectName: finalName,
737
+ modelName: resolvedModel,
738
+ tableGroup,
739
+ tableType,
740
+ label: label || finalName,
741
+ fields: fields.map(f => ({
742
+ name: f.name,
743
+ fieldType: f.type || undefined,
744
+ edt: f.edt || undefined,
745
+ enumType: f.enumType || undefined,
746
+ mandatory: f.mandatory || false,
747
+ label: f.label || undefined,
748
+ })),
749
+ indexes: indexes.map(ix => ({
750
+ name: ix.name,
751
+ fields: ix.fields,
752
+ allowDuplicates: !ix.unique,
753
+ alternateKey: !!ix.unique,
754
+ })),
755
+ relations: relations.map(rel => ({
756
+ name: rel.name,
757
+ relatedTable: rel.targetTable,
758
+ constraints: rel.constraints.map(c => ({
759
+ field: c.field,
760
+ relatedField: c.relatedField,
761
+ })),
762
+ })),
763
+ methods: generatedMethods.length > 0
764
+ ? generatedMethods.map(m => ({ name: m.name, source: m.source }))
765
+ : undefined,
766
+ });
767
+ if (bridgeResult?.success && bridgeResult.filePath) {
768
+ console.log(`[generateSmartTable] ✅ Created via C# bridge: ${bridgeResult.filePath}`);
769
+ // Add to Visual Studio project
770
+ let projectMessage = '';
771
+ const effectiveProjectPath = resolvedProjectPath ||
772
+ (await getConfigManager().getProjectPath()) ||
773
+ undefined;
774
+ if (effectiveProjectPath) {
775
+ try {
776
+ const projectManager = new ProjectFileManager();
777
+ const wasAdded = await projectManager.addToProject(effectiveProjectPath, 'table', finalName, bridgeResult.filePath);
778
+ projectMessage = wasAdded
779
+ ? `\n✅ Added to Visual Studio project:\n📋 Project: ${effectiveProjectPath}`
780
+ : `\n✅ Already in Visual Studio project:\n📋 Project: ${effectiveProjectPath}`;
781
+ }
782
+ catch (projErr) {
783
+ projectMessage = `\n⚠️ File created but could not be added to project: ${projErr instanceof Error ? projErr.message : String(projErr)}`;
784
+ }
785
+ }
786
+ else {
787
+ projectMessage = `\n⚠️ addToProject skipped — no projectPath found in .mcp.json or tool args.`;
788
+ }
789
+ const edtWarningBlock = edtWarnings.length > 0
790
+ ? `\n### ⚠️ EDT Validation Warnings\n${edtWarnings.join('\n')}\n`
791
+ : '';
792
+ const bp = bridgeResult.bpDefaults;
793
+ const bpSummary = bp
794
+ ? `\n📋 BP Defaults: CacheLookup=${bp.cacheLookup}, SaveDataPerCo=${bp.saveDataPerCompany}, ` +
795
+ `TitleField1=${bp.titleField1 ?? '(none)'}, TitleField2=${bp.titleField2 ?? '(none)'}, ` +
796
+ `PrimaryIdx=${bp.primaryIndex ?? '(none)'}, ClusteredIdx=${bp.clusteredIndex ?? '(none)'}, ` +
797
+ `FieldGroups=${bp.fieldGroupCount ?? 5}, DeleteActions=${bp.deleteActionCount ?? 0}`
798
+ : '';
799
+ return {
800
+ content: [
801
+ {
802
+ type: 'text',
803
+ text: [
804
+ `✅ Table **${finalName}** created via C# DevTools API (IMetadataProvider).`,
805
+ ``,
806
+ `📁 File: ${bridgeResult.filePath}`,
807
+ `📦 Model: ${resolvedModel}`,
808
+ `📊 Fields: ${fields.length}, Indexes: ${indexes.length}, Relations: ${relations.length}`,
809
+ `🔧 API: ${bridgeResult.api ?? 'IMetaTableProvider.Create (Smart)'}`,
810
+ bpSummary,
811
+ edtWarningBlock,
812
+ projectMessage,
813
+ ``,
814
+ `⛔ DO NOT call \`d365fo_file(action="create")\` — the file is already written to disk at the path above. Calling d365fo_file would create a DUPLICATE at a different path which causes build conflicts.`,
815
+ `⛔ DO NOT call \`generate\` again — task is COMPLETE.`,
816
+ ``,
817
+ `Next steps for the user:`,
818
+ `1. Reload the project in Visual Studio (or close/reopen solution)`,
819
+ `2. Build the project to synchronize the table`,
820
+ `3. Refresh AOT to see the new object`,
821
+ ].join('\n'),
822
+ },
823
+ ],
824
+ };
825
+ }
826
+ // Bridge failed — fall through to SmartXmlBuilder fallback
827
+ console.warn(`[generateSmartTable] Bridge createSmartTable failed, falling back to SmartXmlBuilder`);
828
+ }
829
+ // ── Fallback: SmartXmlBuilder → fs.writeFile (no bridge or bridge unavailable) ──
830
+ // Generate XML
831
+ const xml = builder.buildTableXml({
832
+ name: finalName,
833
+ label: label || finalName,
834
+ tableGroup,
835
+ tableType,
836
+ fields,
837
+ indexes,
838
+ relations,
839
+ methods: generatedMethods.length > 0 ? generatedMethods : undefined,
840
+ });
841
+ console.log(`[generateSmartTable] Generated XML via SmartXmlBuilder (${xml.length} bytes)`);
842
+ // Write to file
843
+ const targetPath = path.join(packagePath, resolvedModel, resolvedModel, 'AxTable', `${finalName}.xml`);
844
+ // Normalize path to Windows format (backslashes) for consistency
845
+ const normalizedPath = targetPath.replace(/\//g, '\\');
846
+ // Reject Windows paths when running on non-Windows (e.g. Linux Azure proxy)
847
+ if (process.platform !== 'win32' && /^[A-Z]:\\/.test(normalizedPath)) {
848
+ throw new Error(`❌ Cannot create D365FO file on non-Windows system!\n\n` +
849
+ `Attempting to create: ${normalizedPath}\n` +
850
+ `Running on: ${process.platform}\n\n` +
851
+ `The generate tool (objectType="table") requires direct access to the D365FO Windows VM.\n` +
852
+ `Run the MCP server locally on the D365FO Windows VM.`);
853
+ }
854
+ // Verify drive/root exists before attempting recursive mkdir
855
+ const driveOrRoot = path.parse(normalizedPath).root;
856
+ if (driveOrRoot && !fs.existsSync(driveOrRoot)) {
857
+ throw new Error(`❌ Drive or root path does not exist: ${driveOrRoot}\n\n` +
858
+ `Attempting to create: ${normalizedPath}\n\n` +
859
+ `Update "packagePath" in .mcp.json to match your actual D365FO installation.`);
860
+ }
861
+ // Create directory if needed
862
+ const dir = path.dirname(normalizedPath);
863
+ if (!fs.existsSync(dir)) {
864
+ fs.mkdirSync(dir, { recursive: true });
865
+ }
866
+ // Guard: refuse to overwrite an existing table file (would destroy existing methods, fields, etc.)
867
+ if (fs.existsSync(normalizedPath)) {
868
+ throw new Error(`⚠️ Table "${finalName}" already exists at:\n${normalizedPath}\n\n` +
869
+ `\`generate_object(mode="scaffold", objectType="table")\` is for **NEW** tables only.\n` +
870
+ `Use \`d365fo_file(action="modify")\` to add fields, methods, or indexes to an existing table.\n` +
871
+ `Use \`get_object_info(objectType="table", name="${finalName}")\` to inspect the current structure.`);
872
+ }
873
+ // Write file
874
+ fs.writeFileSync(normalizedPath, normalizeD365Xml(xml), 'utf-8');
875
+ console.log(`[generateSmartTable] Created file: ${normalizedPath}`);
876
+ // Add to Visual Studio project if a projectPath is known
877
+ let projectMessage = '';
878
+ const effectiveProjectPath = resolvedProjectPath ||
879
+ (await getConfigManager().getProjectPath()) ||
880
+ undefined;
881
+ if (effectiveProjectPath) {
882
+ try {
883
+ const projectManager = new ProjectFileManager();
884
+ const wasAdded = await projectManager.addToProject(effectiveProjectPath, 'table', finalName, normalizedPath);
885
+ projectMessage = wasAdded
886
+ ? `\n✅ Added to Visual Studio project:\n📋 Project: ${effectiveProjectPath}`
887
+ : `\n✅ Already in Visual Studio project:\n📋 Project: ${effectiveProjectPath}`;
888
+ console.log(`[generateSmartTable] addToProject result: ${wasAdded ? 'added' : 'already present'}`);
889
+ }
890
+ catch (projErr) {
891
+ projectMessage = `\n⚠️ File created but could not be added to project: ${projErr instanceof Error ? projErr.message : String(projErr)}`;
892
+ console.error(`[generateSmartTable] addToProject error:`, projErr);
893
+ }
894
+ }
895
+ else {
896
+ projectMessage = `\n⚠️ addToProject skipped — no projectPath found in .mcp.json or tool args.`;
897
+ }
898
+ const edtWarningBlock = edtWarnings.length > 0
899
+ ? `\n### ⚠️ EDT Validation Warnings\n${edtWarnings.join('\n')}\n`
900
+ : '';
901
+ return {
902
+ content: [
903
+ {
904
+ type: 'text',
905
+ text: [
906
+ `✅ Table **${finalName}** created directly on the Windows VM.`,
907
+ ``,
908
+ `📁 File: ${normalizedPath}`,
909
+ `📦 Model: ${resolvedModel}`,
910
+ `📊 Fields: ${fields.length}, Indexes: ${indexes.length}, Relations: ${relations.length}`,
911
+ edtWarningBlock,
912
+ projectMessage,
913
+ ``,
914
+ `⛔ DO NOT call \`d365fo_file(action="create")\` — the file is already written to disk at the path above. Calling d365fo_file would create a DUPLICATE at a different path which causes build conflicts.`,
915
+ `⛔ DO NOT call \`generate\` again — task is COMPLETE.`,
916
+ ``,
917
+ `Next steps for the user:`,
918
+ `1. Reload the project in Visual Studio (or close/reopen solution)`,
919
+ `2. Build the project to synchronize the table`,
920
+ `3. Refresh AOT to see the new object`,
921
+ ].join('\n'),
922
+ },
923
+ ],
924
+ };
925
+ }
926
+ /**
927
+ * Resolve an EDT's primitive base type via the C# bridge (live IMetadataProvider).
928
+ *
929
+ * The bridge reads the real AxEdt element type (AxEdtDate/AxEdtReal/AxEdtInt64/…),
930
+ * so it correctly distinguishes a ROOT Date/Real EDT from a String one — which the
931
+ * symbol index CANNOT, because it stores extends=null for root EDTs regardless of
932
+ * their primitive. Returns a token compatible with resolveEdtBaseType
933
+ * (String/Integer/Real/Date/Int64/Guid/…), or undefined when the bridge is
934
+ * unavailable, doesn't know the EDT, or reports it as Enum (enum-backed EDTs are
935
+ * handled separately via the enumType path, so we must not emit a bare "Enum" here).
936
+ */
937
+ export async function bridgeEdtBaseType(bridge, edtName) {
938
+ if (!bridge?.isReady)
939
+ return undefined;
940
+ try {
941
+ const info = await bridge.readEdt(edtName);
942
+ const bt = info?.baseType;
943
+ if (typeof bt !== 'string' || bt.length === 0 || bt === 'Enum')
944
+ return undefined;
945
+ return bt;
946
+ }
947
+ catch {
948
+ return undefined;
949
+ }
950
+ }
951
+ /**
952
+ * Resolve the primitive base type for a D365FO EDT by walking the edt_metadata chain.
953
+ * The `extends` column in edt_metadata stores either a primitive type name
954
+ * (String, Real, Int64, Date, UtcDateTime, Enum, Container, Guid, Integer) or
955
+ * another EDT name. We follow the chain until we reach a primitive type.
956
+ *
957
+ * ⚠️ Index limitation: ROOT EDTs that extend a primitive store extends=null, so this
958
+ * cannot tell a Date/Real root EDT from a String one and defaults such cases to
959
+ * String. Prefer bridgeEdtBaseType() when a bridge is available; this is the
960
+ * offline (Azure/Linux) fallback.
961
+ *
962
+ * Returns a base type string compatible with fieldTypeToAxType(), e.g.:
963
+ * "Qty" → "Real", "TransDate" → "Date", "ItemId" → "String"
964
+ */
965
+ export function resolveEdtBaseType(edtName, db, depth = 0) {
966
+ // D365FO primitive types − these map directly to AxTableField types
967
+ const PRIMITIVES = new Set([
968
+ 'String', 'Integer', 'Int64', 'Real', 'Date', 'UtcDateTime', 'DateTime',
969
+ 'Enum', 'Container', 'Guid', 'GUID',
970
+ ]);
971
+ if (depth > 8)
972
+ return 'String'; // guard against circular chains
973
+ if (PRIMITIVES.has(edtName))
974
+ return edtName;
975
+ try {
976
+ const row = db.prepare(`SELECT extends, enum_type, string_size FROM edt_metadata WHERE edt_name = ? LIMIT 1`).get(edtName);
977
+ // EDT not found in the index (e.g. a custom EDT not yet indexed, or a standard OOB EDT
978
+ // whose index wasn't loaded). Return undefined so callers fall back to EDT-name heuristics
979
+ // in getAxTableFieldType() instead of blindly defaulting to AxTableFieldString.
980
+ if (!row)
981
+ return undefined;
982
+ // Enum-based EDT: extends is null but enum_type is set (e.g. SalesStatus, PurchStatus)
983
+ if (row.enum_type && !row.extends)
984
+ return 'Enum';
985
+ if (!row.extends) {
986
+ // ROOT EDT: the index does NOT record the primitive (AxEdtDate/Real/Int64/String all
987
+ // store extends=null). A real string EDT carries a string_size; without one we genuinely
988
+ // CANNOT tell String from Date/Real/Int64 — so return undefined and let the caller's
989
+ // name heuristic (or the bridge) decide, instead of mislabeling e.g. TransDate/Qty as
990
+ // String. This is the #1 "scaffold turned my date/amount field into a string" bug.
991
+ return row.string_size != null ? 'String' : undefined;
992
+ }
993
+ if (PRIMITIVES.has(row.extends))
994
+ return row.extends;
995
+ // Follow chain to the parent EDT
996
+ return resolveEdtBaseType(row.extends, db, depth + 1);
997
+ }
998
+ catch {
999
+ return undefined;
1000
+ }
1001
+ }
1002
+ /**
1003
+ * Resolve the underlying ENUM NAME for an EDT whose own base type is Enum (e.g. "Posted"
1004
+ * extends the "NoYes" enum, "SalesStatus" extends its own enum). Mirrors the chain-walk in
1005
+ * resolveEdtBaseType() but returns the enum name instead of the literal string "Enum".
1006
+ *
1007
+ * Needed because resolveEdtBaseType() alone can only tell the caller "this field's type is
1008
+ * Enum" — without also knowing WHICH enum, the bridge cannot emit a valid AxTableFieldEnum
1009
+ * (it has no EnumType to write) and silently falls back to AxTableFieldString. This was
1010
+ * discovered live: a table field created with only `{ name, edt: "Posted" }` (no explicit
1011
+ * enumType) resolved `type: 'Enum'` via resolveEdtBaseType() but the created field came back
1012
+ * as plain AxTableFieldString with ExtendedDataType=Posted — a valid-looking but semantically
1013
+ * wrong field (the compiler accepts a String-typed field pointed at an Enum-based EDT via
1014
+ * ExtendedDataType, so this doesn't even fail the build; it just isn't what was asked for).
1015
+ *
1016
+ * Returns undefined when the EDT isn't enum-backed (or isn't indexed).
1017
+ */
1018
+ export function resolveEdtEnumType(edtName, db, depth = 0) {
1019
+ if (depth > 8)
1020
+ return undefined; // guard against circular chains
1021
+ try {
1022
+ const row = db.prepare(`SELECT extends, enum_type FROM edt_metadata WHERE edt_name = ? LIMIT 1`).get(edtName);
1023
+ if (!row)
1024
+ return undefined;
1025
+ // Enum-based EDT: extends is null but enum_type is set (e.g. Posted → NoYes)
1026
+ if (row.enum_type && !row.extends)
1027
+ return row.enum_type;
1028
+ if (!row.extends)
1029
+ return undefined; // root EDT of a non-enum primitive
1030
+ if (row.extends === 'Enum')
1031
+ return undefined; // extends the bare primitive, no named enum
1032
+ // Follow the chain to the parent EDT (e.g. a custom EDT extending "Posted")
1033
+ return resolveEdtEnumType(row.extends, db, depth + 1);
1034
+ }
1035
+ catch {
1036
+ return undefined;
1037
+ }
1038
+ }
1039
+ /**
1040
+ * Heuristic base type from an EDT/field name when the EDT is not in the index
1041
+ * (e.g. a standard EDT whose edt_metadata wasn't loaded, or a same-session EDT).
1042
+ * Mirrors SmartXmlBuilder.getAxTableFieldType's name heuristics but returns the
1043
+ * primitive base type so it can be passed explicitly to the C# bridge (which
1044
+ * otherwise defaults unknown EDTs to AxTableFieldString).
1045
+ * Returns undefined for genuinely unrecognizable names (caller keeps EDT-as-string).
1046
+ */
1047
+ export function heuristicEdtBaseType(edtName) {
1048
+ const e = edtName.toLowerCase();
1049
+ if (e === 'recid' || e.endsWith('recid') || e.includes('refrecid'))
1050
+ return 'Int64';
1051
+ // Any "...DateTime" name (TransDateTime, CreatedDateTime, ModifiedDateTime, UtcDateTime,
1052
+ // ...) is UtcDateTime-based. The previous `&& !e.includes('transdate')` guard was meant
1053
+ // to protect something else but instead excluded the single most common case: a name
1054
+ // containing BOTH "datetime" and "transdate" (e.g. "TransDateTime" itself, since
1055
+ // "transdatetime" contains "transdate" as a substring) fell through this branch entirely
1056
+ // AND the next Date branch (which excludes names containing "time"), so it resolved to
1057
+ // undefined and the caller defaulted the field to plain AxTableFieldString.
1058
+ if (e.includes('datetime'))
1059
+ return 'UtcDateTime';
1060
+ if (e.includes('date') && !e.includes('time') && !e.includes('update'))
1061
+ return 'Date';
1062
+ if (e.includes('amount') || e.includes('price') || e.includes('qty') || e.includes('quantity')
1063
+ || e.includes('percent') || e.includes('rate') || e === 'real' || e.endsWith('mst'))
1064
+ return 'Real';
1065
+ if ((e.endsWith('int') || e.includes('count') || e.includes('level'))
1066
+ && !e.includes('account') && !e.includes('name'))
1067
+ return 'Integer';
1068
+ return undefined;
1069
+ }
1070
+ /**
1071
+ * Check whether a name refers to an indexed ENUM (not an EDT). Used to emit
1072
+ * AxTableFieldEnum + EnumType instead of AxTableFieldString + ExtendedDataType
1073
+ * for fields whose "EDT" is actually a base enum (e.g. a custom RentStatus enum).
1074
+ */
1075
+ export function isEnumName(name, db) {
1076
+ try {
1077
+ // Index-safe nocase lookup — the former `name = ? COLLATE NOCASE` shape
1078
+ // could not use idx_name_type. Enum rows are always top-level.
1079
+ return lookupSymbolNocase(db, name, ['enum', 'enum-extension']) !== undefined;
1080
+ }
1081
+ catch {
1082
+ return false;
1083
+ }
1084
+ }
1085
+ /**
1086
+ * Check whether an EDT exists in the indexed edt_metadata.
1087
+ * Falls back to checking the symbols table for EDT type entries.
1088
+ */
1089
+ /**
1090
+ * From the EDTs that resolve to neither an indexed EDT nor an enum, select those
1091
+ * that are ALSO absent from disk — i.e. truly missing and guaranteed to fail the
1092
+ * build. An EDT whose `AxEdt/<name>.xml` exists in the model package (a
1093
+ * same-session custom EDT not yet indexed) is NOT returned: xppc reads it from
1094
+ * disk, so the table will build. Used to gate scaffold's one-shot bridge write
1095
+ * without false-blocking the valid same-session-EDT workflow.
1096
+ *
1097
+ * `existsOnDisk` is injectable for testing; defaults to fs.existsSync.
1098
+ */
1099
+ export function selectUnbuildableEdts(missingEdts, modelDir, existsOnDisk = fs.existsSync) {
1100
+ return missingEdts.filter(({ edt }) => {
1101
+ const edtFile = path.join(modelDir, 'AxEdt', `${edt}.xml`);
1102
+ return !existsOnDisk(edtFile);
1103
+ });
1104
+ }
1105
+ function validateEdtExists(edtName, db) {
1106
+ // Skip validation for well-known D365FO primitive/system EDTs that may not be in our index
1107
+ const SYSTEM_EDTS = new Set([
1108
+ 'RecId', 'String255', 'Name', 'Description', 'NoYesId', 'RefRecId',
1109
+ ]);
1110
+ if (SYSTEM_EDTS.has(edtName))
1111
+ return true;
1112
+ try {
1113
+ // Check edt_metadata first (most reliable)
1114
+ const edtRow = db.prepare(`SELECT 1 FROM edt_metadata WHERE edt_name = ? LIMIT 1`).get(edtName);
1115
+ if (edtRow)
1116
+ return true;
1117
+ // Fallback: check symbols table for EDT type entries
1118
+ const symRow = db.prepare(`SELECT 1 FROM symbols WHERE name = ? AND type = 'edt' LIMIT 1`).get(edtName);
1119
+ if (symRow)
1120
+ return true;
1121
+ return false;
1122
+ }
1123
+ catch {
1124
+ // If DB query fails, don't block generation — just skip validation
1125
+ return true;
1126
+ }
1127
+ }
1128
+ /**
1129
+ * Suggest EDT based on field name heuristics
1130
+ */
1131
+ /**
1132
+ * D365FO system-managed field names that are reserved by the platform.
1133
+ * Attempting to declare a custom field with one of these names produces
1134
+ * the compiler error: "Invalid field name; '<name>' is reserved for system fields."
1135
+ * The platform auto-provides these fields — users should NOT add them manually.
1136
+ */
1137
+ export const RESERVED_SYSTEM_FIELD_NAMES = new Set([
1138
+ 'createddatetime', 'modifieddatetime',
1139
+ 'createdby', 'modifiedby',
1140
+ 'createdtransactionid', 'modifiedtransactionid',
1141
+ 'recid', 'recversion', 'dataareaid', 'partition',
1142
+ 'tableid', 'instancerelationtype',
1143
+ ]);
1144
+ /** Framework/audit fields that should never be auto-injected from frequency mining. */
1145
+ export function isInfrastructureField(fieldName) {
1146
+ const INFRA = new Set([
1147
+ 'mcrholdcode', 'mcrholduserid', 'mcrholddatetime',
1148
+ 'sortorder', 'displayorder',
1149
+ ...RESERVED_SYSTEM_FIELD_NAMES,
1150
+ ]);
1151
+ return INFRA.has(fieldName.toLowerCase());
1152
+ }
1153
+ /**
1154
+ * Single common field words that, on their own, don't pin down a domain EDT.
1155
+ * A fuzzy EDT that merely prepends a domain prefix to one of these
1156
+ * (e.g. "Status" → "CovStatus", "Type" → "LedgerPostingType") scores high on
1157
+ * containment but is the wrong concept, so for these names we accept only an
1158
+ * exact EDT match and otherwise fall through to the name heuristic / string
1159
+ * default. Multi-word field names like "RentEquipmentId" are specific enough
1160
+ * that a prefixed EDT ("ContosoRentEquipmentId") is a genuinely good match.
1161
+ */
1162
+ const GENERIC_FIELD_WORDS = new Set([
1163
+ 'status', 'type', 'category', 'group', 'code', 'class', 'state', 'kind',
1164
+ 'level', 'priority', 'value', 'key', 'order', 'sequence', 'version',
1165
+ 'mode', 'role', 'reason', 'method', 'action', 'source', 'target', 'color',
1166
+ 'size', 'unit', 'parent', 'child', 'owner', 'number', 'line',
1167
+ ]);
1168
+ /** True when a field name is a single generic word (see GENERIC_FIELD_WORDS). */
1169
+ function isGenericFieldWord(fieldName) {
1170
+ return GENERIC_FIELD_WORDS.has(fieldName.toLowerCase());
1171
+ }
1172
+ /** Confidence (0–1) that an EDT name matches a field name, by containment. */
1173
+ function edtNameConfidence(field, edt) {
1174
+ const f = field.toLowerCase();
1175
+ const e = edt.toLowerCase();
1176
+ if (f === e)
1177
+ return 1.0;
1178
+ if (e.includes(f))
1179
+ return 0.9 - (e.length - f.length) * 0.01;
1180
+ if (f.includes(e))
1181
+ return 0.8 - (f.length - e.length) * 0.01;
1182
+ return 0;
1183
+ }
1184
+ /**
1185
+ * Resolve the best EDT for a field name, preferring real indexed EDTs over name
1186
+ * heuristics. Order: exact EDT-name match → strong fuzzy match (≥0.8) → heuristic
1187
+ * that exists in this environment → weaker fuzzy match (≥0.6) → raw heuristic.
1188
+ */
1189
+ export function resolveBestEdt(fieldName, db) {
1190
+ try {
1191
+ // Exact-case probe on idx_edt_metadata_name; a differently-cased name is
1192
+ // canonicalized through the symbols index (edt_metadata has no FTS) — the
1193
+ // former `= ? COLLATE NOCASE` shape scanned the whole table.
1194
+ const edtExactStmt = db.prepare(`SELECT edt_name FROM edt_metadata WHERE edt_name = ? LIMIT 1`);
1195
+ let exact = edtExactStmt.get(fieldName);
1196
+ if (!exact) {
1197
+ const canonical = lookupSymbolNocase(db, fieldName, ['edt'])?.name;
1198
+ if (canonical && canonical !== fieldName) {
1199
+ exact = edtExactStmt.get(canonical);
1200
+ }
1201
+ }
1202
+ if (exact)
1203
+ return exact.edt_name;
1204
+ // Generic single-word fields don't accept fuzzy matches — a prefixed EDT
1205
+ // (CovStatus for "Status") is a different concept. Only their exact match
1206
+ // above counts; otherwise fall through to the heuristic / string default.
1207
+ const acceptFuzzy = !isGenericFieldWord(fieldName);
1208
+ const candidates = db.prepare(`SELECT edt_name FROM edt_metadata WHERE edt_name LIKE ? COLLATE NOCASE ORDER BY LENGTH(edt_name) ASC LIMIT 30`).all(`%${fieldName}%`);
1209
+ let best = '';
1210
+ let bestConf = 0;
1211
+ for (const c of candidates) {
1212
+ const conf = edtNameConfidence(fieldName, c.edt_name);
1213
+ if (conf > bestConf) {
1214
+ bestConf = conf;
1215
+ best = c.edt_name;
1216
+ }
1217
+ }
1218
+ if (acceptFuzzy && best && bestConf >= 0.8)
1219
+ return best;
1220
+ const heuristic = suggestEdtFromFieldName(fieldName);
1221
+ // If the heuristic only fell back to the generic String255, and the fieldName itself
1222
+ // looks like a PascalCase custom EDT (starts uppercase, ≥5 chars, non-generic), return
1223
+ // the fieldName directly — it's likely a custom EDT not yet in the index.
1224
+ // The edtWarnings system will validate it later and warn if it truly doesn't exist.
1225
+ // Only echo the field name back as a presumed same-session custom EDT when it
1226
+ // looks like a multi-part domain-specific name (≥3 CamelCase tokens, e.g.
1227
+ // "ContosoRentEquipmentId"). Short 1-2 token names like "NoteText" or "NoteId"
1228
+ // are NOT custom EDT echoes — they are generic column names that default to the
1229
+ // heuristic result instead. The edtWarnings system validates echoed names later.
1230
+ const camelTokens = fieldName.split(/(?=[A-Z])/).filter(t => t.length > 0);
1231
+ if (heuristic === 'String255' && acceptFuzzy && camelTokens.length >= 3 && /^[A-Z]/.test(fieldName)) {
1232
+ return fieldName;
1233
+ }
1234
+ if (validateEdtExists(heuristic, db))
1235
+ return heuristic;
1236
+ if (acceptFuzzy && best && bestConf >= 0.6)
1237
+ return best;
1238
+ }
1239
+ catch {
1240
+ /* DB unavailable — fall back to the pure heuristic below */
1241
+ }
1242
+ return suggestEdtFromFieldName(fieldName);
1243
+ }
1244
+ export function suggestEdtFromFieldName(fieldName) {
1245
+ const nameLower = fieldName.toLowerCase();
1246
+ // Common patterns
1247
+ if (nameLower === 'recid')
1248
+ return 'RecId';
1249
+ if (nameLower === 'accountnum' || nameLower === 'accountnumber')
1250
+ return 'CustAccount';
1251
+ if (nameLower.includes('custaccount') || nameLower.includes('customeraccount'))
1252
+ return 'CustAccount';
1253
+ if (nameLower.includes('vendaccount') || (nameLower.includes('vendor') && nameLower.includes('account')))
1254
+ return 'VendAccount';
1255
+ if (nameLower === 'name')
1256
+ return 'Name';
1257
+ if (nameLower.includes('name'))
1258
+ return 'Name';
1259
+ if (nameLower === 'description')
1260
+ return 'Description';
1261
+ if (nameLower.includes('description') || nameLower === 'desc')
1262
+ return 'Description';
1263
+ if (nameLower.includes('subject') || nameLower === 'title')
1264
+ return 'Name';
1265
+ // Long-text / memo fields → Notes (unlimited string, base type String -1)
1266
+ if (nameLower === 'notes' || nameLower === 'note' || nameLower === 'notetext' ||
1267
+ nameLower.endsWith('text') || nameLower.endsWith('notes') ||
1268
+ nameLower === 'body' || nameLower === 'content' || nameLower === 'message')
1269
+ return 'Notes';
1270
+ if (nameLower.includes('amount'))
1271
+ return 'AmountMST';
1272
+ if (nameLower.includes('rate'))
1273
+ return 'AmountMST';
1274
+ if (nameLower.includes('quantity') || nameLower.includes('qty'))
1275
+ return 'Qty';
1276
+ if (nameLower.includes('price'))
1277
+ return 'PriceUnit';
1278
+ // Only the bare effectivity names map to the *DateTime EDTs; other "*date" → TransDate.
1279
+ if (nameLower === 'validfrom')
1280
+ return 'ValidFromDateTime';
1281
+ if (nameLower === 'validto')
1282
+ return 'ValidToDateTime';
1283
+ if (nameLower.includes('datetime') || nameLower.includes('time'))
1284
+ return 'TransDateTime';
1285
+ if (nameLower.includes('date'))
1286
+ return 'TransDate';
1287
+ if (nameLower.includes('account'))
1288
+ return 'LedgerAccount';
1289
+ if (nameLower.includes('customer') || nameLower.includes('cust'))
1290
+ return 'CustAccount';
1291
+ if (nameLower.includes('vendor') || nameLower.includes('vend'))
1292
+ return 'VendAccount';
1293
+ if (nameLower.includes('item'))
1294
+ return 'ItemId';
1295
+ if (nameLower.includes('percent') || nameLower.includes('pct'))
1296
+ return 'Percent';
1297
+ if (nameLower.includes('enabled') || nameLower.includes('active') || nameLower.includes('flag'))
1298
+ return 'NoYesId';
1299
+ // No blanket "*id → Num" / "status → NoYesId" rule: those force the wrong base type.
1300
+ // Such fields fall through to the string default unless resolveBestEdt matches a real EDT.
1301
+ // Default to string
1302
+ return 'String255';
1303
+ }
1304
+ // extractModelFromProject and findProjectInSolution moved to ../utils/projectUtils.ts
1305
+ //# sourceMappingURL=generateSmartTable.js.map