@dxos/app-framework 0.8.4-main.b97322e → 0.8.4-main.bcb3aa67d6
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/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
- package/dist/lib/browser/capability-4NSF2SOO.mjs +38 -0
- package/dist/lib/browser/capability-4NSF2SOO.mjs.map +7 -0
- package/dist/lib/browser/capability-EB3UKSKA.mjs +35 -0
- package/dist/lib/browser/capability-EB3UKSKA.mjs.map +7 -0
- package/dist/lib/browser/chunk-27FZETIA.mjs +950 -0
- package/dist/lib/browser/chunk-27FZETIA.mjs.map +7 -0
- package/dist/lib/browser/chunk-CV7I2AAB.mjs +80 -0
- package/dist/lib/browser/chunk-CV7I2AAB.mjs.map +7 -0
- package/dist/lib/browser/chunk-FL2XTEJH.mjs +76 -0
- package/dist/lib/browser/chunk-FL2XTEJH.mjs.map +7 -0
- package/dist/lib/browser/chunk-H7OMDDGW.mjs +42 -0
- package/dist/lib/browser/chunk-H7OMDDGW.mjs.map +7 -0
- package/dist/lib/browser/chunk-HDQXX5DC.mjs +157 -0
- package/dist/lib/browser/chunk-HDQXX5DC.mjs.map +7 -0
- package/dist/lib/browser/chunk-I34GF4NG.mjs +34 -0
- package/dist/lib/browser/chunk-I34GF4NG.mjs.map +7 -0
- package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/browser/chunk-KNBRTZVK.mjs +892 -0
- package/dist/lib/browser/chunk-KNBRTZVK.mjs.map +7 -0
- package/dist/lib/browser/chunk-NO7R7QHA.mjs +167 -0
- package/dist/lib/browser/chunk-NO7R7QHA.mjs.map +7 -0
- package/dist/lib/browser/chunk-P2E7VMRF.mjs +148 -0
- package/dist/lib/browser/chunk-P2E7VMRF.mjs.map +7 -0
- package/dist/lib/browser/chunk-QSXYHXCE.mjs +48 -0
- package/dist/lib/browser/chunk-QSXYHXCE.mjs.map +7 -0
- package/dist/lib/browser/chunk-RFSO3JRG.mjs +1 -0
- package/dist/lib/browser/chunk-TGX63LTL.mjs +8 -0
- package/dist/lib/browser/chunk-TGX63LTL.mjs.map +7 -0
- package/dist/lib/browser/cli/index.mjs +90 -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 +28 -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 +12 -0
- package/dist/lib/browser/core/url-loader.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +91 -156
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/invoker-capability-P7KPBTP3.mjs +43 -0
- package/dist/lib/browser/invoker-capability-P7KPBTP3.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +115 -51
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/browser/ui/index.mjs +44 -0
- package/dist/lib/browser/ui/index.mjs.map +7 -0
- package/dist/lib/node-esm/capability-CB3MNEI3.mjs +39 -0
- package/dist/lib/node-esm/capability-CB3MNEI3.mjs.map +7 -0
- package/dist/lib/node-esm/capability-CMROGK7R.mjs +36 -0
- package/dist/lib/node-esm/capability-CMROGK7R.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-37NG7SIN.mjs +77 -0
- package/dist/lib/node-esm/chunk-37NG7SIN.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-7JPKC7OM.mjs +893 -0
- package/dist/lib/node-esm/chunk-7JPKC7OM.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-7PPVTBYR.mjs +81 -0
- package/dist/lib/node-esm/chunk-7PPVTBYR.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-BQ56U4QX.mjs +43 -0
- package/dist/lib/node-esm/chunk-BQ56U4QX.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-CG6UBBZZ.mjs +149 -0
- package/dist/lib/node-esm/chunk-CG6UBBZZ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-EL3R25OQ.mjs +2 -0
- package/dist/lib/node-esm/chunk-EL3R25OQ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-EXYTXQ47.mjs +168 -0
- package/dist/lib/node-esm/chunk-EXYTXQ47.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-FKE4Z3D6.mjs +10 -0
- package/dist/lib/node-esm/chunk-FKE4Z3D6.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-OXXXRCQX.mjs +158 -0
- package/dist/lib/node-esm/chunk-OXXXRCQX.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-WZCSOX5Q.mjs +35 -0
- package/dist/lib/node-esm/chunk-WZCSOX5Q.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-YH44RHP6.mjs +951 -0
- package/dist/lib/node-esm/chunk-YH44RHP6.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-ZZ7CKK6W.mjs +49 -0
- package/dist/lib/node-esm/chunk-ZZ7CKK6W.mjs.map +7 -0
- package/dist/lib/node-esm/cli/index.mjs +91 -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 +29 -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 +13 -0
- package/dist/lib/node-esm/core/url-loader.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +91 -156
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/invoker-capability-3C5H46ZY.mjs +44 -0
- package/dist/lib/node-esm/invoker-capability-3C5H46ZY.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +115 -51
- package/dist/lib/node-esm/testing/index.mjs.map +4 -4
- package/dist/lib/node-esm/ui/index.mjs +45 -0
- package/dist/lib/node-esm/ui/index.mjs.map +7 -0
- package/dist/plugin/node-esm/index.mjs +384 -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 -123
- 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} +7 -7
- package/dist/types/src/core/activation-event.d.ts.map +1 -0
- package/dist/types/src/core/capability-manager.d.ts +43 -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 +150 -0
- package/dist/types/src/core/capability.d.ts.map +1 -0
- package/dist/types/src/core/index.d.ts +6 -4
- package/dist/types/src/core/index.d.ts.map +1 -1
- package/dist/types/src/core/plugin-manager.d.ts +73 -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.d.ts +103 -33
- package/dist/types/src/core/plugin.d.ts.map +1 -1
- package/dist/types/src/core/url-loader.d.ts +25 -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/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/index.d.ts +1 -0
- package/dist/types/src/testing/index.d.ts.map +1 -1
- 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/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 +12 -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 +26 -0
- package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/types.d.ts +96 -0
- package/dist/types/src/ui/components/Surface/types.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 +6 -0
- package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useApp.d.ts +62 -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/composer-plugin.d.ts +18 -0
- package/dist/types/src/vite-plugin/composer-plugin.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/import-map-plugin.d.ts +16 -0
- package/dist/types/src/vite-plugin/import-map-plugin.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/index.d.ts +3 -0
- package/dist/types/src/vite-plugin/index.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/packages.d.ts +7 -0
- package/dist/types/src/vite-plugin/packages.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/moon.yml +25 -3
- package/package.json +132 -44
- 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 -114
- package/src/common/index.ts +4 -8
- package/src/common/operations.ts +36 -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 +171 -0
- package/src/core/capability.ts +237 -0
- package/src/core/index.ts +6 -4
- package/src/core/plugin-manager.test.ts +1114 -0
- package/src/core/plugin-manager.ts +883 -0
- package/src/core/plugin.ts +238 -37
- package/src/core/url-loader.test.ts +79 -0
- package/src/core/url-loader.ts +148 -0
- package/src/helpers.test.ts +1 -1
- package/src/index.ts +3 -4
- package/src/plugin-operation/OperationPlugin.ts +25 -0
- package/src/plugin-operation/history/capability.ts +37 -0
- package/src/plugin-operation/history/errors.ts +7 -0
- package/src/plugin-operation/history/history-tracker.test.ts +374 -0
- package/src/plugin-operation/history/history-tracker.ts +129 -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 +73 -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 +20 -0
- package/src/plugin-runtime/capability.ts +53 -0
- package/src/{playground/debug → plugin-runtime}/index.ts +1 -1
- package/src/plugin-runtime/meta.ts +11 -0
- package/src/testing/index.ts +1 -0
- package/src/testing/service.ts +52 -0
- package/src/testing/withPluginManager.stories.tsx +15 -11
- package/src/testing/withPluginManager.tsx +80 -54
- package/src/ui/components/App/App.stories.tsx +92 -0
- package/src/ui/components/App/App.tsx +58 -0
- package/src/{playground/logger → ui/components/App}/index.ts +1 -1
- package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +183 -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 +145 -0
- package/src/ui/components/Surface/SurfaceComponent.tsx +257 -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 +35 -0
- package/src/ui/components/Surface/types.ts +117 -0
- package/src/ui/components/index.ts +7 -0
- package/src/ui/hooks/index.ts +9 -0
- package/src/ui/hooks/useApp.test.tsx +159 -0
- package/src/ui/hooks/useApp.tsx +289 -0
- package/src/ui/hooks/useCapabilities.ts +67 -0
- package/src/ui/hooks/useLoading.tsx +68 -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/composer-plugin.ts +128 -0
- package/src/vite-plugin/import-map-plugin.ts +315 -0
- package/src/vite-plugin/index.ts +6 -0
- package/src/vite-plugin/packages.ts +29 -0
- package/tsconfig.json +15 -28
- 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/f45bdff002284d9e8f9ef3f0be909de12da36c049cbcf261ac78fc00abb09a2d +0 -0
- package/.swc/plugins/v7_linux_x86_64_13.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429 +0 -0
- package/dist/lib/browser/app-graph-builder-LYF7EKNN.mjs +0 -137
- package/dist/lib/browser/app-graph-builder-LYF7EKNN.mjs.map +0 -7
- package/dist/lib/browser/chunk-FMN65HSW.mjs +0 -1519
- package/dist/lib/browser/chunk-FMN65HSW.mjs.map +0 -7
- package/dist/lib/browser/chunk-FO2PH7M3.mjs +0 -415
- package/dist/lib/browser/chunk-FO2PH7M3.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-LSYQZSEB.mjs +0 -11
- package/dist/lib/browser/intent-resolver-ZTNOSO3A.mjs +0 -39
- package/dist/lib/browser/intent-resolver-ZTNOSO3A.mjs.map +0 -7
- package/dist/lib/browser/store-KML2R4IE.mjs +0 -30
- package/dist/lib/browser/store-KML2R4IE.mjs.map +0 -7
- package/dist/lib/browser/worker.mjs +0 -79
- package/dist/lib/node-esm/app-graph-builder-SAOWGJDK.mjs +0 -138
- package/dist/lib/node-esm/app-graph-builder-SAOWGJDK.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-73HGSHKE.mjs +0 -416
- package/dist/lib/node-esm/chunk-73HGSHKE.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-ZEZ4FVEU.mjs +0 -1521
- package/dist/lib/node-esm/chunk-ZEZ4FVEU.mjs.map +0 -7
- package/dist/lib/node-esm/intent-dispatcher-6CYNGPSW.mjs +0 -12
- package/dist/lib/node-esm/intent-resolver-W7Z7WFFM.mjs +0 -40
- package/dist/lib/node-esm/intent-resolver-W7Z7WFFM.mjs.map +0 -7
- package/dist/lib/node-esm/store-QEXGXLWZ.mjs +0 -31
- package/dist/lib/node-esm/store-QEXGXLWZ.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/dist/lib/browser/{intent-dispatcher-LSYQZSEB.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
- /package/dist/lib/browser/{worker.mjs.map → chunk-RFSO3JRG.mjs.map} +0 -0
- /package/dist/lib/{node-esm/intent-dispatcher-6CYNGPSW.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,289 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { RegistryContext } from '@effect-atom/atom-react';
|
|
6
|
+
import * as Effect from 'effect/Effect';
|
|
7
|
+
import * as Fiber from 'effect/Fiber';
|
|
8
|
+
import * as PubSub from 'effect/PubSub';
|
|
9
|
+
import * as Queue from 'effect/Queue';
|
|
10
|
+
import React, { type FC, useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
11
|
+
|
|
12
|
+
import { runAndForwardErrors } from '@dxos/effect';
|
|
13
|
+
import { invariant } from '@dxos/invariant';
|
|
14
|
+
import { log } from '@dxos/log';
|
|
15
|
+
import { ErrorBoundary, ErrorFallback, type FallbackProps } from '@dxos/react-error-boundary';
|
|
16
|
+
import { useAsyncEffect, useDefaultValue } from '@dxos/react-hooks';
|
|
17
|
+
import { ContextProtocolProvider } from '@dxos/web-context-react';
|
|
18
|
+
|
|
19
|
+
import { ActivationEvents, Capabilities } from '../../common';
|
|
20
|
+
import { PluginManagerContext } from '../../context';
|
|
21
|
+
import { type ActivationEvent, type Plugin, PluginManager } from '../../core';
|
|
22
|
+
import { App, PluginManagerProvider } from '../components';
|
|
23
|
+
|
|
24
|
+
const ENABLED_KEY = 'org.dxos.app-framework.enabled';
|
|
25
|
+
|
|
26
|
+
export type StartupProgress = {
|
|
27
|
+
/** Number of modules that have been activated. */
|
|
28
|
+
activated: number;
|
|
29
|
+
/** Total number of modules registered. */
|
|
30
|
+
total: number;
|
|
31
|
+
/** Fractional progress (0-1). */
|
|
32
|
+
progress: number;
|
|
33
|
+
/** Human-readable label for the currently activating module. */
|
|
34
|
+
status?: string;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export type PlaceholderProps = {
|
|
38
|
+
stage?: number;
|
|
39
|
+
progress?: StartupProgress;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export type UseAppOptions = {
|
|
43
|
+
pluginManager?: PluginManager.PluginManager;
|
|
44
|
+
pluginLoader?: PluginManager.ManagerOptions['pluginLoader'];
|
|
45
|
+
plugins?: Plugin.Plugin[];
|
|
46
|
+
core?: string[];
|
|
47
|
+
defaults?: string[];
|
|
48
|
+
/**
|
|
49
|
+
* Additional activation events to fire before startup.
|
|
50
|
+
* These are fired alongside SetupReactSurface before the Startup event.
|
|
51
|
+
*/
|
|
52
|
+
setupEvents?: ActivationEvent.ActivationEvent[];
|
|
53
|
+
cacheEnabled?: boolean;
|
|
54
|
+
safeMode?: boolean;
|
|
55
|
+
debounce?: number;
|
|
56
|
+
timeout?: number;
|
|
57
|
+
fallback?: FC<FallbackProps>;
|
|
58
|
+
placeholder?: FC<PlaceholderProps>;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Expected usage is for this to be the entrypoint of the application.
|
|
63
|
+
* Initializes plugins and renders the root components.
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* const plugins = [LayoutPlugin(), MyPlugin()];
|
|
67
|
+
* const core = [LayoutPluginId];
|
|
68
|
+
* const default = [MyPluginId];
|
|
69
|
+
* const fallback = <div>Initializing Plugins...</div>;
|
|
70
|
+
* const App = useApp({ plugins, core, default, fallback });
|
|
71
|
+
* createRoot(document.getElementById('root')!).render(
|
|
72
|
+
* <StrictMode>
|
|
73
|
+
* <App />
|
|
74
|
+
* </StrictMode>,
|
|
75
|
+
* );
|
|
76
|
+
*
|
|
77
|
+
* @param params.pluginLoader A function which loads new plugins.
|
|
78
|
+
* @param params.plugins All plugins available to the application.
|
|
79
|
+
* @param params.core Core plugins which will always be enabled.
|
|
80
|
+
* @param params.defaults Default plugins are enabled by default but can be disabled by the user.
|
|
81
|
+
* @param params.cacheEnabled Whether to cache enabled plugins in localStorage.
|
|
82
|
+
* @param params.safeMode Whether to enable safe mode, which disables optional plugins.
|
|
83
|
+
* @param params.fallback Fallback component to render if an error occurs during startup.
|
|
84
|
+
* @param params.placeholder Placeholder component to render during startup.
|
|
85
|
+
*/
|
|
86
|
+
export const useApp = ({
|
|
87
|
+
pluginManager,
|
|
88
|
+
pluginLoader: pluginLoaderProp,
|
|
89
|
+
plugins: pluginsProp,
|
|
90
|
+
core: coreProp,
|
|
91
|
+
defaults: defaultsProp,
|
|
92
|
+
setupEvents: setupEventsProp,
|
|
93
|
+
placeholder,
|
|
94
|
+
fallback = ErrorFallback,
|
|
95
|
+
cacheEnabled = false,
|
|
96
|
+
safeMode = false,
|
|
97
|
+
debounce = 0,
|
|
98
|
+
timeout = 30_000,
|
|
99
|
+
}: UseAppOptions) => {
|
|
100
|
+
const plugins = useDefaultValue(pluginsProp, () => []);
|
|
101
|
+
const core = useDefaultValue(coreProp, () => plugins.map(({ meta }) => meta.id));
|
|
102
|
+
const defaults = useDefaultValue(defaultsProp, () => []);
|
|
103
|
+
const setupEvents = useDefaultValue(setupEventsProp, () => []);
|
|
104
|
+
|
|
105
|
+
const pluginLoader = useMemo(
|
|
106
|
+
() =>
|
|
107
|
+
pluginLoaderProp ??
|
|
108
|
+
((id: string) =>
|
|
109
|
+
Effect.sync(() => {
|
|
110
|
+
const plugin = plugins.find((plugin) => plugin.meta.id === id);
|
|
111
|
+
invariant(plugin, `Plugin not found: ${id}`);
|
|
112
|
+
return plugin;
|
|
113
|
+
})),
|
|
114
|
+
[pluginLoaderProp, plugins],
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
const readyRef = useRef(false);
|
|
118
|
+
const [ready, setReady] = useState(false);
|
|
119
|
+
const errorRef = useRef<unknown>(null);
|
|
120
|
+
const [error, setError] = useState<unknown>(null);
|
|
121
|
+
const [startupProgress, setStartupProgress] = useState<StartupProgress>({
|
|
122
|
+
activated: 0,
|
|
123
|
+
total: 0,
|
|
124
|
+
progress: 0,
|
|
125
|
+
});
|
|
126
|
+
// TODO(wittjosiah): Migrate to Atom.kvs for isomorphic storage.
|
|
127
|
+
const cached: string[] = useMemo(() => JSON.parse(localStorage.getItem(ENABLED_KEY) ?? '[]'), []);
|
|
128
|
+
const enabled = useMemo(
|
|
129
|
+
() => (safeMode ? [] : cacheEnabled && cached.length > 0 ? cached : defaults),
|
|
130
|
+
[safeMode, cacheEnabled, cached, defaults],
|
|
131
|
+
);
|
|
132
|
+
const isExternalManager = !!pluginManager;
|
|
133
|
+
const manager = useMemo(() => {
|
|
134
|
+
const mgr = pluginManager ?? PluginManager.make({ pluginLoader, plugins, core, enabled });
|
|
135
|
+
log('useApp: useMemo created/reused manager', { provided: !!pluginManager });
|
|
136
|
+
return mgr;
|
|
137
|
+
}, [pluginManager, pluginLoader, plugins, core, enabled]);
|
|
138
|
+
|
|
139
|
+
useEffect(() => {
|
|
140
|
+
if (!cacheEnabled) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
return manager.registry.subscribe(manager.enabled, (value) => {
|
|
144
|
+
localStorage.setItem(ENABLED_KEY, JSON.stringify(value));
|
|
145
|
+
});
|
|
146
|
+
}, [cacheEnabled, manager]);
|
|
147
|
+
|
|
148
|
+
useEffect(() => {
|
|
149
|
+
setupDevtools(manager);
|
|
150
|
+
}, [manager]);
|
|
151
|
+
|
|
152
|
+
useAsyncEffect(async () => {
|
|
153
|
+
log('useApp: effect mount');
|
|
154
|
+
|
|
155
|
+
manager.capabilities.contribute({
|
|
156
|
+
interface: Capabilities.PluginManager,
|
|
157
|
+
implementation: manager,
|
|
158
|
+
module: 'org.dxos.app-framework.plugin-manager',
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
manager.capabilities.contribute({
|
|
162
|
+
interface: Capabilities.AtomRegistry,
|
|
163
|
+
implementation: manager.registry,
|
|
164
|
+
module: 'org.dxos.app-framework.atom-registry',
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
// Poll manager atoms for progress (avoids PubSub subscription race).
|
|
168
|
+
const progressInterval = setInterval(() => {
|
|
169
|
+
if (readyRef.current) {
|
|
170
|
+
clearInterval(progressInterval);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const active = manager.getActive();
|
|
174
|
+
const modules = manager.getModules();
|
|
175
|
+
const total = modules.length;
|
|
176
|
+
const activated = active.length;
|
|
177
|
+
const lastModule = active.length > 0 ? active[active.length - 1] : undefined;
|
|
178
|
+
setStartupProgress({
|
|
179
|
+
activated,
|
|
180
|
+
total,
|
|
181
|
+
progress: total > 0 ? activated / total : 0,
|
|
182
|
+
status: lastModule ? humanizeModuleId(lastModule) : undefined,
|
|
183
|
+
});
|
|
184
|
+
}, 100);
|
|
185
|
+
|
|
186
|
+
const fiber = Effect.gen(function* () {
|
|
187
|
+
const queue = yield* PubSub.subscribe(manager.activation);
|
|
188
|
+
const listener = yield* Effect.forkDaemon(
|
|
189
|
+
Queue.take(queue).pipe(
|
|
190
|
+
Effect.tap(({ event, state, error: error$ }) =>
|
|
191
|
+
Effect.sync(() => {
|
|
192
|
+
if (event === ActivationEvents.Startup.id && state === 'activated') {
|
|
193
|
+
clearTimeout(timeoutId);
|
|
194
|
+
clearInterval(progressInterval);
|
|
195
|
+
setReady(true);
|
|
196
|
+
readyRef.current = true;
|
|
197
|
+
// Trigger startup profiler dump if available.
|
|
198
|
+
(globalThis as any).composer?.profiler?.dump();
|
|
199
|
+
}
|
|
200
|
+
if (error$ && !readyRef.current) {
|
|
201
|
+
setError(error$);
|
|
202
|
+
errorRef.current = error$;
|
|
203
|
+
}
|
|
204
|
+
}),
|
|
205
|
+
),
|
|
206
|
+
Effect.forever,
|
|
207
|
+
),
|
|
208
|
+
);
|
|
209
|
+
|
|
210
|
+
yield* Effect.all([
|
|
211
|
+
...setupEvents.map((event) => manager.activate(event)),
|
|
212
|
+
manager.activate(ActivationEvents.SetupReactSurface),
|
|
213
|
+
manager.activate(ActivationEvents.Startup),
|
|
214
|
+
]);
|
|
215
|
+
|
|
216
|
+
return yield* Fiber.join(listener);
|
|
217
|
+
}).pipe(Effect.scoped, Effect.runFork);
|
|
218
|
+
|
|
219
|
+
// Set up a timeout for startup.
|
|
220
|
+
const timeoutId = setTimeout(() => {
|
|
221
|
+
if (!readyRef.current && !errorRef.current) {
|
|
222
|
+
log.warn('startup timeout diagnostic', {
|
|
223
|
+
eventsFired: manager.getEventsFired(),
|
|
224
|
+
activeModules: manager.getActive(),
|
|
225
|
+
pendingReset: manager.getPendingReset(),
|
|
226
|
+
});
|
|
227
|
+
void runAndForwardErrors(Fiber.interrupt(fiber));
|
|
228
|
+
setError(new Error(`Startup timed out after ${timeout}ms`));
|
|
229
|
+
}
|
|
230
|
+
}, timeout);
|
|
231
|
+
|
|
232
|
+
return () => {
|
|
233
|
+
log('useApp: effect cleanup');
|
|
234
|
+
clearTimeout(timeoutId);
|
|
235
|
+
clearInterval(progressInterval);
|
|
236
|
+
void runAndForwardErrors(Fiber.interrupt(fiber));
|
|
237
|
+
if (!isExternalManager) {
|
|
238
|
+
void runAndForwardErrors(manager.shutdown());
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
}, [manager]);
|
|
242
|
+
|
|
243
|
+
return useCallback(
|
|
244
|
+
() => (
|
|
245
|
+
<ErrorBoundary name='app' FallbackComponent={fallback}>
|
|
246
|
+
<PluginManagerProvider value={manager}>
|
|
247
|
+
<ContextProtocolProvider value={manager} context={PluginManagerContext}>
|
|
248
|
+
<RegistryContext.Provider value={manager.registry}>
|
|
249
|
+
<App
|
|
250
|
+
placeholder={placeholder}
|
|
251
|
+
ready={ready}
|
|
252
|
+
error={error}
|
|
253
|
+
debounce={debounce}
|
|
254
|
+
progress={startupProgress}
|
|
255
|
+
/>
|
|
256
|
+
</RegistryContext.Provider>
|
|
257
|
+
</ContextProtocolProvider>
|
|
258
|
+
</PluginManagerProvider>
|
|
259
|
+
</ErrorBoundary>
|
|
260
|
+
),
|
|
261
|
+
[fallback, manager, placeholder, ready, error],
|
|
262
|
+
);
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
const setupDevtools = (manager: PluginManager.PluginManager) => {
|
|
266
|
+
(globalThis as any).composer ??= {};
|
|
267
|
+
(globalThis as any).composer.manager = manager;
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Extracts a human-readable label from a module ID.
|
|
272
|
+
* E.g., "org.dxos.plugin.markdown.module.ReactSurface" → "Markdown".
|
|
273
|
+
*/
|
|
274
|
+
const humanizeModuleId = (moduleId: string): string => {
|
|
275
|
+
// Extract plugin name from pattern: org.dxos.plugin.<name>.module.<capability>
|
|
276
|
+
const pluginMatch = moduleId.match(/\.plugin\.([^.]+)\./);
|
|
277
|
+
if (pluginMatch) {
|
|
278
|
+
const name = pluginMatch[1];
|
|
279
|
+
// Convert kebab-case to title case.
|
|
280
|
+
return name
|
|
281
|
+
.split('-')
|
|
282
|
+
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
|
|
283
|
+
.join(' ');
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Fallback: use the last segment.
|
|
287
|
+
const parts = moduleId.split('.');
|
|
288
|
+
return parts[parts.length - 1];
|
|
289
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Atom, useAtomValue } from '@effect-atom/atom-react';
|
|
6
|
+
import { useCallback } from 'react';
|
|
7
|
+
|
|
8
|
+
import { invariant } from '@dxos/invariant';
|
|
9
|
+
|
|
10
|
+
import { Capabilities } from '../../common';
|
|
11
|
+
import { type Capability } from '../../core';
|
|
12
|
+
import { usePluginManager } from '../components';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Hook to request capabilities from the plugin context.
|
|
16
|
+
* @returns An array of capabilities.
|
|
17
|
+
*/
|
|
18
|
+
export const useCapabilities = <T>(interfaceDef: Capability.InterfaceDef<T>) => {
|
|
19
|
+
const manager = usePluginManager();
|
|
20
|
+
return useAtomValue(manager.capabilities.atom(interfaceDef));
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Hook to request a capability from the plugin context.
|
|
25
|
+
* @returns The capability.
|
|
26
|
+
* @throws If no capability is found.
|
|
27
|
+
*/
|
|
28
|
+
export const useCapability = <T>(interfaceDef: Capability.InterfaceDef<T>) => {
|
|
29
|
+
const capabilities = useCapabilities(interfaceDef);
|
|
30
|
+
invariant(capabilities.length > 0, `No capability found for ${interfaceDef.identifier}`);
|
|
31
|
+
return capabilities[0];
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Hook to get the current value of an atom capability.
|
|
36
|
+
* Automatically subscribes to changes.
|
|
37
|
+
* @example const settings = useAtomCapability(ThreadCapabilities.Settings);
|
|
38
|
+
*/
|
|
39
|
+
export const useAtomCapability = <T>(atomCapability: Capability.InterfaceDef<Atom.Atom<T>>): T => {
|
|
40
|
+
const atom = useCapability(atomCapability);
|
|
41
|
+
return useAtomValue(atom);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Hook to get value and updater for an atom capability.
|
|
46
|
+
* Returns [currentValue, updateFn] similar to useState.
|
|
47
|
+
* @example const [settings, updateSettings] = useAtomCapabilityState(ThreadCapabilities.Settings);
|
|
48
|
+
*/
|
|
49
|
+
export const useAtomCapabilityState = <T>(
|
|
50
|
+
atomCapability: Capability.InterfaceDef<Atom.Writable<T>>,
|
|
51
|
+
): [T, (fn: (current: T) => T) => void] => {
|
|
52
|
+
const registry = useCapability(Capabilities.AtomRegistry);
|
|
53
|
+
const atom = useCapability(atomCapability);
|
|
54
|
+
const value = useAtomValue(atom);
|
|
55
|
+
const update = useCallback(
|
|
56
|
+
(fn: (current: T) => T) => {
|
|
57
|
+
registry.set(atom, fn(registry.get(atom)));
|
|
58
|
+
},
|
|
59
|
+
[registry, atom],
|
|
60
|
+
);
|
|
61
|
+
return [value, update];
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Hook to get the operation invoker capability.
|
|
66
|
+
*/
|
|
67
|
+
export const useOperationInvoker = (): Capabilities.OperationInvoker => useCapability(Capabilities.OperationInvoker);
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { useEffect, useState } from 'react';
|
|
6
|
+
|
|
7
|
+
export enum LoadingState {
|
|
8
|
+
Loading = 0,
|
|
9
|
+
FadeIn = 1,
|
|
10
|
+
FadeOut = 2,
|
|
11
|
+
Done = 3,
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* To avoid "flashing" the placeholder, we wait a period of time before starting the loading animation.
|
|
16
|
+
* If loading completes during this time the placehoder is not shown, otherwise is it displayed for a minimum period of time.
|
|
17
|
+
*
|
|
18
|
+
* States:
|
|
19
|
+
* 0: Loading - Wait for a period of time before starting the loading animation.
|
|
20
|
+
* 1: Fade-in - Display a loading animation.
|
|
21
|
+
* 2: Fade-out - Fade out the loading animation.
|
|
22
|
+
* 3: Done - Remove the placeholder.
|
|
23
|
+
*/
|
|
24
|
+
export const useLoading = (ready: boolean, debounce = 0) => {
|
|
25
|
+
const [stage, setStage] = useState<LoadingState>(LoadingState.Loading);
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
if (!debounce) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const i = setInterval(() => {
|
|
32
|
+
setStage((stage) => {
|
|
33
|
+
switch (stage) {
|
|
34
|
+
case LoadingState.Loading: {
|
|
35
|
+
if (!ready) {
|
|
36
|
+
return LoadingState.FadeIn;
|
|
37
|
+
} else {
|
|
38
|
+
clearInterval(i);
|
|
39
|
+
return LoadingState.Done;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
case LoadingState.FadeIn: {
|
|
44
|
+
if (ready) {
|
|
45
|
+
return LoadingState.FadeOut;
|
|
46
|
+
}
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
case LoadingState.FadeOut: {
|
|
51
|
+
clearInterval(i);
|
|
52
|
+
return LoadingState.Done;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return stage;
|
|
57
|
+
});
|
|
58
|
+
}, debounce);
|
|
59
|
+
|
|
60
|
+
return () => clearInterval(i);
|
|
61
|
+
}, [debounce]);
|
|
62
|
+
|
|
63
|
+
if (!debounce) {
|
|
64
|
+
return ready ? LoadingState.Done : LoadingState.Loading;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return stage;
|
|
68
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Atom, RegistryContext, useAtomValue } from '@effect-atom/atom-react';
|
|
6
|
+
import { useCallback, useContext } from 'react';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Hook to read and update a settings atom.
|
|
10
|
+
* Returns the current value and an update function.
|
|
11
|
+
*/
|
|
12
|
+
export const useSettingsState = <T>(
|
|
13
|
+
atom: Atom.Writable<T>,
|
|
14
|
+
): { settings: T; updateSettings: (fn: (current: T) => T) => void } => {
|
|
15
|
+
const registry = useContext(RegistryContext);
|
|
16
|
+
const settings = useAtomValue(atom);
|
|
17
|
+
|
|
18
|
+
const updateSettings = useCallback(
|
|
19
|
+
(fn: (current: T) => T) => {
|
|
20
|
+
registry.set(atom, fn(registry.get(atom)));
|
|
21
|
+
},
|
|
22
|
+
[registry, atom],
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
return { settings, updateSettings };
|
|
26
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { useContext } from 'react';
|
|
6
|
+
|
|
7
|
+
import { raise } from '@dxos/debug';
|
|
8
|
+
|
|
9
|
+
import { Surface } from '../components';
|
|
10
|
+
|
|
11
|
+
export const useSurface = (): Surface.Context => {
|
|
12
|
+
return useContext(Surface.Context) ?? raise(new Error('Missing SurfaceContext'));
|
|
13
|
+
};
|
package/src/ui/index.ts
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Plugin } from 'vite';
|
|
6
|
+
|
|
7
|
+
import { DEFAULT_PACKAGES } from './packages';
|
|
8
|
+
|
|
9
|
+
const JSX_DEV_RUNTIME = 'react/jsx-dev-runtime';
|
|
10
|
+
|
|
11
|
+
/** Regex patterns matching each shared package and all its subpath imports. */
|
|
12
|
+
const EXTERNAL_DEPS = DEFAULT_PACKAGES.map((pkg) => new RegExp(`^${pkg.replace('/', '\\/')}(\\/|$)`));
|
|
13
|
+
|
|
14
|
+
/** Checks whether an import should be externalized (all shared deps except jsx-dev-runtime). */
|
|
15
|
+
const isExternal = (id: string) => id !== JSX_DEV_RUNTIME && EXTERNAL_DEPS.some((pattern) => pattern.test(id));
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Vite plugin for **external Composer plugin projects**. Configures the build to produce
|
|
19
|
+
* an ESM bundle that externalizes all framework dependencies, which the Composer host app
|
|
20
|
+
* provides at runtime via import map.
|
|
21
|
+
*
|
|
22
|
+
* Handles three concerns:
|
|
23
|
+
* 1. Build config — lib mode entry point, ES format output, rollup externals.
|
|
24
|
+
* 2. Dev externalization — marks shared deps as external during `vite serve` and strips
|
|
25
|
+
* the `/@id/` prefix that Vite's import analysis adds to external bare specifiers.
|
|
26
|
+
* 3. JSX dev runtime shim — bridges `react/jsx-dev-runtime` (used by React refresh in dev)
|
|
27
|
+
* to `react/jsx-runtime` (which is what the externalized React provides).
|
|
28
|
+
*/
|
|
29
|
+
export const composerPlugin = (options?: { entry?: string; port?: number }): Plugin[] => {
|
|
30
|
+
const entry = options?.entry ?? 'src/plugin.tsx';
|
|
31
|
+
const port = options?.port ?? 3967;
|
|
32
|
+
const resolved = new Set<string>();
|
|
33
|
+
let base = '/';
|
|
34
|
+
|
|
35
|
+
return [
|
|
36
|
+
// Plugin 1: Configure vite for library-mode builds with externalized deps.
|
|
37
|
+
{
|
|
38
|
+
name: 'composer-plugin',
|
|
39
|
+
config: () => ({
|
|
40
|
+
server: {
|
|
41
|
+
port,
|
|
42
|
+
// Allow the Composer host (different origin) to dynamically import plugin modules.
|
|
43
|
+
cors: true,
|
|
44
|
+
},
|
|
45
|
+
preview: { port },
|
|
46
|
+
build: {
|
|
47
|
+
sourcemap: true,
|
|
48
|
+
lib: {
|
|
49
|
+
entry,
|
|
50
|
+
formats: ['es'],
|
|
51
|
+
},
|
|
52
|
+
rolldownOptions: {
|
|
53
|
+
external: EXTERNAL_DEPS,
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
}),
|
|
57
|
+
},
|
|
58
|
+
|
|
59
|
+
// Plugin 2: Dev-time externalization.
|
|
60
|
+
// Vite's dev server doesn't use rollup externals, so we need to handle it manually.
|
|
61
|
+
// We intercept imports of shared deps at resolve time, mark them external, and then
|
|
62
|
+
// strip the `/@id/` prefix that Vite's import analysis injects for external modules.
|
|
63
|
+
{
|
|
64
|
+
name: 'composer-plugin:externalize',
|
|
65
|
+
enforce: 'pre',
|
|
66
|
+
apply: 'serve',
|
|
67
|
+
// Exclude shared packages from Vite's dependency pre-bundling.
|
|
68
|
+
config: () => ({
|
|
69
|
+
optimizeDeps: {
|
|
70
|
+
exclude: DEFAULT_PACKAGES,
|
|
71
|
+
},
|
|
72
|
+
}),
|
|
73
|
+
// Mark shared deps as external so Vite doesn't try to bundle them.
|
|
74
|
+
resolveId: (id) => {
|
|
75
|
+
if (isExternal(id)) {
|
|
76
|
+
resolved.add(id);
|
|
77
|
+
return { id, external: true };
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
// Return a stub for any externalized module that Vite tries to load directly.
|
|
81
|
+
load: (id) => {
|
|
82
|
+
if (resolved.has(id)) {
|
|
83
|
+
return { code: 'export default {};' };
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
// After all plugins are resolved, inject a late-stage transform plugin that strips
|
|
87
|
+
// the `/@id/` prefix from externalized bare specifiers in the output.
|
|
88
|
+
// This must run after Vite's internal import analysis which rewrites bare specifiers.
|
|
89
|
+
configResolved: (config) => {
|
|
90
|
+
base = config.base ?? '/';
|
|
91
|
+
(config.plugins as Plugin[]).push({
|
|
92
|
+
name: 'composer-plugin:strip-prefix',
|
|
93
|
+
transform: (code: string) => {
|
|
94
|
+
if (resolved.size === 0) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const escaped = [...resolved].map((s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|');
|
|
98
|
+
const pattern = new RegExp(`${base}@id/(${escaped})`, 'g');
|
|
99
|
+
if (pattern.test(code)) {
|
|
100
|
+
return code.replace(pattern, (_: string, dep: string) => dep);
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
|
|
107
|
+
// Plugin 3: JSX dev runtime shim.
|
|
108
|
+
// React refresh (used by @vitejs/plugin-react) imports from `react/jsx-dev-runtime`,
|
|
109
|
+
// but the externalized React only exposes `react/jsx-runtime`. This virtual module
|
|
110
|
+
// bridges the gap by re-exporting jsx-runtime's functions under jsx-dev-runtime's API.
|
|
111
|
+
{
|
|
112
|
+
name: 'composer-plugin:jsx-dev-shim',
|
|
113
|
+
enforce: 'pre',
|
|
114
|
+
apply: 'serve',
|
|
115
|
+
resolveId: (id) => (id === JSX_DEV_RUNTIME ? `\0${JSX_DEV_RUNTIME}` : undefined),
|
|
116
|
+
load: (id) =>
|
|
117
|
+
id === `\0${JSX_DEV_RUNTIME}`
|
|
118
|
+
? [
|
|
119
|
+
'import { jsx, jsxs, Fragment } from "react/jsx-runtime";',
|
|
120
|
+
'export { Fragment };',
|
|
121
|
+
'export function jsxDEV(type, props, key, isStaticChildren) {',
|
|
122
|
+
' return isStaticChildren ? jsxs(type, props, key) : jsx(type, props, key);',
|
|
123
|
+
'}',
|
|
124
|
+
].join('\n')
|
|
125
|
+
: undefined,
|
|
126
|
+
},
|
|
127
|
+
];
|
|
128
|
+
};
|