@miragon/mcp-toolkit-ui 2.7.0 → 2.8.1

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 (388) 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 +14 -6
  122. package/dist/components/DrillButton.d.ts.map +1 -1
  123. package/dist/components/DrillButton.js +14 -7
  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.test.tsx +48 -0
  319. package/src/components/DrillButton.tsx +26 -11
  320. package/src/components/EmptyState.tsx +6 -4
  321. package/src/components/ErrorState.tsx +31 -9
  322. package/src/components/FilterBar.test.tsx +82 -0
  323. package/src/components/FilterBar.tsx +52 -26
  324. package/src/components/KpiGrid.test.tsx +279 -0
  325. package/src/components/KpiGrid.tsx +297 -90
  326. package/src/components/ListFooter.test.tsx +116 -0
  327. package/src/components/ListFooter.tsx +102 -15
  328. package/src/components/PagedListFooter.test.tsx +140 -0
  329. package/src/components/PagedListFooter.tsx +107 -0
  330. package/src/components/Pills.test.tsx +77 -0
  331. package/src/components/Pills.tsx +63 -10
  332. package/src/components/SectionHeading.tsx +9 -3
  333. package/src/components/Toast.tsx +37 -19
  334. package/src/components/WidgetHeader.test.tsx +78 -0
  335. package/src/components/WidgetHeader.tsx +63 -16
  336. package/src/components/feedback-states.test.tsx +98 -9
  337. package/src/components/tone-figures.test.tsx +8 -4
  338. package/src/hooks/index.ts +6 -3
  339. package/src/hooks/tool-result-recovery-model.test.ts +744 -0
  340. package/src/hooks/tool-result-recovery-model.ts +418 -0
  341. package/src/hooks/use-tool-query.effects.test.tsx +205 -0
  342. package/src/hooks/use-tool-query.ts +156 -33
  343. package/src/hooks/use-tool-result-recovery.effects.test.tsx +141 -0
  344. package/src/hooks/use-tool-result-recovery.test.ts +3 -4
  345. package/src/hooks/use-tool-result-recovery.ts +84 -142
  346. package/src/hooks/use-view-data.test.tsx +118 -9
  347. package/src/hooks/use-view-data.ts +128 -18
  348. package/src/hooks/use-view-tool-query.ts +25 -19
  349. package/src/i18n-coverage.test.tsx +104 -2
  350. package/src/index.ts +48 -11
  351. package/src/lib/focus-return.test.ts +288 -0
  352. package/src/lib/focus-return.ts +96 -0
  353. package/src/lib/parse-tool-result.test.ts +46 -1
  354. package/src/lib/parse-tool-result.ts +40 -2
  355. package/src/lib/toast-model.test.ts +166 -1
  356. package/src/lib/toast-model.ts +104 -2
  357. package/src/lib/tone-utils.test.ts +86 -10
  358. package/src/lib/tone-utils.ts +89 -8
  359. package/src/lib/tool-query.test.ts +569 -0
  360. package/src/lib/tool-query.ts +253 -0
  361. package/src/lib/tool-result-observer.test.ts +296 -0
  362. package/src/lib/tool-result-observer.ts +211 -0
  363. package/src/lib/typography.test.ts +45 -0
  364. package/src/lib/typography.ts +47 -0
  365. package/src/lib/utils.ts +12 -1
  366. package/src/locale/index.ts +1 -0
  367. package/src/locale/message-types.ts +118 -2
  368. package/src/locale/messages-de.ts +49 -10
  369. package/src/locale/messages-en.ts +49 -10
  370. package/src/locale/toolkit-messages.test.ts +133 -0
  371. package/src/locale/toolkit-messages.ts +63 -2
  372. package/src/primitives/alert.tsx +3 -0
  373. package/src/primitives/badge.tsx +9 -4
  374. package/src/primitives/button.tsx +1 -1
  375. package/src/primitives/dialog.tsx +10 -1
  376. package/src/primitives/select.tsx +1 -1
  377. package/src/primitives/sheet.tsx +7 -0
  378. package/src/providers/query-provider.test.tsx +154 -0
  379. package/src/providers/query-provider.tsx +66 -5
  380. package/src/render-cases-primitives.tsx +1 -1
  381. package/src/render-cases.tsx +38 -6
  382. package/src/render-effects.tsx +96 -0
  383. package/src/theme/cd-tokens.test.ts +3 -1
  384. package/src/theme/create-theme.test.ts +10 -0
  385. package/src/theme/create-theme.ts +28 -0
  386. package/src/theme/theme-css.test.ts +51 -0
  387. package/src/theme.css +31 -1
  388. package/ui-catalog.json +448 -41
@@ -1,11 +1,13 @@
1
1
  import { type ReactNode } from "react";
2
+ import { type RecoveryPolicy } from "../hooks/use-tool-result-recovery.js";
2
3
  import { type DescribeStep, type McpAppViewLabels, type ViewTitleLevel, type ViewTitleMode } from "./mcp-app-view-chrome.js";
3
4
  import { type DescribeViewError } from "./mcp-app-view-states.js";
4
5
  import type { LayoutBuilderLabels } from "./layout-builder.js";
5
6
  import type { WidgetComponent } from "./widget-renderer.js";
6
7
  export type { McpAppViewLabels, ViewTitleLevel, ViewTitleMode } from "./mcp-app-view-chrome.js";
7
8
  export type { DescribeStep } from "./mcp-app-view-chrome.js";
8
- export type { DescribeViewError } from "./mcp-app-view-states.js";
9
+ export type { DescribeViewError, ViewErrorKind } from "./mcp-app-view-states.js";
10
+ export type { RecoveryPolicy } from "../hooks/use-tool-result-recovery.js";
9
11
  export interface McpAppViewProps {
10
12
  /**
11
13
  * Map of widget ID to React component. The consumer aggregates this from
@@ -59,6 +61,34 @@ export interface McpAppViewProps {
59
61
  describeError?: DescribeViewError;
60
62
  /** Human title of a pipeline step in the failed-steps alert (default: the step id). */
61
63
  describeStep?: DescribeStep;
64
+ /**
65
+ * Which originating tools the view may re-execute on its own when the host
66
+ * strips the result's `structuredContent` (claude.ai, Claude Desktop).
67
+ * `"auto"` (default): any tool the host does not report as writing
68
+ * (`readOnlyHint: false` or `destructiveHint: true`); `"read-only"`: only
69
+ * tools reported with `readOnlyHint: true`; `"never"`: none. A recovery
70
+ * the policy forbids shows a note that the chat did not pass the result to
71
+ * the view. It offers to load the view only for a tool the host does not
72
+ * report as writing; for a writing tool it asks for the current state in
73
+ * the chat, so one click never runs the write a second time.
74
+ */
75
+ recoverStrippedResult?: RecoveryPolicy;
76
+ /**
77
+ * Grace period (ms) after which a silent call counts as a stripped result.
78
+ * Only used where the view could not watch the host's notifications from
79
+ * the start (e.g. a custom shell mounted under its own `bootstrapView`
80
+ * without `installToolResultObserver`); a view mounted by
81
+ * `mountMcpToolkitApp` sees the stripped result itself and never guesses,
82
+ * so a slow tool is never re-run. Default 2500 ms.
83
+ */
84
+ strippedResultGraceMs?: number;
85
+ /**
86
+ * Put the tool name into the cache keys of the data hooks inside the view
87
+ * (`[...queryKey, toolName, args]`, see `toolQueryKey`), so two tools never
88
+ * share an entry. Omitted: an enclosing `AppQueryProvider`'s setting, else
89
+ * the 2.x key `[...queryKey, args]`. The next major makes it the default.
90
+ */
91
+ toolNameInQueryKey?: boolean;
62
92
  }
63
93
  /**
64
94
  * The toolkit's MCP App view: lifecycle placeholder (waiting / error /
@@ -67,6 +97,8 @@ export interface McpAppViewProps {
67
97
  * the host's locale unless a `LocaleProvider` sets one, so the chrome follows
68
98
  * the host language; `useLocale()` in consumer widgets is unaffected. Lucide
69
99
  * icons draw at the CI stroke (2.5) throughout, the toast stack included.
100
+ * The widgets' data hooks fetch through an enclosing `AppQueryProvider`'s
101
+ * client, else the toolkit's shared `queryClient`.
70
102
  */
71
103
  export declare function McpAppView(props: McpAppViewProps): import("react").JSX.Element;
72
104
  //# sourceMappingURL=mcp-app-view.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-app-view.d.ts","sourceRoot":"","sources":["../../src/app/mcp-app-view.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAatE,OAAO,EAQL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EAErB,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAClF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAG9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAE3D,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAC/F,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC5D,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAEjE,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;IACxC;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;;OAIG;IACH,MAAM,CAAC,EAAE,gBAAgB,CAAA;IACzB,sFAAsF;IACtF,aAAa,CAAC,EAAE,mBAAmB,CAAA;IACnC;;;;OAIG;IACH,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB,wEAAwE;IACxE,UAAU,CAAC,EAAE,cAAc,CAAA;IAC3B,6EAA6E;IAC7E,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,SAAS,CAAA;IACtD,2FAA2F;IAC3F,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;;OAGG;IACH,aAAa,CAAC,EAAE,iBAAiB,CAAA;IACjC,uFAAuF;IACvF,YAAY,CAAC,EAAE,YAAY,CAAA;CAC5B;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,+BAYhD"}
1
+ {"version":3,"file":"mcp-app-view.d.ts","sourceRoot":"","sources":["../../src/app/mcp-app-view.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAYjF,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,sCAAsC,CAAA;AAK7C,OAAO,EAOL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EAErB,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAClF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAW9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAE3D,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAC/F,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC5D,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAChF,YAAY,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAA;AAE1E,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;IACxC;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;;OAIG;IACH,MAAM,CAAC,EAAE,gBAAgB,CAAA;IACzB,sFAAsF;IACtF,aAAa,CAAC,EAAE,mBAAmB,CAAA;IACnC;;;;OAIG;IACH,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB,wEAAwE;IACxE,UAAU,CAAC,EAAE,cAAc,CAAA;IAC3B,6EAA6E;IAC7E,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,SAAS,CAAA;IACtD,2FAA2F;IAC3F,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;;OAGG;IACH,aAAa,CAAC,EAAE,iBAAiB,CAAA;IACjC,uFAAuF;IACvF,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;;;;;;;;;OAUG;IACH,qBAAqB,CAAC,EAAE,cAAc,CAAA;IACtC;;;;;;;OAOG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,+BAYhD"}
@@ -1,17 +1,23 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useState, useCallback, useMemo } from "react";
2
+ import { useState, useCallback, useEffect, useMemo } from "react";
3
3
  import { LucideProvider } from "lucide-react";
4
- import { ToolCancelledError, useDisplayMode, useHostContext, useToolContext } from "mcp-use/react";
5
- import { ToastProvider, useToast } from "../components/Toast.js";
6
- import { ToolkitLocaleFallback, useToolkitMessages } from "../locale/locale-provider.js";
7
- import { AppQueryProvider, queryClient } from "../providers/query-provider.js";
8
- import { resolveRecoveryToolName, useToolResultRecovery, } from "../hooks/use-tool-result-recovery.js";
4
+ import { ToolCancelledError, useHostContext, useToolContext } from "mcp-use/react";
5
+ import { ToastProvider } from "../components/Toast.js";
6
+ import { ToolkitLocaleFallback, useToolkitLocale, useToolkitMessages, } from "../locale/locale-provider.js";
7
+ import { formatClockTime, resolveFormatLocale } from "../locale/toolkit-messages.js";
8
+ import { AppQueryProvider, useAppQueryClient } from "../providers/query-provider.js";
9
+ import { resolveToolSafety } from "../hooks/tool-result-recovery-model.js";
10
+ import { DEFAULT_ASSUME_STRIPPED_AFTER_MS, resolveRecoveryToolName, useToolResultRecovery, } from "../hooks/use-tool-result-recovery.js";
9
11
  import { ICON_STROKE } from "../lib/icon-stroke.js";
10
12
  import { useHostBridge } from "./host-bridge.js";
11
- import { applyBuilderCommit, fullscreenAvailable, isCompleteViewData, StepErrors, ViewBody, ViewToolbar, } from "./mcp-app-view-chrome.js";
13
+ import { useViewResultSink } from "./mcp-use-host-bridge.js";
14
+ import { HostModelContext } from "./model-context.js";
15
+ import { applyBuilderCommit, isCompleteViewData, StepErrors, ViewBody, ViewToolbar, } from "./mcp-app-view-chrome.js";
12
16
  import { ViewPlaceholder } from "./mcp-app-view-states.js";
17
+ import { useBuildModeFocus } from "./use-build-mode-focus.js";
18
+ import { useFullscreenToggle, useViewRefresh } from "./use-view-actions.js";
13
19
  import { useRetryFocus, useViewLifecycle } from "./use-view-lifecycle.js";
14
- import { DEFAULT_SLOW_HINT_MS, decodeViewResult } from "./view-lifecycle.js";
20
+ import { DEFAULT_SLOW_HINT_MS, describeViewForModel, reloadedAtOf, } from "./view-lifecycle.js";
15
21
  /**
16
22
  * The toolkit's MCP App view: lifecycle placeholder (waiting / error /
17
23
  * cancelled), toolbar, failed-steps alert and the rendered layout (or the
@@ -19,18 +25,21 @@ import { DEFAULT_SLOW_HINT_MS, decodeViewResult } from "./view-lifecycle.js";
19
25
  * the host's locale unless a `LocaleProvider` sets one, so the chrome follows
20
26
  * the host language; `useLocale()` in consumer widgets is unaffected. Lucide
21
27
  * icons draw at the CI stroke (2.5) throughout, the toast stack included.
28
+ * The widgets' data hooks fetch through an enclosing `AppQueryProvider`'s
29
+ * client, else the toolkit's shared `queryClient`.
22
30
  */
23
31
  export function McpAppView(props) {
24
32
  const { locale } = useHostContext();
25
33
  return (_jsx(ToolkitLocaleFallback, { locale: locale, children: _jsx(LucideProvider, { strokeWidth: ICON_STROKE, children: _jsx(ToastProvider, { children: _jsx(McpAppViewShell, { ...props }) }) }) }));
26
34
  }
35
+ const NO_VIEW = { data: null, source: null, reloadedAt: null };
27
36
  /**
28
- * Host-delivered payload → local `viewData`, recovered payloads included.
29
- * Render-phase setState (not an effect) so the React Compiler doesn't flag a
30
- * cascading render.
37
+ * Host-delivered payload → the shown view, recovered payloads included, each
38
+ * tagged with its source. Render-phase setState (not an effect) so the React
39
+ * Compiler doesn't flag a cascading render.
31
40
  */
32
- function useHostViewData(initialViewData, isPending, recovered) {
33
- const [viewData, setViewData] = useState(null);
41
+ function useHostViewData(initialViewData, isPending, recovered, recoveredAt) {
42
+ const [view, setView] = useState(NO_VIEW);
34
43
  // `prev` MUST start as `null`, not `initialViewData`: hosts that expose the
35
44
  // complete tool output before the app's first render (e.g. window.openai
36
45
  // globals injected ahead of script execution) would otherwise never trip the
@@ -40,166 +49,211 @@ function useHostViewData(initialViewData, isPending, recovered) {
40
49
  const [prevInitial, setPrevInitial] = useState(null);
41
50
  if (initialViewData !== prevInitial) {
42
51
  setPrevInitial(initialViewData);
43
- if (!isPending && isCompleteViewData(initialViewData))
44
- setViewData(initialViewData);
52
+ if (!isPending && isCompleteViewData(initialViewData)) {
53
+ setView({ data: initialViewData, source: "host", reloadedAt: null });
54
+ }
45
55
  }
46
56
  const [prevRecovered, setPrevRecovered] = useState(null);
47
57
  if (recovered !== prevRecovered) {
48
58
  setPrevRecovered(recovered);
49
- // The host-delivered payload always wins; recovery only fills the gap.
50
- if (recovered && !viewData)
51
- setViewData(recovered);
59
+ // The host-delivered payload always wins; a recovery fills the gap, and a
60
+ // recovery for newer arguments replaces an older recovered payload (N21).
61
+ if (recovered) {
62
+ setView((prev) => prev.data === null || prev.source === "recovered"
63
+ ? { data: recovered, source: "recovered", reloadedAt: recoveredAt }
64
+ : prev);
65
+ }
52
66
  }
53
- return [viewData, setViewData];
67
+ return [view, setView];
54
68
  }
55
69
  /**
56
- * Refresh via the refresh tool. A failure keeps the data and says so in a
57
- * toast in catalog words only; the raw reason goes to the console, never to
58
- * the user.
70
+ * Hands the payload the view shows (the host's, its own recovery's, the
71
+ * user's retry or refresh) to the host bridge, so `HostBridge.getWidgetData()`
72
+ * returns what the view shows (toolkit#176 K15), also after a latch the view
73
+ * could not render.
59
74
  */
60
- function useViewRefresh(options) {
61
- const { viewData, setViewData, callTool, refreshToolName, labels } = options;
62
- const toast = useToast();
63
- const [isRefreshing, setIsRefreshing] = useState(false);
64
- const refreshView = useCallback(async () => {
65
- if (!viewData?._refreshParams)
66
- return;
67
- setIsRefreshing(true);
68
- let failure = null;
69
- try {
70
- const result = await callTool(refreshToolName, viewData._refreshParams);
71
- // One decoding convention with `useToolQuery` (structured-first), with a
72
- // typed outcome: an unusable payload is a failure, never exception text.
73
- const outcome = decodeViewResult(result, isCompleteViewData);
74
- if (outcome.ok)
75
- setViewData(outcome.data);
76
- else
77
- failure = outcome.reason ?? "the refresh tool returned no view";
78
- // The call went through, so self-fetching widgets refresh as well;
79
- // a tool error refreshes nothing.
80
- if (outcome.ok || !outcome.isError)
81
- void queryClient.invalidateQueries();
82
- }
83
- catch (e) {
84
- failure = e;
85
- }
86
- finally {
87
- setIsRefreshing(false);
88
- }
89
- if (failure === null)
90
- return;
91
- console.warn("[mcp-toolkit] refresh failed:", failure);
92
- toast.show({
93
- tone: "danger",
94
- title: labels.refreshFailed,
95
- description: labels.refreshFailedHint,
96
- });
97
- }, [callTool, labels, refreshToolName, setViewData, toast, viewData]);
98
- return { isRefreshing, refreshView };
75
+ function useReportShownPayload(view) {
76
+ const report = useViewResultSink();
77
+ const payload = view.data;
78
+ useEffect(() => {
79
+ if (payload)
80
+ report?.(payload);
81
+ }, [payload, report]);
82
+ }
83
+ /** The rendering call as mcp-use 2.x latches it, plus the tool the host names. */
84
+ function useRenderCall() {
85
+ const tool = useToolContext();
86
+ const { hostContext } = useHostContext();
87
+ // Since mcp-use 2.7.1 a host cancellation latches as `status: "error"`.
88
+ const isCancelled = tool.status === "error" && tool.error instanceof ToolCancelledError;
89
+ const isCallError = tool.status === "error" && !isCancelled;
90
+ return {
91
+ tool,
92
+ hostContext,
93
+ isPending: tool.status === "pending",
94
+ isCancelled,
95
+ isCallError,
96
+ callError: isCallError ? tool.error : undefined,
97
+ initialViewData: tool.status === "ready" ? tool.toolOutput : undefined,
98
+ toolName: resolveRecoveryToolName(hostContext),
99
+ /** The host reports the tool as writing: the view never offers to re-run it after a block. */
100
+ toolWrites: resolveToolSafety(hostContext) === "writes",
101
+ };
99
102
  }
100
103
  /**
101
- * The fullscreen toggle, gated on the host's offer. A rejected request shows
102
- * a toast in catalog words; the raw reason goes to the console.
104
+ * The payload the view shows: the host's, else the stripped-result recovery's.
105
+ * Hosts that strip `structuredContent` (claude.ai) never latch a result under
106
+ * mcp-use 2.x; the recovery re-executes the call once when the stripped
107
+ * result arrives. It never fires on a cancelled or failed call, nor while a
108
+ * slow tool is still running (#176): those render their state.
103
109
  */
104
- function useFullscreenToggle(labels) {
105
- const { displayMode, availableDisplayModes, requestDisplayMode } = useDisplayMode();
106
- const toast = useToast();
107
- const toggle = useCallback(async () => {
108
- const mode = displayMode === "fullscreen" ? "inline" : "fullscreen";
109
- try {
110
- // Advisory since 2.x: `displayMode` updates when the host applies it.
111
- await requestDisplayMode({ mode });
112
- }
113
- catch (e) {
114
- console.warn("[mcp-toolkit] display-mode request failed:", e);
115
- toast.show({
116
- tone: "danger",
117
- title: labels.fullscreenFailed,
118
- description: labels.fullscreenFailedHint,
119
- });
120
- }
121
- }, [displayMode, labels, requestDisplayMode, toast]);
110
+ function useShownView(call, callTool, policy = "auto", graceMs = DEFAULT_ASSUME_STRIPPED_AFTER_MS) {
111
+ const recovery = useToolResultRecovery({
112
+ resultReady: !call.isPending,
113
+ cancelled: call.isCancelled,
114
+ errored: call.isCallError,
115
+ props: call.initialViewData,
116
+ isValid: isCompleteViewData,
117
+ toolInput: call.tool.toolInput,
118
+ hostContext: call.hostContext,
119
+ callTool,
120
+ policy,
121
+ assumeStrippedAfterMs: graceMs,
122
+ });
123
+ const [view, setView] = useHostViewData(call.initialViewData, call.isPending, recovery.data, recovery.recoveredAt);
124
+ useReportShownPayload(view);
125
+ // A re-run's figures can differ from the answer in the chat (N23): stamp
126
+ // it, unless the original call failed and the chat never had figures.
127
+ const callFailed = call.isCallError || call.isCancelled;
128
+ const showRetried = useCallback((data) => setView({ data, source: "retry", reloadedAt: reloadedAtOf("retry", Date.now(), callFailed) }), [setView, callFailed]);
129
+ const showRefreshed = useCallback((data) => setView({
130
+ data,
131
+ source: "refresh",
132
+ reloadedAt: reloadedAtOf("refresh", Date.now(), callFailed),
133
+ }), [setView, callFailed]);
122
134
  return {
123
- isFullscreen: displayMode === "fullscreen",
124
- canFullscreen: fullscreenAvailable(displayMode, availableDisplayModes),
125
- toggle,
135
+ view,
136
+ setView,
137
+ showRetried,
138
+ showRefreshed,
139
+ // Without a named tool nothing can re-run it: a plain failure. A policy
140
+ // block is its own state: the tool ran, and the view must not repeat it.
141
+ recoveryFailed: recovery.failed || recovery.blocked === "no-tool",
142
+ recoveryBlocked: recovery.blocked === "policy",
126
143
  };
127
144
  }
128
- function McpAppViewShell({ widgets, refreshToolName = "refresh-view", builderEnabled, labels, builderLabels, titleMode = "show", titleLevel = 2, renderTitle, slowHintAfterMs = DEFAULT_SLOW_HINT_MS, describeError, describeStep, }) {
145
+ /**
146
+ * The view's own line of model context (toolkit#176 K20, N23): an error the
147
+ * user sees instead of the view, failed data steps, or data the view
148
+ * re-loaded itself (a recovery, a retry, a refresh). Renders nothing while
149
+ * there is nothing to report.
150
+ */
151
+ function ViewModelContext({ lifecycle, toolName, view, }) {
152
+ const content = describeViewForModel({
153
+ lifecycle,
154
+ toolName,
155
+ stepErrors: view.data?.context.errors,
156
+ stepsRetryable: Boolean(view.data?._refreshParams),
157
+ reloadedAt: view.reloadedAt,
158
+ reloadedBy: reloadedByOf(view.source),
159
+ });
160
+ return content ? _jsx(HostModelContext, { content: content }) : null;
161
+ }
162
+ function McpAppViewShell({ widgets, refreshToolName = "refresh-view", builderEnabled, labels, builderLabels, titleMode = "show", titleLevel = 2, renderTitle, slowHintAfterMs = DEFAULT_SLOW_HINT_MS, describeError, describeStep, recoverStrippedResult, strippedResultGraceMs, toolNameInQueryKey, }) {
129
163
  const messages = useToolkitMessages();
130
164
  const L = useMemo(() => ({ ...messages.view, ...labels }), [messages.view, labels]);
131
165
  // The mcp-use 2.x view channels (all need the `bootstrapView` mount
132
166
  // `mountMcpToolkitApp` provides); tools go through the HostBridge.
133
- const tool = useToolContext();
134
- const { safeArea, hostContext } = useHostContext();
167
+ const call = useRenderCall();
168
+ const { safeArea, locale, timeZone } = useHostContext();
169
+ // A time in the language of the sentence around it, in the host's zone.
170
+ const formatLocale = resolveFormatLocale(useToolkitLocale(), locale);
171
+ // The client the view's widgets fetch through (an enclosing
172
+ // AppQueryProvider's, else the shared one): a refresh invalidates it.
173
+ const viewClient = useAppQueryClient();
135
174
  const bridge = useHostBridge();
136
175
  const callTool = useCallback((name, args) => bridge.callTool(name, args), [bridge]);
137
176
  // The widget-facing shape (`args: object`, so generated input interfaces
138
177
  // without an index signature pass straight through).
139
178
  const callToolFn = useCallback((name, args) => bridge.callTool(name, args), [bridge]);
140
- const isPending = tool.status === "pending";
141
- // Since mcp-use 2.7.1 a host cancellation latches as `status: "error"`.
142
- const isCancelled = tool.status === "error" && tool.error instanceof ToolCancelledError;
143
- const isCallError = tool.status === "error" && !isCancelled;
144
- const initialViewData = tool.status === "ready" ? tool.toolOutput : undefined;
145
- // Hosts that strip `structuredContent` (claude.ai) never latch a result under
146
- // mcp-use 2.x; the recovery re-executes the call once to fill the gap. It
147
- // never fires on a cancelled or failed call (#176): those render their state.
148
- const recovery = useToolResultRecovery({
149
- resultReady: !isPending,
150
- cancelled: isCancelled,
151
- errored: isCallError,
152
- props: initialViewData,
153
- isValid: isCompleteViewData,
154
- toolInput: tool.toolInput,
155
- hostContext,
156
- callTool,
157
- });
158
- const [viewData, setViewData] = useHostViewData(initialViewData, isPending, recovery.data);
179
+ const shown = useShownView(call, callTool, recoverStrippedResult, strippedResultGraceMs);
180
+ const { view, setView } = shown;
181
+ const viewData = view.data;
159
182
  const { lifecycle, retry: retryCall } = useViewLifecycle({
160
183
  hasViewData: viewData !== null,
161
- callStatus: tool.status,
162
- cancelled: isCancelled,
163
- callError: isCallError ? tool.error : undefined,
164
- recoveryFailed: recovery.failed,
165
- toolName: resolveRecoveryToolName(hostContext),
166
- toolInput: tool.toolInput,
184
+ callStatus: call.tool.status,
185
+ cancelled: call.isCancelled,
186
+ callError: call.callError,
187
+ recoveryFailed: shown.recoveryFailed,
188
+ recoveryBlocked: shown.recoveryBlocked,
189
+ toolWrites: call.toolWrites,
190
+ toolName: call.toolName,
191
+ toolInput: call.tool.toolInput,
167
192
  callTool,
168
193
  isValid: isCompleteViewData,
169
- onResult: setViewData,
194
+ onResult: shown.showRetried,
170
195
  slowHintAfterMs,
171
196
  });
172
197
  const { frameRef, retry } = useRetryFocus(lifecycle.phase, retryCall);
173
198
  const { isRefreshing, refreshView } = useViewRefresh({
174
199
  viewData,
175
- setViewData,
200
+ setViewData: shown.showRefreshed,
176
201
  callTool,
177
202
  refreshToolName,
178
203
  labels: L,
204
+ client: viewClient,
179
205
  });
180
206
  const fullscreen = useFullscreenToggle(L);
181
207
  // In-iframe build mode is purely a UI state — the LLM never sees the catalogue.
182
208
  const [buildMode, setBuildMode] = useState(false);
209
+ useBuildModeFocus(buildMode, frameRef);
183
210
  const exitBuildMode = useCallback((commit) => {
184
211
  if (commit)
185
- setViewData((prev) => (prev ? applyBuilderCommit(prev, commit) : prev));
212
+ setView((prev) => withBuilderCommit(prev, commit));
186
213
  setBuildMode(false);
187
- }, [setViewData]);
214
+ }, [setView]);
215
+ const viewContext = (_jsx(ViewModelContext, { lifecycle: lifecycle, toolName: call.toolName, view: view }));
188
216
  // `isPending` must not gate the render: on stripping hosts the latch stays
189
217
  // "pending" forever, and recovered viewData still has to replace it. The
190
218
  // frame is the stable focus target of a retry (`useRetryFocus`).
191
219
  if (!viewData) {
192
- return (_jsx("div", { ref: frameRef, tabIndex: -1, "data-slot": "mcp-app-view", className: "outline-hidden", children: _jsx(ViewPlaceholder, { lifecycle: lifecycle, labels: L, onRetry: retry, describeError: describeError }) }));
220
+ return (_jsxs("div", { ref: frameRef, tabIndex: -1, "data-slot": "mcp-app-view", className: "outline-hidden", children: [viewContext, _jsx(ViewPlaceholder, { lifecycle: lifecycle, labels: L, onRetry: retry, describeError: describeError })] }));
193
221
  }
194
- return (_jsx("div", { ref: frameRef, tabIndex: -1, "data-slot": "mcp-app-view", className: "outline-hidden", children: _jsxs("main", { style: {
195
- // Fullscreen: the view owns the viewport and scrolls itself. Inline:
196
- // the host sizes us from our intrinsic height (bootstrapView's
197
- // auto-resize), so no overflow clipping there.
198
- ...(fullscreen.isFullscreen ? { minHeight: "100vh", overflowY: "auto" } : null),
199
- paddingTop: safeArea.top,
200
- paddingRight: safeArea.right,
201
- paddingBottom: safeArea.bottom,
202
- paddingLeft: safeArea.left,
203
- }, children: [_jsx(ViewToolbar, { hidden: buildMode, viewData: viewData, builderAvailable: builderEnabled ?? viewData.builderAvailable ?? false, isFullscreen: fullscreen.isFullscreen, canFullscreen: fullscreen.canFullscreen, isRefreshing: isRefreshing, labels: L, titleMode: titleMode, titleLevel: titleLevel, renderTitle: renderTitle, onRefresh: refreshView, onEnterBuildMode: () => setBuildMode(true), onToggleFullscreen: fullscreen.toggle }), _jsx(StepErrors, { hidden: buildMode, errors: viewData.context.errors, steps: viewData._refreshParams?.steps, labels: L, describeStep: describeStep, onRetry: viewData._refreshParams ? () => void refreshView() : undefined }), _jsx(AppQueryProvider, { callTool: callToolFn, children: _jsx(ViewBody, { buildMode: buildMode, viewData: viewData, widgets: widgets, callTool: callToolFn, builderLabels: builderLabels, onExit: exitBuildMode }) })] }) }));
222
+ return (_jsxs("div", { ref: frameRef, tabIndex: -1, "data-slot": "mcp-app-view", className: "outline-hidden", children: [viewContext, _jsxs("main", { style: {
223
+ // Fullscreen: the view owns the viewport and scrolls itself. Inline:
224
+ // the host sizes us from our intrinsic height (bootstrapView's
225
+ // auto-resize), so no overflow clipping there.
226
+ ...(fullscreen.isFullscreen ? { minHeight: "100vh", overflowY: "auto" } : null),
227
+ paddingTop: safeArea.top,
228
+ paddingRight: safeArea.right,
229
+ paddingBottom: safeArea.bottom,
230
+ paddingLeft: safeArea.left,
231
+ }, children: [_jsx(ViewToolbar, { hidden: buildMode, viewData: viewData, builderAvailable: builderEnabled ?? viewData.builderAvailable ?? false, isFullscreen: fullscreen.isFullscreen, canFullscreen: fullscreen.canFullscreen, isRefreshing: isRefreshing, labels: L, titleMode: titleMode, titleLevel: titleLevel, renderTitle: renderTitle, onRefresh: refreshView, onEnterBuildMode: () => setBuildMode(true), onToggleFullscreen: fullscreen.toggle, dataAsOf: formatDataAsOf(view.reloadedAt, formatLocale, timeZone) }), _jsx(StepErrors, { hidden: buildMode, errors: viewData.context.errors, steps: viewData._refreshParams?.steps, labels: L, describeStep: describeStep, onRetry: viewData._refreshParams ? () => void refreshView() : undefined }), _jsx(AppQueryProvider, { callTool: callToolFn, client: viewClient, toolNameInQueryKey: toolNameInQueryKey, children: _jsx(ViewBody, { buildMode: buildMode, viewData: viewData, widgets: widgets, callTool: callToolFn, builderLabels: builderLabels, onExit: exitBuildMode }) })] })] }));
232
+ }
233
+ /** How the model line names the view's own re-load of the shown payload. */
234
+ function reloadedByOf(source) {
235
+ if (source === "refresh" || source === "builder")
236
+ return source;
237
+ return "recovery";
238
+ }
239
+ /**
240
+ * The shown view with a builder commit applied (nothing to apply without
241
+ * data). A commit that carries the builder's live context shows figures the
242
+ * builder loaded itself (its catalogue call ran the steps again), so it is
243
+ * stamped like a refresh: the toolbar says when, and the model learns that
244
+ * they can differ from the result the chat answered from. A commit without a
245
+ * context keeps the shown figures, and with them their source and stamp.
246
+ */
247
+ function withBuilderCommit(view, commit) {
248
+ if (!view.data)
249
+ return view;
250
+ const data = applyBuilderCommit(view.data, commit);
251
+ if (!commit.context)
252
+ return { ...view, data };
253
+ return { data, source: "builder", reloadedAt: reloadedAtOf("builder", Date.now(), false) };
254
+ }
255
+ /** The toolbar's "as of" time of a re-loaded payload, `undefined` for any other. */
256
+ function formatDataAsOf(reloadedAt, locale, timeZone) {
257
+ return reloadedAt === null ? undefined : formatClockTime(reloadedAt, locale, timeZone);
204
258
  }
205
259
  //# sourceMappingURL=mcp-app-view.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-app-view.js","sourceRoot":"","sources":["../../src/app/mcp-app-view.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-app-view.js","sourceRoot":"","sources":["../../src/app/mcp-app-view.tsx"],"names":[],"mappings":"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"}
@@ -19,7 +19,12 @@ export declare function McpToolkitApp(props: McpAppViewProps): import("react").J
19
19
  *
20
20
  * `bootstrapView` owns the mount: it connects the ext-apps postMessage bridge
21
21
  * to the host, installs an error boundary, and auto-reports size changes
22
- * (replacing 1.x's `createRoot` + `McpUseProvider` pair).
22
+ * (replacing 1.x's `createRoot` + `McpUseProvider` pair). The tool-result
23
+ * observer goes in first, so it sees the whole host lifecycle from the
24
+ * handshake on: the view then tells a stripped result from a slow tool and
25
+ * never re-runs a call the host is still answering (toolkit#176). A custom
26
+ * shell under its own `bootstrapView` calls `installToolResultObserver()`
27
+ * before it for the same effect.
23
28
  *
24
29
  * ```tsx
25
30
  * // main.tsx of the widget bundle
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-toolkit-app.d.ts","sourceRoot":"","sources":["../../src/app/mcp-toolkit-app.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAsBpE;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,eAAe,+BAUnD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAE/D"}
1
+ {"version":3,"file":"mcp-toolkit-app.d.ts","sourceRoot":"","sources":["../../src/app/mcp-toolkit-app.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAsBpE;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,eAAe,+BAUnD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAG/D"}
@@ -1,6 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useLayoutEffect } from "react";
3
3
  import { ThemeProvider, bootstrapView, useHostContext } from "mcp-use/react";
4
+ import { installToolResultObserver } from "../lib/tool-result-observer.js";
4
5
  import { adoptHostFontVariables } from "../theme/host-fonts.js";
5
6
  import { McpAppView } from "./mcp-app-view.js";
6
7
  import { McpUseHostBridgeProvider } from "./mcp-use-host-bridge.js";
@@ -45,7 +46,12 @@ export function McpToolkitApp(props) {
45
46
  *
46
47
  * `bootstrapView` owns the mount: it connects the ext-apps postMessage bridge
47
48
  * to the host, installs an error boundary, and auto-reports size changes
48
- * (replacing 1.x's `createRoot` + `McpUseProvider` pair).
49
+ * (replacing 1.x's `createRoot` + `McpUseProvider` pair). The tool-result
50
+ * observer goes in first, so it sees the whole host lifecycle from the
51
+ * handshake on: the view then tells a stripped result from a slow tool and
52
+ * never re-runs a call the host is still answering (toolkit#176). A custom
53
+ * shell under its own `bootstrapView` calls `installToolResultObserver()`
54
+ * before it for the same effect.
49
55
  *
50
56
  * ```tsx
51
57
  * // main.tsx of the widget bundle
@@ -53,6 +59,7 @@ export function McpToolkitApp(props) {
53
59
  * ```
54
60
  */
55
61
  export function mountMcpToolkitApp(props) {
62
+ installToolResultObserver();
56
63
  bootstrapView({ default: () => _jsx(McpToolkitApp, { ...props }) });
57
64
  }
58
65
  //# sourceMappingURL=mcp-toolkit-app.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-toolkit-app.js","sourceRoot":"","sources":["../../src/app/mcp-toolkit-app.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAkB,MAAM,OAAO,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,EAAE,UAAU,EAAwB,MAAM,mBAAmB,CAAA;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAA;AAEnE;;;;;;;;;GASG;AACH,SAAS,aAAa,CAAC,EAAE,QAAQ,EAA2B;IAC1D,MAAM,EAAE,WAAW,EAAE,GAAG,cAAc,EAAE,CAAA;IACxC,eAAe,CAAC,GAAG,EAAE;QACnB,IAAI,OAAO,QAAQ,KAAK,WAAW;YAAE,OAAM;QAC3C,sBAAsB,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;IACxF,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;IACjB,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,aAAa,CAAC,KAAsB;IAClD,OAAO,CACL,KAAC,aAAa,cACZ,KAAC,aAAa,cACZ,KAAC,wBAAwB,cACvB,KAAC,UAAU,OAAK,KAAK,GAAI,GACA,GACb,GACF,CACjB,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAsB;IACvD,aAAa,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAC,aAAa,OAAK,KAAK,GAAI,EAAE,CAAC,CAAA;AAChE,CAAC"}
1
+ {"version":3,"file":"mcp-toolkit-app.js","sourceRoot":"","sources":["../../src/app/mcp-toolkit-app.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAkB,MAAM,OAAO,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC5E,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,EAAE,UAAU,EAAwB,MAAM,mBAAmB,CAAA;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAA;AAEnE;;;;;;;;;GASG;AACH,SAAS,aAAa,CAAC,EAAE,QAAQ,EAA2B;IAC1D,MAAM,EAAE,WAAW,EAAE,GAAG,cAAc,EAAE,CAAA;IACxC,eAAe,CAAC,GAAG,EAAE;QACnB,IAAI,OAAO,QAAQ,KAAK,WAAW;YAAE,OAAM;QAC3C,sBAAsB,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;IACxF,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;IACjB,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,aAAa,CAAC,KAAsB;IAClD,OAAO,CACL,KAAC,aAAa,cACZ,KAAC,aAAa,cACZ,KAAC,wBAAwB,cACvB,KAAC,UAAU,OAAK,KAAK,GAAI,GACA,GACb,GACF,CACjB,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAsB;IACvD,yBAAyB,EAAE,CAAA;IAC3B,aAAa,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAC,aAAa,OAAK,KAAK,GAAI,EAAE,CAAC,CAAA;AAChE,CAAC"}
@@ -1,6 +1,9 @@
1
1
  import { type ReactNode } from "react";
2
- /** Whether the subtree runs inside an mcp-use view (see {@link McpUseViewContext}). */
3
- export declare function useIsInsideMcpUseView(): boolean;
2
+ /**
3
+ * The sink for the payload a view shows, or `null` outside a
4
+ * {@link McpUseHostBridgeProvider}. `McpAppView` reports through it.
5
+ */
6
+ export declare function useViewResultSink(): ((payload: unknown) => void) | null;
4
7
  /**
5
8
  * Install the `mcp-use` {@link HostBridge} (plus the view-scope flag) for a
6
9
  * subtree inside an mcp-use 2.x view.
@@ -14,10 +17,16 @@ export declare function useIsInsideMcpUseView(): boolean;
14
17
  * - `sendFollowup` / `openExternal` — `useSendFollowUp` / `useOpenExternal`;
15
18
  * while the bridge is not connected (local `file://` preview), `openExternal`
16
19
  * throws into `toHostBridge`'s documented `window.open` fallback.
17
- * - `setModelContext` — writes `{ __model_context }` into the view state,
18
- * which hosts receive via `ui/update-model-context` (ext-apps) or
19
- * `widgetState` (ChatGPT). The key is a toolkit-owned convention since 2.x.
20
- * - `getWidgetData` — the rendering tool's `structuredContent` once ready.
20
+ * - `setModelContext` — one line of the view's model-context tree (an mcp-use
21
+ * `ModelContext` node beside the ones `HostModelContext` and
22
+ * `useHostModelContext` register), which hosts receive via
23
+ * `ui/update-model-context` (ext-apps) or `widgetState` (ChatGPT). The
24
+ * provider does not seed mcp-use's view state, so a widget's own
25
+ * `useViewState(default)` keeps its default (N29).
26
+ * - `getWidgetData` — the payload the view reports it shows
27
+ * ({@link useViewResultSink}): the host's, or the one it got by re-running
28
+ * the tool when the host stripped it or kept back an unusable one. Without
29
+ * a report, the rendering tool's `structuredContent` once ready.
21
30
  *
22
31
  * Must render inside a `bootstrapView`-mounted tree (the mcp-use hooks throw
23
32
  * otherwise) — `McpToolkitApp` does this for the standard bundle; use it
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-use-host-bridge.d.ts","sourceRoot":"","sources":["../../src/app/mcp-use-host-bridge.tsx"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,SAAS,EACf,MAAM,OAAO,CAAA;AAqBd,uFAAuF;AACvF,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAoED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,GAAG,SAAS,CAwCzF"}
1
+ {"version":3,"file":"mcp-use-host-bridge.d.ts","sourceRoot":"","sources":["../../src/app/mcp-use-host-bridge.tsx"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,SAAS,EACf,MAAM,OAAO,CAAA;AAgGd;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,IAAI,CAEvE;AAWD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,GAAG,SAAS,CAwDzF"}