@dxos/app-framework 0.8.4-main.f9ba587 → 0.8.4-main.fcc0d83b33
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/.storybook/main.mts +9 -0
- package/.storybook/preview.mts +8 -0
- package/dist/lib/browser/capability-FU2RXY4V.mjs +38 -0
- package/dist/lib/browser/capability-FU2RXY4V.mjs.map +7 -0
- package/dist/lib/browser/capability-UZNIX34E.mjs +35 -0
- package/dist/lib/browser/capability-UZNIX34E.mjs.map +7 -0
- package/dist/lib/browser/chunk-2F5RSEOR.mjs +80 -0
- package/dist/lib/browser/chunk-2F5RSEOR.mjs.map +7 -0
- package/dist/lib/browser/chunk-2FUSTGNO.mjs +828 -0
- package/dist/lib/browser/chunk-2FUSTGNO.mjs.map +7 -0
- package/dist/lib/browser/chunk-45CHLTBV.mjs +34 -0
- package/dist/lib/browser/chunk-45CHLTBV.mjs.map +7 -0
- package/dist/lib/browser/chunk-5GNRIKCE.mjs +42 -0
- package/dist/lib/browser/chunk-5GNRIKCE.mjs.map +7 -0
- package/dist/lib/browser/chunk-66IXTIVK.mjs +48 -0
- package/dist/lib/browser/chunk-66IXTIVK.mjs.map +7 -0
- package/dist/lib/browser/chunk-ASHDB736.mjs +584 -0
- package/dist/lib/browser/chunk-ASHDB736.mjs.map +7 -0
- package/dist/lib/browser/chunk-EV4VOV4X.mjs +142 -0
- package/dist/lib/browser/chunk-EV4VOV4X.mjs.map +7 -0
- package/dist/lib/browser/chunk-FJ4765WW.mjs +8 -0
- package/dist/lib/browser/chunk-FJ4765WW.mjs.map +7 -0
- package/dist/lib/browser/chunk-G7SDBRKH.mjs +1 -0
- package/dist/lib/browser/chunk-GUJTQEK7.mjs +140 -0
- package/dist/lib/browser/chunk-GUJTQEK7.mjs.map +7 -0
- package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/browser/chunk-TZGMTFCT.mjs +79 -0
- package/dist/lib/browser/chunk-TZGMTFCT.mjs.map +7 -0
- package/dist/lib/browser/chunk-UNGY3SDY.mjs +354 -0
- package/dist/lib/browser/chunk-UNGY3SDY.mjs.map +7 -0
- package/dist/lib/browser/chunk-WSKPCXZC.mjs +467 -0
- package/dist/lib/browser/chunk-WSKPCXZC.mjs.map +7 -0
- package/dist/lib/browser/cli/index.mjs +74 -0
- package/dist/lib/browser/cli/index.mjs.map +7 -0
- package/dist/lib/browser/common/activation-events.mjs +24 -0
- package/dist/lib/browser/common/capabilities.mjs +46 -0
- package/dist/lib/browser/core/activation-event.mjs +20 -0
- package/dist/lib/browser/core/activation-event.mjs.map +7 -0
- package/dist/lib/browser/core/capability.mjs +30 -0
- package/dist/lib/browser/core/capability.mjs.map +7 -0
- package/dist/lib/browser/core/plugin-manager.mjs +15 -0
- package/dist/lib/browser/core/plugin-manager.mjs.map +7 -0
- package/dist/lib/browser/core/plugin.mjs +29 -0
- package/dist/lib/browser/core/plugin.mjs.map +7 -0
- package/dist/lib/browser/core/url-loader.mjs +20 -0
- package/dist/lib/browser/core/url-loader.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +95 -156
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/invoker-capability-GQJP42KT.mjs +43 -0
- package/dist/lib/browser/invoker-capability-GQJP42KT.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +232 -51
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/browser/testing/react.mjs +78 -0
- package/dist/lib/browser/testing/react.mjs.map +7 -0
- package/dist/lib/browser/ui/index.mjs +48 -0
- package/dist/lib/browser/ui/index.mjs.map +7 -0
- package/dist/lib/node-esm/capability-4URDTXWH.mjs +36 -0
- package/dist/lib/node-esm/capability-4URDTXWH.mjs.map +7 -0
- package/dist/lib/node-esm/capability-HLUG6SDI.mjs +39 -0
- package/dist/lib/node-esm/capability-HLUG6SDI.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-37Z53PXZ.mjs +10 -0
- package/dist/lib/node-esm/chunk-37Z53PXZ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-6XW6LET6.mjs +35 -0
- package/dist/lib/node-esm/chunk-6XW6LET6.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-ATESWMED.mjs +585 -0
- package/dist/lib/node-esm/chunk-ATESWMED.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-FZLRFRYV.mjs +81 -0
- package/dist/lib/node-esm/chunk-FZLRFRYV.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-GLBO7FJP.mjs +141 -0
- package/dist/lib/node-esm/chunk-GLBO7FJP.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-IEAO4CAC.mjs +829 -0
- package/dist/lib/node-esm/chunk-IEAO4CAC.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-KLDFWTG3.mjs +355 -0
- package/dist/lib/node-esm/chunk-KLDFWTG3.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-MEX6YYWJ.mjs +43 -0
- package/dist/lib/node-esm/chunk-MEX6YYWJ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-OZ7DZA5Z.mjs +2 -0
- package/dist/lib/node-esm/chunk-OZ7DZA5Z.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-TC5FX6VR.mjs +80 -0
- package/dist/lib/node-esm/chunk-TC5FX6VR.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-X7AFIYKJ.mjs +143 -0
- package/dist/lib/node-esm/chunk-X7AFIYKJ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-XOCUANHO.mjs +49 -0
- package/dist/lib/node-esm/chunk-XOCUANHO.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-Y7QUMO53.mjs +468 -0
- package/dist/lib/node-esm/chunk-Y7QUMO53.mjs.map +7 -0
- package/dist/lib/node-esm/cli/index.mjs +75 -0
- package/dist/lib/node-esm/cli/index.mjs.map +7 -0
- package/dist/lib/node-esm/common/activation-events.mjs +25 -0
- package/dist/lib/node-esm/common/activation-events.mjs.map +7 -0
- package/dist/lib/node-esm/common/capabilities.mjs +47 -0
- package/dist/lib/node-esm/common/capabilities.mjs.map +7 -0
- package/dist/lib/node-esm/core/activation-event.mjs +21 -0
- package/dist/lib/node-esm/core/activation-event.mjs.map +7 -0
- package/dist/lib/node-esm/core/capability.mjs +31 -0
- package/dist/lib/node-esm/core/capability.mjs.map +7 -0
- package/dist/lib/node-esm/core/plugin-manager.mjs +16 -0
- package/dist/lib/node-esm/core/plugin-manager.mjs.map +7 -0
- package/dist/lib/node-esm/core/plugin.mjs +30 -0
- package/dist/lib/node-esm/core/plugin.mjs.map +7 -0
- package/dist/lib/node-esm/core/url-loader.mjs +21 -0
- package/dist/lib/node-esm/core/url-loader.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +95 -156
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/invoker-capability-O4OTEP24.mjs +44 -0
- package/dist/lib/node-esm/invoker-capability-O4OTEP24.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +232 -51
- package/dist/lib/node-esm/testing/index.mjs.map +4 -4
- package/dist/lib/node-esm/testing/react.mjs +79 -0
- package/dist/lib/node-esm/testing/react.mjs.map +7 -0
- package/dist/lib/node-esm/ui/index.mjs +49 -0
- package/dist/lib/node-esm/ui/index.mjs.map +7 -0
- package/dist/plugin/node-esm/index.mjs +819 -0
- package/dist/plugin/node-esm/index.mjs.map +7 -0
- package/dist/plugin/node-esm/meta.json +1 -0
- package/dist/types/src/cli/cli.d.ts +39 -0
- package/dist/types/src/cli/cli.d.ts.map +1 -0
- package/dist/types/src/cli/index.d.ts +2 -0
- package/dist/types/src/cli/index.d.ts.map +1 -0
- package/dist/types/src/common/activation-events.d.ts +27 -0
- package/dist/types/src/common/activation-events.d.ts.map +1 -0
- package/dist/types/src/common/capabilities.d.ts +109 -121
- package/dist/types/src/common/capabilities.d.ts.map +1 -1
- package/dist/types/src/common/index.d.ts +4 -8
- package/dist/types/src/common/index.d.ts.map +1 -1
- package/dist/types/src/common/operations.d.ts +19 -0
- package/dist/types/src/common/operations.d.ts.map +1 -0
- package/dist/types/src/common/translations.d.ts +8 -8
- package/dist/types/src/common/translations.d.ts.map +1 -1
- package/dist/types/src/context.d.ts +5 -0
- package/dist/types/src/context.d.ts.map +1 -0
- package/dist/types/src/core/{events.d.ts → activation-event.d.ts} +11 -11
- package/dist/types/src/core/activation-event.d.ts.map +1 -0
- package/dist/types/src/core/capability-manager.d.ts +48 -0
- package/dist/types/src/core/capability-manager.d.ts.map +1 -0
- package/dist/types/src/core/capability-manager.test.d.ts +2 -0
- package/dist/types/src/core/capability-manager.test.d.ts.map +1 -0
- package/dist/types/src/core/capability.d.ts +156 -0
- package/dist/types/src/core/capability.d.ts.map +1 -0
- package/dist/types/src/core/index.d.ts +8 -4
- package/dist/types/src/core/index.d.ts.map +1 -1
- package/dist/types/src/core/plugin-asset-cache.d.ts +71 -0
- package/dist/types/src/core/plugin-asset-cache.d.ts.map +1 -0
- package/dist/types/src/core/plugin-manager.d.ts +84 -0
- package/dist/types/src/core/plugin-manager.d.ts.map +1 -0
- package/dist/types/src/core/plugin-manager.test.d.ts +2 -0
- package/dist/types/src/core/plugin-manager.test.d.ts.map +1 -0
- package/dist/types/src/core/plugin-manifest.d.ts +76 -0
- package/dist/types/src/core/plugin-manifest.d.ts.map +1 -0
- package/dist/types/src/core/plugin-manifest.test.d.ts +2 -0
- package/dist/types/src/core/plugin-manifest.test.d.ts.map +1 -0
- package/dist/types/src/core/plugin.d.ts +128 -37
- package/dist/types/src/core/plugin.d.ts.map +1 -1
- package/dist/types/src/core/url-loader.d.ts +101 -0
- package/dist/types/src/core/url-loader.d.ts.map +1 -0
- package/dist/types/src/core/url-loader.test.d.ts +2 -0
- package/dist/types/src/core/url-loader.test.d.ts.map +1 -0
- package/dist/types/src/helpers.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +3 -4
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/plugin-operation/OperationPlugin.d.ts +3 -0
- package/dist/types/src/plugin-operation/OperationPlugin.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/capability.d.ts +7 -0
- package/dist/types/src/plugin-operation/history/capability.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/errors.d.ts +32 -0
- package/dist/types/src/plugin-operation/history/errors.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/history-tracker.d.ts +18 -0
- package/dist/types/src/plugin-operation/history/history-tracker.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts +2 -0
- package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/index.d.ts +6 -0
- package/dist/types/src/plugin-operation/history/index.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/types.d.ts +13 -0
- package/dist/types/src/plugin-operation/history/types.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/undo-mapping.d.ts +101 -0
- package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/undo-registry.d.ts +23 -0
- package/dist/types/src/plugin-operation/history/undo-registry.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts +2 -0
- package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/index.d.ts +3 -0
- package/dist/types/src/plugin-operation/index.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/invoker-capability.d.ts +6 -0
- package/dist/types/src/plugin-operation/invoker-capability.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/meta.d.ts +3 -0
- package/dist/types/src/plugin-operation/meta.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/testing.d.ts +58 -0
- package/dist/types/src/plugin-operation/testing.d.ts.map +1 -0
- package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts +3 -0
- package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts.map +1 -0
- package/dist/types/src/plugin-runtime/capability.d.ts +6 -0
- package/dist/types/src/plugin-runtime/capability.d.ts.map +1 -0
- package/dist/types/src/plugin-runtime/index.d.ts +2 -0
- package/dist/types/src/plugin-runtime/index.d.ts.map +1 -0
- package/dist/types/src/plugin-runtime/meta.d.ts +3 -0
- package/dist/types/src/plugin-runtime/meta.d.ts.map +1 -0
- package/dist/types/src/testing/harness.d.ts +67 -0
- package/dist/types/src/testing/harness.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +2 -0
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/testing/react.d.ts +27 -0
- package/dist/types/src/testing/react.d.ts.map +1 -0
- package/dist/types/src/testing/react.test.d.ts +2 -0
- package/dist/types/src/testing/react.test.d.ts.map +1 -0
- package/dist/types/src/testing/service.d.ts +8 -0
- package/dist/types/src/testing/service.d.ts.map +1 -0
- package/dist/types/src/testing/withPluginManager.d.ts +11 -10
- package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
- package/dist/types/src/testing/withPluginManager.stories.d.ts +9 -3
- package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
- package/dist/types/src/ui/components/App/App.d.ts +9 -0
- package/dist/types/src/ui/components/App/App.d.ts.map +1 -0
- package/dist/types/src/ui/components/App/App.stories.d.ts +19 -0
- package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -0
- package/dist/types/src/ui/components/App/index.d.ts +2 -0
- package/dist/types/src/ui/components/App/index.d.ts.map +1 -0
- package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts +64 -0
- package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts.map +1 -0
- package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts +19 -0
- package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts.map +1 -0
- package/dist/types/src/ui/components/Placeholder/index.d.ts +2 -0
- package/dist/types/src/ui/components/Placeholder/index.d.ts.map +1 -0
- package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts +13 -0
- package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -0
- package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts +10 -0
- package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts.map +1 -0
- package/dist/types/src/ui/components/PluginManager/index.d.ts +2 -0
- package/dist/types/src/ui/components/PluginManager/index.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +24 -0
- package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts +14 -0
- package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts +11 -0
- package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts +48 -0
- package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/context.d.ts +5 -0
- package/dist/types/src/ui/components/Surface/context.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/index.d.ts +36 -0
- package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/types.d.ts +197 -0
- package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/types.test.d.ts +2 -0
- package/dist/types/src/ui/components/Surface/types.test.d.ts.map +1 -0
- package/dist/types/src/ui/components/index.d.ts +5 -0
- package/dist/types/src/ui/components/index.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/index.d.ts +6 -0
- package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useApp.d.ts +88 -0
- package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useApp.test.d.ts +2 -0
- package/dist/types/src/ui/hooks/useApp.test.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useCapabilities.d.ts +31 -0
- package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useLoading.d.ts +18 -0
- package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useSettingsState.d.ts +10 -0
- package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useSurface.d.ts +3 -0
- package/dist/types/src/ui/hooks/useSurface.d.ts.map +1 -0
- package/dist/types/src/ui/index.d.ts +3 -0
- package/dist/types/src/ui/index.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts +34 -0
- package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/boot-loader/index.d.ts +52 -0
- package/dist/types/src/vite-plugin/boot-loader/index.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/composer/index.d.ts +34 -0
- package/dist/types/src/vite-plugin/composer/index.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/import-map/index.d.ts +16 -0
- package/dist/types/src/vite-plugin/import-map/index.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/index.d.ts +5 -0
- package/dist/types/src/vite-plugin/index.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/manifest.d.ts +37 -0
- package/dist/types/src/vite-plugin/manifest.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/manifest.test.d.ts +2 -0
- package/dist/types/src/vite-plugin/manifest.test.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/packages.d.ts +13 -0
- package/dist/types/src/vite-plugin/packages.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/moon.yml +26 -3
- package/package.json +113 -52
- package/src/cli/cli.ts +107 -0
- package/src/{playground/layout → cli}/index.ts +1 -1
- package/src/common/activation-events.ts +44 -0
- package/src/common/capabilities.ts +168 -109
- package/src/common/index.ts +4 -8
- package/src/common/operations.ts +35 -0
- package/src/common/translations.ts +18 -10
- package/src/context.ts +9 -0
- package/src/core/{events.ts → activation-event.ts} +10 -7
- package/src/core/capability-manager.test.ts +151 -0
- package/src/core/capability-manager.ts +192 -0
- package/src/core/capability.ts +247 -0
- package/src/core/index.ts +8 -4
- package/src/core/plugin-asset-cache.ts +60 -0
- package/src/core/plugin-manager.test.ts +1142 -0
- package/src/core/plugin-manager.ts +932 -0
- package/src/core/plugin-manifest.test.ts +48 -0
- package/src/core/plugin-manifest.ts +102 -0
- package/src/core/plugin.ts +266 -43
- package/src/core/url-loader.test.ts +178 -0
- package/src/core/url-loader.ts +308 -0
- package/src/helpers.test.ts +1 -1
- package/src/index.ts +3 -4
- package/src/plugin-operation/OperationPlugin.ts +24 -0
- package/src/plugin-operation/history/capability.ts +36 -0
- package/src/plugin-operation/history/errors.ts +7 -0
- package/src/plugin-operation/history/history-tracker.test.ts +373 -0
- package/src/plugin-operation/history/history-tracker.ts +128 -0
- package/src/plugin-operation/history/index.ts +9 -0
- package/src/plugin-operation/history/types.ts +17 -0
- package/src/plugin-operation/history/undo-mapping.ts +135 -0
- package/src/plugin-operation/history/undo-registry.test.ts +72 -0
- package/src/plugin-operation/history/undo-registry.ts +54 -0
- package/src/plugin-operation/index.ts +6 -0
- package/src/plugin-operation/invoker-capability.ts +54 -0
- package/src/plugin-operation/meta.ts +11 -0
- package/src/plugin-operation/testing.ts +154 -0
- package/src/plugin-runtime/RuntimePlugin.ts +19 -0
- package/src/plugin-runtime/capability.ts +53 -0
- package/src/plugin-runtime/index.ts +5 -0
- package/src/plugin-runtime/meta.ts +11 -0
- package/src/testing/harness.ts +229 -0
- package/src/testing/index.ts +2 -0
- package/src/testing/react.test.tsx +48 -0
- package/src/testing/react.tsx +113 -0
- package/src/testing/service.ts +52 -0
- package/src/testing/withPluginManager.stories.tsx +15 -12
- package/src/testing/withPluginManager.tsx +78 -54
- package/src/ui/components/App/App.stories.tsx +92 -0
- package/src/ui/components/App/App.tsx +81 -0
- package/src/{playground/logger → ui/components/App}/index.ts +1 -1
- package/src/ui/components/Placeholder/Placeholder.stories.tsx +77 -0
- package/src/ui/components/Placeholder/Placeholder.tsx +155 -0
- package/src/{playground/debug → ui/components/Placeholder}/index.ts +1 -1
- package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +185 -0
- package/src/{react → ui/components/PluginManager}/PluginManagerProvider.ts +3 -3
- package/src/ui/components/PluginManager/index.ts +5 -0
- package/src/ui/components/Surface/SurfaceComponent.stories.tsx +144 -0
- package/src/ui/components/Surface/SurfaceComponent.tsx +303 -0
- package/src/ui/components/Surface/SurfaceInfo.tsx +107 -0
- package/src/ui/components/Surface/SurfaceProfilerContext.tsx +207 -0
- package/src/ui/components/Surface/context.ts +12 -0
- package/src/ui/components/Surface/index.ts +54 -0
- package/src/ui/components/Surface/types.test.ts +126 -0
- package/src/ui/components/Surface/types.ts +269 -0
- package/src/ui/components/index.ts +8 -0
- package/src/ui/hooks/index.ts +9 -0
- package/src/ui/hooks/useApp.test.tsx +159 -0
- package/src/ui/hooks/useApp.tsx +413 -0
- package/src/ui/hooks/useCapabilities.ts +67 -0
- package/src/ui/hooks/useLoading.tsx +76 -0
- package/src/ui/hooks/useSettingsState.ts +26 -0
- package/src/ui/hooks/useSurface.ts +13 -0
- package/src/ui/index.ts +6 -0
- package/src/vite-plugin/boot-loader/BootLoader.stories.tsx +263 -0
- package/src/vite-plugin/boot-loader/boot-loader.css +294 -0
- package/src/vite-plugin/boot-loader/boot-loader.js +274 -0
- package/src/vite-plugin/boot-loader/index.ts +112 -0
- package/src/vite-plugin/composer/index.ts +277 -0
- package/src/vite-plugin/import-map/index.ts +499 -0
- package/src/vite-plugin/index.ts +10 -0
- package/src/vite-plugin/manifest.test.ts +24 -0
- package/src/vite-plugin/manifest.ts +50 -0
- package/src/vite-plugin/packages.ts +188 -0
- package/tsconfig.json +18 -22
- package/tsconfig.node.json +2 -4
- package/typedoc.json +2 -4
- package/vitest.config.ts +8 -6
- package/.eslintrc.cjs +0 -9
- package/.swc/plugins/v7_linux_x86_64_13.0.0/f45bdff002284d9e8f9ef3f0be909de12da36c049cbcf261ac78fc00abb09a2d +0 -0
- package/.swc/plugins/v7_linux_x86_64_13.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429 +0 -0
- package/dist/lib/browser/app-graph-builder-BGGXLD6T.mjs +0 -137
- package/dist/lib/browser/app-graph-builder-BGGXLD6T.mjs.map +0 -7
- package/dist/lib/browser/chunk-2636QSIK.mjs +0 -1518
- package/dist/lib/browser/chunk-2636QSIK.mjs.map +0 -7
- package/dist/lib/browser/chunk-DHZB7HG7.mjs +0 -413
- package/dist/lib/browser/chunk-DHZB7HG7.mjs.map +0 -7
- package/dist/lib/browser/chunk-ORWHM7CO.mjs +0 -32
- package/dist/lib/browser/chunk-ORWHM7CO.mjs.map +0 -7
- package/dist/lib/browser/intent-dispatcher-TWKB22NI.mjs +0 -11
- package/dist/lib/browser/intent-resolver-O67UANYP.mjs +0 -39
- package/dist/lib/browser/intent-resolver-O67UANYP.mjs.map +0 -7
- package/dist/lib/browser/store-LFKDWHUQ.mjs +0 -30
- package/dist/lib/browser/store-LFKDWHUQ.mjs.map +0 -7
- package/dist/lib/browser/worker.mjs +0 -79
- package/dist/lib/node-esm/app-graph-builder-QHIJUYYW.mjs +0 -138
- package/dist/lib/node-esm/app-graph-builder-QHIJUYYW.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-NJAFK626.mjs +0 -414
- package/dist/lib/node-esm/chunk-NJAFK626.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-UMZQERLE.mjs +0 -34
- package/dist/lib/node-esm/chunk-UMZQERLE.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-VSKRV3NW.mjs +0 -1520
- package/dist/lib/node-esm/chunk-VSKRV3NW.mjs.map +0 -7
- package/dist/lib/node-esm/intent-dispatcher-5PRM3KGH.mjs +0 -12
- package/dist/lib/node-esm/intent-resolver-K3D4BXQQ.mjs +0 -40
- package/dist/lib/node-esm/intent-resolver-K3D4BXQQ.mjs.map +0 -7
- package/dist/lib/node-esm/store-53XDUBMD.mjs +0 -31
- package/dist/lib/node-esm/store-53XDUBMD.mjs.map +0 -7
- package/dist/lib/node-esm/worker.mjs +0 -80
- package/dist/types/src/App.d.ts +0 -43
- package/dist/types/src/App.d.ts.map +0 -1
- package/dist/types/src/common/collaboration.d.ts +0 -19
- package/dist/types/src/common/collaboration.d.ts.map +0 -1
- package/dist/types/src/common/events.d.ts +0 -52
- package/dist/types/src/common/events.d.ts.map +0 -1
- package/dist/types/src/common/file.d.ts +0 -14
- package/dist/types/src/common/file.d.ts.map +0 -1
- package/dist/types/src/common/graph.d.ts +0 -21
- package/dist/types/src/common/graph.d.ts.map +0 -1
- package/dist/types/src/common/layout.d.ts +0 -281
- package/dist/types/src/common/layout.d.ts.map +0 -1
- package/dist/types/src/common/surface.d.ts +0 -65
- package/dist/types/src/common/surface.d.ts.map +0 -1
- package/dist/types/src/core/capabilities.d.ts +0 -114
- package/dist/types/src/core/capabilities.d.ts.map +0 -1
- package/dist/types/src/core/capabilities.test.d.ts +0 -2
- package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
- package/dist/types/src/core/events.d.ts.map +0 -1
- package/dist/types/src/core/manager.d.ts +0 -122
- package/dist/types/src/core/manager.d.ts.map +0 -1
- package/dist/types/src/core/manager.test.d.ts +0 -2
- package/dist/types/src/core/manager.test.d.ts.map +0 -1
- package/dist/types/src/playground/debug/Debug.d.ts +0 -6
- package/dist/types/src/playground/debug/Debug.d.ts.map +0 -1
- package/dist/types/src/playground/debug/index.d.ts +0 -2
- package/dist/types/src/playground/debug/index.d.ts.map +0 -1
- package/dist/types/src/playground/debug/plugin.d.ts +0 -2
- package/dist/types/src/playground/debug/plugin.d.ts.map +0 -1
- package/dist/types/src/playground/generator/Main.d.ts +0 -6
- package/dist/types/src/playground/generator/Main.d.ts.map +0 -1
- package/dist/types/src/playground/generator/Toolbar.d.ts +0 -6
- package/dist/types/src/playground/generator/Toolbar.d.ts.map +0 -1
- package/dist/types/src/playground/generator/generator.d.ts +0 -7
- package/dist/types/src/playground/generator/generator.d.ts.map +0 -1
- package/dist/types/src/playground/generator/index.d.ts +0 -3
- package/dist/types/src/playground/generator/index.d.ts.map +0 -1
- package/dist/types/src/playground/generator/plugin.d.ts +0 -2
- package/dist/types/src/playground/generator/plugin.d.ts.map +0 -1
- package/dist/types/src/playground/layout/Layout.d.ts +0 -8
- package/dist/types/src/playground/layout/Layout.d.ts.map +0 -1
- package/dist/types/src/playground/layout/index.d.ts +0 -2
- package/dist/types/src/playground/layout/index.d.ts.map +0 -1
- package/dist/types/src/playground/layout/plugin.d.ts +0 -2
- package/dist/types/src/playground/layout/plugin.d.ts.map +0 -1
- package/dist/types/src/playground/logger/Toolbar.d.ts +0 -6
- package/dist/types/src/playground/logger/Toolbar.d.ts.map +0 -1
- package/dist/types/src/playground/logger/index.d.ts +0 -2
- package/dist/types/src/playground/logger/index.d.ts.map +0 -1
- package/dist/types/src/playground/logger/plugin.d.ts +0 -2
- package/dist/types/src/playground/logger/plugin.d.ts.map +0 -1
- package/dist/types/src/playground/logger/schema.d.ts +0 -13
- package/dist/types/src/playground/logger/schema.d.ts.map +0 -1
- package/dist/types/src/playground/playground.stories.d.ts +0 -10
- package/dist/types/src/playground/playground.stories.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/IntentPlugin.d.ts +0 -2
- package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/actions.d.ts +0 -38
- package/dist/types/src/plugin-intent/actions.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/errors.d.ts +0 -16
- package/dist/types/src/plugin-intent/errors.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/index.d.ts +0 -5
- package/dist/types/src/plugin-intent/index.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +0 -139
- package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +0 -2
- package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/intent.d.ts +0 -63
- package/dist/types/src/plugin-intent/intent.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +0 -2
- package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/actions.d.ts +0 -27
- package/dist/types/src/plugin-settings/actions.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/app-graph-builder.d.ts +0 -4
- package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/index.d.ts +0 -3
- package/dist/types/src/plugin-settings/index.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/intent-resolver.d.ts +0 -4
- package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/store.d.ts +0 -5
- package/dist/types/src/plugin-settings/store.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/translations.d.ts +0 -10
- package/dist/types/src/plugin-settings/translations.d.ts.map +0 -1
- package/dist/types/src/react/ErrorBoundary.d.ts +0 -31
- package/dist/types/src/react/ErrorBoundary.d.ts.map +0 -1
- package/dist/types/src/react/IntentContext.d.ts +0 -8
- package/dist/types/src/react/IntentContext.d.ts.map +0 -1
- package/dist/types/src/react/PluginManagerProvider.d.ts +0 -10
- package/dist/types/src/react/PluginManagerProvider.d.ts.map +0 -1
- package/dist/types/src/react/Surface.d.ts +0 -12
- package/dist/types/src/react/Surface.d.ts.map +0 -1
- package/dist/types/src/react/Surface.stories.d.ts +0 -16
- package/dist/types/src/react/Surface.stories.d.ts.map +0 -1
- package/dist/types/src/react/common.d.ts +0 -13
- package/dist/types/src/react/common.d.ts.map +0 -1
- package/dist/types/src/react/index.d.ts +0 -7
- package/dist/types/src/react/index.d.ts.map +0 -1
- package/dist/types/src/react/useCapabilities.d.ts +0 -13
- package/dist/types/src/react/useCapabilities.d.ts.map +0 -1
- package/dist/types/src/react/useIntentResolver.d.ts +0 -3
- package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
- package/dist/types/src/worker.d.ts +0 -4
- package/dist/types/src/worker.d.ts.map +0 -1
- package/src/App.tsx +0 -276
- package/src/common/collaboration.ts +0 -21
- package/src/common/events.ts +0 -77
- package/src/common/file.ts +0 -22
- package/src/common/graph.ts +0 -30
- package/src/common/layout.ts +0 -278
- package/src/common/surface.ts +0 -86
- package/src/core/capabilities.test.ts +0 -136
- package/src/core/capabilities.ts +0 -254
- package/src/core/manager.test.ts +0 -515
- package/src/core/manager.ts +0 -519
- package/src/playground/debug/Debug.tsx +0 -39
- package/src/playground/debug/plugin.ts +0 -17
- package/src/playground/generator/Main.tsx +0 -71
- package/src/playground/generator/Toolbar.tsx +0 -46
- package/src/playground/generator/generator.ts +0 -48
- package/src/playground/generator/index.ts +0 -6
- package/src/playground/generator/plugin.ts +0 -23
- package/src/playground/layout/Layout.tsx +0 -33
- package/src/playground/layout/plugin.ts +0 -17
- package/src/playground/logger/Toolbar.tsx +0 -29
- package/src/playground/logger/plugin.ts +0 -36
- package/src/playground/logger/schema.ts +0 -12
- package/src/playground/playground.stories.tsx +0 -42
- package/src/plugin-intent/IntentPlugin.ts +0 -20
- package/src/plugin-intent/actions.ts +0 -33
- package/src/plugin-intent/errors.ts +0 -39
- package/src/plugin-intent/index.ts +0 -8
- package/src/plugin-intent/intent-dispatcher.test.ts +0 -279
- package/src/plugin-intent/intent-dispatcher.ts +0 -333
- package/src/plugin-intent/intent.ts +0 -154
- package/src/plugin-settings/SettingsPlugin.ts +0 -35
- package/src/plugin-settings/actions.ts +0 -29
- package/src/plugin-settings/app-graph-builder.ts +0 -157
- package/src/plugin-settings/index.ts +0 -6
- package/src/plugin-settings/intent-resolver.ts +0 -34
- package/src/plugin-settings/store.ts +0 -33
- package/src/plugin-settings/translations.ts +0 -19
- package/src/react/ErrorBoundary.tsx +0 -45
- package/src/react/IntentContext.tsx +0 -34
- package/src/react/Surface.stories.tsx +0 -96
- package/src/react/Surface.tsx +0 -77
- package/src/react/common.ts +0 -12
- package/src/react/index.ts +0 -10
- package/src/react/useCapabilities.ts +0 -30
- package/src/react/useIntentResolver.ts +0 -22
- package/src/worker.ts +0 -11
- package/typedoc/.nojekyll +0 -1
- package/typedoc/assets/hierarchy.js +0 -1
- package/typedoc/assets/highlight.css +0 -106
- package/typedoc/assets/icons.js +0 -18
- package/typedoc/assets/icons.svg +0 -1
- package/typedoc/assets/main.js +0 -60
- package/typedoc/assets/navigation.js +0 -1
- package/typedoc/assets/search.js +0 -1
- package/typedoc/assets/style.css +0 -1640
- package/typedoc/classes/CollaborationActions.InsertContent.html +0 -421
- package/typedoc/classes/ErrorBoundary.html +0 -125
- package/typedoc/classes/IntentAction.ShowUndo.html +0 -227
- package/typedoc/classes/IntentAction.Track.html +0 -266
- package/typedoc/classes/LayoutAction.AddToast.html +0 -265
- package/typedoc/classes/LayoutAction.Close.html +0 -382
- package/typedoc/classes/LayoutAction.Expose.html +0 -265
- package/typedoc/classes/LayoutAction.Open.html +0 -1123
- package/typedoc/classes/LayoutAction.RevertWorkspace.html +0 -343
- package/typedoc/classes/LayoutAction.ScrollIntoView.html +0 -460
- package/typedoc/classes/LayoutAction.Set.html +0 -460
- package/typedoc/classes/LayoutAction.SetLayoutMode.html +0 -499
- package/typedoc/classes/LayoutAction.SwitchWorkspace.html +0 -265
- package/typedoc/classes/LayoutAction.UpdateComplementary.html +0 -616
- package/typedoc/classes/LayoutAction.UpdateDialog.html +0 -1123
- package/typedoc/classes/LayoutAction.UpdateLayout.html +0 -461
- package/typedoc/classes/LayoutAction.UpdatePopover.html +0 -1435
- package/typedoc/classes/LayoutAction.UpdateSidebar.html +0 -616
- package/typedoc/classes/Plugin.html +0 -6
- package/typedoc/classes/PluginContext.html +0 -38
- package/typedoc/classes/PluginManager.html +0 -43
- package/typedoc/classes/PluginModule.html +0 -18
- package/typedoc/classes/SettingsAction.Open.html +0 -226
- package/typedoc/classes/SettingsAction.OpenPluginRegistry.html +0 -265
- package/typedoc/functions/Events.createStateEvent.html +0 -2
- package/typedoc/functions/IntentPlugin.html +0 -1
- package/typedoc/functions/SettingsPlugin.html +0 -1
- package/typedoc/functions/allOf.html +0 -2
- package/typedoc/functions/chain.html +0 -3
- package/typedoc/functions/contributes.html +0 -2
- package/typedoc/functions/createDispatcher.html +0 -3
- package/typedoc/functions/createIntent.html +0 -6
- package/typedoc/functions/createResolver.html +0 -2
- package/typedoc/functions/createSurface.html +0 -2
- package/typedoc/functions/defineCapability.html +0 -2
- package/typedoc/functions/defineEvent.html +0 -2
- package/typedoc/functions/defineModule.html +0 -2
- package/typedoc/functions/definePlugin.html +0 -2
- package/typedoc/functions/eventKey.html +0 -2
- package/typedoc/functions/getEvents.html +0 -2
- package/typedoc/functions/isAllOf.html +0 -2
- package/typedoc/functions/isOneOf.html +0 -2
- package/typedoc/functions/isSurfaceAvailable.html +0 -2
- package/typedoc/functions/lazy.html +0 -2
- package/typedoc/functions/oneOf.html +0 -2
- package/typedoc/functions/useApp.html +0 -6
- package/typedoc/functions/useAppGraph.html +0 -1
- package/typedoc/functions/useCapabilities.html +0 -3
- package/typedoc/functions/useCapability.html +0 -4
- package/typedoc/functions/useIntentDispatcher.html +0 -1
- package/typedoc/functions/useIntentResolver.html +0 -1
- package/typedoc/functions/useLayout.html +0 -1
- package/typedoc/functions/usePluginManager.html +0 -2
- package/typedoc/hierarchy.html +0 -1
- package/typedoc/index.html +0 -12
- package/typedoc/interfaces/LayoutAction.Toast.html +0 -10
- package/typedoc/media/LICENSE +0 -8
- package/typedoc/modules/Capabilities.html +0 -1
- package/typedoc/modules/CollaborationActions.html +0 -1
- package/typedoc/modules/Events.html +0 -1
- package/typedoc/modules/IntentAction.html +0 -1
- package/typedoc/modules/LayoutAction.html +0 -2
- package/typedoc/modules/SettingsAction.html +0 -1
- package/typedoc/modules.html +0 -1
- package/typedoc/types/ActivationEvent.html +0 -8
- package/typedoc/types/ActivationEvents.html +0 -2
- package/typedoc/types/AnyCapability.html +0 -1
- package/typedoc/types/AnyIntent.html +0 -1
- package/typedoc/types/AnyIntentChain.html +0 -1
- package/typedoc/types/AnyIntentEffectResult.html +0 -1
- package/typedoc/types/AnyIntentResolver.html +0 -1
- package/typedoc/types/AnyIntentResult.html +0 -1
- package/typedoc/types/Capabilities.FileUploader.html +0 -1
- package/typedoc/types/Capabilities.IntentResolver.html +0 -1
- package/typedoc/types/Capabilities.Layout.html +0 -1
- package/typedoc/types/Capabilities.Metadata.html +0 -1
- package/typedoc/types/Capabilities.ReactContext.html +0 -1
- package/typedoc/types/Capabilities.ReactRoot.html +0 -1
- package/typedoc/types/Capabilities.ReactSurface.html +0 -1
- package/typedoc/types/Capabilities.Settings.html +0 -4
- package/typedoc/types/Capability.html +0 -9
- package/typedoc/types/CreateAppOptions.html +0 -10
- package/typedoc/types/FileInfo.html +0 -1
- package/typedoc/types/Intent.html +0 -10
- package/typedoc/types/IntentChain.html +0 -6
- package/typedoc/types/IntentContext.html +0 -5
- package/typedoc/types/IntentData.html +0 -1
- package/typedoc/types/IntentDispatcher.html +0 -2
- package/typedoc/types/IntentDispatcherResult.html +0 -2
- package/typedoc/types/IntentEffectDefinition.html +0 -2
- package/typedoc/types/IntentEffectResult.html +0 -15
- package/typedoc/types/IntentParams.html +0 -3
- package/typedoc/types/IntentResolver.html +0 -2
- package/typedoc/types/IntentResultData.html +0 -1
- package/typedoc/types/IntentSchema.html +0 -1
- package/typedoc/types/IntentUndo.html +0 -2
- package/typedoc/types/InterfaceDef.html +0 -4
- package/typedoc/types/Label.html +0 -1
- package/typedoc/types/NodeSerializer.html +0 -8
- package/typedoc/types/PluginManagerOptions.html +0 -6
- package/typedoc/types/PluginMeta.html +0 -21
- package/typedoc/types/PromiseIntentDispatcher.html +0 -2
- package/typedoc/types/PromiseIntentUndo.html +0 -2
- package/typedoc/types/Resource.html +0 -1
- package/typedoc/types/ResourceKey.html +0 -1
- package/typedoc/types/ResourceLanguage.html +0 -1
- package/typedoc/types/SerializedNode.html +0 -4
- package/typedoc/types/SurfaceComponent.html +0 -2
- package/typedoc/types/SurfaceDefinition.html +0 -2
- package/typedoc/types/SurfaceProps.html +0 -4
- package/typedoc/variables/Capabilities.AnchorSort.html +0 -1
- package/typedoc/variables/Capabilities.AppGraph.html +0 -1
- package/typedoc/variables/Capabilities.AppGraphBuilder.html +0 -1
- package/typedoc/variables/Capabilities.AppGraphSerializer.html +0 -1
- package/typedoc/variables/Capabilities.ArtifactDefinition.html +0 -1
- package/typedoc/variables/Capabilities.FileUploader.html +0 -1
- package/typedoc/variables/Capabilities.IntentDispatcher.html +0 -1
- package/typedoc/variables/Capabilities.IntentResolver.html +0 -1
- package/typedoc/variables/Capabilities.Layout.html +0 -1
- package/typedoc/variables/Capabilities.Metadata.html +0 -1
- package/typedoc/variables/Capabilities.Null.html +0 -1
- package/typedoc/variables/Capabilities.PluginManager.html +0 -1
- package/typedoc/variables/Capabilities.ReactContext.html +0 -1
- package/typedoc/variables/Capabilities.ReactRoot.html +0 -1
- package/typedoc/variables/Capabilities.ReactSurface.html +0 -1
- package/typedoc/variables/Capabilities.RxRegistry.html +0 -1
- package/typedoc/variables/Capabilities.Settings.html +0 -1
- package/typedoc/variables/Capabilities.SettingsStore.html +0 -1
- package/typedoc/variables/Capabilities.Tools.html +0 -1
- package/typedoc/variables/Capabilities.Translations.html +0 -1
- package/typedoc/variables/Events.AppGraphReady.html +0 -2
- package/typedoc/variables/Events.DispatcherReady.html +0 -2
- package/typedoc/variables/Events.LayoutReady.html +0 -1
- package/typedoc/variables/Events.SettingsReady.html +0 -2
- package/typedoc/variables/Events.SetupAppGraph.html +0 -2
- package/typedoc/variables/Events.SetupArtifactDefinition.html +0 -2
- package/typedoc/variables/Events.SetupIntentResolver.html +0 -2
- package/typedoc/variables/Events.SetupMetadata.html +0 -2
- package/typedoc/variables/Events.SetupReactSurface.html +0 -2
- package/typedoc/variables/Events.SetupSettings.html +0 -2
- package/typedoc/variables/Events.SetupTranslations.html +0 -2
- package/typedoc/variables/Events.Startup.html +0 -2
- package/typedoc/variables/FileInfoSchema.html +0 -1
- package/typedoc/variables/INTENT_ACTION.html +0 -1
- package/typedoc/variables/INTENT_PLUGIN.html +0 -1
- package/typedoc/variables/LAYOUT_ACTION.html +0 -1
- package/typedoc/variables/LAYOUT_PLUGIN.html +0 -1
- package/typedoc/variables/Label.html +0 -1
- package/typedoc/variables/LayoutAction.Toast.html +0 -1
- package/typedoc/variables/LayoutAction.UPDATE_LAYOUT.html +0 -1
- package/typedoc/variables/PluginManagerProvider.html +0 -2
- package/typedoc/variables/Resource.html +0 -2
- package/typedoc/variables/ResourceKey.html +0 -1
- package/typedoc/variables/ResourceLanguage.html +0 -1
- package/typedoc/variables/SETTINGS_ACTION.html +0 -1
- package/typedoc/variables/SETTINGS_ID.html +0 -1
- package/typedoc/variables/SETTINGS_KEY.html +0 -1
- package/typedoc/variables/SETTINGS_PLUGIN.html +0 -1
- package/typedoc/variables/Surface.html +0 -2
- package/typedoc/variables/defaultFileTypes.html +0 -1
- /package/dist/lib/browser/{intent-dispatcher-TWKB22NI.mjs.map → chunk-G7SDBRKH.mjs.map} +0 -0
- /package/dist/lib/browser/{worker.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
- /package/dist/lib/{node-esm/intent-dispatcher-5PRM3KGH.mjs.map → browser/common/activation-events.mjs.map} +0 -0
- /package/dist/lib/{node-esm/worker.mjs.map → browser/common/capabilities.mjs.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/core/plugin-manager.ts", "../../../src/core/capability-manager.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom, Registry } from '@effect-atom/atom-react';\nimport * as Array from 'effect/Array';\nimport * as Cause from 'effect/Cause';\nimport * as Deferred from 'effect/Deferred';\nimport * as Duration from 'effect/Duration';\nimport * as Effect from 'effect/Effect';\nimport * as Fiber from 'effect/Fiber';\nimport * as Function from 'effect/Function';\nimport * as HashSet from 'effect/HashSet';\nimport * as PubSub from 'effect/PubSub';\nimport * as Ref from 'effect/Ref';\n\nimport { runAndForwardErrors } from '@dxos/effect';\nimport { Performance } from '@dxos/effect';\nimport { log } from '@dxos/log';\n\nimport * as ActivationEvent from './activation-event';\nimport * as Capability from './capability';\nimport * as CapabilityManager from './capability-manager';\nimport * as Plugin from './plugin';\n\n/**\n * Identifier denoting a Manager.\n */\nexport const ManagerTypeId: unique symbol = Symbol.for('@dxos/app-framework/Manager');\nexport type ManagerTypeId = typeof ManagerTypeId;\n\nexport type ManagerOptions = {\n pluginLoader: (id: string) => Effect.Effect<Plugin.Plugin, Error>;\n plugins?: Plugin.Plugin[];\n core?: string[];\n enabled?: string[];\n registry?: Registry.Registry;\n /**\n * Hook called when a plugin is removed via {@link PluginManager.remove}. Used by the\n * host app to clean up persisted state (e.g. evict offline-cached plugin assets).\n * Failures are logged and swallowed; removal still succeeds even if the hook fails.\n */\n onRemove?: (id: string) => Effect.Effect<void, unknown>;\n};\n\nexport type ActivationMessage = {\n event: string;\n state: 'activating' | 'activated' | 'error';\n /** Module ID when the message pertains to a specific module activation. */\n module?: string;\n error?: Error;\n};\n\n/**\n * Interface for the Plugin Manager.\n */\nexport interface PluginManager {\n readonly [ManagerTypeId]: ManagerTypeId;\n readonly activation: PubSub.PubSub<ActivationMessage>;\n readonly capabilities: CapabilityManager.CapabilityManager;\n readonly registry: Registry.Registry;\n\n readonly plugins: Atom.Atom<readonly Plugin.Plugin[]>;\n readonly core: Atom.Atom<readonly string[]>;\n readonly enabled: Atom.Atom<readonly string[]>;\n readonly modules: Atom.Atom<readonly Plugin.PluginModule[]>;\n readonly active: Atom.Atom<readonly string[]>;\n readonly eventsFired: Atom.Atom<readonly string[]>;\n readonly pendingReset: Atom.Atom<readonly string[]>;\n\n getPlugins(): readonly Plugin.Plugin[];\n getCore(): readonly string[];\n getEnabled(): readonly string[];\n getModules(): readonly Plugin.PluginModule[];\n getActive(): readonly string[];\n getEventsFired(): readonly string[];\n getPendingReset(): readonly string[];\n\n /**\n * Loads a plugin via the plugin loader and registers it without enabling it.\n * Returns the loaded plugin so callers can enable it by its canonical id\n * (which may differ from the locator used to load it, e.g. URL loaders).\n */\n add(id: string): Effect.Effect<Plugin.Plugin, Error>;\n enable(id: string): Effect.Effect<boolean, Error>;\n remove(id: string): Effect.Effect<boolean, Error>;\n disable(id: string): Effect.Effect<boolean, Error>;\n // TODO(wittjosiah): Improve error typing.\n activate(\n event: ActivationEvent.ActivationEvent | string,\n params?: { before?: string; after?: string },\n ): Effect.Effect<boolean, Error>;\n deactivate(id: string): Effect.Effect<boolean, Error>;\n reset(event: ActivationEvent.ActivationEvent | string): Effect.Effect<boolean, Error>;\n\n /**\n * Shuts down the manager by deactivating all active modules in reverse activation order,\n * clearing all capabilities, and resetting lifecycle bookkeeping.\n * Plugins, core, enabled, and modules remain intact so the manager can be reused.\n */\n shutdown(): Effect.Effect<boolean, Error>;\n}\n\n/**\n * Type guard to check if a value is a PluginManager.\n */\nexport const isManager = (value: unknown): value is PluginManager => {\n return typeof value === 'object' && value !== null && ManagerTypeId in value;\n};\n\n/**\n * Internal implementation of PluginManager.\n */\nclass ManagerImpl implements PluginManager {\n readonly [ManagerTypeId]: ManagerTypeId = ManagerTypeId;\n readonly activation = Effect.runSync(PubSub.unbounded<ActivationMessage>());\n readonly capabilities: CapabilityManager.CapabilityManager;\n readonly registry: Registry.Registry;\n\n private readonly _pluginsAtom: Atom.Writable<Plugin.Plugin[]>;\n private readonly _coreAtom: Atom.Writable<string[]>;\n private readonly _enabledAtom: Atom.Writable<string[]>;\n private readonly _modulesAtom: Atom.Writable<Plugin.PluginModule[]>;\n private readonly _activeAtom: Atom.Writable<string[]>;\n private readonly _eventsFiredAtom: Atom.Writable<string[]>;\n private readonly _pendingResetAtom: Atom.Writable<string[]>;\n private readonly _pluginLoader: ManagerOptions['pluginLoader'];\n private readonly _onRemove: ManagerOptions['onRemove'];\n private readonly _capabilities = new Map<string, Capability.Any[]>();\n private readonly _moduleMemoMap = new Map<Plugin.PluginModule['id'], Deferred.Deferred<Capability.Any[], Error>>();\n private readonly _moduleSemaphores = new Map<Plugin.PluginModule['id'], Effect.Semaphore>();\n private readonly _activatingEvents = Effect.runSync(Ref.make<string[]>([]));\n private readonly _activatingModules = Effect.runSync(Ref.make<string[]>([]));\n private readonly _inFlightFibers = Effect.runSync(Ref.make<Array<Fiber.Fiber<unknown, unknown>>>([]));\n private readonly _shutdownSemaphore = Effect.runSync(Effect.makeSemaphore(1));\n private readonly _shuttingDown = Effect.runSync(Ref.make(false));\n\n constructor({\n pluginLoader,\n plugins = [],\n core = plugins.map(({ meta }) => meta.id),\n enabled = [],\n registry,\n onRemove,\n }: ManagerOptions) {\n this.registry = registry ?? Registry.make();\n this.capabilities = CapabilityManager.make({\n registry: this.registry,\n });\n\n this._pluginLoader = pluginLoader;\n this._onRemove = onRemove;\n this._pluginsAtom = Atom.make(plugins).pipe(Atom.keepAlive);\n this._coreAtom = Atom.make(core).pipe(Atom.keepAlive);\n this._enabledAtom = Atom.make(enabled).pipe(Atom.keepAlive);\n this._modulesAtom = Atom.make<Plugin.PluginModule[]>([]).pipe(Atom.keepAlive);\n this._activeAtom = Atom.make<string[]>([]).pipe(Atom.keepAlive);\n this._eventsFiredAtom = Atom.make<string[]>([]).pipe(Atom.keepAlive);\n this._pendingResetAtom = Atom.make<string[]>([]).pipe(Atom.keepAlive);\n plugins.forEach((plugin) => this._addPlugin(plugin));\n void Effect.all([...core, ...enabled].map((id) => this.enable(id))).pipe(runAndForwardErrors);\n }\n\n get plugins(): Atom.Atom<readonly Plugin.Plugin[]> {\n return this._pluginsAtom;\n }\n\n get core(): Atom.Atom<readonly string[]> {\n return this._coreAtom;\n }\n\n /**\n * Ids of plugins that are currently enabled.\n */\n get enabled(): Atom.Atom<readonly string[]> {\n return this._enabledAtom;\n }\n\n /**\n * Modules of plugins which are currently enabled.\n */\n get modules(): Atom.Atom<readonly Plugin.PluginModule[]> {\n return this._modulesAtom;\n }\n\n /**\n * Ids of modules which are currently active.\n */\n get active(): Atom.Atom<readonly string[]> {\n return this._activeAtom;\n }\n\n /**\n * Ids of events which have been fired.\n */\n get eventsFired(): Atom.Atom<readonly string[]> {\n return this._eventsFiredAtom;\n }\n\n /**\n * Ids of modules which are pending reset.\n */\n get pendingReset(): Atom.Atom<readonly string[]> {\n return this._pendingResetAtom;\n }\n\n getPlugins(): readonly Plugin.Plugin[] {\n return this._get(this._pluginsAtom);\n }\n\n getCore(): readonly string[] {\n return this._get(this._coreAtom);\n }\n\n getEnabled(): readonly string[] {\n return this._get(this._enabledAtom);\n }\n\n getModules(): readonly Plugin.PluginModule[] {\n return this._get(this._modulesAtom);\n }\n\n getActive(): readonly string[] {\n return this._get(this._activeAtom);\n }\n\n getEventsFired(): readonly string[] {\n return this._get(this._eventsFiredAtom);\n }\n\n getPendingReset(): readonly string[] {\n return this._get(this._pendingResetAtom);\n }\n\n /**\n * Adds a plugin to the manager via the plugin loader.\n * The plugin is registered but not enabled; call `enable` separately to activate it.\n * @param id The id of the plugin.\n */\n add(id: string): Effect.Effect<Plugin.Plugin, Error> {\n return Effect.gen(this, function* () {\n log('add plugin', { id });\n const plugin = yield* this._pluginLoader(id);\n this._addPlugin(plugin);\n return plugin;\n });\n }\n\n /**\n * Enables a plugin.\n * @param id The id of the plugin.\n */\n enable(id: string): Effect.Effect<boolean, Error> {\n return Effect.gen(this, function* () {\n log('enable plugin', { id });\n const plugin = this._getPlugin(id);\n if (!plugin) {\n return false;\n }\n\n this._update(this._enabledAtom, (enabled) => (enabled.includes(id) ? enabled : [...enabled, id]));\n\n plugin.modules.forEach((module) => {\n this._addModule(module);\n this._setPendingResetByModule(module);\n });\n\n log('pending reset', { events: [...this.getPendingReset()] });\n yield* Effect.all(\n this.getPendingReset().map((event) => this.activate(event)),\n { concurrency: 'unbounded' },\n );\n\n return true;\n });\n }\n\n /**\n * Removes a plugin from the manager.\n * @param id The id of the plugin.\n */\n remove(id: string): Effect.Effect<boolean, Error> {\n return Effect.gen(this, function* () {\n log('remove plugin', { id });\n const disabled = yield* this.disable(id);\n if (!disabled) {\n return false;\n }\n\n this._removePlugin(id);\n if (this._onRemove) {\n this._runForkedFiber(\n this._onRemove(id).pipe(\n Effect.tapError((error) => Effect.sync(() => log.warn('plugin remove hook failed', { id, error }))),\n Effect.ignore,\n ),\n );\n }\n return true;\n });\n }\n\n /**\n * Disables a plugin.\n * @param id The id of the plugin.\n */\n disable(id: string): Effect.Effect<boolean, Error> {\n return Effect.gen(this, function* () {\n log('disable plugin', { id });\n if (this._get(this._coreAtom).includes(id)) {\n return false;\n }\n\n const plugin = this._getPlugin(id);\n if (!plugin) {\n return false;\n }\n\n const enabledIndex = this._get(this._enabledAtom).findIndex((enabled) => enabled === id);\n if (enabledIndex !== -1) {\n this._update(this._enabledAtom, (enabled) => enabled.filter((item) => item !== id));\n yield* this.deactivate(id);\n\n plugin.modules.forEach((module) => {\n this._removeModule(module.id);\n });\n }\n\n return true;\n });\n }\n\n /**\n * Activates plugins based on the activation event.\n * @param event The activation event.\n * @returns Whether the activation was successful.\n */\n activate(\n event: ActivationEvent.ActivationEvent | string,\n params?: { before?: string; after?: string },\n ): Effect.Effect<boolean, Error> {\n const key = typeof event === 'string' ? event : ActivationEvent.eventKey(event);\n return Effect.gen(this, function* () {\n if (yield* this._isShuttingDown()) {\n log('skipping activation during shutdown', { key, ...params });\n return false;\n }\n\n return yield* Effect.withFiberRuntime<boolean, Error>((fiber) =>\n this._activateEvent(key, params, fiber).pipe(\n together(\n Effect.sleep(Duration.seconds(15)).pipe(\n Effect.andThen(Effect.sync(() => log.warn('event activation is taking a long time', { event: key }))),\n ),\n ),\n Performance.addTrackEntry({\n name: typeof event === 'string' ? event : ActivationEvent.eventKey(event),\n devtools: {\n dataType: 'track-entry',\n track: 'Event Activation',\n trackGroup: 'Composer',\n color: 'primary',\n },\n }),\n ),\n );\n });\n }\n\n /**\n * Deactivates all of the modules for a plugin.\n * @param id The id of the plugin.\n * @returns Whether the deactivation was successful.\n */\n deactivate(id: string): Effect.Effect<boolean, Error> {\n return Effect.gen(this, function* () {\n const plugin = this._getPlugin(id);\n if (!plugin) {\n return false;\n }\n\n const modules = plugin.modules;\n const results = yield* Effect.all(\n modules.map((module) => this._deactivateModule(module)),\n { concurrency: 'unbounded' },\n );\n return results.every((result) => result);\n });\n }\n\n /**\n * Re-activates the modules that were activated by the event.\n * @param event The activation event.\n * @returns Whether the reset was successful.\n */\n reset(event: ActivationEvent.ActivationEvent | string): Effect.Effect<boolean, Error> {\n return Effect.gen(this, function* () {\n const key = typeof event === 'string' ? event : ActivationEvent.eventKey(event);\n log('reset', { key });\n const modules = this._getActiveModulesByEvent(key);\n const results = yield* Effect.all(\n modules.map((module) => this._deactivateModule(module)),\n { concurrency: 'unbounded' },\n );\n\n if (results.every((result) => result)) {\n return yield* this.activate(key);\n } else {\n return false;\n }\n });\n }\n\n shutdown(): Effect.Effect<boolean, Error> {\n return this._shutdownSemaphore.withPermits(1)(\n Effect.gen(this, function* () {\n yield* Ref.set(this._shuttingDown, true);\n log('shutdown');\n\n yield* this._interruptInFlightActivations();\n\n const activeIds = [...this._get(this._activeAtom)].reverse();\n const allModules = this._get(this._modulesAtom);\n const modulesToDeactivate = activeIds\n .map((id) => allModules.find((module) => module.id === id))\n .filter((module): module is Plugin.PluginModule => module != null);\n\n for (const module of modulesToDeactivate) {\n yield* this._deactivateModule(module);\n }\n\n this._set(this._eventsFiredAtom, []);\n this._set(this._pendingResetAtom, []);\n this._moduleMemoMap.clear();\n yield* Ref.set(this._activatingEvents, []);\n yield* Ref.set(this._activatingModules, []);\n\n log('shutdown complete');\n return true;\n }).pipe(Effect.ensuring(Ref.set(this._shuttingDown, false))),\n );\n }\n\n //\n // State helpers\n //\n\n private _get<T>(atom: Atom.Atom<T>): T {\n return this.registry.get(atom);\n }\n\n private _set<T>(atom: Atom.Writable<T>, value: T): void {\n this.registry.set(atom, value);\n }\n\n private _update<T>(atom: Atom.Writable<T>, updater: (current: T) => T): void {\n this._set(atom, updater(this._get(atom)));\n }\n\n private _isShuttingDown(): Effect.Effect<boolean> {\n return Ref.get(this._shuttingDown);\n }\n\n private _getPlugin(id: string): Plugin.Plugin | undefined {\n return this._get(this._pluginsAtom).find((plugin) => plugin.meta.id === id);\n }\n\n private _getActiveModules(): Plugin.PluginModule[] {\n const active = this._get(this._activeAtom);\n return this._get(this._modulesAtom).filter((module) => active.includes(module.id));\n }\n\n private _getInactiveModules(): Plugin.PluginModule[] {\n const active = this._get(this._activeAtom);\n return this._get(this._modulesAtom).filter((module) => !active.includes(module.id));\n }\n\n private _getActiveModulesByEvent(key: string): Plugin.PluginModule[] {\n return this._getActiveModules().filter((module) =>\n ActivationEvent.getEvents(module.activatesOn).map(ActivationEvent.eventKey).includes(key),\n );\n }\n\n private _getInactiveModulesByEvent(key: string): Plugin.PluginModule[] {\n return this._getInactiveModules().filter((module) =>\n ActivationEvent.getEvents(module.activatesOn).map(ActivationEvent.eventKey).includes(key),\n );\n }\n\n private _setPendingResetByModule(module: Plugin.PluginModule): void {\n const activationEvents = ActivationEvent.getEvents(module.activatesOn)\n .map(ActivationEvent.eventKey)\n .filter((key) => this._get(this._eventsFiredAtom).includes(key));\n\n const pendingReset = Array.fromIterable(new Set(activationEvents)).filter((event) => {\n const pending = this._get(this._pendingResetAtom);\n return !pending.includes(event);\n });\n if (pendingReset.length > 0) {\n log('pending reset', { events: pendingReset });\n this._update(this._pendingResetAtom, (current) => [...current, ...pendingReset]);\n }\n }\n\n private _clearPendingReset(key: string): void {\n const pendingIndex = this._get(this._pendingResetAtom).findIndex((event) => event === key);\n if (pendingIndex !== -1) {\n this._update(this._pendingResetAtom, (pending) => pending.filter((event) => event !== key));\n }\n }\n\n //\n // Fiber helpers\n //\n\n private _interruptInFlightActivations(): Effect.Effect<void> {\n return Effect.gen(this, function* () {\n const inFlightFibers = yield* Ref.get(this._inFlightFibers);\n yield* Effect.forEach(inFlightFibers, (fiber) => Fiber.interrupt(fiber), {\n concurrency: 'unbounded',\n });\n });\n }\n\n private _trackFiber(\n ref: Ref.Ref<Array<Fiber.Fiber<unknown, unknown>>>,\n fiber: Fiber.Fiber<unknown, unknown>,\n ): Effect.Effect<void> {\n return Ref.update(ref, (fibers) => [...fibers, fiber]);\n }\n\n private _untrackFiber(\n ref: Ref.Ref<Array<Fiber.Fiber<unknown, unknown>>>,\n fiber: Fiber.Fiber<unknown, unknown>,\n ): Effect.Effect<void> {\n return Ref.update(ref, (fibers) => fibers.filter((trackedFiber) => trackedFiber !== fiber));\n }\n\n /**\n * Spawns an effect on the default runtime and registers the resulting fiber in\n * `_inFlightFibers` so {@link shutdown} can interrupt it. Used from sync entry\n * points like {@link remove} where there is no enclosing Effect to fork from;\n * inside an Effect chain prefer the existing track/await/untrack pattern.\n */\n private _runForkedFiber<E>(effect: Effect.Effect<void, E>): void {\n const fiber = Effect.runFork(effect);\n Effect.runSync(this._trackFiber(this._inFlightFibers, fiber));\n Effect.runFork(Fiber.await(fiber).pipe(Effect.andThen(() => this._untrackFiber(this._inFlightFibers, fiber))));\n }\n\n //\n // Registration helpers\n //\n\n private _addPlugin(plugin: Plugin.Plugin): void {\n log('add plugin', { id: plugin.meta.id });\n // TODO(wittjosiah): Find a way to add a warning for duplicate plugins that doesn't cause log spam.\n this._update(this._pluginsAtom, (plugins) => (plugins.includes(plugin) ? plugins : [...plugins, plugin]));\n }\n\n private _removePlugin(id: string): void {\n log('remove plugin', { id });\n this._update(this._pluginsAtom, (plugins) => plugins.filter((plugin) => plugin.meta.id !== id));\n }\n\n private _addModule(module: Plugin.PluginModule): void {\n log('add module', { id: module.id });\n // TODO(wittjosiah): Find a way to add a warning for duplicate modules that doesn't cause log spam.\n this._update(this._modulesAtom, (modules) => (modules.includes(module) ? modules : [...modules, module]));\n }\n\n private _removeModule(id: string): void {\n log('remove module', { id });\n this._update(this._modulesAtom, (modules) => modules.filter((module) => module.id !== id));\n }\n\n //\n // Activation helpers\n //\n\n private _activateEvent(\n key: string,\n params: { before?: string; after?: string } | undefined,\n fiber: Fiber.Fiber<unknown, unknown>,\n ): Effect.Effect<boolean, Error> {\n return Effect.gen(this, function* () {\n yield* this._trackFiber(this._inFlightFibers, fiber);\n log('activating', { key, ...params });\n yield* Ref.update(this._activatingEvents, (activating) => Array.append(activating, key));\n this._clearPendingReset(key);\n\n const activatingEvents = yield* this._activatingEvents;\n const activatingModules = yield* this._activatingModules;\n const modules = this._getModulesForActivation(key, activatingEvents, activatingModules);\n if (modules.length === 0) {\n log('no modules to activate', { key });\n if (!this._get(this._eventsFiredAtom).includes(key)) {\n this._update(this._eventsFiredAtom, (events) => [...events, key]);\n }\n return false;\n }\n\n return yield* this._activateModulesForEvent(key, modules, activatingEvents);\n }).pipe(\n Effect.ensuring(\n Effect.all([\n this._untrackFiber(this._inFlightFibers, fiber),\n Ref.update(this._activatingEvents, (activating) => Array.filter(activating, (event) => event !== key)),\n ]),\n ),\n );\n }\n\n private _activateModulesForEvent(\n key: string,\n modules: Plugin.PluginModule[],\n activatingEvents: string[],\n ): Effect.Effect<boolean, Error> {\n const activatingModuleIds = modules.map((module) => module.id);\n return Effect.gen(this, function* () {\n yield* Ref.update(this._activatingModules, (activating) => Array.appendAll(activating, activatingModuleIds));\n\n log('activating modules', { key, modules: activatingModuleIds });\n performance.mark(`event:${key}:start`);\n yield* PubSub.publish(this.activation, { event: key, state: 'activating' });\n\n yield* this._activateRelatedEvents(key, this._getBeforeEvents(modules, activatingEvents), 'before');\n\n const capabilities = yield* this._loadCapabilitiesForModules(key, modules);\n yield* this._contributeCapabilitiesForModules(modules, capabilities);\n\n yield* this._activateRelatedEvents(key, this._getAfterEvents(modules, activatingEvents), 'after');\n\n if (!this._get(this._eventsFiredAtom).includes(key)) {\n this._update(this._eventsFiredAtom, (events) => [...events, key]);\n }\n\n performance.mark(`event:${key}:end`);\n performance.measure(`event:${key}`, `event:${key}:start`, `event:${key}:end`);\n yield* PubSub.publish(this.activation, { event: key, state: 'activated' });\n log('activated', { key });\n\n return true;\n }).pipe(\n Effect.ensuring(\n Ref.update(this._activatingModules, (activating) =>\n Array.filter(activating, (module) => !activatingModuleIds.includes(module)),\n ),\n ),\n );\n }\n\n private _getModulesForActivation(\n key: string,\n activatingEvents: string[],\n activatingModules: string[],\n ): Plugin.PluginModule[] {\n return this._getInactiveModulesByEvent(key).filter((module) => {\n const allOf = ActivationEvent.isAllOf(module.activatesOn);\n if (!allOf) {\n return true;\n }\n\n // Check to see if all of the events in the `allOf` have been fired.\n // An event can be considered \"fired\" if it is in the `eventsFired` list or if it is currently being activated.\n const events = ActivationEvent.getEvents(module.activatesOn).filter(\n (event) => ActivationEvent.eventKey(event) !== key,\n );\n return (\n events.every(\n (event) =>\n this._get(this._eventsFiredAtom).includes(ActivationEvent.eventKey(event)) ||\n activatingEvents.includes(ActivationEvent.eventKey(event)),\n ) && !activatingModules.includes(module.id)\n );\n });\n }\n\n private _getBeforeEvents(\n modules: Plugin.PluginModule[],\n activatingEvents: string[],\n ): ActivationEvent.ActivationEvent[] {\n return Function.pipe(\n modules,\n Array.flatMap((module) => module.firesBeforeActivation ?? []),\n HashSet.fromIterable,\n HashSet.toValues,\n Array.filter((event) => !activatingEvents.includes(ActivationEvent.eventKey(event))),\n );\n }\n\n private _getAfterEvents(\n modules: Plugin.PluginModule[],\n activatingEvents: string[],\n ): ActivationEvent.ActivationEvent[] {\n return Function.pipe(\n modules,\n Array.flatMap((module) => module.firesAfterActivation ?? []),\n HashSet.fromIterable,\n HashSet.toValues,\n Array.filter((event) => !activatingEvents.includes(ActivationEvent.eventKey(event))),\n );\n }\n\n private _activateRelatedEvents(\n key: string,\n events: ActivationEvent.ActivationEvent[],\n phase: 'before' | 'after',\n ): Effect.Effect<void, Error> {\n const logLabel = phase === 'before' ? 'firesBeforeActivation' : 'firesAfterActivation';\n const eventKey = phase === 'before' ? 'beforeEvents' : 'afterEvents';\n return Function.pipe(\n events,\n Array.map((event) => this.activate(event, phase === 'before' ? { before: key } : { after: key })),\n Effect.allWith({ concurrency: 'unbounded' }),\n together(\n Effect.sleep(Duration.seconds(10)).pipe(\n Effect.andThen(\n Effect.sync(() =>\n log.warn(`${logLabel} is taking a long time`, {\n event: key,\n [eventKey]: events.map(ActivationEvent.eventKey),\n }),\n ),\n ),\n ),\n ),\n Effect.asVoid,\n );\n }\n\n //\n // Module lifecycle helpers\n //\n\n private _loadCapabilitiesForModules(\n key: string,\n modules: Plugin.PluginModule[],\n ): Effect.Effect<Capability.Any[][], Error> {\n return Function.pipe(\n modules,\n Array.map((mod) => this._loadModule(mod, key)),\n Effect.allWith({ concurrency: 'unbounded' }),\n Effect.catchAll((error) => {\n return Effect.gen(this, function* () {\n yield* PubSub.publish(this.activation, { event: key, state: 'error', error });\n return yield* Effect.fail(error);\n });\n }),\n );\n }\n\n private _contributeCapabilitiesForModules(\n modules: Plugin.PluginModule[],\n capabilities: Capability.Any[][],\n ): Effect.Effect<void, Error> {\n return Function.pipe(\n modules,\n Array.zip(capabilities),\n Array.map(([module, capabilitySet]) => this._contributeCapabilities(module, capabilitySet)),\n // TODO(wittjosiah): This currently can't be run in parallel, and inserting\n // any yield between contributions (`Effect.yieldNow()`, `Effect.sleep(0)`)\n // races the `allOf` activation-event resolver — observed as a System\n // Error dialog on warm reloads. Contributions must stay strictly\n // synchronous within an event; React paint slots have to be found at\n // event boundaries higher up the call chain.\n Effect.all,\n Effect.asVoid,\n );\n }\n\n private _getModuleSemaphore(moduleId: Plugin.PluginModule['id']): Effect.Semaphore {\n let semaphore = this._moduleSemaphores.get(moduleId);\n if (!semaphore) {\n semaphore = Effect.runSync(Effect.makeSemaphore(1));\n this._moduleSemaphores.set(moduleId, semaphore);\n }\n return semaphore;\n }\n\n // `parentEvent` is the activation event that first triggered this module\n // load — included in `activating`/`activated` PubSub messages so subscribers\n // (e.g. the boot loader's status listener) can associate a module with its\n // triggering event in the trace. The same module may be referenced by\n // multiple events, but module loads are memoized via `_moduleMemoMap`, so\n // only the first event to need it will appear here; later events await the\n // cached deferred without re-publishing.\n private _loadModule = (module: Plugin.PluginModule, parentEvent: string): Effect.Effect<Capability.Any[], Error> =>\n Effect.gen(this, function* () {\n const semaphore = this._getModuleSemaphore(module.id);\n\n // Atomically check-and-set under per-module semaphore to prevent race conditions.\n const deferredToAwait = yield* Effect.gen(this, function* () {\n const existing = this._moduleMemoMap.get(module.id);\n if (existing) {\n return existing;\n }\n\n // First caller - create deferred, store it, and start loading in background.\n const deferred = yield* Deferred.make<Capability.Any[], Error>();\n this._moduleMemoMap.set(module.id, deferred);\n\n const loadEffect = Effect.gen(this, function* () {\n log('loading module', { module: module.id, parentEvent });\n performance.mark(`module:${module.id}:start`);\n yield* PubSub.publish(this.activation, { event: parentEvent, state: 'activating', module: module.id });\n const [duration, capabilities] = yield* module\n .activate()\n .pipe(\n Effect.provideService(Capability.Service, this.capabilities),\n Effect.provideService(Plugin.Service, this),\n Effect.timed,\n );\n const normalized = capabilities == null ? [] : Array.isArray(capabilities) ? capabilities : [capabilities];\n const elapsed = Duration.toMillis(duration);\n performance.mark(`module:${module.id}:end`);\n performance.measure(`module:${module.id}`, `module:${module.id}:start`, `module:${module.id}:end`);\n yield* PubSub.publish(this.activation, { event: parentEvent, state: 'activated', module: module.id });\n log('loaded module', {\n module: module.id,\n parentEvent,\n elapsed,\n failed: false,\n });\n return normalized as Capability.Any[];\n }).pipe(\n Effect.withSpan('PluginManager._loadModule'),\n together(\n Effect.sleep(Duration.seconds(10)).pipe(\n Effect.andThen(\n Effect.sync(() => log.warn(`module is taking a long time to activate`, { module: module.id })),\n ),\n ),\n ),\n Performance.addTrackEntry({\n name: module.id,\n devtools: {\n dataType: 'track-entry',\n track: 'Module Activation',\n trackGroup: 'Composer',\n color: 'primary',\n },\n }),\n );\n\n // Fork the load to run in background, completing the deferred when done.\n const fiber = yield* Effect.forkDaemon(\n loadEffect.pipe(\n Effect.tap((result) => Deferred.succeed(deferred, result)),\n Effect.catchAllCause((cause) => {\n const error = Cause.squash(cause);\n log.error('module failed to activate', {\n module: module.id,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n isDefect: !Cause.isFailure(cause),\n });\n return Deferred.fail(deferred, error instanceof Error ? error : new Error(String(error)));\n }),\n ),\n );\n yield* this._trackFiber(this._inFlightFibers, fiber);\n yield* Effect.forkDaemon(\n Fiber.await(fiber).pipe(Effect.andThen(() => this._untrackFiber(this._inFlightFibers, fiber))),\n );\n\n return deferred;\n }).pipe(semaphore.withPermits(1));\n\n // Wait for result outside the semaphore so multiple waiters can proceed concurrently.\n return yield* Deferred.await(deferredToAwait);\n });\n\n private _contributeCapabilities(\n module: Plugin.PluginModule,\n capabilities: Capability.Any[],\n ): Effect.Effect<void, Error> {\n return Effect.gen(this, function* () {\n capabilities.forEach((capability) => {\n this.capabilities.contribute({ module: module.id, ...capability });\n });\n this._update(this._activeAtom, (active) => [...active, module.id]);\n this._capabilities.set(module.id, capabilities);\n });\n }\n\n private _deactivateModule(module: Plugin.PluginModule): Effect.Effect<boolean, Error> {\n return Effect.gen(this, function* () {\n const id = module.id;\n log('deactivating', { id });\n this._moduleMemoMap.delete(id);\n\n const capabilities = this._capabilities.get(id);\n if (capabilities) {\n for (const capability of capabilities) {\n this.capabilities.remove(capability.interface, capability.implementation);\n const program = capability.deactivate?.() ?? Effect.succeed(undefined);\n yield* program;\n }\n this._capabilities.delete(id);\n }\n\n const activeIndex = this._get(this._activeAtom).findIndex((event) => event === id);\n if (activeIndex !== -1) {\n this._update(this._activeAtom, (active) => active.filter((event) => event !== id));\n }\n\n log('deactivated', { id });\n return true;\n });\n }\n}\n\n/**\n * Creates a new Plugin Manager instance.\n */\nexport const make = (options: ManagerOptions): PluginManager => new ManagerImpl(options);\n\n/**\n * Runs an effect concurrently with another effect.\n * If the first effect completes, the second effect is interrupted.\n */\n// TODO(dmaretskyi): Effect.race > Effect.asVoid\nconst together =\n <R1>(togetherEffect: Effect.Effect<void, never, R1>) =>\n <A, E, R2>(effect: Effect.Effect<A, E, R2>): Effect.Effect<A, E, R1 | R2> =>\n Effect.gen(function* () {\n const togetherFiber = yield* Effect.fork(togetherEffect);\n const result = yield* effect;\n yield* Fiber.interrupt(togetherFiber);\n return result;\n });\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom, type Registry } from '@effect-atom/atom-react';\nimport * as Deferred from 'effect/Deferred';\nimport * as Effect from 'effect/Effect';\n\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n\nimport type * as Capability from './capability';\n\ntype CapabilityEntry<T> = {\n moduleId: string;\n implementation: T;\n};\n\n/**\n * Options for creating a capability manager.\n * @internal\n */\nexport type CapabilityManagerOptions = {\n registry: Registry.Registry;\n};\n\n/**\n * Interface for the Capability Manager.\n * Provides methods for contributing, removing, and accessing capabilities.\n */\nexport interface CapabilityManager {\n contribute<T>(args: { module: string; interface: Capability.InterfaceDef<T>; implementation: T }): void;\n\n remove<T>(interfaceDef: Capability.InterfaceDef<T>, implementation: T): void;\n\n /**\n * Get the Atom reference to the available capabilities for a given interface.\n * Primarily useful for deriving other Atom values based on the capabilities or\n * for subscribing to changes in the capabilities.\n * @returns An atom reference to the available capabilities.\n */\n atom<T>(interfaceDef: Capability.InterfaceDef<T>): Atom.Atom<T[]>;\n\n /**\n * Get capabilities from the capability manager.\n * @returns An array of capabilities.\n */\n getAll<T>(interfaceDef: Capability.InterfaceDef<T>): T[];\n\n /**\n * Requests a single capability from the capability manager.\n * @returns The capability.\n * @throws If no capability is found.\n */\n get<T>(interfaceDef: Capability.InterfaceDef<T>): T;\n\n /**\n * Waits for a capability to be available.\n * @returns The capability.\n */\n waitFor<T>(interfaceDef: Capability.InterfaceDef<T>): Effect.Effect<T, Error>;\n\n /**\n * Get capabilities grouped by the module that contributed them.\n * @returns An atom containing a record from module ID to capability implementations.\n */\n atomByModule<T>(interfaceDef: Capability.InterfaceDef<T>): Atom.Atom<Record<string, T[]>>;\n}\n\n/**\n * Internal implementation of CapabilityManager.\n */\nclass CapabilityManagerImpl implements CapabilityManager {\n private readonly _registry: Registry.Registry;\n\n private readonly _capabilityEntries = Atom.family<string, Atom.Writable<CapabilityEntry<unknown>[]>>(() => {\n return Atom.make<CapabilityEntry<unknown>[]>([]).pipe(Atom.keepAlive);\n });\n\n readonly _capabilities = Atom.family<string, Atom.Atom<unknown[]>>((id: string) => {\n return Atom.make((get) => {\n const current = get(this._capabilityEntries(id));\n return current.map((c) => c.implementation);\n }).pipe(Atom.keepAlive);\n });\n\n readonly _capabilitiesByModule = Atom.family<string, Atom.Atom<Record<string, unknown[]>>>((id: string) => {\n return Atom.make((get) => {\n const entries = get(this._capabilityEntries(id));\n const result: Record<string, unknown[]> = {};\n for (const entry of entries) {\n (result[entry.moduleId] ??= []).push(entry.implementation);\n }\n return result;\n }).pipe(Atom.keepAlive);\n });\n\n readonly _capability = Atom.family<string, Atom.Atom<unknown>>((id: string) => {\n return Atom.make((get) => {\n const current = get(this._capabilities(id));\n invariant(current.length > 0, `No capability found for ${id}`);\n return current[0];\n });\n });\n\n constructor({ registry }: CapabilityManagerOptions) {\n this._registry = registry;\n }\n\n contribute<T>({\n module: moduleId,\n interface: interfaceDef,\n implementation,\n }: {\n module: string;\n interface: Capability.InterfaceDef<T>;\n implementation: T;\n }): void {\n const current = this._registry.get(this._capabilityEntries(interfaceDef.identifier));\n const isDuplicate = current.some((c) => c.moduleId === moduleId && c.implementation === implementation);\n if (isDuplicate) {\n log('capability already contributed, skipping', { id: interfaceDef.identifier, moduleId });\n return;\n }\n\n const entry: CapabilityEntry<T> = { moduleId, implementation };\n this._registry.set(this._capabilityEntries(interfaceDef.identifier), [...current, entry]);\n log('capability contributed', {\n id: interfaceDef.identifier,\n moduleId,\n count: current.length,\n });\n }\n\n remove<T>(interfaceDef: Capability.InterfaceDef<T>, implementation: T): void {\n const current = this._registry.get(this._capabilityEntries(interfaceDef.identifier));\n if (current.length === 0) {\n return;\n }\n\n const next = current.filter((c) => c.implementation !== implementation);\n if (next.length !== current.length) {\n this._registry.set(this._capabilityEntries(interfaceDef.identifier), next);\n log('capability removed', { id: interfaceDef.identifier, count: current.length });\n } else {\n log.warn('capability not removed', { id: interfaceDef.identifier });\n }\n }\n\n atom<T>(interfaceDef: Capability.InterfaceDef<T>): Atom.Atom<T[]> {\n // NOTE: This the type-checking for capabilities is done at the time of contribution.\n return this._capabilities(interfaceDef.identifier) as Atom.Atom<T[]>;\n }\n\n getAll<T>(interfaceDef: Capability.InterfaceDef<T>): T[] {\n return this._registry.get(this.atom(interfaceDef));\n }\n\n get<T>(interfaceDef: Capability.InterfaceDef<T>): T {\n const capabilities = this.getAll(interfaceDef);\n invariant(capabilities.length > 0, `No capability found for ${interfaceDef.identifier}`);\n return capabilities[0];\n }\n\n waitFor<T>(interfaceDef: Capability.InterfaceDef<T>): Effect.Effect<T, Error> {\n return Effect.gen(this, function* () {\n const [capability] = this.getAll(interfaceDef);\n if (capability) {\n return capability;\n }\n\n const deferred = yield* Deferred.make<T, Error>();\n const cancel = this._registry.subscribe(this.atom(interfaceDef), (capabilities) => {\n if (capabilities.length > 0) {\n Effect.runSync(Deferred.succeed(deferred, capabilities[0]));\n }\n });\n const result = yield* Deferred.await(deferred);\n cancel();\n return result;\n });\n }\n\n atomByModule<T>(interfaceDef: Capability.InterfaceDef<T>): Atom.Atom<Record<string, T[]>> {\n return this._capabilitiesByModule(interfaceDef.identifier) as Atom.Atom<Record<string, T[]>>;\n }\n}\n\n/**\n * Creates a new Capability Manager instance.\n */\nexport const make = (options: CapabilityManagerOptions): CapabilityManager => new CapabilityManagerImpl(options);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["make", "Atom", "Registry", "Array", "Cause", "Deferred", "Duration", "Effect", "Fiber", "Function", "HashSet", "PubSub", "Ref", "runAndForwardErrors", "Performance", "log", "make", "Atom", "Deferred", "Effect", "invariant", "log", "_capabilityEntries", "family", "_capabilities", "id", "current", "c", "pipe", "keepAlive", "_capabilitiesByModule", "get", "result", "entry", "entries", "_capability", "length", "contribute", "moduleId", "isDuplicate", "implementation", "interfaceDef", "count", "remove", "_registry", "set", "identifier", "atom", "getAll", "capabilities", "waitFor", "capability", "deferred", "runSync", "cancel", "atomByModule", "__dxlog_file", "activation", "Effect", "capabilities", "registry", "_pluginsAtom", "_coreAtom", "_enabledAtom", "_modulesAtom", "_activeAtom", "_eventsFiredAtom", "_pendingResetAtom", "_pluginLoader", "_onRemove", "_capabilities", "_moduleMemoMap", "_moduleSemaphores", "Map", "_activatingEvents", "_activatingModules", "runSync", "_inFlightFibers", "make", "_shutdownSemaphore", "makeSemaphore", "_shuttingDown", "plugins", "core", "map", "Registry", "CapabilityManager", "Atom", "enabled", "pipe", "keepAlive", "plugin", "_addPlugin", "id", "getPlugins", "getCore", "getEnabled", "getModules", "getActive", "getEventsFired", "getPendingReset", "log", "_update", "modules", "_setPendingResetByModule", "concurrency", "disabled", "_removePlugin", "_runForkedFiber", "error", "enabledIndex", "filter", "item", "deactivate", "forEach", "module", "_removeModule", "gen", "_isShuttingDown", "key", "Performance", "addTrackEntry", "name", "devtools", "dataType", "track", "trackGroup", "color", "every", "results", "shutdown", "_interruptInFlightActivations", "activeIds", "_get", "reverse", "allModules", "modulesToDeactivate", "_deactivateModule", "Ref", "set", "_set", "value", "atom", "updater", "_getPlugin", "_getActiveModules", "_getInactiveModules", "_getActiveModulesByEvent", "_getInactiveModulesByEvent", "Array", "fromIterable", "includes", "event", "pendingReset", "length", "current", "_clearPendingReset", "pendingIndex", "pending", "inFlightFibers", "_trackFiber", "fibers", "fiber", "_untrackFiber", "await", "meta", "_addModule", "activatingEvents", "activatingModules", "_getModulesForActivation", "events", "_activateModulesForEvent", "activating", "activatingModuleIds", "performance", "mark", "publish", "_contributeCapabilitiesForModules", "_activateRelatedEvents", "PubSub", "ensuring", "update", "ActivationEvent", "allOf", "_getBeforeEvents", "_getAfterEvents", "phase", "after", "together", "sleep", "eventKey", "catchAll", "_getModuleSemaphore", "moduleId", "semaphore", "deferredToAwait", "existing", "loadEffect", "parentEvent", "duration", "elapsed", "failed", "normalized", "withSpan", "stack", "isDefect", "isFailure", "cause", "Deferred", "deferred", "withPermits", "_contributeCapabilities", "capability", "get", "program", "activeIndex", "active", "result", "effect", "togetherFiber"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
isPlugin
|
|
4
|
+
} from "./chunk-GLBO7FJP.mjs";
|
|
5
|
+
import {
|
|
6
|
+
__export
|
|
7
|
+
} from "./chunk-HSLMI22Q.mjs";
|
|
8
|
+
|
|
9
|
+
// src/core/url-loader.ts
|
|
10
|
+
var url_loader_exports = {};
|
|
11
|
+
__export(url_loader_exports, {
|
|
12
|
+
RemotePluginLoadError: () => RemotePluginLoadError,
|
|
13
|
+
getRemoteEntries: () => getRemoteEntries,
|
|
14
|
+
isLocalUrl: () => isLocalUrl,
|
|
15
|
+
make: () => make,
|
|
16
|
+
preload: () => preload,
|
|
17
|
+
uninstall: () => uninstall
|
|
18
|
+
});
|
|
19
|
+
import * as Effect3 from "effect/Effect";
|
|
20
|
+
import * as Option from "effect/Option";
|
|
21
|
+
import { BaseError as BaseError3 } from "@dxos/errors";
|
|
22
|
+
import { log } from "@dxos/log";
|
|
23
|
+
|
|
24
|
+
// src/core/plugin-asset-cache.ts
|
|
25
|
+
var plugin_asset_cache_exports = {};
|
|
26
|
+
__export(plugin_asset_cache_exports, {
|
|
27
|
+
PluginAssetCacheError: () => PluginAssetCacheError,
|
|
28
|
+
noop: () => noop
|
|
29
|
+
});
|
|
30
|
+
import * as Effect from "effect/Effect";
|
|
31
|
+
import { BaseError } from "@dxos/errors";
|
|
32
|
+
var PluginAssetCacheError = class extends BaseError.extend("PluginAssetCacheError", "Plugin asset cache operation failed") {
|
|
33
|
+
};
|
|
34
|
+
var noop = () => ({
|
|
35
|
+
cache: () => Effect.void,
|
|
36
|
+
evict: () => Effect.void,
|
|
37
|
+
resolve: (_pluginId, url) => Effect.succeed(url),
|
|
38
|
+
list: () => Effect.succeed([])
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// src/core/plugin-manifest.ts
|
|
42
|
+
var plugin_manifest_exports = {};
|
|
43
|
+
__export(plugin_manifest_exports, {
|
|
44
|
+
Manifest: () => Manifest,
|
|
45
|
+
PluginManifestError: () => PluginManifestError,
|
|
46
|
+
fetchManifest: () => fetchManifest,
|
|
47
|
+
parse: () => parse
|
|
48
|
+
});
|
|
49
|
+
import * as FetchHttpClient from "@effect/platform/FetchHttpClient";
|
|
50
|
+
import * as HttpClient from "@effect/platform/HttpClient";
|
|
51
|
+
import * as HttpClientRequest from "@effect/platform/HttpClientRequest";
|
|
52
|
+
import * as HttpClientResponse from "@effect/platform/HttpClientResponse";
|
|
53
|
+
import * as Effect2 from "effect/Effect";
|
|
54
|
+
import * as Schema from "effect/Schema";
|
|
55
|
+
import { BaseError as BaseError2 } from "@dxos/errors";
|
|
56
|
+
import { PLUGIN_ENTRY_FILENAME } from "@dxos/protocols";
|
|
57
|
+
var PluginManifestError = class extends BaseError2.extend("PluginManifestError", "Plugin manifest is invalid") {
|
|
58
|
+
};
|
|
59
|
+
var Manifest = Schema.Struct({
|
|
60
|
+
id: Schema.String,
|
|
61
|
+
name: Schema.String,
|
|
62
|
+
version: Schema.String,
|
|
63
|
+
assets: Schema.Array(Schema.String)
|
|
64
|
+
});
|
|
65
|
+
var resolve = (manifestUrl, manifest) => ({
|
|
66
|
+
id: manifest.id,
|
|
67
|
+
name: manifest.name,
|
|
68
|
+
version: manifest.version,
|
|
69
|
+
entryUrl: new URL(PLUGIN_ENTRY_FILENAME, manifestUrl).toString(),
|
|
70
|
+
assetUrls: manifest.assets.map((asset) => new URL(asset, manifestUrl).toString())
|
|
71
|
+
});
|
|
72
|
+
var parse = (manifestUrl, payload) => {
|
|
73
|
+
const manifest = Schema.decodeUnknownSync(Manifest)(payload);
|
|
74
|
+
if (!manifest.assets.includes(PLUGIN_ENTRY_FILENAME)) {
|
|
75
|
+
throw new Error(`Manifest at ${manifestUrl} does not list ${PLUGIN_ENTRY_FILENAME} in assets.`);
|
|
76
|
+
}
|
|
77
|
+
return resolve(manifestUrl, manifest);
|
|
78
|
+
};
|
|
79
|
+
var fetchManifest = (manifestUrl) => Effect2.gen(function* () {
|
|
80
|
+
const response = yield* HttpClientRequest.get(manifestUrl).pipe(HttpClient.execute, Effect2.mapError((cause) => new PluginManifestError({
|
|
81
|
+
context: {
|
|
82
|
+
manifestUrl,
|
|
83
|
+
reason: "fetch-failed"
|
|
84
|
+
},
|
|
85
|
+
cause
|
|
86
|
+
})));
|
|
87
|
+
if (response.status >= 400) {
|
|
88
|
+
return yield* Effect2.fail(new PluginManifestError({
|
|
89
|
+
context: {
|
|
90
|
+
manifestUrl,
|
|
91
|
+
reason: "http-error",
|
|
92
|
+
status: response.status
|
|
93
|
+
}
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
const manifest = yield* HttpClientResponse.schemaBodyJson(Manifest)(response).pipe(Effect2.mapError((cause) => new PluginManifestError({
|
|
97
|
+
context: {
|
|
98
|
+
manifestUrl,
|
|
99
|
+
reason: "parse-failed"
|
|
100
|
+
},
|
|
101
|
+
cause
|
|
102
|
+
})));
|
|
103
|
+
if (!manifest.assets.includes(PLUGIN_ENTRY_FILENAME)) {
|
|
104
|
+
return yield* Effect2.fail(new PluginManifestError({
|
|
105
|
+
context: {
|
|
106
|
+
manifestUrl,
|
|
107
|
+
reason: "invalid"
|
|
108
|
+
},
|
|
109
|
+
cause: `assets does not include ${PLUGIN_ENTRY_FILENAME}`
|
|
110
|
+
}));
|
|
111
|
+
}
|
|
112
|
+
return resolve(manifestUrl, manifest);
|
|
113
|
+
}).pipe(Effect2.scoped, Effect2.provide(FetchHttpClient.layer));
|
|
114
|
+
|
|
115
|
+
// src/core/url-loader.ts
|
|
116
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/sdk/app-framework/src/core/url-loader.ts";
|
|
117
|
+
var DEFAULT_KEY = "org.dxos.composer.remote-plugins";
|
|
118
|
+
var RemotePluginLoadError = class extends BaseError3.extend("RemotePluginLoadError", "Failed to load remote plugin") {
|
|
119
|
+
};
|
|
120
|
+
var defaultStorage = () => ({
|
|
121
|
+
get: (key) => localStorage.getItem(key),
|
|
122
|
+
set: (key, value) => localStorage.setItem(key, value)
|
|
123
|
+
});
|
|
124
|
+
var getPersistedRemotePlugins = (storage, key) => {
|
|
125
|
+
try {
|
|
126
|
+
const parsed = JSON.parse(storage.get(key) ?? "[]");
|
|
127
|
+
if (!Array.isArray(parsed)) {
|
|
128
|
+
return [];
|
|
129
|
+
}
|
|
130
|
+
return parsed.filter((entry) => typeof entry === "object" && entry !== null && typeof entry.id === "string" && typeof entry.url === "string");
|
|
131
|
+
} catch {
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
var persistRemotePlugin = (storage, key, entry) => {
|
|
136
|
+
try {
|
|
137
|
+
const entries = getPersistedRemotePlugins(storage, key).filter((existing) => existing.id !== entry.id);
|
|
138
|
+
entries.push(entry);
|
|
139
|
+
storage.set(key, JSON.stringify(entries));
|
|
140
|
+
} catch (error) {
|
|
141
|
+
log.warn("failed to persist remote plugin entry", {
|
|
142
|
+
entry,
|
|
143
|
+
error
|
|
144
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 40, S: void 0 });
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
var removePersistedRemotePlugin = (storage, key, pluginId) => {
|
|
148
|
+
try {
|
|
149
|
+
const entries = getPersistedRemotePlugins(storage, key).filter((existing) => existing.id !== pluginId);
|
|
150
|
+
storage.set(key, JSON.stringify(entries));
|
|
151
|
+
} catch (error) {
|
|
152
|
+
log.warn("failed to remove remote plugin entry", {
|
|
153
|
+
pluginId,
|
|
154
|
+
error
|
|
155
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 51, S: void 0 });
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
var isUrl = (locator) => {
|
|
159
|
+
try {
|
|
160
|
+
const url = new URL(locator);
|
|
161
|
+
return url.protocol === "http:" || url.protocol === "https:";
|
|
162
|
+
} catch {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
var isLocalUrl = (locator) => {
|
|
167
|
+
try {
|
|
168
|
+
const hostname = new URL(locator).hostname.toLowerCase();
|
|
169
|
+
return hostname === "localhost" || hostname === "127.0.0.1" || hostname === "::1" || hostname === "[::1]";
|
|
170
|
+
} catch {
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
var getRemoteEntries = (options = {}) => {
|
|
175
|
+
const storage = options.storage ?? defaultStorage();
|
|
176
|
+
const key = options.key ?? DEFAULT_KEY;
|
|
177
|
+
return getPersistedRemotePlugins(storage, key);
|
|
178
|
+
};
|
|
179
|
+
var normalizePluginExport = (mod) => {
|
|
180
|
+
const exported = mod.default;
|
|
181
|
+
if (isPlugin(exported)) {
|
|
182
|
+
return exported;
|
|
183
|
+
}
|
|
184
|
+
if (typeof exported === "function") {
|
|
185
|
+
const result = exported();
|
|
186
|
+
if (isPlugin(result)) {
|
|
187
|
+
return result;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
throw new Error("Remote module default export is not a Plugin or a zero-arg plugin factory.");
|
|
191
|
+
};
|
|
192
|
+
var loadStylesheets = (manifest, cache) => Effect3.gen(function* () {
|
|
193
|
+
if (typeof document === "undefined") {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
const cssUrls = manifest.assetUrls.filter((url) => url.endsWith(".css"));
|
|
197
|
+
for (const url of cssUrls) {
|
|
198
|
+
const resolved = yield* cache.resolve(manifest.id, url);
|
|
199
|
+
if (document.querySelector(`link[data-dxos-plugin-id="${manifest.id}"][href="${resolved}"]`)) {
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
const link = document.createElement("link");
|
|
203
|
+
link.rel = "stylesheet";
|
|
204
|
+
link.href = resolved;
|
|
205
|
+
link.dataset.dxosPluginId = manifest.id;
|
|
206
|
+
document.head.appendChild(link);
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
var loadFromManifest = (manifestUrl, cache) => Effect3.gen(function* () {
|
|
210
|
+
log.info("loading remote plugin", {
|
|
211
|
+
manifestUrl
|
|
212
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 119, S: this });
|
|
213
|
+
const manifest = yield* fetchManifest(manifestUrl).pipe(Effect3.mapError((cause) => new RemotePluginLoadError({
|
|
214
|
+
context: {
|
|
215
|
+
locator: manifestUrl,
|
|
216
|
+
reason: "manifest-error"
|
|
217
|
+
},
|
|
218
|
+
cause
|
|
219
|
+
})));
|
|
220
|
+
const cachedUrls = manifest.assetUrls.indexOf(manifestUrl) === -1 ? [
|
|
221
|
+
manifestUrl,
|
|
222
|
+
...manifest.assetUrls
|
|
223
|
+
] : manifest.assetUrls;
|
|
224
|
+
const wrapCacheError = Effect3.mapError((cause) => new RemotePluginLoadError({
|
|
225
|
+
context: {
|
|
226
|
+
locator: manifestUrl,
|
|
227
|
+
reason: "cache-error"
|
|
228
|
+
},
|
|
229
|
+
cause
|
|
230
|
+
}));
|
|
231
|
+
yield* cache.cache(manifest.id, cachedUrls).pipe(wrapCacheError);
|
|
232
|
+
const entryUrl = yield* cache.resolve(manifest.id, manifest.entryUrl).pipe(wrapCacheError);
|
|
233
|
+
const mod = yield* Effect3.tryPromise({
|
|
234
|
+
try: () => import(
|
|
235
|
+
/* @vite-ignore */
|
|
236
|
+
entryUrl
|
|
237
|
+
),
|
|
238
|
+
catch: (cause) => new RemotePluginLoadError({
|
|
239
|
+
context: {
|
|
240
|
+
locator: manifestUrl,
|
|
241
|
+
reason: "import-failed"
|
|
242
|
+
},
|
|
243
|
+
cause
|
|
244
|
+
})
|
|
245
|
+
});
|
|
246
|
+
const plugin = normalizePluginExport(mod);
|
|
247
|
+
if (!plugin.meta.id || !plugin.meta.name) {
|
|
248
|
+
return yield* Effect3.fail(new RemotePluginLoadError({
|
|
249
|
+
context: {
|
|
250
|
+
locator: manifestUrl,
|
|
251
|
+
reason: "meta-missing"
|
|
252
|
+
}
|
|
253
|
+
}));
|
|
254
|
+
}
|
|
255
|
+
if (plugin.meta.id !== manifest.id) {
|
|
256
|
+
return yield* Effect3.fail(new RemotePluginLoadError({
|
|
257
|
+
context: {
|
|
258
|
+
locator: manifestUrl,
|
|
259
|
+
reason: "meta-mismatch",
|
|
260
|
+
metaId: plugin.meta.id,
|
|
261
|
+
manifestId: manifest.id
|
|
262
|
+
}
|
|
263
|
+
}));
|
|
264
|
+
}
|
|
265
|
+
yield* loadStylesheets(manifest, cache).pipe(wrapCacheError);
|
|
266
|
+
return {
|
|
267
|
+
plugin,
|
|
268
|
+
manifest
|
|
269
|
+
};
|
|
270
|
+
});
|
|
271
|
+
var preload = (options = {}) => Effect3.gen(function* () {
|
|
272
|
+
const storage = options.storage ?? defaultStorage();
|
|
273
|
+
const key = options.key ?? DEFAULT_KEY;
|
|
274
|
+
const cache = options.cache ?? noop();
|
|
275
|
+
const entries = getPersistedRemotePlugins(storage, key);
|
|
276
|
+
if (entries.length === 0) {
|
|
277
|
+
return [];
|
|
278
|
+
}
|
|
279
|
+
log.info("preloading remote plugins", {
|
|
280
|
+
count: entries.length
|
|
281
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 196, S: this });
|
|
282
|
+
const results = yield* Effect3.all(entries.map((entry) => loadFromManifest(entry.url, cache).pipe(Effect3.tapError((error) => Effect3.sync(() => log.warn("failed to preload remote plugin", {
|
|
283
|
+
entry,
|
|
284
|
+
error
|
|
285
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 199, S: this }))), Effect3.option)), {
|
|
286
|
+
concurrency: "unbounded"
|
|
287
|
+
});
|
|
288
|
+
return results.flatMap((result) => Option.match(result, {
|
|
289
|
+
onNone: () => [],
|
|
290
|
+
onSome: ({ plugin }) => [
|
|
291
|
+
plugin
|
|
292
|
+
]
|
|
293
|
+
}));
|
|
294
|
+
});
|
|
295
|
+
var make = (builtinPlugins, options = {}) => {
|
|
296
|
+
const storage = options.storage ?? defaultStorage();
|
|
297
|
+
const key = options.key ?? DEFAULT_KEY;
|
|
298
|
+
const cache = options.cache ?? noop();
|
|
299
|
+
return (locator) => Effect3.gen(function* () {
|
|
300
|
+
const builtin = builtinPlugins.find((plugin2) => plugin2.meta.id === locator);
|
|
301
|
+
if (builtin) {
|
|
302
|
+
return builtin;
|
|
303
|
+
}
|
|
304
|
+
if (!isUrl(locator)) {
|
|
305
|
+
return yield* Effect3.fail(new RemotePluginLoadError({
|
|
306
|
+
context: {
|
|
307
|
+
locator,
|
|
308
|
+
reason: "invalid-locator"
|
|
309
|
+
}
|
|
310
|
+
}));
|
|
311
|
+
}
|
|
312
|
+
const { plugin } = yield* loadFromManifest(locator, cache);
|
|
313
|
+
const duplicate = builtinPlugins.find((existing) => existing.meta.id === plugin.meta.id);
|
|
314
|
+
if (duplicate) {
|
|
315
|
+
return yield* Effect3.fail(new RemotePluginLoadError({
|
|
316
|
+
context: {
|
|
317
|
+
locator,
|
|
318
|
+
reason: "duplicate-id",
|
|
319
|
+
id: plugin.meta.id
|
|
320
|
+
}
|
|
321
|
+
}));
|
|
322
|
+
}
|
|
323
|
+
persistRemotePlugin(storage, key, {
|
|
324
|
+
id: plugin.meta.id,
|
|
325
|
+
url: locator
|
|
326
|
+
});
|
|
327
|
+
return plugin;
|
|
328
|
+
});
|
|
329
|
+
};
|
|
330
|
+
var uninstall = (pluginId, options = {}) => Effect3.gen(function* () {
|
|
331
|
+
const storage = options.storage ?? defaultStorage();
|
|
332
|
+
const key = options.key ?? DEFAULT_KEY;
|
|
333
|
+
const cache = options.cache ?? noop();
|
|
334
|
+
removePersistedRemotePlugin(storage, key, pluginId);
|
|
335
|
+
if (typeof document !== "undefined") {
|
|
336
|
+
document.querySelectorAll(`link[data-dxos-plugin-id="${pluginId}"]`).forEach((node) => node.remove());
|
|
337
|
+
}
|
|
338
|
+
yield* cache.evict(pluginId).pipe(Effect3.tapError((error) => Effect3.sync(() => log.warn("failed to evict plugin assets", {
|
|
339
|
+
pluginId,
|
|
340
|
+
error
|
|
341
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 268, S: this }))), Effect3.ignore);
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
export {
|
|
345
|
+
plugin_asset_cache_exports,
|
|
346
|
+
plugin_manifest_exports,
|
|
347
|
+
RemotePluginLoadError,
|
|
348
|
+
isLocalUrl,
|
|
349
|
+
getRemoteEntries,
|
|
350
|
+
preload,
|
|
351
|
+
make,
|
|
352
|
+
uninstall,
|
|
353
|
+
url_loader_exports
|
|
354
|
+
};
|
|
355
|
+
//# sourceMappingURL=chunk-KLDFWTG3.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/core/url-loader.ts", "../../../src/core/plugin-asset-cache.ts", "../../../src/core/plugin-manifest.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Option from 'effect/Option';\n\nimport { BaseError } from '@dxos/errors';\nimport { log } from '@dxos/log';\n\nimport * as Plugin from './plugin';\nimport * as PluginAssetCache from './plugin-asset-cache';\nimport * as PluginManifest from './plugin-manifest';\n\nconst DEFAULT_KEY = 'org.dxos.composer.remote-plugins';\n\n/**\n * Tagged error for any failure during remote plugin loading. Construction sites\n * set `context.locator` and `context.reason` (one of `'invalid-locator' |\n * 'manifest-error' | 'cache-error' | 'import-failed' | 'meta-missing' |\n * 'meta-mismatch' | 'duplicate-id'`) so handlers can route on the failure mode.\n */\nexport class RemotePluginLoadError extends BaseError.extend('RemotePluginLoadError', 'Failed to load remote plugin') {}\n\n/**\n * Abstraction over key-value storage (defaults to localStorage).\n */\nexport type Storage = {\n get(key: string): string | null;\n set(key: string, value: string): void;\n};\n\n/**\n * Options for configuring the URL loader.\n */\nexport type Options = {\n storage?: Storage;\n key?: string;\n /**\n * Per-platform offline asset cache. Defaults to a no-op cache (no offline support).\n */\n cache?: PluginAssetCache.Cache;\n};\n\n/**\n * Persisted record of a remote plugin that has been loaded previously.\n *\n * `url` is the URL of the plugin manifest (`plugin.json`), not the entry module.\n */\nexport type RemotePluginEntry = {\n id: string;\n url: string;\n};\n\nconst defaultStorage = (): Storage => ({\n get: (key) => localStorage.getItem(key),\n set: (key, value) => localStorage.setItem(key, value),\n});\n\nconst getPersistedRemotePlugins = (storage: Storage, key: string): RemotePluginEntry[] => {\n try {\n const parsed: unknown = JSON.parse(storage.get(key) ?? '[]');\n if (!Array.isArray(parsed)) {\n return [];\n }\n return parsed.filter(\n (entry): entry is RemotePluginEntry =>\n typeof entry === 'object' && entry !== null && typeof entry.id === 'string' && typeof entry.url === 'string',\n );\n } catch {\n return [];\n }\n};\n\nconst persistRemotePlugin = (storage: Storage, key: string, entry: RemotePluginEntry): void => {\n try {\n const entries = getPersistedRemotePlugins(storage, key).filter((existing) => existing.id !== entry.id);\n entries.push(entry);\n storage.set(key, JSON.stringify(entries));\n } catch (error) {\n log.warn('failed to persist remote plugin entry', { entry, error });\n }\n};\n\nconst removePersistedRemotePlugin = (storage: Storage, key: string, pluginId: string): void => {\n try {\n const entries = getPersistedRemotePlugins(storage, key).filter((existing) => existing.id !== pluginId);\n storage.set(key, JSON.stringify(entries));\n } catch (error) {\n log.warn('failed to remove remote plugin entry', { pluginId, error });\n }\n};\n\nconst isUrl = (locator: string): boolean => {\n try {\n const url = new URL(locator);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n};\n\n/**\n * Returns true when the URL's hostname is the local host (localhost, 127.0.0.1, or ::1).\n */\nexport const isLocalUrl = (locator: string): boolean => {\n try {\n const hostname = new URL(locator).hostname.toLowerCase();\n // WHATWG URL returns '::1' without brackets in Node; some browsers return '[::1]'.\n return hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '::1' || hostname === '[::1]';\n } catch {\n return false;\n }\n};\n\n/**\n * Returns the list of remote plugin entries previously persisted by {@link make}.\n * Useful for UI code that needs to know which loaded plugins were installed from a URL\n * (e.g. to surface a tag on remote or localhost-hosted plugins).\n */\nexport const getRemoteEntries = (options: Options = {}): readonly RemotePluginEntry[] => {\n const storage = options.storage ?? defaultStorage();\n const key = options.key ?? DEFAULT_KEY;\n return getPersistedRemotePlugins(storage, key);\n};\n\nconst normalizePluginExport = (mod: Record<string, unknown>): Plugin.Plugin => {\n const exported = mod.default;\n if (Plugin.isPlugin(exported)) {\n return exported;\n }\n if (typeof exported === 'function') {\n const result = (exported as () => unknown)();\n if (Plugin.isPlugin(result)) {\n return result;\n }\n }\n throw new Error('Remote module default export is not a Plugin or a zero-arg plugin factory.');\n};\n\n/**\n * Loads stylesheets declared in the manifest by appending `<link rel=\"stylesheet\">` elements to the host document.\n * Each link is tagged with `data-dxos-plugin-id` so `uninstall` can clean them up.\n */\nconst loadStylesheets = (\n manifest: PluginManifest.ResolvedManifest,\n cache: PluginAssetCache.Cache,\n): Effect.Effect<void, PluginAssetCache.PluginAssetCacheError> =>\n Effect.gen(function* () {\n if (typeof document === 'undefined') {\n return;\n }\n const cssUrls = manifest.assetUrls.filter((url) => url.endsWith('.css'));\n for (const url of cssUrls) {\n const resolved = yield* cache.resolve(manifest.id, url);\n if (document.querySelector(`link[data-dxos-plugin-id=\"${manifest.id}\"][href=\"${resolved}\"]`)) {\n continue;\n }\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = resolved;\n link.dataset.dxosPluginId = manifest.id;\n document.head.appendChild(link);\n }\n });\n\nconst loadFromManifest = (\n manifestUrl: string,\n cache: PluginAssetCache.Cache,\n): Effect.Effect<{ plugin: Plugin.Plugin; manifest: PluginManifest.ResolvedManifest }, RemotePluginLoadError> =>\n Effect.gen(function* () {\n log.info('loading remote plugin', { manifestUrl });\n const manifest = yield* PluginManifest.fetchManifest(manifestUrl).pipe(\n Effect.mapError(\n (cause) => new RemotePluginLoadError({ context: { locator: manifestUrl, reason: 'manifest-error' }, cause }),\n ),\n );\n // Cache the manifest URL alongside its declared assets. Without it, `preload` on a\n // subsequent reload would fetch the manifest from the network — and fail when the\n // plugin's host is offline, dropping the plugin from the runtime.\n const cachedUrls =\n manifest.assetUrls.indexOf(manifestUrl) === -1 ? [manifestUrl, ...manifest.assetUrls] : manifest.assetUrls;\n const wrapCacheError = Effect.mapError(\n (cause: PluginAssetCache.PluginAssetCacheError) =>\n new RemotePluginLoadError({ context: { locator: manifestUrl, reason: 'cache-error' }, cause }),\n );\n yield* cache.cache(manifest.id, cachedUrls).pipe(wrapCacheError);\n const entryUrl = yield* cache.resolve(manifest.id, manifest.entryUrl).pipe(wrapCacheError);\n const mod = yield* Effect.tryPromise({\n try: () => import(/* @vite-ignore */ entryUrl),\n catch: (cause) =>\n new RemotePluginLoadError({ context: { locator: manifestUrl, reason: 'import-failed' }, cause }),\n });\n const plugin = normalizePluginExport(mod);\n if (!plugin.meta.id || !plugin.meta.name) {\n return yield* Effect.fail(\n new RemotePluginLoadError({ context: { locator: manifestUrl, reason: 'meta-missing' } }),\n );\n }\n if (plugin.meta.id !== manifest.id) {\n return yield* Effect.fail(\n new RemotePluginLoadError({\n context: {\n locator: manifestUrl,\n reason: 'meta-mismatch',\n metaId: plugin.meta.id,\n manifestId: manifest.id,\n },\n }),\n );\n }\n // Append stylesheets only after the entry imports cleanly and meta validation\n // passes. If we did this earlier and the import or meta checks failed, the\n // `<link>` tags would leak into the host DOM with no plugin to own their\n // teardown — `uninstall` only runs for plugins the manager actually accepted.\n yield* loadStylesheets(manifest, cache).pipe(wrapCacheError);\n return { plugin, manifest };\n });\n\n/**\n * Preloads previously persisted remote plugins from storage. Per-entry failures\n * are logged and swallowed — the returned effect always succeeds with whichever\n * plugins loaded cleanly, so a single bad entry can't block the host's startup.\n */\nexport const preload = (options: Options = {}): Effect.Effect<Plugin.Plugin[], never> =>\n Effect.gen(function* () {\n const storage = options.storage ?? defaultStorage();\n const key = options.key ?? DEFAULT_KEY;\n const cache = options.cache ?? PluginAssetCache.noop();\n\n const entries = getPersistedRemotePlugins(storage, key);\n if (entries.length === 0) {\n return [];\n }\n log.info('preloading remote plugins', { count: entries.length });\n const results = yield* Effect.all(\n entries.map((entry) =>\n loadFromManifest(entry.url, cache).pipe(\n Effect.tapError((error) => Effect.sync(() => log.warn('failed to preload remote plugin', { entry, error }))),\n Effect.option,\n ),\n ),\n { concurrency: 'unbounded' },\n );\n return results.flatMap((result) =>\n Option.match(result, {\n onNone: () => [],\n onSome: ({ plugin }) => [plugin],\n }),\n );\n });\n\n/**\n * Creates a plugin loader that resolves built-in plugins by ID or loads remote plugins from URLs.\n *\n * Remote URLs must point at a plugin manifest (`plugin.json`). The loader fetches the manifest,\n * eagerly persists every declared asset via the configured `PluginAssetCache`, then dynamic-imports\n * the entry module.\n */\nexport const make = (builtinPlugins: Plugin.Plugin[], options: Options = {}) => {\n const storage = options.storage ?? defaultStorage();\n const key = options.key ?? DEFAULT_KEY;\n const cache = options.cache ?? PluginAssetCache.noop();\n\n return (locator: string): Effect.Effect<Plugin.Plugin, RemotePluginLoadError> =>\n Effect.gen(function* () {\n const builtin = builtinPlugins.find((plugin) => plugin.meta.id === locator);\n if (builtin) {\n return builtin;\n }\n if (!isUrl(locator)) {\n return yield* Effect.fail(new RemotePluginLoadError({ context: { locator, reason: 'invalid-locator' } }));\n }\n const { plugin } = yield* loadFromManifest(locator, cache);\n const duplicate = builtinPlugins.find((existing) => existing.meta.id === plugin.meta.id);\n if (duplicate) {\n return yield* Effect.fail(\n new RemotePluginLoadError({ context: { locator, reason: 'duplicate-id', id: plugin.meta.id } }),\n );\n }\n persistRemotePlugin(storage, key, { id: plugin.meta.id, url: locator });\n return plugin;\n });\n};\n\n/**\n * Removes a previously installed remote plugin: drops the persisted entry, evicts cached\n * assets, and removes any stylesheet `<link>` tags that {@link loadFromManifest} appended.\n *\n * Cache eviction failures are logged and swallowed — the persisted entry has already been\n * dropped so the user-visible state is consistent regardless of whether the platform\n * cache cooperated.\n */\nexport const uninstall = (pluginId: string, options: Options = {}): Effect.Effect<void, never> =>\n Effect.gen(function* () {\n const storage = options.storage ?? defaultStorage();\n const key = options.key ?? DEFAULT_KEY;\n const cache = options.cache ?? PluginAssetCache.noop();\n\n removePersistedRemotePlugin(storage, key, pluginId);\n if (typeof document !== 'undefined') {\n document.querySelectorAll(`link[data-dxos-plugin-id=\"${pluginId}\"]`).forEach((node) => node.remove());\n }\n yield* cache.evict(pluginId).pipe(\n Effect.tapError((error) => Effect.sync(() => log.warn('failed to evict plugin assets', { pluginId, error }))),\n Effect.ignore,\n );\n });\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { BaseError } from '@dxos/errors';\n\n/**\n * Tagged error for cache operations. Construction sites supply `context.operation`\n * (one of `'cache' | 'evict' | 'resolve' | 'list'`) and `context.pluginId` so\n * downstream handlers can route on the failed call without scanning the message.\n */\nexport class PluginAssetCacheError extends BaseError.extend(\n 'PluginAssetCacheError',\n 'Plugin asset cache operation failed',\n) {}\n\n/**\n * Per-platform offline cache for third-party plugin assets.\n *\n * Implementations live alongside their platform glue (composer-app's\n * `asset-cache/{tauri,service-worker}.ts`); the no-op default is for tests\n * and unsupported environments.\n */\nexport interface Cache {\n /**\n * Persist all listed URLs under the namespace of `pluginId`. Idempotent.\n * The order of `urls` is significant — the first entry is treated as the entry module.\n */\n cache(pluginId: string, urls: readonly string[]): Effect.Effect<void, PluginAssetCacheError>;\n\n /**\n * Drop all assets for a plugin (uninstall).\n */\n evict(pluginId: string): Effect.Effect<void, PluginAssetCacheError>;\n\n /**\n * Resolves a plugin asset URL to a platform-specific cached URL when one is available.\n * Returns the original URL when no cached copy exists or the platform serves cached\n * responses transparently (e.g. service worker fetch interception on web).\n */\n resolve(pluginId: string, url: string): Effect.Effect<string, PluginAssetCacheError>;\n\n /**\n * List currently cached plugin ids (diagnostic).\n */\n list(): Effect.Effect<readonly string[], PluginAssetCacheError>;\n}\n\n/**\n * No-op implementation. Used when no platform cache is registered (tests, unsupported environments).\n * Plugins still load — they just have no offline guarantee.\n */\nexport const noop = (): Cache => ({\n cache: () => Effect.void,\n evict: () => Effect.void,\n resolve: (_pluginId, url) => Effect.succeed(url),\n list: () => Effect.succeed([] as readonly string[]),\n});\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport * as FetchHttpClient from '@effect/platform/FetchHttpClient';\nimport * as HttpClient from '@effect/platform/HttpClient';\nimport * as HttpClientRequest from '@effect/platform/HttpClientRequest';\nimport * as HttpClientResponse from '@effect/platform/HttpClientResponse';\nimport * as Effect from 'effect/Effect';\nimport * as Schema from 'effect/Schema';\n\nimport { BaseError } from '@dxos/errors';\nimport { PLUGIN_ENTRY_FILENAME } from '@dxos/protocols';\n\n/**\n * Tagged error for manifest fetch / parse failures. Construction sites set\n * `context.manifestUrl` and `context.reason` (one of `'fetch-failed' |\n * 'http-error' | 'parse-failed' | 'invalid'`) so handlers can route on the\n * specific failure mode.\n */\nexport class PluginManifestError extends BaseError.extend('PluginManifestError', 'Plugin manifest is invalid') {}\n\n/**\n * Schema for a third-party plugin manifest.\n *\n * The manifest is published as a sibling of the plugin's entry module\n * ({@link PLUGIN_ENTRY_FILENAME}) and advertises every file the plugin needs at\n * runtime so the host can eagerly cache them for offline use.\n */\nexport const Manifest = Schema.Struct({\n id: Schema.String,\n name: Schema.String,\n version: Schema.String,\n assets: Schema.Array(Schema.String),\n});\n\nexport type Manifest = Schema.Schema.Type<typeof Manifest>;\n\n/**\n * Resolved manifest with all asset paths converted to absolute URLs.\n */\nexport type ResolvedManifest = {\n id: string;\n name: string;\n version: string;\n entryUrl: string;\n assetUrls: readonly string[];\n};\n\n/**\n * Resolves a parsed manifest's relative asset paths against the manifest's URL.\n */\nconst resolve = (manifestUrl: string, manifest: Manifest): ResolvedManifest => ({\n id: manifest.id,\n name: manifest.name,\n version: manifest.version,\n entryUrl: new URL(PLUGIN_ENTRY_FILENAME, manifestUrl).toString(),\n assetUrls: manifest.assets.map((asset) => new URL(asset, manifestUrl).toString()),\n});\n\n/**\n * Synchronous decode + validate + resolve for an in-memory manifest payload. Used\n * by tests and tooling that have the manifest body already loaded; the runtime\n * path goes through {@link fetchManifest}.\n */\nexport const parse = (manifestUrl: string, payload: unknown): ResolvedManifest => {\n const manifest = Schema.decodeUnknownSync(Manifest)(payload);\n if (!manifest.assets.includes(PLUGIN_ENTRY_FILENAME)) {\n throw new Error(`Manifest at ${manifestUrl} does not list ${PLUGIN_ENTRY_FILENAME} in assets.`);\n }\n return resolve(manifestUrl, manifest);\n};\n\n/**\n * Fetches and parses a manifest from the given URL via Effect's HTTP client and\n * Schema-driven JSON decoding. All failure modes surface as a single tagged\n * {@link PluginManifestError}; callers route on `error.context.reason`.\n */\nexport const fetchManifest = (manifestUrl: string): Effect.Effect<ResolvedManifest, PluginManifestError> =>\n Effect.gen(function* () {\n const response = yield* HttpClientRequest.get(manifestUrl).pipe(\n HttpClient.execute,\n Effect.mapError((cause) => new PluginManifestError({ context: { manifestUrl, reason: 'fetch-failed' }, cause })),\n );\n if (response.status >= 400) {\n return yield* Effect.fail(\n new PluginManifestError({ context: { manifestUrl, reason: 'http-error', status: response.status } }),\n );\n }\n const manifest = yield* HttpClientResponse.schemaBodyJson(Manifest)(response).pipe(\n Effect.mapError((cause) => new PluginManifestError({ context: { manifestUrl, reason: 'parse-failed' }, cause })),\n );\n if (!manifest.assets.includes(PLUGIN_ENTRY_FILENAME)) {\n return yield* Effect.fail(\n new PluginManifestError({\n context: { manifestUrl, reason: 'invalid' },\n cause: `assets does not include ${PLUGIN_ENTRY_FILENAME}`,\n }),\n );\n }\n return resolve(manifestUrl, manifest);\n }).pipe(Effect.scoped, Effect.provide(FetchHttpClient.layer));\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;AAAA;;;;;;;;;AAIA,YAAYA,aAAY;AACxB,YAAYC,YAAY;AAExB,SAASC,aAAAA,kBAAiB;AAC1B,SAASC,WAAW;;;ACRpB;;;;;AAIA,YAAYC,YAAY;AAExB,SAASC,iBAAiB;AAOnB,IAAMC,wBAAN,cAAoCD,UAAUE,OACnD,yBACA,qCAAA,EAAA;AACC;AAsCI,IAAMC,OAAO,OAAc;EAChCC,OAAO,MAAaC;EACpBC,OAAO,MAAaD;EACpBE,SAAS,CAACC,WAAWC,QAAeC,eAAQD,GAAAA;EAC5CE,MAAM,MAAaD,eAAQ,CAAA,CAAE;AAC/B;;;AC3DA;;;;;;;AAIA,YAAYE,qBAAqB;AACjC,YAAYC,gBAAgB;AAC5B,YAAYC,uBAAuB;AACnC,YAAYC,wBAAwB;AACpC,YAAYC,aAAY;AACxB,YAAYC,YAAY;AAExB,SAASC,aAAAA,kBAAiB;AAC1B,SAASC,6BAA6B;AAQ/B,IAAMC,sBAAN,cAAkCF,WAAUG,OAAO,uBAAuB,4BAAA,EAAA;AAA+B;AASzG,IAAMC,WAAkBC,cAAO;EACpCC,IAAWC;EACXC,MAAaD;EACbE,SAAgBF;EAChBG,QAAeC,aAAaJ,aAAM;AACpC,CAAA;AAkBA,IAAMK,UAAU,CAACC,aAAqBC,cAA0C;EAC9ER,IAAIQ,SAASR;EACbE,MAAMM,SAASN;EACfC,SAASK,SAASL;EAClBM,UAAU,IAAIC,IAAIf,uBAAuBY,WAAAA,EAAaI,SAAQ;EAC9DC,WAAWJ,SAASJ,OAAOS,IAAI,CAACC,UAAU,IAAIJ,IAAII,OAAOP,WAAAA,EAAaI,SAAQ,CAAA;AAChF;AAOO,IAAMI,QAAQ,CAACR,aAAqBS,YAAAA;AACzC,QAAMR,WAAkBS,yBAAkBnB,QAAAA,EAAUkB,OAAAA;AACpD,MAAI,CAACR,SAASJ,OAAOc,SAASvB,qBAAAA,GAAwB;AACpD,UAAM,IAAIwB,MAAM,eAAeZ,WAAAA,kBAA6BZ,qBAAAA,aAAkC;EAChG;AACA,SAAOW,QAAQC,aAAaC,QAAAA;AAC9B;AAOO,IAAMY,gBAAgB,CAACb,gBACrBc,YAAI,aAAA;AACT,QAAMC,WAAW,OAAyBC,sBAAIhB,WAAAA,EAAaiB,KAC9CC,oBACJC,iBAAS,CAACC,UAAU,IAAI/B,oBAAoB;IAAEgC,SAAS;MAAErB;MAAasB,QAAQ;IAAe;IAAGF;EAAM,CAAA,CAAA,CAAA;AAE/G,MAAIL,SAASQ,UAAU,KAAK;AAC1B,WAAO,OAAcC,aACnB,IAAInC,oBAAoB;MAAEgC,SAAS;QAAErB;QAAasB,QAAQ;QAAcC,QAAQR,SAASQ;MAAO;IAAE,CAAA,CAAA;EAEtG;AACA,QAAMtB,WAAW,OAA0BwB,kCAAelC,QAAAA,EAAUwB,QAAAA,EAAUE,KACrEE,iBAAS,CAACC,UAAU,IAAI/B,oBAAoB;IAAEgC,SAAS;MAAErB;MAAasB,QAAQ;IAAe;IAAGF;EAAM,CAAA,CAAA,CAAA;AAE/G,MAAI,CAACnB,SAASJ,OAAOc,SAASvB,qBAAAA,GAAwB;AACpD,WAAO,OAAcoC,aACnB,IAAInC,oBAAoB;MACtBgC,SAAS;QAAErB;QAAasB,QAAQ;MAAU;MAC1CF,OAAO,2BAA2BhC,qBAAAA;IACpC,CAAA,CAAA;EAEJ;AACA,SAAOW,QAAQC,aAAaC,QAAAA;AAC9B,CAAA,EAAGgB,KAAYS,gBAAeC,gBAAwBC,qBAAK,CAAA;;;AFvF7D,IAAA,eAAMC;;AAwCAC,IAAAA,wBAAAA,cAAiCC,WAAA,OAAA,yBAAA,8BAAA,EAAA;;qBAE1BC,OAAUC;EACvB,KAAA,CAAA,QAAA,aAAA,QAAA,GAAA;EAEMC,KAAAA,CAAAA,KAAAA,UAAAA,aAA6BC,QAAkBC,KAAAA,KAAAA;AACnD;gCACqCD,CAAAA,SAAQE,QAAID;MAC/C;UACE,SAAS,KAAA,MAAA,QAAA,IAAA,GAAA,KAAA,IAAA;AACX,QAAA,CAAA,MAAA,QAAA,MAAA,GAAA;AACA,aAAOE,CAAAA;IAIP;AACA,WAAO,OAAE,OAAA,CAAA,UAAA,OAAA,UAAA,YAAA,UAAA,QAAA,OAAA,MAAA,OAAA,YAAA,OAAA,MAAA,QAAA,QAAA;EACX,QAAA;AACF,WAAA,CAAA;EAEA;;0BAEoBJ,CAAAA,SAAAA,KAAAA,UAA0BC;MAC1CI;AACAJ,UAAAA,UAAYC,0BAAoBG,SAAAA,GAAAA,EAAAA,OAAAA,CAAAA,aAAAA,SAAAA,OAAAA,MAAAA,EAAAA;AAChC,YAAOC,KAAO,KAAA;AACdC,YAAQ,IAAC,KAAA,KAAA,UAAA,OAAA,CAAA;WAA2CC,OAAAA;QAAOF,KAAAA,yCAAAA;MAAM;MACnE;IACF,GAAA,EAAA,YAAA,YAAA,GAAA,cAAA,GAAA,IAAA,GAAA,OAAA,CAAA;EAEA;;kCAEoBN,CAAAA,SAAAA,KAA0BC,aAASC;MACnDD;AACA,UAAOK,UAAO,0BAAA,SAAA,GAAA,EAAA,OAAA,CAAA,aAAA,SAAA,OAAA,QAAA;AACdC,YAAQ,IAAC,KAAA,KAAA,UAAA,OAAA,CAAA;WAA0CE,OAAAA;QAAUH,KAAAA,wCAAAA;MAAM;MACrE;IACF,GAAA,EAAA,YAAA,YAAA,GAAA,cAAA,GAAA,IAAA,GAAA,OAAA,CAAA;EAEA;;YAEUI,CAAAA,YAAUC;MAChB;AACA,UAAM,MAAA,IAAA,IAAA,OAAA;AACN,WAAO,IAAA,aAAA,WAAA,IAAA,aAAA;EACT,QAAA;AACF,WAAA;EAEA;;AAKI,IAAMC,aAAeD,CAAAA,YAAIE;MACzB;AACA,UAAA,WAAOD,IAAa,IAAA,OAAA,EAAA,SAAeA,YAAa;AAEhD,WAAO,aAAA,eAAA,aAAA,eAAA,aAAA,SAAA,aAAA;EACT,QAAA;AACA,WAAA;EAEF;;AAOQV,IAAMY,mBAAenB,CAAAA,UAAAA,CAAAA,MAAAA;AAC3B,QAAA,UAAOK,QAAAA,WAA0BC,eAASC;AAC1C,QAAA,MAAA,QAAA,OAAA;AAEF,SAAMa,0BAAyBC,SAAAA,GAAAA;;IAE7B,wBAAoBC,CAAAA,QAAW;QAC7B,WAAOA,IAAAA;AACT,MAAA,SAAA,QAAA,GAAA;AACI,WAAOA;;MAET,OAAIC,aAAgBC,YAAS;UAC3B,SAAOA,SAAAA;AACT,QAAA,SAAA,MAAA,GAAA;AACF,aAAA;IACA;EACF;AAEA,QAAA,IAAA,MAAA,4EAAA;;sBAUM,CAAA,UAAA,UAAA,YAAA,aAAA;AACF,MAAA,OAAA,aAAA,aAAA;AACA;EACA;QACE,UAAMC,SAAW,UAAaC,OAAQC,CAAAA,QAAAA,IAAW,SAAEZ,MAAAA,CAAAA;aAC/Ca,OAASC,SAAAA;UACX,WAAA,OAAA,MAAA,QAAA,SAAA,IAAA,GAAA;AACF,QAAA,SAAA,cAAA,6BAAA,SAAA,EAAA,YAAA,QAAA,IAAA,GAAA;AACA;IACAC;AACAA,UAAKC,OAAON,SAAAA,cAAAA,MAAAA;AACZK,SAAKE,MAAAA;AACLJ,SAAAA,OAASK;AACX,SAAA,QAAA,eAAA,SAAA;AACF,aAAA,KAAA,YAAA,IAAA;EAEIC;;uBAKkCC,CAAAA,aAAAA,UAAAA,YAAAA,aAAAA;AAAY,MAAA,KAAA,yBAAA;IAChD;mBAE2CC,YAAS,GAAA,cAAA,GAAA,KAAA,GAAA,KAAA,CAAA;mBAAElB,OAASiB,cAAAA,WAAAA,EAAAA,KAAAA,iBAAAA,CAAAA,UAAAA,IAAAA,sBAAAA;aAAaE;MAAyB,SAAA;MAAGC,QAAAA;IAAM;IAG9G;EACA,CAAA,CAAA,CAAA;qBAG6EC,SAAS,UAAA,QAAA,WAAA,MAAA,KAAA;IAAIZ;IAC1F,GAAMa,SAAAA;eAE0BJ;yBAAoBD,iBAAAA,CAAAA,UAAAA,IAAAA,sBAAAA;aAAaE;MAAsB,SAAA;MAAGC,QAAAA;IAAM;IAEzFG;EACP,CAAA,CAAMC;AACN,SAAMrB,MAAM,MAAOsB,SAAOC,IAAAA,UAAW,EAAA,KAAA,cAAA;QACnCC,WAAW,OAAO,MAAA,QAAgB,SAAGH,IAAAA,SAAAA,QAAAA,EAAAA,KAAAA,cAAAA;QACrCI,MAAQR,OACFS,mBAAAA;eAAwBX;;MAAS;;sBAAElB,IAAAA,sBAASiB;eAAaE;QAAwB,SAAA;QAAGC,QAAAA;MAAM;MAClG;IACMU,CAAAA;EACN,CAAA;QACE,SAAO,sBACDD,GAAAA;cAAwBX,KAAS,MAAA,CAAA,OAAA,KAAA,MAAA;kBAAWD,aAAAA,IAAAA,sBAAAA;eAAaE;QAAuB,SAAA;QAAE,QAAA;MAE1F;IACIW,CAAAA,CAAAA;;aAGEZ,KAAAA,OAAS,SAAA,IAAA;kBACED,aAAAA,IAAAA,sBAAAA;eACTE;QACAY,SAAQD;QACRE,QAAAA;QACF,QAAA,OAAA,KAAA;QACF,YAAA,SAAA;MAEJ;IACA,CAAA,CAAA;EACA;SAISF,gBAAAA,UAAAA,KAAAA,EAAAA,KAAAA,cAAAA;SAAQrB;IAAS;IAC5B;EAEF;;AAQI,IAAMpB,UAAMY,CAAQZ,UAAOP,CAAAA,MAAAA,YAAAA,aAAAA;AAC3B,QAAMyC,UAAQtB,QAAQsB,WAASU,eAAiBC;AAEhD,QAAM1C,MAAAA,QAAUL,OAAAA;AAChB,QAAIK,QAAQ2C,QAAM,SAAQ,KAAA;QACxB,UAAS,0BAAA,SAAA,GAAA;AACX,MAAA,QAAA,WAAA,GAAA;AACIC,WAAK,CAAA;;AAAqD,MAAA,KAAA,6BAAA;IAC9D,OAAMC,QAAU;+BAGiF1C,GAAAA,cAAAA,GAAAA,KAAAA,GAAAA,KAAAA,CAAAA;kBAAOF,OAAAA,YAAAA,QAAAA,IAAAA,CAAAA,UAAAA,iBAAAA,MAAAA,KAAAA,KAAAA,EAAAA,KAAAA,iBAAAA,CAAAA,UAAAA,aAAAA,MAAAA,IAAAA,KAAAA,mCAAAA;IAAM;IAI1G6C;EAAyB,GAAA,EAAA,YAAA,YAAA,GAAA,cAAA,GAAA,KAAA,GAAA,KAAA,CAAA,CAAA,CAAA,GAAA,cAAA,CAAA,GAAA;IAE7B,aAAeC;;iBAGXC,QAAWV,CAAAA,WAAa,aAAA,QAAA;YAACA,MAAAA,CAAAA;YAAO,CAAA,EAAA,OAAA,MAAA;MAClC;IAED;EAEL,CAAA,CAAA;;AASQzC,IAAMY,OAAQZ,CAAAA,gBAAOP,UAAAA,CAAAA,MAAAA;AAC3B,QAAMyC,UAAQtB,QAAQsB,WAASU,eAAiBC;AAEhD,QAAA,MAAQlC,QACNyB,OAAOgB;gBACCC,QAAAA,SAA+BZ,KAAAA;UACrC,YAAa,YAAA,aAAA;UACX,UAAOY,eAAAA,KAAAA,CAAAA,YAAAA,QAAAA,KAAAA,OAAAA,OAAAA;AACT,QAAA,SAAA;AACI,aAAO1C;;eAC6CkB,OAAS,GAAA;oBAAElB,aAAAA,IAAAA,sBAAAA;iBAASmB;UAA0B;UAAE,QAAA;QACxG;MACA,CAAA,CAAM;IACN;AACA,UAAIwB,EAAAA,OAAW,IAAA,OAAA,iBAAA,SAAA,KAAA;UACb,YAAclB,eACZ,KAAII,CAAAA,aAAAA,SAAsB,KAAA,OAAA,OAAA,KAAA,EAAA;mBAAEX;oBAAWlB,aAAAA,IAAAA,sBAAAA;iBAASmB;UAAwByB;UAAmB,QAAA;UAAE,IAAA,OAAA,KAAA;QAEjG;MACAC,CAAAA,CAAAA;;wBAA6D7C,SAAAA,KAAAA;MAAQ,IAAA,OAAA,KAAA;MACrE,KAAO8B;IACT,CAAA;AACF,WAAA;EAEF,CAAA;;AAWI,IAAMzC,YAAcA,CAAAA,UAAOP,UAAAA,CAAAA,MAAAA,YAAAA,aAAAA;AAC3B,QAAMyC,UAAQtB,QAAQsB,WAASU,eAAiBC;AAEhDY,QAAAA,MAAAA,QAAAA,OAAAA;AACA,QAAI,QAAOpC,QAAAA,SAA0B,KAAA;8BAC1BqC,SAAkB,KAAA,QAAA;AAC7B,MAAA,OAAA,aAAA,aAAA;AACA,aAAaC,iBAAgBC,6BACAxB,QAAOyB,IAAK,EAAA,QAAUC,CAAAA,SAAK,KAAA,OAAA,CAAA;;eAA6C1D,MAAAA,QAAAA,EAAAA,KAAAA,iBAAAA,CAAAA,UAAAA,aAAAA,MAAAA,IAAAA,KAAAA,iCAAAA;IAAM;IAG1G;;;",
|
|
6
|
+
"names": ["Effect", "Option", "BaseError", "log", "Effect", "BaseError", "PluginAssetCacheError", "extend", "noop", "cache", "void", "evict", "resolve", "_pluginId", "url", "succeed", "list", "FetchHttpClient", "HttpClient", "HttpClientRequest", "HttpClientResponse", "Effect", "Schema", "BaseError", "PLUGIN_ENTRY_FILENAME", "PluginManifestError", "extend", "Manifest", "Struct", "id", "String", "name", "version", "assets", "Array", "resolve", "manifestUrl", "manifest", "entryUrl", "URL", "toString", "assetUrls", "map", "asset", "parse", "payload", "decodeUnknownSync", "includes", "Error", "fetchManifest", "gen", "response", "get", "pipe", "execute", "mapError", "cause", "context", "reason", "status", "fail", "schemaBodyJson", "scoped", "provide", "layer", "DEFAULT_KEY", "defaultStorage", "BaseError", "value", "localStorage", "getPersistedRemotePlugins", "storage", "key", "get", "parsed", "entries", "error", "log", "entry", "pluginId", "url", "URL", "hostname", "locator", "options", "normalizePluginExport", "mod", "exported", "Plugin", "result", "resolved", "resolve", "manifest", "document", "querySelector", "link", "href", "dataset", "head", "loadFromManifest", "manifestUrl", "context", "reason", "cause", "assetUrls", "wrapCacheError", "cache", "entryUrl", "Effect", "tryPromise", "try", "catch", "RemotePluginLoadError", "plugin", "metaId", "manifestId", "PluginAssetCache", "noop", "length", "info", "results", "concurrency", "flatMap", "onSome", "gen", "builtin", "duplicate", "id", "persistRemotePlugin", "removePersistedRemotePlugin", "querySelectorAll", "evict", "pipe", "sync", "warn"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
capability_exports
|
|
4
|
+
} from "./chunk-TC5FX6VR.mjs";
|
|
5
|
+
|
|
6
|
+
// src/common/translations.ts
|
|
7
|
+
import * as Schema from "effect/Schema";
|
|
8
|
+
var Label = Schema.Union(Schema.String, Schema.mutable(Schema.Tuple(Schema.String, Schema.mutable(Schema.Struct({
|
|
9
|
+
ns: Schema.String,
|
|
10
|
+
count: Schema.optional(Schema.Number),
|
|
11
|
+
defaultValue: Schema.optional(Schema.String)
|
|
12
|
+
})))));
|
|
13
|
+
|
|
14
|
+
// src/common/operations.ts
|
|
15
|
+
import * as Schema2 from "effect/Schema";
|
|
16
|
+
import { Operation } from "@dxos/compute";
|
|
17
|
+
var UNDO_NAMESPACE = "org.dxos.app-framework.undo";
|
|
18
|
+
(function(UndoOperation2) {
|
|
19
|
+
UndoOperation2.ShowUndo = Operation.make({
|
|
20
|
+
meta: {
|
|
21
|
+
key: `${UNDO_NAMESPACE}.operation.show-undo`,
|
|
22
|
+
name: "Show Undo",
|
|
23
|
+
description: "Show an undo toast notification."
|
|
24
|
+
},
|
|
25
|
+
executionMode: "sync",
|
|
26
|
+
services: [
|
|
27
|
+
capability_exports.Service
|
|
28
|
+
],
|
|
29
|
+
input: Schema2.Struct({
|
|
30
|
+
message: Schema2.optional(Label.annotations({
|
|
31
|
+
description: "The message to display in the undo toast."
|
|
32
|
+
}))
|
|
33
|
+
}),
|
|
34
|
+
output: Schema2.Void
|
|
35
|
+
});
|
|
36
|
+
})(UndoOperation || (UndoOperation = {}));
|
|
37
|
+
var UndoOperation;
|
|
38
|
+
|
|
39
|
+
export {
|
|
40
|
+
Label,
|
|
41
|
+
UndoOperation
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=chunk-MEX6YYWJ.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/common/translations.ts", "../../../src/common/operations.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\n/**\n * A Label represents translatable text - either a simple string or a tuple of [key, options].\n */\nexport const Label = Schema.Union(\n Schema.String,\n Schema.mutable(\n Schema.Tuple(\n Schema.String,\n Schema.mutable(\n Schema.Struct({\n ns: Schema.String,\n count: Schema.optional(Schema.Number),\n defaultValue: Schema.optional(Schema.String),\n }),\n ),\n ),\n ),\n);\nexport type Label = Schema.Schema.Type<typeof Label>;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { Operation } from '@dxos/compute';\n\nimport { Capability } from '../core';\nimport { Label } from './translations';\n\nconst UNDO_NAMESPACE = 'org.dxos.app-framework.undo';\n\n/**\n * Operations related to undo/history functionality.\n */\nexport namespace UndoOperation {\n /**\n * Show an undo toast notification.\n * Fired by HistoryTracker when an undoable operation is tracked.\n */\n export const ShowUndo = Operation.make({\n meta: {\n key: `${UNDO_NAMESPACE}.operation.show-undo`,\n name: 'Show Undo',\n description: 'Show an undo toast notification.',\n },\n executionMode: 'sync',\n services: [Capability.Service],\n input: Schema.Struct({\n message: Schema.optional(Label.annotations({ description: 'The message to display in the undo toast.' })),\n }),\n output: Schema.Void,\n });\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;AAIA,YAAYA,YAAY;AAKjB,IAAMC,QAAeC,aACnBC,eACAC,eACEC,aACEF,eACAC,eACEE,cAAO;EACZC,IAAWJ;EACXK,OAAcC,gBAAgBC,aAAM;EACpCC,cAAqBF,gBAAgBN,aAAM;AAC7C,CAAA,CAAA,CAAA,CAAA,CAAA;;;ACfR,YAAYS,aAAY;AAExB,SAASC,iBAAiB;AAK1B,IAAMC,iBAAiB;UAKNC,gBAAAA;iBAKFC,WAAWC,UAAUC,KAAK;IACrCC,MAAM;MACJC,KAAK,GAAGN,cAAAA;MACRO,MAAM;MACNC,aAAa;IACf;IACAC,eAAe;IACfC,UAAU;MAACC,mBAAWC;;IACtBC,OAAcC,eAAO;MACnBC,SAAgBC,iBAASC,MAAMC,YAAY;QAAEV,aAAa;MAA4C,CAAA,CAAA;IACxG,CAAA;IACAW,QAAeC;EACjB,CAAA;AACF,GAlBiBnB,kBAAAA,gBAAAA,CAAAA,EAAAA;;",
|
|
6
|
+
"names": ["Schema", "Label", "Union", "String", "mutable", "Tuple", "Struct", "ns", "count", "optional", "Number", "defaultValue", "Schema", "Operation", "UNDO_NAMESPACE", "UndoOperation", "ShowUndo", "Operation", "make", "meta", "key", "name", "description", "executionMode", "services", "Capability", "Service", "input", "Struct", "message", "optional", "Label", "annotations", "output", "Void"]
|
|
7
|
+
}
|