@dxos/app-framework 0.8.4-main.ae835ea → 0.8.4-main.bc2380dfbc

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 (585) hide show
  1. package/.storybook/main.mts +2 -4
  2. package/.storybook/preview.mts +2 -2
  3. package/LICENSE +102 -5
  4. package/README.md +1 -1
  5. package/dist/lib/browser/capability-HRFPP52W.mjs +35 -0
  6. package/dist/lib/browser/capability-HRFPP52W.mjs.map +7 -0
  7. package/dist/lib/browser/capability-VQ236TY5.mjs +38 -0
  8. package/dist/lib/browser/capability-VQ236TY5.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-23D4SJUE.mjs +42 -0
  10. package/dist/lib/browser/chunk-23D4SJUE.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-3JWJXGLK.mjs +79 -0
  12. package/dist/lib/browser/chunk-3JWJXGLK.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-66IXTIVK.mjs +48 -0
  16. package/dist/lib/browser/chunk-66IXTIVK.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-6GZYCP73.mjs +422 -0
  18. package/dist/lib/browser/chunk-6GZYCP73.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-7VZJR2OA.mjs +581 -0
  20. package/dist/lib/browser/chunk-7VZJR2OA.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-FJ4765WW.mjs +8 -0
  22. package/dist/lib/browser/chunk-FJ4765WW.mjs.map +7 -0
  23. package/dist/lib/browser/chunk-FO3IYSLV.mjs +68 -0
  24. package/dist/lib/browser/chunk-FO3IYSLV.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-G6Q2M2M5.mjs +218 -0
  26. package/dist/lib/browser/chunk-G6Q2M2M5.mjs.map +7 -0
  27. package/dist/lib/browser/chunk-J43JDWAV.mjs +1445 -0
  28. package/dist/lib/browser/chunk-J43JDWAV.mjs.map +7 -0
  29. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  30. package/dist/lib/browser/chunk-WBHCSOBW.mjs +80 -0
  31. package/dist/lib/browser/chunk-WBHCSOBW.mjs.map +7 -0
  32. package/dist/lib/browser/chunk-XLYULXAO.mjs +469 -0
  33. package/dist/lib/browser/chunk-XLYULXAO.mjs.map +7 -0
  34. package/dist/lib/browser/chunk-ZGJAZSNE.mjs +142 -0
  35. package/dist/lib/browser/chunk-ZGJAZSNE.mjs.map +7 -0
  36. package/dist/lib/browser/cli/index.mjs +76 -0
  37. package/dist/lib/browser/cli/index.mjs.map +7 -0
  38. package/dist/lib/browser/common/activation-events.mjs +24 -0
  39. package/dist/lib/browser/common/capabilities.mjs +46 -0
  40. package/dist/lib/browser/core/activation-event.mjs +20 -0
  41. package/dist/lib/browser/core/capability.mjs +30 -0
  42. package/dist/lib/browser/core/capability.mjs.map +7 -0
  43. package/dist/lib/browser/core/plugin-manager.mjs +19 -0
  44. package/dist/lib/browser/core/plugin-manager.mjs.map +7 -0
  45. package/dist/lib/browser/core/plugin.mjs +39 -0
  46. package/dist/lib/browser/core/plugin.mjs.map +7 -0
  47. package/dist/lib/browser/core/url-loader.mjs +24 -0
  48. package/dist/lib/browser/core/url-loader.mjs.map +7 -0
  49. package/dist/lib/browser/index.mjs +108 -148
  50. package/dist/lib/browser/index.mjs.map +4 -4
  51. package/dist/lib/browser/invoker-capability-CEL2L6GX.mjs +44 -0
  52. package/dist/lib/browser/invoker-capability-CEL2L6GX.mjs.map +7 -0
  53. package/dist/lib/browser/meta.json +1 -1
  54. package/dist/lib/browser/testing/index.mjs +229 -40
  55. package/dist/lib/browser/testing/index.mjs.map +4 -4
  56. package/dist/lib/browser/testing/react.mjs +78 -0
  57. package/dist/lib/browser/testing/react.mjs.map +7 -0
  58. package/dist/lib/browser/ui/index.mjs +48 -0
  59. package/dist/lib/browser/ui/index.mjs.map +7 -0
  60. package/dist/lib/node-esm/capability-GS3XJH74.mjs +39 -0
  61. package/dist/lib/node-esm/capability-GS3XJH74.mjs.map +7 -0
  62. package/dist/lib/node-esm/capability-I5P7ACFL.mjs +36 -0
  63. package/dist/lib/node-esm/capability-I5P7ACFL.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-37Z53PXZ.mjs +10 -0
  65. package/dist/lib/node-esm/chunk-37Z53PXZ.mjs.map +7 -0
  66. package/dist/lib/node-esm/chunk-4RJL37GN.mjs +423 -0
  67. package/dist/lib/node-esm/chunk-4RJL37GN.mjs.map +7 -0
  68. package/dist/lib/node-esm/chunk-6XW6LET6.mjs +35 -0
  69. package/dist/lib/node-esm/chunk-6XW6LET6.mjs.map +7 -0
  70. package/dist/lib/node-esm/chunk-D347W3KO.mjs +143 -0
  71. package/dist/lib/node-esm/chunk-D347W3KO.mjs.map +7 -0
  72. package/dist/lib/node-esm/chunk-DW45NFLW.mjs +1446 -0
  73. package/dist/lib/node-esm/chunk-DW45NFLW.mjs.map +7 -0
  74. package/dist/lib/node-esm/chunk-EI4LYXFY.mjs +470 -0
  75. package/dist/lib/node-esm/chunk-EI4LYXFY.mjs.map +7 -0
  76. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  77. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  78. package/dist/lib/node-esm/chunk-KIFOQXD4.mjs +219 -0
  79. package/dist/lib/node-esm/chunk-KIFOQXD4.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-V24UWT36.mjs +582 -0
  85. package/dist/lib/node-esm/chunk-V24UWT36.mjs.map +7 -0
  86. package/dist/lib/node-esm/chunk-WFSRZKBP.mjs +81 -0
  87. package/dist/lib/node-esm/chunk-WFSRZKBP.mjs.map +7 -0
  88. package/dist/lib/node-esm/chunk-WK7OIQKI.mjs +70 -0
  89. package/dist/lib/node-esm/chunk-WK7OIQKI.mjs.map +7 -0
  90. package/dist/lib/node-esm/chunk-XOCUANHO.mjs +49 -0
  91. package/dist/lib/node-esm/chunk-XOCUANHO.mjs.map +7 -0
  92. package/dist/lib/node-esm/cli/index.mjs +77 -0
  93. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  94. package/dist/lib/node-esm/common/activation-events.mjs +25 -0
  95. package/dist/lib/node-esm/common/activation-events.mjs.map +7 -0
  96. package/dist/lib/node-esm/common/capabilities.mjs +47 -0
  97. package/dist/lib/node-esm/common/capabilities.mjs.map +7 -0
  98. package/dist/lib/node-esm/core/activation-event.mjs +21 -0
  99. package/dist/lib/node-esm/core/activation-event.mjs.map +7 -0
  100. package/dist/lib/node-esm/core/capability.mjs +31 -0
  101. package/dist/lib/node-esm/core/capability.mjs.map +7 -0
  102. package/dist/lib/node-esm/core/plugin-manager.mjs +20 -0
  103. package/dist/lib/node-esm/core/plugin-manager.mjs.map +7 -0
  104. package/dist/lib/node-esm/core/plugin.mjs +40 -0
  105. package/dist/lib/node-esm/core/plugin.mjs.map +7 -0
  106. package/dist/lib/node-esm/core/url-loader.mjs +25 -0
  107. package/dist/lib/node-esm/core/url-loader.mjs.map +7 -0
  108. package/dist/lib/node-esm/index.mjs +108 -148
  109. package/dist/lib/node-esm/index.mjs.map +4 -4
  110. package/dist/lib/node-esm/invoker-capability-QKUKN2MF.mjs +45 -0
  111. package/dist/lib/node-esm/invoker-capability-QKUKN2MF.mjs.map +7 -0
  112. package/dist/lib/node-esm/meta.json +1 -1
  113. package/dist/lib/node-esm/testing/index.mjs +229 -40
  114. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  115. package/dist/lib/node-esm/testing/react.mjs +79 -0
  116. package/dist/lib/node-esm/testing/react.mjs.map +7 -0
  117. package/dist/lib/node-esm/ui/index.mjs +49 -0
  118. package/dist/lib/node-esm/ui/index.mjs.map +7 -0
  119. package/dist/plugin/node-esm/index.mjs +893 -0
  120. package/dist/plugin/node-esm/index.mjs.map +7 -0
  121. package/dist/plugin/node-esm/meta.json +1 -0
  122. package/dist/types/src/cli/cli.d.ts +39 -0
  123. package/dist/types/src/cli/cli.d.ts.map +1 -0
  124. package/dist/types/src/cli/index.d.ts +2 -0
  125. package/dist/types/src/cli/index.d.ts.map +1 -0
  126. package/dist/types/src/common/activation-events.d.ts +27 -0
  127. package/dist/types/src/common/activation-events.d.ts.map +1 -0
  128. package/dist/types/src/common/annotations.d.ts +1 -0
  129. package/dist/types/src/common/annotations.d.ts.map +1 -0
  130. package/dist/types/src/common/capabilities.d.ts +110 -200
  131. package/dist/types/src/common/capabilities.d.ts.map +1 -1
  132. package/dist/types/src/common/index.d.ts +4 -8
  133. package/dist/types/src/common/index.d.ts.map +1 -1
  134. package/dist/types/src/common/operations.d.ts +19 -0
  135. package/dist/types/src/common/operations.d.ts.map +1 -0
  136. package/dist/types/src/common/translations.d.ts +7 -7
  137. package/dist/types/src/common/translations.d.ts.map +1 -1
  138. package/dist/types/src/context.d.ts +5 -0
  139. package/dist/types/src/context.d.ts.map +1 -0
  140. package/dist/types/src/core/{events.d.ts → activation-event.d.ts} +11 -11
  141. package/dist/types/src/core/activation-event.d.ts.map +1 -0
  142. package/dist/types/src/core/capability-manager.d.ts +48 -0
  143. package/dist/types/src/core/capability-manager.d.ts.map +1 -0
  144. package/dist/types/src/core/capability-manager.test.d.ts +2 -0
  145. package/dist/types/src/core/capability-manager.test.d.ts.map +1 -0
  146. package/dist/types/src/core/capability.d.ts +156 -0
  147. package/dist/types/src/core/capability.d.ts.map +1 -0
  148. package/dist/types/src/core/edge-registry-plugin-provider.d.ts +30 -0
  149. package/dist/types/src/core/edge-registry-plugin-provider.d.ts.map +1 -0
  150. package/dist/types/src/core/index.d.ts +11 -4
  151. package/dist/types/src/core/index.d.ts.map +1 -1
  152. package/dist/types/src/core/plugin-asset-cache.d.ts +71 -0
  153. package/dist/types/src/core/plugin-asset-cache.d.ts.map +1 -0
  154. package/dist/types/src/core/plugin-manager.d.ts +298 -0
  155. package/dist/types/src/core/plugin-manager.d.ts.map +1 -0
  156. package/dist/types/src/core/plugin-manager.test.d.ts +2 -0
  157. package/dist/types/src/core/plugin-manager.test.d.ts.map +1 -0
  158. package/dist/types/src/core/plugin-manifest.d.ts +101 -0
  159. package/dist/types/src/core/plugin-manifest.d.ts.map +1 -0
  160. package/dist/types/src/core/plugin-manifest.test.d.ts +2 -0
  161. package/dist/types/src/core/plugin-manifest.test.d.ts.map +1 -0
  162. package/dist/types/src/core/plugin.d.ts +260 -39
  163. package/dist/types/src/core/plugin.d.ts.map +1 -1
  164. package/dist/types/src/core/registry.d.ts +107 -0
  165. package/dist/types/src/core/registry.d.ts.map +1 -0
  166. package/dist/types/src/core/url-loader.d.ts +127 -0
  167. package/dist/types/src/core/url-loader.d.ts.map +1 -0
  168. package/dist/types/src/core/url-loader.test.d.ts +2 -0
  169. package/dist/types/src/core/url-loader.test.d.ts.map +1 -0
  170. package/dist/types/src/helpers.d.ts.map +1 -1
  171. package/dist/types/src/index.d.ts +3 -4
  172. package/dist/types/src/index.d.ts.map +1 -1
  173. package/dist/types/src/plugin-operation/OperationPlugin.d.ts +3 -0
  174. package/dist/types/src/plugin-operation/OperationPlugin.d.ts.map +1 -0
  175. package/dist/types/src/plugin-operation/history/capability.d.ts +7 -0
  176. package/dist/types/src/plugin-operation/history/capability.d.ts.map +1 -0
  177. package/dist/types/src/plugin-operation/history/errors.d.ts +32 -0
  178. package/dist/types/src/plugin-operation/history/errors.d.ts.map +1 -0
  179. package/dist/types/src/plugin-operation/history/history-tracker.d.ts +18 -0
  180. package/dist/types/src/plugin-operation/history/history-tracker.d.ts.map +1 -0
  181. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts +2 -0
  182. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts.map +1 -0
  183. package/dist/types/src/plugin-operation/history/index.d.ts +6 -0
  184. package/dist/types/src/plugin-operation/history/index.d.ts.map +1 -0
  185. package/dist/types/src/plugin-operation/history/types.d.ts +13 -0
  186. package/dist/types/src/plugin-operation/history/types.d.ts.map +1 -0
  187. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts +101 -0
  188. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +1 -0
  189. package/dist/types/src/plugin-operation/history/undo-registry.d.ts +23 -0
  190. package/dist/types/src/plugin-operation/history/undo-registry.d.ts.map +1 -0
  191. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts +2 -0
  192. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts.map +1 -0
  193. package/dist/types/src/plugin-operation/index.d.ts +3 -0
  194. package/dist/types/src/plugin-operation/index.d.ts.map +1 -0
  195. package/dist/types/src/plugin-operation/invoker-capability.d.ts +6 -0
  196. package/dist/types/src/plugin-operation/invoker-capability.d.ts.map +1 -0
  197. package/dist/types/src/plugin-operation/meta.d.ts +3 -0
  198. package/dist/types/src/plugin-operation/meta.d.ts.map +1 -0
  199. package/dist/types/src/plugin-operation/testing.d.ts +59 -0
  200. package/dist/types/src/plugin-operation/testing.d.ts.map +1 -0
  201. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts +3 -0
  202. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts.map +1 -0
  203. package/dist/types/src/plugin-runtime/capability.d.ts +6 -0
  204. package/dist/types/src/plugin-runtime/capability.d.ts.map +1 -0
  205. package/dist/types/src/plugin-runtime/index.d.ts +2 -0
  206. package/dist/types/src/plugin-runtime/index.d.ts.map +1 -0
  207. package/dist/types/src/plugin-runtime/meta.d.ts +3 -0
  208. package/dist/types/src/plugin-runtime/meta.d.ts.map +1 -0
  209. package/dist/types/src/testing/harness.d.ts +67 -0
  210. package/dist/types/src/testing/harness.d.ts.map +1 -0
  211. package/dist/types/src/testing/index.d.ts +2 -0
  212. package/dist/types/src/testing/index.d.ts.map +1 -1
  213. package/dist/types/src/testing/react.d.ts +27 -0
  214. package/dist/types/src/testing/react.d.ts.map +1 -0
  215. package/dist/types/src/testing/react.test.d.ts +2 -0
  216. package/dist/types/src/testing/react.test.d.ts.map +1 -0
  217. package/dist/types/src/testing/service.d.ts +8 -0
  218. package/dist/types/src/testing/service.d.ts.map +1 -0
  219. package/dist/types/src/testing/withPluginManager.d.ts +4 -4
  220. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  221. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
  222. package/dist/types/src/ui/components/App/App.d.ts +9 -0
  223. package/dist/types/src/ui/components/App/App.d.ts.map +1 -0
  224. package/dist/types/src/ui/components/App/App.stories.d.ts +19 -0
  225. package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -0
  226. package/dist/types/src/ui/components/App/index.d.ts +2 -0
  227. package/dist/types/src/ui/components/App/index.d.ts.map +1 -0
  228. package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts +64 -0
  229. package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts.map +1 -0
  230. package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts +19 -0
  231. package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts.map +1 -0
  232. package/dist/types/src/ui/components/Placeholder/index.d.ts +2 -0
  233. package/dist/types/src/ui/components/Placeholder/index.d.ts.map +1 -0
  234. package/dist/types/src/{playground/playground.stories.d.ts → ui/components/PluginManager/PluginManagerContext.stories.d.ts} +5 -3
  235. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -0
  236. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts +10 -0
  237. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts.map +1 -0
  238. package/dist/types/src/ui/components/PluginManager/index.d.ts +2 -0
  239. package/dist/types/src/ui/components/PluginManager/index.d.ts.map +1 -0
  240. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +24 -0
  241. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -0
  242. package/dist/types/src/{components/App.stories.d.ts → ui/components/Surface/SurfaceComponent.stories.d.ts} +1 -1
  243. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -0
  244. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts +11 -0
  245. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +1 -0
  246. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts +48 -0
  247. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts.map +1 -0
  248. package/dist/types/src/ui/components/Surface/context.d.ts +5 -0
  249. package/dist/types/src/ui/components/Surface/context.d.ts.map +1 -0
  250. package/dist/types/src/ui/components/Surface/index.d.ts +36 -0
  251. package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -0
  252. package/dist/types/src/ui/components/Surface/types.d.ts +197 -0
  253. package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -0
  254. package/dist/types/src/ui/components/Surface/types.test.d.ts +2 -0
  255. package/dist/types/src/ui/components/Surface/types.test.d.ts.map +1 -0
  256. package/dist/types/src/ui/components/index.d.ts +5 -0
  257. package/dist/types/src/ui/components/index.d.ts.map +1 -0
  258. package/dist/types/src/ui/hooks/index.d.ts +6 -0
  259. package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
  260. package/dist/types/src/ui/hooks/useApp.d.ts +89 -0
  261. package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -0
  262. package/dist/types/src/ui/hooks/useApp.test.d.ts +2 -0
  263. package/dist/types/src/ui/hooks/useApp.test.d.ts.map +1 -0
  264. package/dist/types/src/ui/hooks/useCapabilities.d.ts +31 -0
  265. package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -0
  266. package/dist/types/src/{components → ui/hooks}/useLoading.d.ts +1 -2
  267. package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
  268. package/dist/types/src/ui/hooks/useSettingsState.d.ts +10 -0
  269. package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -0
  270. package/dist/types/src/ui/hooks/useSurface.d.ts +3 -0
  271. package/dist/types/src/ui/hooks/useSurface.d.ts.map +1 -0
  272. package/dist/types/src/ui/index.d.ts +3 -0
  273. package/dist/types/src/ui/index.d.ts.map +1 -0
  274. package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts +34 -0
  275. package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts.map +1 -0
  276. package/dist/types/src/vite-plugin/boot-loader/index.d.ts +2 -0
  277. package/dist/types/src/vite-plugin/boot-loader/index.d.ts.map +1 -0
  278. package/dist/types/src/vite-plugin/boot-loader/loader.d.ts +51 -0
  279. package/dist/types/src/vite-plugin/boot-loader/loader.d.ts.map +1 -0
  280. package/dist/types/src/vite-plugin/composer/index.d.ts +34 -0
  281. package/dist/types/src/vite-plugin/composer/index.d.ts.map +1 -0
  282. package/dist/types/src/vite-plugin/import-map/index.d.ts +28 -0
  283. package/dist/types/src/vite-plugin/import-map/index.d.ts.map +1 -0
  284. package/dist/types/src/vite-plugin/index.d.ts +5 -0
  285. package/dist/types/src/vite-plugin/index.d.ts.map +1 -0
  286. package/dist/types/src/vite-plugin/manifest.d.ts +41 -0
  287. package/dist/types/src/vite-plugin/manifest.d.ts.map +1 -0
  288. package/dist/types/src/vite-plugin/manifest.test.d.ts +2 -0
  289. package/dist/types/src/vite-plugin/manifest.test.d.ts.map +1 -0
  290. package/dist/types/src/vite-plugin/packages.d.ts +13 -0
  291. package/dist/types/src/vite-plugin/packages.d.ts.map +1 -0
  292. package/dist/types/tsconfig.tsbuildinfo +1 -1
  293. package/moon.yml +25 -6
  294. package/package.json +115 -56
  295. package/src/cli/cli.ts +107 -0
  296. package/src/{components → cli}/index.ts +1 -1
  297. package/src/common/activation-events.ts +44 -0
  298. package/src/{playground/layout/index.ts → common/annotations.ts} +0 -2
  299. package/src/common/capabilities.ts +169 -213
  300. package/src/common/index.ts +4 -8
  301. package/src/common/operations.ts +35 -0
  302. package/src/common/translations.ts +17 -9
  303. package/src/context.ts +9 -0
  304. package/src/core/{events.ts → activation-event.ts} +10 -7
  305. package/src/core/capability-manager.test.ts +151 -0
  306. package/src/core/capability-manager.ts +192 -0
  307. package/src/core/capability.ts +247 -0
  308. package/src/core/edge-registry-plugin-provider.ts +92 -0
  309. package/src/core/index.ts +11 -4
  310. package/src/core/plugin-asset-cache.ts +60 -0
  311. package/src/core/plugin-manager.test.ts +1899 -0
  312. package/src/core/plugin-manager.ts +1685 -0
  313. package/src/core/plugin-manifest.test.ts +75 -0
  314. package/src/core/plugin-manifest.ts +134 -0
  315. package/src/core/plugin.ts +395 -45
  316. package/src/core/registry.ts +163 -0
  317. package/src/core/url-loader.test.ts +221 -0
  318. package/src/core/url-loader.ts +388 -0
  319. package/src/index.ts +3 -4
  320. package/src/plugin-operation/OperationPlugin.ts +24 -0
  321. package/src/plugin-operation/history/capability.ts +36 -0
  322. package/src/plugin-operation/history/errors.ts +7 -0
  323. package/src/plugin-operation/history/history-tracker.test.ts +374 -0
  324. package/src/plugin-operation/history/history-tracker.ts +128 -0
  325. package/src/plugin-operation/history/index.ts +9 -0
  326. package/src/plugin-operation/history/types.ts +17 -0
  327. package/src/plugin-operation/history/undo-mapping.ts +135 -0
  328. package/src/plugin-operation/history/undo-registry.test.ts +72 -0
  329. package/src/plugin-operation/history/undo-registry.ts +54 -0
  330. package/src/plugin-operation/index.ts +6 -0
  331. package/src/plugin-operation/invoker-capability.ts +55 -0
  332. package/src/plugin-operation/meta.ts +12 -0
  333. package/src/plugin-operation/testing.ts +155 -0
  334. package/src/plugin-runtime/RuntimePlugin.ts +19 -0
  335. package/src/plugin-runtime/capability.ts +53 -0
  336. package/src/plugin-runtime/index.ts +5 -0
  337. package/src/plugin-runtime/meta.ts +12 -0
  338. package/src/testing/harness.ts +229 -0
  339. package/src/testing/index.ts +2 -0
  340. package/src/testing/react.test.tsx +48 -0
  341. package/src/testing/react.tsx +113 -0
  342. package/src/testing/service.ts +52 -0
  343. package/src/testing/withPluginManager.stories.tsx +8 -9
  344. package/src/testing/withPluginManager.tsx +61 -38
  345. package/src/ui/components/App/App.stories.tsx +88 -0
  346. package/src/ui/components/App/App.tsx +81 -0
  347. package/src/{playground/debug → ui/components/App}/index.ts +1 -1
  348. package/src/ui/components/Placeholder/Placeholder.stories.tsx +77 -0
  349. package/src/ui/components/Placeholder/Placeholder.tsx +155 -0
  350. package/src/{playground/logger → ui/components/Placeholder}/index.ts +1 -1
  351. package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +185 -0
  352. package/src/{react → ui/components/PluginManager}/PluginManagerProvider.ts +3 -3
  353. package/src/ui/components/PluginManager/index.ts +5 -0
  354. package/src/ui/components/Surface/SurfaceComponent.stories.tsx +144 -0
  355. package/src/ui/components/Surface/SurfaceComponent.tsx +303 -0
  356. package/src/ui/components/Surface/SurfaceInfo.tsx +106 -0
  357. package/src/ui/components/Surface/SurfaceProfilerContext.tsx +207 -0
  358. package/src/ui/components/Surface/context.ts +12 -0
  359. package/src/ui/components/Surface/index.ts +54 -0
  360. package/src/ui/components/Surface/types.test.ts +126 -0
  361. package/src/ui/components/Surface/types.ts +269 -0
  362. package/src/ui/components/index.ts +8 -0
  363. package/src/ui/hooks/index.ts +9 -0
  364. package/src/ui/hooks/useApp.test.tsx +159 -0
  365. package/src/ui/hooks/useApp.tsx +424 -0
  366. package/src/ui/hooks/useCapabilities.ts +67 -0
  367. package/src/{components → ui/hooks}/useLoading.tsx +16 -10
  368. package/src/ui/hooks/useSettingsState.ts +26 -0
  369. package/src/ui/hooks/useSurface.ts +13 -0
  370. package/src/ui/index.ts +6 -0
  371. package/src/vite-plugin/boot-loader/BootLoader.stories.tsx +270 -0
  372. package/src/vite-plugin/boot-loader/boot-loader.css +320 -0
  373. package/src/vite-plugin/boot-loader/boot-loader.js +325 -0
  374. package/src/vite-plugin/boot-loader/index.ts +5 -0
  375. package/src/vite-plugin/boot-loader/loader.ts +123 -0
  376. package/src/vite-plugin/composer/index.ts +306 -0
  377. package/src/vite-plugin/import-map/index.ts +527 -0
  378. package/src/vite-plugin/index.ts +10 -0
  379. package/src/vite-plugin/manifest.test.ts +46 -0
  380. package/src/vite-plugin/manifest.ts +57 -0
  381. package/src/vite-plugin/packages.ts +187 -0
  382. package/tsconfig.json +24 -15
  383. package/tsconfig.node.json +2 -4
  384. package/typedoc.json +2 -4
  385. package/vitest.config.ts +1 -1
  386. package/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
  387. package/.swc/plugins/linux_x86_64_19.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429.wasmer-v7 +0 -0
  388. package/dist/lib/browser/app-graph-builder-PSA3RESL.mjs +0 -138
  389. package/dist/lib/browser/app-graph-builder-PSA3RESL.mjs.map +0 -7
  390. package/dist/lib/browser/chunk-2VZ4RF4A.mjs +0 -1608
  391. package/dist/lib/browser/chunk-2VZ4RF4A.mjs.map +0 -7
  392. package/dist/lib/browser/chunk-CPVYIS24.mjs +0 -451
  393. package/dist/lib/browser/chunk-CPVYIS24.mjs.map +0 -7
  394. package/dist/lib/browser/chunk-SCPE4ZO2.mjs +0 -35
  395. package/dist/lib/browser/chunk-SCPE4ZO2.mjs.map +0 -7
  396. package/dist/lib/browser/intent-dispatcher-BND6IF4U.mjs +0 -11
  397. package/dist/lib/browser/intent-resolver-27FJAJDE.mjs +0 -39
  398. package/dist/lib/browser/intent-resolver-27FJAJDE.mjs.map +0 -7
  399. package/dist/lib/browser/store-F545UOIR.mjs +0 -30
  400. package/dist/lib/browser/store-F545UOIR.mjs.map +0 -7
  401. package/dist/lib/browser/worker.mjs +0 -77
  402. package/dist/lib/node-esm/app-graph-builder-VJGZ6KH7.mjs +0 -139
  403. package/dist/lib/node-esm/app-graph-builder-VJGZ6KH7.mjs.map +0 -7
  404. package/dist/lib/node-esm/chunk-3RRWO5TD.mjs +0 -1610
  405. package/dist/lib/node-esm/chunk-3RRWO5TD.mjs.map +0 -7
  406. package/dist/lib/node-esm/chunk-MN37WUJ2.mjs +0 -452
  407. package/dist/lib/node-esm/chunk-MN37WUJ2.mjs.map +0 -7
  408. package/dist/lib/node-esm/chunk-ZX63QUGE.mjs +0 -37
  409. package/dist/lib/node-esm/chunk-ZX63QUGE.mjs.map +0 -7
  410. package/dist/lib/node-esm/intent-dispatcher-254AZ6EE.mjs +0 -12
  411. package/dist/lib/node-esm/intent-resolver-NPMOPNFL.mjs +0 -40
  412. package/dist/lib/node-esm/intent-resolver-NPMOPNFL.mjs.map +0 -7
  413. package/dist/lib/node-esm/store-CINC4R4L.mjs +0 -31
  414. package/dist/lib/node-esm/store-CINC4R4L.mjs.map +0 -7
  415. package/dist/lib/node-esm/worker.mjs +0 -78
  416. package/dist/types/src/common/collaboration.d.ts +0 -20
  417. package/dist/types/src/common/collaboration.d.ts.map +0 -1
  418. package/dist/types/src/common/events.d.ts +0 -52
  419. package/dist/types/src/common/events.d.ts.map +0 -1
  420. package/dist/types/src/common/file.d.ts +0 -14
  421. package/dist/types/src/common/file.d.ts.map +0 -1
  422. package/dist/types/src/common/graph.d.ts +0 -21
  423. package/dist/types/src/common/graph.d.ts.map +0 -1
  424. package/dist/types/src/common/layout.d.ts +0 -279
  425. package/dist/types/src/common/layout.d.ts.map +0 -1
  426. package/dist/types/src/common/surface.d.ts +0 -59
  427. package/dist/types/src/common/surface.d.ts.map +0 -1
  428. package/dist/types/src/components/App.d.ts +0 -10
  429. package/dist/types/src/components/App.d.ts.map +0 -1
  430. package/dist/types/src/components/App.stories.d.ts.map +0 -1
  431. package/dist/types/src/components/DefaultFallback.d.ts +0 -8
  432. package/dist/types/src/components/DefaultFallback.d.ts.map +0 -1
  433. package/dist/types/src/components/index.d.ts +0 -2
  434. package/dist/types/src/components/index.d.ts.map +0 -1
  435. package/dist/types/src/components/useApp.d.ts +0 -44
  436. package/dist/types/src/components/useApp.d.ts.map +0 -1
  437. package/dist/types/src/components/useLoading.d.ts.map +0 -1
  438. package/dist/types/src/core/capabilities.d.ts +0 -117
  439. package/dist/types/src/core/capabilities.d.ts.map +0 -1
  440. package/dist/types/src/core/capabilities.test.d.ts +0 -2
  441. package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
  442. package/dist/types/src/core/events.d.ts.map +0 -1
  443. package/dist/types/src/core/manager.d.ts +0 -126
  444. package/dist/types/src/core/manager.d.ts.map +0 -1
  445. package/dist/types/src/core/manager.test.d.ts +0 -2
  446. package/dist/types/src/core/manager.test.d.ts.map +0 -1
  447. package/dist/types/src/playground/debug/Debug.d.ts +0 -6
  448. package/dist/types/src/playground/debug/Debug.d.ts.map +0 -1
  449. package/dist/types/src/playground/debug/index.d.ts +0 -2
  450. package/dist/types/src/playground/debug/index.d.ts.map +0 -1
  451. package/dist/types/src/playground/debug/plugin.d.ts +0 -2
  452. package/dist/types/src/playground/debug/plugin.d.ts.map +0 -1
  453. package/dist/types/src/playground/generator/Main.d.ts +0 -6
  454. package/dist/types/src/playground/generator/Main.d.ts.map +0 -1
  455. package/dist/types/src/playground/generator/Toolbar.d.ts +0 -6
  456. package/dist/types/src/playground/generator/Toolbar.d.ts.map +0 -1
  457. package/dist/types/src/playground/generator/generator.d.ts +0 -7
  458. package/dist/types/src/playground/generator/generator.d.ts.map +0 -1
  459. package/dist/types/src/playground/generator/index.d.ts +0 -3
  460. package/dist/types/src/playground/generator/index.d.ts.map +0 -1
  461. package/dist/types/src/playground/generator/plugin.d.ts +0 -2
  462. package/dist/types/src/playground/generator/plugin.d.ts.map +0 -1
  463. package/dist/types/src/playground/layout/Layout.d.ts +0 -8
  464. package/dist/types/src/playground/layout/Layout.d.ts.map +0 -1
  465. package/dist/types/src/playground/layout/index.d.ts +0 -2
  466. package/dist/types/src/playground/layout/index.d.ts.map +0 -1
  467. package/dist/types/src/playground/layout/plugin.d.ts +0 -2
  468. package/dist/types/src/playground/layout/plugin.d.ts.map +0 -1
  469. package/dist/types/src/playground/logger/Toolbar.d.ts +0 -6
  470. package/dist/types/src/playground/logger/Toolbar.d.ts.map +0 -1
  471. package/dist/types/src/playground/logger/index.d.ts +0 -2
  472. package/dist/types/src/playground/logger/index.d.ts.map +0 -1
  473. package/dist/types/src/playground/logger/plugin.d.ts +0 -2
  474. package/dist/types/src/playground/logger/plugin.d.ts.map +0 -1
  475. package/dist/types/src/playground/logger/schema.d.ts +0 -13
  476. package/dist/types/src/playground/logger/schema.d.ts.map +0 -1
  477. package/dist/types/src/playground/playground.stories.d.ts.map +0 -1
  478. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +0 -2
  479. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +0 -1
  480. package/dist/types/src/plugin-intent/actions.d.ts +0 -36
  481. package/dist/types/src/plugin-intent/actions.d.ts.map +0 -1
  482. package/dist/types/src/plugin-intent/errors.d.ts +0 -16
  483. package/dist/types/src/plugin-intent/errors.d.ts.map +0 -1
  484. package/dist/types/src/plugin-intent/index.d.ts +0 -6
  485. package/dist/types/src/plugin-intent/index.d.ts.map +0 -1
  486. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +0 -139
  487. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +0 -1
  488. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +0 -2
  489. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +0 -1
  490. package/dist/types/src/plugin-intent/intent.d.ts +0 -63
  491. package/dist/types/src/plugin-intent/intent.d.ts.map +0 -1
  492. package/dist/types/src/plugin-intent/meta.d.ts +0 -3
  493. package/dist/types/src/plugin-intent/meta.d.ts.map +0 -1
  494. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +0 -2
  495. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +0 -1
  496. package/dist/types/src/plugin-settings/actions.d.ts +0 -25
  497. package/dist/types/src/plugin-settings/actions.d.ts.map +0 -1
  498. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +0 -4
  499. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +0 -1
  500. package/dist/types/src/plugin-settings/index.d.ts +0 -3
  501. package/dist/types/src/plugin-settings/index.d.ts.map +0 -1
  502. package/dist/types/src/plugin-settings/intent-resolver.d.ts +0 -4
  503. package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +0 -1
  504. package/dist/types/src/plugin-settings/meta.d.ts +0 -3
  505. package/dist/types/src/plugin-settings/meta.d.ts.map +0 -1
  506. package/dist/types/src/plugin-settings/store.d.ts +0 -5
  507. package/dist/types/src/plugin-settings/store.d.ts.map +0 -1
  508. package/dist/types/src/plugin-settings/translations.d.ts +0 -11
  509. package/dist/types/src/plugin-settings/translations.d.ts.map +0 -1
  510. package/dist/types/src/react/ErrorBoundary.d.ts +0 -30
  511. package/dist/types/src/react/ErrorBoundary.d.ts.map +0 -1
  512. package/dist/types/src/react/IntentContext.d.ts +0 -8
  513. package/dist/types/src/react/IntentContext.d.ts.map +0 -1
  514. package/dist/types/src/react/PluginManagerProvider.d.ts +0 -10
  515. package/dist/types/src/react/PluginManagerProvider.d.ts.map +0 -1
  516. package/dist/types/src/react/Surface.d.ts +0 -12
  517. package/dist/types/src/react/Surface.d.ts.map +0 -1
  518. package/dist/types/src/react/Surface.stories.d.ts +0 -17
  519. package/dist/types/src/react/Surface.stories.d.ts.map +0 -1
  520. package/dist/types/src/react/common.d.ts +0 -13
  521. package/dist/types/src/react/common.d.ts.map +0 -1
  522. package/dist/types/src/react/index.d.ts +0 -7
  523. package/dist/types/src/react/index.d.ts.map +0 -1
  524. package/dist/types/src/react/useCapabilities.d.ts +0 -13
  525. package/dist/types/src/react/useCapabilities.d.ts.map +0 -1
  526. package/dist/types/src/react/useIntentResolver.d.ts +0 -3
  527. package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
  528. package/dist/types/src/worker.d.ts +0 -4
  529. package/dist/types/src/worker.d.ts.map +0 -1
  530. package/src/common/collaboration.ts +0 -18
  531. package/src/common/events.ts +0 -79
  532. package/src/common/file.ts +0 -22
  533. package/src/common/graph.ts +0 -30
  534. package/src/common/layout.ts +0 -277
  535. package/src/common/surface.ts +0 -83
  536. package/src/components/App.stories.tsx +0 -33
  537. package/src/components/App.tsx +0 -59
  538. package/src/components/DefaultFallback.tsx +0 -26
  539. package/src/components/useApp.tsx +0 -164
  540. package/src/core/capabilities.test.ts +0 -136
  541. package/src/core/capabilities.ts +0 -263
  542. package/src/core/manager.test.ts +0 -516
  543. package/src/core/manager.ts +0 -604
  544. package/src/playground/debug/Debug.tsx +0 -39
  545. package/src/playground/debug/plugin.ts +0 -16
  546. package/src/playground/generator/Main.tsx +0 -71
  547. package/src/playground/generator/Toolbar.tsx +0 -47
  548. package/src/playground/generator/generator.ts +0 -48
  549. package/src/playground/generator/index.ts +0 -6
  550. package/src/playground/generator/plugin.ts +0 -22
  551. package/src/playground/layout/Layout.tsx +0 -33
  552. package/src/playground/layout/plugin.ts +0 -18
  553. package/src/playground/logger/Toolbar.tsx +0 -30
  554. package/src/playground/logger/plugin.ts +0 -41
  555. package/src/playground/logger/schema.ts +0 -12
  556. package/src/playground/playground.stories.tsx +0 -46
  557. package/src/plugin-intent/IntentPlugin.ts +0 -20
  558. package/src/plugin-intent/actions.ts +0 -31
  559. package/src/plugin-intent/errors.ts +0 -40
  560. package/src/plugin-intent/index.ts +0 -9
  561. package/src/plugin-intent/intent-dispatcher.test.ts +0 -286
  562. package/src/plugin-intent/intent-dispatcher.ts +0 -337
  563. package/src/plugin-intent/intent.ts +0 -154
  564. package/src/plugin-intent/meta.ts +0 -10
  565. package/src/plugin-settings/SettingsPlugin.ts +0 -34
  566. package/src/plugin-settings/actions.ts +0 -25
  567. package/src/plugin-settings/app-graph-builder.ts +0 -160
  568. package/src/plugin-settings/index.ts +0 -6
  569. package/src/plugin-settings/intent-resolver.ts +0 -35
  570. package/src/plugin-settings/meta.ts +0 -10
  571. package/src/plugin-settings/store.ts +0 -33
  572. package/src/plugin-settings/translations.ts +0 -19
  573. package/src/react/ErrorBoundary.tsx +0 -56
  574. package/src/react/IntentContext.tsx +0 -35
  575. package/src/react/Surface.stories.tsx +0 -101
  576. package/src/react/Surface.tsx +0 -86
  577. package/src/react/common.ts +0 -13
  578. package/src/react/index.ts +0 -10
  579. package/src/react/useCapabilities.ts +0 -31
  580. package/src/react/useIntentResolver.ts +0 -22
  581. package/src/worker.ts +0 -11
  582. /package/dist/lib/browser/{intent-dispatcher-BND6IF4U.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  583. /package/dist/lib/browser/{worker.mjs.map → common/activation-events.mjs.map} +0 -0
  584. /package/dist/lib/{node-esm/intent-dispatcher-254AZ6EE.mjs.map → browser/common/capabilities.mjs.map} +0 -0
  585. /package/dist/lib/{node-esm/worker.mjs.map → browser/core/activation-event.mjs.map} +0 -0
@@ -1,25 +1,198 @@
1
1
  import {
2
2
  useApp
3
- } from "../chunk-CPVYIS24.mjs";
3
+ } from "../chunk-XLYULXAO.mjs";
4
+ import "../chunk-7VZJR2OA.mjs";
5
+ import "../chunk-FJ4765WW.mjs";
6
+ import "../chunk-23D4SJUE.mjs";
4
7
  import {
5
- Capabilities,
6
- Events,
7
- PluginManager,
8
- contributes,
9
- defineModule,
10
- definePlugin
11
- } from "../chunk-2VZ4RF4A.mjs";
8
+ capabilities_exports
9
+ } from "../chunk-WBHCSOBW.mjs";
10
+ import {
11
+ activation_events_exports
12
+ } from "../chunk-45CHLTBV.mjs";
13
+ import "../chunk-FO3IYSLV.mjs";
14
+ import "../chunk-6GZYCP73.mjs";
15
+ import {
16
+ plugin_manager_exports
17
+ } from "../chunk-J43JDWAV.mjs";
18
+ import {
19
+ activation_event_exports
20
+ } from "../chunk-66IXTIVK.mjs";
21
+ import {
22
+ plugin_exports
23
+ } from "../chunk-G6Q2M2M5.mjs";
24
+ import {
25
+ capability_exports
26
+ } from "../chunk-3JWJXGLK.mjs";
27
+ import "../chunk-J5LGTIGS.mjs";
28
+
29
+ // src/testing/harness.ts
30
+ import * as Duration from "effect/Duration";
31
+ import * as Effect from "effect/Effect";
32
+ import * as PubSub from "effect/PubSub";
33
+ import * as Queue from "effect/Queue";
34
+ import { runAndForwardErrors } from "@dxos/effect";
35
+ import { invariant } from "@dxos/invariant";
36
+ var __dxlog_file = "/__w/dxos/dxos/packages/sdk/app-framework/src/testing/harness.ts";
37
+ var DEFAULT_TIMEOUT_MS = 5e3;
38
+ var createTestApp = async (opts) => {
39
+ const { plugins, core = plugins.map((plugin) => plugin.meta.id), enabled, setupEvents = [], autoStart = true, registerFrameworkCapabilities = true } = opts;
40
+ const pluginLoader = (id) => Effect.sync(() => {
41
+ const plugin = plugins.find((plugin2) => plugin2.meta.id === id);
42
+ invariant(plugin, `Plugin not found: ${id}`, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 26, S: void 0, A: ["plugin", "`Plugin not found: ${id}`"] });
43
+ return {
44
+ plugin
45
+ };
46
+ });
47
+ const manager = plugin_manager_exports.make({
48
+ pluginLoader,
49
+ plugins,
50
+ core,
51
+ enabled
52
+ });
53
+ if (registerFrameworkCapabilities) {
54
+ manager.capabilities.contribute({
55
+ interface: capabilities_exports.PluginManager,
56
+ implementation: manager,
57
+ module: "org.dxos.app-framework.plugin-manager"
58
+ });
59
+ manager.capabilities.contribute({
60
+ interface: capabilities_exports.AtomRegistry,
61
+ implementation: manager.registry,
62
+ module: "org.dxos.app-framework.atom-registry"
63
+ });
64
+ }
65
+ if (autoStart) {
66
+ try {
67
+ await runAndForwardErrors(Effect.all([
68
+ ...setupEvents.map((event) => manager.activate(event)),
69
+ manager.activate(activation_events_exports.SetupReactSurface),
70
+ manager.activate(activation_events_exports.Startup)
71
+ ]));
72
+ } catch (err) {
73
+ await runAndForwardErrors(manager.shutdown()).catch(() => void 0);
74
+ throw err;
75
+ }
76
+ }
77
+ return new TestHarnessImpl(manager);
78
+ };
79
+ var TestHarnessImpl = class {
80
+ manager;
81
+ constructor(manager) {
82
+ this.manager = manager;
83
+ }
84
+ get capabilities() {
85
+ return this.manager.capabilities;
86
+ }
87
+ get registry() {
88
+ return this.manager.registry;
89
+ }
90
+ fire(event) {
91
+ return runAndForwardErrors(this.manager.activate(event));
92
+ }
93
+ reset(event) {
94
+ return runAndForwardErrors(this.manager.reset(event));
95
+ }
96
+ get(iface) {
97
+ return this.manager.capabilities.get(iface);
98
+ }
99
+ getAll(iface) {
100
+ return this.manager.capabilities.getAll(iface);
101
+ }
102
+ waitForCapability(iface, opts) {
103
+ const timeout = opts?.timeout ?? DEFAULT_TIMEOUT_MS;
104
+ return runAndForwardErrors(this.manager.capabilities.waitFor(iface).pipe(Effect.timeoutFail({
105
+ duration: Duration.millis(timeout),
106
+ onTimeout: () => timeoutError(iface.identifier)
107
+ })));
108
+ }
109
+ waitForEvent(event, opts) {
110
+ const key = typeof event === "string" ? event : activation_event_exports.eventKey(event);
111
+ const timeout = opts?.timeout ?? DEFAULT_TIMEOUT_MS;
112
+ const program = Effect.gen(this, function* () {
113
+ const queue = yield* PubSub.subscribe(this.manager.activation);
114
+ if (this.manager.getEventsFired().includes(key)) {
115
+ return;
116
+ }
117
+ while (true) {
118
+ const message = yield* Queue.take(queue);
119
+ if (message.event === key && message.state === "activated") {
120
+ return;
121
+ }
122
+ }
123
+ }).pipe(Effect.scoped, Effect.timeoutFail({
124
+ duration: Duration.millis(timeout),
125
+ onTimeout: () => timeoutError(key)
126
+ }));
127
+ return runAndForwardErrors(program);
128
+ }
129
+ async invoke(op, ...args) {
130
+ const invoker = await this.waitForCapability(capabilities_exports.OperationInvoker);
131
+ const result = await invoker.invokePromise(op, ...args);
132
+ if (result.error) {
133
+ throw result.error;
134
+ }
135
+ return result.data;
136
+ }
137
+ enable(id) {
138
+ return runAndForwardErrors(this.manager.enable(id));
139
+ }
140
+ disable(id) {
141
+ return runAndForwardErrors(this.manager.disable(id));
142
+ }
143
+ async dispose() {
144
+ await runAndForwardErrors(this.manager.shutdown());
145
+ }
146
+ [Symbol.asyncDispose]() {
147
+ return this.dispose();
148
+ }
149
+ };
150
+ var timeoutError = (id) => new Error(`Timed out waiting for ${id}`);
151
+
152
+ // src/testing/service.ts
153
+ import * as Effect2 from "effect/Effect";
154
+ import * as Layer from "effect/Layer";
155
+ import { invariant as invariant2 } from "@dxos/invariant";
156
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/sdk/app-framework/src/testing/service.ts";
157
+ var fromPlugins = (plugins) => Layer.effect(plugin_exports.Service, Effect2.gen(function* () {
158
+ const pluginLoader = (id) => Effect2.sync(() => {
159
+ const plugin = plugins.find((plugin2) => plugin2.meta.id === id);
160
+ invariant2(plugin, `Plugin not found: ${id}`, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 16, S: this, A: ["plugin", "`Plugin not found: ${id}`"] });
161
+ return {
162
+ plugin
163
+ };
164
+ });
165
+ const manager = plugin_manager_exports.make({
166
+ pluginLoader,
167
+ plugins,
168
+ core: plugins.map((plugin) => plugin.meta.id)
169
+ });
170
+ manager.capabilities.contribute({
171
+ interface: capabilities_exports.PluginManager,
172
+ implementation: manager,
173
+ module: "org.dxos.app-framework.plugin-manager"
174
+ });
175
+ manager.capabilities.contribute({
176
+ interface: capabilities_exports.AtomRegistry,
177
+ implementation: manager.registry,
178
+ module: "org.dxos.app-framework.atom-registry"
179
+ });
180
+ yield* manager.activate(activation_events_exports.Startup);
181
+ return manager;
182
+ }));
12
183
 
13
184
  // src/testing/withPluginManager.tsx
14
- import React, { useEffect, useMemo } from "react";
185
+ import * as Effect3 from "effect/Effect";
186
+ import React, { useEffect, useState } from "react";
15
187
  import { raise } from "@dxos/debug";
188
+ import { runAndForwardErrors as runAndForwardErrors2 } from "@dxos/effect";
16
189
  import { useAsyncEffect } from "@dxos/react-hooks";
17
190
  import { getProviderValue } from "@dxos/util";
18
191
  var setupPluginManager = ({ capabilities, plugins = [], core = plugins.map(({ meta }) => meta.id), ...options } = {}) => {
19
- const pluginManager = new PluginManager({
192
+ const pluginManager = plugin_manager_exports.make({
20
193
  pluginLoader: () => raise(new Error("Not implemented")),
21
194
  plugins: [
22
- StoryPlugin(),
195
+ StoryPlugin,
23
196
  ...plugins
24
197
  ],
25
198
  core: [
@@ -29,8 +202,8 @@ var setupPluginManager = ({ capabilities, plugins = [], core = plugins.map(({ me
29
202
  ...options
30
203
  });
31
204
  if (capabilities) {
32
- getProviderValue(capabilities, pluginManager.context).forEach((capability) => {
33
- pluginManager.context.contributeCapability({
205
+ getProviderValue(capabilities, pluginManager.capabilities).forEach((capability) => {
206
+ pluginManager.capabilities.contribute({
34
207
  interface: capability.interface,
35
208
  implementation: capability.implementation,
36
209
  module: "story"
@@ -41,49 +214,65 @@ var setupPluginManager = ({ capabilities, plugins = [], core = plugins.map(({ me
41
214
  };
42
215
  var withPluginManager = (init = {}) => {
43
216
  return (Story, context) => {
217
+ const storyId = context.id;
44
218
  const options = typeof init === "function" ? init(context) : init;
45
- const pluginManager = useMemo(() => setupPluginManager(options), [
46
- init
47
- ]);
219
+ const [managerState, setManagerState] = useState();
48
220
  useEffect(() => {
49
- const capability = contributes(Capabilities.ReactRoot, {
50
- id: context.id,
221
+ const pluginManager = setupPluginManager(options);
222
+ const capability = capability_exports.contributes(capabilities_exports.ReactRoot, {
223
+ id: storyId,
51
224
  root: () => /* @__PURE__ */ React.createElement(Story, null)
52
225
  });
53
- pluginManager.context.contributeCapability({
226
+ pluginManager.capabilities.contribute({
54
227
  ...capability,
55
- module: "dxos.org/app-framework/withPluginManager"
228
+ module: "org.dxos.app-framework.with-plugin-manager"
229
+ });
230
+ setManagerState({
231
+ pluginManager,
232
+ setupEvents: options.setupEvents,
233
+ fireEvents: options.fireEvents,
234
+ storyId
56
235
  });
57
236
  return () => {
58
- pluginManager.context.removeCapability(capability.interface, capability.implementation);
237
+ pluginManager.capabilities.remove(capability.interface, capability.implementation);
238
+ void runAndForwardErrors2(pluginManager.shutdown());
59
239
  };
60
240
  }, [
61
- pluginManager,
62
- context
63
- ]);
64
- useAsyncEffect(async () => {
65
- await Promise.all(options.fireEvents?.map((event) => pluginManager.activate(event)) ?? []);
66
- }, [
67
- pluginManager
241
+ storyId,
242
+ init
68
243
  ]);
69
- const App = useApp({
70
- pluginManager
71
- });
72
- return /* @__PURE__ */ React.createElement(App, null);
244
+ if (!managerState || managerState.storyId !== storyId) {
245
+ return /* @__PURE__ */ React.createElement(React.Fragment, null);
246
+ }
247
+ return /* @__PURE__ */ React.createElement(WithPluginManagerApp, managerState);
73
248
  };
74
249
  };
250
+ var WithPluginManagerApp = ({ fireEvents, pluginManager, setupEvents, storyId }) => {
251
+ useAsyncEffect(async () => {
252
+ await Promise.all(fireEvents?.map((event) => pluginManager.activate(event)) ?? []);
253
+ }, [
254
+ fireEvents,
255
+ pluginManager,
256
+ storyId
257
+ ]);
258
+ const App = useApp({
259
+ pluginManager,
260
+ setupEvents
261
+ });
262
+ return /* @__PURE__ */ React.createElement(App, null);
263
+ };
75
264
  var storyMeta = {
76
- id: "dxos.org/app-framework/story",
265
+ id: "org.dxos.app-framework.story",
77
266
  name: "Story"
78
267
  };
79
- var StoryPlugin = definePlugin(storyMeta, () => [
80
- defineModule({
81
- id: storyMeta.id,
82
- activatesOn: Events.Startup,
83
- activate: () => []
84
- })
85
- ]);
268
+ var StoryPlugin = plugin_exports.define(storyMeta).pipe(plugin_exports.addModule({
269
+ id: "Story",
270
+ activatesOn: activation_events_exports.Startup,
271
+ activate: () => Effect3.succeed([])
272
+ }), plugin_exports.make)();
86
273
  export {
274
+ createTestApp,
275
+ fromPlugins,
87
276
  setupPluginManager,
88
277
  withPluginManager
89
278
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../../src/testing/withPluginManager.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Decorator, type StoryContext } from '@storybook/react';\nimport React, { useEffect, useMemo } from 'react';\n\nimport { raise } from '@dxos/debug';\nimport { useAsyncEffect } from '@dxos/react-hooks';\nimport { type MaybeProvider, getProviderValue } from '@dxos/util';\n\nimport { Capabilities, Events } from '../common';\nimport { type UseAppOptions, useApp } from '../components';\nimport {\n type ActivationEvent,\n type AnyCapability,\n type PluginContext,\n PluginManager,\n contributes,\n defineModule,\n definePlugin,\n} from '../core';\n\n/**\n * @internal\n */\nexport const setupPluginManager = ({\n capabilities,\n plugins = [],\n core = plugins.map(({ meta }) => meta.id),\n ...options\n}: UseAppOptions & Pick<WithPluginManagerOptions, 'capabilities'> = {}) => {\n const pluginManager = new PluginManager({\n pluginLoader: () => raise(new Error('Not implemented')),\n plugins: [StoryPlugin(), ...plugins],\n core: [StoryPlugin.meta.id, ...core],\n ...options,\n });\n\n if (capabilities) {\n getProviderValue(capabilities, pluginManager.context).forEach((capability) => {\n pluginManager.context.contributeCapability({\n interface: capability.interface,\n implementation: capability.implementation,\n module: 'story',\n });\n });\n }\n\n return pluginManager;\n};\n\nexport type WithPluginManagerOptions = UseAppOptions & {\n /** @deprecated */\n capabilities?: MaybeProvider<AnyCapability[], PluginContext>;\n /** @deprecated */\n fireEvents?: (ActivationEvent | string)[];\n};\n\nexport type WithPluginManagerInitializer<Args = void> =\n | WithPluginManagerOptions\n | ((context: StoryContext<Args>) => WithPluginManagerOptions);\n\n/**\n * Wraps a story with a plugin manager.\n * NOTE: This builds up and tears down the plugin manager on every render.\n */\nexport const withPluginManager = <Args,>(init: WithPluginManagerInitializer<Args> = {}): Decorator => {\n return (Story, context) => {\n const options = typeof init === 'function' ? init(context as any) : init;\n const pluginManager = useMemo(() => setupPluginManager(options), [init]);\n\n // Set-up root capability.\n useEffect(() => {\n const capability = contributes(Capabilities.ReactRoot, {\n id: context.id,\n root: () => <Story />,\n });\n\n pluginManager.context.contributeCapability({\n ...capability,\n module: 'dxos.org/app-framework/withPluginManager',\n });\n\n return () => {\n pluginManager.context.removeCapability(capability.interface, capability.implementation);\n };\n }, [pluginManager, context]);\n\n // Fire events.\n useAsyncEffect(async () => {\n await Promise.all(options.fireEvents?.map((event) => pluginManager.activate(event)) ?? []);\n }, [pluginManager]);\n\n // Create app.\n const App = useApp({ pluginManager });\n\n return <App />;\n };\n};\n\nconst storyMeta = {\n id: 'dxos.org/app-framework/story',\n name: 'Story',\n};\n\n// No-op plugin to ensure there exists at least one plugin for the startup event.\n// This is necessary because `createApp` expects the startup event to complete before the app is ready.\nconst StoryPlugin = definePlugin(storyMeta, () => [\n defineModule({ id: storyMeta.id, activatesOn: Events.Startup, activate: () => [] }),\n]);\n"],
5
- "mappings": ";;;;;;;;;;;;;AAKA,OAAOA,SAASC,WAAWC,eAAe;AAE1C,SAASC,aAAa;AACtB,SAASC,sBAAsB;AAC/B,SAA6BC,wBAAwB;AAiB9C,IAAMC,qBAAqB,CAAC,EACjCC,cACAC,UAAU,CAAA,GACVC,OAAOD,QAAQE,IAAI,CAAC,EAAEC,KAAI,MAAOA,KAAKC,EAAE,GACxC,GAAGC,QAAAA,IAC+D,CAAC,MAAC;AACpE,QAAMC,gBAAgB,IAAIC,cAAc;IACtCC,cAAc,MAAMC,MAAM,IAAIC,MAAM,iBAAA,CAAA;IACpCV,SAAS;MAACW,YAAAA;SAAkBX;;IAC5BC,MAAM;MAACU,YAAYR,KAAKC;SAAOH;;IAC/B,GAAGI;EACL,CAAA;AAEA,MAAIN,cAAc;AAChBa,qBAAiBb,cAAcO,cAAcO,OAAO,EAAEC,QAAQ,CAACC,eAAAA;AAC7DT,oBAAcO,QAAQG,qBAAqB;QACzCC,WAAWF,WAAWE;QACtBC,gBAAgBH,WAAWG;QAC3BC,QAAQ;MACV,CAAA;IACF,CAAA;EACF;AAEA,SAAOb;AACT;AAiBO,IAAMc,oBAAoB,CAAQC,OAA2C,CAAC,MAAC;AACpF,SAAO,CAACC,OAAOT,YAAAA;AACb,UAAMR,UAAU,OAAOgB,SAAS,aAAaA,KAAKR,OAAAA,IAAkBQ;AACpE,UAAMf,gBAAgBiB,QAAQ,MAAMzB,mBAAmBO,OAAAA,GAAU;MAACgB;KAAK;AAGvEG,cAAU,MAAA;AACR,YAAMT,aAAaU,YAAYC,aAAaC,WAAW;QACrDvB,IAAIS,QAAQT;QACZwB,MAAM,MAAM,sBAAA,cAACN,OAAAA,IAAAA;MACf,CAAA;AAEAhB,oBAAcO,QAAQG,qBAAqB;QACzC,GAAGD;QACHI,QAAQ;MACV,CAAA;AAEA,aAAO,MAAA;AACLb,sBAAcO,QAAQgB,iBAAiBd,WAAWE,WAAWF,WAAWG,cAAc;MACxF;IACF,GAAG;MAACZ;MAAeO;KAAQ;AAG3BiB,mBAAe,YAAA;AACb,YAAMC,QAAQC,IAAI3B,QAAQ4B,YAAY/B,IAAI,CAACgC,UAAU5B,cAAc6B,SAASD,KAAAA,CAAAA,KAAW,CAAA,CAAE;IAC3F,GAAG;MAAC5B;KAAc;AAGlB,UAAM8B,MAAMC,OAAO;MAAE/B;IAAc,CAAA;AAEnC,WAAO,sBAAA,cAAC8B,KAAAA,IAAAA;EACV;AACF;AAEA,IAAME,YAAY;EAChBlC,IAAI;EACJmC,MAAM;AACR;AAIA,IAAM5B,cAAc6B,aAAaF,WAAW,MAAM;EAChDG,aAAa;IAAErC,IAAIkC,UAAUlC;IAAIsC,aAAaC,OAAOC;IAAST,UAAU,MAAM,CAAA;EAAG,CAAA;CAClF;",
6
- "names": ["React", "useEffect", "useMemo", "raise", "useAsyncEffect", "getProviderValue", "setupPluginManager", "capabilities", "plugins", "core", "map", "meta", "id", "options", "pluginManager", "PluginManager", "pluginLoader", "raise", "Error", "StoryPlugin", "getProviderValue", "context", "forEach", "capability", "contributeCapability", "interface", "implementation", "module", "withPluginManager", "init", "Story", "useMemo", "useEffect", "contributes", "Capabilities", "ReactRoot", "root", "removeCapability", "useAsyncEffect", "Promise", "all", "fireEvents", "event", "activate", "App", "useApp", "storyMeta", "name", "definePlugin", "defineModule", "activatesOn", "Events", "Startup"]
3
+ "sources": ["../../../../src/testing/harness.ts", "../../../../src/testing/service.ts", "../../../../src/testing/withPluginManager.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport { type Registry } from '@effect-atom/atom-react';\nimport * as Duration from 'effect/Duration';\nimport * as Effect from 'effect/Effect';\nimport * as PubSub from 'effect/PubSub';\nimport * as Queue from 'effect/Queue';\n\nimport { type Operation } from '@dxos/compute';\nimport { runAndForwardErrors } from '@dxos/effect';\nimport { invariant } from '@dxos/invariant';\n\nimport { ActivationEvents, Capabilities } from '../common';\nimport { ActivationEvent, type Capability, type CapabilityManager, type Plugin, PluginManager } from '../core';\n\nexport type TestAppOptions = {\n /** Plugins to register. */\n plugins: Plugin.Plugin[];\n /** Plugin ids that are always enabled. Defaults to all provided plugin ids. */\n core?: string[];\n /** Plugin ids that are enabled by default in addition to core. */\n enabled?: string[];\n /** Additional activation events fired alongside SetupReactSurface. */\n setupEvents?: ActivationEvent.ActivationEvent[];\n /**\n * Whether to automatically fire SetupReactSurface + Startup during setup.\n * Defaults to true.\n */\n autoStart?: boolean;\n /**\n * Whether to register the PluginManager + AtomRegistry framework capabilities.\n * Defaults to true.\n */\n registerFrameworkCapabilities?: boolean;\n};\n\n/**\n * A running plugin manager plus helpers for driving it in tests.\n */\nexport interface TestHarness {\n readonly manager: PluginManager.PluginManager;\n readonly capabilities: CapabilityManager.CapabilityManager;\n readonly registry: Registry.Registry;\n\n /** Activate the given event. Equivalent to `manager.activate(event)`. */\n fire(event: ActivationEvent.ActivationEvent | string): Promise<boolean>;\n /** Re-activate all modules that were activated by the given event. */\n reset(event: ActivationEvent.ActivationEvent | string): Promise<boolean>;\n\n /** Returns the first contributed capability for the given interface. Throws if none are present. */\n get<T>(iface: Capability.InterfaceDef<T>): T;\n /** Returns all contributed capabilities for the given interface. */\n getAll<T>(iface: Capability.InterfaceDef<T>): T[];\n /** Waits until at least one capability is contributed for the given interface. */\n waitForCapability<T>(iface: Capability.InterfaceDef<T>, opts?: { timeout?: number }): Promise<T>;\n /** Waits until the given activation event has completed. */\n waitForEvent(event: ActivationEvent.ActivationEvent | string, opts?: { timeout?: number }): Promise<void>;\n\n /** Invokes an operation through the `Capabilities.OperationInvoker` capability. */\n invoke<I, O>(op: Operation.Definition<I, O>, ...args: void extends I ? [input?: I] : [input: I]): Promise<O>;\n\n enable(id: string): Promise<boolean>;\n disable(id: string): Promise<boolean>;\n\n /** Shuts down the underlying plugin manager. */\n dispose(): Promise<void>;\n\n /** Async-disposable support so tests can use `await using harness = ...`. */\n [Symbol.asyncDispose](): Promise<void>;\n}\n\nconst DEFAULT_TIMEOUT_MS = 5_000;\n\n/**\n * Creates a TestHarness with the same bootstrap sequence that `useApp` performs,\n * minus the React provider tree.\n *\n * For Node-only tests, this is enough to fire activation events, read\n * capabilities, and invoke operations.\n *\n * For React tests, pass the returned harness to `render` or `renderSurface`\n * from `@dxos/app-framework/testing-react`.\n */\nexport const createTestApp = async (opts: TestAppOptions): Promise<TestHarness> => {\n const {\n plugins,\n core = plugins.map((plugin) => plugin.meta.id),\n enabled,\n setupEvents = [],\n autoStart = true,\n registerFrameworkCapabilities = true,\n } = opts;\n\n const pluginLoader = (id: string) =>\n Effect.sync(() => {\n const plugin = plugins.find((plugin) => plugin.meta.id === id);\n invariant(plugin, `Plugin not found: ${id}`);\n return { plugin };\n });\n\n const manager = PluginManager.make({ pluginLoader, plugins, core, enabled });\n\n if (registerFrameworkCapabilities) {\n manager.capabilities.contribute({\n interface: Capabilities.PluginManager,\n implementation: manager,\n module: 'org.dxos.app-framework.plugin-manager',\n });\n manager.capabilities.contribute({\n interface: Capabilities.AtomRegistry,\n implementation: manager.registry,\n module: 'org.dxos.app-framework.atom-registry',\n });\n }\n\n if (autoStart) {\n try {\n await runAndForwardErrors(\n Effect.all([\n ...setupEvents.map((event) => manager.activate(event)),\n manager.activate(ActivationEvents.SetupReactSurface),\n manager.activate(ActivationEvents.Startup),\n ]),\n );\n } catch (err) {\n await runAndForwardErrors(manager.shutdown()).catch(() => undefined);\n throw err;\n }\n }\n\n return new TestHarnessImpl(manager);\n};\n\nclass TestHarnessImpl implements TestHarness {\n constructor(readonly manager: PluginManager.PluginManager) {}\n\n get capabilities(): CapabilityManager.CapabilityManager {\n return this.manager.capabilities;\n }\n\n get registry(): Registry.Registry {\n return this.manager.registry;\n }\n\n fire(event: ActivationEvent.ActivationEvent | string): Promise<boolean> {\n return runAndForwardErrors(this.manager.activate(event));\n }\n\n reset(event: ActivationEvent.ActivationEvent | string): Promise<boolean> {\n return runAndForwardErrors(this.manager.reset(event));\n }\n\n get<T>(iface: Capability.InterfaceDef<T>): T {\n return this.manager.capabilities.get(iface);\n }\n\n getAll<T>(iface: Capability.InterfaceDef<T>): T[] {\n return this.manager.capabilities.getAll(iface);\n }\n\n waitForCapability<T>(iface: Capability.InterfaceDef<T>, opts?: { timeout?: number }): Promise<T> {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT_MS;\n return runAndForwardErrors(\n this.manager.capabilities.waitFor(iface).pipe(\n Effect.timeoutFail({\n duration: Duration.millis(timeout),\n onTimeout: () => timeoutError(iface.identifier),\n }),\n ),\n );\n }\n\n waitForEvent(event: ActivationEvent.ActivationEvent | string, opts?: { timeout?: number }): Promise<void> {\n const key = typeof event === 'string' ? event : ActivationEvent.eventKey(event);\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT_MS;\n\n const program = Effect.gen(this, function* () {\n const queue = yield* PubSub.subscribe(this.manager.activation);\n // Re-check after subscribing to avoid a race where the event fires\n // between the caller invoking this and the subscription being installed.\n if (this.manager.getEventsFired().includes(key)) {\n return;\n }\n while (true) {\n const message = yield* Queue.take(queue);\n if (message.event === key && message.state === 'activated') {\n return;\n }\n }\n }).pipe(\n Effect.scoped,\n Effect.timeoutFail({\n duration: Duration.millis(timeout),\n onTimeout: () => timeoutError(key),\n }),\n );\n\n return runAndForwardErrors(program);\n }\n\n async invoke<I, O>(op: Operation.Definition<I, O>, ...args: [input?: I]): Promise<O> {\n const invoker = await this.waitForCapability(Capabilities.OperationInvoker);\n const result = await invoker.invokePromise(op as any, ...(args as [any]));\n if (result.error) {\n throw result.error;\n }\n return result.data as O;\n }\n\n enable(id: string): Promise<boolean> {\n return runAndForwardErrors(this.manager.enable(id));\n }\n\n disable(id: string): Promise<boolean> {\n return runAndForwardErrors(this.manager.disable(id));\n }\n\n async dispose(): Promise<void> {\n await runAndForwardErrors(this.manager.shutdown());\n }\n\n [Symbol.asyncDispose](): Promise<void> {\n return this.dispose();\n }\n}\n\nconst timeoutError = (id: string) => new Error(`Timed out waiting for ${id}`);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\n\nimport { invariant } from '@dxos/invariant';\n\nimport { ActivationEvents, Capabilities } from '../common';\nimport { Plugin, PluginManager } from '../core';\n\n/**\n * Creates a Plugin.Service layer from a list of plugins.\n * This is primarily used for testing.\n */\nexport const fromPlugins = (plugins: Plugin.Plugin[]) =>\n Layer.effect(\n Plugin.Service,\n Effect.gen(function* () {\n // TODO(wittjosiah): Try to dedupe logic between here, createCliApp and useApp.\n\n const pluginLoader = (id: string) =>\n Effect.sync(() => {\n const plugin = plugins.find((plugin) => plugin.meta.id === id);\n invariant(plugin, `Plugin not found: ${id}`);\n return { plugin };\n });\n\n const manager = PluginManager.make({\n pluginLoader,\n plugins,\n core: plugins.map((plugin) => plugin.meta.id),\n });\n\n manager.capabilities.contribute({\n interface: Capabilities.PluginManager,\n implementation: manager,\n module: 'org.dxos.app-framework.plugin-manager',\n });\n\n manager.capabilities.contribute({\n interface: Capabilities.AtomRegistry,\n implementation: manager.registry,\n module: 'org.dxos.app-framework.atom-registry',\n });\n\n yield* manager.activate(ActivationEvents.Startup);\n\n return manager;\n }),\n );\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Decorator, type StoryContext } from '@storybook/react';\nimport * as Effect from 'effect/Effect';\nimport React, { useEffect, useState } from 'react';\n\nimport { raise } from '@dxos/debug';\nimport { runAndForwardErrors } from '@dxos/effect';\nimport { useAsyncEffect } from '@dxos/react-hooks';\nimport { type MaybeProvider, getProviderValue } from '@dxos/util';\n\nimport { ActivationEvents, Capabilities } from '../common';\nimport { type ActivationEvent, Capability, type CapabilityManager, Plugin, PluginManager } from '../core';\nimport { type UseAppOptions, useApp } from '../ui';\n\n/**\n * @internal\n */\nexport const setupPluginManager = ({\n capabilities,\n plugins = [],\n core = plugins.map(({ meta }) => meta.id),\n ...options\n}: UseAppOptions & Pick<WithPluginManagerOptions, 'capabilities'> = {}) => {\n const pluginManager = PluginManager.make({\n pluginLoader: () => raise(new Error('Not implemented')),\n plugins: [StoryPlugin, ...plugins],\n core: [StoryPlugin.meta.id, ...core],\n ...options,\n });\n\n if (capabilities) {\n getProviderValue(capabilities, pluginManager.capabilities).forEach((capability) => {\n pluginManager.capabilities.contribute({\n interface: capability.interface,\n implementation: capability.implementation,\n module: 'story',\n });\n });\n }\n\n return pluginManager;\n};\n\ntype ManagedPluginManagerState = {\n fireEvents?: (ActivationEvent.ActivationEvent | string)[];\n pluginManager: PluginManager.PluginManager;\n setupEvents?: ActivationEvent.ActivationEvent[];\n storyId: string;\n};\n\nexport type WithPluginManagerOptions = UseAppOptions & {\n /** @deprecated */\n capabilities?: MaybeProvider<Capability.Any[], CapabilityManager.CapabilityManager>;\n /** @deprecated */\n fireEvents?: (ActivationEvent.ActivationEvent | string)[];\n};\n\nexport type WithPluginManagerInitializer<Args = void> =\n | WithPluginManagerOptions\n | ((context: StoryContext<Args>) => WithPluginManagerOptions);\n\n/**\n * Wraps a story with a plugin manager.\n * NOTE: This builds up and tears down the plugin manager on every render.\n */\nexport const withPluginManager = <Args,>(init: WithPluginManagerInitializer<Args> = {}): Decorator => {\n return (Story, context) => {\n const storyId = context.id;\n const options = typeof init === 'function' ? init(context as any) : init;\n const [managerState, setManagerState] = useState<ManagedPluginManagerState>();\n\n // Storybook replaces the full context object often, so key manager ownership by story id.\n useEffect(() => {\n const pluginManager = setupPluginManager(options);\n const capability = Capability.contributes(Capabilities.ReactRoot, {\n id: storyId,\n root: () => <Story />,\n });\n\n pluginManager.capabilities.contribute({\n ...capability,\n module: 'org.dxos.app-framework.with-plugin-manager',\n });\n\n setManagerState({\n pluginManager,\n setupEvents: options.setupEvents,\n fireEvents: options.fireEvents,\n storyId,\n });\n\n return () => {\n pluginManager.capabilities.remove(capability.interface, capability.implementation);\n void runAndForwardErrors(pluginManager.shutdown());\n };\n }, [storyId, init]);\n\n // Avoid mounting useApp with a stale manager from the previous story.\n if (!managerState || managerState.storyId !== storyId) {\n return <></>;\n }\n\n return <WithPluginManagerApp {...managerState} />;\n };\n};\n\nconst WithPluginManagerApp = ({ fireEvents, pluginManager, setupEvents, storyId }: ManagedPluginManagerState) => {\n // Fire deprecated events only after the effect-owned manager for this story exists.\n useAsyncEffect(async () => {\n await Promise.all(fireEvents?.map((event) => pluginManager.activate(event)) ?? []);\n }, [fireEvents, pluginManager, storyId]);\n\n const App = useApp({ pluginManager, setupEvents });\n return <App />;\n};\n\nconst storyMeta = {\n id: 'org.dxos.app-framework.story',\n name: 'Story',\n};\n\n// No-op plugin to ensure there exists at least one plugin for the startup event.\n// This is necessary because `createApp` expects the startup event to complete before the app is ready.\nconst StoryPlugin = Plugin.define(storyMeta).pipe(\n Plugin.addModule({\n id: 'Story',\n activatesOn: ActivationEvents.Startup,\n activate: () => Effect.succeed([]),\n }),\n Plugin.make,\n)();\n"],
5
+ "mappings": "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",
6
+ "names": ["Duration", "Effect", "PubSub", "Queue", "runAndForwardErrors", "invariant", "DEFAULT_TIMEOUT_MS", "pluginLoader", "Effect", "sync", "plugin", "plugins", "find", "meta", "id", "manager", "core", "enabled", "registerFrameworkCapabilities", "PluginManager", "implementation", "module", "capabilities", "registry", "autoStart", "runAndForwardErrors", "ActivationEvents", "activate", "Startup", "err", "TestHarnessImpl", "fire", "reset", "iface", "getAll", "waitForCapability", "duration", "Duration", "timeout", "onTimeout", "timeoutError", "identifier", "waitForEvent", "opts", "program", "queue", "subscribe", "message", "key", "invoke", "result", "invoker", "error", "data", "enable", "disable", "dispose", "Symbol", "asyncDispose", "Effect", "Layer", "invariant", "__dxlog_file", "pluginLoader", "id", "plugin", "manager", "plugins", "core", "capabilities", "contribute", "implementation", "module", "registry", "Effect", "React", "useEffect", "useState", "raise", "runAndForwardErrors", "useAsyncEffect", "getProviderValue", "setupPluginManager", "capabilities", "plugins", "core", "map", "meta", "id", "options", "pluginManager", "PluginManager", "make", "pluginLoader", "raise", "Error", "StoryPlugin", "getProviderValue", "forEach", "capability", "contribute", "interface", "implementation", "module", "withPluginManager", "init", "Story", "context", "storyId", "managerState", "setManagerState", "useState", "useEffect", "Capability", "contributes", "Capabilities", "ReactRoot", "root", "setupEvents", "fireEvents", "remove", "runAndForwardErrors", "shutdown", "WithPluginManagerApp", "useAsyncEffect", "Promise", "all", "event", "activate", "App", "useApp", "storyMeta", "name", "Plugin", "define", "pipe", "addModule", "activatesOn", "ActivationEvents", "Startup", "succeed"]
7
7
  }
@@ -0,0 +1,78 @@
1
+ import {
2
+ PluginManagerProvider,
3
+ SurfaceComponent,
4
+ topologicalSort
5
+ } from "../chunk-7VZJR2OA.mjs";
6
+ import {
7
+ PluginManagerContext
8
+ } from "../chunk-FJ4765WW.mjs";
9
+ import "../chunk-23D4SJUE.mjs";
10
+ import {
11
+ capabilities_exports
12
+ } from "../chunk-WBHCSOBW.mjs";
13
+ import "../chunk-45CHLTBV.mjs";
14
+ import "../chunk-FO3IYSLV.mjs";
15
+ import "../chunk-6GZYCP73.mjs";
16
+ import "../chunk-J43JDWAV.mjs";
17
+ import "../chunk-66IXTIVK.mjs";
18
+ import "../chunk-G6Q2M2M5.mjs";
19
+ import "../chunk-3JWJXGLK.mjs";
20
+ import "../chunk-J5LGTIGS.mjs";
21
+
22
+ // src/testing/react.tsx
23
+ import { RegistryContext } from "@effect-atom/atom-react";
24
+ import { render as rtlRender } from "@testing-library/react";
25
+ import React, { Fragment } from "react";
26
+ import { ContextProtocolProvider } from "@dxos/web-context-react";
27
+ var render = (harness, ui, options) => {
28
+ const { reactContexts = [], ...rest } = options ?? {};
29
+ const Wrapper = ({ children }) => /* @__PURE__ */ React.createElement(HarnessProviders, {
30
+ harness,
31
+ extra: reactContexts
32
+ }, children);
33
+ return rtlRender(/* @__PURE__ */ React.createElement(React.Fragment, null, ui), {
34
+ ...rest,
35
+ wrapper: Wrapper
36
+ });
37
+ };
38
+ var renderSurface = (harness, props, options) => {
39
+ const { role, data, limit, fallback, placeholder } = props;
40
+ return render(harness, /* @__PURE__ */ React.createElement(SurfaceComponent, {
41
+ role,
42
+ data,
43
+ limit,
44
+ fallback,
45
+ placeholder
46
+ }), options);
47
+ };
48
+ var HarnessProviders = ({ harness, extra, children }) => {
49
+ const contributed = harness.getAll(capabilities_exports.ReactContext);
50
+ const ContributedContext = composeContexts(contributed);
51
+ const ExtraContext = composeExtra(extra);
52
+ return /* @__PURE__ */ React.createElement(PluginManagerProvider, {
53
+ value: harness.manager
54
+ }, /* @__PURE__ */ React.createElement(ContextProtocolProvider, {
55
+ value: harness.manager,
56
+ context: PluginManagerContext
57
+ }, /* @__PURE__ */ React.createElement(RegistryContext.Provider, {
58
+ value: harness.registry
59
+ }, /* @__PURE__ */ React.createElement(ContributedContext, null, /* @__PURE__ */ React.createElement(ExtraContext, null, children)))));
60
+ };
61
+ var composeContexts = (contexts) => {
62
+ if (contexts.length === 0) {
63
+ return Passthrough;
64
+ }
65
+ return topologicalSort(contexts).map(({ context }) => context).reduce((Acc, Next) => ({ children }) => /* @__PURE__ */ React.createElement(Acc, null, /* @__PURE__ */ React.createElement(Next, null, children)));
66
+ };
67
+ var composeExtra = (contexts) => {
68
+ if (contexts.length === 0) {
69
+ return Passthrough;
70
+ }
71
+ return contexts.reduce((Acc, Next) => ({ children }) => /* @__PURE__ */ React.createElement(Next, null, /* @__PURE__ */ React.createElement(Acc, null, children)), Passthrough);
72
+ };
73
+ var Passthrough = ({ children }) => /* @__PURE__ */ React.createElement(Fragment, null, children);
74
+ export {
75
+ render,
76
+ renderSurface
77
+ };
78
+ //# sourceMappingURL=react.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/testing/react.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport { RegistryContext } from '@effect-atom/atom-react';\nimport { render as rtlRender, type RenderOptions, type RenderResult } from '@testing-library/react';\nimport React, { type FC, Fragment, type PropsWithChildren, type ReactNode } from 'react';\n\nimport { ContextProtocolProvider } from '@dxos/web-context-react';\n\nimport { Capabilities } from '../common';\nimport { PluginManagerContext } from '../context';\nimport { topologicalSort } from '../helpers';\nimport { PluginManagerProvider } from '../ui/components/PluginManager/PluginManagerProvider';\nimport { SurfaceComponent } from '../ui/components/Surface/SurfaceComponent';\nimport { type TestHarness } from './harness';\n\nexport type HarnessRenderOptions = Omit<RenderOptions, 'wrapper'> & {\n /** Additional providers to wrap around the harness tree (applied innermost first). */\n reactContexts?: FC<PropsWithChildren>[];\n};\n\n/**\n * Renders `ui` wrapped in the same provider tree as `useApp` plus every contributed\n * `Capabilities.ReactContext`.\n */\nexport const render = (harness: TestHarness, ui: ReactNode, options?: HarnessRenderOptions): RenderResult => {\n const { reactContexts = [], ...rest } = options ?? {};\n const Wrapper = ({ children }: PropsWithChildren) => (\n <HarnessProviders harness={harness} extra={reactContexts}>\n {children}\n </HarnessProviders>\n );\n return rtlRender(<>{ui}</>, { ...rest, wrapper: Wrapper });\n};\n\nexport type RenderSurfaceProps = {\n role: string;\n data?: unknown;\n limit?: number;\n fallback?: FC<{ error: Error; data?: any }>;\n placeholder?: ReactNode;\n};\n\n/**\n * Renders a `Surface` with the given role/data inside the harness provider tree.\n */\nexport const renderSurface = (\n harness: TestHarness,\n props: RenderSurfaceProps,\n options?: HarnessRenderOptions,\n): RenderResult => {\n const { role, data, limit, fallback, placeholder } = props;\n return render(\n harness,\n <SurfaceComponent role={role} data={data as any} limit={limit} fallback={fallback} placeholder={placeholder} />,\n options,\n );\n};\n\ntype HarnessProvidersProps = PropsWithChildren<{\n harness: TestHarness;\n extra: FC<PropsWithChildren>[];\n}>;\n\nconst HarnessProviders = ({ harness, extra, children }: HarnessProvidersProps) => {\n const contributed = harness.getAll(Capabilities.ReactContext);\n const ContributedContext = composeContexts(contributed);\n const ExtraContext = composeExtra(extra);\n return (\n <PluginManagerProvider value={harness.manager}>\n <ContextProtocolProvider value={harness.manager} context={PluginManagerContext}>\n <RegistryContext.Provider value={harness.registry}>\n <ContributedContext>\n <ExtraContext>{children}</ExtraContext>\n </ContributedContext>\n </RegistryContext.Provider>\n </ContextProtocolProvider>\n </PluginManagerProvider>\n );\n};\n\nconst composeContexts = (contexts: Capabilities.ReactContext[]): FC<PropsWithChildren> => {\n if (contexts.length === 0) {\n return Passthrough;\n }\n return topologicalSort(contexts)\n .map(({ context }) => context)\n .reduce((Acc, Next) => ({ children }: PropsWithChildren) => (\n <Acc>\n <Next>{children}</Next>\n </Acc>\n ));\n};\n\n// Composes in innermost-first order: the first context in the array wraps\n// `children` directly; subsequent contexts wrap the accumulator.\nconst composeExtra = (contexts: FC<PropsWithChildren>[]): FC<PropsWithChildren> => {\n if (contexts.length === 0) {\n return Passthrough;\n }\n return contexts.reduce<FC<PropsWithChildren>>(\n (Acc, Next) =>\n ({ children }: PropsWithChildren) => (\n <Next>\n <Acc>{children}</Acc>\n </Next>\n ),\n Passthrough,\n );\n};\n\nconst Passthrough: FC<PropsWithChildren> = ({ children }) => <Fragment>{children}</Fragment>;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;AAIA,SAASA,uBAAuB;AAChC,SAASC,UAAUC,iBAAwD;AAC3E,OAAOC,SAAkBC,gBAAwD;AAEjF,SAASC,+BAA+B;AAkBjC,IAAMC,SAAS,CAACC,SAAsBC,IAAeC,YAAAA;AAC1D,QAAM,EAAEC,gBAAgB,CAAA,GAAI,GAAGC,KAAAA,IAASF,WAAW,CAAC;AACpD,QAAMG,UAAU,CAAC,EAAEC,SAAQ,MACzB,sBAAA,cAACC,kBAAAA;IAAiBP;IAAkBQ,OAAOL;KACxCG,QAAAA;AAGL,SAAOG,UAAU,sBAAA,cAAA,MAAA,UAAA,MAAGR,EAAAA,GAAQ;IAAE,GAAGG;IAAMM,SAASL;EAAQ,CAAA;AAC1D;AAaO,IAAMM,gBAAgB,CAC3BX,SACAY,OACAV,YAAAA;AAEA,QAAM,EAAEW,MAAMC,MAAMC,OAAOC,UAAUC,YAAW,IAAKL;AACrD,SAAOb,OACLC,SACA,sBAAA,cAACkB,kBAAAA;IAAiBL;IAAYC;IAAmBC;IAAcC;IAAoBC;MACnFf,OAAAA;AAEJ;AAOA,IAAMK,mBAAmB,CAAC,EAAEP,SAASQ,OAAOF,SAAQ,MAAyB;AAC3E,QAAMa,cAAcnB,QAAQoB,OAAOC,qBAAaC,YAAY;AAC5D,QAAMC,qBAAqBC,gBAAgBL,WAAAA;AAC3C,QAAMM,eAAeC,aAAalB,KAAAA;AAClC,SACE,sBAAA,cAACmB,uBAAAA;IAAsBC,OAAO5B,QAAQ6B;KACpC,sBAAA,cAACC,yBAAAA;IAAwBF,OAAO5B,QAAQ6B;IAASE,SAASC;KACxD,sBAAA,cAACC,gBAAgBC,UAAQ;IAACN,OAAO5B,QAAQmC;KACvC,sBAAA,cAACZ,oBAAAA,MACC,sBAAA,cAACE,cAAAA,MAAcnB,QAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AAM3B;AAEA,IAAMkB,kBAAkB,CAACY,aAAAA;AACvB,MAAIA,SAASC,WAAW,GAAG;AACzB,WAAOC;EACT;AACA,SAAOC,gBAAgBH,QAAAA,EACpBI,IAAI,CAAC,EAAET,QAAO,MAAOA,OAAAA,EACrBU,OAAO,CAACC,KAAKC,SAAS,CAAC,EAAErC,SAAQ,MAChC,sBAAA,cAACoC,KAAAA,MACC,sBAAA,cAACC,MAAAA,MAAMrC,QAAAA,CAAAA,CAAAA;AAGf;AAIA,IAAMoB,eAAe,CAACU,aAAAA;AACpB,MAAIA,SAASC,WAAW,GAAG;AACzB,WAAOC;EACT;AACA,SAAOF,SAASK,OACd,CAACC,KAAKC,SACJ,CAAC,EAAErC,SAAQ,MACT,sBAAA,cAACqC,MAAAA,MACC,sBAAA,cAACD,KAAAA,MAAKpC,QAAAA,CAAAA,GAGZgC,WAAAA;AAEJ;AAEA,IAAMA,cAAqC,CAAC,EAAEhC,SAAQ,MAAO,sBAAA,cAACsC,UAAAA,MAAUtC,QAAAA;",
6
+ "names": ["RegistryContext", "render", "rtlRender", "React", "Fragment", "ContextProtocolProvider", "render", "harness", "ui", "options", "reactContexts", "rest", "Wrapper", "children", "HarnessProviders", "extra", "rtlRender", "wrapper", "renderSurface", "props", "role", "data", "limit", "fallback", "placeholder", "SurfaceComponent", "contributed", "getAll", "Capabilities", "ReactContext", "ContributedContext", "composeContexts", "ExtraContext", "composeExtra", "PluginManagerProvider", "value", "manager", "ContextProtocolProvider", "context", "PluginManagerContext", "RegistryContext", "Provider", "registry", "contexts", "length", "Passthrough", "topologicalSort", "map", "reduce", "Acc", "Next", "Fragment"]
7
+ }
@@ -0,0 +1,48 @@
1
+ import {
2
+ App,
3
+ LoadingState,
4
+ Placeholder,
5
+ useApp,
6
+ useAtomCapability,
7
+ useAtomCapabilityState,
8
+ useCapabilities,
9
+ useCapability,
10
+ useLoading,
11
+ useOperationInvoker,
12
+ useSettingsState
13
+ } from "../chunk-XLYULXAO.mjs";
14
+ import {
15
+ PluginManagerProvider,
16
+ Surface,
17
+ usePluginManager,
18
+ useSurface
19
+ } from "../chunk-7VZJR2OA.mjs";
20
+ import "../chunk-FJ4765WW.mjs";
21
+ import "../chunk-23D4SJUE.mjs";
22
+ import "../chunk-WBHCSOBW.mjs";
23
+ import "../chunk-45CHLTBV.mjs";
24
+ import "../chunk-FO3IYSLV.mjs";
25
+ import "../chunk-6GZYCP73.mjs";
26
+ import "../chunk-J43JDWAV.mjs";
27
+ import "../chunk-66IXTIVK.mjs";
28
+ import "../chunk-G6Q2M2M5.mjs";
29
+ import "../chunk-3JWJXGLK.mjs";
30
+ import "../chunk-J5LGTIGS.mjs";
31
+ export {
32
+ App,
33
+ LoadingState,
34
+ Placeholder,
35
+ PluginManagerProvider,
36
+ Surface,
37
+ useApp,
38
+ useAtomCapability,
39
+ useAtomCapabilityState,
40
+ useCapabilities,
41
+ useCapability,
42
+ useLoading,
43
+ useOperationInvoker,
44
+ usePluginManager,
45
+ useSettingsState,
46
+ useSurface
47
+ };
48
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,39 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import "./chunk-SBS2YMPT.mjs";
3
+ import {
4
+ capabilities_exports
5
+ } from "./chunk-WFSRZKBP.mjs";
6
+ import {
7
+ activation_events_exports
8
+ } from "./chunk-6XW6LET6.mjs";
9
+ import "./chunk-WK7OIQKI.mjs";
10
+ import "./chunk-4RJL37GN.mjs";
11
+ import "./chunk-DW45NFLW.mjs";
12
+ import "./chunk-XOCUANHO.mjs";
13
+ import {
14
+ plugin_exports
15
+ } from "./chunk-KIFOQXD4.mjs";
16
+ import {
17
+ capability_exports
18
+ } from "./chunk-SDJ4B2LU.mjs";
19
+ import "./chunk-HSLMI22Q.mjs";
20
+
21
+ // src/plugin-runtime/capability.ts
22
+ import * as Effect from "effect/Effect";
23
+ import * as Layer from "effect/Layer";
24
+ import * as ManagedRuntime from "effect/ManagedRuntime";
25
+ var capability_default = capability_exports.makeModule(Effect.fnUntraced(function* () {
26
+ const capabilityManager = yield* capability_exports.Service;
27
+ const pluginManager = yield* plugin_exports.Service;
28
+ yield* plugin_exports.activate(activation_events_exports.SetupLayer);
29
+ const layers = yield* capability_exports.getAll(capabilities_exports.Layer);
30
+ const capabilityServiceLayer = Layer.succeed(capability_exports.Service, capabilityManager);
31
+ const pluginServiceLayer = Layer.succeed(plugin_exports.Service, pluginManager);
32
+ const composedLayer = layers.length > 0 ? Layer.mergeAll(capabilityServiceLayer, pluginServiceLayer, ...layers) : Layer.mergeAll(capabilityServiceLayer, pluginServiceLayer);
33
+ const runtime = ManagedRuntime.make(composedLayer);
34
+ return capability_exports.contributes(capabilities_exports.ManagedRuntime, runtime);
35
+ }));
36
+ export {
37
+ capability_default as default
38
+ };
39
+ //# sourceMappingURL=capability-GS3XJH74.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/plugin-runtime/capability.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\nimport * as ManagedRuntime from 'effect/ManagedRuntime';\n\nimport { ActivationEvents, Capabilities } from '../common';\nimport { Capability, Plugin } from '../core';\n\n//\n// Capability Module\n//\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n // Get the CapabilityManager to create a layer for it.\n const capabilityManager = yield* Capability.Service;\n\n // Get the PluginManager to create a layer for it.\n const pluginManager = yield* Plugin.Service;\n\n // Trigger setup event so plugins can contribute their layers.\n yield* Plugin.activate(ActivationEvents.SetupLayer);\n\n // Gather all contributed layers.\n const layers = yield* Capability.getAll(Capabilities.Layer);\n\n // Create layers that provide Capability.Service and Plugin.Service.\n const capabilityServiceLayer = Layer.succeed(Capability.Service, capabilityManager);\n const pluginServiceLayer = Layer.succeed(Plugin.Service, pluginManager);\n\n // Merge all layers including service layers.\n // Layer.mergeAll requires a tuple type, so we use a cast for dynamic arrays.\n const composedLayer =\n layers.length > 0\n ? (Layer.mergeAll as (...args: Layer.Layer<any, any, any>[]) => Layer.Layer<any, any, never>)(\n capabilityServiceLayer,\n pluginServiceLayer,\n ...layers,\n )\n : (Layer.mergeAll as (...args: Layer.Layer<any, any, any>[]) => Layer.Layer<any, any, never>)(\n capabilityServiceLayer,\n pluginServiceLayer,\n );\n\n // Create the managed runtime from the composed layer.\n const runtime = ManagedRuntime.make(composedLayer) as Capabilities.ManagedRuntime;\n\n return Capability.contributes(Capabilities.ManagedRuntime, runtime);\n }),\n);\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;AAIA,YAAYA,YAAY;AACxB,YAAYC,WAAW;AACvB,YAAYC,oBAAoB;AAShC,IAAA,qBAAeC,mBAAWC,WACjBC,kBAAW,aAAA;AAEhB,QAAMC,oBAAoB,OAAOH,mBAAWI;AAG5C,QAAMC,gBAAgB,OAAOC,eAAOF;AAGpC,SAAOE,eAAOC,SAASC,0BAAiBC,UAAU;AAGlD,QAAMC,SAAS,OAAOV,mBAAWW,OAAOC,qBAAaC,KAAK;AAG1D,QAAMC,yBAA+BC,cAAQf,mBAAWI,SAASD,iBAAAA;AACjE,QAAMa,qBAA2BD,cAAQT,eAAOF,SAASC,aAAAA;AAIzD,QAAMY,gBACJP,OAAOQ,SAAS,IACLC,eACLL,wBACAE,oBAAAA,GACGN,MAAAA,IAEES,eACLL,wBACAE,kBAAAA;AAIR,QAAMI,UAAyBC,oBAAKJ,aAAAA;AAEpC,SAAOjB,mBAAWsB,YAAYV,qBAAaW,gBAAgBH,OAAAA;AAC7D,CAAA,CAAA;",
6
+ "names": ["Effect", "Layer", "ManagedRuntime", "Capability", "makeModule", "fnUntraced", "capabilityManager", "Service", "pluginManager", "Plugin", "activate", "ActivationEvents", "SetupLayer", "layers", "getAll", "Capabilities", "Layer", "capabilityServiceLayer", "succeed", "pluginServiceLayer", "composedLayer", "length", "mergeAll", "runtime", "make", "contributes", "ManagedRuntime"]
7
+ }
@@ -0,0 +1,36 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ make,
4
+ make2
5
+ } from "./chunk-D347W3KO.mjs";
6
+ import "./chunk-SBS2YMPT.mjs";
7
+ import {
8
+ capabilities_exports
9
+ } from "./chunk-WFSRZKBP.mjs";
10
+ import "./chunk-6XW6LET6.mjs";
11
+ import "./chunk-WK7OIQKI.mjs";
12
+ import "./chunk-4RJL37GN.mjs";
13
+ import "./chunk-DW45NFLW.mjs";
14
+ import "./chunk-XOCUANHO.mjs";
15
+ import "./chunk-KIFOQXD4.mjs";
16
+ import {
17
+ capability_exports
18
+ } from "./chunk-SDJ4B2LU.mjs";
19
+ import "./chunk-HSLMI22Q.mjs";
20
+
21
+ // src/plugin-operation/history/capability.ts
22
+ import * as Effect from "effect/Effect";
23
+ var capability_default = capability_exports.makeModule(Effect.fnUntraced(function* () {
24
+ const capabilities = yield* capability_exports.Service;
25
+ const undoRegistry = make(() => capabilities.getAll(capabilities_exports.UndoMapping).flat());
26
+ const invoker = yield* capability_exports.get(capabilities_exports.OperationInvoker);
27
+ const historyTracker = make2(invoker, undoRegistry);
28
+ return [
29
+ capability_exports.contributes(capabilities_exports.UndoRegistry, undoRegistry),
30
+ capability_exports.contributes(capabilities_exports.HistoryTracker, historyTracker)
31
+ ];
32
+ }));
33
+ export {
34
+ capability_default as default
35
+ };
36
+ //# sourceMappingURL=capability-I5P7ACFL.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/plugin-operation/history/capability.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { OperationInvoker } from '@dxos/operation';\n\nimport { Capabilities } from '../../common';\nimport { Capability } from '../../core';\nimport * as HistoryTracker from './history-tracker';\nimport * as UndoRegistry from './undo-registry';\n\n//\n// Capability Module - contributes both UndoRegistry and HistoryTracker.\n//\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n // Get the context for synchronous access in callbacks.\n const capabilities = yield* Capability.Service;\n\n // Create UndoRegistry.\n const undoRegistry = UndoRegistry.make(() => capabilities.getAll(Capabilities.UndoMapping).flat());\n\n // Create HistoryTracker (depends on UndoRegistry and OperationInvoker).\n const invoker = yield* Capability.get(Capabilities.OperationInvoker);\n // Cast to internal type - the factory always returns OperationInvokerInternal.\n const historyTracker = HistoryTracker.make(invoker as OperationInvoker.OperationInvokerInternal, undoRegistry);\n\n return [\n Capability.contributes(Capabilities.UndoRegistry, undoRegistry),\n Capability.contributes(Capabilities.HistoryTracker, historyTracker),\n ];\n }),\n);\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;AAIA,YAAYA,YAAY;AAaxB,IAAA,qBAAeC,mBAAWC,WACjBC,kBAAW,aAAA;AAEhB,QAAMC,eAAe,OAAOH,mBAAWI;AAGvC,QAAMC,eAA4BC,KAAK,MAAMH,aAAaI,OAAOC,qBAAaC,WAAW,EAAEC,KAAI,CAAA;AAG/F,QAAMC,UAAU,OAAOX,mBAAWY,IAAIJ,qBAAaK,gBAAgB;AAEnE,QAAMC,iBAAgCR,MAAKK,SAAsDN,YAAAA;AAEjG,SAAO;IACLL,mBAAWe,YAAYP,qBAAaQ,cAAcX,YAAAA;IAClDL,mBAAWe,YAAYP,qBAAaS,gBAAgBH,cAAAA;;AAExD,CAAA,CAAA;",
6
+ "names": ["Effect", "Capability", "makeModule", "fnUntraced", "capabilities", "Service", "undoRegistry", "make", "getAll", "Capabilities", "UndoMapping", "flat", "invoker", "get", "OperationInvoker", "historyTracker", "contributes", "UndoRegistry", "HistoryTracker"]
7
+ }