@miragon/pulse-widget-shell 0.0.0-bootstrap.0 → 0.21.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/LICENSE +21 -0
- package/README.md +163 -3
- package/dist/adapt-data-widget.d.ts +7 -0
- package/dist/adapt-data-widget.d.ts.map +1 -0
- package/dist/adapt-data-widget.js +7 -0
- package/dist/adapt-data-widget.js.map +1 -0
- package/dist/bpmn-names.d.ts +42 -0
- package/dist/bpmn-names.d.ts.map +1 -0
- package/dist/bpmn-names.js +151 -0
- package/dist/bpmn-names.js.map +1 -0
- package/dist/bpmn-names.test.d.ts +2 -0
- package/dist/bpmn-names.test.d.ts.map +1 -0
- package/dist/bpmn-names.test.js +143 -0
- package/dist/bpmn-names.test.js.map +1 -0
- package/dist/build-data-feed-result.test.d.ts +2 -0
- package/dist/build-data-feed-result.test.d.ts.map +1 -0
- package/dist/build-data-feed-result.test.js +28 -0
- package/dist/build-data-feed-result.test.js.map +1 -0
- package/dist/build-single-widget-view.test.d.ts +2 -0
- package/dist/build-single-widget-view.test.d.ts.map +1 -0
- package/dist/build-single-widget-view.test.js +136 -0
- package/dist/build-single-widget-view.test.js.map +1 -0
- package/dist/builder-texts.d.ts +27 -0
- package/dist/builder-texts.d.ts.map +1 -0
- package/dist/builder-texts.js +32 -0
- package/dist/builder-texts.js.map +1 -0
- package/dist/builder-texts.test.d.ts +2 -0
- package/dist/builder-texts.test.d.ts.map +1 -0
- package/dist/builder-texts.test.js +54 -0
- package/dist/builder-texts.test.js.map +1 -0
- package/dist/catalogue-sync.d.ts +18 -0
- package/dist/catalogue-sync.d.ts.map +1 -0
- package/dist/catalogue-sync.js +31 -0
- package/dist/catalogue-sync.js.map +1 -0
- package/dist/catalogue-sync.test.d.ts +2 -0
- package/dist/catalogue-sync.test.d.ts.map +1 -0
- package/dist/catalogue-sync.test.js +22 -0
- package/dist/catalogue-sync.test.js.map +1 -0
- package/dist/composed-server.d.ts +110 -0
- package/dist/composed-server.d.ts.map +1 -0
- package/dist/composed-server.edge.test.d.ts +2 -0
- package/dist/composed-server.edge.test.d.ts.map +1 -0
- package/dist/composed-server.edge.test.js +184 -0
- package/dist/composed-server.edge.test.js.map +1 -0
- package/dist/composed-server.fonts.test.d.ts +2 -0
- package/dist/composed-server.fonts.test.d.ts.map +1 -0
- package/dist/composed-server.fonts.test.js +186 -0
- package/dist/composed-server.fonts.test.js.map +1 -0
- package/dist/composed-server.js +260 -0
- package/dist/composed-server.js.map +1 -0
- package/dist/composed-server.test.d.ts +2 -0
- package/dist/composed-server.test.d.ts.map +1 -0
- package/dist/composed-server.test.js +332 -0
- package/dist/composed-server.test.js.map +1 -0
- package/dist/composition.d.ts +155 -0
- package/dist/composition.d.ts.map +1 -0
- package/dist/composition.js +163 -0
- package/dist/composition.js.map +1 -0
- package/dist/composition.test.d.ts +2 -0
- package/dist/composition.test.d.ts.map +1 -0
- package/dist/composition.test.js +275 -0
- package/dist/composition.test.js.map +1 -0
- package/dist/dashboard-store-postgres.d.ts +43 -0
- package/dist/dashboard-store-postgres.d.ts.map +1 -0
- package/dist/dashboard-store-postgres.js +225 -0
- package/dist/dashboard-store-postgres.js.map +1 -0
- package/dist/dashboard-store-postgres.test.d.ts +2 -0
- package/dist/dashboard-store-postgres.test.d.ts.map +1 -0
- package/dist/dashboard-store-postgres.test.js +272 -0
- package/dist/dashboard-store-postgres.test.js.map +1 -0
- package/dist/font-assets.d.ts +47 -0
- package/dist/font-assets.d.ts.map +1 -0
- package/dist/font-assets.js +93 -0
- package/dist/font-assets.js.map +1 -0
- package/dist/font-assets.test.d.ts +2 -0
- package/dist/font-assets.test.d.ts.map +1 -0
- package/dist/font-assets.test.js +123 -0
- package/dist/font-assets.test.js.map +1 -0
- package/dist/health.d.ts +59 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +74 -0
- package/dist/health.js.map +1 -0
- package/dist/health.test.d.ts +2 -0
- package/dist/health.test.d.ts.map +1 -0
- package/dist/health.test.js +140 -0
- package/dist/health.test.js.map +1 -0
- package/dist/host-boot.d.ts +56 -0
- package/dist/host-boot.d.ts.map +1 -0
- package/dist/host-boot.js +64 -0
- package/dist/host-boot.js.map +1 -0
- package/dist/host-boot.test.d.ts +2 -0
- package/dist/host-boot.test.d.ts.map +1 -0
- package/dist/host-boot.test.js +59 -0
- package/dist/host-boot.test.js.map +1 -0
- package/dist/http-edge.d.ts +117 -0
- package/dist/http-edge.d.ts.map +1 -0
- package/dist/http-edge.js +219 -0
- package/dist/http-edge.js.map +1 -0
- package/dist/http-edge.test.d.ts +2 -0
- package/dist/http-edge.test.d.ts.map +1 -0
- package/dist/http-edge.test.js +255 -0
- package/dist/http-edge.test.js.map +1 -0
- package/dist/metrics.d.ts +48 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +124 -0
- package/dist/metrics.js.map +1 -0
- package/dist/metrics.test.d.ts +2 -0
- package/dist/metrics.test.d.ts.map +1 -0
- package/dist/metrics.test.js +154 -0
- package/dist/metrics.test.js.map +1 -0
- package/dist/node-listener.d.ts +61 -0
- package/dist/node-listener.d.ts.map +1 -0
- package/dist/node-listener.js +165 -0
- package/dist/node-listener.js.map +1 -0
- package/dist/node-listener.test.d.ts +2 -0
- package/dist/node-listener.test.d.ts.map +1 -0
- package/dist/node-listener.test.js +331 -0
- package/dist/node-listener.test.js.map +1 -0
- package/dist/oauth-env.d.ts +42 -0
- package/dist/oauth-env.d.ts.map +1 -0
- package/dist/oauth-env.js +78 -0
- package/dist/oauth-env.js.map +1 -0
- package/dist/oauth-env.test.d.ts +2 -0
- package/dist/oauth-env.test.d.ts.map +1 -0
- package/dist/oauth-env.test.js +76 -0
- package/dist/oauth-env.test.js.map +1 -0
- package/dist/postgres.d.ts +59 -0
- package/dist/postgres.d.ts.map +1 -0
- package/dist/postgres.js +80 -0
- package/dist/postgres.js.map +1 -0
- package/dist/profile-advisory.d.ts +19 -0
- package/dist/profile-advisory.d.ts.map +1 -0
- package/dist/profile-advisory.js +48 -0
- package/dist/profile-advisory.js.map +1 -0
- package/dist/profile-advisory.test.d.ts +2 -0
- package/dist/profile-advisory.test.d.ts.map +1 -0
- package/dist/profile-advisory.test.js +53 -0
- package/dist/profile-advisory.test.js.map +1 -0
- package/dist/profile-constants.d.ts +37 -0
- package/dist/profile-constants.d.ts.map +1 -0
- package/dist/profile-constants.js +37 -0
- package/dist/profile-constants.js.map +1 -0
- package/dist/profile-migrations.d.ts +71 -0
- package/dist/profile-migrations.d.ts.map +1 -0
- package/dist/profile-migrations.js +88 -0
- package/dist/profile-migrations.js.map +1 -0
- package/dist/profile-migrations.test.d.ts +2 -0
- package/dist/profile-migrations.test.d.ts.map +1 -0
- package/dist/profile-migrations.test.js +200 -0
- package/dist/profile-migrations.test.js.map +1 -0
- package/dist/profile-record.d.ts +60 -0
- package/dist/profile-record.d.ts.map +1 -0
- package/dist/profile-record.js +78 -0
- package/dist/profile-record.js.map +1 -0
- package/dist/profile-slice.d.ts +53 -0
- package/dist/profile-slice.d.ts.map +1 -0
- package/dist/profile-slice.js +73 -0
- package/dist/profile-slice.js.map +1 -0
- package/dist/profile-slice.test.d.ts +2 -0
- package/dist/profile-slice.test.d.ts.map +1 -0
- package/dist/profile-slice.test.js +73 -0
- package/dist/profile-slice.test.js.map +1 -0
- package/dist/profile-store-env.d.ts +34 -0
- package/dist/profile-store-env.d.ts.map +1 -0
- package/dist/profile-store-env.js +44 -0
- package/dist/profile-store-env.js.map +1 -0
- package/dist/profile-store-env.test.d.ts +2 -0
- package/dist/profile-store-env.test.d.ts.map +1 -0
- package/dist/profile-store-env.test.js +69 -0
- package/dist/profile-store-env.test.js.map +1 -0
- package/dist/profile-store-postgres.d.ts +33 -0
- package/dist/profile-store-postgres.d.ts.map +1 -0
- package/dist/profile-store-postgres.js +87 -0
- package/dist/profile-store-postgres.js.map +1 -0
- package/dist/profile-store-raw.test.d.ts +2 -0
- package/dist/profile-store-raw.test.d.ts.map +1 -0
- package/dist/profile-store-raw.test.js +185 -0
- package/dist/profile-store-raw.test.js.map +1 -0
- package/dist/profile-store.d.ts +85 -0
- package/dist/profile-store.d.ts.map +1 -0
- package/dist/profile-store.js +182 -0
- package/dist/profile-store.js.map +1 -0
- package/dist/profile-store.test.d.ts +2 -0
- package/dist/profile-store.test.d.ts.map +1 -0
- package/dist/profile-store.test.js +353 -0
- package/dist/profile-store.test.js.map +1 -0
- package/dist/profile.d.ts +75 -0
- package/dist/profile.d.ts.map +1 -0
- package/dist/profile.js +85 -0
- package/dist/profile.js.map +1 -0
- package/dist/profile.test.d.ts +2 -0
- package/dist/profile.test.d.ts.map +1 -0
- package/dist/profile.test.js +71 -0
- package/dist/profile.test.js.map +1 -0
- package/dist/request-context.d.ts +47 -0
- package/dist/request-context.d.ts.map +1 -0
- package/dist/request-context.js +85 -0
- package/dist/request-context.js.map +1 -0
- package/dist/request-context.test.d.ts +2 -0
- package/dist/request-context.test.d.ts.map +1 -0
- package/dist/request-context.test.js +107 -0
- package/dist/request-context.test.js.map +1 -0
- package/dist/served-fonts.d.ts +38 -0
- package/dist/served-fonts.d.ts.map +1 -0
- package/dist/served-fonts.js +51 -0
- package/dist/served-fonts.js.map +1 -0
- package/dist/served-fonts.test.d.ts +2 -0
- package/dist/served-fonts.test.d.ts.map +1 -0
- package/dist/served-fonts.test.js +30 -0
- package/dist/served-fonts.test.js.map +1 -0
- package/dist/server-locale.d.ts +58 -0
- package/dist/server-locale.d.ts.map +1 -0
- package/dist/server-locale.js +64 -0
- package/dist/server-locale.js.map +1 -0
- package/dist/server-locale.test.d.ts +2 -0
- package/dist/server-locale.test.d.ts.map +1 -0
- package/dist/server-locale.test.js +90 -0
- package/dist/server-locale.test.js.map +1 -0
- package/dist/server.d.ts +43 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +34 -0
- package/dist/server.js.map +1 -0
- package/dist/shell-catalogue.d.ts +12 -0
- package/dist/shell-catalogue.d.ts.map +1 -0
- package/dist/shell-catalogue.js +142 -0
- package/dist/shell-catalogue.js.map +1 -0
- package/dist/shell-settings-contract.d.ts +34 -0
- package/dist/shell-settings-contract.d.ts.map +1 -0
- package/dist/shell-settings-contract.js +21 -0
- package/dist/shell-settings-contract.js.map +1 -0
- package/dist/shell-settings.d.ts +24 -0
- package/dist/shell-settings.d.ts.map +1 -0
- package/dist/shell-settings.js +148 -0
- package/dist/shell-settings.js.map +1 -0
- package/dist/shell-settings.test.d.ts +2 -0
- package/dist/shell-settings.test.d.ts.map +1 -0
- package/dist/shell-settings.test.js +115 -0
- package/dist/shell-settings.test.js.map +1 -0
- package/dist/testing/catalog-text.d.ts +53 -0
- package/dist/testing/catalog-text.d.ts.map +1 -0
- package/dist/testing/catalog-text.js +146 -0
- package/dist/testing/catalog-text.js.map +1 -0
- package/dist/testing/catalog-text.test.d.ts +2 -0
- package/dist/testing/catalog-text.test.d.ts.map +1 -0
- package/dist/testing/catalog-text.test.js +137 -0
- package/dist/testing/catalog-text.test.js.map +1 -0
- package/dist/testing/colors.d.ts +34 -0
- package/dist/testing/colors.d.ts.map +1 -0
- package/dist/testing/colors.js +124 -0
- package/dist/testing/colors.js.map +1 -0
- package/dist/testing/colors.test.d.ts +2 -0
- package/dist/testing/colors.test.d.ts.map +1 -0
- package/dist/testing/colors.test.js +166 -0
- package/dist/testing/colors.test.js.map +1 -0
- package/dist/testing/contrast.d.ts +77 -0
- package/dist/testing/contrast.d.ts.map +1 -0
- package/dist/testing/contrast.js +382 -0
- package/dist/testing/contrast.js.map +1 -0
- package/dist/testing/contrast.test.d.ts +2 -0
- package/dist/testing/contrast.test.d.ts.map +1 -0
- package/dist/testing/contrast.test.js +230 -0
- package/dist/testing/contrast.test.js.map +1 -0
- package/dist/testing/display-texts.d.ts +23 -0
- package/dist/testing/display-texts.d.ts.map +1 -0
- package/dist/testing/display-texts.js +88 -0
- package/dist/testing/display-texts.js.map +1 -0
- package/dist/testing/display-texts.test.d.ts +2 -0
- package/dist/testing/display-texts.test.d.ts.map +1 -0
- package/dist/testing/display-texts.test.js +169 -0
- package/dist/testing/display-texts.test.js.map +1 -0
- package/dist/testing/glossary.d.ts +52 -0
- package/dist/testing/glossary.d.ts.map +1 -0
- package/dist/testing/glossary.js +135 -0
- package/dist/testing/glossary.js.map +1 -0
- package/dist/testing/glossary.test.d.ts +2 -0
- package/dist/testing/glossary.test.d.ts.map +1 -0
- package/dist/testing/glossary.test.js +78 -0
- package/dist/testing/glossary.test.js.map +1 -0
- package/dist/testing/glyphs.d.ts +27 -0
- package/dist/testing/glyphs.d.ts.map +1 -0
- package/dist/testing/glyphs.js +130 -0
- package/dist/testing/glyphs.js.map +1 -0
- package/dist/testing/glyphs.test.d.ts +2 -0
- package/dist/testing/glyphs.test.d.ts.map +1 -0
- package/dist/testing/glyphs.test.js +146 -0
- package/dist/testing/glyphs.test.js.map +1 -0
- package/dist/testing/icon-sizes.d.ts +22 -0
- package/dist/testing/icon-sizes.d.ts.map +1 -0
- package/dist/testing/icon-sizes.js +39 -0
- package/dist/testing/icon-sizes.js.map +1 -0
- package/dist/testing/icon-sizes.test.d.ts +2 -0
- package/dist/testing/icon-sizes.test.d.ts.map +1 -0
- package/dist/testing/icon-sizes.test.js +36 -0
- package/dist/testing/icon-sizes.test.js.map +1 -0
- package/dist/testing/index.d.ts +40 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +40 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/source-scan.d.ts +16 -0
- package/dist/testing/source-scan.d.ts.map +1 -0
- package/dist/testing/source-scan.js +57 -0
- package/dist/testing/source-scan.js.map +1 -0
- package/dist/testing/tone-pairs.d.ts +20 -0
- package/dist/testing/tone-pairs.d.ts.map +1 -0
- package/dist/testing/tone-pairs.js +154 -0
- package/dist/testing/tone-pairs.js.map +1 -0
- package/dist/testing/type-scale.d.ts +40 -0
- package/dist/testing/type-scale.d.ts.map +1 -0
- package/dist/testing/type-scale.js +55 -0
- package/dist/testing/type-scale.js.map +1 -0
- package/dist/testing/type-scale.test.d.ts +2 -0
- package/dist/testing/type-scale.test.d.ts.map +1 -0
- package/dist/testing/type-scale.test.js +61 -0
- package/dist/testing/type-scale.test.js.map +1 -0
- package/dist/tool-schema-trim.d.ts +24 -0
- package/dist/tool-schema-trim.d.ts.map +1 -0
- package/dist/tool-schema-trim.js +49 -0
- package/dist/tool-schema-trim.js.map +1 -0
- package/dist/tool-schema-trim.test.d.ts +2 -0
- package/dist/tool-schema-trim.test.d.ts.map +1 -0
- package/dist/tool-schema-trim.test.js +53 -0
- package/dist/tool-schema-trim.test.js.map +1 -0
- package/dist/toolsets.d.ts +76 -0
- package/dist/toolsets.d.ts.map +1 -0
- package/dist/toolsets.js +41 -0
- package/dist/toolsets.js.map +1 -0
- package/dist/toolsets.test.d.ts +2 -0
- package/dist/toolsets.test.d.ts.map +1 -0
- package/dist/toolsets.test.js +86 -0
- package/dist/toolsets.test.js.map +1 -0
- package/dist/ui/action-feedback.d.ts +33 -0
- package/dist/ui/action-feedback.d.ts.map +1 -0
- package/dist/ui/action-feedback.js +51 -0
- package/dist/ui/action-feedback.js.map +1 -0
- package/dist/ui/action-feedback.test.d.ts +2 -0
- package/dist/ui/action-feedback.test.d.ts.map +1 -0
- package/dist/ui/action-feedback.test.js +77 -0
- package/dist/ui/action-feedback.test.js.map +1 -0
- package/dist/ui/app-shell-providers.d.ts +18 -0
- package/dist/ui/app-shell-providers.d.ts.map +1 -0
- package/dist/ui/app-shell-providers.js +19 -0
- package/dist/ui/app-shell-providers.js.map +1 -0
- package/dist/ui/app-shell-providers.test.d.ts +2 -0
- package/dist/ui/app-shell-providers.test.d.ts.map +1 -0
- package/dist/ui/app-shell-providers.test.js +249 -0
- package/dist/ui/app-shell-providers.test.js.map +1 -0
- package/dist/ui/ask-ai-button.d.ts +56 -0
- package/dist/ui/ask-ai-button.d.ts.map +1 -0
- package/dist/ui/ask-ai-button.js +36 -0
- package/dist/ui/ask-ai-button.js.map +1 -0
- package/dist/ui/ask-ai-button.test.d.ts +2 -0
- package/dist/ui/ask-ai-button.test.d.ts.map +1 -0
- package/dist/ui/ask-ai-button.test.js +103 -0
- package/dist/ui/ask-ai-button.test.js.map +1 -0
- package/dist/ui/ask-ai-prompt.d.ts +115 -0
- package/dist/ui/ask-ai-prompt.d.ts.map +1 -0
- package/dist/ui/ask-ai-prompt.js +174 -0
- package/dist/ui/ask-ai-prompt.js.map +1 -0
- package/dist/ui/ask-ai-prompt.test.d.ts +2 -0
- package/dist/ui/ask-ai-prompt.test.d.ts.map +1 -0
- package/dist/ui/ask-ai-prompt.test.js +240 -0
- package/dist/ui/ask-ai-prompt.test.js.map +1 -0
- package/dist/ui/bpmn-heatmap/heat-ramp.test.d.ts +2 -0
- package/dist/ui/bpmn-heatmap/heat-ramp.test.d.ts.map +1 -0
- package/dist/ui/bpmn-heatmap/heat-ramp.test.js +174 -0
- package/dist/ui/bpmn-heatmap/heat-ramp.test.js.map +1 -0
- package/dist/ui/bpmn-heatmap/heat-utils.d.ts +119 -0
- package/dist/ui/bpmn-heatmap/heat-utils.d.ts.map +1 -0
- package/dist/ui/bpmn-heatmap/heat-utils.js +231 -0
- package/dist/ui/bpmn-heatmap/heat-utils.js.map +1 -0
- package/dist/ui/bpmn-heatmap/heat-utils.test.d.ts +2 -0
- package/dist/ui/bpmn-heatmap/heat-utils.test.d.ts.map +1 -0
- package/dist/ui/bpmn-heatmap/heat-utils.test.js +59 -0
- package/dist/ui/bpmn-heatmap/heat-utils.test.js.map +1 -0
- package/dist/ui/bpmn-heatmap-labels.d.ts +46 -0
- package/dist/ui/bpmn-heatmap-labels.d.ts.map +1 -0
- package/dist/ui/bpmn-heatmap-labels.js +16 -0
- package/dist/ui/bpmn-heatmap-labels.js.map +1 -0
- package/dist/ui/bpmn-heatmap-widget.d.ts +38 -0
- package/dist/ui/bpmn-heatmap-widget.d.ts.map +1 -0
- package/dist/ui/bpmn-heatmap-widget.js +65 -0
- package/dist/ui/bpmn-heatmap-widget.js.map +1 -0
- package/dist/ui/bpmn-heatmap-widget.test.d.ts +2 -0
- package/dist/ui/bpmn-heatmap-widget.test.d.ts.map +1 -0
- package/dist/ui/bpmn-heatmap-widget.test.js +173 -0
- package/dist/ui/bpmn-heatmap-widget.test.js.map +1 -0
- package/dist/ui/bpmn-heatmap.d.ts +61 -0
- package/dist/ui/bpmn-heatmap.d.ts.map +1 -0
- package/dist/ui/bpmn-heatmap.js +119 -0
- package/dist/ui/bpmn-heatmap.js.map +1 -0
- package/dist/ui/bpmn-tokens.d.ts +81 -0
- package/dist/ui/bpmn-tokens.d.ts.map +1 -0
- package/dist/ui/bpmn-tokens.js +114 -0
- package/dist/ui/bpmn-tokens.js.map +1 -0
- package/dist/ui/bpmn-tokens.test.d.ts +2 -0
- package/dist/ui/bpmn-tokens.test.d.ts.map +1 -0
- package/dist/ui/bpmn-tokens.test.js +98 -0
- package/dist/ui/bpmn-tokens.test.js.map +1 -0
- package/dist/ui/bpmn-zoom-controls.d.ts +30 -0
- package/dist/ui/bpmn-zoom-controls.d.ts.map +1 -0
- package/dist/ui/bpmn-zoom-controls.js +29 -0
- package/dist/ui/bpmn-zoom-controls.js.map +1 -0
- package/dist/ui/brand-gates.test.d.ts +2 -0
- package/dist/ui/brand-gates.test.d.ts.map +1 -0
- package/dist/ui/brand-gates.test.js +131 -0
- package/dist/ui/brand-gates.test.js.map +1 -0
- package/dist/ui/brand-mark.d.ts +37 -0
- package/dist/ui/brand-mark.d.ts.map +1 -0
- package/dist/ui/brand-mark.js +33 -0
- package/dist/ui/brand-mark.js.map +1 -0
- package/dist/ui/brand-mark.test.d.ts +2 -0
- package/dist/ui/brand-mark.test.d.ts.map +1 -0
- package/dist/ui/brand-mark.test.js +111 -0
- package/dist/ui/brand-mark.test.js.map +1 -0
- package/dist/ui/confirm-dialog.d.ts +55 -0
- package/dist/ui/confirm-dialog.d.ts.map +1 -0
- package/dist/ui/confirm-dialog.js +59 -0
- package/dist/ui/confirm-dialog.js.map +1 -0
- package/dist/ui/confirm-dialog.test.d.ts +2 -0
- package/dist/ui/confirm-dialog.test.d.ts.map +1 -0
- package/dist/ui/confirm-dialog.test.js +115 -0
- package/dist/ui/confirm-dialog.test.js.map +1 -0
- package/dist/ui/count-tone.d.ts +20 -0
- package/dist/ui/count-tone.d.ts.map +1 -0
- package/dist/ui/count-tone.js +27 -0
- package/dist/ui/count-tone.js.map +1 -0
- package/dist/ui/count-tone.test.d.ts +2 -0
- package/dist/ui/count-tone.test.d.ts.map +1 -0
- package/dist/ui/count-tone.test.js +27 -0
- package/dist/ui/count-tone.test.js.map +1 -0
- package/dist/ui/create-use-t.d.ts +15 -0
- package/dist/ui/create-use-t.d.ts.map +1 -0
- package/dist/ui/create-use-t.js +17 -0
- package/dist/ui/create-use-t.js.map +1 -0
- package/dist/ui/declare-served-fonts.d.ts +14 -0
- package/dist/ui/declare-served-fonts.d.ts.map +1 -0
- package/dist/ui/declare-served-fonts.js +38 -0
- package/dist/ui/declare-served-fonts.js.map +1 -0
- package/dist/ui/declare-served-fonts.test.d.ts +2 -0
- package/dist/ui/declare-served-fonts.test.d.ts.map +1 -0
- package/dist/ui/declare-served-fonts.test.js +44 -0
- package/dist/ui/declare-served-fonts.test.js.map +1 -0
- package/dist/ui/describe-error.d.ts +71 -0
- package/dist/ui/describe-error.d.ts.map +1 -0
- package/dist/ui/describe-error.js +175 -0
- package/dist/ui/describe-error.js.map +1 -0
- package/dist/ui/describe-error.test.d.ts +2 -0
- package/dist/ui/describe-error.test.d.ts.map +1 -0
- package/dist/ui/describe-error.test.js +274 -0
- package/dist/ui/describe-error.test.js.map +1 -0
- package/dist/ui/display-mode-toggle.d.ts +32 -0
- package/dist/ui/display-mode-toggle.d.ts.map +1 -0
- package/dist/ui/display-mode-toggle.js +39 -0
- package/dist/ui/display-mode-toggle.js.map +1 -0
- package/dist/ui/error-labels.d.ts +65 -0
- package/dist/ui/error-labels.d.ts.map +1 -0
- package/dist/ui/error-labels.js +111 -0
- package/dist/ui/error-labels.js.map +1 -0
- package/dist/ui/format.d.ts +81 -0
- package/dist/ui/format.d.ts.map +1 -0
- package/dist/ui/format.js +189 -0
- package/dist/ui/format.js.map +1 -0
- package/dist/ui/format.test.d.ts +2 -0
- package/dist/ui/format.test.d.ts.map +1 -0
- package/dist/ui/format.test.js +181 -0
- package/dist/ui/format.test.js.map +1 -0
- package/dist/ui/generic-widgets.d.ts +15 -0
- package/dist/ui/generic-widgets.d.ts.map +1 -0
- package/dist/ui/generic-widgets.js +122 -0
- package/dist/ui/generic-widgets.js.map +1 -0
- package/dist/ui/generic-widgets.test.d.ts +2 -0
- package/dist/ui/generic-widgets.test.d.ts.map +1 -0
- package/dist/ui/generic-widgets.test.js +139 -0
- package/dist/ui/generic-widgets.test.js.map +1 -0
- package/dist/ui/hand-off-button.d.ts +44 -0
- package/dist/ui/hand-off-button.d.ts.map +1 -0
- package/dist/ui/hand-off-button.js +44 -0
- package/dist/ui/hand-off-button.js.map +1 -0
- package/dist/ui/hand-off-button.test.d.ts +2 -0
- package/dist/ui/hand-off-button.test.d.ts.map +1 -0
- package/dist/ui/hand-off-button.test.js +78 -0
- package/dist/ui/hand-off-button.test.js.map +1 -0
- package/dist/ui/host-context.d.ts +66 -0
- package/dist/ui/host-context.d.ts.map +1 -0
- package/dist/ui/host-context.js +122 -0
- package/dist/ui/host-context.js.map +1 -0
- package/dist/ui/host-context.test.d.ts +2 -0
- package/dist/ui/host-context.test.d.ts.map +1 -0
- package/dist/ui/host-context.test.js +160 -0
- package/dist/ui/host-context.test.js.map +1 -0
- package/dist/ui/host-document.d.ts +25 -0
- package/dist/ui/host-document.d.ts.map +1 -0
- package/dist/ui/host-document.js +93 -0
- package/dist/ui/host-document.js.map +1 -0
- package/dist/ui/host-document.test.d.ts +2 -0
- package/dist/ui/host-document.test.d.ts.map +1 -0
- package/dist/ui/host-document.test.js +112 -0
- package/dist/ui/host-document.test.js.map +1 -0
- package/dist/ui/host-widgets.d.ts +8 -0
- package/dist/ui/host-widgets.d.ts.map +1 -0
- package/dist/ui/host-widgets.js +18 -0
- package/dist/ui/host-widgets.js.map +1 -0
- package/dist/ui/humanize-key.d.ts +11 -0
- package/dist/ui/humanize-key.d.ts.map +1 -0
- package/dist/ui/humanize-key.js +26 -0
- package/dist/ui/humanize-key.js.map +1 -0
- package/dist/ui/humanize-key.test.d.ts +2 -0
- package/dist/ui/humanize-key.test.d.ts.map +1 -0
- package/dist/ui/humanize-key.test.js +42 -0
- package/dist/ui/humanize-key.test.js.map +1 -0
- package/dist/ui/icon.d.ts +37 -0
- package/dist/ui/icon.d.ts.map +1 -0
- package/dist/ui/icon.js +32 -0
- package/dist/ui/icon.js.map +1 -0
- package/dist/ui/id-breaks.d.ts +17 -0
- package/dist/ui/id-breaks.d.ts.map +1 -0
- package/dist/ui/id-breaks.js +36 -0
- package/dist/ui/id-breaks.js.map +1 -0
- package/dist/ui/id-breaks.test.d.ts +2 -0
- package/dist/ui/id-breaks.test.d.ts.map +1 -0
- package/dist/ui/id-breaks.test.js +37 -0
- package/dist/ui/id-breaks.test.js.map +1 -0
- package/dist/ui/id-text.d.ts +29 -0
- package/dist/ui/id-text.d.ts.map +1 -0
- package/dist/ui/id-text.js +103 -0
- package/dist/ui/id-text.js.map +1 -0
- package/dist/ui/id-text.test.d.ts +2 -0
- package/dist/ui/id-text.test.d.ts.map +1 -0
- package/dist/ui/id-text.test.js +122 -0
- package/dist/ui/id-text.test.js.map +1 -0
- package/dist/ui/index.d.ts +57 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +65 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/index.test.d.ts +2 -0
- package/dist/ui/index.test.d.ts.map +1 -0
- package/dist/ui/index.test.js +34 -0
- package/dist/ui/index.test.js.map +1 -0
- package/dist/ui/inline-budget.d.ts +35 -0
- package/dist/ui/inline-budget.d.ts.map +1 -0
- package/dist/ui/inline-budget.js +27 -0
- package/dist/ui/inline-budget.js.map +1 -0
- package/dist/ui/inline-fit-registry.d.ts +56 -0
- package/dist/ui/inline-fit-registry.d.ts.map +1 -0
- package/dist/ui/inline-fit-registry.js +114 -0
- package/dist/ui/inline-fit-registry.js.map +1 -0
- package/dist/ui/inline-fit-solve.d.ts +50 -0
- package/dist/ui/inline-fit-solve.d.ts.map +1 -0
- package/dist/ui/inline-fit-solve.js +83 -0
- package/dist/ui/inline-fit-solve.js.map +1 -0
- package/dist/ui/inline-fit-solve.test.d.ts +2 -0
- package/dist/ui/inline-fit-solve.test.d.ts.map +1 -0
- package/dist/ui/inline-fit-solve.test.js +108 -0
- package/dist/ui/inline-fit-solve.test.js.map +1 -0
- package/dist/ui/inline-fit-time.test.d.ts +2 -0
- package/dist/ui/inline-fit-time.test.d.ts.map +1 -0
- package/dist/ui/inline-fit-time.test.js +110 -0
- package/dist/ui/inline-fit-time.test.js.map +1 -0
- package/dist/ui/inline-fit.d.ts +77 -0
- package/dist/ui/inline-fit.d.ts.map +1 -0
- package/dist/ui/inline-fit.js +242 -0
- package/dist/ui/inline-fit.js.map +1 -0
- package/dist/ui/inline-fit.test-support.d.ts +26 -0
- package/dist/ui/inline-fit.test-support.d.ts.map +1 -0
- package/dist/ui/inline-fit.test-support.js +34 -0
- package/dist/ui/inline-fit.test-support.js.map +1 -0
- package/dist/ui/inline-fit.test.d.ts +2 -0
- package/dist/ui/inline-fit.test.d.ts.map +1 -0
- package/dist/ui/inline-fit.test.js +159 -0
- package/dist/ui/inline-fit.test.js.map +1 -0
- package/dist/ui/kit-labels.d.ts +80 -0
- package/dist/ui/kit-labels.d.ts.map +1 -0
- package/dist/ui/kit-labels.js +110 -0
- package/dist/ui/kit-labels.js.map +1 -0
- package/dist/ui/kit-labels.test.d.ts +2 -0
- package/dist/ui/kit-labels.test.d.ts.map +1 -0
- package/dist/ui/kit-labels.test.js +98 -0
- package/dist/ui/kit-labels.test.js.map +1 -0
- package/dist/ui/kit-type-roles.test.d.ts +2 -0
- package/dist/ui/kit-type-roles.test.d.ts.map +1 -0
- package/dist/ui/kit-type-roles.test.js +122 -0
- package/dist/ui/kit-type-roles.test.js.map +1 -0
- package/dist/ui/komet-svg.d.ts +15 -0
- package/dist/ui/komet-svg.d.ts.map +1 -0
- package/dist/ui/komet-svg.js +21 -0
- package/dist/ui/komet-svg.js.map +1 -0
- package/dist/ui/list-table.d.ts +108 -0
- package/dist/ui/list-table.d.ts.map +1 -0
- package/dist/ui/list-table.js +161 -0
- package/dist/ui/list-table.js.map +1 -0
- package/dist/ui/list-table.test.d.ts +2 -0
- package/dist/ui/list-table.test.d.ts.map +1 -0
- package/dist/ui/list-table.test.js +169 -0
- package/dist/ui/list-table.test.js.map +1 -0
- package/dist/ui/localized-app-view.d.ts +40 -0
- package/dist/ui/localized-app-view.d.ts.map +1 -0
- package/dist/ui/localized-app-view.js +71 -0
- package/dist/ui/localized-app-view.js.map +1 -0
- package/dist/ui/log-text.d.ts +24 -0
- package/dist/ui/log-text.d.ts.map +1 -0
- package/dist/ui/log-text.js +31 -0
- package/dist/ui/log-text.js.map +1 -0
- package/dist/ui/menu-item.d.ts +12 -0
- package/dist/ui/menu-item.d.ts.map +1 -0
- package/dist/ui/menu-item.js +13 -0
- package/dist/ui/menu-item.js.map +1 -0
- package/dist/ui/named-id.d.ts +23 -0
- package/dist/ui/named-id.d.ts.map +1 -0
- package/dist/ui/named-id.js +21 -0
- package/dist/ui/named-id.js.map +1 -0
- package/dist/ui/named-id.test.d.ts +2 -0
- package/dist/ui/named-id.test.d.ts.map +1 -0
- package/dist/ui/named-id.test.js +57 -0
- package/dist/ui/named-id.test.js.map +1 -0
- package/dist/ui/native-select.d.ts +17 -0
- package/dist/ui/native-select.d.ts.map +1 -0
- package/dist/ui/native-select.js +20 -0
- package/dist/ui/native-select.js.map +1 -0
- package/dist/ui/navigation-focus.d.ts +20 -0
- package/dist/ui/navigation-focus.d.ts.map +1 -0
- package/dist/ui/navigation-focus.js +25 -0
- package/dist/ui/navigation-focus.js.map +1 -0
- package/dist/ui/navigation-focus.test.d.ts +2 -0
- package/dist/ui/navigation-focus.test.d.ts.map +1 -0
- package/dist/ui/navigation-focus.test.js +28 -0
- package/dist/ui/navigation-focus.test.js.map +1 -0
- package/dist/ui/open-in-cockpit-link.d.ts +28 -0
- package/dist/ui/open-in-cockpit-link.d.ts.map +1 -0
- package/dist/ui/open-in-cockpit-link.js +41 -0
- package/dist/ui/open-in-cockpit-link.js.map +1 -0
- package/dist/ui/paged-list-footer.test.d.ts +2 -0
- package/dist/ui/paged-list-footer.test.d.ts.map +1 -0
- package/dist/ui/paged-list-footer.test.js +128 -0
- package/dist/ui/paged-list-footer.test.js.map +1 -0
- package/dist/ui/paged-rows.d.ts +24 -0
- package/dist/ui/paged-rows.d.ts.map +1 -0
- package/dist/ui/paged-rows.js +25 -0
- package/dist/ui/paged-rows.js.map +1 -0
- package/dist/ui/parse-tool-result.test.d.ts +2 -0
- package/dist/ui/parse-tool-result.test.d.ts.map +1 -0
- package/dist/ui/parse-tool-result.test.js +88 -0
- package/dist/ui/parse-tool-result.test.js.map +1 -0
- package/dist/ui/profile-gate.d.ts +37 -0
- package/dist/ui/profile-gate.d.ts.map +1 -0
- package/dist/ui/profile-gate.js +126 -0
- package/dist/ui/profile-gate.js.map +1 -0
- package/dist/ui/profile-gate.test.d.ts +2 -0
- package/dist/ui/profile-gate.test.d.ts.map +1 -0
- package/dist/ui/profile-gate.test.js +246 -0
- package/dist/ui/profile-gate.test.js.map +1 -0
- package/dist/ui/query-fallback.d.ts +27 -0
- package/dist/ui/query-fallback.d.ts.map +1 -0
- package/dist/ui/query-fallback.js +30 -0
- package/dist/ui/query-fallback.js.map +1 -0
- package/dist/ui/query-fallback.test.d.ts +2 -0
- package/dist/ui/query-fallback.test.d.ts.map +1 -0
- package/dist/ui/query-fallback.test.js +49 -0
- package/dist/ui/query-fallback.test.js.map +1 -0
- package/dist/ui/row-card.d.ts +13 -0
- package/dist/ui/row-card.d.ts.map +1 -0
- package/dist/ui/row-card.js +11 -0
- package/dist/ui/row-card.js.map +1 -0
- package/dist/ui/section.d.ts +18 -0
- package/dist/ui/section.d.ts.map +1 -0
- package/dist/ui/section.js +14 -0
- package/dist/ui/section.js.map +1 -0
- package/dist/ui/segmented-control.d.ts +25 -0
- package/dist/ui/segmented-control.d.ts.map +1 -0
- package/dist/ui/segmented-control.js +22 -0
- package/dist/ui/segmented-control.js.map +1 -0
- package/dist/ui/settings-labels.d.ts +33 -0
- package/dist/ui/settings-labels.d.ts.map +1 -0
- package/dist/ui/settings-labels.js +50 -0
- package/dist/ui/settings-labels.js.map +1 -0
- package/dist/ui/settings-layout.d.ts +29 -0
- package/dist/ui/settings-layout.d.ts.map +1 -0
- package/dist/ui/settings-layout.js +49 -0
- package/dist/ui/settings-layout.js.map +1 -0
- package/dist/ui/settings-layout.test.d.ts +2 -0
- package/dist/ui/settings-layout.test.d.ts.map +1 -0
- package/dist/ui/settings-layout.test.js +73 -0
- package/dist/ui/settings-layout.test.js.map +1 -0
- package/dist/ui/settings.d.ts +47 -0
- package/dist/ui/settings.d.ts.map +1 -0
- package/dist/ui/settings.js +48 -0
- package/dist/ui/settings.js.map +1 -0
- package/dist/ui/settings.test.d.ts +2 -0
- package/dist/ui/settings.test.d.ts.map +1 -0
- package/dist/ui/settings.test.js +38 -0
- package/dist/ui/settings.test.js.map +1 -0
- package/dist/ui/shell-host.d.ts +46 -0
- package/dist/ui/shell-host.d.ts.map +1 -0
- package/dist/ui/shell-host.js +56 -0
- package/dist/ui/shell-host.js.map +1 -0
- package/dist/ui/shell-settings.d.ts +31 -0
- package/dist/ui/shell-settings.d.ts.map +1 -0
- package/dist/ui/shell-settings.js +97 -0
- package/dist/ui/shell-settings.js.map +1 -0
- package/dist/ui/shell-settings.test.d.ts +2 -0
- package/dist/ui/shell-settings.test.d.ts.map +1 -0
- package/dist/ui/shell-settings.test.js +108 -0
- package/dist/ui/shell-settings.test.js.map +1 -0
- package/dist/ui/shell-widgets.d.ts +14 -0
- package/dist/ui/shell-widgets.d.ts.map +1 -0
- package/dist/ui/shell-widgets.js +18 -0
- package/dist/ui/shell-widgets.js.map +1 -0
- package/dist/ui/table.d.ts +61 -0
- package/dist/ui/table.d.ts.map +1 -0
- package/dist/ui/table.js +43 -0
- package/dist/ui/table.js.map +1 -0
- package/dist/ui/tone-components.test.d.ts +2 -0
- package/dist/ui/tone-components.test.d.ts.map +1 -0
- package/dist/ui/tone-components.test.js +145 -0
- package/dist/ui/tone-components.test.js.map +1 -0
- package/dist/ui/tone-contrast.test.d.ts +2 -0
- package/dist/ui/tone-contrast.test.d.ts.map +1 -0
- package/dist/ui/tone-contrast.test.js +66 -0
- package/dist/ui/tone-contrast.test.js.map +1 -0
- package/dist/ui/toolkit-overlap.test.d.ts +2 -0
- package/dist/ui/toolkit-overlap.test.d.ts.map +1 -0
- package/dist/ui/toolkit-overlap.test.js +86 -0
- package/dist/ui/toolkit-overlap.test.js.map +1 -0
- package/dist/ui/use-apply-theme.d.ts +11 -0
- package/dist/ui/use-apply-theme.d.ts.map +1 -0
- package/dist/ui/use-apply-theme.js +37 -0
- package/dist/ui/use-apply-theme.js.map +1 -0
- package/dist/ui/use-apply-theme.test.d.ts +2 -0
- package/dist/ui/use-apply-theme.test.d.ts.map +1 -0
- package/dist/ui/use-apply-theme.test.js +102 -0
- package/dist/ui/use-apply-theme.test.js.map +1 -0
- package/dist/ui/use-bpmn-viewer.d.ts +135 -0
- package/dist/ui/use-bpmn-viewer.d.ts.map +1 -0
- package/dist/ui/use-bpmn-viewer.js +257 -0
- package/dist/ui/use-bpmn-viewer.js.map +1 -0
- package/dist/ui/use-bpmn-viewer.test.d.ts +2 -0
- package/dist/ui/use-bpmn-viewer.test.d.ts.map +1 -0
- package/dist/ui/use-bpmn-viewer.test.js +239 -0
- package/dist/ui/use-bpmn-viewer.test.js.map +1 -0
- package/dist/ui/use-detail-view.d.ts +49 -0
- package/dist/ui/use-detail-view.d.ts.map +1 -0
- package/dist/ui/use-detail-view.js +52 -0
- package/dist/ui/use-detail-view.js.map +1 -0
- package/dist/ui/use-detail-view.test.d.ts +2 -0
- package/dist/ui/use-detail-view.test.d.ts.map +1 -0
- package/dist/ui/use-detail-view.test.js +178 -0
- package/dist/ui/use-detail-view.test.js.map +1 -0
- package/dist/ui/use-paged-list-view.d.ts +48 -0
- package/dist/ui/use-paged-list-view.d.ts.map +1 -0
- package/dist/ui/use-paged-list-view.js +41 -0
- package/dist/ui/use-paged-list-view.js.map +1 -0
- package/dist/ui/use-paged-list-view.test.d.ts +2 -0
- package/dist/ui/use-paged-list-view.test.d.ts.map +1 -0
- package/dist/ui/use-paged-list-view.test.js +136 -0
- package/dist/ui/use-paged-list-view.test.js.map +1 -0
- package/dist/ui/use-paged-view-data.d.ts +103 -0
- package/dist/ui/use-paged-view-data.d.ts.map +1 -0
- package/dist/ui/use-paged-view-data.js +173 -0
- package/dist/ui/use-paged-view-data.js.map +1 -0
- package/dist/ui/use-paged-view-data.seeded.test.d.ts +2 -0
- package/dist/ui/use-paged-view-data.seeded.test.d.ts.map +1 -0
- package/dist/ui/use-paged-view-data.seeded.test.js +144 -0
- package/dist/ui/use-paged-view-data.seeded.test.js.map +1 -0
- package/dist/ui/use-paged-view-data.test.d.ts +2 -0
- package/dist/ui/use-paged-view-data.test.d.ts.map +1 -0
- package/dist/ui/use-paged-view-data.test.js +330 -0
- package/dist/ui/use-paged-view-data.test.js.map +1 -0
- package/dist/ui/use-reset-on-change.d.ts +22 -0
- package/dist/ui/use-reset-on-change.d.ts.map +1 -0
- package/dist/ui/use-reset-on-change.js +29 -0
- package/dist/ui/use-reset-on-change.js.map +1 -0
- package/dist/ui/use-reset-on-change.test.d.ts +2 -0
- package/dist/ui/use-reset-on-change.test.d.ts.map +1 -0
- package/dist/ui/use-reset-on-change.test.js +61 -0
- package/dist/ui/use-reset-on-change.test.js.map +1 -0
- package/dist/ui/use-view-data.seeded.test.d.ts +2 -0
- package/dist/ui/use-view-data.seeded.test.d.ts.map +1 -0
- package/dist/ui/use-view-data.seeded.test.js +168 -0
- package/dist/ui/use-view-data.seeded.test.js.map +1 -0
- package/dist/ui/view-data-state.d.ts +52 -0
- package/dist/ui/view-data-state.d.ts.map +1 -0
- package/dist/ui/view-data-state.js +54 -0
- package/dist/ui/view-data-state.js.map +1 -0
- package/dist/ui/view-data-state.test.d.ts +2 -0
- package/dist/ui/view-data-state.test.d.ts.map +1 -0
- package/dist/ui/view-data-state.test.js +62 -0
- package/dist/ui/view-data-state.test.js.map +1 -0
- package/dist/ui/view-meta.d.ts +70 -0
- package/dist/ui/view-meta.d.ts.map +1 -0
- package/dist/ui/view-meta.js +84 -0
- package/dist/ui/view-meta.js.map +1 -0
- package/dist/ui/view-meta.test.d.ts +2 -0
- package/dist/ui/view-meta.test.d.ts.map +1 -0
- package/dist/ui/view-meta.test.js +92 -0
- package/dist/ui/view-meta.test.js.map +1 -0
- package/dist/ui/view-refresh-state.d.ts +26 -0
- package/dist/ui/view-refresh-state.d.ts.map +1 -0
- package/dist/ui/view-refresh-state.js +15 -0
- package/dist/ui/view-refresh-state.js.map +1 -0
- package/dist/ui/widget-shell.d.ts +24 -0
- package/dist/ui/widget-shell.d.ts.map +1 -0
- package/dist/ui/widget-shell.js +50 -0
- package/dist/ui/widget-shell.js.map +1 -0
- package/dist/ui/widget-shell.test.d.ts +2 -0
- package/dist/ui/widget-shell.test.d.ts.map +1 -0
- package/dist/ui/widget-shell.test.js +41 -0
- package/dist/ui/widget-shell.test.js.map +1 -0
- package/dist/view-results.d.ts +42 -0
- package/dist/view-results.d.ts.map +1 -0
- package/dist/view-results.js +17 -0
- package/dist/view-results.js.map +1 -0
- package/dist/widget-meta-defaults.d.ts +48 -0
- package/dist/widget-meta-defaults.d.ts.map +1 -0
- package/dist/widget-meta-defaults.js +80 -0
- package/dist/widget-meta-defaults.js.map +1 -0
- package/dist/widget-meta-defaults.test.d.ts +2 -0
- package/dist/widget-meta-defaults.test.d.ts.map +1 -0
- package/dist/widget-meta-defaults.test.js +196 -0
- package/dist/widget-meta-defaults.test.js.map +1 -0
- package/dist/widget-tool-bindings.d.ts +71 -0
- package/dist/widget-tool-bindings.d.ts.map +1 -0
- package/dist/widget-tool-bindings.js +80 -0
- package/dist/widget-tool-bindings.js.map +1 -0
- package/dist/widget-tool-bindings.test.d.ts +2 -0
- package/dist/widget-tool-bindings.test.d.ts.map +1 -0
- package/dist/widget-tool-bindings.test.js +83 -0
- package/dist/widget-tool-bindings.test.js.map +1 -0
- package/dist/with-tool-errors.test.d.ts +2 -0
- package/dist/with-tool-errors.test.d.ts.map +1 -0
- package/dist/with-tool-errors.test.js +38 -0
- package/dist/with-tool-errors.test.js.map +1 -0
- package/package.json +113 -5
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import type { AppConfig, AppConfigEntry, AppPlugin } from "@miragon/mcp-toolkit-core";
|
|
2
|
+
import type { MCPServer } from "mcp-use";
|
|
3
|
+
import type { ToolsetSource, ToolsetVocabulary } from "./toolsets.js";
|
|
4
|
+
/**
|
|
5
|
+
* The composition-root machinery every server (the stock app AND a customer's
|
|
6
|
+
* composed server) previously copied: module selection via
|
|
7
|
+
* `MCP_ACTIVE_MODULES` (with the `module:toolset` suffix), the env-typo
|
|
8
|
+
* warner, boot warnings, and the mcp-use `AppConfig`/plugin assembly.
|
|
9
|
+
*
|
|
10
|
+
* The module PORT SHAPE lives here ({@link ComposableModule}); what stays
|
|
11
|
+
* app-owned by design is its instantiation: each composition root declares its
|
|
12
|
+
* own shared-resources type (`ComposableModule<MyShared>`), its module list,
|
|
13
|
+
* and the cross-module wiring — which module's capability reaches which other
|
|
14
|
+
* module is configuration knowledge, never a module-to-module import.
|
|
15
|
+
* Modules keep conforming STRUCTURALLY and never import this type.
|
|
16
|
+
*/
|
|
17
|
+
export interface ComposableModule<TShared> {
|
|
18
|
+
/** Module key used in `MCP_ACTIVE_MODULES` and as the `activeApps` entry name. */
|
|
19
|
+
name: string;
|
|
20
|
+
/** Pure env → raw-config mapping; must not read `process.env` or perform I/O side effects beyond config sources. */
|
|
21
|
+
configFromEnv(env: NodeJS.ProcessEnv): Record<string, unknown>;
|
|
22
|
+
/** Env vars this module reads — composed into the root's unknown-var typo warner. */
|
|
23
|
+
knownEnvVars: readonly string[];
|
|
24
|
+
/**
|
|
25
|
+
* The module's toolset vocabulary (`createToolsetVocabulary`). Declaring it
|
|
26
|
+
* opts the module into the `module:toolset` suffix: the composition resolves
|
|
27
|
+
* ONE concrete toolset per boot — the suffix, or the auth-dependent default,
|
|
28
|
+
* never "everything" — and threads it into `config.toolset`. Absent = the
|
|
29
|
+
* module has no toolsets: a suffix is ignored (with a warning) and its config
|
|
30
|
+
* never carries a `toolset`.
|
|
31
|
+
*/
|
|
32
|
+
toolsets?: ToolsetVocabulary<string>;
|
|
33
|
+
/** Optional boot-time hints (returned, and logged by the root) for active deployments. */
|
|
34
|
+
bootWarnings?(env: NodeJS.ProcessEnv): string[];
|
|
35
|
+
/**
|
|
36
|
+
* Optional model-facing usage notes for this module — routing rules,
|
|
37
|
+
* argument conventions, which tool answers which question — joined into
|
|
38
|
+
* the server `instructions` ({@link ModuleComposition.instructions}), so
|
|
39
|
+
* the rule is stated ONCE instead of in every tool description. Receives
|
|
40
|
+
* the module's boot config (incl. its effective `toolset`) and the boot's
|
|
41
|
+
* auth mode; `undefined` contributes nothing.
|
|
42
|
+
*/
|
|
43
|
+
instructions?(config: Record<string, unknown>, context: InstructionsContext): string | undefined;
|
|
44
|
+
/** Validates the raw config and builds the plugin; receives the shared resources. */
|
|
45
|
+
createPlugin(config: Record<string, unknown>, shared: TShared): AppPlugin<MCPServer>;
|
|
46
|
+
}
|
|
47
|
+
/** What a module's {@link ComposableModule.instructions} may depend on besides its config. */
|
|
48
|
+
export interface InstructionsContext {
|
|
49
|
+
/** Whether the root installed OAuth — a caller identity (and per-user saves) exists. */
|
|
50
|
+
authenticated: boolean;
|
|
51
|
+
}
|
|
52
|
+
export interface ActiveModuleRef {
|
|
53
|
+
name: string;
|
|
54
|
+
/**
|
|
55
|
+
* The raw toolset suffix from the `module:toolset` syntax, e.g.
|
|
56
|
+
* `camunda7:read-only` — trimmed, and kept even when EMPTY (`camunda7:` →
|
|
57
|
+
* `""`), so an empty suffix fails closed like an unknown one instead of
|
|
58
|
+
* reading as "no suffix". Absent = no suffix: the auth-dependent default.
|
|
59
|
+
*/
|
|
60
|
+
toolset?: string;
|
|
61
|
+
}
|
|
62
|
+
/** The toolset one active module runs with — one entry of the boot log. */
|
|
63
|
+
export interface EffectiveToolset {
|
|
64
|
+
module: string;
|
|
65
|
+
/** The concrete toolset; absent for a module without toolsets. */
|
|
66
|
+
toolset?: string;
|
|
67
|
+
/**
|
|
68
|
+
* Why: the suffix named it, the auth-dependent default applied, an empty or
|
|
69
|
+
* unknown suffix fell back to the floor — or `none` for a module without
|
|
70
|
+
* toolsets.
|
|
71
|
+
*/
|
|
72
|
+
source: ToolsetSource | "none";
|
|
73
|
+
/**
|
|
74
|
+
* Whether the toolset permits durable writes. A module without toolsets
|
|
75
|
+
* declares no restriction (`true`).
|
|
76
|
+
*/
|
|
77
|
+
durableWrites: boolean;
|
|
78
|
+
}
|
|
79
|
+
/** One boot's module selection, resolved ONCE by the composition root. */
|
|
80
|
+
export interface ResolvedBoot {
|
|
81
|
+
/** Whether the root installed OAuth (a caller identity exists). */
|
|
82
|
+
authenticated: boolean;
|
|
83
|
+
/** The active modules' mcp-use config entries, each carrying its effective toolset. */
|
|
84
|
+
entries: AppConfigEntry[];
|
|
85
|
+
toolsets: EffectiveToolset[];
|
|
86
|
+
}
|
|
87
|
+
export interface ResolveBootOptions {
|
|
88
|
+
/**
|
|
89
|
+
* Whether the composition root INSTALLED OAuth on `/mcp`. Only the root
|
|
90
|
+
* knows — never infer it from an env var the root may not honor (a server
|
|
91
|
+
* without OAuth wiring would read a stray `MCP_OAUTH` as authenticated and
|
|
92
|
+
* fail open). Omitted = `false`, the fail-closed reading.
|
|
93
|
+
*/
|
|
94
|
+
authenticated?: boolean;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* All members are `this`-free closures (function properties, not methods), so
|
|
98
|
+
* composition roots may destructure or re-export them directly
|
|
99
|
+
* (`export const warnUnknownEnvVars = composition.warnUnknownEnvVars`).
|
|
100
|
+
*/
|
|
101
|
+
export interface ModuleComposition<TShared> {
|
|
102
|
+
/** Every known env var: the root's own plus each module's slice. */
|
|
103
|
+
knownEnvVars: ReadonlySet<string>;
|
|
104
|
+
/** The `MCP_ACTIVE_MODULES` selection (unset/`all` = every module); unknown names warn and are skipped. */
|
|
105
|
+
activeModules: (env?: NodeJS.ProcessEnv) => ActiveModuleRef[];
|
|
106
|
+
/**
|
|
107
|
+
* Resolve the boot ONCE: every toolset-bearing module gets a concrete
|
|
108
|
+
* effective toolset in its config (suffix → itself; empty/unknown → the
|
|
109
|
+
* module's floor, with one warning; none → the floor without OAuth, the
|
|
110
|
+
* module's standard toolset with it). Call it once per boot and derive
|
|
111
|
+
* plugins, `AppConfig` and the boot log from the result.
|
|
112
|
+
*/
|
|
113
|
+
resolveBoot: (env?: NodeJS.ProcessEnv, options?: ResolveBootOptions) => ResolvedBoot;
|
|
114
|
+
/** `resolveBoot(env, options).entries`. */
|
|
115
|
+
appEntries: (env?: NodeJS.ProcessEnv, options?: ResolveBootOptions) => AppConfigEntry[];
|
|
116
|
+
appConfig: (env?: NodeJS.ProcessEnv, options?: ResolveBootOptions) => AppConfig;
|
|
117
|
+
/** Instantiate the active modules' plugins with the root's shared resources. */
|
|
118
|
+
pluginsFor: (entries: AppConfigEntry[], shared: TShared) => AppPlugin<MCPServer>[];
|
|
119
|
+
/** Report unknown env vars under any watched prefix; returns the offenders. */
|
|
120
|
+
warnUnknownEnvVars: (env?: NodeJS.ProcessEnv, extraKnown?: Iterable<string>) => string[];
|
|
121
|
+
/** Collect + log the active modules' boot-time hints. */
|
|
122
|
+
emitBootWarnings: (env?: NodeJS.ProcessEnv) => string[];
|
|
123
|
+
/** Log (console.info) and return the one boot line that states each active module's effective toolset. */
|
|
124
|
+
logEffectiveToolsets: (boot: ResolvedBoot) => string;
|
|
125
|
+
/**
|
|
126
|
+
* The active modules' instruction snippets for this boot, in module order,
|
|
127
|
+
* joined by a blank line — `undefined` when none contributes. The root
|
|
128
|
+
* prepends its own preamble (`createComposedServer` does).
|
|
129
|
+
*/
|
|
130
|
+
instructions: (boot: ResolvedBoot) => string | undefined;
|
|
131
|
+
}
|
|
132
|
+
export declare function composeModules<TShared>(options: {
|
|
133
|
+
/** Log prefix for every warning, e.g. `pulse`. */
|
|
134
|
+
label: string;
|
|
135
|
+
modules: readonly ComposableModule<TShared>[];
|
|
136
|
+
/** The root's own env vars (module vars come from each module's `knownEnvVars`). */
|
|
137
|
+
appEnvVars?: readonly string[];
|
|
138
|
+
/**
|
|
139
|
+
* Prefixes owned by dependencies, exempt from the typo warner
|
|
140
|
+
* (mcp-use itself + the dev inspector by default).
|
|
141
|
+
*/
|
|
142
|
+
foreignEnvPrefixes?: readonly string[];
|
|
143
|
+
/** Optional pointer appended to the unknown-var warning, e.g. `see docs/operations.md`. */
|
|
144
|
+
envVarHint?: string;
|
|
145
|
+
}): ModuleComposition<TShared>;
|
|
146
|
+
/**
|
|
147
|
+
* Whether the server may register FRAMEWORK durable writes — the toolkit
|
|
148
|
+
* builder's `save-dashboard`/`delete-dashboard` and the shell's
|
|
149
|
+
* `shell_save_settings`, which no module toolset filters. Only with a caller
|
|
150
|
+
* identity (records are keyed by user; without OAuth every record is shared
|
|
151
|
+
* and ownerless) and only when no active module sits on its read-only floor:
|
|
152
|
+
* the most restrictive module wins.
|
|
153
|
+
*/
|
|
154
|
+
export declare function frameworkWritesAllowed(boot: ResolvedBoot): boolean;
|
|
155
|
+
//# sourceMappingURL=composition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composition.d.ts","sourceRoot":"","sources":["../src/composition.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
export function composeModules(options) {
|
|
2
|
+
const { label, modules, appEnvVars = [], foreignEnvPrefixes = ["MCP_USE_", "MCP_INSPECTOR_"], envVarHint, } = options;
|
|
3
|
+
const registry = Object.fromEntries(modules.map((m) => [m.name, m]));
|
|
4
|
+
const knownEnvVars = new Set([...appEnvVars, ...modules.flatMap((m) => [...m.knownEnvVars])]);
|
|
5
|
+
// Watched prefixes derive from every known var (NOTES_TITLE contributes
|
|
6
|
+
// NOTES_, PROMETHEUS_URL contributes PROMETHEUS_, …) so custom modules get
|
|
7
|
+
// the same typo coverage as the CAMUNDA_/MCP_ families — a hardcoded prefix
|
|
8
|
+
// list would silently exempt every non-Camunda module.
|
|
9
|
+
const watchedPrefixes = [
|
|
10
|
+
...new Set([...knownEnvVars]
|
|
11
|
+
.map((name) => name.slice(0, name.indexOf("_") + 1))
|
|
12
|
+
.filter((prefix) => prefix.length > 1)),
|
|
13
|
+
];
|
|
14
|
+
/**
|
|
15
|
+
* `MCP_ACTIVE_MODULES` → the known modules (with their raw suffix) and the
|
|
16
|
+
* unknown names. Deliberately not the toolkit's `parseActiveModules`: that
|
|
17
|
+
* one reads an empty qualifier (`camunda7:`) as no qualifier, which would
|
|
18
|
+
* turn it into the auth-dependent default instead of failing closed. A name
|
|
19
|
+
* that appears twice is refused — two entries would build two plugins with
|
|
20
|
+
* colliding steps, and which suffix wins would be a guess.
|
|
21
|
+
*/
|
|
22
|
+
const parseActiveModules = (env) => {
|
|
23
|
+
const envValue = env.MCP_ACTIVE_MODULES?.trim();
|
|
24
|
+
if (!envValue || envValue === "all") {
|
|
25
|
+
return { known: modules.map(({ name }) => ({ name })), unknown: [] };
|
|
26
|
+
}
|
|
27
|
+
const refs = envValue
|
|
28
|
+
.split(",")
|
|
29
|
+
.map((s) => s.trim())
|
|
30
|
+
.filter(Boolean)
|
|
31
|
+
.map((entry) => {
|
|
32
|
+
// Everything after the FIRST colon is the suffix, kept even when empty
|
|
33
|
+
// or when it contains further colons — both are then unknown toolset
|
|
34
|
+
// names and fail closed, instead of reading as "no suffix".
|
|
35
|
+
const colon = entry.indexOf(":");
|
|
36
|
+
if (colon === -1)
|
|
37
|
+
return { name: entry };
|
|
38
|
+
return { name: entry.slice(0, colon).trim(), toolset: entry.slice(colon + 1).trim() };
|
|
39
|
+
});
|
|
40
|
+
const repeated = [...new Set(refs.map(({ name }) => name))].filter((name) => refs.filter((ref) => ref.name === name).length > 1);
|
|
41
|
+
if (repeated.length > 0) {
|
|
42
|
+
throw new Error(`[${label}] MCP_ACTIVE_MODULES names ${repeated.map((name) => `"${name}"`).join(", ")} more than once — list each module once, with at most one :toolset.`);
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
known: refs.filter(({ name }) => registry[name]),
|
|
46
|
+
unknown: refs.filter(({ name }) => !registry[name]).map(({ name }) => name),
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
/** The known active modules; the unknown ones warn once per boot, in `emitBootWarnings`. */
|
|
50
|
+
const activeModules = (env = process.env) => parseActiveModules(env).known;
|
|
51
|
+
// The one place a suffix becomes a toolset: per module, per boot.
|
|
52
|
+
const effectiveToolset = (module, suffix, authenticated) => {
|
|
53
|
+
const vocabulary = module.toolsets;
|
|
54
|
+
if (vocabulary) {
|
|
55
|
+
const { toolset, source } = vocabulary.effective(suffix, { authenticated });
|
|
56
|
+
return {
|
|
57
|
+
module: module.name,
|
|
58
|
+
toolset,
|
|
59
|
+
source,
|
|
60
|
+
durableWrites: vocabulary.allowsDurableWrites(toolset),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
if (suffix !== undefined) {
|
|
64
|
+
console.warn(`[${label}] Module "${module.name}" has no toolsets — ignoring ":${suffix}"`);
|
|
65
|
+
}
|
|
66
|
+
return { module: module.name, source: "none", durableWrites: true };
|
|
67
|
+
};
|
|
68
|
+
const resolveBoot = (env = process.env, { authenticated = false } = {}) => {
|
|
69
|
+
const toolsets = [];
|
|
70
|
+
const entries = activeModules(env).map(({ name, toolset: suffix }) => {
|
|
71
|
+
const effective = effectiveToolset(registry[name], suffix, authenticated);
|
|
72
|
+
toolsets.push(effective);
|
|
73
|
+
const { toolset } = effective;
|
|
74
|
+
return {
|
|
75
|
+
app: name,
|
|
76
|
+
config: {
|
|
77
|
+
...registry[name].configFromEnv(env),
|
|
78
|
+
...(toolset === undefined ? {} : { toolset }),
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
});
|
|
82
|
+
return { authenticated, entries, toolsets };
|
|
83
|
+
};
|
|
84
|
+
const appEntries = (env, options) => resolveBoot(env, options).entries;
|
|
85
|
+
return {
|
|
86
|
+
knownEnvVars,
|
|
87
|
+
activeModules,
|
|
88
|
+
resolveBoot,
|
|
89
|
+
appEntries,
|
|
90
|
+
appConfig(env, options) {
|
|
91
|
+
return { activeApps: appEntries(env, options), pipelines: {} };
|
|
92
|
+
},
|
|
93
|
+
pluginsFor(entries, shared) {
|
|
94
|
+
return entries
|
|
95
|
+
.filter((entry) => registry[entry.app])
|
|
96
|
+
.map((entry) => registry[entry.app].createPlugin(entry.config, shared));
|
|
97
|
+
},
|
|
98
|
+
warnUnknownEnvVars(env = process.env, extraKnown = []) {
|
|
99
|
+
const known = new Set([...knownEnvVars, ...extraKnown]);
|
|
100
|
+
// `<KNOWN_VAR>_*` extensions (DATABASE_URL_FILE, REDIS_URL_2, …) are
|
|
101
|
+
// conventions addressed at OTHER processes — docker secrets, sidecars —
|
|
102
|
+
// never a typo of the var they extend, so they don't warn.
|
|
103
|
+
const extendsKnownVar = (name) => [...known].some((knownName) => name.startsWith(`${knownName}_`));
|
|
104
|
+
const unknown = Object.keys(env).filter((name) => watchedPrefixes.some((prefix) => name.startsWith(prefix)) &&
|
|
105
|
+
!known.has(name) &&
|
|
106
|
+
!extendsKnownVar(name) &&
|
|
107
|
+
!foreignEnvPrefixes.some((prefix) => name.startsWith(prefix)));
|
|
108
|
+
for (const name of unknown) {
|
|
109
|
+
console.warn(`[${label}] Unknown environment variable "${name}" — the server does not read it; ` +
|
|
110
|
+
`check for a typo${envVarHint ? ` (${envVarHint})` : ""}.`);
|
|
111
|
+
}
|
|
112
|
+
return unknown;
|
|
113
|
+
},
|
|
114
|
+
emitBootWarnings(env = process.env) {
|
|
115
|
+
// Deliberately separate from `configFromEnv` (which runs inside
|
|
116
|
+
// `resolveBoot` and stays side-effect free).
|
|
117
|
+
const { known, unknown } = parseActiveModules(env);
|
|
118
|
+
const warnings = [
|
|
119
|
+
...unknown.map((name) => `Unknown module "${name}" in MCP_ACTIVE_MODULES — skipping`),
|
|
120
|
+
...known.flatMap(({ name }) => registry[name].bootWarnings?.(env) ?? []),
|
|
121
|
+
];
|
|
122
|
+
for (const warning of warnings) {
|
|
123
|
+
console.warn(`[${label}] ${warning}`);
|
|
124
|
+
}
|
|
125
|
+
return warnings;
|
|
126
|
+
},
|
|
127
|
+
logEffectiveToolsets(boot) {
|
|
128
|
+
// console.info, deliberately not a boot WARNING: it states the surface
|
|
129
|
+
// on every boot, the restrictive default included.
|
|
130
|
+
const describe = ({ module, toolset, source }) => {
|
|
131
|
+
if (toolset === undefined)
|
|
132
|
+
return `${module} (no toolsets)`;
|
|
133
|
+
if (source === "default") {
|
|
134
|
+
return `${module}:${toolset} (default ${boot.authenticated ? "with" : "without"} OAuth)`;
|
|
135
|
+
}
|
|
136
|
+
return `${module}:${toolset} (${source})`;
|
|
137
|
+
};
|
|
138
|
+
const modules = boot.toolsets.map(describe).join(", ");
|
|
139
|
+
const line = `[${label}] Toolsets — ${modules || "no active modules"}`;
|
|
140
|
+
console.info(line);
|
|
141
|
+
return line;
|
|
142
|
+
},
|
|
143
|
+
instructions(boot) {
|
|
144
|
+
const context = { authenticated: boot.authenticated };
|
|
145
|
+
const snippets = boot.entries
|
|
146
|
+
.map((entry) => registry[entry.app]?.instructions?.(entry.config, context)?.trim())
|
|
147
|
+
.filter((snippet) => Boolean(snippet));
|
|
148
|
+
return snippets.length > 0 ? snippets.join("\n\n") : undefined;
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Whether the server may register FRAMEWORK durable writes — the toolkit
|
|
154
|
+
* builder's `save-dashboard`/`delete-dashboard` and the shell's
|
|
155
|
+
* `shell_save_settings`, which no module toolset filters. Only with a caller
|
|
156
|
+
* identity (records are keyed by user; without OAuth every record is shared
|
|
157
|
+
* and ownerless) and only when no active module sits on its read-only floor:
|
|
158
|
+
* the most restrictive module wins.
|
|
159
|
+
*/
|
|
160
|
+
export function frameworkWritesAllowed(boot) {
|
|
161
|
+
return boot.authenticated && boot.toolsets.every(({ durableWrites }) => durableWrites);
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=composition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composition.js","sourceRoot":"","sources":["../src/composition.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composition.test.d.ts","sourceRoot":"","sources":["../src/composition.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { composeModules, frameworkWritesAllowed, } from "./composition.js";
|
|
3
|
+
import { createToolsetVocabulary } from "./toolsets.js";
|
|
4
|
+
const moduleOf = (name, overrides = {}) => ({
|
|
5
|
+
name,
|
|
6
|
+
configFromEnv: (env) => ({ url: env[`${name.toUpperCase()}_URL`] ?? "default" }),
|
|
7
|
+
knownEnvVars: [`${name.toUpperCase()}_URL`],
|
|
8
|
+
toolsets: createToolsetVocabulary(name, ["read-only", "operations", "admin"], "read-only", {
|
|
9
|
+
authenticatedDefault: "operations",
|
|
10
|
+
}),
|
|
11
|
+
createPlugin: (config, shared) => ({ definition: { name }, config, shared }),
|
|
12
|
+
...overrides,
|
|
13
|
+
});
|
|
14
|
+
const compose = (modules = [moduleOf("alpha"), moduleOf("beta")]) => composeModules({
|
|
15
|
+
label: "test-root",
|
|
16
|
+
modules,
|
|
17
|
+
appEnvVars: ["MCP_ACTIVE_MODULES", "MCP_PROFILE_DIR"],
|
|
18
|
+
});
|
|
19
|
+
afterEach(() => {
|
|
20
|
+
vi.restoreAllMocks();
|
|
21
|
+
});
|
|
22
|
+
describe("activeModules / appEntries", () => {
|
|
23
|
+
it("activates every module when MCP_ACTIVE_MODULES is unset or 'all'", () => {
|
|
24
|
+
expect(compose().activeModules({})).toEqual([{ name: "alpha" }, { name: "beta" }]);
|
|
25
|
+
expect(compose().activeModules({ MCP_ACTIVE_MODULES: "all" })).toEqual([
|
|
26
|
+
{ name: "alpha" },
|
|
27
|
+
{ name: "beta" },
|
|
28
|
+
]);
|
|
29
|
+
});
|
|
30
|
+
it("parses the comma list with optional module:toolset suffixes", () => {
|
|
31
|
+
expect(compose().activeModules({ MCP_ACTIVE_MODULES: "beta:read-only, alpha" })).toEqual([
|
|
32
|
+
{ name: "beta", toolset: "read-only" },
|
|
33
|
+
{ name: "alpha" },
|
|
34
|
+
]);
|
|
35
|
+
});
|
|
36
|
+
it("keeps an EMPTY suffix distinct from no suffix, trims both halves, keeps extra colons", () => {
|
|
37
|
+
expect(compose().activeModules({ MCP_ACTIVE_MODULES: "alpha:, beta : admin:read-only" })).toEqual([
|
|
38
|
+
{ name: "alpha", toolset: "" },
|
|
39
|
+
{ name: "beta", toolset: "admin:read-only" },
|
|
40
|
+
]);
|
|
41
|
+
});
|
|
42
|
+
it("skips unknown modules, warning ONCE per boot in the boot warnings", () => {
|
|
43
|
+
const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
44
|
+
const env = { MCP_ACTIVE_MODULES: "nope:read-only,alpha" };
|
|
45
|
+
const composition = compose();
|
|
46
|
+
expect(composition.activeModules(env)).toEqual([{ name: "alpha" }]);
|
|
47
|
+
composition.resolveBoot(env);
|
|
48
|
+
expect(warn).not.toHaveBeenCalled();
|
|
49
|
+
composition.emitBootWarnings(env);
|
|
50
|
+
expect(warn).toHaveBeenCalledOnce();
|
|
51
|
+
expect(warn).toHaveBeenCalledWith(expect.stringContaining('[test-root] Unknown module "nope"'));
|
|
52
|
+
});
|
|
53
|
+
it("refuses a module named twice, whichever suffixes it carries", () => {
|
|
54
|
+
for (const value of ["alpha,alpha:read-only", "alpha:admin, beta, alpha"]) {
|
|
55
|
+
expect(() => compose().resolveBoot({ MCP_ACTIVE_MODULES: value })).toThrow(/MCP_ACTIVE_MODULES names "alpha" more than once/);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
it("threads the EFFECTIVE toolset into every module config; config comes from configFromEnv(env)", () => {
|
|
59
|
+
const entries = compose().appEntries({
|
|
60
|
+
MCP_ACTIVE_MODULES: "alpha:admin,beta",
|
|
61
|
+
ALPHA_URL: "http://a",
|
|
62
|
+
});
|
|
63
|
+
expect(entries).toEqual([
|
|
64
|
+
{ app: "alpha", config: { url: "http://a", toolset: "admin" } },
|
|
65
|
+
{ app: "beta", config: { url: "default", toolset: "read-only" } },
|
|
66
|
+
]);
|
|
67
|
+
});
|
|
68
|
+
it("strips the toolset suffix (warning) for modules without toolsets", () => {
|
|
69
|
+
const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
70
|
+
const modules = [moduleOf("alpha", { toolsets: undefined })];
|
|
71
|
+
const entries = compose(modules).appEntries({ MCP_ACTIVE_MODULES: "alpha:read-only" });
|
|
72
|
+
expect(entries[0].config).not.toHaveProperty("toolset");
|
|
73
|
+
expect(warn).toHaveBeenCalledWith('[test-root] Module "alpha" has no toolsets — ignoring ":read-only"');
|
|
74
|
+
});
|
|
75
|
+
it("passes no raw suffix through: the removed supportsToolsets flag makes no module toolset-bearing", () => {
|
|
76
|
+
// The pass-through is gone — a module declares a `toolsets` vocabulary
|
|
77
|
+
// or has none. A definition still carrying the old flag is a module
|
|
78
|
+
// WITHOUT toolsets: its suffix is ignored (warning) and its config never
|
|
79
|
+
// carries an unresolved name it might read as "everything".
|
|
80
|
+
const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
81
|
+
const stale = { ...moduleOf("alpha", { toolsets: undefined }), supportsToolsets: true };
|
|
82
|
+
const composition = compose([stale]);
|
|
83
|
+
const boot = composition.resolveBoot({ MCP_ACTIVE_MODULES: "alpha:admin" }, { authenticated: true });
|
|
84
|
+
expect(boot.entries[0].config).not.toHaveProperty("toolset");
|
|
85
|
+
expect(boot.toolsets).toEqual([{ module: "alpha", source: "none", durableWrites: true }]);
|
|
86
|
+
expect(warn).toHaveBeenCalledTimes(1);
|
|
87
|
+
expect(warn).toHaveBeenCalledWith('[test-root] Module "alpha" has no toolsets — ignoring ":admin"');
|
|
88
|
+
vi.spyOn(console, "info").mockImplementation(() => { });
|
|
89
|
+
expect(composition.logEffectiveToolsets(boot)).toBe("[test-root] Toolsets — alpha (no toolsets)");
|
|
90
|
+
});
|
|
91
|
+
it("appConfig wraps the entries in the mcp-use shape", () => {
|
|
92
|
+
expect(compose().appConfig({ MCP_ACTIVE_MODULES: "alpha" })).toEqual({
|
|
93
|
+
activeApps: [{ app: "alpha", config: { url: "default", toolset: "read-only" } }],
|
|
94
|
+
pipelines: {},
|
|
95
|
+
});
|
|
96
|
+
expect(compose().appConfig({ MCP_ACTIVE_MODULES: "alpha" }, { authenticated: true })).toEqual({
|
|
97
|
+
activeApps: [{ app: "alpha", config: { url: "default", toolset: "operations" } }],
|
|
98
|
+
pipelines: {},
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
describe("resolveBoot — the fail-closed toolset rule", () => {
|
|
103
|
+
const toolsetsOf = (boot) => Object.fromEntries(boot.toolsets.map(({ module, toolset }) => [module, toolset]));
|
|
104
|
+
it.each([undefined, "", "all", "alpha,beta"])("MCP_ACTIVE_MODULES=%j defaults to the floor without OAuth and to the standard toolset with it — never admin", (value) => {
|
|
105
|
+
const env = value === undefined ? {} : { MCP_ACTIVE_MODULES: value };
|
|
106
|
+
const anonymous = compose().resolveBoot(env);
|
|
107
|
+
expect(anonymous.authenticated).toBe(false);
|
|
108
|
+
expect(toolsetsOf(anonymous)).toEqual({ alpha: "read-only", beta: "read-only" });
|
|
109
|
+
expect(anonymous.toolsets.every(({ source }) => source === "default")).toBe(true);
|
|
110
|
+
expect(toolsetsOf(compose().resolveBoot(env, { authenticated: true }))).toEqual({
|
|
111
|
+
alpha: "operations",
|
|
112
|
+
beta: "operations",
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
it.each(["alpha:,beta:", "alpha: ,beta: ", "alpha:bogus,beta:admin:read-only"])("empty or unknown suffixes (%j) fail closed to the floor, even under OAuth", (value) => {
|
|
116
|
+
vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
117
|
+
const boot = compose().resolveBoot({ MCP_ACTIVE_MODULES: value }, { authenticated: true });
|
|
118
|
+
expect(toolsetsOf(boot)).toEqual({ alpha: "read-only", beta: "read-only" });
|
|
119
|
+
expect(boot.toolsets.every(({ source }) => source === "fallback")).toBe(true);
|
|
120
|
+
expect(boot.entries.map(({ config }) => config.toolset)).toEqual(["read-only", "read-only"]);
|
|
121
|
+
});
|
|
122
|
+
it("an explicit suffix wins over the default in both auth modes", () => {
|
|
123
|
+
for (const authenticated of [false, true]) {
|
|
124
|
+
const boot = compose().resolveBoot({ MCP_ACTIVE_MODULES: "alpha:admin,beta:read-only" }, { authenticated });
|
|
125
|
+
expect(toolsetsOf(boot)).toEqual({ alpha: "admin", beta: "read-only" });
|
|
126
|
+
expect(boot.toolsets.map(({ source }) => source)).toEqual(["suffix", "suffix"]);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
it("warns ONCE per boot for an unknown suffix", () => {
|
|
130
|
+
const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
131
|
+
compose().resolveBoot({ MCP_ACTIVE_MODULES: "alpha:typo" });
|
|
132
|
+
expect(warn).toHaveBeenCalledTimes(1);
|
|
133
|
+
expect(warn).toHaveBeenCalledWith(expect.stringContaining('[alpha] Unknown toolset "typo"'));
|
|
134
|
+
});
|
|
135
|
+
it("reports whether each effective toolset permits durable writes", () => {
|
|
136
|
+
const boot = compose().resolveBoot({ MCP_ACTIVE_MODULES: "alpha:operations,beta" });
|
|
137
|
+
expect(boot.toolsets).toEqual([
|
|
138
|
+
{ module: "alpha", toolset: "operations", source: "suffix", durableWrites: true },
|
|
139
|
+
{ module: "beta", toolset: "read-only", source: "default", durableWrites: false },
|
|
140
|
+
]);
|
|
141
|
+
});
|
|
142
|
+
it("leaves modules without toolsets unrestricted and toolset-free", () => {
|
|
143
|
+
const boot = compose([moduleOf("alpha", { toolsets: undefined })]).resolveBoot({});
|
|
144
|
+
expect(boot.toolsets).toEqual([{ module: "alpha", source: "none", durableWrites: true }]);
|
|
145
|
+
expect(boot.entries[0].config).not.toHaveProperty("toolset");
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
describe("logEffectiveToolsets", () => {
|
|
149
|
+
it("logs ONE info line naming each module's toolset and why", () => {
|
|
150
|
+
const info = vi.spyOn(console, "info").mockImplementation(() => { });
|
|
151
|
+
const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
152
|
+
const modules = [
|
|
153
|
+
moduleOf("alpha"),
|
|
154
|
+
moduleOf("beta"),
|
|
155
|
+
moduleOf("gamma", { toolsets: undefined }),
|
|
156
|
+
];
|
|
157
|
+
const composition = compose(modules);
|
|
158
|
+
const boot = composition.resolveBoot({ MCP_ACTIVE_MODULES: "alpha:admin,beta:typo,gamma" });
|
|
159
|
+
const line = composition.logEffectiveToolsets(boot);
|
|
160
|
+
expect(line).toBe("[test-root] Toolsets — alpha:admin (suffix), beta:read-only (fallback), gamma (no toolsets)");
|
|
161
|
+
expect(info).toHaveBeenCalledTimes(1);
|
|
162
|
+
expect(info).toHaveBeenCalledWith(line);
|
|
163
|
+
expect(warn).toHaveBeenCalledTimes(1); // the typo, nothing from the log itself
|
|
164
|
+
});
|
|
165
|
+
it("names the auth mode behind a default", () => {
|
|
166
|
+
vi.spyOn(console, "info").mockImplementation(() => { });
|
|
167
|
+
const composition = compose([moduleOf("alpha"), moduleOf("beta", { toolsets: undefined })]);
|
|
168
|
+
const env = { MCP_ACTIVE_MODULES: "alpha,beta" };
|
|
169
|
+
expect(composition.logEffectiveToolsets(composition.resolveBoot(env))).toBe("[test-root] Toolsets — alpha:read-only (default without OAuth), beta (no toolsets)");
|
|
170
|
+
expect(composition.logEffectiveToolsets(composition.resolveBoot(env, { authenticated: true }))).toBe("[test-root] Toolsets — alpha:operations (default with OAuth), beta (no toolsets)");
|
|
171
|
+
});
|
|
172
|
+
it("says so when no module is active", () => {
|
|
173
|
+
vi.spyOn(console, "info").mockImplementation(() => { });
|
|
174
|
+
vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
175
|
+
const composition = compose();
|
|
176
|
+
expect(composition.logEffectiveToolsets(composition.resolveBoot({ MCP_ACTIVE_MODULES: "nope" }))).toBe("[test-root] Toolsets — no active modules");
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
describe("instructions", () => {
|
|
180
|
+
const instructed = (name) => moduleOf(name, {
|
|
181
|
+
instructions: (config, { authenticated }) => `${name}: toolset ${String(config.toolset)}, url ${String(config.url)}, ` +
|
|
182
|
+
`${authenticated ? "signed in" : "anonymous"}`,
|
|
183
|
+
});
|
|
184
|
+
it("joins the ACTIVE modules' snippets in selection order, each from its own boot config", () => {
|
|
185
|
+
const composition = compose([instructed("alpha"), instructed("beta"), instructed("gamma")]);
|
|
186
|
+
const boot = composition.resolveBoot({ MCP_ACTIVE_MODULES: "beta:admin,alpha", ALPHA_URL: "http://a" }, { authenticated: true });
|
|
187
|
+
expect(composition.instructions(boot)).toBe("beta: toolset admin, url default, signed in\n\n" +
|
|
188
|
+
"alpha: toolset operations, url http://a, signed in");
|
|
189
|
+
});
|
|
190
|
+
it("skips modules without a snippet or with an empty one; none at all is undefined", () => {
|
|
191
|
+
const composition = compose([
|
|
192
|
+
instructed("alpha"),
|
|
193
|
+
moduleOf("beta"),
|
|
194
|
+
moduleOf("gamma", { instructions: () => " " }),
|
|
195
|
+
]);
|
|
196
|
+
expect(composition.instructions(composition.resolveBoot({}))).toBe("alpha: toolset read-only, url default, anonymous");
|
|
197
|
+
expect(composition.instructions(composition.resolveBoot({ MCP_ACTIVE_MODULES: "beta,gamma" }))).toBeUndefined();
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
describe("frameworkWritesAllowed", () => {
|
|
201
|
+
const boot = (authenticated, env) => compose([
|
|
202
|
+
moduleOf("alpha"),
|
|
203
|
+
moduleOf("beta"),
|
|
204
|
+
moduleOf("gamma", { toolsets: undefined }),
|
|
205
|
+
]).resolveBoot(env, { authenticated });
|
|
206
|
+
it("requires OAuth — without a caller identity framework records are ownerless", () => {
|
|
207
|
+
expect(frameworkWritesAllowed(boot(false, { MCP_ACTIVE_MODULES: "alpha:admin,beta:admin" }))).toBe(false);
|
|
208
|
+
});
|
|
209
|
+
it("allows them under OAuth when every module permits durable writes", () => {
|
|
210
|
+
expect(frameworkWritesAllowed(boot(true, {}))).toBe(true);
|
|
211
|
+
expect(frameworkWritesAllowed(boot(true, { MCP_ACTIVE_MODULES: "alpha:admin,gamma" }))).toBe(true);
|
|
212
|
+
});
|
|
213
|
+
it("refuses them when ANY module sits on its read-only floor — the most restrictive wins", () => {
|
|
214
|
+
expect(frameworkWritesAllowed(boot(true, { MCP_ACTIVE_MODULES: "alpha:admin,beta:read-only" }))).toBe(false);
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
describe("pluginsFor", () => {
|
|
218
|
+
it("instantiates each entry's plugin with the shared resources", () => {
|
|
219
|
+
const composition = compose();
|
|
220
|
+
const entries = composition.appEntries({ MCP_ACTIVE_MODULES: "beta" });
|
|
221
|
+
const plugins = composition.pluginsFor(entries, { tag: "shared-1" });
|
|
222
|
+
expect(plugins).toHaveLength(1);
|
|
223
|
+
expect(plugins[0]).toMatchObject({ shared: { tag: "shared-1" } });
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
describe("warnUnknownEnvVars", () => {
|
|
227
|
+
it("watches every prefix derived from known vars, not just a hardcoded family", () => {
|
|
228
|
+
const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
229
|
+
const unknown = compose().warnUnknownEnvVars({
|
|
230
|
+
ALPHA_URLX: "typo", // derived prefix ALPHA_
|
|
231
|
+
MCP_PROFILE_DIRX: "typo", // derived prefix MCP_
|
|
232
|
+
PATH: "/usr/bin", // unwatched prefix
|
|
233
|
+
BETA_URL: "http://ok", // known
|
|
234
|
+
});
|
|
235
|
+
expect(unknown.sort()).toEqual(["ALPHA_URLX", "MCP_PROFILE_DIRX"]);
|
|
236
|
+
expect(warn).toHaveBeenCalledTimes(2);
|
|
237
|
+
});
|
|
238
|
+
it("exempts foreign prefixes and honors the extra allowlist", () => {
|
|
239
|
+
expect(compose().warnUnknownEnvVars({ MCP_USE_ANONYMIZED_TELEMETRY: "false", MCP_SECRET: "x" }, [
|
|
240
|
+
"MCP_SECRET",
|
|
241
|
+
])).toEqual([]);
|
|
242
|
+
});
|
|
243
|
+
it("exempts `<KNOWN_VAR>_*` extensions (docker-secrets style), but not near-misses", () => {
|
|
244
|
+
const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
245
|
+
const unknown = compose().warnUnknownEnvVars({
|
|
246
|
+
BETA_URL_FILE: "/run/secrets/beta", // extends the known BETA_URL — another process's var
|
|
247
|
+
BETA_URLX: "typo", // near-miss, not an extension — still warns
|
|
248
|
+
});
|
|
249
|
+
expect(unknown).toEqual(["BETA_URLX"]);
|
|
250
|
+
expect(warn).toHaveBeenCalledTimes(1);
|
|
251
|
+
});
|
|
252
|
+
it("appends the optional hint to the warning", () => {
|
|
253
|
+
const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
254
|
+
composeModules({
|
|
255
|
+
label: "test-root",
|
|
256
|
+
modules: [moduleOf("alpha")],
|
|
257
|
+
envVarHint: "see docs/operations.md",
|
|
258
|
+
}).warnUnknownEnvVars({ ALPHA_TYPO: "x" });
|
|
259
|
+
expect(warn).toHaveBeenCalledWith(expect.stringContaining("(see docs/operations.md)"));
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
describe("emitBootWarnings", () => {
|
|
263
|
+
it("collects and logs hints from ACTIVE modules only", () => {
|
|
264
|
+
const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
265
|
+
const modules = [
|
|
266
|
+
moduleOf("alpha", { bootWarnings: () => ["alpha hint"] }),
|
|
267
|
+
moduleOf("beta", { bootWarnings: () => ["beta hint"] }),
|
|
268
|
+
];
|
|
269
|
+
const warnings = compose(modules).emitBootWarnings({ MCP_ACTIVE_MODULES: "beta" });
|
|
270
|
+
expect(warnings).toEqual(["beta hint"]);
|
|
271
|
+
expect(warn).toHaveBeenCalledWith("[test-root] beta hint");
|
|
272
|
+
expect(warn).not.toHaveBeenCalledWith(expect.stringContaining("alpha hint"));
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
//# sourceMappingURL=composition.test.js.map
|