@miragon/mcp-toolkit-ui 2.7.0 → 2.8.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 (387) hide show
  1. package/README.md +7 -4
  2. package/dist/app/adapt-data-widget.d.ts +1 -22
  3. package/dist/app/adapt-data-widget.d.ts.map +1 -1
  4. package/dist/app/adapt-data-widget.js +1 -35
  5. package/dist/app/adapt-data-widget.js.map +1 -1
  6. package/dist/app/builder/BuilderBanners.js +1 -1
  7. package/dist/app/builder/BuilderBanners.js.map +1 -1
  8. package/dist/app/builder/CanvasRow.d.ts +4 -2
  9. package/dist/app/builder/CanvasRow.d.ts.map +1 -1
  10. package/dist/app/builder/CanvasRow.js +21 -7
  11. package/dist/app/builder/CanvasRow.js.map +1 -1
  12. package/dist/app/builder/CatalogueSheet.d.ts.map +1 -1
  13. package/dist/app/builder/CatalogueSheet.js +11 -4
  14. package/dist/app/builder/CatalogueSheet.js.map +1 -1
  15. package/dist/app/builder/CellPropsSheet.d.ts +7 -3
  16. package/dist/app/builder/CellPropsSheet.d.ts.map +1 -1
  17. package/dist/app/builder/CellPropsSheet.js +10 -3
  18. package/dist/app/builder/CellPropsSheet.js.map +1 -1
  19. package/dist/app/builder/DiscardDialog.d.ts +18 -0
  20. package/dist/app/builder/DiscardDialog.d.ts.map +1 -0
  21. package/dist/app/builder/DiscardDialog.js +18 -0
  22. package/dist/app/builder/DiscardDialog.js.map +1 -0
  23. package/dist/app/builder/LayoutSurface.d.ts +33 -9
  24. package/dist/app/builder/LayoutSurface.d.ts.map +1 -1
  25. package/dist/app/builder/LayoutSurface.js +74 -23
  26. package/dist/app/builder/LayoutSurface.js.map +1 -1
  27. package/dist/app/builder/PipelineStrip.d.ts +2 -1
  28. package/dist/app/builder/PipelineStrip.d.ts.map +1 -1
  29. package/dist/app/builder/PipelineStrip.js +26 -13
  30. package/dist/app/builder/PipelineStrip.js.map +1 -1
  31. package/dist/app/builder/SaveDialog.d.ts +9 -1
  32. package/dist/app/builder/SaveDialog.d.ts.map +1 -1
  33. package/dist/app/builder/SaveDialog.js +8 -2
  34. package/dist/app/builder/SaveDialog.js.map +1 -1
  35. package/dist/app/builder/Toolbar.d.ts +12 -4
  36. package/dist/app/builder/Toolbar.d.ts.map +1 -1
  37. package/dist/app/builder/Toolbar.js +18 -7
  38. package/dist/app/builder/Toolbar.js.map +1 -1
  39. package/dist/app/builder/Workspace.d.ts +23 -3
  40. package/dist/app/builder/Workspace.d.ts.map +1 -1
  41. package/dist/app/builder/Workspace.js +58 -8
  42. package/dist/app/builder/Workspace.js.map +1 -1
  43. package/dist/app/builder/builder-model.d.ts +143 -1
  44. package/dist/app/builder/builder-model.d.ts.map +1 -1
  45. package/dist/app/builder/builder-model.js +191 -1
  46. package/dist/app/builder/builder-model.js.map +1 -1
  47. package/dist/app/builder/reveal.d.ts +10 -0
  48. package/dist/app/builder/reveal.d.ts.map +1 -0
  49. package/dist/app/builder/reveal.js +10 -0
  50. package/dist/app/builder/reveal.js.map +1 -0
  51. package/dist/app/builder/use-builder-catalogue.d.ts +4 -1
  52. package/dist/app/builder/use-builder-catalogue.d.ts.map +1 -1
  53. package/dist/app/builder/use-builder-catalogue.js +44 -17
  54. package/dist/app/builder/use-builder-catalogue.js.map +1 -1
  55. package/dist/app/builder/use-builder-session.d.ts +30 -0
  56. package/dist/app/builder/use-builder-session.d.ts.map +1 -0
  57. package/dist/app/builder/use-builder-session.js +58 -0
  58. package/dist/app/builder/use-builder-session.js.map +1 -0
  59. package/dist/app/builder/use-display-resolver.d.ts +17 -0
  60. package/dist/app/builder/use-display-resolver.d.ts.map +1 -0
  61. package/dist/app/builder/use-display-resolver.js +16 -0
  62. package/dist/app/builder/use-display-resolver.js.map +1 -0
  63. package/dist/app/index.d.ts +8 -3
  64. package/dist/app/index.d.ts.map +1 -1
  65. package/dist/app/index.js +8 -2
  66. package/dist/app/index.js.map +1 -1
  67. package/dist/app/layout-builder.d.ts +13 -25
  68. package/dist/app/layout-builder.d.ts.map +1 -1
  69. package/dist/app/layout-builder.js +75 -81
  70. package/dist/app/layout-builder.js.map +1 -1
  71. package/dist/app/mcp-app-view-chrome.d.ts +12 -3
  72. package/dist/app/mcp-app-view-chrome.d.ts.map +1 -1
  73. package/dist/app/mcp-app-view-chrome.js +21 -5
  74. package/dist/app/mcp-app-view-chrome.js.map +1 -1
  75. package/dist/app/mcp-app-view-states.d.ts +11 -3
  76. package/dist/app/mcp-app-view-states.d.ts.map +1 -1
  77. package/dist/app/mcp-app-view-states.js +29 -8
  78. package/dist/app/mcp-app-view-states.js.map +1 -1
  79. package/dist/app/mcp-app-view.d.ts +33 -1
  80. package/dist/app/mcp-app-view.d.ts.map +1 -1
  81. package/dist/app/mcp-app-view.js +181 -127
  82. package/dist/app/mcp-app-view.js.map +1 -1
  83. package/dist/app/mcp-toolkit-app.d.ts +6 -1
  84. package/dist/app/mcp-toolkit-app.d.ts.map +1 -1
  85. package/dist/app/mcp-toolkit-app.js +8 -1
  86. package/dist/app/mcp-toolkit-app.js.map +1 -1
  87. package/dist/app/mcp-use-host-bridge.d.ts +15 -6
  88. package/dist/app/mcp-use-host-bridge.d.ts.map +1 -1
  89. package/dist/app/mcp-use-host-bridge.js +51 -22
  90. package/dist/app/mcp-use-host-bridge.js.map +1 -1
  91. package/dist/app/model-context.d.ts +71 -0
  92. package/dist/app/model-context.d.ts.map +1 -0
  93. package/dist/app/model-context.js +101 -0
  94. package/dist/app/model-context.js.map +1 -0
  95. package/dist/app/use-build-mode-focus.d.ts +33 -0
  96. package/dist/app/use-build-mode-focus.d.ts.map +1 -0
  97. package/dist/app/use-build-mode-focus.js +59 -0
  98. package/dist/app/use-build-mode-focus.js.map +1 -0
  99. package/dist/app/use-view-actions.d.ts +31 -0
  100. package/dist/app/use-view-actions.d.ts.map +1 -0
  101. package/dist/app/use-view-actions.js +81 -0
  102. package/dist/app/use-view-actions.js.map +1 -0
  103. package/dist/app/use-view-lifecycle.d.ts +4 -0
  104. package/dist/app/use-view-lifecycle.d.ts.map +1 -1
  105. package/dist/app/use-view-lifecycle.js +2 -0
  106. package/dist/app/use-view-lifecycle.js.map +1 -1
  107. package/dist/app/view-lifecycle.d.ts +80 -4
  108. package/dist/app/view-lifecycle.d.ts.map +1 -1
  109. package/dist/app/view-lifecycle.js +90 -3
  110. package/dist/app/view-lifecycle.js.map +1 -1
  111. package/dist/app/widget-fixture.d.ts +10 -3
  112. package/dist/app/widget-fixture.d.ts.map +1 -1
  113. package/dist/app/widget-fixture.js +21 -8
  114. package/dist/app/widget-fixture.js.map +1 -1
  115. package/dist/app/widget-props-sheet.d.ts +3 -1
  116. package/dist/app/widget-props-sheet.d.ts.map +1 -1
  117. package/dist/app/widget-props-sheet.js +22 -10
  118. package/dist/app/widget-props-sheet.js.map +1 -1
  119. package/dist/app/widget-renderer.js +1 -1
  120. package/dist/app/widget-renderer.js.map +1 -1
  121. package/dist/components/DrillButton.d.ts +9 -6
  122. package/dist/components/DrillButton.d.ts.map +1 -1
  123. package/dist/components/DrillButton.js +8 -6
  124. package/dist/components/DrillButton.js.map +1 -1
  125. package/dist/components/EmptyState.d.ts.map +1 -1
  126. package/dist/components/EmptyState.js +4 -2
  127. package/dist/components/EmptyState.js.map +1 -1
  128. package/dist/components/ErrorState.d.ts +5 -2
  129. package/dist/components/ErrorState.d.ts.map +1 -1
  130. package/dist/components/ErrorState.js +25 -8
  131. package/dist/components/ErrorState.js.map +1 -1
  132. package/dist/components/FilterBar.d.ts +15 -4
  133. package/dist/components/FilterBar.d.ts.map +1 -1
  134. package/dist/components/FilterBar.js +11 -6
  135. package/dist/components/FilterBar.js.map +1 -1
  136. package/dist/components/KpiGrid.d.ts +66 -21
  137. package/dist/components/KpiGrid.d.ts.map +1 -1
  138. package/dist/components/KpiGrid.js +101 -34
  139. package/dist/components/KpiGrid.js.map +1 -1
  140. package/dist/components/ListFooter.d.ts +31 -4
  141. package/dist/components/ListFooter.d.ts.map +1 -1
  142. package/dist/components/ListFooter.js +30 -11
  143. package/dist/components/ListFooter.js.map +1 -1
  144. package/dist/components/PagedListFooter.d.ts +57 -0
  145. package/dist/components/PagedListFooter.d.ts.map +1 -0
  146. package/dist/components/PagedListFooter.js +27 -0
  147. package/dist/components/PagedListFooter.js.map +1 -0
  148. package/dist/components/Pills.d.ts +27 -7
  149. package/dist/components/Pills.d.ts.map +1 -1
  150. package/dist/components/Pills.js +21 -6
  151. package/dist/components/Pills.js.map +1 -1
  152. package/dist/components/SectionHeading.d.ts +3 -1
  153. package/dist/components/SectionHeading.d.ts.map +1 -1
  154. package/dist/components/SectionHeading.js +6 -2
  155. package/dist/components/SectionHeading.js.map +1 -1
  156. package/dist/components/Toast.d.ts +9 -3
  157. package/dist/components/Toast.d.ts.map +1 -1
  158. package/dist/components/Toast.js +31 -16
  159. package/dist/components/Toast.js.map +1 -1
  160. package/dist/components/WidgetHeader.d.ts +34 -10
  161. package/dist/components/WidgetHeader.d.ts.map +1 -1
  162. package/dist/components/WidgetHeader.js +11 -6
  163. package/dist/components/WidgetHeader.js.map +1 -1
  164. package/dist/hooks/index.d.ts +4 -4
  165. package/dist/hooks/index.d.ts.map +1 -1
  166. package/dist/hooks/index.js +1 -1
  167. package/dist/hooks/index.js.map +1 -1
  168. package/dist/hooks/tool-result-recovery-model.d.ts +155 -0
  169. package/dist/hooks/tool-result-recovery-model.d.ts.map +1 -0
  170. package/dist/hooks/tool-result-recovery-model.js +273 -0
  171. package/dist/hooks/tool-result-recovery-model.js.map +1 -0
  172. package/dist/hooks/use-tool-query.d.ts +56 -14
  173. package/dist/hooks/use-tool-query.d.ts.map +1 -1
  174. package/dist/hooks/use-tool-query.js +102 -25
  175. package/dist/hooks/use-tool-query.js.map +1 -1
  176. package/dist/hooks/use-tool-result-recovery.d.ts +47 -52
  177. package/dist/hooks/use-tool-result-recovery.d.ts.map +1 -1
  178. package/dist/hooks/use-tool-result-recovery.js +58 -120
  179. package/dist/hooks/use-tool-result-recovery.js.map +1 -1
  180. package/dist/hooks/use-view-data.d.ts +52 -10
  181. package/dist/hooks/use-view-data.d.ts.map +1 -1
  182. package/dist/hooks/use-view-data.js +81 -16
  183. package/dist/hooks/use-view-data.js.map +1 -1
  184. package/dist/hooks/use-view-tool-query.d.ts +12 -7
  185. package/dist/hooks/use-view-tool-query.d.ts.map +1 -1
  186. package/dist/hooks/use-view-tool-query.js +15 -14
  187. package/dist/hooks/use-view-tool-query.js.map +1 -1
  188. package/dist/index.d.ts +17 -10
  189. package/dist/index.d.ts.map +1 -1
  190. package/dist/index.js +18 -6
  191. package/dist/index.js.map +1 -1
  192. package/dist/lib/focus-return.d.ts +61 -0
  193. package/dist/lib/focus-return.d.ts.map +1 -0
  194. package/dist/lib/focus-return.js +46 -0
  195. package/dist/lib/focus-return.js.map +1 -0
  196. package/dist/lib/parse-tool-result.d.ts +23 -1
  197. package/dist/lib/parse-tool-result.d.ts.map +1 -1
  198. package/dist/lib/parse-tool-result.js +38 -2
  199. package/dist/lib/parse-tool-result.js.map +1 -1
  200. package/dist/lib/toast-model.d.ts +41 -1
  201. package/dist/lib/toast-model.d.ts.map +1 -1
  202. package/dist/lib/toast-model.js +67 -1
  203. package/dist/lib/toast-model.js.map +1 -1
  204. package/dist/lib/tone-utils.d.ts +58 -6
  205. package/dist/lib/tone-utils.d.ts.map +1 -1
  206. package/dist/lib/tone-utils.js +66 -4
  207. package/dist/lib/tone-utils.js.map +1 -1
  208. package/dist/lib/tool-query.d.ts +107 -0
  209. package/dist/lib/tool-query.d.ts.map +1 -0
  210. package/dist/lib/tool-query.js +182 -0
  211. package/dist/lib/tool-query.js.map +1 -0
  212. package/dist/lib/tool-result-observer.d.ts +108 -0
  213. package/dist/lib/tool-result-observer.d.ts.map +1 -0
  214. package/dist/lib/tool-result-observer.js +158 -0
  215. package/dist/lib/tool-result-observer.js.map +1 -0
  216. package/dist/lib/typography.d.ts +37 -0
  217. package/dist/lib/typography.d.ts.map +1 -0
  218. package/dist/lib/typography.js +41 -0
  219. package/dist/lib/typography.js.map +1 -0
  220. package/dist/lib/utils.d.ts.map +1 -1
  221. package/dist/lib/utils.js +11 -1
  222. package/dist/lib/utils.js.map +1 -1
  223. package/dist/locale/index.d.ts +1 -1
  224. package/dist/locale/index.d.ts.map +1 -1
  225. package/dist/locale/message-types.d.ts +117 -4
  226. package/dist/locale/message-types.d.ts.map +1 -1
  227. package/dist/locale/messages-de.d.ts.map +1 -1
  228. package/dist/locale/messages-de.js +44 -10
  229. package/dist/locale/messages-de.js.map +1 -1
  230. package/dist/locale/messages-en.d.ts.map +1 -1
  231. package/dist/locale/messages-en.js +44 -10
  232. package/dist/locale/messages-en.js.map +1 -1
  233. package/dist/locale/toolkit-messages.d.ts +19 -1
  234. package/dist/locale/toolkit-messages.d.ts.map +1 -1
  235. package/dist/locale/toolkit-messages.js +54 -1
  236. package/dist/locale/toolkit-messages.js.map +1 -1
  237. package/dist/primitives/alert.d.ts +1 -1
  238. package/dist/primitives/alert.d.ts.map +1 -1
  239. package/dist/primitives/alert.js +2 -0
  240. package/dist/primitives/alert.js.map +1 -1
  241. package/dist/primitives/badge.d.ts +1 -1
  242. package/dist/primitives/badge.d.ts.map +1 -1
  243. package/dist/primitives/badge.js +9 -4
  244. package/dist/primitives/badge.js.map +1 -1
  245. package/dist/primitives/button.d.ts +1 -1
  246. package/dist/primitives/button.js +1 -1
  247. package/dist/primitives/button.js.map +1 -1
  248. package/dist/primitives/dialog.d.ts +1 -1
  249. package/dist/primitives/dialog.d.ts.map +1 -1
  250. package/dist/primitives/dialog.js +10 -3
  251. package/dist/primitives/dialog.js.map +1 -1
  252. package/dist/primitives/select.js +1 -1
  253. package/dist/primitives/select.js.map +1 -1
  254. package/dist/primitives/sheet.d.ts +1 -1
  255. package/dist/primitives/sheet.d.ts.map +1 -1
  256. package/dist/primitives/sheet.js +6 -2
  257. package/dist/primitives/sheet.js.map +1 -1
  258. package/dist/providers/query-provider.d.ts +32 -1
  259. package/dist/providers/query-provider.d.ts.map +1 -1
  260. package/dist/providers/query-provider.js +53 -4
  261. package/dist/providers/query-provider.js.map +1 -1
  262. package/dist/render-cases-primitives.js +1 -1
  263. package/dist/render-cases-primitives.js.map +1 -1
  264. package/dist/render-cases.d.ts.map +1 -1
  265. package/dist/render-cases.js +30 -6
  266. package/dist/render-cases.js.map +1 -1
  267. package/dist/render-effects.d.ts +42 -0
  268. package/dist/render-effects.d.ts.map +1 -0
  269. package/dist/render-effects.js +81 -0
  270. package/dist/render-effects.js.map +1 -0
  271. package/dist/theme/create-theme.d.ts +19 -1
  272. package/dist/theme/create-theme.d.ts.map +1 -1
  273. package/dist/theme/create-theme.js +15 -0
  274. package/dist/theme/create-theme.js.map +1 -1
  275. package/package.json +5 -4
  276. package/src/app/adapt-data-widget.tsx +2 -42
  277. package/src/app/builder/BuilderBanners.tsx +1 -1
  278. package/src/app/builder/CanvasRow.tsx +63 -17
  279. package/src/app/builder/CatalogueSheet.tsx +50 -29
  280. package/src/app/builder/CellPropsSheet.tsx +17 -2
  281. package/src/app/builder/DiscardDialog.tsx +59 -0
  282. package/src/app/builder/LayoutSurface.tsx +206 -66
  283. package/src/app/builder/PipelineStrip.tsx +253 -153
  284. package/src/app/builder/SaveDialog.tsx +14 -2
  285. package/src/app/builder/Toolbar.tsx +144 -59
  286. package/src/app/builder/Workspace.tsx +226 -58
  287. package/src/app/builder/builder-model.ts +341 -2
  288. package/src/app/builder/builder-model.ux.test.ts +456 -0
  289. package/src/app/builder/builder-ux.test.tsx +844 -0
  290. package/src/app/builder/reveal.ts +10 -0
  291. package/src/app/builder/use-builder-catalogue.ts +56 -19
  292. package/src/app/builder/use-builder-session.ts +68 -0
  293. package/src/app/builder/use-display-resolver.ts +24 -0
  294. package/src/app/index.ts +12 -2
  295. package/src/app/layout-builder.tsx +178 -191
  296. package/src/app/mcp-app-view-chrome.test.tsx +141 -1
  297. package/src/app/mcp-app-view-chrome.tsx +56 -6
  298. package/src/app/mcp-app-view-states.tsx +51 -11
  299. package/src/app/mcp-app-view.effects.test.tsx +292 -0
  300. package/src/app/mcp-app-view.test.tsx +222 -2
  301. package/src/app/mcp-app-view.tsx +267 -117
  302. package/src/app/mcp-toolkit-app.test.tsx +40 -0
  303. package/src/app/mcp-toolkit-app.tsx +8 -1
  304. package/src/app/mcp-use-host-bridge.test.tsx +180 -0
  305. package/src/app/mcp-use-host-bridge.tsx +67 -24
  306. package/src/app/model-context.test.tsx +116 -0
  307. package/src/app/model-context.tsx +125 -0
  308. package/src/app/use-build-mode-focus.ts +62 -0
  309. package/src/app/use-view-actions.ts +89 -0
  310. package/src/app/use-view-lifecycle.ts +6 -0
  311. package/src/app/view-lifecycle.test.ts +216 -0
  312. package/src/app/view-lifecycle.ts +165 -5
  313. package/src/app/widget-fixture.effects.test.tsx +51 -0
  314. package/src/app/widget-fixture.render.test.tsx +81 -0
  315. package/src/app/widget-fixture.tsx +34 -11
  316. package/src/app/widget-props-sheet.tsx +57 -16
  317. package/src/app/widget-renderer.tsx +1 -1
  318. package/src/components/DrillButton.tsx +23 -10
  319. package/src/components/EmptyState.tsx +6 -4
  320. package/src/components/ErrorState.tsx +31 -9
  321. package/src/components/FilterBar.test.tsx +82 -0
  322. package/src/components/FilterBar.tsx +52 -26
  323. package/src/components/KpiGrid.test.tsx +279 -0
  324. package/src/components/KpiGrid.tsx +297 -90
  325. package/src/components/ListFooter.test.tsx +116 -0
  326. package/src/components/ListFooter.tsx +102 -15
  327. package/src/components/PagedListFooter.test.tsx +140 -0
  328. package/src/components/PagedListFooter.tsx +107 -0
  329. package/src/components/Pills.test.tsx +77 -0
  330. package/src/components/Pills.tsx +63 -10
  331. package/src/components/SectionHeading.tsx +9 -3
  332. package/src/components/Toast.tsx +37 -19
  333. package/src/components/WidgetHeader.test.tsx +78 -0
  334. package/src/components/WidgetHeader.tsx +63 -16
  335. package/src/components/feedback-states.test.tsx +98 -9
  336. package/src/components/tone-figures.test.tsx +8 -4
  337. package/src/hooks/index.ts +6 -3
  338. package/src/hooks/tool-result-recovery-model.test.ts +744 -0
  339. package/src/hooks/tool-result-recovery-model.ts +418 -0
  340. package/src/hooks/use-tool-query.effects.test.tsx +205 -0
  341. package/src/hooks/use-tool-query.ts +156 -33
  342. package/src/hooks/use-tool-result-recovery.effects.test.tsx +141 -0
  343. package/src/hooks/use-tool-result-recovery.test.ts +3 -4
  344. package/src/hooks/use-tool-result-recovery.ts +84 -142
  345. package/src/hooks/use-view-data.test.tsx +118 -9
  346. package/src/hooks/use-view-data.ts +128 -18
  347. package/src/hooks/use-view-tool-query.ts +25 -19
  348. package/src/i18n-coverage.test.tsx +104 -2
  349. package/src/index.ts +48 -11
  350. package/src/lib/focus-return.test.ts +288 -0
  351. package/src/lib/focus-return.ts +96 -0
  352. package/src/lib/parse-tool-result.test.ts +46 -1
  353. package/src/lib/parse-tool-result.ts +40 -2
  354. package/src/lib/toast-model.test.ts +166 -1
  355. package/src/lib/toast-model.ts +104 -2
  356. package/src/lib/tone-utils.test.ts +86 -10
  357. package/src/lib/tone-utils.ts +89 -8
  358. package/src/lib/tool-query.test.ts +569 -0
  359. package/src/lib/tool-query.ts +253 -0
  360. package/src/lib/tool-result-observer.test.ts +296 -0
  361. package/src/lib/tool-result-observer.ts +211 -0
  362. package/src/lib/typography.test.ts +45 -0
  363. package/src/lib/typography.ts +47 -0
  364. package/src/lib/utils.ts +12 -1
  365. package/src/locale/index.ts +1 -0
  366. package/src/locale/message-types.ts +118 -2
  367. package/src/locale/messages-de.ts +49 -10
  368. package/src/locale/messages-en.ts +49 -10
  369. package/src/locale/toolkit-messages.test.ts +133 -0
  370. package/src/locale/toolkit-messages.ts +63 -2
  371. package/src/primitives/alert.tsx +3 -0
  372. package/src/primitives/badge.tsx +9 -4
  373. package/src/primitives/button.tsx +1 -1
  374. package/src/primitives/dialog.tsx +10 -1
  375. package/src/primitives/select.tsx +1 -1
  376. package/src/primitives/sheet.tsx +7 -0
  377. package/src/providers/query-provider.test.tsx +154 -0
  378. package/src/providers/query-provider.tsx +66 -5
  379. package/src/render-cases-primitives.tsx +1 -1
  380. package/src/render-cases.tsx +38 -6
  381. package/src/render-effects.tsx +96 -0
  382. package/src/theme/cd-tokens.test.ts +3 -1
  383. package/src/theme/create-theme.test.ts +10 -0
  384. package/src/theme/create-theme.ts +28 -0
  385. package/src/theme/theme-css.test.ts +51 -0
  386. package/src/theme.css +31 -1
  387. package/ui-catalog.json +448 -41
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Secondary builder controls (row, tab and cell actions) stay quiet until the
3
+ * pointer is over their group or focus is anywhere inside it, and are always
4
+ * visible where nothing can hover (touch screens). Spread it on the controls'
5
+ * container inside an element with `group`; a control that is never revealed
6
+ * by hover alone is a CI §12 rule ("alles per Tastatur bedienbar"), guarded by
7
+ * `builder-ux.test.tsx`.
8
+ */
9
+ export const REVEAL_ON_INTENT =
10
+ "opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100 focus-within:opacity-100 [@media(hover:none)]:opacity-100"
@@ -1,6 +1,8 @@
1
1
  import { useCallback, useEffect, useMemo, useRef, useState } from "react"
2
2
  import type {
3
3
  AvailableStep,
4
+ CatalogueApp,
5
+ DisplayText,
4
6
  KeyCatalogEntry,
5
7
  PipelineContext,
6
8
  PipelineStepRef,
@@ -22,6 +24,17 @@ import type { RefreshStatus } from "./labels.js"
22
24
 
23
25
  const EMPTY_CONTEXT: PipelineContext = { steps: {}, keys: {}, errors: [] }
24
26
 
27
+ /** What the builder reads from a `get-builder-catalogue` response (every field optional). */
28
+ interface CatalogueSnapshot {
29
+ reachableWidgets?: ReachableWidget[]
30
+ unreachableWidgets?: UnreachableWidget[]
31
+ availableSteps?: AvailableStep[]
32
+ keyCatalog?: KeyCatalogEntry[]
33
+ validationIssues?: string[]
34
+ context?: WireContext
35
+ apps?: CatalogueApp[]
36
+ }
37
+
25
38
  /**
26
39
  * Owns the builder's live catalogue: the snapshots fetched from the app-only
27
40
  * `get-builder-catalogue` tool (the LLM never sees this data), the refresh
@@ -49,6 +62,9 @@ export function useBuilderCatalogue({
49
62
  const [liveCatalog, setLiveCatalog] = useState<KeyCatalogEntry[]>([])
50
63
  const [liveSteps, setLiveSteps] = useState<AvailableStep[]>([])
51
64
  const [liveContext, setLiveContext] = useState<PipelineContext>(EMPTY_CONTEXT)
65
+ // The titled apps (the palette's group headings); the catalogue leaves the
66
+ // field out when no app has a title.
67
+ const [liveApps, setLiveApps] = useState<CatalogueApp[]>([])
52
68
  // Pipeline validation issues from the catalogue (Finding [10]/[6]). The
53
69
  // catalogue is fail-soft, but `render-view` is fail-hard, so we surface
54
70
  // these so the user sees — before committing — that the pipeline as
@@ -61,6 +77,26 @@ export function useBuilderCatalogue({
61
77
  // instead of only `console.warn`-ing, so the user knows the palette/context
62
78
  // may be stale. Cleared on the next successful refresh.
63
79
  const [refreshError, setRefreshError] = useState<string | null>(null)
80
+ // The first fetch has settled (answer or failure). Until then the palette
81
+ // shows a loading state, not "no elements" (CI §9: a skeleton while loading).
82
+ const [loaded, setLoaded] = useState(false)
83
+
84
+ // Takes over what one catalogue response carries; a field it lacks keeps
85
+ // the last snapshot.
86
+ const applySnapshot = useCallback((sc: CatalogueSnapshot | null) => {
87
+ if (sc?.reachableWidgets) setLiveReachable(sc.reachableWidgets)
88
+ if (sc?.unreachableWidgets) setLiveUnreachable(sc.unreachableWidgets)
89
+ if (sc?.availableSteps) setLiveSteps(sc.availableSteps)
90
+ if (sc?.keyCatalog) setLiveCatalog(sc.keyCatalog)
91
+ if (sc?.context) setLiveContext(toPipelineContext(sc.context))
92
+ // Absent `apps` means no app has a title (not "unchanged").
93
+ if (sc) setLiveApps(sc.apps ?? [])
94
+ // Pipeline issues are fail-soft in the catalogue but fail-hard in
95
+ // render-view; surface them so the user sees the render path wouldn't
96
+ // run as configured (Finding [10]/[6]). Coerce undefined → [] so a
97
+ // fixed pipeline clears a previously-shown warning.
98
+ setValidationIssues(sc?.validationIssues ?? [])
99
+ }, [])
64
100
 
65
101
  const refreshBuilder = useCallback(async () => {
66
102
  setStatus("refreshing")
@@ -69,24 +105,7 @@ export function useBuilderCatalogue({
69
105
  keys: entriesToKeys(keyEntries),
70
106
  steps: stepEntries.filter((s) => s.step.trim().length > 0),
71
107
  })
72
- const sc = parseToolResult<{
73
- reachableWidgets?: ReachableWidget[]
74
- unreachableWidgets?: UnreachableWidget[]
75
- availableSteps?: AvailableStep[]
76
- keyCatalog?: KeyCatalogEntry[]
77
- validationIssues?: string[]
78
- context?: WireContext
79
- } | null>(result)
80
- if (sc?.reachableWidgets) setLiveReachable(sc.reachableWidgets)
81
- if (sc?.unreachableWidgets) setLiveUnreachable(sc.unreachableWidgets)
82
- if (sc?.availableSteps) setLiveSteps(sc.availableSteps)
83
- if (sc?.keyCatalog) setLiveCatalog(sc.keyCatalog)
84
- if (sc?.context) setLiveContext(toPipelineContext(sc.context))
85
- // Pipeline issues are fail-soft in the catalogue but fail-hard in
86
- // render-view; surface them so the user sees the render path wouldn't
87
- // run as configured (Finding [10]/[6]). Coerce undefined → [] so a
88
- // fixed pipeline clears a previously-shown warning.
89
- setValidationIssues(sc?.validationIssues ?? [])
108
+ applySnapshot(parseToolResult<CatalogueSnapshot | null>(result))
90
109
  // A successful fetch clears any stale failure banner.
91
110
  setRefreshError(null)
92
111
  } catch (err) {
@@ -104,8 +123,9 @@ export function useBuilderCatalogue({
104
123
  setRefreshError(reason)
105
124
  } finally {
106
125
  setStatus("idle")
126
+ setLoaded(true)
107
127
  }
108
- }, [catalogueToolName, callTool, keyEntries, stepEntries])
128
+ }, [applySnapshot, catalogueToolName, callTool, keyEntries, stepEntries])
109
129
 
110
130
  const refreshRef = useRef(refreshBuilder)
111
131
  useEffect(() => {
@@ -154,6 +174,20 @@ export function useBuilderCatalogue({
154
174
  return map
155
175
  }, [liveReachable, liveUnreachable])
156
176
 
177
+ // Display text (title, summary, their keys) per widget id, from both lists:
178
+ // a canvas cell or the props sheet may name a widget the current keys do
179
+ // not reach.
180
+ const displayByWidgetId = useMemo(() => {
181
+ const map = new Map<string, DisplayText>()
182
+ for (const w of [...liveUnreachable, ...liveReachable]) map.set(w.id, w)
183
+ return map
184
+ }, [liveReachable, liveUnreachable])
185
+
186
+ const appDisplayByName = useMemo(
187
+ () => new Map<string, DisplayText>(liveApps.map((app) => [app.name, app])),
188
+ [liveApps],
189
+ )
190
+
157
191
  const paletteByApp = useMemo(() => {
158
192
  const groups = new Map<string, ReachableWidget[]>()
159
193
  for (const w of liveReachable) {
@@ -182,10 +216,13 @@ export function useBuilderCatalogue({
182
216
  liveContext,
183
217
  validationIssues,
184
218
  status,
219
+ loaded,
185
220
  refreshError,
186
221
  retryCatalogue,
187
222
  widgetById,
188
223
  propsSchemaByWidgetId,
224
+ displayByWidgetId,
225
+ appDisplayByName,
189
226
  paletteByApp,
190
227
  liveKeyCount,
191
228
  stepsByApp,
@@ -0,0 +1,68 @@
1
+ import { useCallback, useState } from "react"
2
+ import {
3
+ draftStatus,
4
+ viewAfterAdvancedToggle,
5
+ type BuilderView,
6
+ type DraftStatus,
7
+ } from "./builder-model.js"
8
+
9
+ // -------------------------------------------------------------------------- //
10
+ // Builder session state that is not the draft itself
11
+ // -------------------------------------------------------------------------- //
12
+
13
+ /**
14
+ * Which builder view is shown and whether advanced mode is on. The data
15
+ * sources (keys, steps, context ids) and the catalogue are technical, so they
16
+ * live behind "Advanced"; switching it off leaves a now hidden view for the
17
+ * layout.
18
+ */
19
+ export function useBuilderMode() {
20
+ const [advanced, setAdvanced] = useState(false)
21
+ const [view, setView] = useState<BuilderView>("layout")
22
+ const toggleAdvanced = useCallback(() => {
23
+ const next = !advanced
24
+ setAdvanced(next)
25
+ setView(viewAfterAdvancedToggle(view, next))
26
+ }, [advanced, view])
27
+ /** The empty layout's one next step: show the data sources. */
28
+ const openDataSources = useCallback(() => {
29
+ setAdvanced(true)
30
+ setView("pipeline")
31
+ }, [])
32
+ return { advanced, view, setView, toggleAdvanced, openDataSources }
33
+ }
34
+
35
+ /**
36
+ * Inline rename feedback. The reducer rejects duplicate tab labels and bumps
37
+ * `renameRejectedAt`; each bump shows "name already exists" until the inline
38
+ * editor closes (render-phase setState, the house pattern for derived state).
39
+ */
40
+ export function useRenameFeedback(renameRejectedAt: number, editingTabIdx: number | null): boolean {
41
+ const [renameRejected, setRenameRejected] = useState(false)
42
+ const [prevRenameRejectedAt, setPrevRenameRejectedAt] = useState(renameRejectedAt)
43
+ if (renameRejectedAt !== prevRenameRejectedAt) {
44
+ setPrevRenameRejectedAt(renameRejectedAt)
45
+ setRenameRejected(true)
46
+ }
47
+ const [prevEditingTabIdx, setPrevEditingTabIdx] = useState(editingTabIdx)
48
+ if (editingTabIdx !== prevEditingTabIdx) {
49
+ setPrevEditingTabIdx(editingTabIdx)
50
+ if (editingTabIdx === null) setRenameRejected(false)
51
+ }
52
+ return renameRejected
53
+ }
54
+
55
+ /**
56
+ * Tracks the draft against the view before editing and the last saved
57
+ * dashboard (see `draftStatus`). `snapshot` is the current `builderSnapshot`;
58
+ * the first one is the pre-edit baseline.
59
+ */
60
+ export function useDraftStatus(snapshot: string): DraftStatus & {
61
+ /** Records `saved` (the snapshot that went into a saved dashboard). */
62
+ markSaved: (saved: string) => void
63
+ } {
64
+ const [baseline] = useState(snapshot)
65
+ const [saved, setSaved] = useState<string | null>(null)
66
+ const markSaved = useCallback((value: string) => setSaved(value), [])
67
+ return { ...draftStatus(snapshot, baseline, saved), markSaved }
68
+ }
@@ -0,0 +1,24 @@
1
+ import { useMemo } from "react"
2
+ import { useToolkitLocale, useTranslate } from "../../locale/locale-provider.js"
3
+ import { keyResolverFrom, type DisplayKeyResolver } from "./builder-model.js"
4
+
5
+ /** What the builder needs to turn a definition's display text into words. */
6
+ export interface DisplayResolver {
7
+ /** The locale the builder's own text is in (a `LocaleProvider`'s, else the host's). */
8
+ locale: string
9
+ /** Resolves a `titleKey`/`summaryKey` through the `LocaleProvider`'s translator. */
10
+ resolveKey: DisplayKeyResolver
11
+ }
12
+
13
+ /**
14
+ * Binds `displayLabel` / `propFieldText` to the builder's locale: inline
15
+ * per-locale titles follow the same language as the builder chrome around
16
+ * them, and i18n keys resolve through the nearest `LocaleProvider`'s
17
+ * translator (outside one, keys stay unknown and the inline text or the id
18
+ * shows instead).
19
+ */
20
+ export function useDisplayResolver(): DisplayResolver {
21
+ const locale = useToolkitLocale()
22
+ const translate = useTranslate()
23
+ return useMemo(() => ({ locale, resolveKey: keyResolverFrom(translate) }), [locale, translate])
24
+ }
package/src/app/index.ts CHANGED
@@ -4,10 +4,17 @@ export type {
4
4
  McpAppViewLabels,
5
5
  DescribeStep,
6
6
  DescribeViewError,
7
+ ViewErrorKind,
8
+ RecoveryPolicy,
7
9
  ViewTitleLevel,
8
10
  ViewTitleMode,
9
11
  } from "./mcp-app-view.js"
10
12
  export { McpToolkitApp, mountMcpToolkitApp } from "./mcp-toolkit-app.js"
13
+ // The passive host-lifecycle observer behind the stripped-result recovery
14
+ // (toolkit#176): installed as the bundle evaluates; a custom shell may call it
15
+ // explicitly before its own `bootstrapView`.
16
+ export { installToolResultObserver } from "../lib/tool-result-observer.js"
17
+ export type { ToolObservation, ToolResultObserver } from "../lib/tool-result-observer.js"
11
18
  export {
12
19
  WidgetRenderer,
13
20
  WidgetErrorBoundary,
@@ -17,10 +24,12 @@ export {
17
24
  export type { WidgetRendererProps, WidgetComponent } from "./widget-renderer.js"
18
25
  export { LayoutBuilder } from "./layout-builder.js"
19
26
  export type { LayoutBuilderProps, LayoutBuilderLabels } from "./layout-builder.js"
27
+ export type { BuilderExitCommit } from "./builder/builder-model.js"
20
28
 
21
29
  // App-level value modules that import `mcp-use/react` (ModelContext, the 2.x
22
30
  // view hooks) — exported from this subpath only, never the root barrel.
23
- export { adaptDataWidget, HostModelContext } from "./adapt-data-widget.js"
31
+ export { adaptDataWidget } from "./adapt-data-widget.js"
32
+ export { HostModelContext, useHostModelContext } from "./model-context.js"
24
33
  export type { DescribeForModel } from "./adapt-data-widget.js"
25
34
  export { useHostActions, buildShowWidgetIntent } from "./use-host-actions.js"
26
35
  export type { HostActions } from "./use-host-actions.js"
@@ -43,7 +52,8 @@ export type {
43
52
  OpenAiAppsSdk,
44
53
  StandaloneHostBridgeOptions,
45
54
  } from "./host-bridge.js"
46
- export { McpUseHostBridgeProvider, useIsInsideMcpUseView } from "./mcp-use-host-bridge.js"
55
+ export { McpUseHostBridgeProvider } from "./mcp-use-host-bridge.js"
56
+ export { useIsInsideMcpUseView } from "./model-context.js"
47
57
 
48
58
  // Storybook-style harness for developing widgets in isolation with fixture
49
59
  // data and a simulated HostBridge. Lives under ./app to keep every host-facing