@dxos/app-framework 0.8.4-main.e8ec1fe → 0.8.4-main.ef1bc66f44
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 +1 -1
- package/.storybook/preview.mts +2 -2
- package/dist/lib/browser/capability-7LE5X2NH.mjs +37 -0
- package/dist/lib/browser/capability-7LE5X2NH.mjs.map +7 -0
- package/dist/lib/browser/capability-DU35RXMD.mjs +34 -0
- package/dist/lib/browser/capability-DU35RXMD.mjs.map +7 -0
- package/dist/lib/browser/chunk-4DQMLMGU.mjs +44 -0
- package/dist/lib/browser/chunk-4DQMLMGU.mjs.map +7 -0
- package/dist/lib/browser/chunk-EIFGKQSA.mjs +170 -0
- package/dist/lib/browser/chunk-EIFGKQSA.mjs.map +7 -0
- package/dist/lib/browser/chunk-FHQTHCX7.mjs +8 -0
- package/dist/lib/browser/chunk-FHQTHCX7.mjs.map +7 -0
- package/dist/lib/browser/chunk-IGRQWMWW.mjs +80 -0
- package/dist/lib/browser/chunk-IGRQWMWW.mjs.map +7 -0
- package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/browser/chunk-KWP6PKIU.mjs +145 -0
- package/dist/lib/browser/chunk-KWP6PKIU.mjs.map +7 -0
- package/dist/lib/browser/chunk-NPUEVX42.mjs +34 -0
- package/dist/lib/browser/chunk-NPUEVX42.mjs.map +7 -0
- package/dist/lib/browser/chunk-PKQT6C53.mjs +47 -0
- package/dist/lib/browser/chunk-PKQT6C53.mjs.map +7 -0
- package/dist/lib/browser/chunk-WGWEEBUV.mjs +807 -0
- package/dist/lib/browser/chunk-WGWEEBUV.mjs.map +7 -0
- package/dist/lib/browser/chunk-YAFEA4GV.mjs +1 -0
- package/dist/lib/browser/chunk-YZQ6NFG4.mjs +781 -0
- package/dist/lib/browser/chunk-YZQ6NFG4.mjs.map +7 -0
- package/dist/lib/browser/chunk-ZQO3UZ4R.mjs +77 -0
- package/dist/lib/browser/chunk-ZQO3UZ4R.mjs.map +7 -0
- package/dist/lib/browser/cli/index.mjs +89 -0
- package/dist/lib/browser/cli/index.mjs.map +7 -0
- package/dist/lib/browser/common/activation-events.mjs +23 -0
- package/dist/lib/browser/common/capabilities.mjs +45 -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 +27 -0
- package/dist/lib/browser/core/plugin.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +88 -121
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/invoker-capability-7QW56NOM.mjs +36 -0
- package/dist/lib/browser/invoker-capability-7QW56NOM.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +72 -22
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/browser/ui/index.mjs +49 -0
- package/dist/lib/browser/ui/index.mjs.map +7 -0
- package/dist/lib/node-esm/capability-OSVYGK4X.mjs +38 -0
- package/dist/lib/node-esm/capability-OSVYGK4X.mjs.map +7 -0
- package/dist/lib/node-esm/capability-SR2EIZFP.mjs +35 -0
- package/dist/lib/node-esm/capability-SR2EIZFP.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-64IMLAS2.mjs +78 -0
- package/dist/lib/node-esm/chunk-64IMLAS2.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-7OWSHPYK.mjs +48 -0
- package/dist/lib/node-esm/chunk-7OWSHPYK.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-DHSHRYIB.mjs +171 -0
- package/dist/lib/node-esm/chunk-DHSHRYIB.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-DZ2XLAGI.mjs +146 -0
- package/dist/lib/node-esm/chunk-DZ2XLAGI.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-J2PHTRHC.mjs +45 -0
- package/dist/lib/node-esm/chunk-J2PHTRHC.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-JAZVHID3.mjs +35 -0
- package/dist/lib/node-esm/chunk-JAZVHID3.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-OQYHRZYF.mjs +81 -0
- package/dist/lib/node-esm/chunk-OQYHRZYF.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-UEWJDI2L.mjs +10 -0
- package/dist/lib/node-esm/chunk-UEWJDI2L.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-VV4YHPQQ.mjs +782 -0
- package/dist/lib/node-esm/chunk-VV4YHPQQ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-XHAKT6UD.mjs +808 -0
- package/dist/lib/node-esm/chunk-XHAKT6UD.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-Z4TJPSMP.mjs +2 -0
- package/dist/lib/node-esm/chunk-Z4TJPSMP.mjs.map +7 -0
- package/dist/lib/node-esm/cli/index.mjs +90 -0
- package/dist/lib/node-esm/cli/index.mjs.map +7 -0
- package/dist/lib/node-esm/common/activation-events.mjs +24 -0
- package/dist/lib/node-esm/common/activation-events.mjs.map +7 -0
- package/dist/lib/node-esm/common/capabilities.mjs +46 -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 +28 -0
- package/dist/lib/node-esm/core/plugin.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +88 -121
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/invoker-capability-CK4AMF2R.mjs +37 -0
- package/dist/lib/node-esm/invoker-capability-CK4AMF2R.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +72 -22
- package/dist/lib/node-esm/testing/index.mjs.map +4 -4
- package/dist/lib/node-esm/ui/index.mjs +50 -0
- package/dist/lib/node-esm/ui/index.mjs.map +7 -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 +114 -194
- 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 +33 -0
- package/dist/types/src/common/operations.d.ts.map +1 -0
- package/dist/types/src/common/translations.d.ts +7 -7
- 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} +6 -6
- 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 +5 -4
- package/dist/types/src/core/index.d.ts.map +1 -1
- package/dist/types/src/core/plugin-manager.d.ts +66 -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 +92 -34
- package/dist/types/src/core/plugin.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +3 -2
- 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 +5 -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 +109 -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 +4 -4
- package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
- package/dist/types/src/ui/components/App.d.ts +8 -0
- package/dist/types/src/ui/components/App.d.ts.map +1 -0
- package/dist/types/src/ui/components/App.stories.d.ts.map +1 -0
- package/dist/types/src/ui/components/DefaultFallback.d.ts.map +1 -0
- package/dist/types/src/ui/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/types/src/{playground/playground.stories.d.ts → ui/components/PluginManagerContext.stories.d.ts} +5 -3
- package/dist/types/src/ui/components/PluginManagerContext.stories.d.ts.map +1 -0
- package/dist/types/src/ui/components/PluginManagerProvider.d.ts +10 -0
- package/dist/types/src/ui/components/PluginManagerProvider.d.ts.map +1 -0
- package/dist/types/src/ui/components/index.d.ts +5 -0
- package/dist/types/src/ui/components/index.d.ts.map +1 -0
- package/dist/types/src/ui/components/surface/SurfaceComponent.d.ts +12 -0
- package/dist/types/src/ui/components/surface/SurfaceComponent.d.ts.map +1 -0
- package/dist/types/src/{react/Surface.stories.d.ts → ui/components/surface/SurfaceComponent.stories.d.ts} +1 -1
- 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/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 +5 -0
- package/dist/types/src/ui/components/surface/index.d.ts.map +1 -0
- package/dist/types/src/ui/components/surface/types.d.ts +94 -0
- package/dist/types/src/ui/components/surface/types.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/{react → ui/hooks}/useApp.d.ts +12 -6
- package/dist/types/src/ui/hooks/useApp.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/{react → ui/hooks}/useLoading.d.ts +1 -2
- package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useOperationResolver.d.ts +19 -0
- package/dist/types/src/ui/hooks/useOperationResolver.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 +4 -0
- package/dist/types/src/ui/index.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/moon.yml +10 -3
- package/package.json +112 -52
- package/src/cli/cli.ts +107 -0
- package/src/{playground/debug → cli}/index.ts +1 -1
- package/src/common/activation-events.ts +44 -0
- package/src/common/capabilities.ts +174 -210
- package/src/common/index.ts +4 -8
- package/src/common/operations.ts +38 -0
- package/src/common/translations.ts +17 -9
- package/src/context.ts +9 -0
- package/src/core/{events.ts → activation-event.ts} +5 -5
- package/src/core/capability-manager.test.ts +151 -0
- package/src/core/capability-manager.ts +171 -0
- package/src/core/capability.ts +236 -0
- package/src/core/index.ts +5 -4
- package/src/core/plugin-manager.test.ts +845 -0
- package/src/core/plugin-manager.ts +696 -0
- package/src/core/plugin.ts +221 -39
- package/src/index.ts +3 -2
- package/src/plugin-operation/OperationPlugin.ts +25 -0
- package/src/plugin-operation/history/capability.ts +37 -0
- package/src/plugin-operation/history/errors.ts +11 -0
- package/src/plugin-operation/history/history-tracker.test.ts +380 -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 +40 -0
- package/src/plugin-operation/meta.ts +11 -0
- package/src/plugin-operation/testing.ts +174 -0
- package/src/plugin-runtime/RuntimePlugin.ts +20 -0
- package/src/plugin-runtime/capability.ts +53 -0
- package/src/{playground/layout → 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 +7 -7
- package/src/testing/withPluginManager.tsx +21 -23
- package/src/ui/components/App.stories.tsx +62 -0
- package/src/{react → ui/components}/App.tsx +9 -11
- package/src/ui/components/PluginManagerContext.stories.tsx +183 -0
- package/src/{react → ui/components}/PluginManagerProvider.ts +3 -3
- package/src/ui/components/index.ts +8 -0
- package/src/{react/Surface.stories.tsx → ui/components/surface/SurfaceComponent.stories.tsx} +36 -19
- package/src/ui/components/surface/SurfaceComponent.tsx +262 -0
- package/src/ui/components/surface/SurfaceInfo.tsx +107 -0
- package/src/ui/components/surface/context.ts +12 -0
- package/src/ui/components/surface/index.ts +8 -0
- package/src/ui/components/surface/types.ts +119 -0
- package/src/ui/hooks/index.ts +10 -0
- package/src/ui/hooks/useApp.tsx +215 -0
- package/src/ui/hooks/useCapabilities.ts +67 -0
- package/src/{react → ui/hooks}/useLoading.tsx +4 -6
- package/src/ui/hooks/useOperationResolver.ts +40 -0
- package/src/ui/hooks/useSettingsState.ts +26 -0
- package/src/ui/hooks/useSurface.ts +13 -0
- package/src/ui/index.ts +7 -0
- package/tsconfig.json +10 -31
- package/.swc/plugins/linux_x86_64_19.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429.wasmer-v7 +0 -0
- package/dist/lib/browser/app-graph-builder-OIEZZC45.mjs +0 -138
- package/dist/lib/browser/app-graph-builder-OIEZZC45.mjs.map +0 -7
- package/dist/lib/browser/chunk-SCPE4ZO2.mjs +0 -35
- package/dist/lib/browser/chunk-SCPE4ZO2.mjs.map +0 -7
- package/dist/lib/browser/chunk-VFUKEZIN.mjs +0 -483
- package/dist/lib/browser/chunk-VFUKEZIN.mjs.map +0 -7
- package/dist/lib/browser/chunk-WPW5VVAX.mjs +0 -1651
- package/dist/lib/browser/chunk-WPW5VVAX.mjs.map +0 -7
- package/dist/lib/browser/intent-dispatcher-LZ4AE66E.mjs +0 -11
- package/dist/lib/browser/intent-resolver-QVCKRX6G.mjs +0 -39
- package/dist/lib/browser/intent-resolver-QVCKRX6G.mjs.map +0 -7
- package/dist/lib/browser/react/index.mjs +0 -34
- package/dist/lib/browser/store-CNPHOYTJ.mjs +0 -30
- package/dist/lib/browser/store-CNPHOYTJ.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-EBU4NVWD.mjs +0 -139
- package/dist/lib/node-esm/app-graph-builder-EBU4NVWD.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-IJOHO66N.mjs +0 -484
- package/dist/lib/node-esm/chunk-IJOHO66N.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-XJZGUJ3H.mjs +0 -1653
- package/dist/lib/node-esm/chunk-XJZGUJ3H.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-ZX63QUGE.mjs +0 -37
- package/dist/lib/node-esm/chunk-ZX63QUGE.mjs.map +0 -7
- package/dist/lib/node-esm/intent-dispatcher-MGOJ3CHD.mjs +0 -12
- package/dist/lib/node-esm/intent-resolver-URF3HN3G.mjs +0 -40
- package/dist/lib/node-esm/intent-resolver-URF3HN3G.mjs.map +0 -7
- package/dist/lib/node-esm/react/index.mjs +0 -35
- package/dist/lib/node-esm/store-RK5B4XEL.mjs +0 -31
- package/dist/lib/node-esm/store-RK5B4XEL.mjs.map +0 -7
- package/dist/types/src/common/collaboration.d.ts +0 -20
- 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 -279
- package/dist/types/src/common/layout.d.ts.map +0 -1
- package/dist/types/src/common/surface.d.ts +0 -68
- package/dist/types/src/common/surface.d.ts.map +0 -1
- package/dist/types/src/core/capabilities.d.ts +0 -117
- 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.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 -36
- 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 -6
- 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-intent/meta.d.ts +0 -3
- package/dist/types/src/plugin-intent/meta.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 -25
- 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/meta.d.ts +0 -3
- package/dist/types/src/plugin-settings/meta.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 -11
- package/dist/types/src/plugin-settings/translations.d.ts.map +0 -1
- package/dist/types/src/react/App.d.ts +0 -10
- package/dist/types/src/react/App.d.ts.map +0 -1
- package/dist/types/src/react/App.stories.d.ts.map +0 -1
- package/dist/types/src/react/DefaultFallback.d.ts.map +0 -1
- 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.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 -9
- package/dist/types/src/react/index.d.ts.map +0 -1
- package/dist/types/src/react/types.d.ts +0 -14
- package/dist/types/src/react/types.d.ts.map +0 -1
- package/dist/types/src/react/useApp.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/react/useLoading.d.ts.map +0 -1
- package/src/common/collaboration.ts +0 -18
- 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 -277
- package/src/common/surface.ts +0 -88
- package/src/core/capabilities.test.ts +0 -136
- package/src/core/capabilities.ts +0 -263
- package/src/core/manager.test.ts +0 -516
- package/src/core/manager.ts +0 -604
- package/src/playground/debug/Debug.tsx +0 -39
- package/src/playground/debug/plugin.ts +0 -16
- package/src/playground/generator/Main.tsx +0 -70
- 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 -22
- package/src/playground/layout/Layout.tsx +0 -33
- package/src/playground/layout/plugin.ts +0 -18
- package/src/playground/logger/Toolbar.tsx +0 -30
- package/src/playground/logger/index.ts +0 -5
- package/src/playground/logger/plugin.ts +0 -41
- package/src/playground/logger/schema.ts +0 -12
- package/src/playground/playground.stories.tsx +0 -46
- package/src/plugin-intent/IntentPlugin.ts +0 -20
- package/src/plugin-intent/actions.ts +0 -31
- package/src/plugin-intent/errors.ts +0 -40
- package/src/plugin-intent/index.ts +0 -9
- package/src/plugin-intent/intent-dispatcher.test.ts +0 -286
- package/src/plugin-intent/intent-dispatcher.ts +0 -342
- package/src/plugin-intent/intent.ts +0 -154
- package/src/plugin-intent/meta.ts +0 -10
- package/src/plugin-settings/SettingsPlugin.ts +0 -34
- package/src/plugin-settings/actions.ts +0 -25
- package/src/plugin-settings/app-graph-builder.ts +0 -160
- package/src/plugin-settings/index.ts +0 -6
- package/src/plugin-settings/intent-resolver.ts +0 -35
- package/src/plugin-settings/meta.ts +0 -10
- package/src/plugin-settings/store.ts +0 -33
- package/src/plugin-settings/translations.ts +0 -19
- package/src/react/App.stories.tsx +0 -33
- package/src/react/IntentContext.tsx +0 -35
- package/src/react/Surface.tsx +0 -109
- package/src/react/common.ts +0 -13
- package/src/react/index.ts +0 -14
- package/src/react/types.ts +0 -37
- package/src/react/useApp.tsx +0 -165
- package/src/react/useCapabilities.ts +0 -31
- package/src/react/useIntentResolver.ts +0 -22
- /package/dist/lib/browser/{intent-dispatcher-LZ4AE66E.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
- /package/dist/lib/browser/{react/index.mjs.map → chunk-YAFEA4GV.mjs.map} +0 -0
- /package/dist/lib/{node-esm/intent-dispatcher-MGOJ3CHD.mjs.map → browser/common/activation-events.mjs.map} +0 -0
- /package/dist/lib/{node-esm/react/index.mjs.map → browser/common/capabilities.mjs.map} +0 -0
- /package/dist/types/src/{react → ui/components}/App.stories.d.ts +0 -0
- /package/dist/types/src/{react → ui/components}/DefaultFallback.d.ts +0 -0
- /package/dist/types/src/{react → ui/components}/ErrorBoundary.d.ts +0 -0
- /package/src/{react → ui/components}/DefaultFallback.tsx +0 -0
- /package/src/{react → ui/components}/ErrorBoundary.tsx +0 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import React, {
|
|
6
|
+
type ReactElement,
|
|
7
|
+
type Ref,
|
|
8
|
+
cloneElement,
|
|
9
|
+
forwardRef,
|
|
10
|
+
useCallback,
|
|
11
|
+
useLayoutEffect,
|
|
12
|
+
useState,
|
|
13
|
+
} from 'react';
|
|
14
|
+
import { createPortal } from 'react-dom';
|
|
15
|
+
|
|
16
|
+
import { addEventListener, combine } from '@dxos/async';
|
|
17
|
+
import { useMergeRefs } from '@dxos/react-hooks';
|
|
18
|
+
|
|
19
|
+
import { useSurface } from '../../hooks';
|
|
20
|
+
|
|
21
|
+
export type SurfaceInfoProps = {
|
|
22
|
+
children: ReactElement<{ ref?: Ref<HTMLElement> }>;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Debug wrapper for surfaces.
|
|
27
|
+
*/
|
|
28
|
+
export const SurfaceInfo = forwardRef<HTMLElement, SurfaceInfoProps>(({ children }, forwardedRef) => {
|
|
29
|
+
const [rect, setRect] = useState<DOMRect | null>(null);
|
|
30
|
+
const [expand, setExpand] = useState(false);
|
|
31
|
+
const info = useSurface();
|
|
32
|
+
|
|
33
|
+
const [root, setRoot] = useState<HTMLElement | null>(null);
|
|
34
|
+
const measureRef = useCallback((node: HTMLElement | null) => setRoot(node), []);
|
|
35
|
+
const mergedRef = useMergeRefs([measureRef, forwardedRef]);
|
|
36
|
+
const childWithRef = cloneElement(children, { ref: mergedRef });
|
|
37
|
+
|
|
38
|
+
useLayoutEffect(() => {
|
|
39
|
+
if (!root) {
|
|
40
|
+
setRect(null);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const measure = () => {
|
|
45
|
+
setRect(root.getBoundingClientRect());
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const observer = new ResizeObserver(measure);
|
|
49
|
+
observer.observe(root);
|
|
50
|
+
measure();
|
|
51
|
+
|
|
52
|
+
return combine(
|
|
53
|
+
addEventListener(window, 'scroll', measure, true),
|
|
54
|
+
addEventListener(window, 'resize', measure),
|
|
55
|
+
() => {
|
|
56
|
+
observer.disconnect();
|
|
57
|
+
},
|
|
58
|
+
);
|
|
59
|
+
}, [root]);
|
|
60
|
+
|
|
61
|
+
const padding = 0;
|
|
62
|
+
return (
|
|
63
|
+
<>
|
|
64
|
+
{childWithRef}
|
|
65
|
+
{rect &&
|
|
66
|
+
createPortal(
|
|
67
|
+
<div
|
|
68
|
+
role='none'
|
|
69
|
+
className='z-[100] fixed flex flex-col-reverse scrollbar-none overflow-auto pointer-events-none'
|
|
70
|
+
style={{
|
|
71
|
+
top: rect.top + padding,
|
|
72
|
+
left: rect.left + padding,
|
|
73
|
+
width: rect.width - padding * 2,
|
|
74
|
+
height: rect.height - padding * 2,
|
|
75
|
+
}}
|
|
76
|
+
>
|
|
77
|
+
{expand ? (
|
|
78
|
+
<div
|
|
79
|
+
className='absolute inset-0 bg-deckSurface border border-green-500 cursor-pointer pointer-events-auto overflow-auto'
|
|
80
|
+
onPointerDown={(ev) => ev.stopPropagation()}
|
|
81
|
+
onClick={(ev) => {
|
|
82
|
+
ev.stopPropagation();
|
|
83
|
+
setExpand(false);
|
|
84
|
+
}}
|
|
85
|
+
>
|
|
86
|
+
<pre className='p-2 text-xs text-description font-mono'>{JSON.stringify({ info }, null, 2)}</pre>
|
|
87
|
+
</div>
|
|
88
|
+
) : (
|
|
89
|
+
<span
|
|
90
|
+
className='absolute right-1 bottom-0 flex items-center p-1 text-green-500 opacity-80 hover:opacity-100 text-xl cursor-pointer pointer-events-auto'
|
|
91
|
+
title={info.id}
|
|
92
|
+
onPointerDown={(ev) => ev.stopPropagation()}
|
|
93
|
+
onClick={(ev) => {
|
|
94
|
+
ev.stopPropagation();
|
|
95
|
+
setExpand(true);
|
|
96
|
+
}}
|
|
97
|
+
>
|
|
98
|
+
ⓘ
|
|
99
|
+
</span>
|
|
100
|
+
)}
|
|
101
|
+
</div>,
|
|
102
|
+
// TODO(burdon): Create well-known element to gather all debug portals.
|
|
103
|
+
document.body,
|
|
104
|
+
)}
|
|
105
|
+
</>
|
|
106
|
+
);
|
|
107
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Context, createContext } from 'react';
|
|
6
|
+
|
|
7
|
+
import { type Props } from './types';
|
|
8
|
+
|
|
9
|
+
export type SurfaceContext = Pick<Props, 'id' | 'role' | 'data'>;
|
|
10
|
+
|
|
11
|
+
// TODO(burdon): Use @radix-ui/react-context
|
|
12
|
+
export const SurfaceContext: Context<SurfaceContext | undefined> = createContext<SurfaceContext | undefined>(undefined);
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2023 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import type { PropsWithChildren, ReactNode, RefCallback } from 'react';
|
|
6
|
+
|
|
7
|
+
import type { MakeOptional, Position } from '@dxos/util';
|
|
8
|
+
|
|
9
|
+
import type { ErrorBoundary } from '..';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Props that are passed to the Surface component.
|
|
13
|
+
*/
|
|
14
|
+
export type Props<T extends Record<string, any> = Record<string, unknown>> = {
|
|
15
|
+
/**
|
|
16
|
+
* If specified, the Surface will be wrapped in an error boundary.
|
|
17
|
+
* The fallback component will be rendered if an error occurs.
|
|
18
|
+
*/
|
|
19
|
+
fallback?: ErrorBoundary['props']['fallback'];
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* If specified, the Surface will be wrapped in a suspense boundary.
|
|
23
|
+
* The placeholder component will be rendered while the surface component is loading.
|
|
24
|
+
*/
|
|
25
|
+
placeholder?: ReactNode;
|
|
26
|
+
} & MakeOptional<CoreProps<T>, 'id' | 'data'> &
|
|
27
|
+
/**
|
|
28
|
+
* Additional props to pass to the component.
|
|
29
|
+
* These props are not used by Surface itself but may be used by components which resolve the surface.
|
|
30
|
+
* Exclude known prop names to prevent overriding well-defined props.
|
|
31
|
+
*/
|
|
32
|
+
{
|
|
33
|
+
[K in keyof Record<string, any>]: K extends keyof CoreProps<T> | 'fallback' | 'placeholder' ? never : any;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* NOTE: If `[key: string]: unknown` is included in shared types, when re-used other fields become unknown as well.
|
|
38
|
+
*/
|
|
39
|
+
export type CoreProps<T extends Record<string, any> = Record<string, unknown>> = PropsWithChildren<{
|
|
40
|
+
/**
|
|
41
|
+
* ID for debugging.
|
|
42
|
+
*/
|
|
43
|
+
id: string;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Role defines how the data should be rendered.
|
|
47
|
+
*/
|
|
48
|
+
role: string;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* The data to be rendered by the surface.
|
|
52
|
+
* NOTE: This must be a stable value.
|
|
53
|
+
*/
|
|
54
|
+
data: T;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* If more than one component is resolved, the limit determines how many are rendered.
|
|
58
|
+
*/
|
|
59
|
+
limit?: number | undefined;
|
|
60
|
+
}>;
|
|
61
|
+
|
|
62
|
+
// TODO(burdon): Remove ref since relying on this would be error prone.
|
|
63
|
+
export type ComponentProps<T extends Record<string, any> = Record<string, any>> = CoreProps<T> & {
|
|
64
|
+
ref?: RefCallback<HTMLElement>;
|
|
65
|
+
} & Record<string, any>;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* React component used to render a surface once is has matched.
|
|
69
|
+
*/
|
|
70
|
+
export type ComponentFunction<T extends Record<string, any> = Record<string, any>> = (
|
|
71
|
+
props: ComponentProps<T>,
|
|
72
|
+
) => ReactNode;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Definition of when a React component surface should be rendered.
|
|
76
|
+
*/
|
|
77
|
+
export type ReactDefinition<T extends Record<string, any> = any> = Readonly<{
|
|
78
|
+
kind: 'react';
|
|
79
|
+
id: string;
|
|
80
|
+
role: string | string[];
|
|
81
|
+
position?: Position;
|
|
82
|
+
component: ComponentFunction<T>;
|
|
83
|
+
filter?: (data: Record<string, unknown>) => data is T;
|
|
84
|
+
}>;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Definition of when a Web Component surface should be rendered.
|
|
88
|
+
*/
|
|
89
|
+
export type WebComponentDefinition<T extends Record<string, any> = any> = Readonly<{
|
|
90
|
+
kind: 'web-component';
|
|
91
|
+
id: string;
|
|
92
|
+
role: string | string[];
|
|
93
|
+
position?: Position;
|
|
94
|
+
/**
|
|
95
|
+
* The tag name of the Web Component to render.
|
|
96
|
+
* The Web Component will receive the same props as React surfaces via properties/attributes.
|
|
97
|
+
*/
|
|
98
|
+
tagName: string;
|
|
99
|
+
filter?: (data: Record<string, unknown>) => data is T;
|
|
100
|
+
}>;
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Definition of when a surface (React or Web Component) should be rendered.
|
|
104
|
+
*/
|
|
105
|
+
export type Definition<T extends Record<string, any> = any> = ReactDefinition<T> | WebComponentDefinition<T>;
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Creates a React surface definition.
|
|
109
|
+
*/
|
|
110
|
+
export const create = <T extends Record<string, any> = any>(
|
|
111
|
+
definition: Omit<ReactDefinition<T>, 'kind'>,
|
|
112
|
+
): ReactDefinition<T> => ({ ...definition, kind: 'react' });
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Creates a Web Component surface definition.
|
|
116
|
+
*/
|
|
117
|
+
export const createWeb = <T extends Record<string, any> = any>(
|
|
118
|
+
definition: Omit<WebComponentDefinition<T>, 'kind'>,
|
|
119
|
+
): WebComponentDefinition<T> => ({ ...definition, kind: 'web-component' });
|
|
@@ -0,0 +1,215 @@
|
|
|
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 { useAsyncEffect, useDefaultValue } from '@dxos/react-hooks';
|
|
16
|
+
import { ContextProtocolProvider } from '@dxos/web-context-react';
|
|
17
|
+
|
|
18
|
+
import { ActivationEvents, Capabilities } from '../../common';
|
|
19
|
+
import { PluginManagerContext } from '../../context';
|
|
20
|
+
import { type ActivationEvent, type Plugin, PluginManager } from '../../core';
|
|
21
|
+
import { App } from '../components/App';
|
|
22
|
+
import { DefaultFallback } from '../components/DefaultFallback';
|
|
23
|
+
import { ErrorBoundary } from '../components/ErrorBoundary';
|
|
24
|
+
import { PluginManagerProvider } from '../components/PluginManagerProvider';
|
|
25
|
+
|
|
26
|
+
const ENABLED_KEY = 'dxos.org/app-framework/enabled';
|
|
27
|
+
|
|
28
|
+
export type UseAppOptions = {
|
|
29
|
+
pluginManager?: PluginManager.PluginManager;
|
|
30
|
+
pluginLoader?: PluginManager.ManagerOptions['pluginLoader'];
|
|
31
|
+
plugins?: Plugin.Plugin[];
|
|
32
|
+
core?: string[];
|
|
33
|
+
defaults?: string[];
|
|
34
|
+
/**
|
|
35
|
+
* Additional activation events to fire before startup.
|
|
36
|
+
* These are fired alongside SetupReactSurface before the Startup event.
|
|
37
|
+
*/
|
|
38
|
+
setupEvents?: ActivationEvent.ActivationEvent[];
|
|
39
|
+
placeholder?: FC<{ stage: number }>;
|
|
40
|
+
fallback?: ErrorBoundary['props']['fallback'];
|
|
41
|
+
cacheEnabled?: boolean;
|
|
42
|
+
safeMode?: boolean;
|
|
43
|
+
debounce?: number;
|
|
44
|
+
timeout?: number;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Expected usage is for this to be the entrypoint of the application.
|
|
49
|
+
* Initializes plugins and renders the root components.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* const plugins = [LayoutPlugin(), MyPlugin()];
|
|
53
|
+
* const core = [LayoutPluginId];
|
|
54
|
+
* const default = [MyPluginId];
|
|
55
|
+
* const fallback = <div>Initializing Plugins...</div>;
|
|
56
|
+
* const App = useApp({ plugins, core, default, fallback });
|
|
57
|
+
* createRoot(document.getElementById('root')!).render(
|
|
58
|
+
* <StrictMode>
|
|
59
|
+
* <App />
|
|
60
|
+
* </StrictMode>,
|
|
61
|
+
* );
|
|
62
|
+
*
|
|
63
|
+
* @param params.pluginLoader A function which loads new plugins.
|
|
64
|
+
* @param params.plugins All plugins available to the application.
|
|
65
|
+
* @param params.core Core plugins which will always be enabled.
|
|
66
|
+
* @param params.defaults Default plugins are enabled by default but can be disabled by the user.
|
|
67
|
+
* @param params.placeholder Placeholder component to render during startup.
|
|
68
|
+
* @param params.fallback Fallback component to render if an error occurs during startup.
|
|
69
|
+
* @param params.cacheEnabled Whether to cache enabled plugins in localStorage.
|
|
70
|
+
* @param params.safeMode Whether to enable safe mode, which disables optional plugins.
|
|
71
|
+
*/
|
|
72
|
+
export const useApp = ({
|
|
73
|
+
pluginManager,
|
|
74
|
+
pluginLoader: pluginLoaderProp,
|
|
75
|
+
plugins: pluginsProp,
|
|
76
|
+
core: coreProp,
|
|
77
|
+
defaults: defaultsProp,
|
|
78
|
+
setupEvents: setupEventsProp,
|
|
79
|
+
placeholder,
|
|
80
|
+
fallback = DefaultFallback,
|
|
81
|
+
cacheEnabled = false,
|
|
82
|
+
safeMode = false,
|
|
83
|
+
debounce = 0,
|
|
84
|
+
timeout = 30_000,
|
|
85
|
+
}: UseAppOptions) => {
|
|
86
|
+
const plugins = useDefaultValue(pluginsProp, () => []);
|
|
87
|
+
const core = useDefaultValue(coreProp, () => plugins.map(({ meta }) => meta.id));
|
|
88
|
+
const defaults = useDefaultValue(defaultsProp, () => []);
|
|
89
|
+
const setupEvents = useDefaultValue(setupEventsProp, () => []);
|
|
90
|
+
|
|
91
|
+
// TODO(wittjosiah): Provide a custom plugin loader which supports loading via url.
|
|
92
|
+
const pluginLoader = useMemo(
|
|
93
|
+
() =>
|
|
94
|
+
pluginLoaderProp ??
|
|
95
|
+
((id: string) =>
|
|
96
|
+
Effect.sync(() => {
|
|
97
|
+
const plugin = plugins.find((plugin) => plugin.meta.id === id);
|
|
98
|
+
invariant(plugin, `Plugin not found: ${id}`);
|
|
99
|
+
return plugin;
|
|
100
|
+
})),
|
|
101
|
+
[pluginLoaderProp, plugins],
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
const readyRef = useRef(false);
|
|
105
|
+
const [ready, setReady] = useState(false);
|
|
106
|
+
const errorRef = useRef<unknown>(null);
|
|
107
|
+
const [error, setError] = useState<unknown>(null);
|
|
108
|
+
// TODO(wittjosiah): Migrate to Atom.kvs for isomorphic storage.
|
|
109
|
+
const cached: string[] = useMemo(() => JSON.parse(localStorage.getItem(ENABLED_KEY) ?? '[]'), []);
|
|
110
|
+
const enabled = useMemo(
|
|
111
|
+
() => (safeMode ? [] : cacheEnabled && cached.length > 0 ? cached : defaults),
|
|
112
|
+
[safeMode, cacheEnabled, cached, defaults],
|
|
113
|
+
);
|
|
114
|
+
const manager = useMemo(
|
|
115
|
+
() => pluginManager ?? PluginManager.make({ pluginLoader, plugins, core, enabled }),
|
|
116
|
+
[pluginManager, pluginLoader, plugins, core, enabled],
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
useEffect(() => {
|
|
120
|
+
if (!cacheEnabled) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
return manager.registry.subscribe(manager.enabled, (value) => {
|
|
124
|
+
localStorage.setItem(ENABLED_KEY, JSON.stringify(value));
|
|
125
|
+
});
|
|
126
|
+
}, [cacheEnabled, manager]);
|
|
127
|
+
|
|
128
|
+
useEffect(() => {
|
|
129
|
+
setupDevtools(manager);
|
|
130
|
+
}, [manager]);
|
|
131
|
+
|
|
132
|
+
useAsyncEffect(async () => {
|
|
133
|
+
manager.capabilities.contribute({
|
|
134
|
+
interface: Capabilities.PluginManager,
|
|
135
|
+
implementation: manager,
|
|
136
|
+
module: 'dxos.org/app-framework/plugin-manager',
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
manager.capabilities.contribute({
|
|
140
|
+
interface: Capabilities.AtomRegistry,
|
|
141
|
+
implementation: manager.registry,
|
|
142
|
+
module: 'dxos.org/app-framework/atom-registry',
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
const fiber = Effect.gen(function* () {
|
|
146
|
+
const queue = yield* PubSub.subscribe(manager.activation);
|
|
147
|
+
const listener = yield* Effect.forkDaemon(
|
|
148
|
+
Queue.take(queue).pipe(
|
|
149
|
+
Effect.tap(({ event, state, error: error$ }) =>
|
|
150
|
+
Effect.sync(() => {
|
|
151
|
+
if (event === ActivationEvents.Startup.id && state === 'activated') {
|
|
152
|
+
clearTimeout(timeoutId);
|
|
153
|
+
setReady(true);
|
|
154
|
+
readyRef.current = true;
|
|
155
|
+
}
|
|
156
|
+
if (error$ && !readyRef.current) {
|
|
157
|
+
setError(error$);
|
|
158
|
+
errorRef.current = error$;
|
|
159
|
+
}
|
|
160
|
+
}),
|
|
161
|
+
),
|
|
162
|
+
Effect.forever,
|
|
163
|
+
),
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
yield* Effect.all([
|
|
167
|
+
...setupEvents.map((event) => manager.activate(event)),
|
|
168
|
+
manager.activate(ActivationEvents.SetupReactSurface),
|
|
169
|
+
manager.activate(ActivationEvents.Startup),
|
|
170
|
+
]);
|
|
171
|
+
|
|
172
|
+
return yield* Fiber.join(listener);
|
|
173
|
+
}).pipe(Effect.scoped, Effect.runFork);
|
|
174
|
+
|
|
175
|
+
// Set up a timeout for startup.
|
|
176
|
+
const timeoutId = setTimeout(() => {
|
|
177
|
+
if (!readyRef.current && !errorRef.current) {
|
|
178
|
+
log.warn('startup timeout diagnostic', {
|
|
179
|
+
eventsFired: manager.getEventsFired(),
|
|
180
|
+
activeModules: manager.getActive(),
|
|
181
|
+
pendingReset: manager.getPendingReset(),
|
|
182
|
+
});
|
|
183
|
+
void runAndForwardErrors(Fiber.interrupt(fiber));
|
|
184
|
+
setError(new Error(`Startup timed out after ${timeout}ms`));
|
|
185
|
+
}
|
|
186
|
+
}, timeout);
|
|
187
|
+
|
|
188
|
+
return () => {
|
|
189
|
+
clearTimeout(timeoutId);
|
|
190
|
+
void runAndForwardErrors(Fiber.interrupt(fiber));
|
|
191
|
+
manager.capabilities.remove(Capabilities.PluginManager, manager);
|
|
192
|
+
manager.capabilities.remove(Capabilities.AtomRegistry, manager.registry);
|
|
193
|
+
};
|
|
194
|
+
}, [manager]);
|
|
195
|
+
|
|
196
|
+
return useCallback(
|
|
197
|
+
() => (
|
|
198
|
+
<ErrorBoundary fallback={fallback}>
|
|
199
|
+
<PluginManagerProvider value={manager}>
|
|
200
|
+
<ContextProtocolProvider value={manager} context={PluginManagerContext}>
|
|
201
|
+
<RegistryContext.Provider value={manager.registry}>
|
|
202
|
+
<App placeholder={placeholder} ready={ready} error={error} debounce={debounce} />
|
|
203
|
+
</RegistryContext.Provider>
|
|
204
|
+
</ContextProtocolProvider>
|
|
205
|
+
</PluginManagerProvider>
|
|
206
|
+
</ErrorBoundary>
|
|
207
|
+
),
|
|
208
|
+
[fallback, manager, placeholder, ready, error],
|
|
209
|
+
);
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
const setupDevtools = (manager: PluginManager.PluginManager) => {
|
|
213
|
+
(globalThis as any).composer ??= {};
|
|
214
|
+
(globalThis as any).composer.manager = manager;
|
|
215
|
+
};
|
|
@@ -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/PluginManagerProvider';
|
|
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);
|
|
@@ -4,8 +4,6 @@
|
|
|
4
4
|
|
|
5
5
|
import { useEffect, useState } from 'react';
|
|
6
6
|
|
|
7
|
-
import { type AppProps } from './App';
|
|
8
|
-
|
|
9
7
|
export enum LoadingState {
|
|
10
8
|
Loading = 0,
|
|
11
9
|
FadeIn = 1,
|
|
@@ -23,7 +21,7 @@ export enum LoadingState {
|
|
|
23
21
|
* 2: Fade-out - Fade out the loading animation.
|
|
24
22
|
* 3: Done - Remove the placeholder.
|
|
25
23
|
*/
|
|
26
|
-
export const useLoading = (
|
|
24
|
+
export const useLoading = (ready: boolean, debounce = 0) => {
|
|
27
25
|
const [stage, setStage] = useState<LoadingState>(LoadingState.Loading);
|
|
28
26
|
useEffect(() => {
|
|
29
27
|
if (!debounce) {
|
|
@@ -34,7 +32,7 @@ export const useLoading = (state: AppProps['state'], debounce = 0) => {
|
|
|
34
32
|
setStage((stage) => {
|
|
35
33
|
switch (stage) {
|
|
36
34
|
case LoadingState.Loading: {
|
|
37
|
-
if (!
|
|
35
|
+
if (!ready) {
|
|
38
36
|
return LoadingState.FadeIn;
|
|
39
37
|
} else {
|
|
40
38
|
clearInterval(i);
|
|
@@ -43,7 +41,7 @@ export const useLoading = (state: AppProps['state'], debounce = 0) => {
|
|
|
43
41
|
}
|
|
44
42
|
|
|
45
43
|
case LoadingState.FadeIn: {
|
|
46
|
-
if (
|
|
44
|
+
if (ready) {
|
|
47
45
|
return LoadingState.FadeOut;
|
|
48
46
|
}
|
|
49
47
|
break;
|
|
@@ -63,7 +61,7 @@ export const useLoading = (state: AppProps['state'], debounce = 0) => {
|
|
|
63
61
|
}, [debounce]);
|
|
64
62
|
|
|
65
63
|
if (!debounce) {
|
|
66
|
-
return
|
|
64
|
+
return ready ? LoadingState.Done : LoadingState.Loading;
|
|
67
65
|
}
|
|
68
66
|
|
|
69
67
|
return stage;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { useEffect, useMemo } from 'react';
|
|
6
|
+
|
|
7
|
+
import { Capabilities } from '../../common';
|
|
8
|
+
import { usePluginManager } from '../components/PluginManagerProvider';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Hook to dynamically register an operation resolver (handler) within a React component.
|
|
12
|
+
* The resolver is added when the component mounts and removed when it unmounts.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* const scrollHandler = useMemo(() => OperationResolver.make({
|
|
17
|
+
* operation: LayoutOperation.ScrollIntoView,
|
|
18
|
+
* handler: (input) => Effect.sync(() => {
|
|
19
|
+
* // Handle scroll
|
|
20
|
+
* }),
|
|
21
|
+
* }), [deps]);
|
|
22
|
+
*
|
|
23
|
+
* useOperationResolver(meta.id, scrollHandler);
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export const useOperationResolver = (module: string, resolver: Capabilities.OperationResolver) => {
|
|
27
|
+
const manager = usePluginManager();
|
|
28
|
+
// Wrap single resolver in array as the capability expects an array.
|
|
29
|
+
const resolverArray = useMemo(() => [resolver], [resolver]);
|
|
30
|
+
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
manager.capabilities.contribute({
|
|
33
|
+
module,
|
|
34
|
+
interface: Capabilities.OperationResolver,
|
|
35
|
+
implementation: resolverArray,
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
return () => manager.capabilities.remove(Capabilities.OperationResolver, resolverArray);
|
|
39
|
+
}, [module, resolverArray]);
|
|
40
|
+
};
|
|
@@ -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 { SurfaceContext } from '../components/surface/context';
|
|
10
|
+
|
|
11
|
+
export const useSurface = (): SurfaceContext => {
|
|
12
|
+
return useContext(SurfaceContext) ?? raise(new Error('Missing SurfaceContext'));
|
|
13
|
+
};
|