@dxos/app-framework 0.8.4-main.67995b8 → 0.8.4-main.6fa680abb7
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-6YMUBS54.mjs +37 -0
- package/dist/lib/browser/capability-6YMUBS54.mjs.map +7 -0
- package/dist/lib/browser/capability-LF3OXSCV.mjs +34 -0
- package/dist/lib/browser/capability-LF3OXSCV.mjs.map +7 -0
- package/dist/lib/browser/chunk-272IPLHQ.mjs +47 -0
- package/dist/lib/browser/chunk-272IPLHQ.mjs.map +7 -0
- package/dist/lib/browser/chunk-2UI6ACB5.mjs +824 -0
- package/dist/lib/browser/chunk-2UI6ACB5.mjs.map +7 -0
- package/dist/lib/browser/chunk-7M4467QR.mjs +145 -0
- package/dist/lib/browser/chunk-7M4467QR.mjs.map +7 -0
- package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/browser/chunk-JGWCBVKJ.mjs +170 -0
- package/dist/lib/browser/chunk-JGWCBVKJ.mjs.map +7 -0
- package/dist/lib/browser/chunk-M5IC326L.mjs +34 -0
- package/dist/lib/browser/chunk-M5IC326L.mjs.map +7 -0
- package/dist/lib/browser/chunk-NQPYE365.mjs +703 -0
- package/dist/lib/browser/chunk-NQPYE365.mjs.map +7 -0
- package/dist/lib/browser/chunk-TGX63LTL.mjs +8 -0
- package/dist/lib/browser/chunk-TGX63LTL.mjs.map +7 -0
- package/dist/lib/browser/chunk-TIEBZMTF.mjs +44 -0
- package/dist/lib/browser/chunk-TIEBZMTF.mjs.map +7 -0
- package/dist/lib/browser/chunk-WEBSGU5L.mjs +80 -0
- package/dist/lib/browser/chunk-WEBSGU5L.mjs.map +7 -0
- package/dist/lib/browser/chunk-YAFEA4GV.mjs +1 -0
- package/dist/lib/browser/chunk-YNFPIQGB.mjs +76 -0
- package/dist/lib/browser/chunk-YNFPIQGB.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 +87 -156
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/invoker-capability-4AUGUMM5.mjs +36 -0
- package/dist/lib/browser/invoker-capability-4AUGUMM5.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +90 -40
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/browser/ui/index.mjs +45 -0
- package/dist/lib/browser/ui/index.mjs.map +7 -0
- package/dist/lib/node-esm/capability-R5O2OYX4.mjs +38 -0
- package/dist/lib/node-esm/capability-R5O2OYX4.mjs.map +7 -0
- package/dist/lib/node-esm/capability-SA6LPYGL.mjs +35 -0
- package/dist/lib/node-esm/capability-SA6LPYGL.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-3D66SZHP.mjs +171 -0
- package/dist/lib/node-esm/chunk-3D66SZHP.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-6REV5DE7.mjs +48 -0
- package/dist/lib/node-esm/chunk-6REV5DE7.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-FHWPWQRJ.mjs +704 -0
- package/dist/lib/node-esm/chunk-FHWPWQRJ.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-JHFY3HTS.mjs +146 -0
- package/dist/lib/node-esm/chunk-JHFY3HTS.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-JIVXIJ2T.mjs +825 -0
- package/dist/lib/node-esm/chunk-JIVXIJ2T.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-NHXBSAQR.mjs +35 -0
- package/dist/lib/node-esm/chunk-NHXBSAQR.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-SB5ODNPX.mjs +77 -0
- package/dist/lib/node-esm/chunk-SB5ODNPX.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-SCDGIGGU.mjs +45 -0
- package/dist/lib/node-esm/chunk-SCDGIGGU.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-SQICGJBW.mjs +81 -0
- package/dist/lib/node-esm/chunk-SQICGJBW.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 +87 -156
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/invoker-capability-3YDIVDWV.mjs +37 -0
- package/dist/lib/node-esm/invoker-capability-3YDIVDWV.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +90 -40
- package/dist/lib/node-esm/testing/index.mjs.map +4 -4
- package/dist/lib/node-esm/ui/index.mjs +46 -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 -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 +33 -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 +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 +98 -33
- package/dist/types/src/core/plugin.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +3 -4
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/plugin-operation/OperationPlugin.d.ts +3 -0
- package/dist/types/src/plugin-operation/OperationPlugin.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/capability.d.ts +7 -0
- package/dist/types/src/plugin-operation/history/capability.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/errors.d.ts +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 +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 +8 -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/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 +20 -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 +7 -0
- package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
- package/dist/types/src/{App.d.ts → ui/hooks/useApp.d.ts} +21 -14
- 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/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/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 +3 -0
- package/dist/types/src/ui/index.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/moon.yml +11 -3
- package/package.json +111 -45
- 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 +174 -114
- package/src/common/index.ts +4 -8
- package/src/common/operations.ts +38 -0
- package/src/common/translations.ts +18 -10
- package/src/context.ts +9 -0
- package/src/core/{events.ts → activation-event.ts} +6 -6
- 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 +715 -0
- package/src/core/plugin.ts +231 -37
- 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 +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/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 +48 -46
- package/src/ui/components/App/App.stories.tsx +92 -0
- package/src/ui/components/App/App.tsx +57 -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 +143 -0
- package/src/ui/components/Surface/SurfaceComponent.tsx +247 -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 +20 -0
- package/src/ui/components/Surface/types.ts +117 -0
- package/src/ui/components/index.ts +7 -0
- package/src/ui/hooks/index.ts +10 -0
- package/src/ui/hooks/useApp.tsx +213 -0
- package/src/ui/hooks/useCapabilities.ts +67 -0
- package/src/ui/hooks/useLoading.tsx +68 -0
- 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 +6 -0
- package/tsconfig.json +14 -30
- package/tsconfig.node.json +1 -3
- 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.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-YAFEA4GV.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,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/core/plugin-manager.ts", "../../../src/core/capability-manager.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom, Registry } from '@effect-atom/atom-react';\nimport * as Array from 'effect/Array';\nimport * as Cause from 'effect/Cause';\nimport * as Deferred from 'effect/Deferred';\nimport * as Duration from 'effect/Duration';\nimport * as Effect from 'effect/Effect';\nimport * as Fiber from 'effect/Fiber';\nimport * as Function from 'effect/Function';\nimport * as HashSet from 'effect/HashSet';\nimport * as PubSub from 'effect/PubSub';\nimport * as Ref from 'effect/Ref';\n\nimport { runAndForwardErrors } from '@dxos/effect';\nimport { Performance } from '@dxos/effect';\nimport { log } from '@dxos/log';\n\nimport * as ActivationEvent from './activation-event';\nimport * as Capability from './capability';\nimport * as CapabilityManager from './capability-manager';\nimport * as Plugin from './plugin';\n\n/**\n * Identifier denoting a Manager.\n */\nexport const ManagerTypeId: unique symbol = Symbol.for('@dxos/app-framework/Manager');\nexport type ManagerTypeId = typeof ManagerTypeId;\n\nexport type ManagerOptions = {\n pluginLoader: (id: string) => Effect.Effect<Plugin.Plugin, Error>;\n plugins?: Plugin.Plugin[];\n core?: string[];\n enabled?: string[];\n registry?: Registry.Registry;\n};\n\ntype ActivationMessage = { event: string; state: 'activating' | 'activated' | 'error'; error?: Error };\n\n/**\n * Interface for the Plugin Manager.\n */\nexport interface PluginManager {\n readonly [ManagerTypeId]: ManagerTypeId;\n readonly activation: PubSub.PubSub<ActivationMessage>;\n readonly capabilities: CapabilityManager.CapabilityManager;\n readonly registry: Registry.Registry;\n\n readonly plugins: Atom.Atom<readonly Plugin.Plugin[]>;\n readonly core: Atom.Atom<readonly string[]>;\n readonly enabled: Atom.Atom<readonly string[]>;\n readonly modules: Atom.Atom<readonly Plugin.PluginModule[]>;\n readonly active: Atom.Atom<readonly string[]>;\n readonly eventsFired: Atom.Atom<readonly string[]>;\n readonly pendingReset: Atom.Atom<readonly string[]>;\n\n getPlugins(): readonly Plugin.Plugin[];\n getCore(): readonly string[];\n getEnabled(): readonly string[];\n getModules(): readonly Plugin.PluginModule[];\n getActive(): readonly string[];\n getEventsFired(): readonly string[];\n getPendingReset(): readonly string[];\n\n add(id: string): Effect.Effect<boolean, Error>;\n enable(id: string): Effect.Effect<boolean, Error>;\n remove(id: string): boolean;\n disable(id: string): Effect.Effect<boolean, Error>;\n // TODO(wittjosiah): Improve error typing.\n activate(\n event: ActivationEvent.ActivationEvent | string,\n params?: { before?: string; after?: string },\n ): Effect.Effect<boolean, Error>;\n deactivate(id: string): Effect.Effect<boolean, Error>;\n reset(event: ActivationEvent.ActivationEvent | string): Effect.Effect<boolean, Error>;\n}\n\n/**\n * Type guard to check if a value is a PluginManager.\n */\nexport const isManager = (value: unknown): value is PluginManager => {\n return typeof value === 'object' && value !== null && ManagerTypeId in value;\n};\n\n/**\n * Internal implementation of PluginManager.\n */\nclass ManagerImpl implements PluginManager {\n readonly [ManagerTypeId]: ManagerTypeId = ManagerTypeId;\n readonly activation = Effect.runSync(PubSub.unbounded<ActivationMessage>());\n readonly capabilities: CapabilityManager.CapabilityManager;\n readonly registry: Registry.Registry;\n\n private readonly _pluginsAtom: Atom.Writable<Plugin.Plugin[]>;\n private readonly _coreAtom: Atom.Writable<string[]>;\n private readonly _enabledAtom: Atom.Writable<string[]>;\n private readonly _modulesAtom: Atom.Writable<Plugin.PluginModule[]>;\n private readonly _activeAtom: Atom.Writable<string[]>;\n private readonly _eventsFiredAtom: Atom.Writable<string[]>;\n private readonly _pendingResetAtom: Atom.Writable<string[]>;\n private readonly _pluginLoader: ManagerOptions['pluginLoader'];\n private readonly _capabilities = new Map<string, Capability.Any[]>();\n private readonly _moduleMemoMap = new Map<Plugin.PluginModule['id'], Deferred.Deferred<Capability.Any[], Error>>();\n private readonly _moduleSemaphores = new Map<Plugin.PluginModule['id'], Effect.Semaphore>();\n private readonly _activatingEvents = Effect.runSync(Ref.make<string[]>([]));\n private readonly _activatingModules = Effect.runSync(Ref.make<string[]>([]));\n\n constructor({\n pluginLoader,\n plugins = [],\n core = plugins.map(({ meta }) => meta.id),\n enabled = [],\n registry,\n }: ManagerOptions) {\n this.registry = registry ?? Registry.make();\n this.capabilities = CapabilityManager.make({\n registry: this.registry,\n });\n\n this._pluginLoader = pluginLoader;\n this._pluginsAtom = Atom.make(plugins).pipe(Atom.keepAlive);\n this._coreAtom = Atom.make(core).pipe(Atom.keepAlive);\n this._enabledAtom = Atom.make(enabled).pipe(Atom.keepAlive);\n this._modulesAtom = Atom.make<Plugin.PluginModule[]>([]).pipe(Atom.keepAlive);\n this._activeAtom = Atom.make<string[]>([]).pipe(Atom.keepAlive);\n this._eventsFiredAtom = Atom.make<string[]>([]).pipe(Atom.keepAlive);\n this._pendingResetAtom = Atom.make<string[]>([]).pipe(Atom.keepAlive);\n plugins.forEach((plugin) => this._addPlugin(plugin));\n void Effect.all([...core, ...enabled].map((id) => this.enable(id))).pipe(runAndForwardErrors);\n }\n\n get plugins(): Atom.Atom<readonly Plugin.Plugin[]> {\n return this._pluginsAtom;\n }\n\n get core(): Atom.Atom<readonly string[]> {\n return this._coreAtom;\n }\n\n /**\n * Ids of plugins that are currently enabled.\n */\n get enabled(): Atom.Atom<readonly string[]> {\n return this._enabledAtom;\n }\n\n /**\n * Modules of plugins which are currently enabled.\n */\n get modules(): Atom.Atom<readonly Plugin.PluginModule[]> {\n return this._modulesAtom;\n }\n\n /**\n * Ids of modules which are currently active.\n */\n get active(): Atom.Atom<readonly string[]> {\n return this._activeAtom;\n }\n\n /**\n * Ids of events which have been fired.\n */\n get eventsFired(): Atom.Atom<readonly string[]> {\n return this._eventsFiredAtom;\n }\n\n /**\n * Ids of modules which are pending reset.\n */\n get pendingReset(): Atom.Atom<readonly string[]> {\n return this._pendingResetAtom;\n }\n\n getPlugins(): readonly Plugin.Plugin[] {\n return this._get(this._pluginsAtom);\n }\n\n getCore(): readonly string[] {\n return this._get(this._coreAtom);\n }\n\n getEnabled(): readonly string[] {\n return this._get(this._enabledAtom);\n }\n\n getModules(): readonly Plugin.PluginModule[] {\n return this._get(this._modulesAtom);\n }\n\n getActive(): readonly string[] {\n return this._get(this._activeAtom);\n }\n\n getEventsFired(): readonly string[] {\n return this._get(this._eventsFiredAtom);\n }\n\n getPendingReset(): readonly string[] {\n return this._get(this._pendingResetAtom);\n }\n\n /**\n * Adds a plugin to the manager via the plugin loader.\n * @param id The id of the plugin.\n */\n add(id: string): Effect.Effect<boolean, Error> {\n return Effect.gen(this, function* () {\n log('add plugin', { id });\n const plugin = yield* this._pluginLoader(id);\n this._addPlugin(plugin);\n return yield* this.enable(id);\n });\n }\n\n /**\n * Enables a plugin.\n * @param id The id of the plugin.\n */\n enable(id: string): Effect.Effect<boolean, Error> {\n return Effect.gen(this, function* () {\n log('enable plugin', { id });\n const plugin = this._getPlugin(id);\n if (!plugin) {\n return false;\n }\n\n this._update(this._enabledAtom, (enabled) => (enabled.includes(id) ? enabled : [...enabled, id]));\n\n plugin.modules.forEach((module) => {\n this._addModule(module);\n this._setPendingResetByModule(module);\n });\n\n log('pending reset', { events: [...this.getPendingReset()] });\n yield* Effect.all(\n this.getPendingReset().map((event) => this.activate(event)),\n { concurrency: 'unbounded' },\n );\n\n return true;\n });\n }\n\n /**\n * Removes a plugin from the manager.\n * @param id The id of the plugin.\n */\n remove(id: string): boolean {\n log('remove plugin', { id });\n const result = this.disable(id);\n if (!result) {\n return false;\n }\n\n this._removePlugin(id);\n return true;\n }\n\n /**\n * Disables a plugin.\n * @param id The id of the plugin.\n */\n disable(id: string): Effect.Effect<boolean, Error> {\n return Effect.gen(this, function* () {\n log('disable plugin', { id });\n if (this._get(this._coreAtom).includes(id)) {\n return false;\n }\n\n const plugin = this._getPlugin(id);\n if (!plugin) {\n return false;\n }\n\n const enabledIndex = this._get(this._enabledAtom).findIndex((enabled) => enabled === id);\n if (enabledIndex !== -1) {\n this._update(this._enabledAtom, (enabled) => enabled.filter((item) => item !== id));\n yield* this.deactivate(id);\n\n plugin.modules.forEach((module) => {\n this._removeModule(module.id);\n });\n }\n\n return true;\n });\n }\n\n /**\n * Activates plugins based on the activation event.\n * @param event The activation event.\n * @returns Whether the activation was successful.\n */\n activate(\n event: ActivationEvent.ActivationEvent | string,\n params?: { before?: string; after?: string },\n ): Effect.Effect<boolean, Error> {\n const key = typeof event === 'string' ? event : ActivationEvent.eventKey(event);\n return Effect.gen(this, function* () {\n log('activating', { key, ...params });\n yield* Ref.update(this._activatingEvents, (activating) => Array.append(activating, key));\n const pendingIndex = this._get(this._pendingResetAtom).findIndex((event) => event === key);\n if (pendingIndex !== -1) {\n this._update(this._pendingResetAtom, (pending) => pending.filter((event) => event !== key));\n }\n\n const activatingEvents = yield* this._activatingEvents;\n const activatingModules = yield* this._activatingModules;\n const modules = this._getInactiveModulesByEvent(key).filter((module) => {\n const allOf = ActivationEvent.isAllOf(module.activatesOn);\n if (!allOf) {\n return true;\n }\n\n // Check to see if all of the events in the `allOf` have been fired.\n // An event can be considered \"fired\" if it is in the `eventsFired` list or if it is currently being activated.\n const events = ActivationEvent.getEvents(module.activatesOn).filter(\n (event) => ActivationEvent.eventKey(event) !== key,\n );\n return (\n events.every(\n (event) =>\n this._get(this._eventsFiredAtom).includes(ActivationEvent.eventKey(event)) ||\n activatingEvents.includes(ActivationEvent.eventKey(event)),\n ) && !activatingModules.includes(module.id)\n );\n });\n yield* Ref.update(this._activatingModules, (activating) =>\n Array.appendAll(\n activating,\n modules.map((module) => module.id),\n ),\n );\n if (modules.length === 0) {\n log('no modules to activate', { key });\n if (!this._get(this._eventsFiredAtom).includes(key)) {\n this._update(this._eventsFiredAtom, (events) => [...events, key]);\n }\n return false;\n }\n\n log('activating modules', { key, modules: modules.map((module) => module.id) });\n yield* PubSub.publish(this.activation, { event: key, state: 'activating' });\n\n // Fire activatesBefore events.\n const beforeEvents = Function.pipe(\n modules,\n Array.flatMap((module) => module.activatesBefore ?? []),\n HashSet.fromIterable,\n HashSet.toValues,\n Array.filter((event) => !activatingEvents.includes(ActivationEvent.eventKey(event))),\n );\n yield* Function.pipe(\n beforeEvents,\n Array.map((event) => this.activate(event, { before: key })),\n Effect.allWith({ concurrency: 'unbounded' }),\n together(\n Effect.sleep(Duration.seconds(10)).pipe(\n Effect.andThen(\n Effect.sync(() =>\n log.warn('activatesBefore is taking a long time', {\n event: key,\n beforeEvents: beforeEvents.map(ActivationEvent.eventKey),\n }),\n ),\n ),\n ),\n ),\n );\n\n // Concurrently triggers loading of lazy capabilities.\n const getCapabilities = yield* Function.pipe(\n modules,\n Array.map((mod) => this._loadModule(mod)),\n Effect.allWith({ concurrency: 'unbounded' }),\n Effect.catchAll((error) => {\n return Effect.gen(this, function* () {\n yield* PubSub.publish(this.activation, { event: key, state: 'error', error });\n return yield* Effect.fail(error);\n });\n }),\n );\n\n // Contribute the capabilities from the activated modules.\n yield* Function.pipe(\n modules,\n Array.zip(getCapabilities),\n Array.map(([module, capabilities]) => this._contributeCapabilities(module, capabilities)),\n // TODO(wittjosiah): This currently can't be run in parallel.\n // Running this with concurrency causes races with `allOf` activation events.\n Effect.all,\n );\n\n // Fire activatesAfter events.\n const afterEvents = Function.pipe(\n modules,\n Array.flatMap((module) => module.activatesAfter ?? []),\n HashSet.fromIterable,\n HashSet.toValues,\n Array.filter((event) => !activatingEvents.includes(ActivationEvent.eventKey(event))),\n );\n yield* Function.pipe(\n afterEvents,\n Array.map((event) => this.activate(event, { after: key })),\n Effect.allWith({ concurrency: 'unbounded' }),\n together(\n Effect.sleep(Duration.seconds(10)).pipe(\n Effect.andThen(\n Effect.sync(() =>\n log.warn('activatesAfter is taking a long time', {\n event: key,\n afterEvents: afterEvents.map(ActivationEvent.eventKey),\n }),\n ),\n ),\n ),\n ),\n );\n\n yield* Ref.update(this._activatingEvents, (activating) => Array.filter(activating, (event) => event !== key));\n yield* Ref.update(this._activatingModules, (activating) =>\n Array.filter(activating, (module) => !modules.map((module) => module.id).includes(module)),\n );\n\n if (!this._get(this._eventsFiredAtom).includes(key)) {\n this._update(this._eventsFiredAtom, (events) => [...events, key]);\n }\n\n yield* PubSub.publish(this.activation, { event: key, state: 'activated' });\n log('activated', { key });\n\n return true;\n }).pipe(\n together(\n Effect.sleep(Duration.seconds(15)).pipe(\n Effect.andThen(Effect.sync(() => log.warn('event activation is taking a long time', { event: key }))),\n ),\n ),\n Performance.addTrackEntry({\n name: typeof event === 'string' ? event : ActivationEvent.eventKey(event),\n devtools: {\n dataType: 'track-entry',\n track: 'Event Activation',\n trackGroup: 'Composer',\n color: 'primary',\n },\n }),\n );\n }\n\n /**\n * Deactivates all of the modules for a plugin.\n * @param id The id of the plugin.\n * @returns Whether the deactivation was successful.\n */\n deactivate(id: string): Effect.Effect<boolean, Error> {\n return Effect.gen(this, function* () {\n const plugin = this._getPlugin(id);\n if (!plugin) {\n return false;\n }\n\n const modules = plugin.modules;\n const results = yield* Effect.all(\n modules.map((module) => this._deactivateModule(module)),\n { concurrency: 'unbounded' },\n );\n return results.every((result) => result);\n });\n }\n\n /**\n * Re-activates the modules that were activated by the event.\n * @param event The activation event.\n * @returns Whether the reset was successful.\n */\n reset(event: ActivationEvent.ActivationEvent | string): Effect.Effect<boolean, Error> {\n return Effect.gen(this, function* () {\n const key = typeof event === 'string' ? event : ActivationEvent.eventKey(event);\n log('reset', { key });\n const modules = this._getActiveModulesByEvent(key);\n const results = yield* Effect.all(\n modules.map((module) => this._deactivateModule(module)),\n { concurrency: 'unbounded' },\n );\n\n if (results.every((result) => result)) {\n return yield* this.activate(key);\n } else {\n return false;\n }\n });\n }\n\n private _get<T>(atom: Atom.Atom<T>): T {\n return this.registry.get(atom);\n }\n\n private _set<T>(atom: Atom.Writable<T>, value: T): void {\n this.registry.set(atom, value);\n }\n\n private _update<T>(atom: Atom.Writable<T>, updater: (current: T) => T): void {\n this._set(atom, updater(this._get(atom)));\n }\n\n private _addPlugin(plugin: Plugin.Plugin): void {\n log('add plugin', { id: plugin.meta.id });\n // TODO(wittjosiah): Find a way to add a warning for duplicate plugins that doesn't cause log spam.\n this._update(this._pluginsAtom, (plugins) => (plugins.includes(plugin) ? plugins : [...plugins, plugin]));\n }\n\n private _removePlugin(id: string): void {\n log('remove plugin', { id });\n this._update(this._pluginsAtom, (plugins) => plugins.filter((plugin) => plugin.meta.id !== id));\n }\n\n private _addModule(module: Plugin.PluginModule): void {\n log('add module', { id: module.id });\n // TODO(wittjosiah): Find a way to add a warning for duplicate modules that doesn't cause log spam.\n this._update(this._modulesAtom, (modules) => (modules.includes(module) ? modules : [...modules, module]));\n }\n\n private _removeModule(id: string): void {\n log('remove module', { id });\n this._update(this._modulesAtom, (modules) => modules.filter((module) => module.id !== id));\n }\n\n private _getPlugin(id: string): Plugin.Plugin | undefined {\n return this._get(this._pluginsAtom).find((plugin) => plugin.meta.id === id);\n }\n\n private _getActiveModules(): Plugin.PluginModule[] {\n const active = this._get(this._activeAtom);\n return this._get(this._modulesAtom).filter((module) => active.includes(module.id));\n }\n\n private _getInactiveModules(): Plugin.PluginModule[] {\n const active = this._get(this._activeAtom);\n return this._get(this._modulesAtom).filter((module) => !active.includes(module.id));\n }\n\n private _getActiveModulesByEvent(key: string): Plugin.PluginModule[] {\n return this._getActiveModules().filter((module) =>\n ActivationEvent.getEvents(module.activatesOn).map(ActivationEvent.eventKey).includes(key),\n );\n }\n\n private _getInactiveModulesByEvent(key: string): Plugin.PluginModule[] {\n return this._getInactiveModules().filter((module) =>\n ActivationEvent.getEvents(module.activatesOn).map(ActivationEvent.eventKey).includes(key),\n );\n }\n\n private _setPendingResetByModule(module: Plugin.PluginModule): void {\n const activationEvents = ActivationEvent.getEvents(module.activatesOn)\n .map(ActivationEvent.eventKey)\n .filter((key) => this._get(this._eventsFiredAtom).includes(key));\n\n const pendingReset = Array.fromIterable(new Set(activationEvents)).filter((event) => {\n const pending = this._get(this._pendingResetAtom);\n return !pending.includes(event);\n });\n if (pendingReset.length > 0) {\n log('pending reset', { events: pendingReset });\n this._update(this._pendingResetAtom, (current) => [...current, ...pendingReset]);\n }\n }\n\n private _getModuleSemaphore(moduleId: Plugin.PluginModule['id']): Effect.Semaphore {\n let semaphore = this._moduleSemaphores.get(moduleId);\n if (!semaphore) {\n semaphore = Effect.runSync(Effect.makeSemaphore(1));\n this._moduleSemaphores.set(moduleId, semaphore);\n }\n return semaphore;\n }\n\n private _loadModule = (module: Plugin.PluginModule): Effect.Effect<Capability.Any[], Error> =>\n Effect.gen(this, function* () {\n const semaphore = this._getModuleSemaphore(module.id);\n\n // Atomically check-and-set under per-module semaphore to prevent race conditions.\n const deferredToAwait = yield* Effect.gen(this, function* () {\n const existing = this._moduleMemoMap.get(module.id);\n if (existing) {\n return existing;\n }\n\n // First caller - create deferred, store it, and start loading in background.\n const deferred = yield* Deferred.make<Capability.Any[], Error>();\n this._moduleMemoMap.set(module.id, deferred);\n\n const loadEffect = Effect.gen(this, function* () {\n log('loading module', { module: module.id });\n const [duration, capabilities] = yield* module\n .activate()\n .pipe(\n Effect.provideService(Capability.Service, this.capabilities),\n Effect.provideService(Plugin.Service, this),\n Effect.timed,\n );\n const normalized = capabilities == null ? [] : Array.isArray(capabilities) ? capabilities : [capabilities];\n log('loaded module', {\n module: module.id,\n elapsed: Duration.toMillis(duration),\n failed: false,\n });\n return normalized as Capability.Any[];\n }).pipe(\n Effect.withSpan('PluginManager._loadModule'),\n together(\n Effect.sleep(Duration.seconds(10)).pipe(\n Effect.andThen(\n Effect.sync(() => log.warn(`module is taking a long time to activate`, { module: module.id })),\n ),\n ),\n ),\n Performance.addTrackEntry({\n name: module.id,\n devtools: {\n dataType: 'track-entry',\n track: 'Module Activation',\n trackGroup: 'Composer',\n color: 'primary',\n },\n }),\n );\n\n // Fork the load to run in background, completing the deferred when done.\n yield* Effect.forkDaemon(\n loadEffect.pipe(\n Effect.tap((result) => Deferred.succeed(deferred, result)),\n Effect.catchAllCause((cause) => {\n const error = Cause.squash(cause);\n log.error('module failed to activate', {\n module: module.id,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n isDefect: !Cause.isFailure(cause),\n });\n return Deferred.fail(deferred, error instanceof Error ? error : new Error(String(error)));\n }),\n ),\n );\n\n return deferred;\n }).pipe(semaphore.withPermits(1));\n\n // Wait for result outside the semaphore so multiple waiters can proceed concurrently.\n return yield* Deferred.await(deferredToAwait);\n });\n\n private _contributeCapabilities(\n module: Plugin.PluginModule,\n capabilities: Capability.Any[],\n ): Effect.Effect<void, Error> {\n return Effect.gen(this, function* () {\n capabilities.forEach((capability) => {\n this.capabilities.contribute({ module: module.id, ...capability });\n });\n this._update(this._activeAtom, (active) => [...active, module.id]);\n this._capabilities.set(module.id, capabilities);\n });\n }\n\n private _deactivateModule(module: Plugin.PluginModule): Effect.Effect<boolean, Error> {\n return Effect.gen(this, function* () {\n const id = module.id;\n log('deactivating', { id });\n this._moduleMemoMap.delete(id);\n\n const capabilities = this._capabilities.get(id);\n if (capabilities) {\n for (const capability of capabilities) {\n this.capabilities.remove(capability.interface, capability.implementation);\n const program = capability.deactivate?.() ?? Effect.succeed(undefined);\n yield* program;\n }\n this._capabilities.delete(id);\n }\n\n const activeIndex = this._get(this._activeAtom).findIndex((event) => event === id);\n if (activeIndex !== -1) {\n this._update(this._activeAtom, (active) => active.filter((event) => event !== id));\n }\n\n log('deactivated', { id });\n return true;\n });\n }\n}\n\n/**\n * Creates a new Plugin Manager instance.\n */\nexport const make = (options: ManagerOptions): PluginManager => new ManagerImpl(options);\n\n/**\n * Runs an effect concurrently with another effect.\n * If the first effect completes, the second effect is interrupted.\n */\n// TODO(dmaretskyi): Effect.race > Effect.asVoid\nconst together =\n <R1>(togetherEffect: Effect.Effect<void, never, R1>) =>\n <A, E, R2>(effect: Effect.Effect<A, E, R2>): Effect.Effect<A, E, R1 | R2> =>\n Effect.gen(function* () {\n const togetherFiber = yield* Effect.fork(togetherEffect);\n const result = yield* effect;\n yield* Fiber.interrupt(togetherFiber);\n return result;\n });\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom, type Registry } from '@effect-atom/atom-react';\nimport * as Deferred from 'effect/Deferred';\nimport * as Effect from 'effect/Effect';\n\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n\nimport type * as Capability from './capability';\n\ntype CapabilityEntry<T> = {\n moduleId: string;\n implementation: T;\n};\n\n/**\n * Options for creating a capability manager.\n * @internal\n */\nexport type CapabilityManagerOptions = {\n registry: Registry.Registry;\n};\n\n/**\n * Interface for the Capability Manager.\n * Provides methods for contributing, removing, and accessing capabilities.\n */\nexport interface CapabilityManager {\n contribute<T>(args: { module: string; interface: Capability.InterfaceDef<T>; implementation: T }): void;\n\n remove<T>(interfaceDef: Capability.InterfaceDef<T>, implementation: T): void;\n\n /**\n * Get the Atom reference to the available capabilities for a given interface.\n * Primarily useful for deriving other Atom values based on the capabilities or\n * for subscribing to changes in the capabilities.\n * @returns An atom reference to the available capabilities.\n */\n atom<T>(interfaceDef: Capability.InterfaceDef<T>): Atom.Atom<T[]>;\n\n /**\n * Get capabilities from the capability manager.\n * @returns An array of capabilities.\n */\n getAll<T>(interfaceDef: Capability.InterfaceDef<T>): T[];\n\n /**\n * Requests a single capability from the capability manager.\n * @returns The capability.\n * @throws If no capability is found.\n */\n get<T>(interfaceDef: Capability.InterfaceDef<T>): T;\n\n /**\n * Waits for a capability to be available.\n * @returns The capability.\n */\n waitFor<T>(interfaceDef: Capability.InterfaceDef<T>): Effect.Effect<T, Error>;\n}\n\n/**\n * Internal implementation of CapabilityManager.\n */\nclass CapabilityManagerImpl implements CapabilityManager {\n private readonly _registry: Registry.Registry;\n\n private readonly _capabilityEntries = Atom.family<string, Atom.Writable<CapabilityEntry<unknown>[]>>(() => {\n return Atom.make<CapabilityEntry<unknown>[]>([]).pipe(Atom.keepAlive);\n });\n\n readonly _capabilities = Atom.family<string, Atom.Atom<unknown[]>>((id: string) => {\n return Atom.make((get) => {\n const current = get(this._capabilityEntries(id));\n return current.map((c) => c.implementation);\n });\n });\n\n readonly _capability = Atom.family<string, Atom.Atom<unknown>>((id: string) => {\n return Atom.make((get) => {\n const current = get(this._capabilities(id));\n invariant(current.length > 0, `No capability found for ${id}`);\n return current[0];\n });\n });\n\n constructor({ registry }: CapabilityManagerOptions) {\n this._registry = registry;\n }\n\n contribute<T>({\n module: moduleId,\n interface: interfaceDef,\n implementation,\n }: {\n module: string;\n interface: Capability.InterfaceDef<T>;\n implementation: T;\n }): void {\n const current = this._registry.get(this._capabilityEntries(interfaceDef.identifier));\n const isDuplicate = current.some((c) => c.moduleId === moduleId && c.implementation === implementation);\n if (isDuplicate) {\n log('capability already contributed, skipping', { id: interfaceDef.identifier, moduleId });\n return;\n }\n\n const entry: CapabilityEntry<T> = { moduleId, implementation };\n this._registry.set(this._capabilityEntries(interfaceDef.identifier), [...current, entry]);\n log('capability contributed', {\n id: interfaceDef.identifier,\n moduleId,\n count: current.length,\n });\n }\n\n remove<T>(interfaceDef: Capability.InterfaceDef<T>, implementation: T): void {\n const current = this._registry.get(this._capabilityEntries(interfaceDef.identifier));\n if (current.length === 0) {\n return;\n }\n\n const next = current.filter((c) => c.implementation !== implementation);\n if (next.length !== current.length) {\n this._registry.set(this._capabilityEntries(interfaceDef.identifier), next);\n log('capability removed', { id: interfaceDef.identifier, count: current.length });\n } else {\n log.warn('capability not removed', { id: interfaceDef.identifier });\n }\n }\n\n atom<T>(interfaceDef: Capability.InterfaceDef<T>): Atom.Atom<T[]> {\n // NOTE: This the type-checking for capabilities is done at the time of contribution.\n return this._capabilities(interfaceDef.identifier) as Atom.Atom<T[]>;\n }\n\n getAll<T>(interfaceDef: Capability.InterfaceDef<T>): T[] {\n return this._registry.get(this.atom(interfaceDef));\n }\n\n get<T>(interfaceDef: Capability.InterfaceDef<T>): T {\n const capabilities = this.getAll(interfaceDef);\n invariant(capabilities.length > 0, `No capability found for ${interfaceDef.identifier}`);\n return capabilities[0];\n }\n\n waitFor<T>(interfaceDef: Capability.InterfaceDef<T>): Effect.Effect<T, Error> {\n return Effect.gen(this, function* () {\n const [capability] = this.getAll(interfaceDef);\n if (capability) {\n return capability;\n }\n\n const deferred = yield* Deferred.make<T, Error>();\n const cancel = this._registry.subscribe(this.atom(interfaceDef), (capabilities) => {\n if (capabilities.length > 0) {\n Effect.runSync(Deferred.succeed(deferred, capabilities[0]));\n }\n });\n const result = yield* Deferred.await(deferred);\n cancel();\n return result;\n });\n }\n}\n\n/**\n * Creates a new Capability Manager instance.\n */\nexport const make = (options: CapabilityManagerOptions): CapabilityManager => new CapabilityManagerImpl(options);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["make", "Atom", "Registry", "Array", "Cause", "Deferred", "Duration", "Effect", "Fiber", "Function", "HashSet", "PubSub", "Ref", "runAndForwardErrors", "Performance", "log", "make", "Atom", "Deferred", "Effect", "invariant", "log", "CapabilityManagerImpl", "_registry", "_capabilityEntries", "family", "pipe", "keepAlive", "_capabilities", "id", "get", "current", "map", "c", "implementation", "_capability", "length", "registry", "contribute", "module", "moduleId", "interface", "interfaceDef", "identifier", "isDuplicate", "some", "entry", "set", "count", "remove", "next", "filter", "warn", "atom", "getAll", "capabilities", "waitFor", "gen", "capability", "deferred", "cancel", "subscribe", "runSync", "succeed", "result", "await", "options", "ManagerTypeId", "Symbol", "for", "isManager", "value", "ManagerImpl", "activation", "runSync", "unbounded", "capabilities", "registry", "_pluginsAtom", "_coreAtom", "_enabledAtom", "_modulesAtom", "_activeAtom", "_eventsFiredAtom", "_pendingResetAtom", "_pluginLoader", "_capabilities", "Map", "_moduleMemoMap", "_moduleSemaphores", "_activatingEvents", "make", "_activatingModules", "pluginLoader", "plugins", "core", "map", "meta", "id", "enabled", "Registry", "Atom", "pipe", "keepAlive", "forEach", "plugin", "_addPlugin", "all", "enable", "runAndForwardErrors", "modules", "active", "eventsFired", "pendingReset", "getPlugins", "_get", "getCore", "getEnabled", "getModules", "getActive", "getEventsFired", "getPendingReset", "add", "gen", "log", "_getPlugin", "_update", "includes", "module", "_addModule", "_setPendingResetByModule", "events", "event", "activate", "concurrency", "remove", "result", "disable", "_removePlugin", "enabledIndex", "findIndex", "filter", "item", "deactivate", "_removeModule", "params", "key", "eventKey", "update", "activating", "append", "pendingIndex", "pending", "activatingEvents", "activatingModules", "_getInactiveModulesByEvent", "allOf", "isAllOf", "activatesOn", "getEvents", "every", "appendAll", "length", "publish", "state", "beforeEvents", "flatMap", "activatesBefore", "fromIterable", "toValues", "before", "allWith", "together", "sleep", "seconds", "andThen", "sync", "warn", "getCapabilities", "mod", "_loadModule", "catchAll", "error", "fail", "zip", "_contributeCapabilities", "afterEvents", "activatesAfter", "after", "Performance", "addTrackEntry", "name", "devtools", "dataType", "track", "trackGroup", "color", "results", "_deactivateModule", "reset", "_getActiveModulesByEvent", "atom", "get", "_set", "set", "updater", "find", "_getActiveModules", "_getInactiveModules", "activationEvents", "Set", "current", "_getModuleSemaphore", "moduleId", "semaphore", "makeSemaphore", "deferredToAwait", "existing", "deferred", "loadEffect", "duration", "provideService", "Service", "timed", "normalized", "isArray", "elapsed", "toMillis", "failed", "withSpan", "forkDaemon", "tap", "succeed", "catchAllCause", "cause", "squash", "Error", "message", "String", "stack", "undefined", "isDefect", "isFailure", "withPermits", "await", "capability", "contribute", "delete", "interface", "implementation", "program", "activeIndex", "options", "togetherEffect", "effect", "togetherFiber", "fork", "interrupt"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getModuleTag
|
|
3
|
+
} from "./chunk-YNFPIQGB.mjs";
|
|
4
|
+
import {
|
|
5
|
+
__export
|
|
6
|
+
} from "./chunk-J5LGTIGS.mjs";
|
|
7
|
+
|
|
8
|
+
// src/core/plugin.ts
|
|
9
|
+
var plugin_exports = {};
|
|
10
|
+
__export(plugin_exports, {
|
|
11
|
+
PluginModuleTypeId: () => PluginModuleTypeId,
|
|
12
|
+
PluginTypeId: () => PluginTypeId,
|
|
13
|
+
Service: () => Service,
|
|
14
|
+
activate: () => activate,
|
|
15
|
+
addModule: () => addModule,
|
|
16
|
+
define: () => define,
|
|
17
|
+
isPlugin: () => isPlugin,
|
|
18
|
+
isPluginModule: () => isPluginModule,
|
|
19
|
+
make: () => make,
|
|
20
|
+
reset: () => reset
|
|
21
|
+
});
|
|
22
|
+
import * as Context from "effect/Context";
|
|
23
|
+
import * as Effect from "effect/Effect";
|
|
24
|
+
import * as Option from "effect/Option";
|
|
25
|
+
import * as Pipeable from "effect/Pipeable";
|
|
26
|
+
import { invariant } from "@dxos/invariant";
|
|
27
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/sdk/app-framework/src/core/plugin.ts";
|
|
28
|
+
var Service = class extends Context.Tag("@dxos/app-framework/PluginManager")() {
|
|
29
|
+
};
|
|
30
|
+
var activate = (event) => Effect.flatMap(Service, (manager) => manager.activate(event));
|
|
31
|
+
var reset = (event) => Effect.flatMap(Service, (manager) => manager.reset(event));
|
|
32
|
+
var computeModuleId = (pluginId, moduleName) => {
|
|
33
|
+
return `${pluginId}.module.${moduleName}`;
|
|
34
|
+
};
|
|
35
|
+
var PluginModuleTypeId = /* @__PURE__ */ Symbol.for("@dxos/app-framework/PluginModule");
|
|
36
|
+
var isPluginModule = (value) => {
|
|
37
|
+
return typeof value === "object" && value !== null && PluginModuleTypeId in value;
|
|
38
|
+
};
|
|
39
|
+
var PluginModuleImpl = class {
|
|
40
|
+
[PluginModuleTypeId] = PluginModuleTypeId;
|
|
41
|
+
id;
|
|
42
|
+
activatesOn;
|
|
43
|
+
activatesBefore;
|
|
44
|
+
activatesAfter;
|
|
45
|
+
activate;
|
|
46
|
+
constructor(options) {
|
|
47
|
+
this.id = options.id;
|
|
48
|
+
this.activatesOn = options.activatesOn;
|
|
49
|
+
this.activatesBefore = options.activatesBefore;
|
|
50
|
+
this.activatesAfter = options.activatesAfter;
|
|
51
|
+
this.activate = options.activate;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
var PluginTypeId = /* @__PURE__ */ Symbol.for("@dxos/app-framework/Plugin");
|
|
55
|
+
var isPlugin = (value) => {
|
|
56
|
+
return typeof value === "object" && value !== null && PluginTypeId in value;
|
|
57
|
+
};
|
|
58
|
+
var PluginImpl = class {
|
|
59
|
+
_meta;
|
|
60
|
+
_modules;
|
|
61
|
+
[PluginTypeId] = PluginTypeId;
|
|
62
|
+
constructor(_meta, _modules) {
|
|
63
|
+
this._meta = _meta;
|
|
64
|
+
this._modules = _modules;
|
|
65
|
+
}
|
|
66
|
+
get meta() {
|
|
67
|
+
return this._meta;
|
|
68
|
+
}
|
|
69
|
+
get modules() {
|
|
70
|
+
return this._modules;
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
var PluginBuilderImpl = class {
|
|
74
|
+
meta;
|
|
75
|
+
_modules = [];
|
|
76
|
+
constructor(meta) {
|
|
77
|
+
this.meta = meta;
|
|
78
|
+
}
|
|
79
|
+
get modules() {
|
|
80
|
+
return this._modules;
|
|
81
|
+
}
|
|
82
|
+
addModule(moduleOptions) {
|
|
83
|
+
this._modules.push(moduleOptions);
|
|
84
|
+
return this;
|
|
85
|
+
}
|
|
86
|
+
pipe() {
|
|
87
|
+
return Pipeable.pipeArguments(this, arguments);
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
var define = (meta) => new PluginBuilderImpl(meta);
|
|
91
|
+
function addModule(moduleOptionsOrBuilder, moduleOptions) {
|
|
92
|
+
if (moduleOptions !== void 0) {
|
|
93
|
+
return moduleOptionsOrBuilder.addModule(moduleOptions);
|
|
94
|
+
}
|
|
95
|
+
const moduleOpts = moduleOptionsOrBuilder;
|
|
96
|
+
return (builder) => builder.addModule(moduleOpts);
|
|
97
|
+
}
|
|
98
|
+
var resolveModule = (meta, module, options) => {
|
|
99
|
+
const moduleOptions = typeof module === "function" ? module(options) : module;
|
|
100
|
+
const id = Option.fromNullable(moduleOptions.id).pipe(Option.match({
|
|
101
|
+
onNone: () => {
|
|
102
|
+
const exportName = getModuleTag(moduleOptions.activate);
|
|
103
|
+
invariant(exportName, `Plugin module missing name. Plugin: ${meta.id}`, {
|
|
104
|
+
F: __dxlog_file,
|
|
105
|
+
L: 301,
|
|
106
|
+
S: void 0,
|
|
107
|
+
A: [
|
|
108
|
+
"exportName",
|
|
109
|
+
"`Plugin module missing name. Plugin: ${meta.id}`"
|
|
110
|
+
]
|
|
111
|
+
});
|
|
112
|
+
return computeModuleId(meta.id, exportName);
|
|
113
|
+
},
|
|
114
|
+
onSome: (id2) => computeModuleId(meta.id, id2)
|
|
115
|
+
}));
|
|
116
|
+
return new PluginModuleImpl({
|
|
117
|
+
...moduleOptions,
|
|
118
|
+
id
|
|
119
|
+
});
|
|
120
|
+
};
|
|
121
|
+
function make(builder) {
|
|
122
|
+
const meta = builder.meta;
|
|
123
|
+
const factory = (options) => {
|
|
124
|
+
const modules = builder.modules.map((module) => resolveModule(meta, module, options));
|
|
125
|
+
return new PluginImpl(meta, modules);
|
|
126
|
+
};
|
|
127
|
+
return Object.assign(factory, {
|
|
128
|
+
meta
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export {
|
|
133
|
+
Service,
|
|
134
|
+
activate,
|
|
135
|
+
reset,
|
|
136
|
+
PluginModuleTypeId,
|
|
137
|
+
isPluginModule,
|
|
138
|
+
PluginTypeId,
|
|
139
|
+
isPlugin,
|
|
140
|
+
define,
|
|
141
|
+
addModule,
|
|
142
|
+
make,
|
|
143
|
+
plugin_exports
|
|
144
|
+
};
|
|
145
|
+
//# sourceMappingURL=chunk-7M4467QR.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/core/plugin.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Context from 'effect/Context';\nimport * as Effect from 'effect/Effect';\nimport * as Option from 'effect/Option';\nimport * as Pipeable from 'effect/Pipeable';\n\nimport { invariant } from '@dxos/invariant';\n\nimport type * as ActivationEvent from './activation-event';\nimport * as Capability from './capability';\nimport type * as PluginManager from './plugin-manager';\n\n//\n// Plugin Service Layer\n//\n\n/**\n * Effect Context.Tag for accessing PluginManager via the Effect layer system.\n * This allows lifecycle operations to access the plugin manager without having it passed as an argument.\n */\nexport class Service extends Context.Tag('@dxos/app-framework/PluginManager')<Service, PluginManager.PluginManager>() {}\n\n//\n// Lifecycle Functions\n//\n\n/**\n * Activates plugins based on the activation event.\n * Accesses the PluginManager via the Effect layer system.\n * @param event The activation event.\n * @returns Whether the activation was successful.\n */\nexport const activate = (event: ActivationEvent.ActivationEvent): Effect.Effect<boolean, Error, Service> =>\n Effect.flatMap(Service, (manager) => manager.activate(event));\n\n/**\n * Re-activates the modules that were activated by the event.\n * Accesses the PluginManager via the Effect layer system.\n * @param event The activation event.\n * @returns Whether the reset was successful.\n */\nexport const reset = (event: ActivationEvent.ActivationEvent): Effect.Effect<boolean, Error, Service> =>\n Effect.flatMap(Service, (manager) => manager.reset(event));\n\n/**\n * Computes a module ID from plugin ID and export name.\n */\nconst computeModuleId = (pluginId: string, moduleName: string): string => {\n return `${pluginId}.module.${moduleName}`;\n};\n\n/**\n * Identifier denoting a PluginModule.\n */\nexport const PluginModuleTypeId: unique symbol = Symbol.for('@dxos/app-framework/PluginModule');\nexport type PluginModuleTypeId = typeof PluginModuleTypeId;\n\n/**\n * Type guard to check if a value is a PluginModule.\n */\nexport const isPluginModule = (value: unknown): value is PluginModule => {\n return typeof value === 'object' && value !== null && PluginModuleTypeId in value;\n};\n\n/**\n * A unit of containment of modular functionality that can be provided to an application.\n * Activation of a module is async allowing for code to split and loaded lazily.\n */\nexport interface PluginModule {\n readonly [PluginModuleTypeId]: PluginModuleTypeId;\n /**\n * Unique id of the module.\n */\n id: string;\n\n /**\n * Events for which the module will be activated.\n */\n activatesOn: ActivationEvent.Events;\n\n /**\n * Events which the plugin depends on being activated.\n * Plugin is marked as needing reset a plugin activated by a dependent event is removed.\n * Events are automatically activated before activation of the plugin.\n */\n activatesBefore?: ActivationEvent.ActivationEvent[];\n\n /**\n * Events which this plugin triggers upon activation.\n */\n activatesAfter?: ActivationEvent.ActivationEvent[];\n\n /**\n * Called when the module is activated.\n * CapabilityManager is accessed via the Effect layer system (Capability.Service).\n * PluginManager is accessed via Plugin.Service.\n * @param props Optional props passed to the module.\n * @returns The capabilities of the module.\n */\n activate: (props?: any) => Effect.Effect<Capability.ModuleReturn, Error, Capability.Service | Service | never>;\n}\n\nexport type PluginModuleOptions = Omit<PluginModule, 'id' | typeof PluginModuleTypeId> & { id?: string };\n\nclass PluginModuleImpl implements PluginModule {\n readonly [PluginModuleTypeId]: PluginModuleTypeId = PluginModuleTypeId;\n readonly id: PluginModule['id'];\n readonly activatesOn: PluginModule['activatesOn'];\n readonly activatesBefore?: PluginModule['activatesBefore'];\n readonly activatesAfter?: PluginModule['activatesAfter'];\n readonly activate: PluginModule['activate'];\n\n constructor(options: Omit<PluginModule, typeof PluginModuleTypeId>) {\n this.id = options.id;\n this.activatesOn = options.activatesOn;\n this.activatesBefore = options.activatesBefore;\n this.activatesAfter = options.activatesAfter;\n this.activate = options.activate;\n }\n}\n\nexport type Meta = {\n /**\n * Globally unique ID.\n *\n * Expected to be in the form of a valid URL.\n *\n * @example org.dxos.plugin.example\n */\n id: string;\n\n /**\n * Human-readable name.\n */\n name: string;\n\n /**\n * Short description of plugin functionality.\n */\n description?: string;\n\n /**\n * URL of home page.\n */\n homePage?: string;\n\n /**\n * URL of source code.\n */\n source?: string;\n\n /**\n * URL of screenshot.\n */\n screenshots?: string[];\n\n /**\n * Tags to help categorize the plugin.\n */\n tags?: string[];\n\n /**\n * A grep-able symbol string which can be resolved to an icon asset by @ch-ui/icons, via @ch-ui/vite-plugin-icons.\n */\n icon?: string;\n\n /**\n * Icon hue (ChromaticPalette).\n */\n iconHue?: string;\n};\n\n/**\n * Identifier denoting a Plugin.\n */\nexport const PluginTypeId: unique symbol = Symbol.for('@dxos/app-framework/Plugin');\nexport type PluginTypeId = typeof PluginTypeId;\n\n/**\n * Type guard to check if a value is a Plugin.\n */\nexport const isPlugin = (value: unknown): value is Plugin => {\n return typeof value === 'object' && value !== null && PluginTypeId in value;\n};\n\n/**\n * A collection of modules that are be enabled/disabled as a unit.\n * Plugins provide things such as components, state, actions, etc. to the application.\n */\n// TODO(burdon): Convert to ECHO schema.\nexport interface Plugin {\n readonly [PluginTypeId]: PluginTypeId;\n readonly meta: Readonly<Meta>;\n readonly modules: ReadonlyArray<PluginModule>;\n}\n\n/**\n * Internal implementation of Plugin.\n * @internal\n */\nclass PluginImpl implements Plugin {\n readonly [PluginTypeId]: PluginTypeId = PluginTypeId;\n\n constructor(\n private readonly _meta: Meta,\n private readonly _modules: PluginModule[],\n ) {}\n\n get meta(): Readonly<Meta> {\n return this._meta;\n }\n\n get modules(): ReadonlyArray<PluginModule> {\n return this._modules;\n }\n}\n\n/**\n * Builder interface for creating plugins incrementally.\n */\nexport interface PluginBuilder<T = void> extends Pipeable.Pipeable {\n readonly meta: Meta;\n readonly modules: ReadonlyArray<PluginModuleOptions | ((options: T) => PluginModuleOptions)>;\n addModule(moduleOptions: PluginModuleOptions | ((options: T) => PluginModuleOptions)): PluginBuilder<T>;\n}\n\n/**\n * Builder implementation for creating plugins incrementally.\n */\nclass PluginBuilderImpl<T = void> implements PluginBuilder<T> {\n readonly meta: Meta;\n private readonly _modules: Array<PluginModuleOptions | ((options: T) => PluginModuleOptions)> = [];\n\n constructor(meta: Meta) {\n this.meta = meta;\n }\n\n get modules(): ReadonlyArray<PluginModuleOptions | ((options: T) => PluginModuleOptions)> {\n return this._modules;\n }\n\n addModule(moduleOptions: PluginModuleOptions | ((options: T) => PluginModuleOptions)): PluginBuilder<T> {\n this._modules.push(moduleOptions);\n return this;\n }\n\n pipe() {\n // eslint-disable-next-line prefer-rest-params\n return Pipeable.pipeArguments(this, arguments);\n }\n}\n\n/**\n * Creates a new PluginBuilder to start building a plugin.\n */\nexport const define = <T = void>(meta: Meta): PluginBuilder<T> => new PluginBuilderImpl<T>(meta);\n\n/**\n * Adds a module to a plugin builder.\n * Supports both pipeline and direct call styles.\n * Modules can be either PluginModuleOptions or functions that receive options.\n */\nexport function addModule<T>(\n moduleOptions: PluginModuleOptions | ((options: T) => PluginModuleOptions),\n): (builder: PluginBuilder<T>) => PluginBuilder<T>;\nexport function addModule<T>(\n builder: PluginBuilder<T>,\n moduleOptions: PluginModuleOptions | ((options: T) => PluginModuleOptions),\n): PluginBuilder<T>;\nexport function addModule<T>(\n moduleOptionsOrBuilder: PluginModuleOptions | ((options: T) => PluginModuleOptions) | PluginBuilder<T>,\n moduleOptions?: PluginModuleOptions | ((options: T) => PluginModuleOptions),\n): ((builder: PluginBuilder<T>) => PluginBuilder<T>) | PluginBuilder<T> {\n // If second arg is provided, it's the direct call style: addModule(builder, moduleOptions)\n if (moduleOptions !== undefined) {\n return (moduleOptionsOrBuilder as PluginBuilder<T>).addModule(moduleOptions);\n }\n // Otherwise it's pipeline style: addModule(moduleOptions) returns a function\n const moduleOpts = moduleOptionsOrBuilder as PluginModuleOptions | ((options: T) => PluginModuleOptions);\n return (builder: PluginBuilder<T>) => builder.addModule(moduleOpts);\n}\n\nexport type PluginFactory<T = void> = ((options: T) => Plugin) & { meta: Meta };\n\n/**\n * Resolves a module from either PluginModuleOptions or a function that returns PluginModuleOptions.\n */\nconst resolveModule = (\n meta: Meta,\n module: PluginModuleOptions | ((options: any) => PluginModuleOptions),\n options?: any,\n): PluginModuleImpl => {\n const moduleOptions = typeof module === 'function' ? module(options) : module;\n const id = Option.fromNullable(moduleOptions.id).pipe(\n Option.match({\n onNone: () => {\n const exportName = Capability.getModuleTag(moduleOptions.activate);\n invariant(exportName, `Plugin module missing name. Plugin: ${meta.id}`);\n return computeModuleId(meta.id, exportName);\n },\n onSome: (id) => computeModuleId(meta.id, id),\n }),\n );\n return new PluginModuleImpl({ ...moduleOptions, id });\n};\n\n/**\n * Creates a Plugin from a builder.\n * Supports both pipeline and direct call styles.\n * Always returns a factory function (options: T) => Plugin.\n * When T is void, the function takes no arguments: () => Plugin.\n */\nexport function make<T>(builder: PluginBuilder<T>): PluginFactory<T>;\nexport function make<T>(builder: PluginBuilder<T>): PluginFactory<T> {\n const meta = builder.meta;\n\n const factory = (options: T) => {\n const modules = builder.modules.map((module) => resolveModule(meta, module, options));\n return new PluginImpl(meta, modules);\n };\n\n return Object.assign(factory, { meta });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Context", "Effect", "Option", "Pipeable", "invariant", "Service", "Tag", "activate", "event", "flatMap", "manager", "reset", "computeModuleId", "pluginId", "moduleName", "PluginModuleTypeId", "Symbol", "for", "isPluginModule", "value", "PluginModuleImpl", "id", "activatesOn", "activatesBefore", "activatesAfter", "options", "PluginTypeId", "isPlugin", "PluginImpl", "_meta", "_modules", "meta", "modules", "PluginBuilderImpl", "addModule", "moduleOptions", "push", "pipe", "pipeArguments", "arguments", "define", "moduleOptionsOrBuilder", "undefined", "moduleOpts", "builder", "resolveModule", "module", "fromNullable", "match", "onNone", "exportName", "getModuleTag", "invariant", "onSome", "make", "factory", "map", "Object", "assign"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import {
|
|
2
|
+
UndoOperation
|
|
3
|
+
} from "./chunk-TIEBZMTF.mjs";
|
|
4
|
+
import {
|
|
5
|
+
__export
|
|
6
|
+
} from "./chunk-J5LGTIGS.mjs";
|
|
7
|
+
|
|
8
|
+
// src/plugin-operation/history/errors.ts
|
|
9
|
+
import { OperationError } from "@dxos/operation";
|
|
10
|
+
var EmptyHistoryError = class extends OperationError {
|
|
11
|
+
constructor() {
|
|
12
|
+
super("EMPTY_HISTORY", "Cannot undo: history is empty.");
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
// src/plugin-operation/history/undo-mapping.ts
|
|
17
|
+
var undo_mapping_exports = {};
|
|
18
|
+
__export(undo_mapping_exports, {
|
|
19
|
+
make: () => make,
|
|
20
|
+
resolveMessage: () => resolveMessage
|
|
21
|
+
});
|
|
22
|
+
var make = (props) => props;
|
|
23
|
+
var resolveMessage = (message, input, output) => {
|
|
24
|
+
if (message === void 0) {
|
|
25
|
+
return void 0;
|
|
26
|
+
}
|
|
27
|
+
if (typeof message === "function") {
|
|
28
|
+
return message(input, output);
|
|
29
|
+
}
|
|
30
|
+
return message;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
// src/plugin-operation/history/undo-registry.ts
|
|
34
|
+
var undo_registry_exports = {};
|
|
35
|
+
__export(undo_registry_exports, {
|
|
36
|
+
make: () => make2
|
|
37
|
+
});
|
|
38
|
+
var make2 = (getMappings) => {
|
|
39
|
+
const lookup = (operation) => {
|
|
40
|
+
const mappings = getMappings();
|
|
41
|
+
const mapping = mappings.find((m) => m.operation.meta.key === operation.meta.key);
|
|
42
|
+
if (!mapping) {
|
|
43
|
+
return void 0;
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
inverse: mapping.inverse,
|
|
47
|
+
deriveContext: mapping.deriveContext,
|
|
48
|
+
message: mapping.message
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
return {
|
|
52
|
+
lookup
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
// src/plugin-operation/history/history-tracker.ts
|
|
57
|
+
var history_tracker_exports = {};
|
|
58
|
+
__export(history_tracker_exports, {
|
|
59
|
+
make: () => make3
|
|
60
|
+
});
|
|
61
|
+
import * as Effect from "effect/Effect";
|
|
62
|
+
import * as Stream from "effect/Stream";
|
|
63
|
+
import { runAndForwardErrors } from "@dxos/effect";
|
|
64
|
+
import { log } from "@dxos/log";
|
|
65
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/sdk/app-framework/src/plugin-operation/history/history-tracker.ts";
|
|
66
|
+
var HISTORY_LIMIT = 100;
|
|
67
|
+
var make3 = (invoker, undoRegistry) => {
|
|
68
|
+
const history = [];
|
|
69
|
+
const handleInvocation = (event) => {
|
|
70
|
+
const mapping = undoRegistry.lookup(event.operation);
|
|
71
|
+
if (!mapping) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const inverseInput = mapping.deriveContext(event.input, event.output);
|
|
75
|
+
if (inverseInput === void 0) {
|
|
76
|
+
log("operation not undoable", {
|
|
77
|
+
key: event.operation.meta.key
|
|
78
|
+
}, {
|
|
79
|
+
F: __dxlog_file,
|
|
80
|
+
L: 58,
|
|
81
|
+
S: void 0,
|
|
82
|
+
C: (f, a) => f(...a)
|
|
83
|
+
});
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const entry = {
|
|
87
|
+
operation: event.operation,
|
|
88
|
+
input: event.input,
|
|
89
|
+
output: event.output,
|
|
90
|
+
inverse: mapping.inverse,
|
|
91
|
+
inverseInput,
|
|
92
|
+
timestamp: event.timestamp
|
|
93
|
+
};
|
|
94
|
+
history.push(entry);
|
|
95
|
+
log("history entry added", {
|
|
96
|
+
key: event.operation.meta.key,
|
|
97
|
+
historyLength: history.length
|
|
98
|
+
}, {
|
|
99
|
+
F: __dxlog_file,
|
|
100
|
+
L: 72,
|
|
101
|
+
S: void 0,
|
|
102
|
+
C: (f, a) => f(...a)
|
|
103
|
+
});
|
|
104
|
+
if (history.length > HISTORY_LIMIT) {
|
|
105
|
+
history.splice(0, history.length - HISTORY_LIMIT);
|
|
106
|
+
}
|
|
107
|
+
const resolvedMessage = resolveMessage(mapping.message, event.input, event.output);
|
|
108
|
+
Effect.runFork(invoker.invoke(UndoOperation.ShowUndo, {
|
|
109
|
+
message: resolvedMessage
|
|
110
|
+
}));
|
|
111
|
+
};
|
|
112
|
+
Effect.runFork(Stream.fromPubSub(invoker.invocations).pipe(Stream.runForEach((event) => Effect.sync(() => handleInvocation(event)))));
|
|
113
|
+
const undo = () => {
|
|
114
|
+
return Effect.gen(function* () {
|
|
115
|
+
const entry = history.pop();
|
|
116
|
+
if (!entry) {
|
|
117
|
+
return yield* Effect.fail(new EmptyHistoryError());
|
|
118
|
+
}
|
|
119
|
+
log("undoing operation", {
|
|
120
|
+
key: entry.operation.meta.key,
|
|
121
|
+
inverseKey: entry.inverse.meta.key
|
|
122
|
+
}, {
|
|
123
|
+
F: __dxlog_file,
|
|
124
|
+
L: 102,
|
|
125
|
+
S: this,
|
|
126
|
+
C: (f, a) => f(...a)
|
|
127
|
+
});
|
|
128
|
+
yield* invoker._invokeCore(entry.inverse, entry.inverseInput);
|
|
129
|
+
log("undo completed", {
|
|
130
|
+
key: entry.operation.meta.key
|
|
131
|
+
}, {
|
|
132
|
+
F: __dxlog_file,
|
|
133
|
+
L: 107,
|
|
134
|
+
S: this,
|
|
135
|
+
C: (f, a) => f(...a)
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
};
|
|
139
|
+
const undoPromise = async () => {
|
|
140
|
+
return runAndForwardErrors(undo()).then(() => ({})).catch((error) => {
|
|
141
|
+
log.catch(error, void 0, {
|
|
142
|
+
F: __dxlog_file,
|
|
143
|
+
L: 115,
|
|
144
|
+
S: void 0,
|
|
145
|
+
C: (f, a) => f(...a)
|
|
146
|
+
});
|
|
147
|
+
return {
|
|
148
|
+
error
|
|
149
|
+
};
|
|
150
|
+
});
|
|
151
|
+
};
|
|
152
|
+
const canUndo = () => {
|
|
153
|
+
return history.length > 0;
|
|
154
|
+
};
|
|
155
|
+
return {
|
|
156
|
+
undo,
|
|
157
|
+
undoPromise,
|
|
158
|
+
canUndo
|
|
159
|
+
};
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
export {
|
|
163
|
+
EmptyHistoryError,
|
|
164
|
+
undo_mapping_exports,
|
|
165
|
+
make2 as make,
|
|
166
|
+
undo_registry_exports,
|
|
167
|
+
make3 as make2,
|
|
168
|
+
history_tracker_exports
|
|
169
|
+
};
|
|
170
|
+
//# sourceMappingURL=chunk-JGWCBVKJ.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/plugin-operation/history/errors.ts", "../../../src/plugin-operation/history/undo-mapping.ts", "../../../src/plugin-operation/history/undo-registry.ts", "../../../src/plugin-operation/history/history-tracker.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { OperationError } from '@dxos/operation';\n\nexport class EmptyHistoryError extends OperationError {\n constructor() {\n super('EMPTY_HISTORY', 'Cannot undo: history is empty.');\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport type { Operation } from '@dxos/operation';\n\n/**\n * Label type for translatable text (canonical definition in @dxos/app-toolkit).\n */\ntype Label = string | [string, { ns: string; count?: number; defaultValue?: string }];\n\n/**\n * Extract the input type from an OperationDefinition.\n */\nexport type InputOf<T> = T extends Operation.Definition<infer I, any> ? I : never;\n\n/**\n * Extract the output type from an OperationDefinition.\n */\nexport type OutputOf<T> = T extends Operation.Definition<any, infer O> ? O : never;\n\n/**\n * Message provider for undo toast.\n * Can be a static Label or a function that derives the message from input/output.\n */\nexport type MessageProvider<Op extends Operation.Definition<any, any>> =\n | Label\n | ((input: InputOf<Op>, output: OutputOf<Op>) => Label);\n\n/**\n * Undo mapping that links a forward operation to its inverse.\n * Type parameters ensure deriveContext has correctly typed arguments.\n *\n * @template Op - The forward operation definition type.\n * @template Inv - The inverse operation definition type.\n */\nexport interface UndoMapping<\n Op extends Operation.Definition<any, any> = Operation.Definition<any, any>,\n Inv extends Operation.Definition<any, any> = Operation.Definition<any, any>,\n> {\n /** The forward operation. */\n readonly operation: Op;\n\n /** The inverse operation to invoke for undo. */\n readonly inverse: Inv;\n\n /**\n * Derives the input for the inverse operation from the forward operation's input and output.\n * @param input - The input that was passed to the forward operation.\n * @param output - The output that was returned by the forward operation.\n * @returns The input to pass to the inverse operation, or undefined to indicate the operation is not undoable.\n */\n readonly deriveContext: (input: InputOf<Op>, output: OutputOf<Op>) => InputOf<Inv> | undefined;\n\n /**\n * Optional message to show in the undo toast.\n * Can be a static Label or a function that derives the message from input/output.\n */\n readonly message?: MessageProvider<Op>;\n}\n\n/**\n * Props for creating an UndoMapping.\n */\nexport interface UndoMappingProps<\n Op extends Operation.Definition<any, any>,\n Inv extends Operation.Definition<any, any>,\n> {\n /** The forward operation. */\n operation: Op;\n\n /** The inverse operation to invoke for undo. */\n inverse: Inv;\n\n /**\n * Derives the input for the inverse operation from the forward operation's input and output.\n * Return undefined to indicate the operation is not undoable.\n */\n deriveContext: (input: InputOf<Op>, output: OutputOf<Op>) => InputOf<Inv> | undefined;\n\n /**\n * Optional message to show in the undo toast.\n * Can be a static Label or a function that derives the message from input/output.\n */\n message?: MessageProvider<Op>;\n}\n\n/**\n * Creates a type-safe undo mapping.\n *\n * @example\n * ```ts\n * // Static message\n * const mapping = UndoMapping.make({\n * operation: DeleteThread,\n * inverse: RestoreThread,\n * deriveContext: (input, output) => ({\n * thread: output.thread,\n * anchor: output.anchor,\n * }),\n * message: ['thread deleted label', { ns: '@dxos/plugin-thread' }],\n * });\n *\n * // Dynamic message based on input/output\n * const mapping = UndoMapping.make({\n * operation: RemoveObjects,\n * inverse: RestoreObjects,\n * deriveContext: (_input, output) => output,\n * message: (input, _output) =>\n * input.objects.length === 1\n * ? ['object deleted label', { ns: getTypename(input.objects[0]) }]\n * : ['objects deleted label', { ns: '@dxos/plugin-space' }],\n * });\n * ```\n */\nexport const make = <Op extends Operation.Definition<any, any>, Inv extends Operation.Definition<any, any>>(\n props: UndoMappingProps<Op, Inv>,\n): UndoMapping<Op, Inv> => props;\n\n/**\n * Resolves a message provider to a Label.\n */\nexport const resolveMessage = <Op extends Operation.Definition<any, any>>(\n message: MessageProvider<Op> | undefined,\n input: InputOf<Op>,\n output: OutputOf<Op>,\n): Label | undefined => {\n if (message === undefined) {\n return undefined;\n }\n if (typeof message === 'function') {\n return message(input, output);\n }\n return message;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport type { Operation } from '@dxos/operation';\n\nimport type * as UndoMapping from './undo-mapping';\n\n//\n// Public Interface\n//\n\n/**\n * Lookup result from UndoRegistry.\n */\nexport type UndoMappingResult = {\n inverse: Operation.Definition<any, any>;\n /** Returns undefined to indicate the operation is not undoable. */\n deriveContext: (input: any, output: any) => any | undefined;\n /** Message provider - may be a static Label or a function. */\n message?: UndoMapping.MessageProvider<Operation.Definition<any, any>>;\n};\n\n/**\n * UndoRegistry interface - looks up inverse operations.\n */\nexport interface UndoRegistry {\n lookup: (operation: Operation.Definition<any, any>) => UndoMappingResult | undefined;\n}\n\n//\n// Factory\n//\n\n/**\n * Creates an UndoRegistry that looks up inverse operations.\n */\nexport const make = (getMappings: () => UndoMapping.UndoMapping[]): UndoRegistry => {\n const lookup = (operation: Operation.Definition<any, any>): UndoMappingResult | undefined => {\n const mappings = getMappings();\n const mapping = mappings.find((m) => m.operation.meta.key === operation.meta.key);\n if (!mapping) {\n return undefined;\n }\n\n return {\n inverse: mapping.inverse,\n deriveContext: mapping.deriveContext,\n message: mapping.message,\n };\n };\n\n return { lookup };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Stream from 'effect/Stream';\n\nimport { runAndForwardErrors } from '@dxos/effect';\nimport { log } from '@dxos/log';\nimport { type OperationInvoker } from '@dxos/operation';\n\nimport { UndoOperation } from '../../common';\n\nimport { EmptyHistoryError } from './errors';\nimport type { HistoryEntry } from './types';\nimport { resolveMessage } from './undo-mapping';\nimport type { UndoRegistry } from './undo-registry';\n\nconst HISTORY_LIMIT = 100;\n\n//\n// Public Interface\n//\n\n/**\n * HistoryTracker interface - tracks operation history and provides undo.\n */\nexport interface HistoryTracker {\n undo: () => Effect.Effect<void, Error>;\n undoPromise: () => Promise<{ error?: Error }>;\n canUndo: () => boolean;\n}\n\n//\n// Factory\n//\n\n/**\n * Creates a HistoryTracker that subscribes to invocation events and provides undo.\n */\nexport const make = (\n invoker: OperationInvoker.OperationInvokerInternal,\n undoRegistry: UndoRegistry,\n): HistoryTracker => {\n const history: HistoryEntry[] = [];\n\n // Subscribe to invocation stream.\n const handleInvocation = (event: OperationInvoker.InvocationEvent) => {\n const mapping = undoRegistry.lookup(event.operation);\n if (!mapping) {\n // Operation is not undoable, skip.\n return;\n }\n\n const inverseInput = mapping.deriveContext(event.input, event.output);\n if (inverseInput === undefined) {\n // Operation is conditionally not undoable (deriveContext returned undefined).\n log('operation not undoable', { key: event.operation.meta.key });\n return;\n }\n\n const entry: HistoryEntry = {\n operation: event.operation,\n input: event.input,\n output: event.output,\n inverse: mapping.inverse,\n inverseInput,\n timestamp: event.timestamp,\n };\n\n history.push(entry);\n log('history entry added', { key: event.operation.meta.key, historyLength: history.length });\n\n // Trim history if it exceeds limit.\n if (history.length > HISTORY_LIMIT) {\n history.splice(0, history.length - HISTORY_LIMIT);\n }\n\n // Show undo toast (resolve message if it's a function).\n const resolvedMessage = resolveMessage(mapping.message, event.input, event.output);\n Effect.runFork(\n invoker.invoke(UndoOperation.ShowUndo, {\n message: resolvedMessage,\n }),\n );\n };\n\n // Fork a fiber to consume the invocation stream.\n Effect.runFork(\n Stream.fromPubSub(invoker.invocations).pipe(\n Stream.runForEach((event) => Effect.sync(() => handleInvocation(event))),\n ),\n );\n\n const undo = (): Effect.Effect<void, Error> => {\n return Effect.gen(function* () {\n const entry = history.pop();\n if (!entry) {\n return yield* Effect.fail(new EmptyHistoryError());\n }\n\n log('undoing operation', { key: entry.operation.meta.key, inverseKey: entry.inverse.meta.key });\n\n // Use _invokeCore to skip event emission (avoid undo-of-undo loops).\n yield* invoker._invokeCore(entry.inverse, entry.inverseInput);\n\n log('undo completed', { key: entry.operation.meta.key });\n });\n };\n\n const undoPromise = async (): Promise<{ error?: Error }> => {\n return runAndForwardErrors(undo())\n .then(() => ({}))\n .catch((error) => {\n log.catch(error);\n return { error };\n });\n };\n\n const canUndo = (): boolean => {\n return history.length > 0;\n };\n\n return {\n undo,\n undoPromise,\n canUndo,\n };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["OperationError", "EmptyHistoryError", "OperationError", "make", "props", "resolveMessage", "message", "input", "output", "undefined", "make", "make", "getMappings", "lookup", "operation", "mappings", "mapping", "find", "m", "meta", "key", "undefined", "inverse", "deriveContext", "message", "make", "Effect", "Stream", "runAndForwardErrors", "log", "HISTORY_LIMIT", "make", "invoker", "undoRegistry", "history", "handleInvocation", "event", "mapping", "lookup", "operation", "inverseInput", "deriveContext", "input", "output", "undefined", "log", "key", "meta", "entry", "inverse", "timestamp", "push", "historyLength", "length", "splice", "resolvedMessage", "resolveMessage", "message", "Effect", "runFork", "invoke", "UndoOperation", "ShowUndo", "fromPubSub", "invocations", "pipe", "runForEach", "sync", "undo", "gen", "pop", "fail", "EmptyHistoryError", "inverseKey", "_invokeCore", "undoPromise", "runAndForwardErrors", "then", "catch", "error", "canUndo"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import {
|
|
2
|
+
activation_event_exports
|
|
3
|
+
} from "./chunk-272IPLHQ.mjs";
|
|
4
|
+
import {
|
|
5
|
+
__export
|
|
6
|
+
} from "./chunk-J5LGTIGS.mjs";
|
|
7
|
+
|
|
8
|
+
// src/common/activation-events.ts
|
|
9
|
+
var activation_events_exports = {};
|
|
10
|
+
__export(activation_events_exports, {
|
|
11
|
+
ManagedRuntimeReady: () => ManagedRuntimeReady,
|
|
12
|
+
OperationInvokerReady: () => OperationInvokerReady,
|
|
13
|
+
SetupLayer: () => SetupLayer,
|
|
14
|
+
SetupOperationResolver: () => SetupOperationResolver,
|
|
15
|
+
SetupReactSurface: () => SetupReactSurface,
|
|
16
|
+
Startup: () => Startup
|
|
17
|
+
});
|
|
18
|
+
var Startup = activation_event_exports.make("org.dxos.app-framework.event.startup");
|
|
19
|
+
var SetupReactSurface = activation_event_exports.make("org.dxos.app-framework.event.setup-react-surface");
|
|
20
|
+
var SetupOperationResolver = activation_event_exports.make("org.dxos.app-framework.event.setup-operation-resolver");
|
|
21
|
+
var SetupLayer = activation_event_exports.make("org.dxos.app-framework.event.setup-layer");
|
|
22
|
+
var OperationInvokerReady = activation_event_exports.make("org.dxos.app-framework.event.operation-invoker-ready");
|
|
23
|
+
var ManagedRuntimeReady = activation_event_exports.make("org.dxos.app-framework.event.managed-runtime-ready");
|
|
24
|
+
|
|
25
|
+
export {
|
|
26
|
+
Startup,
|
|
27
|
+
SetupReactSurface,
|
|
28
|
+
SetupOperationResolver,
|
|
29
|
+
SetupLayer,
|
|
30
|
+
OperationInvokerReady,
|
|
31
|
+
ManagedRuntimeReady,
|
|
32
|
+
activation_events_exports
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=chunk-M5IC326L.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/common/activation-events.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { ActivationEvent as ActivationEvent$ } from '../core';\n\n/**\n * Fired when the app is started.\n */\nexport const Startup = ActivationEvent$.make('org.dxos.app-framework.event.startup');\n\n//\n// Dependent Events\n//\n\n/**\n * Fired to load any newly available surfaces.\n */\nexport const SetupReactSurface = ActivationEvent$.make('org.dxos.app-framework.event.setup-react-surface');\n\n/**\n * Fired before the operation invoker is activated.\n */\nexport const SetupOperationResolver = ActivationEvent$.make('org.dxos.app-framework.event.setup-operation-resolver');\n\n/**\n * Fired before the managed runtime is created.\n * Plugins should contribute their Layer capabilities before this event.\n */\nexport const SetupLayer = ActivationEvent$.make('org.dxos.app-framework.event.setup-layer');\n\n//\n// Triggered Events\n//\n\n/**\n * Fired after the operation invoker is ready.\n */\nexport const OperationInvokerReady = ActivationEvent$.make('org.dxos.app-framework.event.operation-invoker-ready');\n\n/**\n * Fired after the managed runtime is ready.\n */\nexport const ManagedRuntimeReady = ActivationEvent$.make('org.dxos.app-framework.event.managed-runtime-ready');\n"],
|
|
5
|
+
"mappings": ";;;;;;;;AAAA;;;;;;;;;AASO,IAAMA,UAAUC,yBAAiBC,KAAK,sCAAA;AAStC,IAAMC,oBAAoBF,yBAAiBC,KAAK,kDAAA;AAKhD,IAAME,yBAAyBH,yBAAiBC,KAAK,uDAAA;AAMrD,IAAMG,aAAaJ,yBAAiBC,KAAK,0CAAA;AASzC,IAAMI,wBAAwBL,yBAAiBC,KAAK,sDAAA;AAKpD,IAAMK,sBAAsBN,yBAAiBC,KAAK,oDAAA;",
|
|
6
|
+
"names": ["Startup", "ActivationEvent$", "make", "SetupReactSurface", "SetupOperationResolver", "SetupLayer", "OperationInvokerReady", "ManagedRuntimeReady"]
|
|
7
|
+
}
|