@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.
- package/README.md +7 -4
- package/dist/app/adapt-data-widget.d.ts +1 -22
- package/dist/app/adapt-data-widget.d.ts.map +1 -1
- package/dist/app/adapt-data-widget.js +1 -35
- package/dist/app/adapt-data-widget.js.map +1 -1
- package/dist/app/builder/BuilderBanners.js +1 -1
- package/dist/app/builder/BuilderBanners.js.map +1 -1
- package/dist/app/builder/CanvasRow.d.ts +4 -2
- package/dist/app/builder/CanvasRow.d.ts.map +1 -1
- package/dist/app/builder/CanvasRow.js +21 -7
- package/dist/app/builder/CanvasRow.js.map +1 -1
- package/dist/app/builder/CatalogueSheet.d.ts.map +1 -1
- package/dist/app/builder/CatalogueSheet.js +11 -4
- package/dist/app/builder/CatalogueSheet.js.map +1 -1
- package/dist/app/builder/CellPropsSheet.d.ts +7 -3
- package/dist/app/builder/CellPropsSheet.d.ts.map +1 -1
- package/dist/app/builder/CellPropsSheet.js +10 -3
- package/dist/app/builder/CellPropsSheet.js.map +1 -1
- package/dist/app/builder/DiscardDialog.d.ts +18 -0
- package/dist/app/builder/DiscardDialog.d.ts.map +1 -0
- package/dist/app/builder/DiscardDialog.js +18 -0
- package/dist/app/builder/DiscardDialog.js.map +1 -0
- package/dist/app/builder/LayoutSurface.d.ts +33 -9
- package/dist/app/builder/LayoutSurface.d.ts.map +1 -1
- package/dist/app/builder/LayoutSurface.js +74 -23
- package/dist/app/builder/LayoutSurface.js.map +1 -1
- package/dist/app/builder/PipelineStrip.d.ts +2 -1
- package/dist/app/builder/PipelineStrip.d.ts.map +1 -1
- package/dist/app/builder/PipelineStrip.js +26 -13
- package/dist/app/builder/PipelineStrip.js.map +1 -1
- package/dist/app/builder/SaveDialog.d.ts +9 -1
- package/dist/app/builder/SaveDialog.d.ts.map +1 -1
- package/dist/app/builder/SaveDialog.js +8 -2
- package/dist/app/builder/SaveDialog.js.map +1 -1
- package/dist/app/builder/Toolbar.d.ts +12 -4
- package/dist/app/builder/Toolbar.d.ts.map +1 -1
- package/dist/app/builder/Toolbar.js +18 -7
- package/dist/app/builder/Toolbar.js.map +1 -1
- package/dist/app/builder/Workspace.d.ts +23 -3
- package/dist/app/builder/Workspace.d.ts.map +1 -1
- package/dist/app/builder/Workspace.js +58 -8
- package/dist/app/builder/Workspace.js.map +1 -1
- package/dist/app/builder/builder-model.d.ts +143 -1
- package/dist/app/builder/builder-model.d.ts.map +1 -1
- package/dist/app/builder/builder-model.js +191 -1
- package/dist/app/builder/builder-model.js.map +1 -1
- package/dist/app/builder/reveal.d.ts +10 -0
- package/dist/app/builder/reveal.d.ts.map +1 -0
- package/dist/app/builder/reveal.js +10 -0
- package/dist/app/builder/reveal.js.map +1 -0
- package/dist/app/builder/use-builder-catalogue.d.ts +4 -1
- package/dist/app/builder/use-builder-catalogue.d.ts.map +1 -1
- package/dist/app/builder/use-builder-catalogue.js +44 -17
- package/dist/app/builder/use-builder-catalogue.js.map +1 -1
- package/dist/app/builder/use-builder-session.d.ts +30 -0
- package/dist/app/builder/use-builder-session.d.ts.map +1 -0
- package/dist/app/builder/use-builder-session.js +58 -0
- package/dist/app/builder/use-builder-session.js.map +1 -0
- package/dist/app/builder/use-display-resolver.d.ts +17 -0
- package/dist/app/builder/use-display-resolver.d.ts.map +1 -0
- package/dist/app/builder/use-display-resolver.js +16 -0
- package/dist/app/builder/use-display-resolver.js.map +1 -0
- package/dist/app/index.d.ts +8 -3
- package/dist/app/index.d.ts.map +1 -1
- package/dist/app/index.js +8 -2
- package/dist/app/index.js.map +1 -1
- package/dist/app/layout-builder.d.ts +13 -25
- package/dist/app/layout-builder.d.ts.map +1 -1
- package/dist/app/layout-builder.js +75 -81
- package/dist/app/layout-builder.js.map +1 -1
- package/dist/app/mcp-app-view-chrome.d.ts +12 -3
- package/dist/app/mcp-app-view-chrome.d.ts.map +1 -1
- package/dist/app/mcp-app-view-chrome.js +21 -5
- package/dist/app/mcp-app-view-chrome.js.map +1 -1
- package/dist/app/mcp-app-view-states.d.ts +11 -3
- package/dist/app/mcp-app-view-states.d.ts.map +1 -1
- package/dist/app/mcp-app-view-states.js +29 -8
- package/dist/app/mcp-app-view-states.js.map +1 -1
- package/dist/app/mcp-app-view.d.ts +33 -1
- package/dist/app/mcp-app-view.d.ts.map +1 -1
- package/dist/app/mcp-app-view.js +181 -127
- package/dist/app/mcp-app-view.js.map +1 -1
- package/dist/app/mcp-toolkit-app.d.ts +6 -1
- package/dist/app/mcp-toolkit-app.d.ts.map +1 -1
- package/dist/app/mcp-toolkit-app.js +8 -1
- package/dist/app/mcp-toolkit-app.js.map +1 -1
- package/dist/app/mcp-use-host-bridge.d.ts +15 -6
- package/dist/app/mcp-use-host-bridge.d.ts.map +1 -1
- package/dist/app/mcp-use-host-bridge.js +51 -22
- package/dist/app/mcp-use-host-bridge.js.map +1 -1
- package/dist/app/model-context.d.ts +71 -0
- package/dist/app/model-context.d.ts.map +1 -0
- package/dist/app/model-context.js +101 -0
- package/dist/app/model-context.js.map +1 -0
- package/dist/app/use-build-mode-focus.d.ts +33 -0
- package/dist/app/use-build-mode-focus.d.ts.map +1 -0
- package/dist/app/use-build-mode-focus.js +59 -0
- package/dist/app/use-build-mode-focus.js.map +1 -0
- package/dist/app/use-view-actions.d.ts +31 -0
- package/dist/app/use-view-actions.d.ts.map +1 -0
- package/dist/app/use-view-actions.js +81 -0
- package/dist/app/use-view-actions.js.map +1 -0
- package/dist/app/use-view-lifecycle.d.ts +4 -0
- package/dist/app/use-view-lifecycle.d.ts.map +1 -1
- package/dist/app/use-view-lifecycle.js +2 -0
- package/dist/app/use-view-lifecycle.js.map +1 -1
- package/dist/app/view-lifecycle.d.ts +80 -4
- package/dist/app/view-lifecycle.d.ts.map +1 -1
- package/dist/app/view-lifecycle.js +90 -3
- package/dist/app/view-lifecycle.js.map +1 -1
- package/dist/app/widget-fixture.d.ts +10 -3
- package/dist/app/widget-fixture.d.ts.map +1 -1
- package/dist/app/widget-fixture.js +21 -8
- package/dist/app/widget-fixture.js.map +1 -1
- package/dist/app/widget-props-sheet.d.ts +3 -1
- package/dist/app/widget-props-sheet.d.ts.map +1 -1
- package/dist/app/widget-props-sheet.js +22 -10
- package/dist/app/widget-props-sheet.js.map +1 -1
- package/dist/app/widget-renderer.js +1 -1
- package/dist/app/widget-renderer.js.map +1 -1
- package/dist/components/DrillButton.d.ts +9 -6
- package/dist/components/DrillButton.d.ts.map +1 -1
- package/dist/components/DrillButton.js +8 -6
- package/dist/components/DrillButton.js.map +1 -1
- package/dist/components/EmptyState.d.ts.map +1 -1
- package/dist/components/EmptyState.js +4 -2
- package/dist/components/EmptyState.js.map +1 -1
- package/dist/components/ErrorState.d.ts +5 -2
- package/dist/components/ErrorState.d.ts.map +1 -1
- package/dist/components/ErrorState.js +25 -8
- package/dist/components/ErrorState.js.map +1 -1
- package/dist/components/FilterBar.d.ts +15 -4
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +11 -6
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/KpiGrid.d.ts +66 -21
- package/dist/components/KpiGrid.d.ts.map +1 -1
- package/dist/components/KpiGrid.js +101 -34
- package/dist/components/KpiGrid.js.map +1 -1
- package/dist/components/ListFooter.d.ts +31 -4
- package/dist/components/ListFooter.d.ts.map +1 -1
- package/dist/components/ListFooter.js +30 -11
- package/dist/components/ListFooter.js.map +1 -1
- package/dist/components/PagedListFooter.d.ts +57 -0
- package/dist/components/PagedListFooter.d.ts.map +1 -0
- package/dist/components/PagedListFooter.js +27 -0
- package/dist/components/PagedListFooter.js.map +1 -0
- package/dist/components/Pills.d.ts +27 -7
- package/dist/components/Pills.d.ts.map +1 -1
- package/dist/components/Pills.js +21 -6
- package/dist/components/Pills.js.map +1 -1
- package/dist/components/SectionHeading.d.ts +3 -1
- package/dist/components/SectionHeading.d.ts.map +1 -1
- package/dist/components/SectionHeading.js +6 -2
- package/dist/components/SectionHeading.js.map +1 -1
- package/dist/components/Toast.d.ts +9 -3
- package/dist/components/Toast.d.ts.map +1 -1
- package/dist/components/Toast.js +31 -16
- package/dist/components/Toast.js.map +1 -1
- package/dist/components/WidgetHeader.d.ts +34 -10
- package/dist/components/WidgetHeader.d.ts.map +1 -1
- package/dist/components/WidgetHeader.js +11 -6
- package/dist/components/WidgetHeader.js.map +1 -1
- package/dist/hooks/index.d.ts +4 -4
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/tool-result-recovery-model.d.ts +155 -0
- package/dist/hooks/tool-result-recovery-model.d.ts.map +1 -0
- package/dist/hooks/tool-result-recovery-model.js +273 -0
- package/dist/hooks/tool-result-recovery-model.js.map +1 -0
- package/dist/hooks/use-tool-query.d.ts +56 -14
- package/dist/hooks/use-tool-query.d.ts.map +1 -1
- package/dist/hooks/use-tool-query.js +102 -25
- package/dist/hooks/use-tool-query.js.map +1 -1
- package/dist/hooks/use-tool-result-recovery.d.ts +47 -52
- package/dist/hooks/use-tool-result-recovery.d.ts.map +1 -1
- package/dist/hooks/use-tool-result-recovery.js +58 -120
- package/dist/hooks/use-tool-result-recovery.js.map +1 -1
- package/dist/hooks/use-view-data.d.ts +52 -10
- package/dist/hooks/use-view-data.d.ts.map +1 -1
- package/dist/hooks/use-view-data.js +81 -16
- package/dist/hooks/use-view-data.js.map +1 -1
- package/dist/hooks/use-view-tool-query.d.ts +12 -7
- package/dist/hooks/use-view-tool-query.d.ts.map +1 -1
- package/dist/hooks/use-view-tool-query.js +15 -14
- package/dist/hooks/use-view-tool-query.js.map +1 -1
- package/dist/index.d.ts +17 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -6
- package/dist/index.js.map +1 -1
- package/dist/lib/focus-return.d.ts +61 -0
- package/dist/lib/focus-return.d.ts.map +1 -0
- package/dist/lib/focus-return.js +46 -0
- package/dist/lib/focus-return.js.map +1 -0
- package/dist/lib/parse-tool-result.d.ts +23 -1
- package/dist/lib/parse-tool-result.d.ts.map +1 -1
- package/dist/lib/parse-tool-result.js +38 -2
- package/dist/lib/parse-tool-result.js.map +1 -1
- package/dist/lib/toast-model.d.ts +41 -1
- package/dist/lib/toast-model.d.ts.map +1 -1
- package/dist/lib/toast-model.js +67 -1
- package/dist/lib/toast-model.js.map +1 -1
- package/dist/lib/tone-utils.d.ts +58 -6
- package/dist/lib/tone-utils.d.ts.map +1 -1
- package/dist/lib/tone-utils.js +66 -4
- package/dist/lib/tone-utils.js.map +1 -1
- package/dist/lib/tool-query.d.ts +107 -0
- package/dist/lib/tool-query.d.ts.map +1 -0
- package/dist/lib/tool-query.js +182 -0
- package/dist/lib/tool-query.js.map +1 -0
- package/dist/lib/tool-result-observer.d.ts +108 -0
- package/dist/lib/tool-result-observer.d.ts.map +1 -0
- package/dist/lib/tool-result-observer.js +158 -0
- package/dist/lib/tool-result-observer.js.map +1 -0
- package/dist/lib/typography.d.ts +37 -0
- package/dist/lib/typography.d.ts.map +1 -0
- package/dist/lib/typography.js +41 -0
- package/dist/lib/typography.js.map +1 -0
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +11 -1
- package/dist/lib/utils.js.map +1 -1
- package/dist/locale/index.d.ts +1 -1
- package/dist/locale/index.d.ts.map +1 -1
- package/dist/locale/message-types.d.ts +117 -4
- package/dist/locale/message-types.d.ts.map +1 -1
- package/dist/locale/messages-de.d.ts.map +1 -1
- package/dist/locale/messages-de.js +44 -10
- package/dist/locale/messages-de.js.map +1 -1
- package/dist/locale/messages-en.d.ts.map +1 -1
- package/dist/locale/messages-en.js +44 -10
- package/dist/locale/messages-en.js.map +1 -1
- package/dist/locale/toolkit-messages.d.ts +19 -1
- package/dist/locale/toolkit-messages.d.ts.map +1 -1
- package/dist/locale/toolkit-messages.js +54 -1
- package/dist/locale/toolkit-messages.js.map +1 -1
- package/dist/primitives/alert.d.ts +1 -1
- package/dist/primitives/alert.d.ts.map +1 -1
- package/dist/primitives/alert.js +2 -0
- package/dist/primitives/alert.js.map +1 -1
- package/dist/primitives/badge.d.ts +1 -1
- package/dist/primitives/badge.d.ts.map +1 -1
- package/dist/primitives/badge.js +9 -4
- package/dist/primitives/badge.js.map +1 -1
- package/dist/primitives/button.d.ts +1 -1
- package/dist/primitives/button.js +1 -1
- package/dist/primitives/button.js.map +1 -1
- package/dist/primitives/dialog.d.ts +1 -1
- package/dist/primitives/dialog.d.ts.map +1 -1
- package/dist/primitives/dialog.js +10 -3
- package/dist/primitives/dialog.js.map +1 -1
- package/dist/primitives/select.js +1 -1
- package/dist/primitives/select.js.map +1 -1
- package/dist/primitives/sheet.d.ts +1 -1
- package/dist/primitives/sheet.d.ts.map +1 -1
- package/dist/primitives/sheet.js +6 -2
- package/dist/primitives/sheet.js.map +1 -1
- package/dist/providers/query-provider.d.ts +32 -1
- package/dist/providers/query-provider.d.ts.map +1 -1
- package/dist/providers/query-provider.js +53 -4
- package/dist/providers/query-provider.js.map +1 -1
- package/dist/render-cases-primitives.js +1 -1
- package/dist/render-cases-primitives.js.map +1 -1
- package/dist/render-cases.d.ts.map +1 -1
- package/dist/render-cases.js +30 -6
- package/dist/render-cases.js.map +1 -1
- package/dist/render-effects.d.ts +42 -0
- package/dist/render-effects.d.ts.map +1 -0
- package/dist/render-effects.js +81 -0
- package/dist/render-effects.js.map +1 -0
- package/dist/theme/create-theme.d.ts +19 -1
- package/dist/theme/create-theme.d.ts.map +1 -1
- package/dist/theme/create-theme.js +15 -0
- package/dist/theme/create-theme.js.map +1 -1
- package/package.json +5 -4
- package/src/app/adapt-data-widget.tsx +2 -42
- package/src/app/builder/BuilderBanners.tsx +1 -1
- package/src/app/builder/CanvasRow.tsx +63 -17
- package/src/app/builder/CatalogueSheet.tsx +50 -29
- package/src/app/builder/CellPropsSheet.tsx +17 -2
- package/src/app/builder/DiscardDialog.tsx +59 -0
- package/src/app/builder/LayoutSurface.tsx +206 -66
- package/src/app/builder/PipelineStrip.tsx +253 -153
- package/src/app/builder/SaveDialog.tsx +14 -2
- package/src/app/builder/Toolbar.tsx +144 -59
- package/src/app/builder/Workspace.tsx +226 -58
- package/src/app/builder/builder-model.ts +341 -2
- package/src/app/builder/builder-model.ux.test.ts +456 -0
- package/src/app/builder/builder-ux.test.tsx +844 -0
- package/src/app/builder/reveal.ts +10 -0
- package/src/app/builder/use-builder-catalogue.ts +56 -19
- package/src/app/builder/use-builder-session.ts +68 -0
- package/src/app/builder/use-display-resolver.ts +24 -0
- package/src/app/index.ts +12 -2
- package/src/app/layout-builder.tsx +178 -191
- package/src/app/mcp-app-view-chrome.test.tsx +141 -1
- package/src/app/mcp-app-view-chrome.tsx +56 -6
- package/src/app/mcp-app-view-states.tsx +51 -11
- package/src/app/mcp-app-view.effects.test.tsx +292 -0
- package/src/app/mcp-app-view.test.tsx +222 -2
- package/src/app/mcp-app-view.tsx +267 -117
- package/src/app/mcp-toolkit-app.test.tsx +40 -0
- package/src/app/mcp-toolkit-app.tsx +8 -1
- package/src/app/mcp-use-host-bridge.test.tsx +180 -0
- package/src/app/mcp-use-host-bridge.tsx +67 -24
- package/src/app/model-context.test.tsx +116 -0
- package/src/app/model-context.tsx +125 -0
- package/src/app/use-build-mode-focus.ts +62 -0
- package/src/app/use-view-actions.ts +89 -0
- package/src/app/use-view-lifecycle.ts +6 -0
- package/src/app/view-lifecycle.test.ts +216 -0
- package/src/app/view-lifecycle.ts +165 -5
- package/src/app/widget-fixture.effects.test.tsx +51 -0
- package/src/app/widget-fixture.render.test.tsx +81 -0
- package/src/app/widget-fixture.tsx +34 -11
- package/src/app/widget-props-sheet.tsx +57 -16
- package/src/app/widget-renderer.tsx +1 -1
- package/src/components/DrillButton.tsx +23 -10
- package/src/components/EmptyState.tsx +6 -4
- package/src/components/ErrorState.tsx +31 -9
- package/src/components/FilterBar.test.tsx +82 -0
- package/src/components/FilterBar.tsx +52 -26
- package/src/components/KpiGrid.test.tsx +279 -0
- package/src/components/KpiGrid.tsx +297 -90
- package/src/components/ListFooter.test.tsx +116 -0
- package/src/components/ListFooter.tsx +102 -15
- package/src/components/PagedListFooter.test.tsx +140 -0
- package/src/components/PagedListFooter.tsx +107 -0
- package/src/components/Pills.test.tsx +77 -0
- package/src/components/Pills.tsx +63 -10
- package/src/components/SectionHeading.tsx +9 -3
- package/src/components/Toast.tsx +37 -19
- package/src/components/WidgetHeader.test.tsx +78 -0
- package/src/components/WidgetHeader.tsx +63 -16
- package/src/components/feedback-states.test.tsx +98 -9
- package/src/components/tone-figures.test.tsx +8 -4
- package/src/hooks/index.ts +6 -3
- package/src/hooks/tool-result-recovery-model.test.ts +744 -0
- package/src/hooks/tool-result-recovery-model.ts +418 -0
- package/src/hooks/use-tool-query.effects.test.tsx +205 -0
- package/src/hooks/use-tool-query.ts +156 -33
- package/src/hooks/use-tool-result-recovery.effects.test.tsx +141 -0
- package/src/hooks/use-tool-result-recovery.test.ts +3 -4
- package/src/hooks/use-tool-result-recovery.ts +84 -142
- package/src/hooks/use-view-data.test.tsx +118 -9
- package/src/hooks/use-view-data.ts +128 -18
- package/src/hooks/use-view-tool-query.ts +25 -19
- package/src/i18n-coverage.test.tsx +104 -2
- package/src/index.ts +48 -11
- package/src/lib/focus-return.test.ts +288 -0
- package/src/lib/focus-return.ts +96 -0
- package/src/lib/parse-tool-result.test.ts +46 -1
- package/src/lib/parse-tool-result.ts +40 -2
- package/src/lib/toast-model.test.ts +166 -1
- package/src/lib/toast-model.ts +104 -2
- package/src/lib/tone-utils.test.ts +86 -10
- package/src/lib/tone-utils.ts +89 -8
- package/src/lib/tool-query.test.ts +569 -0
- package/src/lib/tool-query.ts +253 -0
- package/src/lib/tool-result-observer.test.ts +296 -0
- package/src/lib/tool-result-observer.ts +211 -0
- package/src/lib/typography.test.ts +45 -0
- package/src/lib/typography.ts +47 -0
- package/src/lib/utils.ts +12 -1
- package/src/locale/index.ts +1 -0
- package/src/locale/message-types.ts +118 -2
- package/src/locale/messages-de.ts +49 -10
- package/src/locale/messages-en.ts +49 -10
- package/src/locale/toolkit-messages.test.ts +133 -0
- package/src/locale/toolkit-messages.ts +63 -2
- package/src/primitives/alert.tsx +3 -0
- package/src/primitives/badge.tsx +9 -4
- package/src/primitives/button.tsx +1 -1
- package/src/primitives/dialog.tsx +10 -1
- package/src/primitives/select.tsx +1 -1
- package/src/primitives/sheet.tsx +7 -0
- package/src/providers/query-provider.test.tsx +154 -0
- package/src/providers/query-provider.tsx +66 -5
- package/src/render-cases-primitives.tsx +1 -1
- package/src/render-cases.tsx +38 -6
- package/src/render-effects.tsx +96 -0
- package/src/theme/cd-tokens.test.ts +3 -1
- package/src/theme/create-theme.test.ts +10 -0
- package/src/theme/create-theme.ts +28 -0
- package/src/theme/theme-css.test.ts +51 -0
- package/src/theme.css +31 -1
- package/ui-catalog.json +448 -41
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secondary builder controls (row, tab and cell actions) stay quiet until the
|
|
3
|
+
* pointer is over their group or focus is anywhere inside it, and are always
|
|
4
|
+
* visible where nothing can hover (touch screens). Spread it on the controls'
|
|
5
|
+
* container inside an element with `group`; a control that is never revealed
|
|
6
|
+
* by hover alone is a CI §12 rule ("alles per Tastatur bedienbar"), guarded by
|
|
7
|
+
* `builder-ux.test.tsx`.
|
|
8
|
+
*/
|
|
9
|
+
export const REVEAL_ON_INTENT =
|
|
10
|
+
"opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100 focus-within:opacity-100 [@media(hover:none)]:opacity-100"
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react"
|
|
2
2
|
import type {
|
|
3
3
|
AvailableStep,
|
|
4
|
+
CatalogueApp,
|
|
5
|
+
DisplayText,
|
|
4
6
|
KeyCatalogEntry,
|
|
5
7
|
PipelineContext,
|
|
6
8
|
PipelineStepRef,
|
|
@@ -22,6 +24,17 @@ import type { RefreshStatus } from "./labels.js"
|
|
|
22
24
|
|
|
23
25
|
const EMPTY_CONTEXT: PipelineContext = { steps: {}, keys: {}, errors: [] }
|
|
24
26
|
|
|
27
|
+
/** What the builder reads from a `get-builder-catalogue` response (every field optional). */
|
|
28
|
+
interface CatalogueSnapshot {
|
|
29
|
+
reachableWidgets?: ReachableWidget[]
|
|
30
|
+
unreachableWidgets?: UnreachableWidget[]
|
|
31
|
+
availableSteps?: AvailableStep[]
|
|
32
|
+
keyCatalog?: KeyCatalogEntry[]
|
|
33
|
+
validationIssues?: string[]
|
|
34
|
+
context?: WireContext
|
|
35
|
+
apps?: CatalogueApp[]
|
|
36
|
+
}
|
|
37
|
+
|
|
25
38
|
/**
|
|
26
39
|
* Owns the builder's live catalogue: the snapshots fetched from the app-only
|
|
27
40
|
* `get-builder-catalogue` tool (the LLM never sees this data), the refresh
|
|
@@ -49,6 +62,9 @@ export function useBuilderCatalogue({
|
|
|
49
62
|
const [liveCatalog, setLiveCatalog] = useState<KeyCatalogEntry[]>([])
|
|
50
63
|
const [liveSteps, setLiveSteps] = useState<AvailableStep[]>([])
|
|
51
64
|
const [liveContext, setLiveContext] = useState<PipelineContext>(EMPTY_CONTEXT)
|
|
65
|
+
// The titled apps (the palette's group headings); the catalogue leaves the
|
|
66
|
+
// field out when no app has a title.
|
|
67
|
+
const [liveApps, setLiveApps] = useState<CatalogueApp[]>([])
|
|
52
68
|
// Pipeline validation issues from the catalogue (Finding [10]/[6]). The
|
|
53
69
|
// catalogue is fail-soft, but `render-view` is fail-hard, so we surface
|
|
54
70
|
// these so the user sees — before committing — that the pipeline as
|
|
@@ -61,6 +77,26 @@ export function useBuilderCatalogue({
|
|
|
61
77
|
// instead of only `console.warn`-ing, so the user knows the palette/context
|
|
62
78
|
// may be stale. Cleared on the next successful refresh.
|
|
63
79
|
const [refreshError, setRefreshError] = useState<string | null>(null)
|
|
80
|
+
// The first fetch has settled (answer or failure). Until then the palette
|
|
81
|
+
// shows a loading state, not "no elements" (CI §9: a skeleton while loading).
|
|
82
|
+
const [loaded, setLoaded] = useState(false)
|
|
83
|
+
|
|
84
|
+
// Takes over what one catalogue response carries; a field it lacks keeps
|
|
85
|
+
// the last snapshot.
|
|
86
|
+
const applySnapshot = useCallback((sc: CatalogueSnapshot | null) => {
|
|
87
|
+
if (sc?.reachableWidgets) setLiveReachable(sc.reachableWidgets)
|
|
88
|
+
if (sc?.unreachableWidgets) setLiveUnreachable(sc.unreachableWidgets)
|
|
89
|
+
if (sc?.availableSteps) setLiveSteps(sc.availableSteps)
|
|
90
|
+
if (sc?.keyCatalog) setLiveCatalog(sc.keyCatalog)
|
|
91
|
+
if (sc?.context) setLiveContext(toPipelineContext(sc.context))
|
|
92
|
+
// Absent `apps` means no app has a title (not "unchanged").
|
|
93
|
+
if (sc) setLiveApps(sc.apps ?? [])
|
|
94
|
+
// Pipeline issues are fail-soft in the catalogue but fail-hard in
|
|
95
|
+
// render-view; surface them so the user sees the render path wouldn't
|
|
96
|
+
// run as configured (Finding [10]/[6]). Coerce undefined → [] so a
|
|
97
|
+
// fixed pipeline clears a previously-shown warning.
|
|
98
|
+
setValidationIssues(sc?.validationIssues ?? [])
|
|
99
|
+
}, [])
|
|
64
100
|
|
|
65
101
|
const refreshBuilder = useCallback(async () => {
|
|
66
102
|
setStatus("refreshing")
|
|
@@ -69,24 +105,7 @@ export function useBuilderCatalogue({
|
|
|
69
105
|
keys: entriesToKeys(keyEntries),
|
|
70
106
|
steps: stepEntries.filter((s) => s.step.trim().length > 0),
|
|
71
107
|
})
|
|
72
|
-
|
|
73
|
-
reachableWidgets?: ReachableWidget[]
|
|
74
|
-
unreachableWidgets?: UnreachableWidget[]
|
|
75
|
-
availableSteps?: AvailableStep[]
|
|
76
|
-
keyCatalog?: KeyCatalogEntry[]
|
|
77
|
-
validationIssues?: string[]
|
|
78
|
-
context?: WireContext
|
|
79
|
-
} | null>(result)
|
|
80
|
-
if (sc?.reachableWidgets) setLiveReachable(sc.reachableWidgets)
|
|
81
|
-
if (sc?.unreachableWidgets) setLiveUnreachable(sc.unreachableWidgets)
|
|
82
|
-
if (sc?.availableSteps) setLiveSteps(sc.availableSteps)
|
|
83
|
-
if (sc?.keyCatalog) setLiveCatalog(sc.keyCatalog)
|
|
84
|
-
if (sc?.context) setLiveContext(toPipelineContext(sc.context))
|
|
85
|
-
// Pipeline issues are fail-soft in the catalogue but fail-hard in
|
|
86
|
-
// render-view; surface them so the user sees the render path wouldn't
|
|
87
|
-
// run as configured (Finding [10]/[6]). Coerce undefined → [] so a
|
|
88
|
-
// fixed pipeline clears a previously-shown warning.
|
|
89
|
-
setValidationIssues(sc?.validationIssues ?? [])
|
|
108
|
+
applySnapshot(parseToolResult<CatalogueSnapshot | null>(result))
|
|
90
109
|
// A successful fetch clears any stale failure banner.
|
|
91
110
|
setRefreshError(null)
|
|
92
111
|
} catch (err) {
|
|
@@ -104,8 +123,9 @@ export function useBuilderCatalogue({
|
|
|
104
123
|
setRefreshError(reason)
|
|
105
124
|
} finally {
|
|
106
125
|
setStatus("idle")
|
|
126
|
+
setLoaded(true)
|
|
107
127
|
}
|
|
108
|
-
}, [catalogueToolName, callTool, keyEntries, stepEntries])
|
|
128
|
+
}, [applySnapshot, catalogueToolName, callTool, keyEntries, stepEntries])
|
|
109
129
|
|
|
110
130
|
const refreshRef = useRef(refreshBuilder)
|
|
111
131
|
useEffect(() => {
|
|
@@ -154,6 +174,20 @@ export function useBuilderCatalogue({
|
|
|
154
174
|
return map
|
|
155
175
|
}, [liveReachable, liveUnreachable])
|
|
156
176
|
|
|
177
|
+
// Display text (title, summary, their keys) per widget id, from both lists:
|
|
178
|
+
// a canvas cell or the props sheet may name a widget the current keys do
|
|
179
|
+
// not reach.
|
|
180
|
+
const displayByWidgetId = useMemo(() => {
|
|
181
|
+
const map = new Map<string, DisplayText>()
|
|
182
|
+
for (const w of [...liveUnreachable, ...liveReachable]) map.set(w.id, w)
|
|
183
|
+
return map
|
|
184
|
+
}, [liveReachable, liveUnreachable])
|
|
185
|
+
|
|
186
|
+
const appDisplayByName = useMemo(
|
|
187
|
+
() => new Map<string, DisplayText>(liveApps.map((app) => [app.name, app])),
|
|
188
|
+
[liveApps],
|
|
189
|
+
)
|
|
190
|
+
|
|
157
191
|
const paletteByApp = useMemo(() => {
|
|
158
192
|
const groups = new Map<string, ReachableWidget[]>()
|
|
159
193
|
for (const w of liveReachable) {
|
|
@@ -182,10 +216,13 @@ export function useBuilderCatalogue({
|
|
|
182
216
|
liveContext,
|
|
183
217
|
validationIssues,
|
|
184
218
|
status,
|
|
219
|
+
loaded,
|
|
185
220
|
refreshError,
|
|
186
221
|
retryCatalogue,
|
|
187
222
|
widgetById,
|
|
188
223
|
propsSchemaByWidgetId,
|
|
224
|
+
displayByWidgetId,
|
|
225
|
+
appDisplayByName,
|
|
189
226
|
paletteByApp,
|
|
190
227
|
liveKeyCount,
|
|
191
228
|
stepsByApp,
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { useCallback, useState } from "react"
|
|
2
|
+
import {
|
|
3
|
+
draftStatus,
|
|
4
|
+
viewAfterAdvancedToggle,
|
|
5
|
+
type BuilderView,
|
|
6
|
+
type DraftStatus,
|
|
7
|
+
} from "./builder-model.js"
|
|
8
|
+
|
|
9
|
+
// -------------------------------------------------------------------------- //
|
|
10
|
+
// Builder session state that is not the draft itself
|
|
11
|
+
// -------------------------------------------------------------------------- //
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Which builder view is shown and whether advanced mode is on. The data
|
|
15
|
+
* sources (keys, steps, context ids) and the catalogue are technical, so they
|
|
16
|
+
* live behind "Advanced"; switching it off leaves a now hidden view for the
|
|
17
|
+
* layout.
|
|
18
|
+
*/
|
|
19
|
+
export function useBuilderMode() {
|
|
20
|
+
const [advanced, setAdvanced] = useState(false)
|
|
21
|
+
const [view, setView] = useState<BuilderView>("layout")
|
|
22
|
+
const toggleAdvanced = useCallback(() => {
|
|
23
|
+
const next = !advanced
|
|
24
|
+
setAdvanced(next)
|
|
25
|
+
setView(viewAfterAdvancedToggle(view, next))
|
|
26
|
+
}, [advanced, view])
|
|
27
|
+
/** The empty layout's one next step: show the data sources. */
|
|
28
|
+
const openDataSources = useCallback(() => {
|
|
29
|
+
setAdvanced(true)
|
|
30
|
+
setView("pipeline")
|
|
31
|
+
}, [])
|
|
32
|
+
return { advanced, view, setView, toggleAdvanced, openDataSources }
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Inline rename feedback. The reducer rejects duplicate tab labels and bumps
|
|
37
|
+
* `renameRejectedAt`; each bump shows "name already exists" until the inline
|
|
38
|
+
* editor closes (render-phase setState, the house pattern for derived state).
|
|
39
|
+
*/
|
|
40
|
+
export function useRenameFeedback(renameRejectedAt: number, editingTabIdx: number | null): boolean {
|
|
41
|
+
const [renameRejected, setRenameRejected] = useState(false)
|
|
42
|
+
const [prevRenameRejectedAt, setPrevRenameRejectedAt] = useState(renameRejectedAt)
|
|
43
|
+
if (renameRejectedAt !== prevRenameRejectedAt) {
|
|
44
|
+
setPrevRenameRejectedAt(renameRejectedAt)
|
|
45
|
+
setRenameRejected(true)
|
|
46
|
+
}
|
|
47
|
+
const [prevEditingTabIdx, setPrevEditingTabIdx] = useState(editingTabIdx)
|
|
48
|
+
if (editingTabIdx !== prevEditingTabIdx) {
|
|
49
|
+
setPrevEditingTabIdx(editingTabIdx)
|
|
50
|
+
if (editingTabIdx === null) setRenameRejected(false)
|
|
51
|
+
}
|
|
52
|
+
return renameRejected
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Tracks the draft against the view before editing and the last saved
|
|
57
|
+
* dashboard (see `draftStatus`). `snapshot` is the current `builderSnapshot`;
|
|
58
|
+
* the first one is the pre-edit baseline.
|
|
59
|
+
*/
|
|
60
|
+
export function useDraftStatus(snapshot: string): DraftStatus & {
|
|
61
|
+
/** Records `saved` (the snapshot that went into a saved dashboard). */
|
|
62
|
+
markSaved: (saved: string) => void
|
|
63
|
+
} {
|
|
64
|
+
const [baseline] = useState(snapshot)
|
|
65
|
+
const [saved, setSaved] = useState<string | null>(null)
|
|
66
|
+
const markSaved = useCallback((value: string) => setSaved(value), [])
|
|
67
|
+
return { ...draftStatus(snapshot, baseline, saved), markSaved }
|
|
68
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { useMemo } from "react"
|
|
2
|
+
import { useToolkitLocale, useTranslate } from "../../locale/locale-provider.js"
|
|
3
|
+
import { keyResolverFrom, type DisplayKeyResolver } from "./builder-model.js"
|
|
4
|
+
|
|
5
|
+
/** What the builder needs to turn a definition's display text into words. */
|
|
6
|
+
export interface DisplayResolver {
|
|
7
|
+
/** The locale the builder's own text is in (a `LocaleProvider`'s, else the host's). */
|
|
8
|
+
locale: string
|
|
9
|
+
/** Resolves a `titleKey`/`summaryKey` through the `LocaleProvider`'s translator. */
|
|
10
|
+
resolveKey: DisplayKeyResolver
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Binds `displayLabel` / `propFieldText` to the builder's locale: inline
|
|
15
|
+
* per-locale titles follow the same language as the builder chrome around
|
|
16
|
+
* them, and i18n keys resolve through the nearest `LocaleProvider`'s
|
|
17
|
+
* translator (outside one, keys stay unknown and the inline text or the id
|
|
18
|
+
* shows instead).
|
|
19
|
+
*/
|
|
20
|
+
export function useDisplayResolver(): DisplayResolver {
|
|
21
|
+
const locale = useToolkitLocale()
|
|
22
|
+
const translate = useTranslate()
|
|
23
|
+
return useMemo(() => ({ locale, resolveKey: keyResolverFrom(translate) }), [locale, translate])
|
|
24
|
+
}
|
package/src/app/index.ts
CHANGED
|
@@ -4,10 +4,17 @@ export type {
|
|
|
4
4
|
McpAppViewLabels,
|
|
5
5
|
DescribeStep,
|
|
6
6
|
DescribeViewError,
|
|
7
|
+
ViewErrorKind,
|
|
8
|
+
RecoveryPolicy,
|
|
7
9
|
ViewTitleLevel,
|
|
8
10
|
ViewTitleMode,
|
|
9
11
|
} from "./mcp-app-view.js"
|
|
10
12
|
export { McpToolkitApp, mountMcpToolkitApp } from "./mcp-toolkit-app.js"
|
|
13
|
+
// The passive host-lifecycle observer behind the stripped-result recovery
|
|
14
|
+
// (toolkit#176): installed as the bundle evaluates; a custom shell may call it
|
|
15
|
+
// explicitly before its own `bootstrapView`.
|
|
16
|
+
export { installToolResultObserver } from "../lib/tool-result-observer.js"
|
|
17
|
+
export type { ToolObservation, ToolResultObserver } from "../lib/tool-result-observer.js"
|
|
11
18
|
export {
|
|
12
19
|
WidgetRenderer,
|
|
13
20
|
WidgetErrorBoundary,
|
|
@@ -17,10 +24,12 @@ export {
|
|
|
17
24
|
export type { WidgetRendererProps, WidgetComponent } from "./widget-renderer.js"
|
|
18
25
|
export { LayoutBuilder } from "./layout-builder.js"
|
|
19
26
|
export type { LayoutBuilderProps, LayoutBuilderLabels } from "./layout-builder.js"
|
|
27
|
+
export type { BuilderExitCommit } from "./builder/builder-model.js"
|
|
20
28
|
|
|
21
29
|
// App-level value modules that import `mcp-use/react` (ModelContext, the 2.x
|
|
22
30
|
// view hooks) — exported from this subpath only, never the root barrel.
|
|
23
|
-
export { adaptDataWidget
|
|
31
|
+
export { adaptDataWidget } from "./adapt-data-widget.js"
|
|
32
|
+
export { HostModelContext, useHostModelContext } from "./model-context.js"
|
|
24
33
|
export type { DescribeForModel } from "./adapt-data-widget.js"
|
|
25
34
|
export { useHostActions, buildShowWidgetIntent } from "./use-host-actions.js"
|
|
26
35
|
export type { HostActions } from "./use-host-actions.js"
|
|
@@ -43,7 +52,8 @@ export type {
|
|
|
43
52
|
OpenAiAppsSdk,
|
|
44
53
|
StandaloneHostBridgeOptions,
|
|
45
54
|
} from "./host-bridge.js"
|
|
46
|
-
export { McpUseHostBridgeProvider
|
|
55
|
+
export { McpUseHostBridgeProvider } from "./mcp-use-host-bridge.js"
|
|
56
|
+
export { useIsInsideMcpUseView } from "./model-context.js"
|
|
47
57
|
|
|
48
58
|
// Storybook-style harness for developing widgets in isolation with fixture
|
|
49
59
|
// data and a simulated HostBridge. Lives under ./app to keep every host-facing
|