@fusedashlabs/widgets 0.4.5 → 0.5.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 (352) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +24 -3
  3. package/dist/catalog/engine.d.ts +9 -0
  4. package/dist/catalog/engine.d.ts.map +1 -0
  5. package/dist/catalog/engine.js +28 -0
  6. package/dist/catalog/engine.js.map +1 -0
  7. package/dist/catalog/evaluate.d.ts +11 -0
  8. package/dist/catalog/evaluate.d.ts.map +1 -0
  9. package/dist/catalog/evaluate.js +18 -0
  10. package/dist/catalog/evaluate.js.map +1 -0
  11. package/dist/catalog/index.d.ts +8 -0
  12. package/dist/catalog/index.d.ts.map +1 -0
  13. package/dist/catalog/index.js +25 -0
  14. package/dist/catalog/index.js.map +1 -0
  15. package/dist/catalog/load.d.ts +11 -0
  16. package/dist/catalog/load.d.ts.map +1 -0
  17. package/dist/catalog/load.js +140 -0
  18. package/dist/catalog/load.js.map +1 -0
  19. package/dist/catalog/schema.d.ts +5 -0
  20. package/dist/catalog/schema.d.ts.map +1 -0
  21. package/dist/catalog/schema.js +143 -0
  22. package/dist/catalog/schema.js.map +1 -0
  23. package/dist/catalog/types.d.ts +83 -0
  24. package/dist/catalog/types.d.ts.map +1 -0
  25. package/dist/catalog/types.js +45 -0
  26. package/dist/catalog/types.js.map +1 -0
  27. package/dist/catalog/when.d.ts +13 -0
  28. package/dist/catalog/when.d.ts.map +1 -0
  29. package/dist/catalog/when.js +236 -0
  30. package/dist/catalog/when.js.map +1 -0
  31. package/dist/components/approval-bar/element/ui9000-approval-bar.d.ts +17 -0
  32. package/dist/components/approval-bar/element/ui9000-approval-bar.d.ts.map +1 -0
  33. package/dist/components/approval-bar/element/ui9000-approval-bar.js +83 -0
  34. package/dist/components/approval-bar/element/ui9000-approval-bar.js.map +1 -0
  35. package/dist/components/approval-bar/index.d.ts +4 -0
  36. package/dist/components/approval-bar/index.d.ts.map +1 -0
  37. package/dist/components/approval-bar/index.js +11 -0
  38. package/dist/components/approval-bar/index.js.map +1 -0
  39. package/dist/components/approval-bar/lib/normalize.d.ts +7 -0
  40. package/dist/components/approval-bar/lib/normalize.d.ts.map +1 -0
  41. package/dist/components/approval-bar/lib/normalize.js +12 -0
  42. package/dist/components/approval-bar/lib/normalize.js.map +1 -0
  43. package/dist/components/approval-bar/metadata.json.d.ts +99 -0
  44. package/dist/components/approval-bar/metadata.json.js +63 -0
  45. package/dist/components/approval-bar/metadata.json.js.map +1 -0
  46. package/dist/components/bar-chart/metadata.json.d.ts +53 -0
  47. package/dist/components/bar-chart/metadata.json.js +21 -0
  48. package/dist/components/bar-chart/metadata.json.js.map +1 -1
  49. package/dist/components/button/element/ui9000-button.d.ts +15 -0
  50. package/dist/components/button/element/ui9000-button.d.ts.map +1 -0
  51. package/dist/components/button/element/ui9000-button.js +56 -0
  52. package/dist/components/button/element/ui9000-button.js.map +1 -0
  53. package/dist/components/button/index.d.ts +3 -0
  54. package/dist/components/button/index.d.ts.map +1 -0
  55. package/dist/components/button/index.js +9 -0
  56. package/dist/components/button/index.js.map +1 -0
  57. package/dist/components/button/metadata.json.d.ts +99 -0
  58. package/dist/components/button/metadata.json.js +63 -0
  59. package/dist/components/button/metadata.json.js.map +1 -0
  60. package/dist/components/chart-renderer/metadata.json.d.ts +1 -0
  61. package/dist/components/chart-renderer/metadata.json.js +3 -0
  62. package/dist/components/chart-renderer/metadata.json.js.map +1 -1
  63. package/dist/components/checkbox/element/ui9000-checkbox.d.ts +16 -0
  64. package/dist/components/checkbox/element/ui9000-checkbox.d.ts.map +1 -0
  65. package/dist/components/checkbox/element/ui9000-checkbox.js +71 -0
  66. package/dist/components/checkbox/element/ui9000-checkbox.js.map +1 -0
  67. package/dist/components/checkbox/index.d.ts +3 -0
  68. package/dist/components/checkbox/index.d.ts.map +1 -0
  69. package/dist/components/checkbox/index.js +9 -0
  70. package/dist/components/checkbox/index.js.map +1 -0
  71. package/dist/components/checkbox/metadata.json.d.ts +99 -0
  72. package/dist/components/checkbox/metadata.json.js +63 -0
  73. package/dist/components/checkbox/metadata.json.js.map +1 -0
  74. package/dist/components/custom-widget/element/ui9000-custom-widget.d.ts +1 -2
  75. package/dist/components/custom-widget/element/ui9000-custom-widget.d.ts.map +1 -1
  76. package/dist/components/custom-widget/element/ui9000-custom-widget.js +12 -35
  77. package/dist/components/custom-widget/element/ui9000-custom-widget.js.map +1 -1
  78. package/dist/components/custom-widget/index.js +1 -1
  79. package/dist/components/custom-widget/lib/content.d.ts +1 -12
  80. package/dist/components/custom-widget/lib/content.d.ts.map +1 -1
  81. package/dist/components/custom-widget/lib/markdown.d.ts +1 -3
  82. package/dist/components/custom-widget/lib/markdown.d.ts.map +1 -1
  83. package/dist/components/custom-widget/lib/normalize.js +2 -2
  84. package/dist/components/custom-widget/lib/table.d.ts +1 -54
  85. package/dist/components/custom-widget/lib/table.d.ts.map +1 -1
  86. package/dist/components/custom-widget/metadata.json.d.ts +2 -1
  87. package/dist/components/custom-widget/metadata.json.js +4 -1
  88. package/dist/components/custom-widget/metadata.json.js.map +1 -1
  89. package/dist/components/date-input/element/ui9000-date-input.d.ts +16 -0
  90. package/dist/components/date-input/element/ui9000-date-input.d.ts.map +1 -0
  91. package/dist/components/date-input/element/ui9000-date-input.js +71 -0
  92. package/dist/components/date-input/element/ui9000-date-input.js.map +1 -0
  93. package/dist/components/date-input/index.d.ts +3 -0
  94. package/dist/components/date-input/index.d.ts.map +1 -0
  95. package/dist/components/date-input/index.js +9 -0
  96. package/dist/components/date-input/index.js.map +1 -0
  97. package/dist/components/date-input/metadata.json.d.ts +99 -0
  98. package/dist/components/date-input/metadata.json.js +63 -0
  99. package/dist/components/date-input/metadata.json.js.map +1 -0
  100. package/dist/components/entity-detail/element/ui9000-entity-detail.d.ts +17 -0
  101. package/dist/components/entity-detail/element/ui9000-entity-detail.d.ts.map +1 -0
  102. package/dist/components/entity-detail/element/ui9000-entity-detail.js +91 -0
  103. package/dist/components/entity-detail/element/ui9000-entity-detail.js.map +1 -0
  104. package/dist/components/entity-detail/index.d.ts +4 -0
  105. package/dist/components/entity-detail/index.d.ts.map +1 -0
  106. package/dist/components/entity-detail/index.js +11 -0
  107. package/dist/components/entity-detail/index.js.map +1 -0
  108. package/dist/components/entity-detail/lib/normalize.d.ts +17 -0
  109. package/dist/components/entity-detail/lib/normalize.d.ts.map +1 -0
  110. package/dist/components/entity-detail/lib/normalize.js +34 -0
  111. package/dist/components/entity-detail/lib/normalize.js.map +1 -0
  112. package/dist/components/entity-detail/metadata.json.d.ts +110 -0
  113. package/dist/components/entity-detail/metadata.json.js +63 -0
  114. package/dist/components/entity-detail/metadata.json.js.map +1 -0
  115. package/dist/components/event-timeline/element/ui9000-event-timeline.d.ts +17 -0
  116. package/dist/components/event-timeline/element/ui9000-event-timeline.d.ts.map +1 -0
  117. package/dist/components/event-timeline/element/ui9000-event-timeline.js +78 -0
  118. package/dist/components/event-timeline/element/ui9000-event-timeline.js.map +1 -0
  119. package/dist/components/event-timeline/index.d.ts +4 -0
  120. package/dist/components/event-timeline/index.d.ts.map +1 -0
  121. package/dist/components/event-timeline/index.js +11 -0
  122. package/dist/components/event-timeline/index.js.map +1 -0
  123. package/dist/components/event-timeline/lib/normalize.d.ts +10 -0
  124. package/dist/components/event-timeline/lib/normalize.d.ts.map +1 -0
  125. package/dist/components/event-timeline/lib/normalize.js +25 -0
  126. package/dist/components/event-timeline/lib/normalize.js.map +1 -0
  127. package/dist/components/event-timeline/metadata.json.d.ts +124 -0
  128. package/dist/components/event-timeline/metadata.json.js +63 -0
  129. package/dist/components/event-timeline/metadata.json.js.map +1 -0
  130. package/dist/components/evidence-panel/element/ui9000-evidence-panel.d.ts +17 -0
  131. package/dist/components/evidence-panel/element/ui9000-evidence-panel.d.ts.map +1 -0
  132. package/dist/components/evidence-panel/element/ui9000-evidence-panel.js +84 -0
  133. package/dist/components/evidence-panel/element/ui9000-evidence-panel.js.map +1 -0
  134. package/dist/components/evidence-panel/index.d.ts +4 -0
  135. package/dist/components/evidence-panel/index.d.ts.map +1 -0
  136. package/dist/components/evidence-panel/index.js +11 -0
  137. package/dist/components/evidence-panel/index.js.map +1 -0
  138. package/dist/components/evidence-panel/lib/normalize.d.ts +19 -0
  139. package/dist/components/evidence-panel/lib/normalize.d.ts.map +1 -0
  140. package/dist/components/evidence-panel/lib/normalize.js +33 -0
  141. package/dist/components/evidence-panel/lib/normalize.js.map +1 -0
  142. package/dist/components/evidence-panel/metadata.json.d.ts +114 -0
  143. package/dist/components/evidence-panel/metadata.json.js +63 -0
  144. package/dist/components/evidence-panel/metadata.json.js.map +1 -0
  145. package/dist/components/form/element/ui9000-form.d.ts +21 -0
  146. package/dist/components/form/element/ui9000-form.d.ts.map +1 -0
  147. package/dist/components/form/element/ui9000-form.js +115 -0
  148. package/dist/components/form/element/ui9000-form.js.map +1 -0
  149. package/dist/components/form/index.d.ts +4 -0
  150. package/dist/components/form/index.d.ts.map +1 -0
  151. package/dist/components/form/index.js +11 -0
  152. package/dist/components/form/index.js.map +1 -0
  153. package/dist/components/form/lib/normalize.d.ts +14 -0
  154. package/dist/components/form/lib/normalize.d.ts.map +1 -0
  155. package/dist/components/form/lib/normalize.js +36 -0
  156. package/dist/components/form/lib/normalize.js.map +1 -0
  157. package/dist/components/form/metadata.json.d.ts +94 -0
  158. package/dist/components/form/metadata.json.js +63 -0
  159. package/dist/components/form/metadata.json.js.map +1 -0
  160. package/dist/components/histogram-chart/metadata.json.d.ts +47 -0
  161. package/dist/components/histogram-chart/metadata.json.js +21 -0
  162. package/dist/components/histogram-chart/metadata.json.js.map +1 -1
  163. package/dist/components/image/element/ui9000-image.d.ts +17 -0
  164. package/dist/components/image/element/ui9000-image.d.ts.map +1 -0
  165. package/dist/components/image/element/ui9000-image.js +74 -0
  166. package/dist/components/image/element/ui9000-image.js.map +1 -0
  167. package/dist/components/image/index.d.ts +4 -0
  168. package/dist/components/image/index.d.ts.map +1 -0
  169. package/dist/components/image/index.js +13 -0
  170. package/dist/components/image/index.js.map +1 -0
  171. package/dist/components/image/lib/url.d.ts +14 -0
  172. package/dist/components/image/lib/url.d.ts.map +1 -0
  173. package/dist/components/{custom-widget/lib/content.js → image/lib/url.js} +4 -3
  174. package/dist/components/image/lib/url.js.map +1 -0
  175. package/dist/components/image/metadata.json.d.ts +95 -0
  176. package/dist/components/image/metadata.json.js +63 -0
  177. package/dist/components/image/metadata.json.js.map +1 -0
  178. package/dist/components/kpi-widget/metadata.json.d.ts +47 -0
  179. package/dist/components/kpi-widget/metadata.json.js +21 -0
  180. package/dist/components/kpi-widget/metadata.json.js.map +1 -1
  181. package/dist/components/map-chart/metadata.json.d.ts +54 -2
  182. package/dist/components/map-chart/metadata.json.js +23 -2
  183. package/dist/components/map-chart/metadata.json.js.map +1 -1
  184. package/dist/components/multi-select/element/ui9000-multi-select.d.ts +16 -0
  185. package/dist/components/multi-select/element/ui9000-multi-select.d.ts.map +1 -0
  186. package/dist/components/multi-select/element/ui9000-multi-select.js +77 -0
  187. package/dist/components/multi-select/element/ui9000-multi-select.js.map +1 -0
  188. package/dist/components/multi-select/index.d.ts +3 -0
  189. package/dist/components/multi-select/index.d.ts.map +1 -0
  190. package/dist/components/multi-select/index.js +9 -0
  191. package/dist/components/multi-select/index.js.map +1 -0
  192. package/dist/components/multi-select/metadata.json.d.ts +99 -0
  193. package/dist/components/multi-select/metadata.json.js +63 -0
  194. package/dist/components/multi-select/metadata.json.js.map +1 -0
  195. package/dist/components/network-graph/metadata.json.d.ts +53 -2
  196. package/dist/components/network-graph/metadata.json.js +23 -2
  197. package/dist/components/network-graph/metadata.json.js.map +1 -1
  198. package/dist/components/number-input/element/ui9000-number-input.d.ts +16 -0
  199. package/dist/components/number-input/element/ui9000-number-input.d.ts.map +1 -0
  200. package/dist/components/number-input/element/ui9000-number-input.js +71 -0
  201. package/dist/components/number-input/element/ui9000-number-input.js.map +1 -0
  202. package/dist/components/number-input/index.d.ts +3 -0
  203. package/dist/components/number-input/index.d.ts.map +1 -0
  204. package/dist/components/number-input/index.js +9 -0
  205. package/dist/components/number-input/index.js.map +1 -0
  206. package/dist/components/number-input/metadata.json.d.ts +99 -0
  207. package/dist/components/number-input/metadata.json.js +63 -0
  208. package/dist/components/number-input/metadata.json.js.map +1 -0
  209. package/dist/components/select/element/ui9000-select.d.ts +16 -0
  210. package/dist/components/select/element/ui9000-select.d.ts.map +1 -0
  211. package/dist/components/select/element/ui9000-select.js +73 -0
  212. package/dist/components/select/element/ui9000-select.js.map +1 -0
  213. package/dist/components/select/index.d.ts +3 -0
  214. package/dist/components/select/index.d.ts.map +1 -0
  215. package/dist/components/select/index.js +9 -0
  216. package/dist/components/select/index.js.map +1 -0
  217. package/dist/components/select/metadata.json.d.ts +99 -0
  218. package/dist/components/select/metadata.json.js +63 -0
  219. package/dist/components/select/metadata.json.js.map +1 -0
  220. package/dist/components/table/element/styles.d.ts +2 -0
  221. package/dist/components/table/element/styles.d.ts.map +1 -0
  222. package/dist/components/table/element/styles.js +105 -0
  223. package/dist/components/table/element/styles.js.map +1 -0
  224. package/dist/components/table/element/ui9000-table.d.ts +17 -0
  225. package/dist/components/table/element/ui9000-table.d.ts.map +1 -0
  226. package/dist/components/table/element/ui9000-table.js +113 -0
  227. package/dist/components/table/element/ui9000-table.js.map +1 -0
  228. package/dist/components/table/index.d.ts +4 -0
  229. package/dist/components/table/index.d.ts.map +1 -0
  230. package/dist/components/table/index.js +14 -0
  231. package/dist/components/table/index.js.map +1 -0
  232. package/dist/components/table/lib/table.d.ts +55 -0
  233. package/dist/components/table/lib/table.d.ts.map +1 -0
  234. package/dist/components/table/lib/table.js.map +1 -0
  235. package/dist/components/table/metadata.json.d.ts +88 -0
  236. package/dist/components/table/metadata.json.js +63 -0
  237. package/dist/components/table/metadata.json.js.map +1 -0
  238. package/dist/components/text/element/ui9000-text.d.ts +16 -0
  239. package/dist/components/text/element/ui9000-text.d.ts.map +1 -0
  240. package/dist/components/text/element/ui9000-text.js +90 -0
  241. package/dist/components/text/element/ui9000-text.js.map +1 -0
  242. package/dist/components/text/index.d.ts +4 -0
  243. package/dist/components/text/index.d.ts.map +1 -0
  244. package/dist/components/text/index.js +11 -0
  245. package/dist/components/text/index.js.map +1 -0
  246. package/dist/components/text/lib/content.d.ts +2 -0
  247. package/dist/components/text/lib/content.d.ts.map +1 -0
  248. package/dist/components/text/lib/markdown.d.ts +4 -0
  249. package/dist/components/text/lib/markdown.d.ts.map +1 -0
  250. package/dist/components/text/lib/markdown.js.map +1 -0
  251. package/dist/components/text/metadata.json.d.ts +98 -0
  252. package/dist/components/text/metadata.json.js +63 -0
  253. package/dist/components/text/metadata.json.js.map +1 -0
  254. package/dist/components/text-input/element/ui9000-text-input.d.ts +16 -0
  255. package/dist/components/text-input/element/ui9000-text-input.d.ts.map +1 -0
  256. package/dist/components/text-input/element/ui9000-text-input.js +70 -0
  257. package/dist/components/text-input/element/ui9000-text-input.js.map +1 -0
  258. package/dist/components/text-input/index.d.ts +3 -0
  259. package/dist/components/text-input/index.d.ts.map +1 -0
  260. package/dist/components/text-input/index.js +9 -0
  261. package/dist/components/text-input/index.js.map +1 -0
  262. package/dist/components/text-input/metadata.json.d.ts +99 -0
  263. package/dist/components/text-input/metadata.json.js +63 -0
  264. package/dist/components/text-input/metadata.json.js.map +1 -0
  265. package/dist/element/dispatch-ui9000.d.ts +11 -0
  266. package/dist/element/dispatch-ui9000.d.ts.map +1 -0
  267. package/dist/element/dispatch-ui9000.js +21 -0
  268. package/dist/element/dispatch-ui9000.js.map +1 -0
  269. package/dist/element/surface-styles.d.ts +2 -0
  270. package/dist/element/surface-styles.d.ts.map +1 -0
  271. package/dist/element/surface-styles.js +84 -0
  272. package/dist/element/surface-styles.js.map +1 -0
  273. package/dist/index.d.ts +18 -2
  274. package/dist/index.d.ts.map +1 -1
  275. package/dist/index.js +99 -2
  276. package/dist/index.js.map +1 -1
  277. package/dist/lazy/approval-bar.d.ts +4 -0
  278. package/dist/lazy/approval-bar.d.ts.map +1 -0
  279. package/dist/lazy/approval-bar.js +5 -0
  280. package/dist/lazy/approval-bar.js.map +1 -0
  281. package/dist/lazy/button.d.ts +4 -0
  282. package/dist/lazy/button.d.ts.map +1 -0
  283. package/dist/lazy/button.js +5 -0
  284. package/dist/lazy/button.js.map +1 -0
  285. package/dist/lazy/checkbox.d.ts +4 -0
  286. package/dist/lazy/checkbox.d.ts.map +1 -0
  287. package/dist/lazy/checkbox.js +5 -0
  288. package/dist/lazy/checkbox.js.map +1 -0
  289. package/dist/lazy/custom-widget.js +5 -0
  290. package/dist/lazy/custom-widget.js.map +1 -0
  291. package/dist/lazy/date-input.d.ts +4 -0
  292. package/dist/lazy/date-input.d.ts.map +1 -0
  293. package/dist/lazy/date-input.js +5 -0
  294. package/dist/lazy/date-input.js.map +1 -0
  295. package/dist/lazy/entity-detail.d.ts +4 -0
  296. package/dist/lazy/entity-detail.d.ts.map +1 -0
  297. package/dist/lazy/entity-detail.js +5 -0
  298. package/dist/lazy/entity-detail.js.map +1 -0
  299. package/dist/lazy/event-timeline.d.ts +4 -0
  300. package/dist/lazy/event-timeline.d.ts.map +1 -0
  301. package/dist/lazy/event-timeline.js +5 -0
  302. package/dist/lazy/event-timeline.js.map +1 -0
  303. package/dist/lazy/evidence-panel.d.ts +4 -0
  304. package/dist/lazy/evidence-panel.d.ts.map +1 -0
  305. package/dist/lazy/evidence-panel.js +5 -0
  306. package/dist/lazy/evidence-panel.js.map +1 -0
  307. package/dist/lazy/form.d.ts +4 -0
  308. package/dist/lazy/form.d.ts.map +1 -0
  309. package/dist/lazy/form.js +5 -0
  310. package/dist/lazy/form.js.map +1 -0
  311. package/dist/lazy/image.d.ts +4 -0
  312. package/dist/lazy/image.d.ts.map +1 -0
  313. package/dist/lazy/image.js +5 -0
  314. package/dist/lazy/image.js.map +1 -0
  315. package/dist/lazy/index.d.ts +16 -1
  316. package/dist/lazy/index.d.ts.map +1 -1
  317. package/dist/lazy/index.js +120 -0
  318. package/dist/lazy/index.js.map +1 -1
  319. package/dist/lazy/multi-select.d.ts +4 -0
  320. package/dist/lazy/multi-select.d.ts.map +1 -0
  321. package/dist/lazy/multi-select.js +5 -0
  322. package/dist/lazy/multi-select.js.map +1 -0
  323. package/dist/lazy/number-input.d.ts +4 -0
  324. package/dist/lazy/number-input.d.ts.map +1 -0
  325. package/dist/lazy/number-input.js +5 -0
  326. package/dist/lazy/number-input.js.map +1 -0
  327. package/dist/lazy/select.d.ts +4 -0
  328. package/dist/lazy/select.d.ts.map +1 -0
  329. package/dist/lazy/select.js +5 -0
  330. package/dist/lazy/select.js.map +1 -0
  331. package/dist/lazy/table.d.ts +4 -0
  332. package/dist/lazy/table.d.ts.map +1 -0
  333. package/dist/lazy/table.js +5 -0
  334. package/dist/lazy/table.js.map +1 -0
  335. package/dist/lazy/text-input.d.ts +4 -0
  336. package/dist/lazy/text-input.d.ts.map +1 -0
  337. package/dist/lazy/text-input.js +5 -0
  338. package/dist/lazy/text-input.js.map +1 -0
  339. package/dist/lazy/text.d.ts +4 -0
  340. package/dist/lazy/text.d.ts.map +1 -0
  341. package/dist/lazy/text.js +5 -0
  342. package/dist/lazy/text.js.map +1 -0
  343. package/dist/lib/labelled-control.d.ts +12 -0
  344. package/dist/lib/labelled-control.d.ts.map +1 -0
  345. package/dist/lib/labelled-control.js +14 -0
  346. package/dist/lib/labelled-control.js.map +1 -0
  347. package/package.json +126 -1
  348. package/dist/components/custom-widget/lib/content.js.map +0 -1
  349. package/dist/components/custom-widget/lib/markdown.js.map +0 -1
  350. package/dist/components/custom-widget/lib/table.js.map +0 -1
  351. /package/dist/components/{custom-widget → table}/lib/table.js +0 -0
  352. /package/dist/components/{custom-widget → text}/lib/markdown.js +0 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,23 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.5.0 — 2026-09-09
6
+
7
+ ### Added
8
+
9
+ - **Engine catalog** (`@fusedashlabs/widgets/catalog`): `loadEngineCatalog()` / `ENGINE_TARGET_IDS`. Twenty beachhead ids carry eligibility, disqualify reasons, closed `DataProfile` eval cases, and a11y notes. BI charts stay `substrate`; `custom-widget` and `chart-renderer` are `host`.
10
+ - Primitives **table**, **text**, **image** as standalone elements. Custom widget panes mount them (no duplicated markup).
11
+ - Cyber surfaces: **event-timeline**, **evidence-panel**, **entity-detail**.
12
+ - Form controls: text/number/select/multi-select/checkbox/date, **form** (`ui9000-submit`), **button** / **approval-bar** (`ui9000-action`). Unlabelled controls do not render. Approval bar is display-only in a foreign host.
13
+
14
+ ### Changed
15
+
16
+ - README documents engine vs substrate vs host. Storybook `Engine/Playground` has one story per engine id (20).
17
+
18
+ ### Bundle
19
+
20
+ - Engine catalog lazy entries (19 ids, map excluded): **4.33 KB gz**. `map-chart` is **0.39 KB gz** and stays out of the D3 500 KB budget (`MAP_DECISION.md`). Combined entry set: 13.02 KB gz / all dist JS 371.11 KB gz — **GO**.
21
+
5
22
  ## 0.4.5 — 2026-09-08
6
23
 
7
24
  ### Added
package/README.md CHANGED
@@ -1,8 +1,28 @@
1
1
  # @fusedashlabs/widgets
2
2
 
3
- Props-only chart web components for **UI9000** MCP chat rendering (Tier B).
3
+ Props-only chart **and engine-catalog** web components for **UI9000** MCP chat rendering.
4
4
 
5
- Apache-2.0 · Lit · **D3 only** · no Redux · per-chart lazy entry points.
5
+ Apache-2.0 · Lit · **D3 only** for charts · no Redux · per-component lazy entry points.
6
+
7
+ ## Catalog (Stage 2)
8
+
9
+ Stage 3 reads **only** the engine catalog:
10
+
11
+ ```ts
12
+ import { loadEngineCatalog, ENGINE_TARGET_IDS } from '@fusedashlabs/widgets/catalog';
13
+
14
+ const engine = loadEngineCatalog(); // 20 beachhead ids
15
+ ```
16
+
17
+ | Tier | What |
18
+ |------|------|
19
+ | `engine` | Cyber beachhead (graph, map, KPI, bar, histogram, table/text/image, timeline, evidence, entity, form controls). Each has eligibility / disqualify reasons and eval cases. |
20
+ | `substrate` | The rest of the BI chart pack (pie, sankey, ROC, …). Published, not selected by the engine. |
21
+ | `host` | `custom-widget`, `chart-renderer` — shells, not candidates. |
22
+
23
+ Installable with no other UI9000 package. FuseDash `apps/charts` still renders its own Widgets/ — that consumer bump is outside this package.
24
+
25
+ Demos: [mcp.ui9000.com/storybook](https://mcp.ui9000.com/storybook/) · `Engine/Playground` (one story per engine id). New surfaces are proven there, not via `mcp-ui` `generate_*` tools. FuseDash consumer (`apps/charts`) stays open.
6
26
 
7
27
  ## Porting charts
8
28
 
@@ -15,7 +35,8 @@ Follow the project skill: [`.cursor/skills/port-chart/SKILL.md`](./.cursor/skill
15
35
  Lit + D3 chart web components for MCP chat. **Do not maintain a per-chart table here** — ports must not edit this file.
16
36
 
17
37
  - Entrypoints: `package.json` → `exports`
18
- - Types / tags: `src/components/*/metadata.json`
38
+ - Types / tags / engine metadata: `src/components/*/metadata.json`
39
+ - Catalog loader: `src/catalog/`
19
40
  - Demos: `yarn storybook`
20
41
  - History: `CHANGELOG.md`
21
42
 
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Frozen Stage 2 engine catalog.
3
+ * Close-out tables list 20 ids (plan prose said 19). Do not add a 21st
4
+ * without removing another. Completeness is asserted in catalog.test.ts.
5
+ */
6
+ export declare const ENGINE_TARGET_IDS: readonly ["network-graph", "map-chart", "kpi-widget", "bar-chart", "histogram-chart", "table", "text", "image", "event-timeline", "evidence-panel", "entity-detail", "text-input", "number-input", "select", "multi-select", "checkbox", "date-input", "button", "form", "approval-bar"];
7
+ export type EngineTargetId = (typeof ENGINE_TARGET_IDS)[number];
8
+ export declare const ENGINE_TARGET_ID_SET: Set<string>;
9
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/catalog/engine.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,0RAqBpB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhE,eAAO,MAAM,oBAAoB,aAAqC,CAAC"}
@@ -0,0 +1,28 @@
1
+ const ENGINE_TARGET_IDS = [
2
+ "network-graph",
3
+ "map-chart",
4
+ "kpi-widget",
5
+ "bar-chart",
6
+ "histogram-chart",
7
+ "table",
8
+ "text",
9
+ "image",
10
+ "event-timeline",
11
+ "evidence-panel",
12
+ "entity-detail",
13
+ "text-input",
14
+ "number-input",
15
+ "select",
16
+ "multi-select",
17
+ "checkbox",
18
+ "date-input",
19
+ "button",
20
+ "form",
21
+ "approval-bar"
22
+ ];
23
+ const ENGINE_TARGET_ID_SET = new Set(ENGINE_TARGET_IDS);
24
+ export {
25
+ ENGINE_TARGET_IDS,
26
+ ENGINE_TARGET_ID_SET
27
+ };
28
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sources":["../../src/catalog/engine.ts"],"sourcesContent":["/**\n * Frozen Stage 2 engine catalog.\n * Close-out tables list 20 ids (plan prose said 19). Do not add a 21st\n * without removing another. Completeness is asserted in catalog.test.ts.\n */\nexport const ENGINE_TARGET_IDS = [\n 'network-graph',\n 'map-chart',\n 'kpi-widget',\n 'bar-chart',\n 'histogram-chart',\n 'table',\n 'text',\n 'image',\n 'event-timeline',\n 'evidence-panel',\n 'entity-detail',\n 'text-input',\n 'number-input',\n 'select',\n 'multi-select',\n 'checkbox',\n 'date-input',\n 'button',\n 'form',\n 'approval-bar',\n] as const;\n\nexport type EngineTargetId = (typeof ENGINE_TARGET_IDS)[number];\n\nexport const ENGINE_TARGET_ID_SET = new Set<string>(ENGINE_TARGET_IDS);\n"],"names":[],"mappings":"AAKO,MAAM,oBAAoB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIO,MAAM,uBAAuB,IAAI,IAAY,iBAAiB;"}
@@ -0,0 +1,11 @@
1
+ import { DataProfile, EngineMetadata } from './types.js';
2
+ export type CatalogMatch = {
3
+ status: 'eligible' | 'disqualified';
4
+ reason: string;
5
+ };
6
+ /**
7
+ * Fail-closed: the first matching disqualify rule wins, then eligibility.
8
+ * No match → disqualified.
9
+ */
10
+ export declare function evaluateCatalog(meta: EngineMetadata, profile: DataProfile): CatalogMatch;
11
+ //# sourceMappingURL=evaluate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../src/catalog/evaluate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG9D,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,UAAU,GAAG,cAAc,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,GAAG,YAAY,CAYxF"}
@@ -0,0 +1,18 @@
1
+ import { evalWhen } from "./when.js";
2
+ function evaluateCatalog(meta, profile) {
3
+ for (const rule of meta.disqualify) {
4
+ if (evalWhen(rule.when, profile)) {
5
+ return { status: "disqualified", reason: rule.reason };
6
+ }
7
+ }
8
+ for (const rule of meta.eligibility) {
9
+ if (evalWhen(rule.when, profile)) {
10
+ return { status: "eligible", reason: rule.reason };
11
+ }
12
+ }
13
+ return { status: "disqualified", reason: "no eligibility rule matched" };
14
+ }
15
+ export {
16
+ evaluateCatalog
17
+ };
18
+ //# sourceMappingURL=evaluate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.js","sources":["../../src/catalog/evaluate.ts"],"sourcesContent":["import type { DataProfile, EngineMetadata } from './types.js';\nimport { evalWhen } from './when.js';\n\nexport type CatalogMatch = {\n status: 'eligible' | 'disqualified';\n reason: string;\n};\n\n/**\n * Fail-closed: the first matching disqualify rule wins, then eligibility.\n * No match → disqualified.\n */\nexport function evaluateCatalog(meta: EngineMetadata, profile: DataProfile): CatalogMatch {\n for (const rule of meta.disqualify) {\n if (evalWhen(rule.when, profile)) {\n return { status: 'disqualified', reason: rule.reason };\n }\n }\n for (const rule of meta.eligibility) {\n if (evalWhen(rule.when, profile)) {\n return { status: 'eligible', reason: rule.reason };\n }\n }\n return { status: 'disqualified', reason: 'no eligibility rule matched' };\n}\n"],"names":[],"mappings":";AAYO,SAAS,gBAAgB,MAAsB,SAAoC;AACxF,aAAW,QAAQ,KAAK,YAAY;AAClC,QAAI,SAAS,KAAK,MAAM,OAAO,GAAG;AAChC,aAAO,EAAE,QAAQ,gBAAgB,QAAQ,KAAK,OAAA;AAAA,IAChD;AAAA,EACF;AACA,aAAW,QAAQ,KAAK,aAAa;AACnC,QAAI,SAAS,KAAK,MAAM,OAAO,GAAG;AAChC,aAAO,EAAE,QAAQ,YAAY,QAAQ,KAAK,OAAA;AAAA,IAC5C;AAAA,EACF;AACA,SAAO,EAAE,QAAQ,gBAAgB,QAAQ,8BAAA;AAC3C;"}
@@ -0,0 +1,8 @@
1
+ export { ENGINE_TARGET_IDS, ENGINE_TARGET_ID_SET, type EngineTargetId } from './engine.js';
2
+ export { collectPortMetadata, catalogTierOf, loadEngineCatalog, missingEngineIds, } from './load.js';
3
+ export { assertEngineMetadata, isEngineMetadata } from './schema.js';
4
+ export { evalWhen, assertWhenUsesClosedProfile, profileKeysInWhen } from './when.js';
5
+ export { evaluateCatalog, type CatalogMatch } from './evaluate.js';
6
+ export type { AccessibilityBlock, AllowedAction, CatalogRule, CatalogTier, DataProfile, DataProfileKey, DataRole, EngineMetadata, EvalCase, Intent, PortMetadata, } from './types.js';
7
+ export { ALLOWED_ACTIONS, CATALOG_TIERS, DATA_PROFILE_KEYS, INTENTS } from './types.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/catalog/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAC3F,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AACnE,YAAY,EACV,kBAAkB,EAClB,aAAa,EACb,WAAW,EACX,WAAW,EACX,WAAW,EACX,cAAc,EACd,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,MAAM,EACN,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { ENGINE_TARGET_IDS, ENGINE_TARGET_ID_SET } from "./engine.js";
2
+ import { catalogTierOf, collectPortMetadata, loadEngineCatalog, missingEngineIds } from "./load.js";
3
+ import { assertEngineMetadata, isEngineMetadata } from "./schema.js";
4
+ import { assertWhenUsesClosedProfile, evalWhen, profileKeysInWhen } from "./when.js";
5
+ import { evaluateCatalog } from "./evaluate.js";
6
+ import { ALLOWED_ACTIONS, CATALOG_TIERS, DATA_PROFILE_KEYS, INTENTS } from "./types.js";
7
+ export {
8
+ ALLOWED_ACTIONS,
9
+ CATALOG_TIERS,
10
+ DATA_PROFILE_KEYS,
11
+ ENGINE_TARGET_IDS,
12
+ ENGINE_TARGET_ID_SET,
13
+ INTENTS,
14
+ assertEngineMetadata,
15
+ assertWhenUsesClosedProfile,
16
+ catalogTierOf,
17
+ collectPortMetadata,
18
+ evalWhen,
19
+ evaluateCatalog,
20
+ isEngineMetadata,
21
+ loadEngineCatalog,
22
+ missingEngineIds,
23
+ profileKeysInWhen
24
+ };
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,11 @@
1
+ import { CatalogTier, EngineMetadata, PortMetadata } from './types.js';
2
+ /** Every component metadata.json in the package. */
3
+ export declare function collectPortMetadata(): PortMetadata[];
4
+ export declare function catalogTierOf(meta: PortMetadata): CatalogTier;
5
+ /**
6
+ * Engine catalog: target ∩ files that pass the engine schema.
7
+ * Incomplete / missing ids are omitted — completeness is the S2-7 test.
8
+ */
9
+ export declare function loadEngineCatalog(): EngineMetadata[];
10
+ export declare function missingEngineIds(): string[];
11
+ //# sourceMappingURL=load.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/catalog/load.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAa5E,oDAAoD;AACpD,wBAAgB,mBAAmB,IAAI,YAAY,EAAE,CAEpD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,WAAW,CAK7D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,EAAE,CAapD;AAED,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAG3C"}
@@ -0,0 +1,140 @@
1
+ import * as metadata$L from "../components/approval-bar/metadata.json.js";
2
+ import * as metadata$K from "../components/area-chart/metadata.json.js";
3
+ import * as metadata$J from "../components/area-grouped-bar-chart/metadata.json.js";
4
+ import * as metadata$I from "../components/bar-chart/metadata.json.js";
5
+ import * as metadata$H from "../components/bias-variance-tradeoff-chart/metadata.json.js";
6
+ import * as metadata$G from "../components/box-plot-chart/metadata.json.js";
7
+ import * as metadata$F from "../components/bubble-chart/metadata.json.js";
8
+ import * as metadata$E from "../components/button/metadata.json.js";
9
+ import * as metadata$D from "../components/chart-renderer/metadata.json.js";
10
+ import * as metadata$C from "../components/checkbox/metadata.json.js";
11
+ import * as metadata$B from "../components/custom-widget/metadata.json.js";
12
+ import * as metadata$A from "../components/date-input/metadata.json.js";
13
+ import * as metadata$z from "../components/donut-chart/metadata.json.js";
14
+ import * as metadata$y from "../components/entity-detail/metadata.json.js";
15
+ import * as metadata$x from "../components/event-timeline/metadata.json.js";
16
+ import * as metadata$w from "../components/evidence-panel/metadata.json.js";
17
+ import * as metadata$v from "../components/form/metadata.json.js";
18
+ import * as metadata$u from "../components/gini-impurity-entropy-chart/metadata.json.js";
19
+ import * as metadata$t from "../components/histogram-chart/metadata.json.js";
20
+ import * as metadata$s from "../components/image/metadata.json.js";
21
+ import * as metadata$r from "../components/kpi-widget/metadata.json.js";
22
+ import * as metadata$q from "../components/line-chart/metadata.json.js";
23
+ import * as metadata$p from "../components/lollipop/metadata.json.js";
24
+ import * as metadata$o from "../components/map-chart/metadata.json.js";
25
+ import * as metadata$n from "../components/matrix-chart/metadata.json.js";
26
+ import * as metadata$m from "../components/multi-select/metadata.json.js";
27
+ import * as metadata$l from "../components/network-graph/metadata.json.js";
28
+ import * as metadata$k from "../components/number-input/metadata.json.js";
29
+ import * as metadata$j from "../components/parallel-coordinates-chart/metadata.json.js";
30
+ import * as metadata$i from "../components/partial-dependence-chart/metadata.json.js";
31
+ import * as metadata$h from "../components/pie-chart/metadata.json.js";
32
+ import * as metadata$g from "../components/polar-area-chart/metadata.json.js";
33
+ import * as metadata$f from "../components/punchcard-chart/metadata.json.js";
34
+ import * as metadata$e from "../components/radar-chart/metadata.json.js";
35
+ import * as metadata$d from "../components/radial-bar-chart/metadata.json.js";
36
+ import * as metadata$c from "../components/sankey-chart/metadata.json.js";
37
+ import * as metadata$b from "../components/scatter-plot-chart/metadata.json.js";
38
+ import * as metadata$a from "../components/scatter-sparkline-chart/metadata.json.js";
39
+ import * as metadata$9 from "../components/select/metadata.json.js";
40
+ import * as metadata$8 from "../components/spark-area-chart/metadata.json.js";
41
+ import * as metadata$7 from "../components/spark-line-chart/metadata.json.js";
42
+ import * as metadata$6 from "../components/step-line-chart/metadata.json.js";
43
+ import * as metadata$5 from "../components/table/metadata.json.js";
44
+ import * as metadata$4 from "../components/text-input/metadata.json.js";
45
+ import * as metadata$3 from "../components/text/metadata.json.js";
46
+ import * as metadata$2 from "../components/treemap-chart/metadata.json.js";
47
+ import * as metadata$1 from "../components/violin-chart/metadata.json.js";
48
+ import * as metadata from "../components/waterfall-chart/metadata.json.js";
49
+ import { assertEngineMetadata } from "./schema.js";
50
+ import { ENGINE_TARGET_ID_SET, ENGINE_TARGET_IDS } from "./engine.js";
51
+ const metadataModules = /* @__PURE__ */ Object.assign({
52
+ "../components/approval-bar/metadata.json": metadata$L,
53
+ "../components/area-chart/metadata.json": metadata$K,
54
+ "../components/area-grouped-bar-chart/metadata.json": metadata$J,
55
+ "../components/bar-chart/metadata.json": metadata$I,
56
+ "../components/bias-variance-tradeoff-chart/metadata.json": metadata$H,
57
+ "../components/box-plot-chart/metadata.json": metadata$G,
58
+ "../components/bubble-chart/metadata.json": metadata$F,
59
+ "../components/button/metadata.json": metadata$E,
60
+ "../components/chart-renderer/metadata.json": metadata$D,
61
+ "../components/checkbox/metadata.json": metadata$C,
62
+ "../components/custom-widget/metadata.json": metadata$B,
63
+ "../components/date-input/metadata.json": metadata$A,
64
+ "../components/donut-chart/metadata.json": metadata$z,
65
+ "../components/entity-detail/metadata.json": metadata$y,
66
+ "../components/event-timeline/metadata.json": metadata$x,
67
+ "../components/evidence-panel/metadata.json": metadata$w,
68
+ "../components/form/metadata.json": metadata$v,
69
+ "../components/gini-impurity-entropy-chart/metadata.json": metadata$u,
70
+ "../components/histogram-chart/metadata.json": metadata$t,
71
+ "../components/image/metadata.json": metadata$s,
72
+ "../components/kpi-widget/metadata.json": metadata$r,
73
+ "../components/line-chart/metadata.json": metadata$q,
74
+ "../components/lollipop/metadata.json": metadata$p,
75
+ "../components/map-chart/metadata.json": metadata$o,
76
+ "../components/matrix-chart/metadata.json": metadata$n,
77
+ "../components/multi-select/metadata.json": metadata$m,
78
+ "../components/network-graph/metadata.json": metadata$l,
79
+ "../components/number-input/metadata.json": metadata$k,
80
+ "../components/parallel-coordinates-chart/metadata.json": metadata$j,
81
+ "../components/partial-dependence-chart/metadata.json": metadata$i,
82
+ "../components/pie-chart/metadata.json": metadata$h,
83
+ "../components/polar-area-chart/metadata.json": metadata$g,
84
+ "../components/punchcard-chart/metadata.json": metadata$f,
85
+ "../components/radar-chart/metadata.json": metadata$e,
86
+ "../components/radial-bar-chart/metadata.json": metadata$d,
87
+ "../components/sankey-chart/metadata.json": metadata$c,
88
+ "../components/scatter-plot-chart/metadata.json": metadata$b,
89
+ "../components/scatter-sparkline-chart/metadata.json": metadata$a,
90
+ "../components/select/metadata.json": metadata$9,
91
+ "../components/spark-area-chart/metadata.json": metadata$8,
92
+ "../components/spark-line-chart/metadata.json": metadata$7,
93
+ "../components/step-line-chart/metadata.json": metadata$6,
94
+ "../components/table/metadata.json": metadata$5,
95
+ "../components/text-input/metadata.json": metadata$4,
96
+ "../components/text/metadata.json": metadata$3,
97
+ "../components/treemap-chart/metadata.json": metadata$2,
98
+ "../components/violin-chart/metadata.json": metadata$1,
99
+ "../components/waterfall-chart/metadata.json": metadata
100
+ });
101
+ function unwrap(mod) {
102
+ if (mod && typeof mod === "object" && "default" in mod) {
103
+ return mod.default;
104
+ }
105
+ return mod;
106
+ }
107
+ function collectPortMetadata() {
108
+ return Object.values(metadataModules).map(unwrap);
109
+ }
110
+ function catalogTierOf(meta) {
111
+ if (meta.tier === "engine" || meta.tier === "host" || meta.tier === "substrate") {
112
+ return meta.tier;
113
+ }
114
+ return "substrate";
115
+ }
116
+ function loadEngineCatalog() {
117
+ const byId = /* @__PURE__ */ new Map();
118
+ for (const raw of collectPortMetadata()) {
119
+ if (raw.tier !== "engine") continue;
120
+ if (!ENGINE_TARGET_ID_SET.has(raw.id)) {
121
+ throw new Error(
122
+ `metadata id "${raw.id}" is tier engine but not in ENGINE_TARGET_IDS`
123
+ );
124
+ }
125
+ const parsed = assertEngineMetadata(raw, raw.id);
126
+ byId.set(parsed.id, parsed);
127
+ }
128
+ return ENGINE_TARGET_IDS.filter((id) => byId.has(id)).map((id) => byId.get(id));
129
+ }
130
+ function missingEngineIds() {
131
+ const loaded = new Set(loadEngineCatalog().map((m) => m.id));
132
+ return ENGINE_TARGET_IDS.filter((id) => !loaded.has(id));
133
+ }
134
+ export {
135
+ catalogTierOf,
136
+ collectPortMetadata,
137
+ loadEngineCatalog,
138
+ missingEngineIds
139
+ };
140
+ //# sourceMappingURL=load.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.js","sources":["../../src/catalog/load.ts"],"sourcesContent":["import { assertEngineMetadata } from './schema.js';\nimport { ENGINE_TARGET_ID_SET, ENGINE_TARGET_IDS } from './engine.js';\nimport type { CatalogTier, EngineMetadata, PortMetadata } from './types.js';\n\nconst metadataModules = import.meta.glob('../components/*/metadata.json', {\n eager: true,\n});\n\nfunction unwrap(mod: unknown): PortMetadata {\n if (mod && typeof mod === 'object' && 'default' in mod) {\n return (mod as { default: PortMetadata }).default;\n }\n return mod as PortMetadata;\n}\n\n/** Every component metadata.json in the package. */\nexport function collectPortMetadata(): PortMetadata[] {\n return Object.values(metadataModules).map(unwrap);\n}\n\nexport function catalogTierOf(meta: PortMetadata): CatalogTier {\n if (meta.tier === 'engine' || meta.tier === 'host' || meta.tier === 'substrate') {\n return meta.tier;\n }\n return 'substrate';\n}\n\n/**\n * Engine catalog: target ∩ files that pass the engine schema.\n * Incomplete / missing ids are omitted — completeness is the S2-7 test.\n */\nexport function loadEngineCatalog(): EngineMetadata[] {\n const byId = new Map<string, EngineMetadata>();\n for (const raw of collectPortMetadata()) {\n if (raw.tier !== 'engine') continue;\n if (!ENGINE_TARGET_ID_SET.has(raw.id)) {\n throw new Error(\n `metadata id \"${raw.id}\" is tier engine but not in ENGINE_TARGET_IDS`,\n );\n }\n const parsed = assertEngineMetadata(raw, raw.id);\n byId.set(parsed.id, parsed);\n }\n return ENGINE_TARGET_IDS.filter((id) => byId.has(id)).map((id) => byId.get(id)!);\n}\n\nexport function missingEngineIds(): string[] {\n const loaded = new Set(loadEngineCatalog().map((m) => m.id));\n return ENGINE_TARGET_IDS.filter((id) => !loaded.has(id));\n}\n"],"names":["__vite_glob_0_0","__vite_glob_0_1","__vite_glob_0_2","__vite_glob_0_3","__vite_glob_0_4","__vite_glob_0_5","__vite_glob_0_6","__vite_glob_0_7","__vite_glob_0_8","__vite_glob_0_9","__vite_glob_0_10","__vite_glob_0_11","__vite_glob_0_12","__vite_glob_0_13","__vite_glob_0_14","__vite_glob_0_15","__vite_glob_0_16","__vite_glob_0_17","__vite_glob_0_18","__vite_glob_0_19","__vite_glob_0_20","__vite_glob_0_21","__vite_glob_0_22","__vite_glob_0_23","__vite_glob_0_24","__vite_glob_0_25","__vite_glob_0_26","__vite_glob_0_27","__vite_glob_0_28","__vite_glob_0_29","__vite_glob_0_30","__vite_glob_0_31","__vite_glob_0_32","__vite_glob_0_33","__vite_glob_0_34","__vite_glob_0_35","__vite_glob_0_36","__vite_glob_0_37","__vite_glob_0_38","__vite_glob_0_39","__vite_glob_0_40","__vite_glob_0_41","__vite_glob_0_42","__vite_glob_0_43","__vite_glob_0_44","__vite_glob_0_45","__vite_glob_0_46","__vite_glob_0_47"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,MAAM,kBAAkB,uBAAA,OAAA;AAAA,EAAA,4CAAAA;AAAAA,EAAA,0CAAAC;AAAAA,EAAA,sDAAAC;AAAAA,EAAA,yCAAAC;AAAAA,EAAA,4DAAAC;AAAAA,EAAA,8CAAAC;AAAAA,EAAA,4CAAAC;AAAAA,EAAA,sCAAAC;AAAAA,EAAA,8CAAAC;AAAAA,EAAA,wCAAAC;AAAAA,EAAA,6CAAAC;AAAAA,EAAA,0CAAAC;AAAAA,EAAA,2CAAAC;AAAAA,EAAA,6CAAAC;AAAAA,EAAA,8CAAAC;AAAAA,EAAA,8CAAAC;AAAAA,EAAA,oCAAAC;AAAAA,EAAA,2DAAAC;AAAAA,EAAA,+CAAAC;AAAAA,EAAA,qCAAAC;AAAAA,EAAA,0CAAAC;AAAAA,EAAA,0CAAAC;AAAAA,EAAA,wCAAAC;AAAAA,EAAA,yCAAAC;AAAAA,EAAA,4CAAAC;AAAAA,EAAA,4CAAAC;AAAAA,EAAA,6CAAAC;AAAAA,EAAA,4CAAAC;AAAAA,EAAA,0DAAAC;AAAAA,EAAA,wDAAAC;AAAAA,EAAA,yCAAAC;AAAAA,EAAA,gDAAAC;AAAAA,EAAA,+CAAAC;AAAAA,EAAA,2CAAAC;AAAAA,EAAA,gDAAAC;AAAAA,EAAA,4CAAAC;AAAAA,EAAA,kDAAAC;AAAAA,EAAA,uDAAAC;AAAAA,EAAA,sCAAAC;AAAAA,EAAA,gDAAAC;AAAAA,EAAA,gDAAAC;AAAAA,EAAA,+CAAAC;AAAAA,EAAA,qCAAAC;AAAAA,EAAA,0CAAAC;AAAAA,EAAA,oCAAAC;AAAAA,EAAA,6CAAAC;AAAAA,EAAA,4CAAAC;AAAAA,EAAA,+CAAAC;AAAA,CAAA;AAIxB,SAAS,OAAO,KAA4B;AAC1C,MAAI,OAAO,OAAO,QAAQ,YAAY,aAAa,KAAK;AACtD,WAAQ,IAAkC;AAAA,EAC5C;AACA,SAAO;AACT;AAGO,SAAS,sBAAsC;AACpD,SAAO,OAAO,OAAO,eAAe,EAAE,IAAI,MAAM;AAClD;AAEO,SAAS,cAAc,MAAiC;AAC7D,MAAI,KAAK,SAAS,YAAY,KAAK,SAAS,UAAU,KAAK,SAAS,aAAa;AAC/E,WAAO,KAAK;AAAA,EACd;AACA,SAAO;AACT;AAMO,SAAS,oBAAsC;AACpD,QAAM,2BAAW,IAAA;AACjB,aAAW,OAAO,uBAAuB;AACvC,QAAI,IAAI,SAAS,SAAU;AAC3B,QAAI,CAAC,qBAAqB,IAAI,IAAI,EAAE,GAAG;AACrC,YAAM,IAAI;AAAA,QACR,gBAAgB,IAAI,EAAE;AAAA,MAAA;AAAA,IAE1B;AACA,UAAM,SAAS,qBAAqB,KAAK,IAAI,EAAE;AAC/C,SAAK,IAAI,OAAO,IAAI,MAAM;AAAA,EAC5B;AACA,SAAO,kBAAkB,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAE;AACjF;AAEO,SAAS,mBAA6B;AAC3C,QAAM,SAAS,IAAI,IAAI,kBAAA,EAAoB,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAC3D,SAAO,kBAAkB,OAAO,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;AACzD;"}
@@ -0,0 +1,5 @@
1
+ import { EngineMetadata } from './types.js';
2
+ /** Validate engine metadata. Throws with a path if incomplete. */
3
+ export declare function assertEngineMetadata(raw: unknown, path?: string): EngineMetadata;
4
+ export declare function isEngineMetadata(raw: unknown): raw is EngineMetadata;
5
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/catalog/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,cAAc,EAGpB,MAAM,YAAY,CAAC;AA8BpB,kEAAkE;AAClE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,SAAa,GAAG,cAAc,CAwHpF;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,cAAc,CAOpE"}
@@ -0,0 +1,143 @@
1
+ import { INTENTS, ALLOWED_ACTIONS } from "./types.js";
2
+ import { assertWhenUsesClosedProfile, assertProfileUsesClosedKeys } from "./when.js";
3
+ const INTENT_SET = new Set(INTENTS);
4
+ const ACTION_SET = new Set(ALLOWED_ACTIONS);
5
+ function isRecord(value) {
6
+ return !!value && typeof value === "object" && !Array.isArray(value);
7
+ }
8
+ function asString(value) {
9
+ return typeof value === "string" && value.trim() ? value : null;
10
+ }
11
+ function fail(path, message) {
12
+ throw new Error(`${path}: ${message}`);
13
+ }
14
+ function requireString(obj, key, path) {
15
+ const value = asString(obj[key]);
16
+ if (!value) fail(`${path}.${key}`, "required non-empty string");
17
+ return value;
18
+ }
19
+ function requireArray(obj, key, path) {
20
+ const value = obj[key];
21
+ if (!Array.isArray(value)) fail(`${path}.${key}`, "required array");
22
+ return value;
23
+ }
24
+ function assertEngineMetadata(raw, path = "metadata") {
25
+ if (!isRecord(raw)) fail(path, "expected object");
26
+ if (raw.tier !== "engine") fail(`${path}.tier`, 'must be "engine"');
27
+ const id = requireString(raw, "id", path);
28
+ const tag = requireString(raw, "tag", path);
29
+ if (!tag.startsWith("ui9000-")) fail(`${path}.tag`, "must start with ui9000-");
30
+ const intentsRaw = requireArray(raw, "intents", path);
31
+ if (!intentsRaw.length) fail(`${path}.intents`, "minItems 1");
32
+ const intents = intentsRaw.map((item, i) => {
33
+ if (typeof item !== "string" || !INTENT_SET.has(item)) {
34
+ fail(`${path}.intents[${i}]`, `unknown intent ${String(item)}`);
35
+ }
36
+ return item;
37
+ });
38
+ const dataRoles = requireArray(raw, "dataRoles", path).map((item, i) => {
39
+ if (!isRecord(item)) fail(`${path}.dataRoles[${i}]`, "expected object");
40
+ const rolePath = `${path}.dataRoles[${i}]`;
41
+ if (typeof item.required !== "boolean") fail(`${rolePath}.required`, "boolean");
42
+ return {
43
+ id: requireString(item, "id", rolePath),
44
+ required: item.required,
45
+ description: requireString(item, "description", rolePath),
46
+ cardinality: typeof item.cardinality === "string" ? item.cardinality : void 0,
47
+ type: typeof item.type === "string" ? item.type : void 0
48
+ };
49
+ });
50
+ if (!dataRoles.length) fail(`${path}.dataRoles`, "minItems 1");
51
+ const eligibility = requireArray(raw, "eligibility", path).map((item, i) => {
52
+ if (!isRecord(item)) fail(`${path}.eligibility[${i}]`, "expected object");
53
+ const rulePath = `${path}.eligibility[${i}]`;
54
+ const when = requireString(item, "when", rulePath);
55
+ const reason = requireString(item, "reason", rulePath);
56
+ assertWhenUsesClosedProfile(when);
57
+ return { when, reason };
58
+ });
59
+ if (!eligibility.length) fail(`${path}.eligibility`, "minItems 1");
60
+ const disqualify = requireArray(raw, "disqualify", path).map((item, i) => {
61
+ if (!isRecord(item)) fail(`${path}.disqualify[${i}]`, "expected object");
62
+ const rulePath = `${path}.disqualify[${i}]`;
63
+ const when = requireString(item, "when", rulePath);
64
+ const reason = requireString(item, "reason", rulePath);
65
+ assertWhenUsesClosedProfile(when);
66
+ return { when, reason };
67
+ });
68
+ if (!disqualify.length) fail(`${path}.disqualify`, "minItems 1");
69
+ for (const rule of disqualify) {
70
+ if (!rule.reason.trim()) fail(`${path}.disqualify`, "reason required");
71
+ }
72
+ const allowedActions = requireArray(raw, "allowedActions", path).map((item, i) => {
73
+ if (typeof item !== "string" || !ACTION_SET.has(item)) {
74
+ fail(`${path}.allowedActions[${i}]`, `unknown action ${String(item)}`);
75
+ }
76
+ return item;
77
+ });
78
+ if (!isRecord(raw.accessibility)) fail(`${path}.accessibility`, "required object");
79
+ const accessibility = {
80
+ nameFrom: requireString(raw.accessibility, "nameFrom", `${path}.accessibility`),
81
+ keyboard: Array.isArray(raw.accessibility.keyboard) ? raw.accessibility.keyboard.map((k, i) => {
82
+ if (typeof k !== "string") fail(`${path}.accessibility.keyboard[${i}]`, "string");
83
+ return k;
84
+ }) : fail(`${path}.accessibility.keyboard`, "required array"),
85
+ shadowBoundary: requireString(raw.accessibility, "shadowBoundary", `${path}.accessibility`)
86
+ };
87
+ const evalCases = requireArray(raw, "evalCases", path).map((item, i) => {
88
+ if (!isRecord(item)) fail(`${path}.evalCases[${i}]`, "expected object");
89
+ const casePath = `${path}.evalCases[${i}]`;
90
+ const intent = requireString(item, "intent", casePath);
91
+ if (!INTENT_SET.has(intent)) fail(`${casePath}.intent`, `unknown intent ${intent}`);
92
+ const expect = item.expect;
93
+ if (expect !== "eligible" && expect !== "disqualified") {
94
+ fail(`${casePath}.expect`, "eligible | disqualified");
95
+ }
96
+ if (!isRecord(item.profile)) fail(`${casePath}.profile`, "required object");
97
+ assertProfileUsesClosedKeys(item.profile);
98
+ const evalCase = {
99
+ id: requireString(item, "id", casePath),
100
+ intent,
101
+ profile: item.profile,
102
+ expect,
103
+ reasonIncludes: requireString(item, "reasonIncludes", casePath)
104
+ };
105
+ return evalCase;
106
+ });
107
+ if (evalCases.length < 2) fail(`${path}.evalCases`, "minItems 2");
108
+ if (!isRecord(raw.propsSchema)) fail(`${path}.propsSchema`, "required object");
109
+ return {
110
+ id,
111
+ tag,
112
+ title: requireString(raw, "title", path),
113
+ description: typeof raw.description === "string" ? raw.description : "",
114
+ entry: requireString(raw, "entry", path),
115
+ lazyImport: requireString(raw, "lazyImport", path),
116
+ propsSchema: raw.propsSchema,
117
+ tier: "engine",
118
+ intents,
119
+ dataRoles,
120
+ eligibility,
121
+ disqualify,
122
+ allowedActions,
123
+ accessibility,
124
+ evalCases,
125
+ chartTypeKeys: Array.isArray(raw.chartTypeKeys) ? raw.chartTypeKeys.filter((k) => typeof k === "string") : void 0,
126
+ source: typeof raw.source === "string" ? raw.source : void 0,
127
+ stack: typeof raw.stack === "string" ? raw.stack : void 0,
128
+ usageConditions: isRecord(raw.usageConditions) ? raw.usageConditions : void 0
129
+ };
130
+ }
131
+ function isEngineMetadata(raw) {
132
+ try {
133
+ assertEngineMetadata(raw);
134
+ return true;
135
+ } catch {
136
+ return false;
137
+ }
138
+ }
139
+ export {
140
+ assertEngineMetadata,
141
+ isEngineMetadata
142
+ };
143
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sources":["../../src/catalog/schema.ts"],"sourcesContent":["import {\n ALLOWED_ACTIONS,\n INTENTS,\n type AllowedAction,\n type DataProfile,\n type EngineMetadata,\n type EvalCase,\n type Intent,\n} from './types.js';\nimport { assertProfileUsesClosedKeys, assertWhenUsesClosedProfile } from './when.js';\n\nconst INTENT_SET = new Set<string>(INTENTS);\nconst ACTION_SET = new Set<string>(ALLOWED_ACTIONS);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction asString(value: unknown): string | null {\n return typeof value === 'string' && value.trim() ? value : null;\n}\n\nfunction fail(path: string, message: string): never {\n throw new Error(`${path}: ${message}`);\n}\n\nfunction requireString(obj: Record<string, unknown>, key: string, path: string): string {\n const value = asString(obj[key]);\n if (!value) fail(`${path}.${key}`, 'required non-empty string');\n return value;\n}\n\nfunction requireArray(obj: Record<string, unknown>, key: string, path: string): unknown[] {\n const value = obj[key];\n if (!Array.isArray(value)) fail(`${path}.${key}`, 'required array');\n return value;\n}\n\n/** Validate engine metadata. Throws with a path if incomplete. */\nexport function assertEngineMetadata(raw: unknown, path = 'metadata'): EngineMetadata {\n if (!isRecord(raw)) fail(path, 'expected object');\n if (raw.tier !== 'engine') fail(`${path}.tier`, 'must be \"engine\"');\n\n const id = requireString(raw, 'id', path);\n const tag = requireString(raw, 'tag', path);\n if (!tag.startsWith('ui9000-')) fail(`${path}.tag`, 'must start with ui9000-');\n\n const intentsRaw = requireArray(raw, 'intents', path);\n if (!intentsRaw.length) fail(`${path}.intents`, 'minItems 1');\n const intents: Intent[] = intentsRaw.map((item, i) => {\n if (typeof item !== 'string' || !INTENT_SET.has(item)) {\n fail(`${path}.intents[${i}]`, `unknown intent ${String(item)}`);\n }\n return item as Intent;\n });\n\n const dataRoles = requireArray(raw, 'dataRoles', path).map((item, i) => {\n if (!isRecord(item)) fail(`${path}.dataRoles[${i}]`, 'expected object');\n const rolePath = `${path}.dataRoles[${i}]`;\n if (typeof item.required !== 'boolean') fail(`${rolePath}.required`, 'boolean');\n return {\n id: requireString(item, 'id', rolePath),\n required: item.required,\n description: requireString(item, 'description', rolePath),\n cardinality: typeof item.cardinality === 'string' ? item.cardinality : undefined,\n type: typeof item.type === 'string' ? item.type : undefined,\n };\n });\n if (!dataRoles.length) fail(`${path}.dataRoles`, 'minItems 1');\n\n const eligibility = requireArray(raw, 'eligibility', path).map((item, i) => {\n if (!isRecord(item)) fail(`${path}.eligibility[${i}]`, 'expected object');\n const rulePath = `${path}.eligibility[${i}]`;\n const when = requireString(item, 'when', rulePath);\n const reason = requireString(item, 'reason', rulePath);\n assertWhenUsesClosedProfile(when);\n return { when, reason };\n });\n if (!eligibility.length) fail(`${path}.eligibility`, 'minItems 1');\n\n const disqualify = requireArray(raw, 'disqualify', path).map((item, i) => {\n if (!isRecord(item)) fail(`${path}.disqualify[${i}]`, 'expected object');\n const rulePath = `${path}.disqualify[${i}]`;\n const when = requireString(item, 'when', rulePath);\n const reason = requireString(item, 'reason', rulePath);\n assertWhenUsesClosedProfile(when);\n return { when, reason };\n });\n if (!disqualify.length) fail(`${path}.disqualify`, 'minItems 1');\n for (const rule of disqualify) {\n if (!rule.reason.trim()) fail(`${path}.disqualify`, 'reason required');\n }\n\n const allowedActions = requireArray(raw, 'allowedActions', path).map((item, i) => {\n if (typeof item !== 'string' || !ACTION_SET.has(item)) {\n fail(`${path}.allowedActions[${i}]`, `unknown action ${String(item)}`);\n }\n return item as AllowedAction;\n });\n\n if (!isRecord(raw.accessibility)) fail(`${path}.accessibility`, 'required object');\n const accessibility = {\n nameFrom: requireString(raw.accessibility, 'nameFrom', `${path}.accessibility`),\n keyboard: Array.isArray(raw.accessibility.keyboard)\n ? raw.accessibility.keyboard.map((k, i) => {\n if (typeof k !== 'string') fail(`${path}.accessibility.keyboard[${i}]`, 'string');\n return k;\n })\n : fail(`${path}.accessibility.keyboard`, 'required array'),\n shadowBoundary: requireString(raw.accessibility, 'shadowBoundary', `${path}.accessibility`),\n };\n\n const evalCases = requireArray(raw, 'evalCases', path).map((item, i) => {\n if (!isRecord(item)) fail(`${path}.evalCases[${i}]`, 'expected object');\n const casePath = `${path}.evalCases[${i}]`;\n const intent = requireString(item, 'intent', casePath);\n if (!INTENT_SET.has(intent)) fail(`${casePath}.intent`, `unknown intent ${intent}`);\n const expect = item.expect;\n if (expect !== 'eligible' && expect !== 'disqualified') {\n fail(`${casePath}.expect`, 'eligible | disqualified');\n }\n if (!isRecord(item.profile)) fail(`${casePath}.profile`, 'required object');\n assertProfileUsesClosedKeys(item.profile as DataProfile);\n const evalCase: EvalCase = {\n id: requireString(item, 'id', casePath),\n intent: intent as Intent,\n profile: item.profile as DataProfile,\n expect,\n reasonIncludes: requireString(item, 'reasonIncludes', casePath),\n };\n return evalCase;\n });\n if (evalCases.length < 2) fail(`${path}.evalCases`, 'minItems 2');\n\n if (!isRecord(raw.propsSchema)) fail(`${path}.propsSchema`, 'required object');\n\n return {\n id,\n tag,\n title: requireString(raw, 'title', path),\n description: typeof raw.description === 'string' ? raw.description : '',\n entry: requireString(raw, 'entry', path),\n lazyImport: requireString(raw, 'lazyImport', path),\n propsSchema: raw.propsSchema,\n tier: 'engine',\n intents,\n dataRoles,\n eligibility,\n disqualify,\n allowedActions,\n accessibility,\n evalCases,\n chartTypeKeys: Array.isArray(raw.chartTypeKeys)\n ? raw.chartTypeKeys.filter((k): k is string => typeof k === 'string')\n : undefined,\n source: typeof raw.source === 'string' ? raw.source : undefined,\n stack: typeof raw.stack === 'string' ? raw.stack : undefined,\n usageConditions: isRecord(raw.usageConditions) ? raw.usageConditions : undefined,\n };\n}\n\nexport function isEngineMetadata(raw: unknown): raw is EngineMetadata {\n try {\n assertEngineMetadata(raw);\n return true;\n } catch {\n return false;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /** Closed intent enum — Stage 3 must not rename these. */
2
+ export declare const INTENTS: readonly ["spatial", "comparison", "summary", "form", "evidence", "graph"];
3
+ export type Intent = (typeof INTENTS)[number];
4
+ export declare const CATALOG_TIERS: readonly ["engine", "substrate", "host"];
5
+ export type CatalogTier = (typeof CATALOG_TIERS)[number];
6
+ /** Closed action types declared in engine metadata — not JS handler names. */
7
+ export declare const ALLOWED_ACTIONS: readonly ["hover", "resize", "select", "submit", "approve", "reject", "pan", "zoom", "drag", "filter"];
8
+ export type AllowedAction = (typeof ALLOWED_ACTIONS)[number];
9
+ /** Closed DataProfile keys — evalCases.profile and `when` strings may use only these. */
10
+ export declare const DATA_PROFILE_KEYS: readonly ["hasCategory", "hasNumericMetric", "categoryCardinality", "hasGeo", "hasTemporal", "hasNodes", "hasLinks", "hasTabularRows", "rowCount", "hasEntityId", "hasClaim", "hasEvents", "controlCount", "allControlsLabelled", "hasMapToken"];
11
+ export type DataProfileKey = (typeof DATA_PROFILE_KEYS)[number];
12
+ export type DataProfile = {
13
+ hasCategory?: boolean;
14
+ hasNumericMetric?: boolean;
15
+ categoryCardinality?: number;
16
+ hasGeo?: boolean;
17
+ hasTemporal?: boolean;
18
+ hasNodes?: boolean;
19
+ hasLinks?: boolean;
20
+ hasTabularRows?: boolean;
21
+ rowCount?: number;
22
+ hasEntityId?: boolean;
23
+ hasClaim?: boolean;
24
+ hasEvents?: boolean;
25
+ controlCount?: number;
26
+ allControlsLabelled?: boolean;
27
+ hasMapToken?: boolean;
28
+ };
29
+ export type DataRole = {
30
+ id: string;
31
+ required: boolean;
32
+ description: string;
33
+ cardinality?: string;
34
+ type?: string;
35
+ };
36
+ export type CatalogRule = {
37
+ when: string;
38
+ reason: string;
39
+ };
40
+ export type AccessibilityBlock = {
41
+ nameFrom: string;
42
+ keyboard: string[];
43
+ shadowBoundary: string;
44
+ };
45
+ export type EvalCase = {
46
+ id: string;
47
+ intent: Intent;
48
+ profile: DataProfile;
49
+ expect: 'eligible' | 'disqualified';
50
+ reasonIncludes: string;
51
+ };
52
+ export type EngineMetadata = {
53
+ id: string;
54
+ tag: string;
55
+ title: string;
56
+ description: string;
57
+ entry: string;
58
+ lazyImport: string;
59
+ propsSchema: Record<string, unknown>;
60
+ tier: 'engine';
61
+ intents: Intent[];
62
+ dataRoles: DataRole[];
63
+ eligibility: CatalogRule[];
64
+ disqualify: CatalogRule[];
65
+ allowedActions: AllowedAction[];
66
+ accessibility: AccessibilityBlock;
67
+ evalCases: EvalCase[];
68
+ chartTypeKeys?: string[];
69
+ source?: string;
70
+ stack?: string;
71
+ usageConditions?: Record<string, unknown>;
72
+ };
73
+ export type PortMetadata = {
74
+ id: string;
75
+ tag: string;
76
+ title?: string;
77
+ description?: string;
78
+ entry?: string;
79
+ lazyImport?: string;
80
+ tier?: CatalogTier;
81
+ [key: string]: unknown;
82
+ };
83
+ //# sourceMappingURL=types.d.ts.map