@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
@@ -17,9 +17,15 @@ export interface ToastApi {
17
17
  export declare function useToast(): ToastApi;
18
18
  /**
19
19
  * The stack of toasts — a presentational view over a list (the provider owns
20
- * the state). The container is ONE persistent live region (`role="status"`,
21
- * `aria-live="polite"`), so a newly added toast is announced without stealing
22
- * focus. Bottom centre, above dialogs (z 60), per CI §5/§8.
20
+ * the state). The container is ONE persistent live region
21
+ * (`aria-live="polite"`, mounted before the first toast so that toast is
22
+ * announced, each new toast on its own: `aria-atomic="false"`), without
23
+ * stealing focus. Its attributes never change: a role or name that switched
24
+ * on with the first toast would make the browser rebuild the region in the
25
+ * same commit that inserts the toast, and a region created with its content
26
+ * already in it is not announced. So it carries no role (a generic element
27
+ * takes no name either): an idle stack is no second "status" next to a view's
28
+ * own loading status. Bottom centre, above dialogs (z 60), per CI §5/§8.
23
29
  */
24
30
  export declare function ToastViewport({ toasts, onDismiss, }: {
25
31
  toasts: readonly ToastItem[];
@@ -1 +1 @@
1
- {"version":3,"file":"Toast.d.ts","sourceRoot":"","sources":["../../src/components/Toast.tsx"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,SAAS,EACf,MAAM,OAAO,CAAA;AAMd,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,YAAY,EAElB,MAAM,uBAAuB,CAAA;AAE9B,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAEpE,qCAAqC;AACrC,MAAM,WAAW,QAAQ;IACvB,4EAA4E;IAC5E,IAAI,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,MAAM,CAAA;IACvC,gDAAgD;IAChD,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CAC9B;AAOD;;;;;GAKG;AACH,wBAAgB,QAAQ,IAAI,QAAQ,CAEnC;AA0BD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,SAAS,GACV,EAAE;IACD,MAAM,EAAE,SAAS,SAAS,EAAE,CAAA;IAC5B,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CAChC,+BAoBA;AAyED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,+TAGlE"}
1
+ {"version":3,"file":"Toast.d.ts","sourceRoot":"","sources":["../../src/components/Toast.tsx"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,SAAS,EACf,MAAM,OAAO,CAAA;AAMd,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,YAAY,EAGlB,MAAM,uBAAuB,CAAA;AAE9B,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAEpE,qCAAqC;AACrC,MAAM,WAAW,QAAQ;IACvB,4EAA4E;IAC5E,IAAI,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,MAAM,CAAA;IACvC,gDAAgD;IAChD,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CAC9B;AAOD;;;;;GAKG;AACH,wBAAgB,QAAQ,IAAI,QAAQ,CAEnC;AA0BD;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,SAAS,GACV,EAAE;IACD,MAAM,EAAE,SAAS,SAAS,EAAE,CAAA;IAC5B,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CAChC,+BAmBA;AAoFD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,+TAGlE"}
@@ -1,11 +1,11 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { createContext, useCallback, useContext, useEffect, useMemo, useReducer, useRef, useState, } from "react";
2
+ import { createContext, useCallback, useContext, useEffect, useMemo, useReducer, useRef, } from "react";
3
3
  import { CircleAlert, CircleCheck, Info, TriangleAlert, X } from "lucide-react";
4
4
  import { useToolkitMessages } from "../locale/locale-provider.js";
5
5
  import { FOCUS_RING } from "../lib/focus-ring.js";
6
6
  import { TONE_ICON } from "../lib/tone-utils.js";
7
7
  import { cn } from "../lib/utils.js";
8
- import { createToast, toastReducer, } from "../lib/toast-model.js";
8
+ import { createToast, createToastTimer, toastReducer, } from "../lib/toast-model.js";
9
9
  const ToastContext = createContext(null);
10
10
  /** Outside a provider `useToast()` degrades to a no-op instead of throwing. */
11
11
  const NOOP_TOASTS = { show: () => -1, dismiss: () => { } };
@@ -42,28 +42,43 @@ const TOAST_ICON = {
42
42
  };
43
43
  /**
44
44
  * The stack of toasts — a presentational view over a list (the provider owns
45
- * the state). The container is ONE persistent live region (`role="status"`,
46
- * `aria-live="polite"`), so a newly added toast is announced without stealing
47
- * focus. Bottom centre, above dialogs (z 60), per CI §5/§8.
45
+ * the state). The container is ONE persistent live region
46
+ * (`aria-live="polite"`, mounted before the first toast so that toast is
47
+ * announced, each new toast on its own: `aria-atomic="false"`), without
48
+ * stealing focus. Its attributes never change: a role or name that switched
49
+ * on with the first toast would make the browser rebuild the region in the
50
+ * same commit that inserts the toast, and a region created with its content
51
+ * already in it is not announced. So it carries no role (a generic element
52
+ * takes no name either): an idle stack is no second "status" next to a view's
53
+ * own loading status. Bottom centre, above dialogs (z 60), per CI §5/§8.
48
54
  */
49
55
  export function ToastViewport({ toasts, onDismiss, }) {
50
56
  const messages = useToolkitMessages();
51
- return (_jsx("div", { "data-slot": "toast-viewport", role: "status", "aria-live": "polite", "aria-label": messages.common.notifications, className: "pointer-events-none fixed inset-x-0 bottom-4 z-60 flex flex-col items-center gap-2 px-4", children: toasts.map((toast) => (_jsx(ToastCard, { toast: toast, dismissLabel: messages.common.dismiss, onDismiss: onDismiss }, toast.id))) }));
57
+ return (_jsx("div", { "data-slot": "toast-viewport", "aria-live": "polite", "aria-atomic": "false", className: "pointer-events-none fixed inset-x-0 bottom-4 z-60 flex flex-col items-center gap-2 px-4", children: toasts.map((toast) => (_jsx(ToastCard, { toast: toast, dismissLabel: messages.common.dismiss, onDismiss: onDismiss }, toast.id))) }));
52
58
  }
53
59
  function ToastCard({ toast, dismissLabel, onDismiss, }) {
54
- // Hover or keyboard focus holds the toast: the timer restarts on leave.
55
- const [held, setHeld] = useState(false);
60
+ // Hover or keyboard focus holds the toast; on leave it resumes with the
61
+ // time that was LEFT (createToastTimer), never a fresh full duration.
62
+ const timer = useRef(null);
56
63
  useEffect(() => {
57
- if (held)
58
- return;
59
- const timer = setTimeout(() => onDismiss(toast.id), toast.duration);
60
- return () => clearTimeout(timer);
61
- }, [held, onDismiss, toast.id, toast.duration]);
64
+ const countdown = createToastTimer(toast.duration, () => onDismiss(toast.id));
65
+ timer.current = countdown;
66
+ return () => {
67
+ countdown.cancel();
68
+ timer.current = null;
69
+ };
70
+ }, [onDismiss, toast.id, toast.duration]);
71
+ const releaseFocus = (event) => {
72
+ // Focus moving inside the toast (card → close button) keeps the hold.
73
+ if (!event.currentTarget.contains(event.relatedTarget)) {
74
+ timer.current?.release("focus");
75
+ }
76
+ };
62
77
  const Icon = TOAST_ICON[toast.tone];
63
- return (_jsxs("div", { "data-slot": "toast", "data-tone": toast.tone, onMouseEnter: () => setHeld(true), onMouseLeave: () => setHeld(false), onFocus: () => setHeld(true), onBlur: () => setHeld(false), className: cn(
78
+ return (_jsxs("div", { "data-slot": "toast", "data-tone": toast.tone, onMouseEnter: () => timer.current?.hold("pointer"), onMouseLeave: () => timer.current?.release("pointer"), onFocus: () => timer.current?.hold("focus"), onBlur: releaseFocus, className: cn(
64
79
  // An overlay like Dialog/Sheet: shadow-2 on light, the 3:1 input rim on
65
- // dark (shadows vanish on the ground).
66
- "bg-popover text-popover-foreground dark:border-input shadow-2 pointer-events-auto flex w-full max-w-sm items-start gap-3 rounded-md border border-l-4 px-4 py-3 text-sm", "motion-safe:animate-in motion-safe:fade-in-0 motion-safe:slide-in-from-bottom-2 motion-safe:duration-(--motion-base) motion-safe:ease-(--ease)", TONE_EDGE[toast.tone]), children: [_jsx(Icon, { "aria-hidden": "true", className: cn("mt-0.5 size-4 shrink-0", TONE_ICON[toast.tone]) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "font-medium break-words", children: toast.title }), toast.description && (_jsx("p", { className: "text-muted-foreground mt-0.5 break-words", children: toast.description }))] }), _jsx("button", { type: "button", "aria-label": dismissLabel, onClick: () => onDismiss(toast.id), className: `text-muted-foreground hover:text-foreground -mr-1 inline-flex size-6 shrink-0 items-center justify-center rounded-sm ${FOCUS_RING}`, children: _jsx(X, { "aria-hidden": "true", className: "size-4" }) })] }));
80
+ // dark (shadows vanish on the ground). Its words are running text (16 px).
81
+ "bg-popover text-popover-foreground dark:border-input shadow-2 text-body pointer-events-auto flex w-full max-w-sm items-start gap-3 rounded-md border border-l-4 px-4 py-3", "motion-safe:animate-in motion-safe:fade-in-0 motion-safe:slide-in-from-bottom-2 motion-safe:duration-(--motion-base) motion-safe:ease-(--ease)", TONE_EDGE[toast.tone]), children: [_jsx(Icon, { "aria-hidden": "true", className: cn("mt-1 size-4 shrink-0", TONE_ICON[toast.tone]) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "font-medium break-words", children: toast.title }), toast.description && (_jsx("p", { className: "text-muted-foreground mt-0.5 break-words", children: toast.description }))] }), _jsx("button", { type: "button", "aria-label": dismissLabel, onClick: () => onDismiss(toast.id), className: `text-muted-foreground hover:text-foreground -mr-1 inline-flex size-6 shrink-0 items-center justify-center rounded-sm ${FOCUS_RING}`, children: _jsx(X, { "aria-hidden": "true", className: "size-4" }) })] }));
67
82
  }
68
83
  function ToastRoot({ children }) {
69
84
  const [toasts, dispatch] = useReducer(toastReducer, []);
@@ -1 +1 @@
1
- {"version":3,"file":"Toast.js","sourceRoot":"","sources":["../../src/components/Toast.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,aAAa,EACb,WAAW,EACX,UAAU,EACV,SAAS,EACT,OAAO,EACP,UAAU,EACV,MAAM,EACN,QAAQ,GAET,MAAM,OAAO,CAAA;AACd,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,EAAmB,MAAM,cAAc,CAAA;AAChG,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAA;AACpC,OAAO,EACL,WAAW,EACX,YAAY,GAIb,MAAM,uBAAuB,CAAA;AAY9B,MAAM,YAAY,GAAG,aAAa,CAAkB,IAAI,CAAC,CAAA;AAEzD,+EAA+E;AAC/E,MAAM,WAAW,GAAa,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAA;AAEnE;;;;;GAKG;AACH,MAAM,UAAU,QAAQ;IACtB,OAAO,UAAU,CAAC,YAAY,CAAC,IAAI,WAAW,CAAA;AAChD,CAAC;AAED;;;;GAIG;AACH,MAAM,SAAS,GAA8B;IAC3C,OAAO,EAAE,wCAAwC;IACjD,OAAO,EAAE,wCAAwC;IACjD,MAAM,EAAE,sCAAsC;IAC9C,IAAI,EAAE,kCAAkC;CACzC,CAAA;AAED;;;;GAIG;AACH,MAAM,UAAU,GAAkC;IAChD,OAAO,EAAE,WAAW;IACpB,OAAO,EAAE,aAAa;IACtB,MAAM,EAAE,WAAW;IACnB,IAAI,EAAE,IAAI;CACX,CAAA;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,MAAM,EACN,SAAS,GAIV;IACC,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAA;IACrC,OAAO,CACL,2BACY,gBAAgB,EAC1B,IAAI,EAAC,QAAQ,eACH,QAAQ,gBACN,QAAQ,CAAC,MAAM,CAAC,aAAa,EACzC,SAAS,EAAC,yFAAyF,YAElG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACrB,KAAC,SAAS,IAER,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,EACrC,SAAS,EAAE,SAAS,IAHf,KAAK,CAAC,EAAE,CAIb,CACH,CAAC,GACE,CACP,CAAA;AACH,CAAC;AAED,SAAS,SAAS,CAAC,EACjB,KAAK,EACL,YAAY,EACZ,SAAS,GAKV;IACC,wEAAwE;IACxE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACvC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,IAAI;YAAE,OAAM;QAChB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAA;QACnE,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;IAClC,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC/C,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACnC,OAAO,CACL,4BACY,OAAO,eACN,KAAK,CAAC,IAAI,EACrB,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EACjC,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAClC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAC5B,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAC5B,SAAS,EAAE,EAAE;QACX,wEAAwE;QACxE,uCAAuC;QACvC,yKAAyK,EACzK,gJAAgJ,EAChJ,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CACtB,aAED,KAAC,IAAI,mBAAa,MAAM,EAAC,SAAS,EAAE,EAAE,CAAC,wBAAwB,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAI,EAC3F,eAAK,SAAS,EAAC,gBAAgB,aAC7B,YAAG,SAAS,EAAC,yBAAyB,YAAE,KAAK,CAAC,KAAK,GAAK,EACvD,KAAK,CAAC,WAAW,IAAI,CACpB,YAAG,SAAS,EAAC,0CAA0C,YAAE,KAAK,CAAC,WAAW,GAAK,CAChF,IACG,EACN,iBACE,IAAI,EAAC,QAAQ,gBACD,YAAY,EACxB,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,EAClC,SAAS,EAAE,wHAAwH,UAAU,EAAE,YAE/I,KAAC,CAAC,mBAAa,MAAM,EAAC,SAAS,EAAC,QAAQ,GAAG,GACpC,IACL,CACP,CAAA;AACH,CAAC;AAED,SAAS,SAAS,CAAC,EAAE,QAAQ,EAA2B;IACtD,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;IACvD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;IACxB,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IAClF,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,OAAqB,EAAE,EAAE;QACjD,MAAM,CAAC,OAAO,IAAI,CAAC,CAAA;QACnB,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAA;QACzB,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,CAAA;QAC1D,OAAO,EAAE,CAAA;IACX,CAAC,EAAE,EAAE,CAAC,CAAA;IACN,MAAM,GAAG,GAAG,OAAO,CAAW,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;IACzE,OAAO,CACL,MAAC,YAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,GAAG,aAC9B,QAAQ,EACT,KAAC,aAAa,IAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAI,IAC/B,CACzB,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,EAAE,QAAQ,EAA2B;IACjE,MAAM,MAAM,GAAG,UAAU,CAAC,YAAY,CAAC,CAAA;IACvC,OAAO,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAC,SAAS,cAAE,QAAQ,GAAa,CAAA;AAC9D,CAAC"}
1
+ {"version":3,"file":"Toast.js","sourceRoot":"","sources":["../../src/components/Toast.tsx"],"names":[],"mappings":"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"}
@@ -1,21 +1,45 @@
1
1
  import type { ReactNode } from "react";
2
- import { type ToneVariant } from "../lib/tone-utils.js";
2
+ import { type ToneName } from "../lib/tone-utils.js";
3
+ /** Heading element of a {@link WidgetHeader} title. */
4
+ export type WidgetHeadingLevel = "h1" | "h2" | "h3" | "h4" | "h5" | "h6";
3
5
  export interface WidgetHeaderProps {
4
- /** Optional icon/glyph rendered in a tinted tile above the title. */
5
- icon?: ReactNode;
6
- /** Tone for the icon tile. Default `"neutral"`. */
7
- iconTone?: ToneVariant;
8
6
  /** The widget title. */
9
7
  title: ReactNode;
10
- /** Subtitle/meta row under the title (e.g. a live pill + counts). */
8
+ /**
9
+ * Heading element of the title. Default `"h1"`: the widget is the page.
10
+ * Pick the level that keeps ONE outline per view — below a toolbar title
11
+ * (`McpAppView` `titleMode="show"`, an h2 by default) use `"h3"`, inside a
12
+ * composed view under its own heading one level below it. The size follows
13
+ * `size`, not the level.
14
+ */
15
+ as?: WidgetHeadingLevel;
16
+ /**
17
+ * `"default"`: the page title (28 px / 700, the CI h2 style). `"detail"`:
18
+ * the compact detail-page title (21 px / 600, the CI h3 style).
19
+ */
20
+ size?: "default" | "detail";
21
+ /** Inline after the title inside the heading (e.g. a version chip). */
22
+ titleSuffix?: ReactNode;
23
+ /** Above the title — a `StatusBadge` that says the state in words. */
24
+ badge?: ReactNode;
25
+ /** Subtitle/meta row under the title (e.g. a live pill + counts), a 13 px caption row. */
11
26
  sub?: ReactNode;
12
27
  /** Right-aligned actions slot (buttons, drill controls). */
13
28
  actions?: ReactNode;
29
+ /**
30
+ * @deprecated A glyph in a tinted tile above every title is the icon-tile
31
+ * pattern the CI rules out (anti-slop U2). Say a state in words with a
32
+ * `StatusBadge` in {@link WidgetHeaderProps.badge}. Still rendered when set.
33
+ */
34
+ icon?: ReactNode;
35
+ /** @deprecated Tone of the deprecated {@link WidgetHeaderProps.icon} tile. */
36
+ iconTone?: ToneName;
37
+ className?: string;
14
38
  }
15
39
  /**
16
- * Page-level header for the top of a dashboard widget: an optional tinted icon
17
- * tile, a large title, a subtitle/meta row, and a right-aligned actions slot.
18
- * Use once per widget surface to anchor it.
40
+ * Page-level header at the top of a widget: an optional state badge, the
41
+ * title (heading level per `as`, size per `size`), a subtitle/meta row and a
42
+ * right-aligned actions slot. Use once per widget surface to anchor it.
19
43
  */
20
- export declare function WidgetHeader({ icon, iconTone, title, sub, actions, }: WidgetHeaderProps): import("react").JSX.Element;
44
+ export declare function WidgetHeader({ title, as: Heading, size, titleSuffix, badge, sub, actions, icon, iconTone, className, }: WidgetHeaderProps): import("react").JSX.Element;
21
45
  //# sourceMappingURL=WidgetHeader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"WidgetHeader.d.ts","sourceRoot":"","sources":["../../src/components/WidgetHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAElE,MAAM,WAAW,iBAAiB;IAChC,qEAAqE;IACrE,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,WAAW,CAAA;IACtB,wBAAwB;IACxB,KAAK,EAAE,SAAS,CAAA;IAChB,qEAAqE;IACrE,GAAG,CAAC,EAAE,SAAS,CAAA;IACf,4DAA4D;IAC5D,OAAO,CAAC,EAAE,SAAS,CAAA;CACpB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,QAAoB,EACpB,KAAK,EACL,GAAG,EACH,OAAO,GACR,EAAE,iBAAiB,+BAuBnB"}
1
+ {"version":3,"file":"WidgetHeader.d.ts","sourceRoot":"","sources":["../../src/components/WidgetHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAA0B,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAG5E,uDAAuD;AACvD,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAExE,MAAM,WAAW,iBAAiB;IAChC,wBAAwB;IACxB,KAAK,EAAE,SAAS,CAAA;IAChB;;;;;;OAMG;IACH,EAAE,CAAC,EAAE,kBAAkB,CAAA;IACvB;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAA;IAC3B,uEAAuE;IACvE,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB,sEAAsE;IACtE,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,0FAA0F;IAC1F,GAAG,CAAC,EAAE,SAAS,CAAA;IACf,4DAA4D;IAC5D,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB;;;;OAIG;IACH,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAOD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,EAAE,EAAE,OAAc,EAClB,IAAgB,EAChB,WAAW,EACX,KAAK,EACL,GAAG,EACH,OAAO,EACP,IAAI,EACJ,QAAoB,EACpB,SAAS,GACV,EAAE,iBAAiB,+BAkCnB"}
@@ -1,11 +1,16 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { TONE_SOFT } from "../lib/tone-utils.js";
2
+ import { resolveTone, TONE_SOFT } from "../lib/tone-utils.js";
3
+ import { cn } from "../lib/utils.js";
4
+ const TITLE_SIZE = {
5
+ default: "text-title",
6
+ detail: "text-section",
7
+ };
3
8
  /**
4
- * Page-level header for the top of a dashboard widget: an optional tinted icon
5
- * tile, a large title, a subtitle/meta row, and a right-aligned actions slot.
6
- * Use once per widget surface to anchor it.
9
+ * Page-level header at the top of a widget: an optional state badge, the
10
+ * title (heading level per `as`, size per `size`), a subtitle/meta row and a
11
+ * right-aligned actions slot. Use once per widget surface to anchor it.
7
12
  */
8
- export function WidgetHeader({ icon, iconTone = "neutral", title, sub, actions, }) {
9
- return (_jsxs("header", { className: "flex flex-wrap items-start justify-between gap-4", children: [_jsxs("div", { className: "min-w-0", children: [icon && (_jsx("div", { className: `mb-3.5 grid size-11 place-items-center rounded-md text-xl ${TONE_SOFT[iconTone]}`, children: icon })), _jsx("h1", { className: "text-foreground mb-1.5 text-3xl leading-tight font-bold tracking-tight", children: title }), sub && (_jsx("div", { className: "text-muted-foreground flex flex-wrap items-center gap-2 text-sm", children: sub }))] }), actions && _jsx("div", { className: "flex flex-wrap items-center gap-2", children: actions })] }));
13
+ export function WidgetHeader({ title, as: Heading = "h1", size = "default", titleSuffix, badge, sub, actions, icon, iconTone = "neutral", className, }) {
14
+ return (_jsxs("header", { "data-slot": "widget-header", className: cn("flex flex-wrap items-start justify-between gap-4", className), children: [_jsxs("div", { className: "min-w-0", children: [icon && (_jsx("div", { "aria-hidden": "true", className: cn("text-section mb-3.5 grid size-11 place-items-center rounded-md", TONE_SOFT[resolveTone(iconTone)]), children: icon })), badge && _jsx("div", { className: "mb-3", children: badge }), _jsxs(Heading, { className: cn("text-foreground mb-1.5 tracking-tight break-words", TITLE_SIZE[size]), children: [title, titleSuffix] }), sub && (_jsx("div", { className: "text-muted-foreground text-small flex flex-wrap items-center gap-2", children: sub }))] }), actions && _jsx("div", { className: "flex flex-wrap items-center gap-2", children: actions })] }));
10
15
  }
11
16
  //# sourceMappingURL=WidgetHeader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WidgetHeader.js","sourceRoot":"","sources":["../../src/components/WidgetHeader.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAoB,MAAM,sBAAsB,CAAA;AAelE;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,EAC3B,IAAI,EACJ,QAAQ,GAAG,SAAS,EACpB,KAAK,EACL,GAAG,EACH,OAAO,GACW;IAClB,OAAO,CACL,kBAAQ,SAAS,EAAC,kDAAkD,aAClE,eAAK,SAAS,EAAC,SAAS,aACrB,IAAI,IAAI,CACP,cACE,SAAS,EAAE,6DAA6D,SAAS,CAAC,QAAQ,CAAC,EAAE,YAE5F,IAAI,GACD,CACP,EACD,aAAI,SAAS,EAAC,wEAAwE,YACnF,KAAK,GACH,EACJ,GAAG,IAAI,CACN,cAAK,SAAS,EAAC,iEAAiE,YAC7E,GAAG,GACA,CACP,IACG,EACL,OAAO,IAAI,cAAK,SAAS,EAAC,mCAAmC,YAAE,OAAO,GAAO,IACvE,CACV,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"WidgetHeader.js","sourceRoot":"","sources":["../../src/components/WidgetHeader.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAiB,MAAM,sBAAsB,CAAA;AAC5E,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAA;AAwCpC,MAAM,UAAU,GAA2D;IACzE,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,cAAc;CACvB,CAAA;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,EAC3B,KAAK,EACL,EAAE,EAAE,OAAO,GAAG,IAAI,EAClB,IAAI,GAAG,SAAS,EAChB,WAAW,EACX,KAAK,EACL,GAAG,EACH,OAAO,EACP,IAAI,EACJ,QAAQ,GAAG,SAAS,EACpB,SAAS,GACS;IAClB,OAAO,CACL,+BACY,eAAe,EACzB,SAAS,EAAE,EAAE,CAAC,kDAAkD,EAAE,SAAS,CAAC,aAE5E,eAAK,SAAS,EAAC,SAAS,aACrB,IAAI,IAAI,CACP,6BACc,MAAM,EAClB,SAAS,EAAE,EAAE,CACX,gEAAgE,EAChE,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CACjC,YAEA,IAAI,GACD,CACP,EACA,KAAK,IAAI,cAAK,SAAS,EAAC,MAAM,YAAE,KAAK,GAAO,EAC7C,MAAC,OAAO,IACN,SAAS,EAAE,EAAE,CAAC,mDAAmD,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,aAEnF,KAAK,EACL,WAAW,IACJ,EACT,GAAG,IAAI,CACN,cAAK,SAAS,EAAC,oEAAoE,YAChF,GAAG,GACA,CACP,IACG,EACL,OAAO,IAAI,cAAK,SAAS,EAAC,mCAAmC,YAAE,OAAO,GAAO,IACvE,CACV,CAAA;AACH,CAAC"}
@@ -1,11 +1,11 @@
1
1
  export { useIsMobile } from "./use-mobile.js";
2
2
  export { useDebouncedValue } from "./use-debounced-value.js";
3
- export { useToolQuery, useToolMutation } from "./use-tool-query.js";
4
- export type { UseToolQueryOptions } from "./use-tool-query.js";
3
+ export { useToolQuery, useToolQueryKey, useToolMutation } from "./use-tool-query.js";
4
+ export type { UseToolQueryOptions, UseToolMutationOptions } from "./use-tool-query.js";
5
5
  export { useViewToolQuery } from "./use-view-tool-query.js";
6
6
  export type { UseViewToolQueryOptions } from "./use-view-tool-query.js";
7
7
  export { useViewData } from "./use-view-data.js";
8
- export type { ViewDataResult } from "./use-view-data.js";
8
+ export type { ViewDataResult, UseViewDataOptions, ViewDataMode } from "./use-view-data.js";
9
9
  export { useToolResultRecovery, resolveRecoveryToolName, decodeRecoveredResult, } from "./use-tool-result-recovery.js";
10
- export type { ToolResultRecoveryOptions, ToolResultRecoveryState, } from "./use-tool-result-recovery.js";
10
+ export type { RecoveryBlockReason, RecoveryPolicy, ToolResultRecoveryOptions, ToolResultRecoveryState, ToolSafety, } from "./use-tool-result-recovery.js";
11
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACnE,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,YAAY,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,+BAA+B,CAAA;AACtC,YAAY,EACV,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,+BAA+B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACpF,YAAY,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,YAAY,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAC1F,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,+BAA+B,CAAA;AACtC,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,yBAAyB,EACzB,uBAAuB,EACvB,UAAU,GACX,MAAM,+BAA+B,CAAA"}
@@ -1,6 +1,6 @@
1
1
  export { useIsMobile } from "./use-mobile.js";
2
2
  export { useDebouncedValue } from "./use-debounced-value.js";
3
- export { useToolQuery, useToolMutation } from "./use-tool-query.js";
3
+ export { useToolQuery, useToolQueryKey, useToolMutation } from "./use-tool-query.js";
4
4
  export { useViewToolQuery } from "./use-view-tool-query.js";
5
5
  export { useViewData } from "./use-view-data.js";
6
6
  export { useToolResultRecovery, resolveRecoveryToolName, decodeRecoveredResult, } from "./use-tool-result-recovery.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAEnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAE3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,+BAA+B,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAEpF,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAE3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,+BAA+B,CAAA"}
@@ -0,0 +1,155 @@
1
+ import type { ToolObservation, ToolResultObserver } from "../lib/tool-result-observer.js";
2
+ /**
3
+ * What the host's tool annotations say about re-running the originating
4
+ * tool: `readOnlyHint: true` is `"read-only"`, `readOnlyHint: false` or
5
+ * `destructiveHint: true` is `"writes"`, anything else (no tool definition,
6
+ * no annotations, no read-only hint) is `"unknown"`.
7
+ */
8
+ export type ToolSafety = "read-only" | "writes" | "unknown";
9
+ /**
10
+ * Which tools the view may re-execute on its own to recover a stripped result.
11
+ *
12
+ * - `"auto"` (default): any tool the host does not report as writing — a
13
+ * view tool is a read by the toolkit's render contract, so a missing hint
14
+ * counts as one.
15
+ * - `"read-only"`: only a tool the host reports with `readOnlyHint: true`.
16
+ * - `"never"`: never; a stripped result shows the error state, whose retry
17
+ * runs the tool on the user's click.
18
+ */
19
+ export type RecoveryPolicy = "auto" | "read-only" | "never";
20
+ /** Why a needed recovery did not run: the policy forbids it, or the host names no tool. */
21
+ export type RecoveryBlockReason = "policy" | "no-tool";
22
+ /** Read {@link ToolSafety} from `hostContext.toolInfo.tool.annotations` (SEP-1865). */
23
+ export declare function resolveToolSafety(hostContext: unknown): ToolSafety;
24
+ /** Whether `policy` lets the view re-execute a tool of this `safety` on its own. */
25
+ export declare function policyAllows(policy: RecoveryPolicy, safety: ToolSafety): boolean;
26
+ export interface RecoveryDecisionInput {
27
+ /** The latch fired (`useToolContext().status !== "pending"`). */
28
+ resultReady: boolean;
29
+ /** The latched payload is renderable (a conforming host delivered it). */
30
+ payloadValid: boolean;
31
+ /** The host cancelled the call. */
32
+ cancelled: boolean;
33
+ /** The call latched a tool error (an `isError` result or a failed call). */
34
+ errored: boolean;
35
+ /** What the transport observer saw; `null` when none listens. */
36
+ observation: ToolObservation | null;
37
+ /** The call's arguments arrived (any tool-input, partial or complete). */
38
+ hasInput: boolean;
39
+ /** The originating tool (`hostContext.toolInfo`), when the host names it. */
40
+ toolName: string | undefined;
41
+ safety: ToolSafety;
42
+ policy: RecoveryPolicy;
43
+ /** The fallback grace period passed for the current arguments. */
44
+ graceElapsed: boolean;
45
+ }
46
+ export type RecoveryDecision =
47
+ /** Delivered, failed or cancelled: nothing to recover. */
48
+ {
49
+ action: "none";
50
+ }
51
+ /** The result is not in yet; `armGrace` starts the fallback timer (observer cannot vouch). */
52
+ | {
53
+ action: "wait";
54
+ armGrace: boolean;
55
+ }
56
+ /** Re-execute the originating tool now. */
57
+ | {
58
+ action: "recover";
59
+ }
60
+ /** A recovery is needed but must not run. */
61
+ | {
62
+ action: "blocked";
63
+ reason: RecoveryBlockReason;
64
+ };
65
+ /** The recovery rule (see the module comment). Pure: every input is explicit. */
66
+ export declare function decideRecovery(input: RecoveryDecisionInput): RecoveryDecision;
67
+ /**
68
+ * The arguments a re-execution runs with: the complete tool-input the
69
+ * observer saw, else the view runtime's latest input, else none.
70
+ */
71
+ export declare function recoveryArgs(observation: ToolObservation | null, toolInput: Record<string, unknown> | null | undefined): Record<string, unknown>;
72
+ /**
73
+ * Content identity of a JSON value, independent of key order and object
74
+ * identity: a re-delivered equal input is the same input (N21).
75
+ */
76
+ export declare function stableKey(value: unknown): string;
77
+ /**
78
+ * Decodes a re-executed tool result and validates it: the payload, or `null`
79
+ * for an error result, an empty one or one the validator refuses.
80
+ */
81
+ export declare function decodeRecoveredResult<T>(result: unknown, isValid: (value: unknown) => boolean): T | null;
82
+ export interface ToolResultRecoveryState<T> {
83
+ /** The recovered payload, `null` until the re-execution resolved (or when it failed). */
84
+ data: T | null;
85
+ /** The single recovery attempt failed — the view shows its error state, no retry loop. */
86
+ failed: boolean;
87
+ /**
88
+ * A recovery was needed but did not run: the policy forbids re-executing
89
+ * this tool, or the host names no tool. `null` otherwise.
90
+ */
91
+ blocked: RecoveryBlockReason | null;
92
+ /** When the recovered payload arrived (epoch ms) — its data is live as of then (N23). */
93
+ recoveredAt: number | null;
94
+ /** The arguments the recovered payload was computed for. */
95
+ args: Record<string, unknown> | null;
96
+ }
97
+ export declare const RECOVERY_IDLE: ToolResultRecoveryState<never>;
98
+ /** What the view knows about the rendering call on each render. */
99
+ export interface RecoveryInputs {
100
+ resultReady: boolean;
101
+ cancelled: boolean;
102
+ errored: boolean;
103
+ /** The payload the host delivered (`useToolContext().toolOutput`). */
104
+ props: unknown;
105
+ isValid: (value: unknown) => boolean;
106
+ toolInput: Record<string, unknown> | null | undefined;
107
+ /** Raw host context; `toolInfo` names the originating tool and its annotations. */
108
+ hostContext: Record<string, unknown> | null | undefined;
109
+ callTool: (name: string, args: Record<string, unknown>) => Promise<unknown>;
110
+ policy: RecoveryPolicy;
111
+ /** The fallback grace period (observer cannot vouch). */
112
+ graceMs: number;
113
+ /** Resolves the originating tool name from the host context. */
114
+ resolveToolName: (hostContext: unknown) => string | undefined;
115
+ }
116
+ export interface RecoveryController<T> {
117
+ subscribe: (listener: () => void) => () => void;
118
+ getState: () => ToolResultRecoveryState<T>;
119
+ /** Feed the latest inputs (every commit) and act on the decision. */
120
+ update: (inputs: RecoveryInputs) => void;
121
+ /** Listen to the observer (mount). */
122
+ start: () => void;
123
+ /** Stop listening and drop the grace timer; an in-flight call still lands (StrictMode re-runs). */
124
+ stop: () => void;
125
+ }
126
+ export interface RecoveryControllerOptions {
127
+ /** The transport observer; `null` when none listens (the grace timer decides alone). */
128
+ observer: ToolResultObserver | null;
129
+ /** Clock for {@link ToolResultRecoveryState.recoveredAt}. Default `Date.now`. */
130
+ now?: () => number;
131
+ }
132
+ /** One evaluation of the inputs: the decision plus the run it concerns. */
133
+ interface Evaluation {
134
+ decision: RecoveryDecision;
135
+ toolName: string | undefined;
136
+ args: Record<string, unknown>;
137
+ /** Content identity of `args` (the grace timer's key). */
138
+ argsKey: string;
139
+ /** Identity of the run: the tool and its arguments (the single flight's key). */
140
+ runKey: string;
141
+ }
142
+ /** Run {@link decideRecovery} on the controller's current knowledge. */
143
+ export declare function evaluateRecovery(inputs: RecoveryInputs, observation: ToolObservation | null, grace: {
144
+ key: string | null;
145
+ elapsed: boolean;
146
+ }): Evaluation;
147
+ /**
148
+ * Runs {@link decideRecovery} for the view: re-evaluates on every input
149
+ * update and observer change, arms the fallback grace timer per argument set,
150
+ * and makes at most one call per run (single flight, keyed by the tool and
151
+ * its arguments; a newer run drops an older call's outcome).
152
+ */
153
+ export declare function createRecoveryController<T>(options: RecoveryControllerOptions): RecoveryController<T>;
154
+ export {};
155
+ //# sourceMappingURL=tool-result-recovery-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-result-recovery-model.d.ts","sourceRoot":"","sources":["../../src/hooks/tool-result-recovery-model.ts"],"names":[],"mappings":"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"}