@dxos/app-framework 0.8.4-main.a4bbb77 → 0.8.4-main.abd8ff62ef

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.
Files changed (571) hide show
  1. package/.storybook/main.mts +2 -4
  2. package/.storybook/preview.mts +2 -2
  3. package/dist/lib/browser/capability-Q5XRXRD2.mjs +38 -0
  4. package/dist/lib/browser/capability-Q5XRXRD2.mjs.map +7 -0
  5. package/dist/lib/browser/capability-V7LR4LQN.mjs +35 -0
  6. package/dist/lib/browser/capability-V7LR4LQN.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-23D4SJUE.mjs +42 -0
  8. package/dist/lib/browser/chunk-23D4SJUE.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-3JWJXGLK.mjs +79 -0
  10. package/dist/lib/browser/chunk-3JWJXGLK.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-3ZS2A3DN.mjs +907 -0
  12. package/dist/lib/browser/chunk-3ZS2A3DN.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-45CHLTBV.mjs +34 -0
  14. package/dist/lib/browser/chunk-45CHLTBV.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-5LAIGWLU.mjs +467 -0
  16. package/dist/lib/browser/chunk-5LAIGWLU.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-66IXTIVK.mjs +48 -0
  18. package/dist/lib/browser/chunk-66IXTIVK.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-FJ4765WW.mjs +8 -0
  20. package/dist/lib/browser/chunk-FJ4765WW.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-G7SDBRKH.mjs +1 -0
  22. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  23. package/dist/lib/browser/chunk-JXCBZSBJ.mjs +372 -0
  24. package/dist/lib/browser/chunk-JXCBZSBJ.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-MX5DKEJH.mjs +584 -0
  26. package/dist/lib/browser/chunk-MX5DKEJH.mjs.map +7 -0
  27. package/dist/lib/browser/chunk-WBHCSOBW.mjs +80 -0
  28. package/dist/lib/browser/chunk-WBHCSOBW.mjs.map +7 -0
  29. package/dist/lib/browser/chunk-Z55LVAGN.mjs +213 -0
  30. package/dist/lib/browser/chunk-Z55LVAGN.mjs.map +7 -0
  31. package/dist/lib/browser/chunk-ZGJAZSNE.mjs +142 -0
  32. package/dist/lib/browser/chunk-ZGJAZSNE.mjs.map +7 -0
  33. package/dist/lib/browser/cli/index.mjs +74 -0
  34. package/dist/lib/browser/cli/index.mjs.map +7 -0
  35. package/dist/lib/browser/common/activation-events.mjs +24 -0
  36. package/dist/lib/browser/common/capabilities.mjs +46 -0
  37. package/dist/lib/browser/core/activation-event.mjs +20 -0
  38. package/dist/lib/browser/core/activation-event.mjs.map +7 -0
  39. package/dist/lib/browser/core/capability.mjs +30 -0
  40. package/dist/lib/browser/core/capability.mjs.map +7 -0
  41. package/dist/lib/browser/core/plugin-manager.mjs +17 -0
  42. package/dist/lib/browser/core/plugin-manager.mjs.map +7 -0
  43. package/dist/lib/browser/core/plugin.mjs +37 -0
  44. package/dist/lib/browser/core/plugin.mjs.map +7 -0
  45. package/dist/lib/browser/core/url-loader.mjs +20 -0
  46. package/dist/lib/browser/core/url-loader.mjs.map +7 -0
  47. package/dist/lib/browser/index.mjs +95 -148
  48. package/dist/lib/browser/index.mjs.map +4 -4
  49. package/dist/lib/browser/invoker-capability-LNX4CGIV.mjs +44 -0
  50. package/dist/lib/browser/invoker-capability-LNX4CGIV.mjs.map +7 -0
  51. package/dist/lib/browser/meta.json +1 -1
  52. package/dist/lib/browser/testing/index.mjs +227 -41
  53. package/dist/lib/browser/testing/index.mjs.map +4 -4
  54. package/dist/lib/browser/testing/react.mjs +78 -0
  55. package/dist/lib/browser/testing/react.mjs.map +7 -0
  56. package/dist/lib/browser/ui/index.mjs +48 -0
  57. package/dist/lib/browser/ui/index.mjs.map +7 -0
  58. package/dist/lib/node-esm/capability-EW5GJCI6.mjs +39 -0
  59. package/dist/lib/node-esm/capability-EW5GJCI6.mjs.map +7 -0
  60. package/dist/lib/node-esm/capability-YKBMMD53.mjs +36 -0
  61. package/dist/lib/node-esm/capability-YKBMMD53.mjs.map +7 -0
  62. package/dist/lib/node-esm/chunk-37Z53PXZ.mjs +10 -0
  63. package/dist/lib/node-esm/chunk-37Z53PXZ.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-6XW6LET6.mjs +35 -0
  65. package/dist/lib/node-esm/chunk-6XW6LET6.mjs.map +7 -0
  66. package/dist/lib/node-esm/chunk-D347W3KO.mjs +143 -0
  67. package/dist/lib/node-esm/chunk-D347W3KO.mjs.map +7 -0
  68. package/dist/lib/node-esm/chunk-D5PO2WXX.mjs +373 -0
  69. package/dist/lib/node-esm/chunk-D5PO2WXX.mjs.map +7 -0
  70. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  71. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  72. package/dist/lib/node-esm/chunk-HTBJU5FX.mjs +214 -0
  73. package/dist/lib/node-esm/chunk-HTBJU5FX.mjs.map +7 -0
  74. package/dist/lib/node-esm/chunk-KM2F6GH6.mjs +468 -0
  75. package/dist/lib/node-esm/chunk-KM2F6GH6.mjs.map +7 -0
  76. package/dist/lib/node-esm/chunk-OZ7DZA5Z.mjs +2 -0
  77. package/dist/lib/node-esm/chunk-OZ7DZA5Z.mjs.map +7 -0
  78. package/dist/lib/node-esm/chunk-Q7XBFII4.mjs +908 -0
  79. package/dist/lib/node-esm/chunk-Q7XBFII4.mjs.map +7 -0
  80. package/dist/lib/node-esm/chunk-SBS2YMPT.mjs +43 -0
  81. package/dist/lib/node-esm/chunk-SBS2YMPT.mjs.map +7 -0
  82. package/dist/lib/node-esm/chunk-SDJ4B2LU.mjs +80 -0
  83. package/dist/lib/node-esm/chunk-SDJ4B2LU.mjs.map +7 -0
  84. package/dist/lib/node-esm/chunk-WFSRZKBP.mjs +81 -0
  85. package/dist/lib/node-esm/chunk-WFSRZKBP.mjs.map +7 -0
  86. package/dist/lib/node-esm/chunk-WKTLE7MG.mjs +585 -0
  87. package/dist/lib/node-esm/chunk-WKTLE7MG.mjs.map +7 -0
  88. package/dist/lib/node-esm/chunk-XOCUANHO.mjs +49 -0
  89. package/dist/lib/node-esm/chunk-XOCUANHO.mjs.map +7 -0
  90. package/dist/lib/node-esm/cli/index.mjs +75 -0
  91. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  92. package/dist/lib/node-esm/common/activation-events.mjs +25 -0
  93. package/dist/lib/node-esm/common/activation-events.mjs.map +7 -0
  94. package/dist/lib/node-esm/common/capabilities.mjs +47 -0
  95. package/dist/lib/node-esm/common/capabilities.mjs.map +7 -0
  96. package/dist/lib/node-esm/core/activation-event.mjs +21 -0
  97. package/dist/lib/node-esm/core/activation-event.mjs.map +7 -0
  98. package/dist/lib/node-esm/core/capability.mjs +31 -0
  99. package/dist/lib/node-esm/core/capability.mjs.map +7 -0
  100. package/dist/lib/node-esm/core/plugin-manager.mjs +18 -0
  101. package/dist/lib/node-esm/core/plugin-manager.mjs.map +7 -0
  102. package/dist/lib/node-esm/core/plugin.mjs +38 -0
  103. package/dist/lib/node-esm/core/plugin.mjs.map +7 -0
  104. package/dist/lib/node-esm/core/url-loader.mjs +21 -0
  105. package/dist/lib/node-esm/core/url-loader.mjs.map +7 -0
  106. package/dist/lib/node-esm/index.mjs +95 -148
  107. package/dist/lib/node-esm/index.mjs.map +4 -4
  108. package/dist/lib/node-esm/invoker-capability-O4T5PHLA.mjs +45 -0
  109. package/dist/lib/node-esm/invoker-capability-O4T5PHLA.mjs.map +7 -0
  110. package/dist/lib/node-esm/meta.json +1 -1
  111. package/dist/lib/node-esm/testing/index.mjs +227 -41
  112. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  113. package/dist/lib/node-esm/testing/react.mjs +79 -0
  114. package/dist/lib/node-esm/testing/react.mjs.map +7 -0
  115. package/dist/lib/node-esm/ui/index.mjs +49 -0
  116. package/dist/lib/node-esm/ui/index.mjs.map +7 -0
  117. package/dist/plugin/node-esm/index.mjs +832 -0
  118. package/dist/plugin/node-esm/index.mjs.map +7 -0
  119. package/dist/plugin/node-esm/meta.json +1 -0
  120. package/dist/types/src/cli/cli.d.ts +39 -0
  121. package/dist/types/src/cli/cli.d.ts.map +1 -0
  122. package/dist/types/src/cli/index.d.ts +2 -0
  123. package/dist/types/src/cli/index.d.ts.map +1 -0
  124. package/dist/types/src/common/activation-events.d.ts +27 -0
  125. package/dist/types/src/common/activation-events.d.ts.map +1 -0
  126. package/dist/types/src/common/capabilities.d.ts +110 -197
  127. package/dist/types/src/common/capabilities.d.ts.map +1 -1
  128. package/dist/types/src/common/index.d.ts +4 -8
  129. package/dist/types/src/common/index.d.ts.map +1 -1
  130. package/dist/types/src/common/operations.d.ts +19 -0
  131. package/dist/types/src/common/operations.d.ts.map +1 -0
  132. package/dist/types/src/common/translations.d.ts +8 -8
  133. package/dist/types/src/common/translations.d.ts.map +1 -1
  134. package/dist/types/src/context.d.ts +5 -0
  135. package/dist/types/src/context.d.ts.map +1 -0
  136. package/dist/types/src/core/{events.d.ts → activation-event.d.ts} +11 -11
  137. package/dist/types/src/core/activation-event.d.ts.map +1 -0
  138. package/dist/types/src/core/capability-manager.d.ts +48 -0
  139. package/dist/types/src/core/capability-manager.d.ts.map +1 -0
  140. package/dist/types/src/core/capability-manager.test.d.ts +2 -0
  141. package/dist/types/src/core/capability-manager.test.d.ts.map +1 -0
  142. package/dist/types/src/core/capability.d.ts +156 -0
  143. package/dist/types/src/core/capability.d.ts.map +1 -0
  144. package/dist/types/src/core/index.d.ts +8 -4
  145. package/dist/types/src/core/index.d.ts.map +1 -1
  146. package/dist/types/src/core/plugin-asset-cache.d.ts +71 -0
  147. package/dist/types/src/core/plugin-asset-cache.d.ts.map +1 -0
  148. package/dist/types/src/core/plugin-manager.d.ts +122 -0
  149. package/dist/types/src/core/plugin-manager.d.ts.map +1 -0
  150. package/dist/types/src/core/plugin-manager.test.d.ts +2 -0
  151. package/dist/types/src/core/plugin-manager.test.d.ts.map +1 -0
  152. package/dist/types/src/core/plugin-manifest.d.ts +76 -0
  153. package/dist/types/src/core/plugin-manifest.d.ts.map +1 -0
  154. package/dist/types/src/core/plugin-manifest.test.d.ts +2 -0
  155. package/dist/types/src/core/plugin-manifest.test.d.ts.map +1 -0
  156. package/dist/types/src/core/plugin.d.ts +207 -39
  157. package/dist/types/src/core/plugin.d.ts.map +1 -1
  158. package/dist/types/src/core/url-loader.d.ts +112 -0
  159. package/dist/types/src/core/url-loader.d.ts.map +1 -0
  160. package/dist/types/src/core/url-loader.test.d.ts +2 -0
  161. package/dist/types/src/core/url-loader.test.d.ts.map +1 -0
  162. package/dist/types/src/helpers.d.ts.map +1 -1
  163. package/dist/types/src/index.d.ts +3 -4
  164. package/dist/types/src/index.d.ts.map +1 -1
  165. package/dist/types/src/plugin-operation/OperationPlugin.d.ts +3 -0
  166. package/dist/types/src/plugin-operation/OperationPlugin.d.ts.map +1 -0
  167. package/dist/types/src/plugin-operation/history/capability.d.ts +7 -0
  168. package/dist/types/src/plugin-operation/history/capability.d.ts.map +1 -0
  169. package/dist/types/src/plugin-operation/history/errors.d.ts +32 -0
  170. package/dist/types/src/plugin-operation/history/errors.d.ts.map +1 -0
  171. package/dist/types/src/plugin-operation/history/history-tracker.d.ts +18 -0
  172. package/dist/types/src/plugin-operation/history/history-tracker.d.ts.map +1 -0
  173. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts +2 -0
  174. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts.map +1 -0
  175. package/dist/types/src/plugin-operation/history/index.d.ts +6 -0
  176. package/dist/types/src/plugin-operation/history/index.d.ts.map +1 -0
  177. package/dist/types/src/plugin-operation/history/types.d.ts +13 -0
  178. package/dist/types/src/plugin-operation/history/types.d.ts.map +1 -0
  179. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts +101 -0
  180. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +1 -0
  181. package/dist/types/src/plugin-operation/history/undo-registry.d.ts +23 -0
  182. package/dist/types/src/plugin-operation/history/undo-registry.d.ts.map +1 -0
  183. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts +2 -0
  184. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts.map +1 -0
  185. package/dist/types/src/plugin-operation/index.d.ts +3 -0
  186. package/dist/types/src/plugin-operation/index.d.ts.map +1 -0
  187. package/dist/types/src/plugin-operation/invoker-capability.d.ts +6 -0
  188. package/dist/types/src/plugin-operation/invoker-capability.d.ts.map +1 -0
  189. package/dist/types/src/plugin-operation/meta.d.ts +3 -0
  190. package/dist/types/src/plugin-operation/meta.d.ts.map +1 -0
  191. package/dist/types/src/plugin-operation/testing.d.ts +59 -0
  192. package/dist/types/src/plugin-operation/testing.d.ts.map +1 -0
  193. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts +3 -0
  194. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts.map +1 -0
  195. package/dist/types/src/plugin-runtime/capability.d.ts +6 -0
  196. package/dist/types/src/plugin-runtime/capability.d.ts.map +1 -0
  197. package/dist/types/src/plugin-runtime/index.d.ts +2 -0
  198. package/dist/types/src/plugin-runtime/index.d.ts.map +1 -0
  199. package/dist/types/src/plugin-runtime/meta.d.ts +3 -0
  200. package/dist/types/src/plugin-runtime/meta.d.ts.map +1 -0
  201. package/dist/types/src/testing/harness.d.ts +67 -0
  202. package/dist/types/src/testing/harness.d.ts.map +1 -0
  203. package/dist/types/src/testing/index.d.ts +2 -0
  204. package/dist/types/src/testing/index.d.ts.map +1 -1
  205. package/dist/types/src/testing/react.d.ts +27 -0
  206. package/dist/types/src/testing/react.d.ts.map +1 -0
  207. package/dist/types/src/testing/react.test.d.ts +2 -0
  208. package/dist/types/src/testing/react.test.d.ts.map +1 -0
  209. package/dist/types/src/testing/service.d.ts +8 -0
  210. package/dist/types/src/testing/service.d.ts.map +1 -0
  211. package/dist/types/src/testing/withPluginManager.d.ts +7 -6
  212. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  213. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
  214. package/dist/types/src/ui/components/App/App.d.ts +9 -0
  215. package/dist/types/src/ui/components/App/App.d.ts.map +1 -0
  216. package/dist/types/src/ui/components/App/App.stories.d.ts +19 -0
  217. package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -0
  218. package/dist/types/src/ui/components/App/index.d.ts +2 -0
  219. package/dist/types/src/ui/components/App/index.d.ts.map +1 -0
  220. package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts +64 -0
  221. package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts.map +1 -0
  222. package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts +19 -0
  223. package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts.map +1 -0
  224. package/dist/types/src/ui/components/Placeholder/index.d.ts +2 -0
  225. package/dist/types/src/ui/components/Placeholder/index.d.ts.map +1 -0
  226. package/dist/types/src/{playground/playground.stories.d.ts → ui/components/PluginManager/PluginManagerContext.stories.d.ts} +5 -3
  227. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -0
  228. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts +10 -0
  229. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts.map +1 -0
  230. package/dist/types/src/ui/components/PluginManager/index.d.ts +2 -0
  231. package/dist/types/src/ui/components/PluginManager/index.d.ts.map +1 -0
  232. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +24 -0
  233. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -0
  234. package/dist/types/src/{components/App.stories.d.ts → ui/components/Surface/SurfaceComponent.stories.d.ts} +1 -1
  235. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -0
  236. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts +11 -0
  237. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +1 -0
  238. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts +48 -0
  239. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts.map +1 -0
  240. package/dist/types/src/ui/components/Surface/context.d.ts +5 -0
  241. package/dist/types/src/ui/components/Surface/context.d.ts.map +1 -0
  242. package/dist/types/src/ui/components/Surface/index.d.ts +36 -0
  243. package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -0
  244. package/dist/types/src/ui/components/Surface/types.d.ts +197 -0
  245. package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -0
  246. package/dist/types/src/ui/components/Surface/types.test.d.ts +2 -0
  247. package/dist/types/src/ui/components/Surface/types.test.d.ts.map +1 -0
  248. package/dist/types/src/ui/components/index.d.ts +5 -0
  249. package/dist/types/src/ui/components/index.d.ts.map +1 -0
  250. package/dist/types/src/ui/hooks/index.d.ts +6 -0
  251. package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
  252. package/dist/types/src/ui/hooks/useApp.d.ts +88 -0
  253. package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -0
  254. package/dist/types/src/ui/hooks/useApp.test.d.ts +2 -0
  255. package/dist/types/src/ui/hooks/useApp.test.d.ts.map +1 -0
  256. package/dist/types/src/ui/hooks/useCapabilities.d.ts +31 -0
  257. package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -0
  258. package/dist/types/src/{components → ui/hooks}/useLoading.d.ts +1 -2
  259. package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
  260. package/dist/types/src/ui/hooks/useSettingsState.d.ts +10 -0
  261. package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -0
  262. package/dist/types/src/ui/hooks/useSurface.d.ts +3 -0
  263. package/dist/types/src/ui/hooks/useSurface.d.ts.map +1 -0
  264. package/dist/types/src/ui/index.d.ts +3 -0
  265. package/dist/types/src/ui/index.d.ts.map +1 -0
  266. package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts +34 -0
  267. package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts.map +1 -0
  268. package/dist/types/src/vite-plugin/boot-loader/index.d.ts +52 -0
  269. package/dist/types/src/vite-plugin/boot-loader/index.d.ts.map +1 -0
  270. package/dist/types/src/vite-plugin/composer/index.d.ts +34 -0
  271. package/dist/types/src/vite-plugin/composer/index.d.ts.map +1 -0
  272. package/dist/types/src/vite-plugin/import-map/index.d.ts +28 -0
  273. package/dist/types/src/vite-plugin/import-map/index.d.ts.map +1 -0
  274. package/dist/types/src/vite-plugin/index.d.ts +5 -0
  275. package/dist/types/src/vite-plugin/index.d.ts.map +1 -0
  276. package/dist/types/src/vite-plugin/manifest.d.ts +37 -0
  277. package/dist/types/src/vite-plugin/manifest.d.ts.map +1 -0
  278. package/dist/types/src/vite-plugin/manifest.test.d.ts +2 -0
  279. package/dist/types/src/vite-plugin/manifest.test.d.ts.map +1 -0
  280. package/dist/types/src/vite-plugin/packages.d.ts +13 -0
  281. package/dist/types/src/vite-plugin/packages.d.ts.map +1 -0
  282. package/dist/types/tsconfig.tsbuildinfo +1 -1
  283. package/moon.yml +25 -6
  284. package/package.json +112 -55
  285. package/src/cli/cli.ts +107 -0
  286. package/src/{components → cli}/index.ts +1 -1
  287. package/src/common/activation-events.ts +44 -0
  288. package/src/common/capabilities.ts +169 -210
  289. package/src/common/index.ts +4 -8
  290. package/src/common/operations.ts +35 -0
  291. package/src/common/translations.ts +18 -10
  292. package/src/context.ts +9 -0
  293. package/src/core/{events.ts → activation-event.ts} +10 -7
  294. package/src/core/capability-manager.test.ts +151 -0
  295. package/src/core/capability-manager.ts +192 -0
  296. package/src/core/capability.ts +247 -0
  297. package/src/core/index.ts +8 -4
  298. package/src/core/plugin-asset-cache.ts +60 -0
  299. package/src/core/plugin-manager.test.ts +1354 -0
  300. package/src/core/plugin-manager.ts +1025 -0
  301. package/src/core/plugin-manifest.test.ts +48 -0
  302. package/src/core/plugin-manifest.ts +102 -0
  303. package/src/core/plugin.ts +365 -45
  304. package/src/core/url-loader.test.ts +178 -0
  305. package/src/core/url-loader.ts +337 -0
  306. package/src/index.ts +3 -4
  307. package/src/plugin-operation/OperationPlugin.ts +24 -0
  308. package/src/plugin-operation/history/capability.ts +36 -0
  309. package/src/plugin-operation/history/errors.ts +7 -0
  310. package/src/plugin-operation/history/history-tracker.test.ts +374 -0
  311. package/src/plugin-operation/history/history-tracker.ts +128 -0
  312. package/src/plugin-operation/history/index.ts +9 -0
  313. package/src/plugin-operation/history/types.ts +17 -0
  314. package/src/plugin-operation/history/undo-mapping.ts +135 -0
  315. package/src/plugin-operation/history/undo-registry.test.ts +72 -0
  316. package/src/plugin-operation/history/undo-registry.ts +54 -0
  317. package/src/plugin-operation/index.ts +6 -0
  318. package/src/plugin-operation/invoker-capability.ts +55 -0
  319. package/src/plugin-operation/meta.ts +11 -0
  320. package/src/plugin-operation/testing.ts +155 -0
  321. package/src/plugin-runtime/RuntimePlugin.ts +19 -0
  322. package/src/plugin-runtime/capability.ts +53 -0
  323. package/src/{playground/layout → plugin-runtime}/index.ts +1 -1
  324. package/src/plugin-runtime/meta.ts +11 -0
  325. package/src/testing/harness.ts +229 -0
  326. package/src/testing/index.ts +2 -0
  327. package/src/testing/react.test.tsx +48 -0
  328. package/src/testing/react.tsx +113 -0
  329. package/src/testing/service.ts +52 -0
  330. package/src/testing/withPluginManager.stories.tsx +8 -9
  331. package/src/testing/withPluginManager.tsx +68 -40
  332. package/src/ui/components/App/App.stories.tsx +92 -0
  333. package/src/ui/components/App/App.tsx +81 -0
  334. package/src/{playground/debug → ui/components/App}/index.ts +1 -1
  335. package/src/ui/components/Placeholder/Placeholder.stories.tsx +77 -0
  336. package/src/ui/components/Placeholder/Placeholder.tsx +155 -0
  337. package/src/{playground/logger → ui/components/Placeholder}/index.ts +1 -1
  338. package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +185 -0
  339. package/src/{react → ui/components/PluginManager}/PluginManagerProvider.ts +3 -3
  340. package/src/ui/components/PluginManager/index.ts +5 -0
  341. package/src/ui/components/Surface/SurfaceComponent.stories.tsx +144 -0
  342. package/src/ui/components/Surface/SurfaceComponent.tsx +303 -0
  343. package/src/ui/components/Surface/SurfaceInfo.tsx +107 -0
  344. package/src/ui/components/Surface/SurfaceProfilerContext.tsx +207 -0
  345. package/src/ui/components/Surface/context.ts +12 -0
  346. package/src/ui/components/Surface/index.ts +54 -0
  347. package/src/ui/components/Surface/types.test.ts +126 -0
  348. package/src/ui/components/Surface/types.ts +269 -0
  349. package/src/ui/components/index.ts +8 -0
  350. package/src/ui/hooks/index.ts +9 -0
  351. package/src/ui/hooks/useApp.test.tsx +159 -0
  352. package/src/ui/hooks/useApp.tsx +413 -0
  353. package/src/ui/hooks/useCapabilities.ts +67 -0
  354. package/src/{components → ui/hooks}/useLoading.tsx +16 -10
  355. package/src/ui/hooks/useSettingsState.ts +26 -0
  356. package/src/ui/hooks/useSurface.ts +13 -0
  357. package/src/ui/index.ts +6 -0
  358. package/src/vite-plugin/boot-loader/BootLoader.stories.tsx +263 -0
  359. package/src/vite-plugin/boot-loader/boot-loader.css +294 -0
  360. package/src/vite-plugin/boot-loader/boot-loader.js +274 -0
  361. package/src/vite-plugin/boot-loader/index.ts +112 -0
  362. package/src/vite-plugin/composer/index.ts +277 -0
  363. package/src/vite-plugin/import-map/index.ts +524 -0
  364. package/src/vite-plugin/index.ts +10 -0
  365. package/src/vite-plugin/manifest.test.ts +24 -0
  366. package/src/vite-plugin/manifest.ts +50 -0
  367. package/src/vite-plugin/packages.ts +188 -0
  368. package/tsconfig.json +18 -15
  369. package/tsconfig.node.json +2 -4
  370. package/typedoc.json +2 -4
  371. package/vitest.config.ts +1 -1
  372. package/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
  373. package/.swc/plugins/linux_x86_64_19.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429.wasmer-v7 +0 -0
  374. package/dist/lib/browser/app-graph-builder-XH4OYQLC.mjs +0 -137
  375. package/dist/lib/browser/app-graph-builder-XH4OYQLC.mjs.map +0 -7
  376. package/dist/lib/browser/chunk-6V54SRFL.mjs +0 -1638
  377. package/dist/lib/browser/chunk-6V54SRFL.mjs.map +0 -7
  378. package/dist/lib/browser/chunk-RGKMLI6U.mjs +0 -35
  379. package/dist/lib/browser/chunk-RGKMLI6U.mjs.map +0 -7
  380. package/dist/lib/browser/chunk-ZZVFNUHZ.mjs +0 -467
  381. package/dist/lib/browser/chunk-ZZVFNUHZ.mjs.map +0 -7
  382. package/dist/lib/browser/intent-dispatcher-VFMJVO2M.mjs +0 -11
  383. package/dist/lib/browser/intent-resolver-ICAPD4JL.mjs +0 -39
  384. package/dist/lib/browser/intent-resolver-ICAPD4JL.mjs.map +0 -7
  385. package/dist/lib/browser/store-7ZGMHOGB.mjs +0 -30
  386. package/dist/lib/browser/store-7ZGMHOGB.mjs.map +0 -7
  387. package/dist/lib/browser/worker.mjs +0 -77
  388. package/dist/lib/node-esm/app-graph-builder-C7H22SOL.mjs +0 -138
  389. package/dist/lib/node-esm/app-graph-builder-C7H22SOL.mjs.map +0 -7
  390. package/dist/lib/node-esm/chunk-AXSZKZFD.mjs +0 -468
  391. package/dist/lib/node-esm/chunk-AXSZKZFD.mjs.map +0 -7
  392. package/dist/lib/node-esm/chunk-LKPMRTRR.mjs +0 -37
  393. package/dist/lib/node-esm/chunk-LKPMRTRR.mjs.map +0 -7
  394. package/dist/lib/node-esm/chunk-SOVTUUAY.mjs +0 -1640
  395. package/dist/lib/node-esm/chunk-SOVTUUAY.mjs.map +0 -7
  396. package/dist/lib/node-esm/intent-dispatcher-SAPOKSLZ.mjs +0 -12
  397. package/dist/lib/node-esm/intent-resolver-CRNJ6BMD.mjs +0 -40
  398. package/dist/lib/node-esm/intent-resolver-CRNJ6BMD.mjs.map +0 -7
  399. package/dist/lib/node-esm/store-H4F4RMYD.mjs +0 -31
  400. package/dist/lib/node-esm/store-H4F4RMYD.mjs.map +0 -7
  401. package/dist/lib/node-esm/worker.mjs +0 -78
  402. package/dist/types/src/common/collaboration.d.ts +0 -20
  403. package/dist/types/src/common/collaboration.d.ts.map +0 -1
  404. package/dist/types/src/common/events.d.ts +0 -52
  405. package/dist/types/src/common/events.d.ts.map +0 -1
  406. package/dist/types/src/common/file.d.ts +0 -14
  407. package/dist/types/src/common/file.d.ts.map +0 -1
  408. package/dist/types/src/common/graph.d.ts +0 -21
  409. package/dist/types/src/common/graph.d.ts.map +0 -1
  410. package/dist/types/src/common/layout.d.ts +0 -279
  411. package/dist/types/src/common/layout.d.ts.map +0 -1
  412. package/dist/types/src/common/surface.d.ts +0 -59
  413. package/dist/types/src/common/surface.d.ts.map +0 -1
  414. package/dist/types/src/components/App.d.ts +0 -10
  415. package/dist/types/src/components/App.d.ts.map +0 -1
  416. package/dist/types/src/components/App.stories.d.ts.map +0 -1
  417. package/dist/types/src/components/DefaultFallback.d.ts +0 -8
  418. package/dist/types/src/components/DefaultFallback.d.ts.map +0 -1
  419. package/dist/types/src/components/index.d.ts +0 -2
  420. package/dist/types/src/components/index.d.ts.map +0 -1
  421. package/dist/types/src/components/useApp.d.ts +0 -44
  422. package/dist/types/src/components/useApp.d.ts.map +0 -1
  423. package/dist/types/src/components/useLoading.d.ts.map +0 -1
  424. package/dist/types/src/core/capabilities.d.ts +0 -117
  425. package/dist/types/src/core/capabilities.d.ts.map +0 -1
  426. package/dist/types/src/core/capabilities.test.d.ts +0 -2
  427. package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
  428. package/dist/types/src/core/events.d.ts.map +0 -1
  429. package/dist/types/src/core/manager.d.ts +0 -126
  430. package/dist/types/src/core/manager.d.ts.map +0 -1
  431. package/dist/types/src/core/manager.test.d.ts +0 -2
  432. package/dist/types/src/core/manager.test.d.ts.map +0 -1
  433. package/dist/types/src/playground/debug/Debug.d.ts +0 -6
  434. package/dist/types/src/playground/debug/Debug.d.ts.map +0 -1
  435. package/dist/types/src/playground/debug/index.d.ts +0 -2
  436. package/dist/types/src/playground/debug/index.d.ts.map +0 -1
  437. package/dist/types/src/playground/debug/plugin.d.ts +0 -2
  438. package/dist/types/src/playground/debug/plugin.d.ts.map +0 -1
  439. package/dist/types/src/playground/generator/Main.d.ts +0 -6
  440. package/dist/types/src/playground/generator/Main.d.ts.map +0 -1
  441. package/dist/types/src/playground/generator/Toolbar.d.ts +0 -6
  442. package/dist/types/src/playground/generator/Toolbar.d.ts.map +0 -1
  443. package/dist/types/src/playground/generator/generator.d.ts +0 -7
  444. package/dist/types/src/playground/generator/generator.d.ts.map +0 -1
  445. package/dist/types/src/playground/generator/index.d.ts +0 -3
  446. package/dist/types/src/playground/generator/index.d.ts.map +0 -1
  447. package/dist/types/src/playground/generator/plugin.d.ts +0 -2
  448. package/dist/types/src/playground/generator/plugin.d.ts.map +0 -1
  449. package/dist/types/src/playground/layout/Layout.d.ts +0 -8
  450. package/dist/types/src/playground/layout/Layout.d.ts.map +0 -1
  451. package/dist/types/src/playground/layout/index.d.ts +0 -2
  452. package/dist/types/src/playground/layout/index.d.ts.map +0 -1
  453. package/dist/types/src/playground/layout/plugin.d.ts +0 -2
  454. package/dist/types/src/playground/layout/plugin.d.ts.map +0 -1
  455. package/dist/types/src/playground/logger/Toolbar.d.ts +0 -6
  456. package/dist/types/src/playground/logger/Toolbar.d.ts.map +0 -1
  457. package/dist/types/src/playground/logger/index.d.ts +0 -2
  458. package/dist/types/src/playground/logger/index.d.ts.map +0 -1
  459. package/dist/types/src/playground/logger/plugin.d.ts +0 -2
  460. package/dist/types/src/playground/logger/plugin.d.ts.map +0 -1
  461. package/dist/types/src/playground/logger/schema.d.ts +0 -13
  462. package/dist/types/src/playground/logger/schema.d.ts.map +0 -1
  463. package/dist/types/src/playground/playground.stories.d.ts.map +0 -1
  464. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +0 -2
  465. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +0 -1
  466. package/dist/types/src/plugin-intent/actions.d.ts +0 -36
  467. package/dist/types/src/plugin-intent/actions.d.ts.map +0 -1
  468. package/dist/types/src/plugin-intent/errors.d.ts +0 -16
  469. package/dist/types/src/plugin-intent/errors.d.ts.map +0 -1
  470. package/dist/types/src/plugin-intent/index.d.ts +0 -6
  471. package/dist/types/src/plugin-intent/index.d.ts.map +0 -1
  472. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +0 -139
  473. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +0 -1
  474. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +0 -2
  475. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +0 -1
  476. package/dist/types/src/plugin-intent/intent.d.ts +0 -63
  477. package/dist/types/src/plugin-intent/intent.d.ts.map +0 -1
  478. package/dist/types/src/plugin-intent/meta.d.ts +0 -3
  479. package/dist/types/src/plugin-intent/meta.d.ts.map +0 -1
  480. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +0 -2
  481. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +0 -1
  482. package/dist/types/src/plugin-settings/actions.d.ts +0 -25
  483. package/dist/types/src/plugin-settings/actions.d.ts.map +0 -1
  484. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +0 -4
  485. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +0 -1
  486. package/dist/types/src/plugin-settings/index.d.ts +0 -3
  487. package/dist/types/src/plugin-settings/index.d.ts.map +0 -1
  488. package/dist/types/src/plugin-settings/intent-resolver.d.ts +0 -4
  489. package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +0 -1
  490. package/dist/types/src/plugin-settings/meta.d.ts +0 -3
  491. package/dist/types/src/plugin-settings/meta.d.ts.map +0 -1
  492. package/dist/types/src/plugin-settings/store.d.ts +0 -5
  493. package/dist/types/src/plugin-settings/store.d.ts.map +0 -1
  494. package/dist/types/src/plugin-settings/translations.d.ts +0 -11
  495. package/dist/types/src/plugin-settings/translations.d.ts.map +0 -1
  496. package/dist/types/src/react/ErrorBoundary.d.ts +0 -30
  497. package/dist/types/src/react/ErrorBoundary.d.ts.map +0 -1
  498. package/dist/types/src/react/IntentContext.d.ts +0 -8
  499. package/dist/types/src/react/IntentContext.d.ts.map +0 -1
  500. package/dist/types/src/react/PluginManagerProvider.d.ts +0 -10
  501. package/dist/types/src/react/PluginManagerProvider.d.ts.map +0 -1
  502. package/dist/types/src/react/Surface.d.ts +0 -12
  503. package/dist/types/src/react/Surface.d.ts.map +0 -1
  504. package/dist/types/src/react/Surface.stories.d.ts +0 -17
  505. package/dist/types/src/react/Surface.stories.d.ts.map +0 -1
  506. package/dist/types/src/react/common.d.ts +0 -13
  507. package/dist/types/src/react/common.d.ts.map +0 -1
  508. package/dist/types/src/react/index.d.ts +0 -7
  509. package/dist/types/src/react/index.d.ts.map +0 -1
  510. package/dist/types/src/react/useCapabilities.d.ts +0 -13
  511. package/dist/types/src/react/useCapabilities.d.ts.map +0 -1
  512. package/dist/types/src/react/useIntentResolver.d.ts +0 -3
  513. package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
  514. package/dist/types/src/worker.d.ts +0 -4
  515. package/dist/types/src/worker.d.ts.map +0 -1
  516. package/src/common/collaboration.ts +0 -18
  517. package/src/common/events.ts +0 -79
  518. package/src/common/file.ts +0 -22
  519. package/src/common/graph.ts +0 -30
  520. package/src/common/layout.ts +0 -277
  521. package/src/common/surface.ts +0 -83
  522. package/src/components/App.stories.tsx +0 -33
  523. package/src/components/App.tsx +0 -59
  524. package/src/components/DefaultFallback.tsx +0 -26
  525. package/src/components/useApp.tsx +0 -164
  526. package/src/core/capabilities.test.ts +0 -136
  527. package/src/core/capabilities.ts +0 -259
  528. package/src/core/manager.test.ts +0 -516
  529. package/src/core/manager.ts +0 -597
  530. package/src/playground/debug/Debug.tsx +0 -39
  531. package/src/playground/debug/plugin.ts +0 -16
  532. package/src/playground/generator/Main.tsx +0 -71
  533. package/src/playground/generator/Toolbar.tsx +0 -47
  534. package/src/playground/generator/generator.ts +0 -48
  535. package/src/playground/generator/index.ts +0 -6
  536. package/src/playground/generator/plugin.ts +0 -22
  537. package/src/playground/layout/Layout.tsx +0 -33
  538. package/src/playground/layout/plugin.ts +0 -18
  539. package/src/playground/logger/Toolbar.tsx +0 -30
  540. package/src/playground/logger/plugin.ts +0 -41
  541. package/src/playground/logger/schema.ts +0 -12
  542. package/src/playground/playground.stories.tsx +0 -46
  543. package/src/plugin-intent/IntentPlugin.ts +0 -20
  544. package/src/plugin-intent/actions.ts +0 -31
  545. package/src/plugin-intent/errors.ts +0 -40
  546. package/src/plugin-intent/index.ts +0 -9
  547. package/src/plugin-intent/intent-dispatcher.test.ts +0 -279
  548. package/src/plugin-intent/intent-dispatcher.ts +0 -334
  549. package/src/plugin-intent/intent.ts +0 -154
  550. package/src/plugin-intent/meta.ts +0 -10
  551. package/src/plugin-settings/SettingsPlugin.ts +0 -34
  552. package/src/plugin-settings/actions.ts +0 -25
  553. package/src/plugin-settings/app-graph-builder.ts +0 -159
  554. package/src/plugin-settings/index.ts +0 -6
  555. package/src/plugin-settings/intent-resolver.ts +0 -35
  556. package/src/plugin-settings/meta.ts +0 -10
  557. package/src/plugin-settings/store.ts +0 -33
  558. package/src/plugin-settings/translations.ts +0 -19
  559. package/src/react/ErrorBoundary.tsx +0 -54
  560. package/src/react/IntentContext.tsx +0 -35
  561. package/src/react/Surface.stories.tsx +0 -101
  562. package/src/react/Surface.tsx +0 -86
  563. package/src/react/common.ts +0 -13
  564. package/src/react/index.ts +0 -10
  565. package/src/react/useCapabilities.ts +0 -31
  566. package/src/react/useIntentResolver.ts +0 -22
  567. package/src/worker.ts +0 -11
  568. /package/dist/lib/browser/{intent-dispatcher-VFMJVO2M.mjs.map → chunk-G7SDBRKH.mjs.map} +0 -0
  569. /package/dist/lib/browser/{worker.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  570. /package/dist/lib/{node-esm/intent-dispatcher-SAPOKSLZ.mjs.map → browser/common/activation-events.mjs.map} +0 -0
  571. /package/dist/lib/{node-esm/worker.mjs.map → browser/common/capabilities.mjs.map} +0 -0
@@ -0,0 +1,908 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ eventKey,
4
+ getEvents,
5
+ isAllOf
6
+ } from "./chunk-XOCUANHO.mjs";
7
+ import {
8
+ Service as Service2,
9
+ isLazy,
10
+ resolveLazy
11
+ } from "./chunk-HTBJU5FX.mjs";
12
+ import {
13
+ Service
14
+ } from "./chunk-SDJ4B2LU.mjs";
15
+ import {
16
+ __export
17
+ } from "./chunk-HSLMI22Q.mjs";
18
+
19
+ // src/core/plugin-manager.ts
20
+ var plugin_manager_exports = {};
21
+ __export(plugin_manager_exports, {
22
+ ManagerTypeId: () => ManagerTypeId,
23
+ PluginInitializationError: () => PluginInitializationError,
24
+ isManager: () => isManager,
25
+ make: () => make5
26
+ });
27
+ import { Atom as Atom2, Registry } from "@effect-atom/atom-react";
28
+ import * as Array from "effect/Array";
29
+ import * as Cause from "effect/Cause";
30
+ import * as Deferred2 from "effect/Deferred";
31
+ import * as Duration from "effect/Duration";
32
+ import * as Effect2 from "effect/Effect";
33
+ import * as Fiber from "effect/Fiber";
34
+ import * as Function from "effect/Function";
35
+ import * as HashSet from "effect/HashSet";
36
+ import * as PubSub from "effect/PubSub";
37
+ import * as Ref from "effect/Ref";
38
+ import { runAndForwardErrors } from "@dxos/effect";
39
+ import { Performance } from "@dxos/effect";
40
+ import { BaseError } from "@dxos/errors";
41
+ import { log as log2 } from "@dxos/log";
42
+
43
+ // src/core/capability-manager.ts
44
+ var capability_manager_exports = {};
45
+ __export(capability_manager_exports, {
46
+ make: () => make2
47
+ });
48
+ import { Atom } from "@effect-atom/atom-react";
49
+ import * as Deferred from "effect/Deferred";
50
+ import * as Effect from "effect/Effect";
51
+ import { invariant } from "@dxos/invariant";
52
+ import { log } from "@dxos/log";
53
+ var __dxlog_file = "/__w/dxos/dxos/packages/sdk/app-framework/src/core/capability-manager.ts";
54
+ var CapabilityManagerImpl = class {
55
+ _registry;
56
+ _capabilityEntries = Atom.family(() => {
57
+ return Atom.make([]).pipe(Atom.keepAlive);
58
+ });
59
+ _capabilities = Atom.family((id) => {
60
+ return Atom.make((get2) => {
61
+ const current = get2(this._capabilityEntries(id));
62
+ return current.map((c) => c.implementation);
63
+ }).pipe(Atom.keepAlive);
64
+ });
65
+ _capabilitiesByModule = Atom.family((id) => {
66
+ return Atom.make((get2) => {
67
+ const entries = get2(this._capabilityEntries(id));
68
+ const result = {};
69
+ for (const entry of entries) {
70
+ (result[entry.moduleId] ??= []).push(entry.implementation);
71
+ }
72
+ return result;
73
+ }).pipe(Atom.keepAlive);
74
+ });
75
+ _capability = Atom.family((id) => {
76
+ return Atom.make((get2) => {
77
+ const current = get2(this._capabilities(id));
78
+ invariant(current.length > 0, `No capability found for ${id}`, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 35, S: this, A: ["current.length > 0", "`No capability found for ${id}`"] });
79
+ return current[0];
80
+ });
81
+ });
82
+ constructor({ registry }) {
83
+ this._registry = registry;
84
+ }
85
+ contribute({ module: moduleId, interface: interfaceDef, implementation }) {
86
+ const current = this._registry.get(this._capabilityEntries(interfaceDef.identifier));
87
+ const isDuplicate = current.some((c) => c.moduleId === moduleId && c.implementation === implementation);
88
+ if (isDuplicate) {
89
+ log("capability already contributed, skipping", {
90
+ id: interfaceDef.identifier,
91
+ moduleId
92
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 46, S: this });
93
+ return;
94
+ }
95
+ const entry = {
96
+ moduleId,
97
+ implementation
98
+ };
99
+ this._registry.set(this._capabilityEntries(interfaceDef.identifier), [
100
+ ...current,
101
+ entry
102
+ ]);
103
+ log("capability contributed", {
104
+ id: interfaceDef.identifier,
105
+ moduleId,
106
+ count: current.length
107
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 60, S: this });
108
+ }
109
+ remove(interfaceDef, implementation) {
110
+ const current = this._registry.get(this._capabilityEntries(interfaceDef.identifier));
111
+ if (current.length === 0) {
112
+ return;
113
+ }
114
+ const next = current.filter((c) => c.implementation !== implementation);
115
+ if (next.length !== current.length) {
116
+ this._registry.set(this._capabilityEntries(interfaceDef.identifier), next);
117
+ log("capability removed", {
118
+ id: interfaceDef.identifier,
119
+ count: current.length
120
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 74, S: this });
121
+ } else {
122
+ log.warn("capability not removed", {
123
+ id: interfaceDef.identifier
124
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 79, S: this });
125
+ }
126
+ }
127
+ atom(interfaceDef) {
128
+ return this._capabilities(interfaceDef.identifier);
129
+ }
130
+ getAll(interfaceDef) {
131
+ return this._registry.get(this.atom(interfaceDef));
132
+ }
133
+ get(interfaceDef) {
134
+ const capabilities = this.getAll(interfaceDef);
135
+ invariant(capabilities.length > 0, `No capability found for ${interfaceDef.identifier}`, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 93, S: this, A: ["capabilities.length > 0", "`No capability found for ${interfaceDef.identifier}`"] });
136
+ return capabilities[0];
137
+ }
138
+ waitFor(interfaceDef) {
139
+ return Effect.gen(this, function* () {
140
+ const [capability] = this.getAll(interfaceDef);
141
+ if (capability) {
142
+ return capability;
143
+ }
144
+ const deferred = yield* Deferred.make();
145
+ const cancel = this._registry.subscribe(this.atom(interfaceDef), (capabilities) => {
146
+ if (capabilities.length > 0) {
147
+ Effect.runSync(Deferred.succeed(deferred, capabilities[0]));
148
+ }
149
+ });
150
+ const result = yield* Deferred.await(deferred);
151
+ cancel();
152
+ return result;
153
+ });
154
+ }
155
+ atomByModule(interfaceDef) {
156
+ return this._capabilitiesByModule(interfaceDef.identifier);
157
+ }
158
+ };
159
+ var make2 = (options) => new CapabilityManagerImpl(options);
160
+
161
+ // src/core/plugin-manager.ts
162
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/sdk/app-framework/src/core/plugin-manager.ts";
163
+ var PluginInitializationError = class extends BaseError.extend("PluginInitializationError", "Plugin manager initialization failed") {
164
+ };
165
+ var ManagerTypeId = /* @__PURE__ */ Symbol.for("@dxos/app-framework/Manager");
166
+ var isManager = (value) => {
167
+ return typeof value === "object" && value !== null && ManagerTypeId in value;
168
+ };
169
+ var ManagerImpl = class {
170
+ [ManagerTypeId] = ManagerTypeId;
171
+ activation = Effect2.runSync(PubSub.unbounded());
172
+ capabilities;
173
+ registry;
174
+ _pluginsAtom;
175
+ _coreAtom;
176
+ _enabledAtom;
177
+ _modulesAtom;
178
+ _activeAtom;
179
+ _eventsFiredAtom;
180
+ _pendingResetAtom;
181
+ _pluginLoader;
182
+ _onRemove;
183
+ _capabilities = /* @__PURE__ */ new Map();
184
+ _moduleMemoMap = /* @__PURE__ */ new Map();
185
+ _moduleSemaphores = /* @__PURE__ */ new Map();
186
+ // Coalesces concurrent `_resolveLazyPlugin` calls per plugin id. Without
187
+ // this, two callers entering `enable(id)` before the swap completes would
188
+ // each invoke `mod.default(options)` and produce distinct module objects,
189
+ // defeating `_addModule`'s reference-equality dedupe and racing the
190
+ // `_pluginsAtom` swap.
191
+ _resolvingPlugins = /* @__PURE__ */ new Map();
192
+ _activatingEvents = Effect2.runSync(Ref.make([]));
193
+ _activatingModules = Effect2.runSync(Ref.make([]));
194
+ _inFlightFibers = Effect2.runSync(Ref.make([]));
195
+ _shutdownSemaphore = Effect2.runSync(Effect2.makeSemaphore(1));
196
+ _shuttingDown = Effect2.runSync(Ref.make(false));
197
+ // Tracks the constructor-launched core/enabled `enable()` calls so that
198
+ // `activate` can wait for module registration before dispatching events.
199
+ // Lazy plugins make `enable` asynchronous (a dynamic `import()` happens
200
+ // inside it), so without this synchronization an `activate` triggered
201
+ // immediately after `make` could fire on an empty module set. Failures
202
+ // are wrapped in `PluginInitializationError` so awaiters get a tagged
203
+ // error rather than the wide `Error` produced by the underlying chain.
204
+ _initialization = Effect2.runSync(Deferred2.make());
205
+ constructor({ pluginLoader, plugins = [], core = plugins.map(({ meta }) => meta.id), enabled = [], registry, onRemove }) {
206
+ this.registry = registry ?? Registry.make();
207
+ this.capabilities = make2({
208
+ registry: this.registry
209
+ });
210
+ this._pluginLoader = pluginLoader;
211
+ this._onRemove = onRemove;
212
+ this._pluginsAtom = Atom2.make(plugins).pipe(Atom2.keepAlive);
213
+ this._coreAtom = Atom2.make(core).pipe(Atom2.keepAlive);
214
+ this._enabledAtom = Atom2.make(enabled).pipe(Atom2.keepAlive);
215
+ this._modulesAtom = Atom2.make([]).pipe(Atom2.keepAlive);
216
+ this._activeAtom = Atom2.make([]).pipe(Atom2.keepAlive);
217
+ this._eventsFiredAtom = Atom2.make([]).pipe(Atom2.keepAlive);
218
+ this._pendingResetAtom = Atom2.make([]).pipe(Atom2.keepAlive);
219
+ plugins.forEach((plugin) => this._addPlugin(plugin));
220
+ const initialIds = [
221
+ .../* @__PURE__ */ new Set([
222
+ ...core,
223
+ ...enabled
224
+ ])
225
+ ];
226
+ void Effect2.all(initialIds.map((id) => this.enable(id))).pipe(Effect2.mapError((cause) => new PluginInitializationError({
227
+ cause
228
+ })), Effect2.tap(() => Deferred2.succeed(this._initialization, void 0)), Effect2.tapErrorCause((cause) => Deferred2.failCause(this._initialization, cause))).pipe(runAndForwardErrors);
229
+ }
230
+ get plugins() {
231
+ return this._pluginsAtom;
232
+ }
233
+ get core() {
234
+ return this._coreAtom;
235
+ }
236
+ /**
237
+ * Ids of plugins that are currently enabled.
238
+ */
239
+ get enabled() {
240
+ return this._enabledAtom;
241
+ }
242
+ /**
243
+ * Modules of plugins which are currently enabled.
244
+ */
245
+ get modules() {
246
+ return this._modulesAtom;
247
+ }
248
+ /**
249
+ * Ids of modules which are currently active.
250
+ */
251
+ get active() {
252
+ return this._activeAtom;
253
+ }
254
+ /**
255
+ * Ids of events which have been fired.
256
+ */
257
+ get eventsFired() {
258
+ return this._eventsFiredAtom;
259
+ }
260
+ /**
261
+ * Ids of modules which are pending reset.
262
+ */
263
+ get pendingReset() {
264
+ return this._pendingResetAtom;
265
+ }
266
+ getPlugins() {
267
+ return this._get(this._pluginsAtom);
268
+ }
269
+ getCore() {
270
+ return this._get(this._coreAtom);
271
+ }
272
+ getEnabled() {
273
+ return this._get(this._enabledAtom);
274
+ }
275
+ getModules() {
276
+ return this._get(this._modulesAtom);
277
+ }
278
+ getActive() {
279
+ return this._get(this._activeAtom);
280
+ }
281
+ getEventsFired() {
282
+ return this._get(this._eventsFiredAtom);
283
+ }
284
+ getPendingReset() {
285
+ return this._get(this._pendingResetAtom);
286
+ }
287
+ /**
288
+ * Adds a plugin to the manager via the plugin loader.
289
+ * The plugin is registered but not enabled; call `enable` separately to activate it.
290
+ * @param id The id of the plugin.
291
+ */
292
+ add(id) {
293
+ return Effect2.gen(this, function* () {
294
+ log2("add plugin", {
295
+ id
296
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 165, S: this });
297
+ const plugin = yield* this._pluginLoader(id);
298
+ this._addPlugin(plugin);
299
+ return plugin;
300
+ });
301
+ }
302
+ /**
303
+ * Enables a plugin.
304
+ * @param id The id of the plugin.
305
+ */
306
+ enable(id) {
307
+ return Effect2.gen(this, function* () {
308
+ log2("enable plugin", {
309
+ id
310
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 178, S: this });
311
+ const stub = this._getPlugin(id);
312
+ if (!stub) {
313
+ return false;
314
+ }
315
+ const plugin = yield* this._resolveLazyPlugin(stub);
316
+ this._update(this._enabledAtom, (enabled) => enabled.includes(id) ? enabled : [
317
+ ...enabled,
318
+ id
319
+ ]);
320
+ plugin.modules.forEach((module) => {
321
+ this._addModule(module);
322
+ this._setPendingResetByModule(module);
323
+ });
324
+ log2("pending reset", {
325
+ events: [
326
+ ...this.getPendingReset()
327
+ ]
328
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 194, S: this });
329
+ yield* Effect2.all(this.getPendingReset().map((event) => this.activate(event)), {
330
+ concurrency: "unbounded"
331
+ });
332
+ return true;
333
+ });
334
+ }
335
+ /**
336
+ * Resolves a lazy plugin stub (returned by {@link Plugin.lazy}) to its
337
+ * loaded form and swaps it into `_pluginsAtom`. Returns the input unchanged
338
+ * when the plugin is already resolved, so callers can `yield*` this
339
+ * unconditionally. The lazy stub carries `meta` synchronously but its
340
+ * `modules` list is empty until the loader resolves; the swap ensures
341
+ * subsequent enable/disable operations see the resolved plugin.
342
+ *
343
+ * Concurrent calls for the same id are coalesced via `_resolvingPlugins`:
344
+ * the first caller starts the resolution, every subsequent caller awaits
345
+ * the same `Deferred`. On failure we publish a `lazy:<id>` error message
346
+ * and skip the atom swap so the failure is observable to the activation
347
+ * subscriber and a retry can be attempted.
348
+ */
349
+ _resolveLazyPlugin(plugin) {
350
+ return Effect2.gen(this, function* () {
351
+ if (!isLazy(plugin)) {
352
+ return plugin;
353
+ }
354
+ const id = plugin.meta.id;
355
+ const existing = this._resolvingPlugins.get(id);
356
+ if (existing) {
357
+ return yield* Deferred2.await(existing);
358
+ }
359
+ const deferred = yield* Deferred2.make();
360
+ this._resolvingPlugins.set(id, deferred);
361
+ return yield* Effect2.gen(this, function* () {
362
+ log2("resolving lazy plugin", {
363
+ id
364
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 231, S: this });
365
+ yield* PubSub.publish(this.activation, {
366
+ event: "",
367
+ state: "activating",
368
+ module: `lazy:${id}`
369
+ });
370
+ const resolvedPlugin = yield* resolveLazy(plugin);
371
+ this._update(this._pluginsAtom, (plugins) => plugins.map((p) => p.meta.id === id ? resolvedPlugin : p));
372
+ yield* PubSub.publish(this.activation, {
373
+ event: "",
374
+ state: "activated",
375
+ module: `lazy:${id}`
376
+ });
377
+ return resolvedPlugin;
378
+ }).pipe(Effect2.tapError((error) => PubSub.publish(this.activation, {
379
+ event: "",
380
+ state: "error",
381
+ module: `lazy:${id}`,
382
+ error
383
+ })), Effect2.tap((value) => Deferred2.succeed(deferred, value)), Effect2.tapErrorCause((cause) => Deferred2.failCause(deferred, cause)), Effect2.ensuring(Effect2.sync(() => this._resolvingPlugins.delete(id))));
384
+ });
385
+ }
386
+ /**
387
+ * Removes a plugin from the manager.
388
+ * @param id The id of the plugin.
389
+ */
390
+ remove(id) {
391
+ return Effect2.gen(this, function* () {
392
+ log2("remove plugin", {
393
+ id
394
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 260, S: this });
395
+ const disabled = yield* this.disable(id);
396
+ if (!disabled) {
397
+ return false;
398
+ }
399
+ this._removePlugin(id);
400
+ if (this._onRemove) {
401
+ this._runForkedFiber(this._onRemove(id).pipe(Effect2.tapError((error) => Effect2.sync(() => log2.warn("plugin remove hook failed", {
402
+ id,
403
+ error
404
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 269, S: this }))), Effect2.ignore));
405
+ }
406
+ return true;
407
+ });
408
+ }
409
+ /**
410
+ * Disables a plugin.
411
+ * @param id The id of the plugin.
412
+ */
413
+ disable(id) {
414
+ return Effect2.gen(this, function* () {
415
+ log2("disable plugin", {
416
+ id
417
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 282, S: this });
418
+ if (this._get(this._coreAtom).includes(id)) {
419
+ return false;
420
+ }
421
+ const plugin = this._getPlugin(id);
422
+ if (!plugin) {
423
+ return false;
424
+ }
425
+ const enabledIndex = this._get(this._enabledAtom).findIndex((enabled) => enabled === id);
426
+ if (enabledIndex !== -1) {
427
+ this._update(this._enabledAtom, (enabled) => enabled.filter((item) => item !== id));
428
+ yield* this.deactivate(id);
429
+ plugin.modules.forEach((module) => {
430
+ this._removeModule(module.id);
431
+ });
432
+ }
433
+ return true;
434
+ });
435
+ }
436
+ /**
437
+ * Activates plugins based on the activation event.
438
+ * @param event The activation event.
439
+ * @returns Whether the activation was successful.
440
+ */
441
+ activate(event, params) {
442
+ const key = typeof event === "string" ? event : eventKey(event);
443
+ return Effect2.gen(this, function* () {
444
+ if (yield* this._isShuttingDown()) {
445
+ log2("skipping activation during shutdown", {
446
+ key,
447
+ ...params
448
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 311, S: this });
449
+ return false;
450
+ }
451
+ yield* Deferred2.await(this._initialization);
452
+ return yield* Effect2.withFiberRuntime((fiber) => this._activateEvent(key, params, fiber).pipe(together(Effect2.sleep(Duration.seconds(15)).pipe(Effect2.andThen(Effect2.sync(() => log2.warn("event activation is taking a long time", {
453
+ event: key
454
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 322, S: this }))))), Performance.addTrackEntry({
455
+ name: typeof event === "string" ? event : eventKey(event),
456
+ devtools: {
457
+ dataType: "track-entry",
458
+ track: "Event Activation",
459
+ trackGroup: "Composer",
460
+ color: "primary"
461
+ }
462
+ })));
463
+ });
464
+ }
465
+ /**
466
+ * Deactivates all of the modules for a plugin.
467
+ * @param id The id of the plugin.
468
+ * @returns Whether the deactivation was successful.
469
+ */
470
+ deactivate(id) {
471
+ return Effect2.gen(this, function* () {
472
+ const plugin = this._getPlugin(id);
473
+ if (!plugin) {
474
+ return false;
475
+ }
476
+ const modules = plugin.modules;
477
+ const results = yield* Effect2.all(modules.map((module) => this._deactivateModule(module)), {
478
+ concurrency: "unbounded"
479
+ });
480
+ return results.every((result) => result);
481
+ });
482
+ }
483
+ /**
484
+ * Re-activates the modules that were activated by the event.
485
+ * @param event The activation event.
486
+ * @returns Whether the reset was successful.
487
+ */
488
+ reset(event) {
489
+ return Effect2.gen(this, function* () {
490
+ const key = typeof event === "string" ? event : eventKey(event);
491
+ log2("reset", {
492
+ key
493
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 359, S: this });
494
+ const modules = this._getActiveModulesByEvent(key);
495
+ const results = yield* Effect2.all(modules.map((module) => this._deactivateModule(module)), {
496
+ concurrency: "unbounded"
497
+ });
498
+ if (results.every((result) => result)) {
499
+ return yield* this.activate(key);
500
+ } else {
501
+ return false;
502
+ }
503
+ });
504
+ }
505
+ shutdown() {
506
+ return this._shutdownSemaphore.withPermits(1)(Effect2.gen(this, function* () {
507
+ yield* Ref.set(this._shuttingDown, true);
508
+ log2("shutdown", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 376, S: this });
509
+ yield* this._interruptInFlightActivations();
510
+ const activeIds = [
511
+ ...this._get(this._activeAtom)
512
+ ].reverse();
513
+ const allModules = this._get(this._modulesAtom);
514
+ const modulesToDeactivate = activeIds.map((id) => allModules.find((module) => module.id === id)).filter((module) => module != null);
515
+ for (const module of modulesToDeactivate) {
516
+ yield* this._deactivateModule(module);
517
+ }
518
+ this._set(this._eventsFiredAtom, []);
519
+ this._set(this._pendingResetAtom, []);
520
+ this._moduleMemoMap.clear();
521
+ yield* Ref.set(this._activatingEvents, []);
522
+ yield* Ref.set(this._activatingModules, []);
523
+ log2("shutdown complete", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 391, S: this });
524
+ return true;
525
+ }).pipe(Effect2.ensuring(Ref.set(this._shuttingDown, false))));
526
+ }
527
+ //
528
+ // State helpers
529
+ //
530
+ _get(atom) {
531
+ return this.registry.get(atom);
532
+ }
533
+ _set(atom, value) {
534
+ this.registry.set(atom, value);
535
+ }
536
+ _update(atom, updater) {
537
+ this._set(atom, updater(this._get(atom)));
538
+ }
539
+ _isShuttingDown() {
540
+ return Ref.get(this._shuttingDown);
541
+ }
542
+ _getPlugin(id) {
543
+ return this._get(this._pluginsAtom).find((plugin) => plugin.meta.id === id);
544
+ }
545
+ _getActiveModules() {
546
+ const active = this._get(this._activeAtom);
547
+ return this._get(this._modulesAtom).filter((module) => active.includes(module.id));
548
+ }
549
+ _getInactiveModules() {
550
+ const active = this._get(this._activeAtom);
551
+ return this._get(this._modulesAtom).filter((module) => !active.includes(module.id));
552
+ }
553
+ _getActiveModulesByEvent(key) {
554
+ return this._getActiveModules().filter((module) => getEvents(module.activatesOn).map(eventKey).includes(key));
555
+ }
556
+ _getInactiveModulesByEvent(key) {
557
+ return this._getInactiveModules().filter((module) => getEvents(module.activatesOn).map(eventKey).includes(key));
558
+ }
559
+ _setPendingResetByModule(module) {
560
+ const activationEvents = getEvents(module.activatesOn).map(eventKey).filter((key) => this._get(this._eventsFiredAtom).includes(key));
561
+ const pendingReset = Array.fromIterable(new Set(activationEvents)).filter((event) => {
562
+ const pending = this._get(this._pendingResetAtom);
563
+ return !pending.includes(event);
564
+ });
565
+ if (pendingReset.length > 0) {
566
+ log2("pending reset", {
567
+ events: pendingReset
568
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 434, S: this });
569
+ this._update(this._pendingResetAtom, (current) => [
570
+ ...current,
571
+ ...pendingReset
572
+ ]);
573
+ }
574
+ }
575
+ _clearPendingReset(key) {
576
+ const pendingIndex = this._get(this._pendingResetAtom).findIndex((event) => event === key);
577
+ if (pendingIndex !== -1) {
578
+ this._update(this._pendingResetAtom, (pending) => pending.filter((event) => event !== key));
579
+ }
580
+ }
581
+ //
582
+ // Fiber helpers
583
+ //
584
+ _interruptInFlightActivations() {
585
+ return Effect2.gen(this, function* () {
586
+ const inFlightFibers = yield* Ref.get(this._inFlightFibers);
587
+ yield* Effect2.forEach(inFlightFibers, (fiber) => Fiber.interrupt(fiber), {
588
+ concurrency: "unbounded"
589
+ });
590
+ });
591
+ }
592
+ _trackFiber(ref, fiber) {
593
+ return Ref.update(ref, (fibers) => [
594
+ ...fibers,
595
+ fiber
596
+ ]);
597
+ }
598
+ _untrackFiber(ref, fiber) {
599
+ return Ref.update(ref, (fibers) => fibers.filter((trackedFiber) => trackedFiber !== fiber));
600
+ }
601
+ /**
602
+ * Spawns an effect on the default runtime and registers the resulting fiber in
603
+ * `_inFlightFibers` so {@link shutdown} can interrupt it. Used from sync entry
604
+ * points like {@link remove} where there is no enclosing Effect to fork from;
605
+ * inside an Effect chain prefer the existing track/await/untrack pattern.
606
+ */
607
+ _runForkedFiber(effect) {
608
+ const fiber = Effect2.runFork(effect);
609
+ Effect2.runSync(this._trackFiber(this._inFlightFibers, fiber));
610
+ Effect2.runFork(Fiber.await(fiber).pipe(Effect2.andThen(() => this._untrackFiber(this._inFlightFibers, fiber))));
611
+ }
612
+ //
613
+ // Registration helpers
614
+ //
615
+ _addPlugin(plugin) {
616
+ log2("add plugin", {
617
+ id: plugin.meta.id
618
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 483, S: this });
619
+ this._update(this._pluginsAtom, (plugins) => plugins.includes(plugin) ? plugins : [
620
+ ...plugins,
621
+ plugin
622
+ ]);
623
+ }
624
+ _removePlugin(id) {
625
+ log2("remove plugin", {
626
+ id
627
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 493, S: this });
628
+ this._update(this._pluginsAtom, (plugins) => plugins.filter((plugin) => plugin.meta.id !== id));
629
+ }
630
+ _addModule(module) {
631
+ log2("add module", {
632
+ id: module.id
633
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 499, S: this });
634
+ this._update(this._modulesAtom, (modules) => modules.includes(module) ? modules : [
635
+ ...modules,
636
+ module
637
+ ]);
638
+ }
639
+ _removeModule(id) {
640
+ log2("remove module", {
641
+ id
642
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 509, S: this });
643
+ this._update(this._modulesAtom, (modules) => modules.filter((module) => module.id !== id));
644
+ }
645
+ //
646
+ // Activation helpers
647
+ //
648
+ _activateEvent(key, params, fiber) {
649
+ return Effect2.gen(this, function* () {
650
+ yield* this._trackFiber(this._inFlightFibers, fiber);
651
+ log2("activating", {
652
+ key,
653
+ ...params
654
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 520, S: this });
655
+ yield* Ref.update(this._activatingEvents, (activating) => Array.append(activating, key));
656
+ this._clearPendingReset(key);
657
+ const activatingEvents = yield* this._activatingEvents;
658
+ const activatingModules = yield* this._activatingModules;
659
+ const modules = this._getModulesForActivation(key, activatingEvents, activatingModules);
660
+ if (modules.length === 0) {
661
+ log2("no modules to activate", {
662
+ key
663
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 530, S: this });
664
+ if (!this._get(this._eventsFiredAtom).includes(key)) {
665
+ this._update(this._eventsFiredAtom, (events) => [
666
+ ...events,
667
+ key
668
+ ]);
669
+ }
670
+ return false;
671
+ }
672
+ return yield* this._activateModulesForEvent(key, modules, activatingEvents);
673
+ }).pipe(Effect2.ensuring(Effect2.all([
674
+ this._untrackFiber(this._inFlightFibers, fiber),
675
+ Ref.update(this._activatingEvents, (activating) => Array.filter(activating, (event) => event !== key))
676
+ ])));
677
+ }
678
+ _activateModulesForEvent(key, modules, activatingEvents) {
679
+ const activatingModuleIds = modules.map((module) => module.id);
680
+ return Effect2.gen(this, function* () {
681
+ yield* Ref.update(this._activatingModules, (activating) => Array.appendAll(activating, activatingModuleIds));
682
+ log2("activating modules", {
683
+ key,
684
+ modules: activatingModuleIds
685
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 551, S: this });
686
+ performance.mark(`event:${key}:start`);
687
+ yield* PubSub.publish(this.activation, {
688
+ event: key,
689
+ state: "activating"
690
+ });
691
+ yield* this._activateRelatedEvents(key, this._getBeforeEvents(modules, activatingEvents), "before");
692
+ const capabilities = yield* this._loadCapabilitiesForModules(key, modules);
693
+ yield* this._contributeCapabilitiesForModules(modules, capabilities);
694
+ yield* this._activateRelatedEvents(key, this._getAfterEvents(modules, activatingEvents), "after");
695
+ if (!this._get(this._eventsFiredAtom).includes(key)) {
696
+ this._update(this._eventsFiredAtom, (events) => [
697
+ ...events,
698
+ key
699
+ ]);
700
+ }
701
+ performance.mark(`event:${key}:end`);
702
+ performance.measure(`event:${key}`, `event:${key}:start`, `event:${key}:end`);
703
+ yield* PubSub.publish(this.activation, {
704
+ event: key,
705
+ state: "activated"
706
+ });
707
+ log2("activated", {
708
+ key
709
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 576, S: this });
710
+ return true;
711
+ }).pipe(Effect2.ensuring(Ref.update(this._activatingModules, (activating) => Array.filter(activating, (module) => !activatingModuleIds.includes(module)))));
712
+ }
713
+ _getModulesForActivation(key, activatingEvents, activatingModules) {
714
+ return this._getInactiveModulesByEvent(key).filter((module) => {
715
+ const allOf = isAllOf(module.activatesOn);
716
+ if (!allOf) {
717
+ return true;
718
+ }
719
+ const events = getEvents(module.activatesOn).filter((event) => eventKey(event) !== key);
720
+ return events.every((event) => this._get(this._eventsFiredAtom).includes(eventKey(event)) || activatingEvents.includes(eventKey(event))) && !activatingModules.includes(module.id);
721
+ });
722
+ }
723
+ _getBeforeEvents(modules, activatingEvents) {
724
+ return Function.pipe(modules, Array.flatMap((module) => module.firesBeforeActivation ?? []), HashSet.fromIterable, HashSet.toValues, Array.filter((event) => !activatingEvents.includes(eventKey(event))));
725
+ }
726
+ _getAfterEvents(modules, activatingEvents) {
727
+ return Function.pipe(modules, Array.flatMap((module) => module.firesAfterActivation ?? []), HashSet.fromIterable, HashSet.toValues, Array.filter((event) => !activatingEvents.includes(eventKey(event))));
728
+ }
729
+ _activateRelatedEvents(key, events, phase) {
730
+ const logLabel = phase === "before" ? "firesBeforeActivation" : "firesAfterActivation";
731
+ const eventKey2 = phase === "before" ? "beforeEvents" : "afterEvents";
732
+ return Function.pipe(events, Array.map((event) => this.activate(event, phase === "before" ? {
733
+ before: key
734
+ } : {
735
+ after: key
736
+ })), Effect2.allWith({
737
+ concurrency: "unbounded"
738
+ }), together(Effect2.sleep(Duration.seconds(10)).pipe(Effect2.andThen(Effect2.sync(() => log2.warn(`${logLabel} is taking a long time`, {
739
+ event: key,
740
+ [eventKey2]: events.map(eventKey)
741
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 609, S: this }))))), Effect2.asVoid);
742
+ }
743
+ //
744
+ // Module lifecycle helpers
745
+ //
746
+ _loadCapabilitiesForModules(key, modules) {
747
+ return Function.pipe(modules, Array.map((mod) => this._loadModule(mod, key)), Effect2.allWith({
748
+ concurrency: "unbounded"
749
+ }), Effect2.catchAll((error) => {
750
+ return Effect2.gen(this, function* () {
751
+ yield* PubSub.publish(this.activation, {
752
+ event: key,
753
+ state: "error",
754
+ error
755
+ });
756
+ return yield* Effect2.fail(error);
757
+ });
758
+ }));
759
+ }
760
+ _contributeCapabilitiesForModules(modules, capabilities) {
761
+ return Function.pipe(
762
+ modules,
763
+ Array.zip(capabilities),
764
+ Array.map(([module, capabilitySet]) => this._contributeCapabilities(module, capabilitySet)),
765
+ Effect2.all,
766
+ Effect2.asVoid
767
+ );
768
+ }
769
+ _getModuleSemaphore(moduleId) {
770
+ let semaphore = this._moduleSemaphores.get(moduleId);
771
+ if (!semaphore) {
772
+ semaphore = Effect2.runSync(Effect2.makeSemaphore(1));
773
+ this._moduleSemaphores.set(moduleId, semaphore);
774
+ }
775
+ return semaphore;
776
+ }
777
+ // `parentEvent` is the activation event that first triggered this module
778
+ // load — included in `activating`/`activated` PubSub messages so subscribers
779
+ // (e.g. the boot loader's status listener) can associate a module with its
780
+ // triggering event in the trace. The same module may be referenced by
781
+ // multiple events, but module loads are memoized via `_moduleMemoMap`, so
782
+ // only the first event to need it will appear here; later events await the
783
+ // cached deferred without re-publishing.
784
+ _loadModule = (module, parentEvent) => Effect2.gen(this, function* () {
785
+ const semaphore = this._getModuleSemaphore(module.id);
786
+ const deferredToAwait = yield* Effect2.gen(this, function* () {
787
+ const existing = this._moduleMemoMap.get(module.id);
788
+ if (existing) {
789
+ return existing;
790
+ }
791
+ const deferred = yield* Deferred2.make();
792
+ this._moduleMemoMap.set(module.id, deferred);
793
+ const loadEffect = Effect2.gen(this, function* () {
794
+ log2("loading module", {
795
+ module: module.id,
796
+ parentEvent
797
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 667, S: this });
798
+ performance.mark(`module:${module.id}:start`);
799
+ yield* PubSub.publish(this.activation, {
800
+ event: parentEvent,
801
+ state: "activating",
802
+ module: module.id
803
+ });
804
+ const [duration, capabilities] = yield* module.activate().pipe(Effect2.provideService(Service, this.capabilities), Effect2.provideService(Service2, this), Effect2.timed);
805
+ const normalized = capabilities == null ? [] : Array.isArray(capabilities) ? capabilities : [
806
+ capabilities
807
+ ];
808
+ const elapsed = Duration.toMillis(duration);
809
+ performance.mark(`module:${module.id}:end`);
810
+ performance.measure(`module:${module.id}`, `module:${module.id}:start`, `module:${module.id}:end`);
811
+ yield* PubSub.publish(this.activation, {
812
+ event: parentEvent,
813
+ state: "activated",
814
+ module: module.id
815
+ });
816
+ log2("loaded module", {
817
+ module: module.id,
818
+ parentEvent,
819
+ elapsed,
820
+ failed: false
821
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 689, S: this });
822
+ return normalized;
823
+ }).pipe(Effect2.withSpan("PluginManager._loadModule"), together(Effect2.sleep(Duration.seconds(10)).pipe(Effect2.andThen(Effect2.sync(() => log2.warn(`module is taking a long time to activate`, {
824
+ module: module.id
825
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 696, S: this }))))), Performance.addTrackEntry({
826
+ name: module.id,
827
+ devtools: {
828
+ dataType: "track-entry",
829
+ track: "Module Activation",
830
+ trackGroup: "Composer",
831
+ color: "primary"
832
+ }
833
+ }));
834
+ const fiber = yield* Effect2.forkDaemon(loadEffect.pipe(Effect2.tap((result) => Deferred2.succeed(deferred, result)), Effect2.catchAllCause((cause) => {
835
+ const error = Cause.squash(cause);
836
+ log2.error("module failed to activate", {
837
+ module: module.id,
838
+ error: error instanceof Error ? error.message : String(error),
839
+ stack: error instanceof Error ? error.stack : void 0,
840
+ isDefect: !Cause.isFailure(cause)
841
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 710, S: this });
842
+ return Deferred2.fail(deferred, error instanceof Error ? error : new Error(String(error)));
843
+ })));
844
+ yield* this._trackFiber(this._inFlightFibers, fiber);
845
+ yield* Effect2.forkDaemon(Fiber.await(fiber).pipe(Effect2.andThen(() => this._untrackFiber(this._inFlightFibers, fiber))));
846
+ return deferred;
847
+ }).pipe(semaphore.withPermits(1));
848
+ return yield* Deferred2.await(deferredToAwait);
849
+ });
850
+ _contributeCapabilities(module, capabilities) {
851
+ return Effect2.gen(this, function* () {
852
+ capabilities.forEach((capability) => {
853
+ this.capabilities.contribute({
854
+ module: module.id,
855
+ ...capability
856
+ });
857
+ });
858
+ this._update(this._activeAtom, (active) => [
859
+ ...active,
860
+ module.id
861
+ ]);
862
+ this._capabilities.set(module.id, capabilities);
863
+ });
864
+ }
865
+ _deactivateModule(module) {
866
+ return Effect2.gen(this, function* () {
867
+ const id = module.id;
868
+ log2("deactivating", {
869
+ id
870
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 743, S: this });
871
+ this._moduleMemoMap.delete(id);
872
+ const capabilities = this._capabilities.get(id);
873
+ if (capabilities) {
874
+ for (const capability of capabilities) {
875
+ this.capabilities.remove(capability.interface, capability.implementation);
876
+ const program = capability.deactivate?.() ?? Effect2.succeed(void 0);
877
+ yield* program;
878
+ }
879
+ this._capabilities.delete(id);
880
+ }
881
+ const activeIndex = this._get(this._activeAtom).findIndex((event) => event === id);
882
+ if (activeIndex !== -1) {
883
+ this._update(this._activeAtom, (active) => active.filter((event) => event !== id));
884
+ }
885
+ log2("deactivated", {
886
+ id
887
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 760, S: this });
888
+ return true;
889
+ });
890
+ }
891
+ };
892
+ var make5 = (options) => new ManagerImpl(options);
893
+ var together = (togetherEffect) => (effect) => Effect2.gen(function* () {
894
+ const togetherFiber = yield* Effect2.fork(togetherEffect);
895
+ const result = yield* effect;
896
+ yield* Fiber.interrupt(togetherFiber);
897
+ return result;
898
+ });
899
+
900
+ export {
901
+ capability_manager_exports,
902
+ PluginInitializationError,
903
+ ManagerTypeId,
904
+ isManager,
905
+ make5 as make,
906
+ plugin_manager_exports
907
+ };
908
+ //# sourceMappingURL=chunk-Q7XBFII4.mjs.map