@dxos/app-framework 0.8.4-main.fd6878d → 0.8.4-staging.60fe92afc8
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/LICENSE +102 -5
- package/README.md +1 -1
- package/dist/lib/browser/capability-BOPAKKWG.mjs +35 -0
- package/dist/lib/browser/capability-BOPAKKWG.mjs.map +7 -0
- package/dist/lib/browser/chunk-5GY3YOEL.mjs +28 -0
- package/dist/lib/browser/chunk-5GY3YOEL.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-CO3XLNUX.mjs +95 -0
- package/dist/lib/browser/chunk-CO3XLNUX.mjs.map +7 -0
- package/dist/lib/browser/chunk-DC3WRPBV.mjs +227 -0
- package/dist/lib/browser/chunk-DC3WRPBV.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-FO3IYSLV.mjs +68 -0
- package/dist/lib/browser/chunk-FO3IYSLV.mjs.map +7 -0
- package/dist/lib/browser/chunk-HFLKXMT7.mjs +587 -0
- package/dist/lib/browser/chunk-HFLKXMT7.mjs.map +7 -0
- package/dist/lib/browser/chunk-IW44C7UL.mjs +83 -0
- package/dist/lib/browser/chunk-IW44C7UL.mjs.map +7 -0
- package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/browser/chunk-KZUDO43J.mjs +422 -0
- package/dist/lib/browser/chunk-KZUDO43J.mjs.map +7 -0
- package/dist/lib/browser/chunk-Q2GLJTVV.mjs +12 -0
- package/dist/lib/browser/chunk-Q2GLJTVV.mjs.map +7 -0
- package/dist/lib/browser/chunk-SYXIYT6T.mjs +143 -0
- package/dist/lib/browser/chunk-SYXIYT6T.mjs.map +7 -0
- package/dist/lib/browser/chunk-XHS5KDNX.mjs +1471 -0
- package/dist/lib/browser/chunk-XHS5KDNX.mjs.map +7 -0
- package/dist/lib/browser/chunk-Y66ELD4U.mjs +476 -0
- package/dist/lib/browser/chunk-Y66ELD4U.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 +20 -0
- package/dist/lib/browser/common/capabilities.mjs +56 -0
- package/dist/lib/browser/core/activation-event.mjs +20 -0
- package/dist/lib/browser/core/capability.mjs +32 -0
- package/dist/lib/browser/core/capability.mjs.map +7 -0
- package/dist/lib/browser/core/plugin-manager.mjs +19 -0
- package/dist/lib/browser/core/plugin-manager.mjs.map +7 -0
- package/dist/lib/browser/core/plugin.mjs +41 -0
- package/dist/lib/browser/core/plugin.mjs.map +7 -0
- package/dist/lib/browser/core/url-loader.mjs +24 -0
- package/dist/lib/browser/core/url-loader.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +85 -157
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/process-manager-capability-GXNUO7AR.mjs +132 -0
- package/dist/lib/browser/process-manager-capability-GXNUO7AR.mjs.map +7 -0
- package/dist/lib/browser/testing/index.mjs +321 -56
- 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 +52 -0
- package/dist/lib/browser/ui/index.mjs.map +7 -0
- package/dist/lib/node-esm/capability-KZWRTX7R.mjs +36 -0
- package/dist/lib/node-esm/capability-KZWRTX7R.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-A5CHGAZE.mjs +588 -0
- package/dist/lib/node-esm/chunk-A5CHGAZE.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-COHOWGGJ.mjs +144 -0
- package/dist/lib/node-esm/chunk-COHOWGGJ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-CTKEZHKF.mjs +84 -0
- package/dist/lib/node-esm/chunk-CTKEZHKF.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-FPW45EZH.mjs +14 -0
- package/dist/lib/node-esm/chunk-FPW45EZH.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-FSVGKTF6.mjs +477 -0
- package/dist/lib/node-esm/chunk-FSVGKTF6.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-KFZEB6BV.mjs +29 -0
- package/dist/lib/node-esm/chunk-KFZEB6BV.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-NULBHQYS.mjs +96 -0
- package/dist/lib/node-esm/chunk-NULBHQYS.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-SX5NVETP.mjs +1472 -0
- package/dist/lib/node-esm/chunk-SX5NVETP.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-WK7OIQKI.mjs +70 -0
- package/dist/lib/node-esm/chunk-WK7OIQKI.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-XGBUKRCK.mjs +423 -0
- package/dist/lib/node-esm/chunk-XGBUKRCK.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-XIGPWXCQ.mjs +228 -0
- package/dist/lib/node-esm/chunk-XIGPWXCQ.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/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 +21 -0
- package/dist/lib/node-esm/common/activation-events.mjs.map +7 -0
- package/dist/lib/node-esm/common/capabilities.mjs +57 -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 +33 -0
- package/dist/lib/node-esm/core/capability.mjs.map +7 -0
- package/dist/lib/node-esm/core/plugin-manager.mjs +20 -0
- package/dist/lib/node-esm/core/plugin-manager.mjs.map +7 -0
- package/dist/lib/node-esm/core/plugin.mjs +42 -0
- package/dist/lib/node-esm/core/plugin.mjs.map +7 -0
- package/dist/lib/node-esm/core/url-loader.mjs +25 -0
- package/dist/lib/node-esm/core/url-loader.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +85 -157
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/process-manager-capability-TX5TA6YN.mjs +133 -0
- package/dist/lib/node-esm/process-manager-capability-TX5TA6YN.mjs.map +7 -0
- package/dist/lib/node-esm/testing/index.mjs +321 -56
- 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 +53 -0
- package/dist/lib/node-esm/ui/index.mjs.map +7 -0
- package/dist/plugin/node-esm/index.mjs +977 -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 +37 -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 +24 -0
- package/dist/types/src/common/activation-events.d.ts.map +1 -0
- package/dist/types/src/common/annotations.d.ts +1 -0
- package/dist/types/src/common/annotations.d.ts.map +1 -0
- package/dist/types/src/common/capabilities.d.ts +214 -195
- package/dist/types/src/common/capabilities.d.ts.map +1 -1
- package/dist/types/src/common/index.d.ts +3 -8
- package/dist/types/src/common/index.d.ts.map +1 -1
- 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 +52 -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 +161 -0
- package/dist/types/src/core/capability.d.ts.map +1 -0
- package/dist/types/src/core/edge-registry-plugin-provider.d.ts +30 -0
- package/dist/types/src/core/edge-registry-plugin-provider.d.ts.map +1 -0
- package/dist/types/src/core/index.d.ts +11 -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 +297 -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 +101 -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 +308 -41
- package/dist/types/src/core/plugin.d.ts.map +1 -1
- package/dist/types/src/core/registry.d.ts +107 -0
- package/dist/types/src/core/registry.d.ts.map +1 -0
- package/dist/types/src/core/url-loader.d.ts +127 -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 +2 -4
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/plugin-process-manager/ProcessManagerPlugin.d.ts +3 -0
- package/dist/types/src/plugin-process-manager/ProcessManagerPlugin.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/history/capability.d.ts +7 -0
- package/dist/types/src/plugin-process-manager/history/capability.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/history/errors.d.ts +32 -0
- package/dist/types/src/plugin-process-manager/history/errors.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/history/history-tracker.d.ts +32 -0
- package/dist/types/src/plugin-process-manager/history/history-tracker.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/history/history-tracker.test.d.ts +2 -0
- package/dist/types/src/plugin-process-manager/history/history-tracker.test.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/history/index.d.ts +6 -0
- package/dist/types/src/plugin-process-manager/history/index.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/history/types.d.ts +13 -0
- package/dist/types/src/plugin-process-manager/history/types.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/history/undo-mapping.d.ts +101 -0
- package/dist/types/src/plugin-process-manager/history/undo-mapping.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/history/undo-registry.d.ts +23 -0
- package/dist/types/src/plugin-process-manager/history/undo-registry.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/history/undo-registry.test.d.ts +2 -0
- package/dist/types/src/plugin-process-manager/history/undo-registry.test.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/idb-key-value-store.d.ts +10 -0
- package/dist/types/src/plugin-process-manager/idb-key-value-store.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/index.d.ts +3 -0
- package/dist/types/src/plugin-process-manager/index.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/meta.d.ts +3 -0
- package/dist/types/src/plugin-process-manager/meta.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/process-manager-capability.d.ts +8 -0
- package/dist/types/src/plugin-process-manager/process-manager-capability.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/testing.d.ts +59 -0
- package/dist/types/src/plugin-process-manager/testing.d.ts.map +1 -0
- package/dist/types/src/testing/harness.d.ts +79 -0
- package/dist/types/src/testing/harness.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +3 -0
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/testing/operationCapture.d.ts +64 -0
- package/dist/types/src/testing/operationCapture.d.ts.map +1 -0
- 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 +9 -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 +41 -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/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 +4 -0
- package/dist/types/src/ui/components/index.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/index.d.ts +7 -0
- package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useApp.d.ts +80 -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/useProcessManagerRuntime.d.ts +30 -0
- package/dist/types/src/ui/hooks/useProcessManagerRuntime.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/index.d.ts +2 -0
- package/dist/types/src/vite-plugin/boot-loader/index.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/boot-loader/loader.d.ts +59 -0
- package/dist/types/src/vite-plugin/boot-loader/loader.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 +28 -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 +41 -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 +125 -55
- package/src/cli/cli.ts +102 -0
- package/src/{playground/layout → cli}/index.ts +1 -1
- package/src/common/activation-events.ts +39 -0
- package/src/{playground/debug/index.ts → common/annotations.ts} +0 -2
- package/src/common/capabilities.ts +287 -184
- package/src/common/index.ts +3 -8
- 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 +154 -0
- package/src/core/capability-manager.ts +213 -0
- package/src/core/capability.ts +254 -0
- package/src/core/edge-registry-plugin-provider.ts +92 -0
- package/src/core/index.ts +11 -4
- package/src/core/plugin-asset-cache.ts +60 -0
- package/src/core/plugin-manager.test.ts +1929 -0
- package/src/core/plugin-manager.ts +1696 -0
- package/src/core/plugin-manifest.test.ts +75 -0
- package/src/core/plugin-manifest.ts +134 -0
- package/src/core/plugin.ts +458 -46
- package/src/core/registry.ts +163 -0
- package/src/core/url-loader.test.ts +222 -0
- package/src/core/url-loader.ts +388 -0
- package/src/index.ts +2 -4
- package/src/plugin-process-manager/ProcessManagerPlugin.ts +24 -0
- package/src/plugin-process-manager/history/capability.ts +36 -0
- package/src/plugin-process-manager/history/errors.ts +7 -0
- package/src/plugin-process-manager/history/history-tracker.test.ts +353 -0
- package/src/plugin-process-manager/history/history-tracker.ts +144 -0
- package/src/plugin-process-manager/history/index.ts +9 -0
- package/src/plugin-process-manager/history/types.ts +17 -0
- package/src/plugin-process-manager/history/undo-mapping.ts +135 -0
- package/src/plugin-process-manager/history/undo-registry.test.ts +74 -0
- package/src/plugin-process-manager/history/undo-registry.ts +54 -0
- package/src/plugin-process-manager/idb-key-value-store.ts +64 -0
- package/src/plugin-process-manager/index.ts +6 -0
- package/src/plugin-process-manager/meta.ts +16 -0
- package/src/plugin-process-manager/process-manager-capability.ts +178 -0
- package/src/plugin-process-manager/testing.ts +156 -0
- package/src/testing/harness.ts +247 -0
- package/src/testing/index.ts +3 -0
- package/src/testing/operationCapture.ts +144 -0
- package/src/testing/react.test.tsx +50 -0
- package/src/testing/react.tsx +113 -0
- package/src/testing/service.ts +52 -0
- package/src/testing/withPluginManager.stories.tsx +15 -13
- package/src/testing/withPluginManager.tsx +81 -56
- package/src/ui/components/App/App.stories.tsx +84 -0
- package/src/ui/components/App/App.tsx +144 -0
- package/src/{playground/logger → ui/components/App}/index.ts +1 -1
- package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +179 -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 +106 -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 +290 -0
- package/src/ui/components/index.ts +7 -0
- package/src/ui/hooks/index.ts +10 -0
- package/src/ui/hooks/useApp.test.tsx +161 -0
- package/src/ui/hooks/useApp.tsx +404 -0
- package/src/ui/hooks/useCapabilities.ts +68 -0
- package/src/ui/hooks/useLoading.tsx +76 -0
- package/src/ui/hooks/useProcessManagerRuntime.ts +78 -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.solid-stories.tsx +198 -0
- package/src/vite-plugin/boot-loader/index.ts +5 -0
- package/src/vite-plugin/boot-loader/loader-app/Loader.tsx +166 -0
- package/src/vite-plugin/boot-loader/loader-app/boot-loader.css +311 -0
- package/src/vite-plugin/boot-loader/loader-app/bridge.ts +25 -0
- package/src/vite-plugin/boot-loader/loader-app/entry.tsx +21 -0
- package/src/vite-plugin/boot-loader/loader-app/mount.tsx +70 -0
- package/src/vite-plugin/boot-loader/loader-app/store.test.ts +137 -0
- package/src/vite-plugin/boot-loader/loader-app/store.ts +149 -0
- package/src/vite-plugin/boot-loader/loader-app/tsconfig.json +11 -0
- package/src/vite-plugin/boot-loader/loader-app/types.ts +78 -0
- package/src/vite-plugin/boot-loader/loader.ts +204 -0
- package/src/vite-plugin/composer/index.ts +306 -0
- package/src/vite-plugin/import-map/index.ts +527 -0
- package/src/vite-plugin/index.ts +10 -0
- package/src/vite-plugin/manifest.test.ts +55 -0
- package/src/vite-plugin/manifest.ts +63 -0
- package/src/vite-plugin/packages.ts +187 -0
- package/tsconfig.json +31 -24
- package/tsconfig.node.json +2 -4
- package/typedoc.json +2 -4
- package/vitest.config.ts +8 -6
- package/.swc/plugins/v7_linux_x86_64_13.0.0/c614d7475354583212fbd7669acbae95b9832c305bf51bdaabe2e6de05abb6bf +0 -0
- package/.swc/plugins/v7_linux_x86_64_13.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429 +0 -0
- package/dist/lib/browser/app-graph-builder-MOVKFH3J.mjs +0 -137
- package/dist/lib/browser/app-graph-builder-MOVKFH3J.mjs.map +0 -7
- package/dist/lib/browser/chunk-NKCIDYDI.mjs +0 -1598
- package/dist/lib/browser/chunk-NKCIDYDI.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/chunk-OSBZFKMO.mjs +0 -428
- package/dist/lib/browser/chunk-OSBZFKMO.mjs.map +0 -7
- package/dist/lib/browser/intent-dispatcher-FTTJLVGN.mjs +0 -11
- package/dist/lib/browser/intent-resolver-ZCGEAG3E.mjs +0 -39
- package/dist/lib/browser/intent-resolver-ZCGEAG3E.mjs.map +0 -7
- package/dist/lib/browser/store-3QB6Q2BC.mjs +0 -30
- package/dist/lib/browser/store-3QB6Q2BC.mjs.map +0 -7
- package/dist/lib/browser/worker.mjs +0 -79
- package/dist/lib/node-esm/app-graph-builder-ODE4B5GT.mjs +0 -138
- package/dist/lib/node-esm/app-graph-builder-ODE4B5GT.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-WU3QN5B6.mjs +0 -429
- package/dist/lib/node-esm/chunk-WU3QN5B6.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-YEN7NKTF.mjs +0 -1600
- package/dist/lib/node-esm/chunk-YEN7NKTF.mjs.map +0 -7
- package/dist/lib/node-esm/intent-dispatcher-YQIQ55LJ.mjs +0 -12
- package/dist/lib/node-esm/intent-resolver-KG27L7EQ.mjs +0 -40
- package/dist/lib/node-esm/intent-resolver-KG27L7EQ.mjs.map +0 -7
- package/dist/lib/node-esm/store-TIJAVO3D.mjs +0 -31
- package/dist/lib/node-esm/store-TIJAVO3D.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 -126
- 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 -30
- 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 -284
- package/src/common/collaboration.ts +0 -21
- package/src/common/events.ts +0 -79
- 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 -255
- package/src/core/manager.test.ts +0 -516
- package/src/core/manager.ts +0 -597
- 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 -47
- 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 -30
- package/src/playground/logger/plugin.ts +0 -37
- package/src/playground/logger/schema.ts +0 -12
- package/src/playground/playground.stories.tsx +0 -43
- package/src/plugin-intent/IntentPlugin.ts +0 -21
- 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 -334
- package/src/plugin-intent/intent.ts +0 -154
- package/src/plugin-settings/SettingsPlugin.ts +0 -36
- package/src/plugin-settings/actions.ts +0 -29
- package/src/plugin-settings/app-graph-builder.ts +0 -158
- package/src/plugin-settings/index.ts +0 -6
- package/src/plugin-settings/intent-resolver.ts +0 -35
- package/src/plugin-settings/store.ts +0 -33
- package/src/plugin-settings/translations.ts +0 -19
- package/src/react/ErrorBoundary.tsx +0 -54
- package/src/react/IntentContext.tsx +0 -35
- package/src/react/Surface.stories.tsx +0 -97
- package/src/react/Surface.tsx +0 -78
- package/src/react/common.ts +0 -13
- package/src/react/index.ts +0 -10
- package/src/react/useCapabilities.ts +0 -31
- package/src/react/useIntentResolver.ts +0 -22
- package/src/worker.ts +0 -11
- /package/dist/lib/browser/{intent-dispatcher-FTTJLVGN.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
- /package/dist/lib/browser/{worker.mjs.map → common/activation-events.mjs.map} +0 -0
- /package/dist/lib/{node-esm/intent-dispatcher-YQIQ55LJ.mjs.map → browser/common/capabilities.mjs.map} +0 -0
- /package/dist/lib/{node-esm/worker.mjs.map → browser/core/activation-event.mjs.map} +0 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { describe, test } from 'vitest';
|
|
6
|
+
|
|
7
|
+
import { DXN } from '@dxos/keys';
|
|
8
|
+
|
|
9
|
+
import { Compute, HalveCompute } from '../testing';
|
|
10
|
+
import * as UndoMapping from './undo-mapping';
|
|
11
|
+
import * as UndoRegistry from './undo-registry';
|
|
12
|
+
|
|
13
|
+
describe('UndoRegistry', () => {
|
|
14
|
+
test('looks up undo mapping by operation key', ({ expect }) => {
|
|
15
|
+
const undoMapping = UndoMapping.make({
|
|
16
|
+
operation: Compute,
|
|
17
|
+
inverse: HalveCompute,
|
|
18
|
+
deriveContext: (_input, output) => ({ value: output.value }),
|
|
19
|
+
});
|
|
20
|
+
const registry = UndoRegistry.make(() => [undoMapping]);
|
|
21
|
+
|
|
22
|
+
const result = registry.lookup(Compute);
|
|
23
|
+
expect(result).not.toBe(undefined);
|
|
24
|
+
expect(result?.inverse.meta.key).toBe(DXN.make('org.dxos.test.halveCompute'));
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test('returns undefined for unmapped operations', ({ expect }) => {
|
|
28
|
+
const registry = UndoRegistry.make(() => []);
|
|
29
|
+
|
|
30
|
+
const result = registry.lookup(Compute);
|
|
31
|
+
expect(result).toBe(undefined);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test('deriveContext extracts correct undo input', ({ expect }) => {
|
|
35
|
+
const undoMapping = UndoMapping.make({
|
|
36
|
+
operation: Compute,
|
|
37
|
+
inverse: HalveCompute,
|
|
38
|
+
// Note: This tests that input and output types are inferred correctly.
|
|
39
|
+
deriveContext: (input, output) => ({ value: output.value + input.value }),
|
|
40
|
+
});
|
|
41
|
+
const registry = UndoRegistry.make(() => [undoMapping]);
|
|
42
|
+
|
|
43
|
+
const result = registry.lookup(Compute);
|
|
44
|
+
const context = result?.deriveContext({ value: 5 }, { value: 10 });
|
|
45
|
+
expect(context).toEqual({ value: 15 });
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
describe('resolveMessage', () => {
|
|
50
|
+
test('returns undefined for undefined message', ({ expect }) => {
|
|
51
|
+
const result = UndoMapping.resolveMessage(undefined, { value: 1 }, { value: 2 });
|
|
52
|
+
expect(result).toBe(undefined);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test('returns static label as-is', ({ expect }) => {
|
|
56
|
+
const staticMessage: [string, { ns: string }] = ['test.message', { ns: 'test' }];
|
|
57
|
+
const result = UndoMapping.resolveMessage(staticMessage, { value: 1 }, { value: 2 });
|
|
58
|
+
expect(result).toEqual(staticMessage);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test('calls function message with input and output', ({ expect }) => {
|
|
62
|
+
const messageFunc = (input: { value: number }, output: { value: number }): [string, { ns: string }] => [
|
|
63
|
+
`input-${input.value}-output-${output.value}`,
|
|
64
|
+
{ ns: 'test' },
|
|
65
|
+
];
|
|
66
|
+
const result = UndoMapping.resolveMessage(messageFunc, { value: 5 }, { value: 10 });
|
|
67
|
+
expect(result).toEqual(['input-5-output-10', { ns: 'test' }]);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test('returns string label as-is', ({ expect }) => {
|
|
71
|
+
const result = UndoMapping.resolveMessage('simple string', { value: 1 }, { value: 2 });
|
|
72
|
+
expect(result).toBe('simple string');
|
|
73
|
+
});
|
|
74
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import type { Operation } from '@dxos/compute';
|
|
6
|
+
|
|
7
|
+
import type * as UndoMapping from './undo-mapping';
|
|
8
|
+
|
|
9
|
+
//
|
|
10
|
+
// Public Interface
|
|
11
|
+
//
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Lookup result from UndoRegistry.
|
|
15
|
+
*/
|
|
16
|
+
export type UndoMappingResult = {
|
|
17
|
+
inverse: Operation.Definition<any, any>;
|
|
18
|
+
/** Returns undefined to indicate the operation is not undoable. */
|
|
19
|
+
deriveContext: (input: any, output: any) => any | undefined;
|
|
20
|
+
/** Message provider - may be a static Label or a function. */
|
|
21
|
+
message?: UndoMapping.MessageProvider<Operation.Definition<any, any>>;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* UndoRegistry interface - looks up inverse operations.
|
|
26
|
+
*/
|
|
27
|
+
export interface UndoRegistry {
|
|
28
|
+
lookup: (operation: Operation.Definition<any, any>) => UndoMappingResult | undefined;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
//
|
|
32
|
+
// Factory
|
|
33
|
+
//
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Creates an UndoRegistry that looks up inverse operations.
|
|
37
|
+
*/
|
|
38
|
+
export const make = (getMappings: () => UndoMapping.UndoMapping[]): UndoRegistry => {
|
|
39
|
+
const lookup = (operation: Operation.Definition<any, any>): UndoMappingResult | undefined => {
|
|
40
|
+
const mappings = getMappings();
|
|
41
|
+
const mapping = mappings.find((m) => m.operation.meta.key === operation.meta.key);
|
|
42
|
+
if (!mapping) {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
inverse: mapping.inverse,
|
|
48
|
+
deriveContext: mapping.deriveContext,
|
|
49
|
+
message: mapping.message,
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
return { lookup };
|
|
54
|
+
};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as PlatformError from '@effect/platform/Error';
|
|
6
|
+
import * as KeyValueStore from '@effect/platform/KeyValueStore';
|
|
7
|
+
import * as Effect from 'effect/Effect';
|
|
8
|
+
import * as Layer from 'effect/Layer';
|
|
9
|
+
import * as Option from 'effect/Option';
|
|
10
|
+
import * as idb from 'idb-keyval';
|
|
11
|
+
|
|
12
|
+
const DB_NAME = 'dxos-process-manager';
|
|
13
|
+
const STORE_NAME = 'keyval';
|
|
14
|
+
|
|
15
|
+
const idbError = (method: string, key: string, cause: unknown) =>
|
|
16
|
+
new PlatformError.SystemError({
|
|
17
|
+
reason: 'Unknown',
|
|
18
|
+
module: 'KeyValueStore',
|
|
19
|
+
method,
|
|
20
|
+
pathOrDescriptor: key,
|
|
21
|
+
description: String(cause),
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* KeyValueStore layer backed by IndexedDB via idb-keyval.
|
|
26
|
+
* Uses a dedicated IDB database (dxos-process-manager) so process records
|
|
27
|
+
* survive page reloads without consuming the 5 MB localStorage quota.
|
|
28
|
+
* Falls back to an in-memory store in environments without IndexedDB (e.g. Node.js tests).
|
|
29
|
+
*/
|
|
30
|
+
export const layerIdb: Layer.Layer<KeyValueStore.KeyValueStore> =
|
|
31
|
+
typeof globalThis.indexedDB !== 'undefined'
|
|
32
|
+
? Layer.sync(KeyValueStore.KeyValueStore, () => {
|
|
33
|
+
const store = idb.createStore(DB_NAME, STORE_NAME);
|
|
34
|
+
return KeyValueStore.makeStringOnly({
|
|
35
|
+
get: (key) =>
|
|
36
|
+
Effect.tryPromise({
|
|
37
|
+
try: () => idb.get<string>(key, store).then(Option.fromNullable),
|
|
38
|
+
catch: (err) => idbError('get', key, err),
|
|
39
|
+
}),
|
|
40
|
+
|
|
41
|
+
set: (key, value) =>
|
|
42
|
+
Effect.tryPromise({
|
|
43
|
+
try: () => idb.set(key, value, store),
|
|
44
|
+
catch: (err) => idbError('set', key, err),
|
|
45
|
+
}),
|
|
46
|
+
|
|
47
|
+
remove: (key) =>
|
|
48
|
+
Effect.tryPromise({
|
|
49
|
+
try: () => idb.del(key, store),
|
|
50
|
+
catch: (err) => idbError('remove', key, err),
|
|
51
|
+
}),
|
|
52
|
+
|
|
53
|
+
clear: Effect.tryPromise({
|
|
54
|
+
try: () => idb.clear(store),
|
|
55
|
+
catch: (err) => idbError('clear', '', err),
|
|
56
|
+
}),
|
|
57
|
+
|
|
58
|
+
size: Effect.tryPromise({
|
|
59
|
+
try: () => idb.keys(store).then((ks) => ks.length),
|
|
60
|
+
catch: (err) => idbError('size', '', err),
|
|
61
|
+
}),
|
|
62
|
+
});
|
|
63
|
+
})
|
|
64
|
+
: KeyValueStore.layerMemory;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { DXN } from '@dxos/keys';
|
|
6
|
+
|
|
7
|
+
import { Plugin } from '../core';
|
|
8
|
+
|
|
9
|
+
export const meta = Plugin.makeMeta({
|
|
10
|
+
key: DXN.make('org.dxos.plugin.processManager'),
|
|
11
|
+
name: 'Process Manager Plugin',
|
|
12
|
+
author: 'DXOS',
|
|
13
|
+
description:
|
|
14
|
+
'Hosts the process-manager runtime that composes contributed layer specs into a service resolver, exposes the operation invoker built on top of it, and registers undo/history tracking.',
|
|
15
|
+
tags: ['system'],
|
|
16
|
+
});
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { Registry } from '@effect-atom/atom';
|
|
6
|
+
import * as Effect from 'effect/Effect';
|
|
7
|
+
import * as Layer from 'effect/Layer';
|
|
8
|
+
import * as ManagedRuntime from 'effect/ManagedRuntime';
|
|
9
|
+
|
|
10
|
+
import { LayerSpec, OperationHandlerSet, Process, ServiceResolver, Trace } from '@dxos/compute';
|
|
11
|
+
import { LayerStack, ProcessManager } from '@dxos/compute-runtime';
|
|
12
|
+
import { invariant } from '@dxos/invariant';
|
|
13
|
+
// Explicit import so the emitted `.d.ts` references the package via its public
|
|
14
|
+
// alias instead of a relative `node_modules` path (TS2883).
|
|
15
|
+
import { OperationInvoker } from '@dxos/operation';
|
|
16
|
+
|
|
17
|
+
import { ActivationEvents, Capabilities } from '../common';
|
|
18
|
+
import { Capability, Plugin } from '../core';
|
|
19
|
+
import { layerIdb } from './idb-key-value-store';
|
|
20
|
+
|
|
21
|
+
//
|
|
22
|
+
// Capability Module
|
|
23
|
+
//
|
|
24
|
+
// Hosts the {@link ProcessManager} runtime for the plugin system.
|
|
25
|
+
//
|
|
26
|
+
// Workflow:
|
|
27
|
+
// 1. Activates {@link ActivationEvents.SetupProcessManager} so plugins can
|
|
28
|
+
// contribute {@link Capabilities.LayerSpec} entries and
|
|
29
|
+
// {@link Capabilities.OperationHandler} sets.
|
|
30
|
+
// 2. Collects all contributed {@link LayerSpec.LayerSpec}s and builds a
|
|
31
|
+
// {@link LayerStack} whose {@link ServiceResolver} drives process-scoped
|
|
32
|
+
// service resolution.
|
|
33
|
+
// 3. Wires a reactive {@link OperationHandlerSet} that tracks
|
|
34
|
+
// {@link Capabilities.OperationHandler} contributions and invalidates its
|
|
35
|
+
// cached merge when new handlers register.
|
|
36
|
+
// 4. Composes the fixed runtime requirements (capability/plugin managers,
|
|
37
|
+
// service resolver, operation invoker, process manager) into a single
|
|
38
|
+
// {@link Layer} and builds a {@link ManagedRuntime} from it.
|
|
39
|
+
// 5. Exposes a disposable-less wrapper as {@link Capabilities.ProcessManagerRuntime}
|
|
40
|
+
// (the plugin system manages its lifecycle).
|
|
41
|
+
//
|
|
42
|
+
|
|
43
|
+
export default Capability.makeModule(
|
|
44
|
+
Effect.fnUntraced(function* () {
|
|
45
|
+
const capabilityManager = yield* Capability.Service;
|
|
46
|
+
const pluginManager = yield* Plugin.Service;
|
|
47
|
+
const atomRegistry = yield* Capability.get(Capabilities.AtomRegistry);
|
|
48
|
+
|
|
49
|
+
yield* Plugin.activate(ActivationEvents.SetupProcessManager);
|
|
50
|
+
|
|
51
|
+
const layerSpecs = yield* Capability.getAll(Capabilities.LayerSpec);
|
|
52
|
+
const traceSinkFactories = yield* Capability.getAll(Capabilities.TraceSink);
|
|
53
|
+
|
|
54
|
+
// Forward reference to `ProcessManager.ProcessManagerService`. The runtime
|
|
55
|
+
// that owns the manager depends transitively on `ServiceResolver` (which is
|
|
56
|
+
// built from the `LayerStack` below), so we cannot materialise it before
|
|
57
|
+
// the stack exists. Instead we publish the manager into this holder as
|
|
58
|
+
// soon as the runtime is built, and the ambient layer reads it lazily via
|
|
59
|
+
// `Layer.effect` — slice init only runs once a process actually triggers
|
|
60
|
+
// service resolution, by which point the holder is populated.
|
|
61
|
+
let processManagerHolder: ProcessManager.Manager | undefined;
|
|
62
|
+
|
|
63
|
+
// Expose the foundational app-framework services through the LayerStack so
|
|
64
|
+
// that operations declaring `services: [Capability.Service]` (and friends)
|
|
65
|
+
// can resolve them via the ServiceResolver. Without this, only consumers
|
|
66
|
+
// sitting on the same ManagedRuntime layer graph can see them — process
|
|
67
|
+
// executions go through ServiceResolver.resolveAll and would fail.
|
|
68
|
+
const ambientLayerSpec = LayerSpec.make(
|
|
69
|
+
{
|
|
70
|
+
affinity: 'application',
|
|
71
|
+
requires: [],
|
|
72
|
+
provides: [Capability.Service, Plugin.Service, Registry.AtomRegistry, ProcessManager.ProcessManagerService],
|
|
73
|
+
},
|
|
74
|
+
() =>
|
|
75
|
+
Layer.mergeAll(
|
|
76
|
+
Layer.succeed(Capability.Service, capabilityManager),
|
|
77
|
+
Layer.succeed(Plugin.Service, pluginManager),
|
|
78
|
+
Layer.succeed(Registry.AtomRegistry, atomRegistry),
|
|
79
|
+
Layer.effect(
|
|
80
|
+
ProcessManager.ProcessManagerService,
|
|
81
|
+
Effect.sync(() => {
|
|
82
|
+
invariant(
|
|
83
|
+
processManagerHolder,
|
|
84
|
+
'ProcessManagerService accessed before the process-manager runtime was initialised',
|
|
85
|
+
);
|
|
86
|
+
return processManagerHolder;
|
|
87
|
+
}),
|
|
88
|
+
),
|
|
89
|
+
),
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
const layerStack = new LayerStack.LayerStack({ layers: [ambientLayerSpec, ...layerSpecs] });
|
|
93
|
+
const serviceResolver = layerStack.getServiceResolver();
|
|
94
|
+
|
|
95
|
+
const handlerSet = OperationHandlerSet.reactive(
|
|
96
|
+
atomRegistry,
|
|
97
|
+
capabilityManager.atom(Capabilities.OperationHandler),
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
const traceSinks = traceSinkFactories.map((factory) => factory({ resolver: serviceResolver }));
|
|
101
|
+
const mergedTraceSink = Trace.mergeSinks(traceSinks);
|
|
102
|
+
|
|
103
|
+
// Base services required by ProcessManager and the operation invoker.
|
|
104
|
+
// Sensible defaults are provided here; plugins that want alternative
|
|
105
|
+
// implementations (e.g. persistent KV store, real tracing) can contribute
|
|
106
|
+
// their own LayerSpec entries against the ServiceResolver.
|
|
107
|
+
const baseLayer = Layer.mergeAll(
|
|
108
|
+
Layer.succeed(Capability.Service, capabilityManager),
|
|
109
|
+
Layer.succeed(Plugin.Service, pluginManager),
|
|
110
|
+
Layer.succeed(Registry.AtomRegistry, atomRegistry),
|
|
111
|
+
Layer.succeed(ServiceResolver.ServiceResolver, serviceResolver),
|
|
112
|
+
OperationHandlerSet.provide(handlerSet),
|
|
113
|
+
layerIdb,
|
|
114
|
+
Layer.succeed(Trace.TraceSink, mergedTraceSink),
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
const processManagerLayer = ProcessManager.layer({ runtimeName: Trace.CommonRuntimeName.local }).pipe(
|
|
118
|
+
Layer.provide(baseLayer),
|
|
119
|
+
);
|
|
120
|
+
const operationInvokerLayer = ProcessManager.ProcessOperationInvoker.layer.pipe(
|
|
121
|
+
Layer.provide(Layer.mergeAll(processManagerLayer, baseLayer)),
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
const runtimeLayer = Layer.mergeAll(baseLayer, processManagerLayer, operationInvokerLayer);
|
|
125
|
+
|
|
126
|
+
const managedRuntime = ManagedRuntime.make(runtimeLayer as Layer.Layer<any, any, never>);
|
|
127
|
+
|
|
128
|
+
// TODO(dmaretskyi): Capability modules don't currently expose a teardown
|
|
129
|
+
// hook (`makeModule` only allows `Service | Plugin.Service` in the effect's
|
|
130
|
+
// requirements, ruling out `Effect.addFinalizer`). Once the plugin
|
|
131
|
+
// framework grows a shutdown lifecycle, dispose `managedRuntime` and then
|
|
132
|
+
// call `layerStack.destroy()` to tear down keep-alive slices.
|
|
133
|
+
|
|
134
|
+
const processManagerRuntime: Capabilities.ProcessManagerRuntime = {
|
|
135
|
+
runPromise: (effect, options) => managedRuntime.runPromise(effect as Effect.Effect<any, any, any>, options),
|
|
136
|
+
runPromiseExit: (effect, options) =>
|
|
137
|
+
managedRuntime.runPromiseExit(effect as Effect.Effect<any, any, any>, options),
|
|
138
|
+
runFork: (effect, options) => managedRuntime.runFork(effect as Effect.Effect<any, any, any>, options),
|
|
139
|
+
runSync: (effect) => managedRuntime.runSync(effect as Effect.Effect<any, any, any>),
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
// Eagerly extract the process monitor. Safe because it does not require a
|
|
143
|
+
// fresh scope and is a stable reference for the lifetime of the runtime.
|
|
144
|
+
const processMonitor = managedRuntime.runSync(
|
|
145
|
+
Effect.flatMap(Process.ProcessMonitorService, Effect.succeed) as Effect.Effect<Process.Monitor, never, never>,
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
// Publish the manager into the ambient-layer holder so that
|
|
149
|
+
// `ProcessManager.ProcessManagerService` becomes resolvable through the
|
|
150
|
+
// LayerStack alongside the other framework-supplied services.
|
|
151
|
+
processManagerHolder = managedRuntime.runSync(
|
|
152
|
+
Effect.flatMap(ProcessManager.ProcessManagerService, Effect.succeed) as Effect.Effect<
|
|
153
|
+
ProcessManager.Manager,
|
|
154
|
+
never,
|
|
155
|
+
never
|
|
156
|
+
>,
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
// Eagerly extract the operation invoker built by ProcessOperationInvoker.layer.
|
|
160
|
+
// Pulled via the ProcessOperationInvoker tag so the contributed value carries
|
|
161
|
+
// the full OperationInvoker interface (`invocations`, `pendingFollowups`,
|
|
162
|
+
// `awaitFollowups`, `_invokeCore`) that HistoryTracker requires.
|
|
163
|
+
const operationInvoker: OperationInvoker.OperationInvoker = managedRuntime.runSync(
|
|
164
|
+
Effect.flatMap(ProcessManager.ProcessOperationInvoker.Service, Effect.succeed) as unknown as Effect.Effect<
|
|
165
|
+
OperationInvoker.OperationInvoker,
|
|
166
|
+
never,
|
|
167
|
+
never
|
|
168
|
+
>,
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
return [
|
|
172
|
+
Capability.contributes(Capabilities.ProcessManagerRuntime, processManagerRuntime),
|
|
173
|
+
Capability.contributes(Capabilities.ServiceResolver, serviceResolver),
|
|
174
|
+
Capability.contributes(Capabilities.ProcessMonitor, processMonitor),
|
|
175
|
+
Capability.contributes(Capabilities.OperationInvoker, operationInvoker),
|
|
176
|
+
];
|
|
177
|
+
}),
|
|
178
|
+
);
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Deferred from 'effect/Deferred';
|
|
6
|
+
import * as Effect from 'effect/Effect';
|
|
7
|
+
import * as Fiber from 'effect/Fiber';
|
|
8
|
+
import * as Ref from 'effect/Ref';
|
|
9
|
+
import * as Schema from 'effect/Schema';
|
|
10
|
+
import * as Stream from 'effect/Stream';
|
|
11
|
+
|
|
12
|
+
import { Operation } from '@dxos/compute';
|
|
13
|
+
import { DXN } from '@dxos/keys';
|
|
14
|
+
import { OperationInvoker } from '@dxos/operation';
|
|
15
|
+
|
|
16
|
+
//
|
|
17
|
+
// Test Operations
|
|
18
|
+
//
|
|
19
|
+
|
|
20
|
+
export const Compute = Operation.make({
|
|
21
|
+
input: Schema.Struct({ value: Schema.Number }),
|
|
22
|
+
output: Schema.Struct({ value: Schema.Number }),
|
|
23
|
+
meta: { key: DXN.make('org.dxos.test.compute') },
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
export const HalveCompute = Operation.make({
|
|
27
|
+
input: Schema.Struct({ value: Schema.Number }),
|
|
28
|
+
output: Schema.Struct({ value: Schema.Number }),
|
|
29
|
+
meta: { key: DXN.make('org.dxos.test.halveCompute') },
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
export const ToString = Operation.make({
|
|
33
|
+
input: Schema.Struct({ value: Schema.Number }),
|
|
34
|
+
output: Schema.Struct({ string: Schema.String }),
|
|
35
|
+
meta: { key: DXN.make('org.dxos.test.toString') },
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
export const Add = Operation.make({
|
|
39
|
+
input: Schema.Tuple(Schema.Number, Schema.Number),
|
|
40
|
+
output: Schema.Number,
|
|
41
|
+
meta: { key: DXN.make('org.dxos.test.add') },
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
export const SideEffect = Operation.make({
|
|
45
|
+
input: Schema.Void,
|
|
46
|
+
output: Schema.Void,
|
|
47
|
+
meta: { key: DXN.make('org.dxos.test.sideEffect') },
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
//
|
|
51
|
+
// Test Handlers
|
|
52
|
+
//
|
|
53
|
+
|
|
54
|
+
export const computeHandler = Operation.withHandler(Compute, (data) =>
|
|
55
|
+
Effect.gen(function* () {
|
|
56
|
+
yield* Effect.sleep(data.value * 10);
|
|
57
|
+
return { value: data.value * 2 };
|
|
58
|
+
}),
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
export const halveComputeHandler = Operation.withHandler(HalveCompute, (data) =>
|
|
62
|
+
Effect.succeed({ value: data.value / 2 }),
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
export const toStringHandler = Operation.withHandler(ToString, (data) =>
|
|
66
|
+
Effect.succeed({ string: data.value.toString() }),
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
export const addHandler = Operation.withHandler(Add, (data) => Effect.succeed(data[0] + data[1]));
|
|
70
|
+
|
|
71
|
+
export const sideEffectHandler = Operation.withHandler(SideEffect, () => Effect.succeed(undefined));
|
|
72
|
+
|
|
73
|
+
//
|
|
74
|
+
// Test Utilities
|
|
75
|
+
//
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Event collector for testing - provides deterministic event collection using Effect primitives.
|
|
79
|
+
*/
|
|
80
|
+
export interface EventCollector {
|
|
81
|
+
/** All collected events. */
|
|
82
|
+
readonly events: OperationInvoker.InvocationEvent[];
|
|
83
|
+
/** Wait until N events have been collected. */
|
|
84
|
+
waitForEvents: (count: number) => Effect.Effect<void>;
|
|
85
|
+
/** Clean up the subscription fiber. */
|
|
86
|
+
dispose: Effect.Effect<void>;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Creates an event collector that subscribes to invoker events.
|
|
91
|
+
* Uses Effect primitives for synchronization.
|
|
92
|
+
*/
|
|
93
|
+
export const createEventCollector = (invoker: OperationInvoker.OperationInvoker): Effect.Effect<EventCollector> =>
|
|
94
|
+
Effect.gen(function* () {
|
|
95
|
+
const events: OperationInvoker.InvocationEvent[] = [];
|
|
96
|
+
|
|
97
|
+
// Ref to track current waiter (waiting for N events).
|
|
98
|
+
const waiterRef = yield* Ref.make<{ count: number; deferred: Deferred.Deferred<void> } | null>(null);
|
|
99
|
+
|
|
100
|
+
// Deferred to signal when subscription is ready.
|
|
101
|
+
const subscriptionReady = yield* Deferred.make<void>();
|
|
102
|
+
|
|
103
|
+
const checkWaiter = Effect.gen(function* () {
|
|
104
|
+
const waiter = yield* Ref.get(waiterRef);
|
|
105
|
+
if (waiter && events.length >= waiter.count) {
|
|
106
|
+
yield* Deferred.succeed(waiter.deferred, undefined);
|
|
107
|
+
yield* Ref.set(waiterRef, null);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
// Fork a fiber to consume the invocation stream.
|
|
112
|
+
const fiber = yield* Effect.fork(
|
|
113
|
+
Effect.gen(function* () {
|
|
114
|
+
// Signal that subscription is about to start.
|
|
115
|
+
yield* Deferred.succeed(subscriptionReady, undefined);
|
|
116
|
+
yield* Stream.fromPubSub(invoker.invocations).pipe(
|
|
117
|
+
Stream.runForEach((event) =>
|
|
118
|
+
Effect.gen(function* () {
|
|
119
|
+
events.push(event);
|
|
120
|
+
yield* checkWaiter;
|
|
121
|
+
}),
|
|
122
|
+
),
|
|
123
|
+
);
|
|
124
|
+
}),
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
// Wait for the subscription to be established.
|
|
128
|
+
yield* Deferred.await(subscriptionReady);
|
|
129
|
+
// Additional yield to ensure PubSub subscription is fully registered.
|
|
130
|
+
yield* Effect.yieldNow();
|
|
131
|
+
|
|
132
|
+
const waitForEvents = (count: number): Effect.Effect<void> =>
|
|
133
|
+
Effect.gen(function* () {
|
|
134
|
+
if (events.length >= count) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const deferred = yield* Deferred.make<void>();
|
|
138
|
+
yield* Ref.set(waiterRef, { count, deferred });
|
|
139
|
+
yield* Deferred.await(deferred);
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
const dispose = Fiber.interrupt(fiber);
|
|
143
|
+
|
|
144
|
+
return { events, waitForEvents, dispose };
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Waits until a condition is true, yielding to the JS event loop between checks.
|
|
149
|
+
* Uses setImmediate to allow other async work to complete.
|
|
150
|
+
*/
|
|
151
|
+
export const waitUntil = (condition: () => boolean): Effect.Effect<void> =>
|
|
152
|
+
Effect.gen(function* () {
|
|
153
|
+
while (!condition()) {
|
|
154
|
+
yield* Effect.promise(() => new Promise((r) => setImmediate(r)));
|
|
155
|
+
}
|
|
156
|
+
});
|