@miragon/pulse-widget-shell 0.0.0-stage → 0.22.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 +164 -2
- 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 +45 -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 -3
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { resolveProfileKey } from "./profile.js";
|
|
2
|
+
/**
|
|
3
|
+
* The `profile.modules.<module>` slice contract, shared by every module so
|
|
4
|
+
* the subtle rules cannot drift: WHOSE record a save touches (the canonical
|
|
5
|
+
* keyless refusal), HOW a slice patch is saved (the patch alone, merged by
|
|
6
|
+
* the store over the RAW stored slice under its lock, so foreign and
|
|
7
|
+
* concurrently saved fields survive), and HOW a slice reads (fail-soft per
|
|
8
|
+
* FIELD, so one bad value cannot reset the rest).
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Fail-soft slice read: absent slices and garbage degrade to the schema's
|
|
12
|
+
* defaults — and degradation is per FIELD, not per slice: a single invalid
|
|
13
|
+
* value (say, one written by a newer build and then rolled back) drops to its
|
|
14
|
+
* own default while every other saved preference survives. Fields the schema
|
|
15
|
+
* doesn't know stay out of the VIEW but are preserved in storage: a save
|
|
16
|
+
* ({@link saveModuleSlice}) merges over the raw stored slice.
|
|
17
|
+
*
|
|
18
|
+
* Read-side only — save inputs keep validating loudly at the tool boundary;
|
|
19
|
+
* a write must never silently coerce.
|
|
20
|
+
*/
|
|
21
|
+
export function parseModuleSlice(schema, slice) {
|
|
22
|
+
const whole = schema.safeParse(slice ?? {});
|
|
23
|
+
if (whole.success)
|
|
24
|
+
return whole.data;
|
|
25
|
+
const raw = typeof slice === "object" && slice !== null ? slice : {};
|
|
26
|
+
const kept = {};
|
|
27
|
+
for (const [key, field] of Object.entries(schema.shape)) {
|
|
28
|
+
const value = raw[key];
|
|
29
|
+
if (value === undefined)
|
|
30
|
+
continue;
|
|
31
|
+
if (field.safeParse(value).success)
|
|
32
|
+
kept[key] = value;
|
|
33
|
+
}
|
|
34
|
+
const recovered = schema.safeParse(kept);
|
|
35
|
+
return recovered.success ? recovered.data : schema.parse({});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Resolve the profile key for a durable write, refusing without one. Settings
|
|
39
|
+
* are saved per signed-in user: a request without OAuth resolves no key (see
|
|
40
|
+
* `resolveProfileKey`) — writing anyway would silently share one record across
|
|
41
|
+
* unrelated callers, so every module's save tool throws this same,
|
|
42
|
+
* operator-actionable error instead.
|
|
43
|
+
*/
|
|
44
|
+
export function requireProfileKey(ctx) {
|
|
45
|
+
const key = resolveProfileKey(ctx);
|
|
46
|
+
if (!key) {
|
|
47
|
+
throw new Error("No caller identity to save the profile under — settings are saved per signed-in user, so the server needs MCP_OAUTH.");
|
|
48
|
+
}
|
|
49
|
+
return key;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Persist a partial update of `module`'s slice: hand the store the PATCH
|
|
53
|
+
* alone, never a slice pre-read outside the store's lock. Every
|
|
54
|
+
* `ProfileStore` merges a `modules.<module>` patch one level deep over the
|
|
55
|
+
* RAW stored slice INSIDE its per-key serialization (the postgres
|
|
56
|
+
* transaction lock, the filesystem store's per-key mutex, the in-memory
|
|
57
|
+
* store's synchronous merge), so a concurrent save of another field in the
|
|
58
|
+
* same slice (or of another module's slice) survives, fields a newer build
|
|
59
|
+
* wrote survive, and no defaults are materialized into storage. A field set
|
|
60
|
+
* to `undefined` in the patch CLEARS the stored value; an absent field keeps
|
|
61
|
+
* it.
|
|
62
|
+
*
|
|
63
|
+
* Returns the saved slice, raw (the caller parses it fail-soft for its
|
|
64
|
+
* report): read off the record `save` returns (every shipped store returns
|
|
65
|
+
* it), or read back when a custom port implementation returns nothing.
|
|
66
|
+
*/
|
|
67
|
+
export async function saveModuleSlice(store, key, module, patch, opts) {
|
|
68
|
+
const saved = await store.save(key, { modules: { [module]: patch } }, opts);
|
|
69
|
+
const record = isProfileSlice(saved) ? saved : await store.get(key);
|
|
70
|
+
return record?.modules?.[module];
|
|
71
|
+
}
|
|
72
|
+
const isProfileSlice = (value) => typeof value === "object" && value !== null && "modules" in value;
|
|
73
|
+
//# sourceMappingURL=profile-slice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-slice.js","sourceRoot":"","sources":["../src/profile-slice.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAGhD;;;;;;;GAOG;AAEH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAsB,EACtB,KAAc;IAEd,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;IAC3C,IAAI,KAAK,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC,IAAI,CAAA;IACpC,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAE,KAAiC,CAAC,CAAC,CAAC,EAAE,CAAA;IACjG,MAAM,IAAI,GAA4B,EAAE,CAAA;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;QACtB,IAAI,KAAK,KAAK,SAAS;YAAE,SAAQ;QACjC,IAAK,KAAmB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;IACtE,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IACxC,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;AAC9D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAa;IAC7C,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAA;IAClC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,sHAAsH,CACvH,CAAA;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAA8E,EAC9E,GAAW,EACX,MAAc,EACd,KAA8B,EAC9B,IAA0B;IAE1B,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,CAAA;IAC3E,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACnE,OAAO,MAAM,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,CAAA;AAClC,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,KAAc,EAAyB,EAAE,CAC/D,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-slice.test.d.ts","sourceRoot":"","sources":["../src/profile-slice.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { parseModuleSlice, requireProfileKey, saveModuleSlice } from "./profile-slice.js";
|
|
4
|
+
import { runWithMcpRequestInfo } from "./request-context.js";
|
|
5
|
+
describe("requireProfileKey", () => {
|
|
6
|
+
it("resolves the anonymous key for an explicitly declared local caller", () => {
|
|
7
|
+
expect(runWithMcpRequestInfo({ anonymousCaller: true }, () => requireProfileKey())).toBe("anonymous");
|
|
8
|
+
});
|
|
9
|
+
it("resolves the auth user id when the request carries one", () => {
|
|
10
|
+
expect(runWithMcpRequestInfo({ authUserId: "user-7" }, () => requireProfileKey())).toBe("user-7");
|
|
11
|
+
});
|
|
12
|
+
it("refuses an identity-less HTTP request with the operator-actionable error", () => {
|
|
13
|
+
expect(() => runWithMcpRequestInfo({}, () => requireProfileKey())).toThrow("No caller identity to save the profile under — settings are saved per signed-in user, so the server needs MCP_OAUTH.");
|
|
14
|
+
});
|
|
15
|
+
it("refuses without any request context (a missing middleware install) — never 'anonymous'", () => {
|
|
16
|
+
expect(() => requireProfileKey()).toThrow(/No caller identity/);
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
describe("saveModuleSlice", () => {
|
|
20
|
+
it("hands the store the patch alone and reports the slice off the saved record", async () => {
|
|
21
|
+
const save = vi.fn(() => Promise.resolve({ modules: { notes: { sortOrder: "desc", futureField: 42 } } }));
|
|
22
|
+
const get = vi.fn();
|
|
23
|
+
const slice = await saveModuleSlice({ get, save }, "k", "notes", { sortOrder: "desc" }, {
|
|
24
|
+
userId: "user-7",
|
|
25
|
+
});
|
|
26
|
+
expect(save).toHaveBeenCalledWith("k", { modules: { notes: { sortOrder: "desc" } } }, { userId: "user-7" });
|
|
27
|
+
// No pre-read: a slice read outside the store's lock would be stale.
|
|
28
|
+
expect(get).not.toHaveBeenCalled();
|
|
29
|
+
expect(slice).toEqual({ sortOrder: "desc", futureField: 42 });
|
|
30
|
+
});
|
|
31
|
+
it("reads the slice back when a custom store's save returns nothing", async () => {
|
|
32
|
+
const save = vi.fn(() => Promise.resolve(undefined));
|
|
33
|
+
const get = vi.fn(() => Promise.resolve({ modules: { notes: { sortOrder: "asc" } } }));
|
|
34
|
+
expect(await saveModuleSlice({ get, save }, "k", "notes", { sortOrder: "asc" })).toEqual({
|
|
35
|
+
sortOrder: "asc",
|
|
36
|
+
});
|
|
37
|
+
expect(get).toHaveBeenCalledWith("k");
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
describe("parseModuleSlice", () => {
|
|
41
|
+
const schema = z.object({
|
|
42
|
+
sortOrder: z.enum(["asc", "desc"]).default("asc"),
|
|
43
|
+
pageSize: z.number().int().min(1).optional(),
|
|
44
|
+
tags: z.array(z.string()).default([]),
|
|
45
|
+
});
|
|
46
|
+
it("parses a valid slice and applies defaults for absent fields", () => {
|
|
47
|
+
expect(parseModuleSlice(schema, { pageSize: 25 })).toEqual({
|
|
48
|
+
sortOrder: "asc",
|
|
49
|
+
pageSize: 25,
|
|
50
|
+
tags: [],
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
it("degrades absent and garbage slices to the full defaults", () => {
|
|
54
|
+
const defaults = { sortOrder: "asc", tags: [] };
|
|
55
|
+
expect(parseModuleSlice(schema, undefined)).toEqual(defaults);
|
|
56
|
+
expect(parseModuleSlice(schema, "garbage")).toEqual(defaults);
|
|
57
|
+
expect(parseModuleSlice(schema, 42)).toEqual(defaults);
|
|
58
|
+
});
|
|
59
|
+
it("recovers per FIELD: one invalid value keeps every other saved preference", () => {
|
|
60
|
+
// The failure mode this guards: a newer build writes a value this build's
|
|
61
|
+
// schema rejects; resetting the WHOLE slice would silently drop unrelated
|
|
62
|
+
// preferences (e.g. engine curation next to a bad preferredRole).
|
|
63
|
+
expect(parseModuleSlice(schema, { sortOrder: "newest-first", pageSize: 25, tags: ["a"] })).toEqual({ sortOrder: "asc", pageSize: 25, tags: ["a"] });
|
|
64
|
+
});
|
|
65
|
+
it("keeps unknown fields out of the view (the store's raw merge preserves them)", () => {
|
|
66
|
+
expect(parseModuleSlice(schema, { pageSize: 5, futureField: 42 })).toEqual({
|
|
67
|
+
sortOrder: "asc",
|
|
68
|
+
pageSize: 5,
|
|
69
|
+
tags: [],
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
//# sourceMappingURL=profile-slice.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-slice.test.js","sourceRoot":"","sources":["../src/profile-slice.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type ProfileStore } from "./profile-store.js";
|
|
2
|
+
/**
|
|
3
|
+
* The non-database profile store selection every composition root shares:
|
|
4
|
+
* filesystem-backed when `MCP_PROFILE_DIR` is set (survives restarts),
|
|
5
|
+
* in-memory otherwise. Roots with a database extend the precedence themselves
|
|
6
|
+
* (`DATABASE_URL` → `createPostgresProfileStore` beats this — see the stock
|
|
7
|
+
* app's `initRuntime`); the factories stay pure and injectable.
|
|
8
|
+
*/
|
|
9
|
+
export declare function profileStoreFromEnv(env?: NodeJS.ProcessEnv): ProfileStore;
|
|
10
|
+
/** Where a composition root keeps a store. */
|
|
11
|
+
export type PersistenceBackend = "postgres" | "filesystem" | "memory";
|
|
12
|
+
/** The backend each store selected at boot. */
|
|
13
|
+
export interface PersistenceSelection {
|
|
14
|
+
profiles: PersistenceBackend;
|
|
15
|
+
/** Omitted when the server registers no dashboard builder (`frameworkWritesAllowed`). */
|
|
16
|
+
dashboards?: PersistenceBackend;
|
|
17
|
+
}
|
|
18
|
+
/** The non-database selection {@link profileStoreFromEnv} and the dashboard knob make. */
|
|
19
|
+
export declare function persistenceFromEnv(env?: NodeJS.ProcessEnv): Required<PersistenceSelection>;
|
|
20
|
+
/**
|
|
21
|
+
* Announce the selected persistence on EVERY boot path — nobody should have
|
|
22
|
+
* to infer from silence that settings are volatile — and warn loudly when a
|
|
23
|
+
* production process (`NODE_ENV=production`, set by the Docker images) keeps a
|
|
24
|
+
* store in memory: every restart, redeploy or scale-to-zero stop then
|
|
25
|
+
* silently drops saved settings or dashboards. A warning, not a boot failure:
|
|
26
|
+
* failing would break every deployment that accepts volatile settings today.
|
|
27
|
+
* `remedy` names the knobs THIS composition root offers.
|
|
28
|
+
*/
|
|
29
|
+
export declare function announcePersistence(selection: PersistenceSelection, options?: {
|
|
30
|
+
env?: NodeJS.ProcessEnv;
|
|
31
|
+
label?: string;
|
|
32
|
+
remedy?: string;
|
|
33
|
+
}): void;
|
|
34
|
+
//# sourceMappingURL=profile-store-env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-store-env.d.ts","sourceRoot":"","sources":["../src/profile-store-env.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAA;AAE3B;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,YAAY,CAItF;AAED,8CAA8C;AAC9C,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,YAAY,GAAG,QAAQ,CAAA;AAErE,+CAA+C;AAC/C,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,yFAAyF;IACzF,UAAU,CAAC,EAAE,kBAAkB,CAAA;CAChC;AAED,0FAA0F;AAC1F,wBAAgB,kBAAkB,CAChC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,QAAQ,CAAC,oBAAoB,CAAC,CAKhC;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,oBAAoB,EAC/B,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GACzE,IAAI,CAiBN"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { createFileSystemProfileStore, createInMemoryProfileStore, } from "./profile-store.js";
|
|
2
|
+
/**
|
|
3
|
+
* The non-database profile store selection every composition root shares:
|
|
4
|
+
* filesystem-backed when `MCP_PROFILE_DIR` is set (survives restarts),
|
|
5
|
+
* in-memory otherwise. Roots with a database extend the precedence themselves
|
|
6
|
+
* (`DATABASE_URL` → `createPostgresProfileStore` beats this — see the stock
|
|
7
|
+
* app's `initRuntime`); the factories stay pure and injectable.
|
|
8
|
+
*/
|
|
9
|
+
export function profileStoreFromEnv(env = process.env) {
|
|
10
|
+
return env.MCP_PROFILE_DIR
|
|
11
|
+
? createFileSystemProfileStore({ dir: env.MCP_PROFILE_DIR })
|
|
12
|
+
: createInMemoryProfileStore();
|
|
13
|
+
}
|
|
14
|
+
/** The non-database selection {@link profileStoreFromEnv} and the dashboard knob make. */
|
|
15
|
+
export function persistenceFromEnv(env = process.env) {
|
|
16
|
+
return {
|
|
17
|
+
profiles: env.MCP_PROFILE_DIR ? "filesystem" : "memory",
|
|
18
|
+
dashboards: env.MCP_DASHBOARD_DIR ? "filesystem" : "memory",
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Announce the selected persistence on EVERY boot path — nobody should have
|
|
23
|
+
* to infer from silence that settings are volatile — and warn loudly when a
|
|
24
|
+
* production process (`NODE_ENV=production`, set by the Docker images) keeps a
|
|
25
|
+
* store in memory: every restart, redeploy or scale-to-zero stop then
|
|
26
|
+
* silently drops saved settings or dashboards. A warning, not a boot failure:
|
|
27
|
+
* failing would break every deployment that accepts volatile settings today.
|
|
28
|
+
* `remedy` names the knobs THIS composition root offers.
|
|
29
|
+
*/
|
|
30
|
+
export function announcePersistence(selection, options = {}) {
|
|
31
|
+
const { env = process.env, label = "persistence", remedy = "Set MCP_PROFILE_DIR / MCP_DASHBOARD_DIR to directories on a persistent volume.", } = options;
|
|
32
|
+
const dashboards = selection.dashboards ? `, dashboards=${selection.dashboards}` : "";
|
|
33
|
+
console.log(`[${label}] persistence: profiles=${selection.profiles}${dashboards}`);
|
|
34
|
+
if (env.NODE_ENV !== "production")
|
|
35
|
+
return;
|
|
36
|
+
const volatile = [
|
|
37
|
+
...(selection.profiles === "memory" ? ["user profiles"] : []),
|
|
38
|
+
...(selection.dashboards === "memory" ? ["saved dashboards"] : []),
|
|
39
|
+
];
|
|
40
|
+
if (volatile.length === 0)
|
|
41
|
+
return;
|
|
42
|
+
console.warn(`[${label}] WARNING: ${volatile.join(" and ")} are kept IN MEMORY in a production process — every restart, redeploy or scale-to-zero stop silently drops them. ${remedy}`);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=profile-store-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-store-env.js","sourceRoot":"","sources":["../src/profile-store-env.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,4BAA4B,EAC5B,0BAA0B,GAE3B,MAAM,oBAAoB,CAAA;AAE3B;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACtE,OAAO,GAAG,CAAC,eAAe;QACxB,CAAC,CAAC,4BAA4B,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,eAAe,EAAE,CAAC;QAC5D,CAAC,CAAC,0BAA0B,EAAE,CAAA;AAClC,CAAC;AAYD,0FAA0F;AAC1F,MAAM,UAAU,kBAAkB,CAChC,MAAyB,OAAO,CAAC,GAAG;IAEpC,OAAO;QACL,QAAQ,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ;QACvD,UAAU,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ;KAC5D,CAAA;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CACjC,SAA+B,EAC/B,UAAwE,EAAE;IAE1E,MAAM,EACJ,GAAG,GAAG,OAAO,CAAC,GAAG,EACjB,KAAK,GAAG,aAAa,EACrB,MAAM,GAAG,gFAAgF,GAC1F,GAAG,OAAO,CAAA;IACX,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,gBAAgB,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IACrF,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,2BAA2B,SAAS,CAAC,QAAQ,GAAG,UAAU,EAAE,CAAC,CAAA;IAClF,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY;QAAE,OAAM;IACzC,MAAM,QAAQ,GAAG;QACf,GAAG,CAAC,SAAS,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,SAAS,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACnE,CAAA;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IACjC,OAAO,CAAC,IAAI,CACV,IAAI,KAAK,cAAc,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,oHAAoH,MAAM,EAAE,CAC1K,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-store-env.test.d.ts","sourceRoot":"","sources":["../src/profile-store-env.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { mkdtemp } from "node:fs/promises";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { describe, expect, it, vi } from "vitest";
|
|
5
|
+
import { announcePersistence, persistenceFromEnv, profileStoreFromEnv, } from "./profile-store-env.js";
|
|
6
|
+
describe("persistenceFromEnv", () => {
|
|
7
|
+
it("reports the non-database selection per store", () => {
|
|
8
|
+
expect(persistenceFromEnv({})).toEqual({ profiles: "memory", dashboards: "memory" });
|
|
9
|
+
expect(persistenceFromEnv({ MCP_PROFILE_DIR: "/p", MCP_DASHBOARD_DIR: "/d" })).toEqual({
|
|
10
|
+
profiles: "filesystem",
|
|
11
|
+
dashboards: "filesystem",
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
describe("announcePersistence", () => {
|
|
16
|
+
const capture = () => ({
|
|
17
|
+
log: vi.spyOn(console, "log").mockImplementation(() => { }),
|
|
18
|
+
warn: vi.spyOn(console, "warn").mockImplementation(() => { }),
|
|
19
|
+
});
|
|
20
|
+
it("logs the selected backends on every path", () => {
|
|
21
|
+
const { log, warn } = capture();
|
|
22
|
+
announcePersistence({ profiles: "postgres", dashboards: "postgres" }, { env: { NODE_ENV: "production" }, label: "root" });
|
|
23
|
+
expect(log).toHaveBeenCalledWith("[root] persistence: profiles=postgres, dashboards=postgres");
|
|
24
|
+
expect(warn).not.toHaveBeenCalled();
|
|
25
|
+
vi.restoreAllMocks();
|
|
26
|
+
});
|
|
27
|
+
it("warns LOUDLY when a production process keeps a store in memory — naming each", () => {
|
|
28
|
+
const { warn } = capture();
|
|
29
|
+
announcePersistence({ profiles: "memory", dashboards: "memory" }, { env: { NODE_ENV: "production" }, label: "root", remedy: "Set DATABASE_URL." });
|
|
30
|
+
expect(warn).toHaveBeenCalledOnce();
|
|
31
|
+
expect(warn.mock.calls[0][0]).toBe("[root] WARNING: user profiles and saved dashboards are kept IN MEMORY in a production process — every restart, redeploy or scale-to-zero stop silently drops them. Set DATABASE_URL.");
|
|
32
|
+
announcePersistence({ profiles: "filesystem", dashboards: "memory" }, { env: { NODE_ENV: "production" } });
|
|
33
|
+
expect(warn.mock.calls[1][0]).toMatch(/^\[persistence\] WARNING: saved dashboards are kept/);
|
|
34
|
+
expect(warn.mock.calls[1][0]).toContain("MCP_PROFILE_DIR / MCP_DASHBOARD_DIR");
|
|
35
|
+
vi.restoreAllMocks();
|
|
36
|
+
});
|
|
37
|
+
it("leaves dashboards out entirely when the server keeps none", () => {
|
|
38
|
+
const { log, warn } = capture();
|
|
39
|
+
announcePersistence({ profiles: "memory" }, { env: { NODE_ENV: "production" } });
|
|
40
|
+
expect(log).toHaveBeenCalledWith("[persistence] persistence: profiles=memory");
|
|
41
|
+
expect(warn.mock.calls[0][0]).toMatch(/WARNING: user profiles are kept IN MEMORY/);
|
|
42
|
+
announcePersistence({ profiles: "filesystem" }, { env: { NODE_ENV: "production" } });
|
|
43
|
+
expect(warn).toHaveBeenCalledOnce();
|
|
44
|
+
vi.restoreAllMocks();
|
|
45
|
+
});
|
|
46
|
+
it("stays quiet outside production (dev, tests)", () => {
|
|
47
|
+
const { warn } = capture();
|
|
48
|
+
announcePersistence({ profiles: "memory", dashboards: "memory" }, { env: {} });
|
|
49
|
+
announcePersistence({ profiles: "memory", dashboards: "memory" }, { env: { NODE_ENV: "development" } });
|
|
50
|
+
expect(warn).not.toHaveBeenCalled();
|
|
51
|
+
vi.restoreAllMocks();
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
describe("profileStoreFromEnv", () => {
|
|
55
|
+
it("selects the filesystem store when MCP_PROFILE_DIR is set (records persist)", async () => {
|
|
56
|
+
const dir = await mkdtemp(path.join(tmpdir(), "profile-env-"));
|
|
57
|
+
const store = profileStoreFromEnv({ MCP_PROFILE_DIR: dir });
|
|
58
|
+
await store.save("user-1", { language: "de" });
|
|
59
|
+
// A SECOND store over the same dir sees the record — proof it hit disk.
|
|
60
|
+
expect((await profileStoreFromEnv({ MCP_PROFILE_DIR: dir }).get("user-1"))?.language).toBe("de");
|
|
61
|
+
});
|
|
62
|
+
it("falls back to the in-memory store without the env knob", async () => {
|
|
63
|
+
const store = profileStoreFromEnv({});
|
|
64
|
+
await store.save("user-1", { language: "de" });
|
|
65
|
+
// A second instance shares nothing — proof it stayed in-process.
|
|
66
|
+
expect(await profileStoreFromEnv({}).get("user-1")).toBeUndefined();
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
//# sourceMappingURL=profile-store-env.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-store-env.test.js","sourceRoot":"","sources":["../src/profile-store-env.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type postgres from "postgres";
|
|
2
|
+
import { type ProfileStore } from "./profile-store.js";
|
|
3
|
+
/**
|
|
4
|
+
* DDL owned by this store, executed by the composition root's migration runner
|
|
5
|
+
* (which tracks applied names in its `schema_migrations` table). The full
|
|
6
|
+
* profile record lives in one JSONB column — it is tiny (<1 KB) and its shape
|
|
7
|
+
* is governed by `profileRecordSchema`/`schemaVersion`, not by table columns.
|
|
8
|
+
* `user_id` mirrors the record's owner (the OAuth caller; NULL for the
|
|
9
|
+
* declared `anonymous` record).
|
|
10
|
+
*/
|
|
11
|
+
export declare const PROFILE_STORE_MIGRATIONS: ReadonlyArray<{
|
|
12
|
+
name: string;
|
|
13
|
+
statements: readonly string[];
|
|
14
|
+
}>;
|
|
15
|
+
/**
|
|
16
|
+
* Profiles stored one row per key in the `user_profiles` table. Selected when
|
|
17
|
+
* `DATABASE_URL` is set (see the composition root's persistence wiring); the
|
|
18
|
+
* caller owns the `sql` client's lifecycle, so this package carries no runtime
|
|
19
|
+
* dependency on the driver.
|
|
20
|
+
*
|
|
21
|
+
* Reads share the filesystem store's per-field fail-soft gate
|
|
22
|
+
* (`parseStoredProfile`): a value this build cannot validate degrades only its
|
|
23
|
+
* own field, and a newer build's row reads best-effort. Saves run the shared
|
|
24
|
+
* `mergeStoredProfile` over the RAW JSONB inside a per-key locked
|
|
25
|
+
* transaction, so concurrent partial updates of the same key serialize
|
|
26
|
+
* instead of losing fields, and nothing a newer replica wrote is dropped —
|
|
27
|
+
* safe for multiple server instances (and mixed versions) sharing one
|
|
28
|
+
* database.
|
|
29
|
+
*/
|
|
30
|
+
export declare function createPostgresProfileStore(options: {
|
|
31
|
+
sql: postgres.Sql;
|
|
32
|
+
}): ProfileStore;
|
|
33
|
+
//# sourceMappingURL=profile-store-postgres.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-store-postgres.d.ts","sourceRoot":"","sources":["../src/profile-store-postgres.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAA;AAEpC,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAE1E;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,EAAE,aAAa,CAAC;IACnD,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;CAC9B,CAYA,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE;IAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAA;CAAE,GAAG,YAAY,CAsDvF"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { parseStoredProfile } from "./profile-migrations.js";
|
|
2
|
+
import { mergeStoredProfile } from "./profile-store.js";
|
|
3
|
+
/**
|
|
4
|
+
* DDL owned by this store, executed by the composition root's migration runner
|
|
5
|
+
* (which tracks applied names in its `schema_migrations` table). The full
|
|
6
|
+
* profile record lives in one JSONB column — it is tiny (<1 KB) and its shape
|
|
7
|
+
* is governed by `profileRecordSchema`/`schemaVersion`, not by table columns.
|
|
8
|
+
* `user_id` mirrors the record's owner (the OAuth caller; NULL for the
|
|
9
|
+
* declared `anonymous` record).
|
|
10
|
+
*/
|
|
11
|
+
export const PROFILE_STORE_MIGRATIONS = [
|
|
12
|
+
{
|
|
13
|
+
name: "001_user_profiles",
|
|
14
|
+
statements: [
|
|
15
|
+
`CREATE TABLE IF NOT EXISTS user_profiles (
|
|
16
|
+
key TEXT PRIMARY KEY,
|
|
17
|
+
user_id TEXT,
|
|
18
|
+
profile JSONB NOT NULL,
|
|
19
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
20
|
+
)`,
|
|
21
|
+
],
|
|
22
|
+
},
|
|
23
|
+
];
|
|
24
|
+
/**
|
|
25
|
+
* Profiles stored one row per key in the `user_profiles` table. Selected when
|
|
26
|
+
* `DATABASE_URL` is set (see the composition root's persistence wiring); the
|
|
27
|
+
* caller owns the `sql` client's lifecycle, so this package carries no runtime
|
|
28
|
+
* dependency on the driver.
|
|
29
|
+
*
|
|
30
|
+
* Reads share the filesystem store's per-field fail-soft gate
|
|
31
|
+
* (`parseStoredProfile`): a value this build cannot validate degrades only its
|
|
32
|
+
* own field, and a newer build's row reads best-effort. Saves run the shared
|
|
33
|
+
* `mergeStoredProfile` over the RAW JSONB inside a per-key locked
|
|
34
|
+
* transaction, so concurrent partial updates of the same key serialize
|
|
35
|
+
* instead of losing fields, and nothing a newer replica wrote is dropped —
|
|
36
|
+
* safe for multiple server instances (and mixed versions) sharing one
|
|
37
|
+
* database.
|
|
38
|
+
*/
|
|
39
|
+
export function createPostgresProfileStore(options) {
|
|
40
|
+
const { sql } = options;
|
|
41
|
+
return {
|
|
42
|
+
async get(key) {
|
|
43
|
+
const rows = await sql `
|
|
44
|
+
SELECT profile FROM user_profiles WHERE key = ${key}
|
|
45
|
+
`;
|
|
46
|
+
return parseStoredProfile(rows[0]?.profile, key);
|
|
47
|
+
},
|
|
48
|
+
async save(key, input, opts) {
|
|
49
|
+
return await sql.begin(async (tx) => {
|
|
50
|
+
// Advisory lock, not just SELECT…FOR UPDATE: a row that doesn't exist
|
|
51
|
+
// yet cannot be row-locked, so two concurrent FIRST saves of the same
|
|
52
|
+
// key would otherwise both merge over defaults and the second upsert
|
|
53
|
+
// would silently drop the first one's fields. The per-key transaction
|
|
54
|
+
// lock serializes creates and updates alike (same primitive as the
|
|
55
|
+
// app's migration runner).
|
|
56
|
+
await tx `SELECT pg_advisory_xact_lock(hashtextextended('user_profiles:' || ${key}, 0))`;
|
|
57
|
+
const rows = await tx `
|
|
58
|
+
SELECT profile FROM user_profiles WHERE key = ${key} FOR UPDATE
|
|
59
|
+
`;
|
|
60
|
+
const { document, record } = mergeStoredProfile(key, rows[0]?.profile, input, new Date().toISOString(), opts);
|
|
61
|
+
// sql.json, not JSON.stringify: postgres.js serializes parameters by
|
|
62
|
+
// the server-described type, and the jsonb serializer stringifies
|
|
63
|
+
// itself — a pre-stringified value gets double-encoded into a jsonb
|
|
64
|
+
// string scalar.
|
|
65
|
+
await tx `
|
|
66
|
+
INSERT INTO user_profiles (key, user_id, profile, updated_at)
|
|
67
|
+
VALUES (
|
|
68
|
+
${key},
|
|
69
|
+
${record.userId ?? null},
|
|
70
|
+
${tx.json(document)},
|
|
71
|
+
${record.updatedAt}
|
|
72
|
+
)
|
|
73
|
+
ON CONFLICT (key) DO UPDATE SET
|
|
74
|
+
user_id = EXCLUDED.user_id,
|
|
75
|
+
profile = EXCLUDED.profile,
|
|
76
|
+
updated_at = EXCLUDED.updated_at
|
|
77
|
+
`;
|
|
78
|
+
return record;
|
|
79
|
+
});
|
|
80
|
+
},
|
|
81
|
+
async delete(key) {
|
|
82
|
+
const result = await sql `DELETE FROM user_profiles WHERE key = ${key}`;
|
|
83
|
+
return result.count > 0;
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=profile-store-postgres.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-store-postgres.js","sourceRoot":"","sources":["../src/profile-store-postgres.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,kBAAkB,EAAqB,MAAM,oBAAoB,CAAA;AAE1E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAGhC;IACH;QACE,IAAI,EAAE,mBAAmB;QACzB,UAAU,EAAE;YACV;;;;;QAKE;SACH;KACF;CACF,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,0BAA0B,CAAC,OAA8B;IACvE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAA;IAEvB,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,GAAG;YACX,MAAM,IAAI,GAAG,MAAM,GAAG,CAAwB;wDACI,GAAG;OACpD,CAAA;YACD,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,CAAA;QAClD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI;YACzB,OAAO,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;gBAClC,sEAAsE;gBACtE,sEAAsE;gBACtE,qEAAqE;gBACrE,sEAAsE;gBACtE,mEAAmE;gBACnE,2BAA2B;gBAC3B,MAAM,EAAE,CAAA,qEAAqE,GAAG,OAAO,CAAA;gBACvF,MAAM,IAAI,GAAG,MAAM,EAAE,CAAwB;0DACK,GAAG;SACpD,CAAA;gBACD,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,kBAAkB,CAC7C,GAAG,EACH,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAChB,KAAK,EACL,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EACxB,IAAI,CACL,CAAA;gBACD,qEAAqE;gBACrE,kEAAkE;gBAClE,oEAAoE;gBACpE,iBAAiB;gBACjB,MAAM,EAAE,CAAA;;;cAGF,GAAG;cACH,MAAM,CAAC,MAAM,IAAI,IAAI;cACrB,EAAE,CAAC,IAAI,CAAC,QAA8B,CAAC;cACvC,MAAM,CAAC,SAAS;;;;;;SAMrB,CAAA;gBACD,OAAO,MAAM,CAAA;YACf,CAAC,CAAC,CAAA;QACJ,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,GAAG;YACd,MAAM,MAAM,GAAG,MAAM,GAAG,CAAA,yCAAyC,GAAG,EAAE,CAAA;YACtE,OAAO,MAAM,CAAC,KAAK,GAAG,CAAC,CAAA;QACzB,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-store-raw.test.d.ts","sourceRoot":"","sources":["../src/profile-store-raw.test.ts"],"names":[],"mappings":""}
|