@dxos/app-framework 0.8.4-main.fffef41 → 0.9.0

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 (569) 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-BOPAKKWG.mjs +35 -0
  6. package/dist/lib/browser/capability-BOPAKKWG.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-5GY3YOEL.mjs +28 -0
  8. package/dist/lib/browser/chunk-5GY3YOEL.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-66IXTIVK.mjs +48 -0
  10. package/dist/lib/browser/chunk-66IXTIVK.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-CO3XLNUX.mjs +95 -0
  12. package/dist/lib/browser/chunk-CO3XLNUX.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-DC3WRPBV.mjs +227 -0
  14. package/dist/lib/browser/chunk-DC3WRPBV.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-FJ4765WW.mjs +8 -0
  16. package/dist/lib/browser/chunk-FJ4765WW.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-FO3IYSLV.mjs +68 -0
  18. package/dist/lib/browser/chunk-FO3IYSLV.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-HFLKXMT7.mjs +587 -0
  20. package/dist/lib/browser/chunk-HFLKXMT7.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-IW44C7UL.mjs +83 -0
  22. package/dist/lib/browser/chunk-IW44C7UL.mjs.map +7 -0
  23. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  24. package/dist/lib/browser/chunk-KZUDO43J.mjs +422 -0
  25. package/dist/lib/browser/chunk-KZUDO43J.mjs.map +7 -0
  26. package/dist/lib/browser/chunk-Q2GLJTVV.mjs +12 -0
  27. package/dist/lib/browser/chunk-Q2GLJTVV.mjs.map +7 -0
  28. package/dist/lib/browser/chunk-SYXIYT6T.mjs +143 -0
  29. package/dist/lib/browser/chunk-SYXIYT6T.mjs.map +7 -0
  30. package/dist/lib/browser/chunk-XHS5KDNX.mjs +1471 -0
  31. package/dist/lib/browser/chunk-XHS5KDNX.mjs.map +7 -0
  32. package/dist/lib/browser/chunk-Y66ELD4U.mjs +476 -0
  33. package/dist/lib/browser/chunk-Y66ELD4U.mjs.map +7 -0
  34. package/dist/lib/browser/cli/index.mjs +74 -0
  35. package/dist/lib/browser/cli/index.mjs.map +7 -0
  36. package/dist/lib/browser/common/activation-events.mjs +20 -0
  37. package/dist/lib/browser/common/capabilities.mjs +56 -0
  38. package/dist/lib/browser/core/activation-event.mjs +20 -0
  39. package/dist/lib/browser/core/capability.mjs +32 -0
  40. package/dist/lib/browser/core/capability.mjs.map +7 -0
  41. package/dist/lib/browser/core/plugin-manager.mjs +19 -0
  42. package/dist/lib/browser/core/plugin-manager.mjs.map +7 -0
  43. package/dist/lib/browser/core/plugin.mjs +41 -0
  44. package/dist/lib/browser/core/plugin.mjs.map +7 -0
  45. package/dist/lib/browser/core/url-loader.mjs +24 -0
  46. package/dist/lib/browser/core/url-loader.mjs.map +7 -0
  47. package/dist/lib/browser/index.mjs +86 -122
  48. package/dist/lib/browser/index.mjs.map +4 -4
  49. package/dist/lib/browser/meta.json +1 -1
  50. package/dist/lib/browser/process-manager-capability-GXNUO7AR.mjs +132 -0
  51. package/dist/lib/browser/process-manager-capability-GXNUO7AR.mjs.map +7 -0
  52. package/dist/lib/browser/testing/index.mjs +316 -47
  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 +52 -0
  57. package/dist/lib/browser/ui/index.mjs.map +7 -0
  58. package/dist/lib/node-esm/capability-KZWRTX7R.mjs +36 -0
  59. package/dist/lib/node-esm/capability-KZWRTX7R.mjs.map +7 -0
  60. package/dist/lib/node-esm/chunk-37Z53PXZ.mjs +10 -0
  61. package/dist/lib/node-esm/chunk-37Z53PXZ.mjs.map +7 -0
  62. package/dist/lib/node-esm/chunk-A5CHGAZE.mjs +588 -0
  63. package/dist/lib/node-esm/chunk-A5CHGAZE.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-COHOWGGJ.mjs +144 -0
  65. package/dist/lib/node-esm/chunk-COHOWGGJ.mjs.map +7 -0
  66. package/dist/lib/node-esm/chunk-CTKEZHKF.mjs +84 -0
  67. package/dist/lib/node-esm/chunk-CTKEZHKF.mjs.map +7 -0
  68. package/dist/lib/node-esm/chunk-FPW45EZH.mjs +14 -0
  69. package/dist/lib/node-esm/chunk-FPW45EZH.mjs.map +7 -0
  70. package/dist/lib/node-esm/chunk-FSVGKTF6.mjs +477 -0
  71. package/dist/lib/node-esm/chunk-FSVGKTF6.mjs.map +7 -0
  72. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  73. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  74. package/dist/lib/node-esm/chunk-KFZEB6BV.mjs +29 -0
  75. package/dist/lib/node-esm/chunk-KFZEB6BV.mjs.map +7 -0
  76. package/dist/lib/node-esm/chunk-NULBHQYS.mjs +96 -0
  77. package/dist/lib/node-esm/chunk-NULBHQYS.mjs.map +7 -0
  78. package/dist/lib/node-esm/chunk-SX5NVETP.mjs +1472 -0
  79. package/dist/lib/node-esm/chunk-SX5NVETP.mjs.map +7 -0
  80. package/dist/lib/node-esm/chunk-WK7OIQKI.mjs +70 -0
  81. package/dist/lib/node-esm/chunk-WK7OIQKI.mjs.map +7 -0
  82. package/dist/lib/node-esm/chunk-XGBUKRCK.mjs +423 -0
  83. package/dist/lib/node-esm/chunk-XGBUKRCK.mjs.map +7 -0
  84. package/dist/lib/node-esm/chunk-XIGPWXCQ.mjs +228 -0
  85. package/dist/lib/node-esm/chunk-XIGPWXCQ.mjs.map +7 -0
  86. package/dist/lib/node-esm/chunk-XOCUANHO.mjs +49 -0
  87. package/dist/lib/node-esm/chunk-XOCUANHO.mjs.map +7 -0
  88. package/dist/lib/node-esm/cli/index.mjs +75 -0
  89. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  90. package/dist/lib/node-esm/common/activation-events.mjs +21 -0
  91. package/dist/lib/node-esm/common/activation-events.mjs.map +7 -0
  92. package/dist/lib/node-esm/common/capabilities.mjs +57 -0
  93. package/dist/lib/node-esm/common/capabilities.mjs.map +7 -0
  94. package/dist/lib/node-esm/core/activation-event.mjs +21 -0
  95. package/dist/lib/node-esm/core/activation-event.mjs.map +7 -0
  96. package/dist/lib/node-esm/core/capability.mjs +33 -0
  97. package/dist/lib/node-esm/core/capability.mjs.map +7 -0
  98. package/dist/lib/node-esm/core/plugin-manager.mjs +20 -0
  99. package/dist/lib/node-esm/core/plugin-manager.mjs.map +7 -0
  100. package/dist/lib/node-esm/core/plugin.mjs +42 -0
  101. package/dist/lib/node-esm/core/plugin.mjs.map +7 -0
  102. package/dist/lib/node-esm/core/url-loader.mjs +25 -0
  103. package/dist/lib/node-esm/core/url-loader.mjs.map +7 -0
  104. package/dist/lib/node-esm/index.mjs +86 -122
  105. package/dist/lib/node-esm/index.mjs.map +4 -4
  106. package/dist/lib/node-esm/meta.json +1 -1
  107. package/dist/lib/node-esm/process-manager-capability-TX5TA6YN.mjs +133 -0
  108. package/dist/lib/node-esm/process-manager-capability-TX5TA6YN.mjs.map +7 -0
  109. package/dist/lib/node-esm/testing/index.mjs +316 -47
  110. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  111. package/dist/lib/node-esm/testing/react.mjs +79 -0
  112. package/dist/lib/node-esm/testing/react.mjs.map +7 -0
  113. package/dist/lib/node-esm/ui/index.mjs +53 -0
  114. package/dist/lib/node-esm/ui/index.mjs.map +7 -0
  115. package/dist/plugin/node-esm/index.mjs +977 -0
  116. package/dist/plugin/node-esm/index.mjs.map +7 -0
  117. package/dist/plugin/node-esm/meta.json +1 -0
  118. package/dist/types/src/cli/cli.d.ts +37 -0
  119. package/dist/types/src/cli/cli.d.ts.map +1 -0
  120. package/dist/types/src/cli/index.d.ts +2 -0
  121. package/dist/types/src/cli/index.d.ts.map +1 -0
  122. package/dist/types/src/common/activation-events.d.ts +24 -0
  123. package/dist/types/src/common/activation-events.d.ts.map +1 -0
  124. package/dist/types/src/common/annotations.d.ts +1 -0
  125. package/dist/types/src/common/annotations.d.ts.map +1 -0
  126. package/dist/types/src/common/capabilities.d.ts +214 -193
  127. package/dist/types/src/common/capabilities.d.ts.map +1 -1
  128. package/dist/types/src/common/index.d.ts +3 -8
  129. package/dist/types/src/common/index.d.ts.map +1 -1
  130. package/dist/types/src/common/translations.d.ts +7 -7
  131. package/dist/types/src/common/translations.d.ts.map +1 -1
  132. package/dist/types/src/context.d.ts +5 -0
  133. package/dist/types/src/context.d.ts.map +1 -0
  134. package/dist/types/src/core/{events.d.ts → activation-event.d.ts} +11 -11
  135. package/dist/types/src/core/activation-event.d.ts.map +1 -0
  136. package/dist/types/src/core/capability-manager.d.ts +52 -0
  137. package/dist/types/src/core/capability-manager.d.ts.map +1 -0
  138. package/dist/types/src/core/capability-manager.test.d.ts +2 -0
  139. package/dist/types/src/core/capability-manager.test.d.ts.map +1 -0
  140. package/dist/types/src/core/capability.d.ts +161 -0
  141. package/dist/types/src/core/capability.d.ts.map +1 -0
  142. package/dist/types/src/core/edge-registry-plugin-provider.d.ts +30 -0
  143. package/dist/types/src/core/edge-registry-plugin-provider.d.ts.map +1 -0
  144. package/dist/types/src/core/index.d.ts +11 -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 +297 -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 +101 -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 +303 -43
  157. package/dist/types/src/core/plugin.d.ts.map +1 -1
  158. package/dist/types/src/core/registry.d.ts +107 -0
  159. package/dist/types/src/core/registry.d.ts.map +1 -0
  160. package/dist/types/src/core/url-loader.d.ts +127 -0
  161. package/dist/types/src/core/url-loader.d.ts.map +1 -0
  162. package/dist/types/src/core/url-loader.test.d.ts +2 -0
  163. package/dist/types/src/core/url-loader.test.d.ts.map +1 -0
  164. package/dist/types/src/helpers.d.ts.map +1 -1
  165. package/dist/types/src/index.d.ts +2 -2
  166. package/dist/types/src/index.d.ts.map +1 -1
  167. package/dist/types/src/plugin-process-manager/ProcessManagerPlugin.d.ts +3 -0
  168. package/dist/types/src/plugin-process-manager/ProcessManagerPlugin.d.ts.map +1 -0
  169. package/dist/types/src/plugin-process-manager/history/capability.d.ts +7 -0
  170. package/dist/types/src/plugin-process-manager/history/capability.d.ts.map +1 -0
  171. package/dist/types/src/plugin-process-manager/history/errors.d.ts +32 -0
  172. package/dist/types/src/plugin-process-manager/history/errors.d.ts.map +1 -0
  173. package/dist/types/src/plugin-process-manager/history/history-tracker.d.ts +32 -0
  174. package/dist/types/src/plugin-process-manager/history/history-tracker.d.ts.map +1 -0
  175. package/dist/types/src/plugin-process-manager/history/history-tracker.test.d.ts +2 -0
  176. package/dist/types/src/plugin-process-manager/history/history-tracker.test.d.ts.map +1 -0
  177. package/dist/types/src/plugin-process-manager/history/index.d.ts +6 -0
  178. package/dist/types/src/plugin-process-manager/history/index.d.ts.map +1 -0
  179. package/dist/types/src/plugin-process-manager/history/types.d.ts +13 -0
  180. package/dist/types/src/plugin-process-manager/history/types.d.ts.map +1 -0
  181. package/dist/types/src/plugin-process-manager/history/undo-mapping.d.ts +101 -0
  182. package/dist/types/src/plugin-process-manager/history/undo-mapping.d.ts.map +1 -0
  183. package/dist/types/src/plugin-process-manager/history/undo-registry.d.ts +23 -0
  184. package/dist/types/src/plugin-process-manager/history/undo-registry.d.ts.map +1 -0
  185. package/dist/types/src/plugin-process-manager/history/undo-registry.test.d.ts +2 -0
  186. package/dist/types/src/plugin-process-manager/history/undo-registry.test.d.ts.map +1 -0
  187. package/dist/types/src/plugin-process-manager/idb-key-value-store.d.ts +10 -0
  188. package/dist/types/src/plugin-process-manager/idb-key-value-store.d.ts.map +1 -0
  189. package/dist/types/src/plugin-process-manager/index.d.ts +3 -0
  190. package/dist/types/src/plugin-process-manager/index.d.ts.map +1 -0
  191. package/dist/types/src/plugin-process-manager/meta.d.ts +3 -0
  192. package/dist/types/src/plugin-process-manager/meta.d.ts.map +1 -0
  193. package/dist/types/src/plugin-process-manager/process-manager-capability.d.ts +8 -0
  194. package/dist/types/src/plugin-process-manager/process-manager-capability.d.ts.map +1 -0
  195. package/dist/types/src/plugin-process-manager/testing.d.ts +59 -0
  196. package/dist/types/src/plugin-process-manager/testing.d.ts.map +1 -0
  197. package/dist/types/src/testing/harness.d.ts +79 -0
  198. package/dist/types/src/testing/harness.d.ts.map +1 -0
  199. package/dist/types/src/testing/index.d.ts +3 -0
  200. package/dist/types/src/testing/index.d.ts.map +1 -1
  201. package/dist/types/src/testing/operationCapture.d.ts +64 -0
  202. package/dist/types/src/testing/operationCapture.d.ts.map +1 -0
  203. package/dist/types/src/testing/react.d.ts +27 -0
  204. package/dist/types/src/testing/react.d.ts.map +1 -0
  205. package/dist/types/src/testing/react.test.d.ts +2 -0
  206. package/dist/types/src/testing/react.test.d.ts.map +1 -0
  207. package/dist/types/src/testing/service.d.ts +8 -0
  208. package/dist/types/src/testing/service.d.ts.map +1 -0
  209. package/dist/types/src/testing/withPluginManager.d.ts +4 -4
  210. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  211. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
  212. package/dist/types/src/ui/components/App/App.d.ts +41 -0
  213. package/dist/types/src/ui/components/App/App.d.ts.map +1 -0
  214. package/dist/types/src/ui/components/App/App.stories.d.ts +19 -0
  215. package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -0
  216. package/dist/types/src/ui/components/App/index.d.ts +2 -0
  217. package/dist/types/src/ui/components/App/index.d.ts.map +1 -0
  218. package/dist/types/src/{react/Surface.stories.d.ts → ui/components/PluginManager/PluginManagerContext.stories.d.ts} +2 -3
  219. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -0
  220. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts +10 -0
  221. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts.map +1 -0
  222. package/dist/types/src/ui/components/PluginManager/index.d.ts +2 -0
  223. package/dist/types/src/ui/components/PluginManager/index.d.ts.map +1 -0
  224. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +24 -0
  225. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -0
  226. package/dist/types/src/{react/App.stories.d.ts → ui/components/Surface/SurfaceComponent.stories.d.ts} +1 -1
  227. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -0
  228. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts +11 -0
  229. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +1 -0
  230. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts +48 -0
  231. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts.map +1 -0
  232. package/dist/types/src/ui/components/Surface/context.d.ts +5 -0
  233. package/dist/types/src/ui/components/Surface/context.d.ts.map +1 -0
  234. package/dist/types/src/ui/components/Surface/index.d.ts +36 -0
  235. package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -0
  236. package/dist/types/src/ui/components/Surface/types.d.ts +197 -0
  237. package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -0
  238. package/dist/types/src/ui/components/Surface/types.test.d.ts +2 -0
  239. package/dist/types/src/ui/components/Surface/types.test.d.ts.map +1 -0
  240. package/dist/types/src/ui/components/index.d.ts +4 -0
  241. package/dist/types/src/ui/components/index.d.ts.map +1 -0
  242. package/dist/types/src/ui/hooks/index.d.ts +7 -0
  243. package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
  244. package/dist/types/src/ui/hooks/useApp.d.ts +80 -0
  245. package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -0
  246. package/dist/types/src/ui/hooks/useApp.test.d.ts +2 -0
  247. package/dist/types/src/ui/hooks/useApp.test.d.ts.map +1 -0
  248. package/dist/types/src/ui/hooks/useCapabilities.d.ts +31 -0
  249. package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -0
  250. package/dist/types/src/{react → ui/hooks}/useLoading.d.ts +1 -2
  251. package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
  252. package/dist/types/src/ui/hooks/useProcessManagerRuntime.d.ts +30 -0
  253. package/dist/types/src/ui/hooks/useProcessManagerRuntime.d.ts.map +1 -0
  254. package/dist/types/src/ui/hooks/useSettingsState.d.ts +10 -0
  255. package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -0
  256. package/dist/types/src/ui/hooks/useSurface.d.ts +3 -0
  257. package/dist/types/src/ui/hooks/useSurface.d.ts.map +1 -0
  258. package/dist/types/src/ui/index.d.ts +3 -0
  259. package/dist/types/src/ui/index.d.ts.map +1 -0
  260. package/dist/types/src/vite-plugin/boot-loader/index.d.ts +2 -0
  261. package/dist/types/src/vite-plugin/boot-loader/index.d.ts.map +1 -0
  262. package/dist/types/src/vite-plugin/boot-loader/loader.d.ts +59 -0
  263. package/dist/types/src/vite-plugin/boot-loader/loader.d.ts.map +1 -0
  264. package/dist/types/src/vite-plugin/composer/index.d.ts +34 -0
  265. package/dist/types/src/vite-plugin/composer/index.d.ts.map +1 -0
  266. package/dist/types/src/vite-plugin/import-map/index.d.ts +28 -0
  267. package/dist/types/src/vite-plugin/import-map/index.d.ts.map +1 -0
  268. package/dist/types/src/vite-plugin/index.d.ts +5 -0
  269. package/dist/types/src/vite-plugin/index.d.ts.map +1 -0
  270. package/dist/types/src/vite-plugin/manifest.d.ts +41 -0
  271. package/dist/types/src/vite-plugin/manifest.d.ts.map +1 -0
  272. package/dist/types/src/vite-plugin/manifest.test.d.ts +2 -0
  273. package/dist/types/src/vite-plugin/manifest.test.d.ts.map +1 -0
  274. package/dist/types/src/vite-plugin/packages.d.ts +13 -0
  275. package/dist/types/src/vite-plugin/packages.d.ts.map +1 -0
  276. package/dist/types/tsconfig.tsbuildinfo +1 -1
  277. package/moon.yml +25 -6
  278. package/package.json +125 -59
  279. package/src/cli/cli.ts +102 -0
  280. package/src/{playground/debug → cli}/index.ts +1 -1
  281. package/src/common/activation-events.ts +39 -0
  282. package/src/{playground/logger/index.ts → common/annotations.ts} +0 -2
  283. package/src/common/capabilities.ts +287 -192
  284. package/src/common/index.ts +3 -8
  285. package/src/common/translations.ts +17 -9
  286. package/src/context.ts +9 -0
  287. package/src/core/{events.ts → activation-event.ts} +10 -7
  288. package/src/core/capability-manager.test.ts +154 -0
  289. package/src/core/capability-manager.ts +213 -0
  290. package/src/core/capability.ts +254 -0
  291. package/src/core/edge-registry-plugin-provider.ts +92 -0
  292. package/src/core/index.ts +11 -4
  293. package/src/core/plugin-asset-cache.ts +60 -0
  294. package/src/core/plugin-manager.test.ts +1929 -0
  295. package/src/core/plugin-manager.ts +1696 -0
  296. package/src/core/plugin-manifest.test.ts +75 -0
  297. package/src/core/plugin-manifest.ts +134 -0
  298. package/src/core/plugin.ts +449 -48
  299. package/src/core/registry.ts +163 -0
  300. package/src/core/url-loader.test.ts +222 -0
  301. package/src/core/url-loader.ts +388 -0
  302. package/src/index.ts +2 -2
  303. package/src/plugin-process-manager/ProcessManagerPlugin.ts +24 -0
  304. package/src/plugin-process-manager/history/capability.ts +36 -0
  305. package/src/plugin-process-manager/history/errors.ts +7 -0
  306. package/src/plugin-process-manager/history/history-tracker.test.ts +353 -0
  307. package/src/plugin-process-manager/history/history-tracker.ts +144 -0
  308. package/src/plugin-process-manager/history/index.ts +9 -0
  309. package/src/plugin-process-manager/history/types.ts +17 -0
  310. package/src/plugin-process-manager/history/undo-mapping.ts +135 -0
  311. package/src/plugin-process-manager/history/undo-registry.test.ts +74 -0
  312. package/src/plugin-process-manager/history/undo-registry.ts +54 -0
  313. package/src/plugin-process-manager/idb-key-value-store.ts +64 -0
  314. package/src/plugin-process-manager/index.ts +6 -0
  315. package/src/plugin-process-manager/meta.ts +16 -0
  316. package/src/plugin-process-manager/process-manager-capability.ts +178 -0
  317. package/src/plugin-process-manager/testing.ts +156 -0
  318. package/src/testing/harness.ts +247 -0
  319. package/src/testing/index.ts +3 -0
  320. package/src/testing/operationCapture.ts +144 -0
  321. package/src/testing/react.test.tsx +50 -0
  322. package/src/testing/react.tsx +113 -0
  323. package/src/testing/service.ts +52 -0
  324. package/src/testing/withPluginManager.stories.tsx +8 -9
  325. package/src/testing/withPluginManager.tsx +69 -42
  326. package/src/ui/components/App/App.stories.tsx +84 -0
  327. package/src/ui/components/App/App.tsx +144 -0
  328. package/src/{playground/layout → ui/components/App}/index.ts +1 -1
  329. package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +179 -0
  330. package/src/{react → ui/components/PluginManager}/PluginManagerProvider.ts +3 -3
  331. package/src/ui/components/PluginManager/index.ts +5 -0
  332. package/src/ui/components/Surface/SurfaceComponent.stories.tsx +144 -0
  333. package/src/ui/components/Surface/SurfaceComponent.tsx +303 -0
  334. package/src/ui/components/Surface/SurfaceInfo.tsx +106 -0
  335. package/src/ui/components/Surface/SurfaceProfilerContext.tsx +207 -0
  336. package/src/ui/components/Surface/context.ts +12 -0
  337. package/src/ui/components/Surface/index.ts +54 -0
  338. package/src/ui/components/Surface/types.test.ts +126 -0
  339. package/src/ui/components/Surface/types.ts +290 -0
  340. package/src/ui/components/index.ts +7 -0
  341. package/src/ui/hooks/index.ts +10 -0
  342. package/src/ui/hooks/useApp.test.tsx +161 -0
  343. package/src/ui/hooks/useApp.tsx +404 -0
  344. package/src/ui/hooks/useCapabilities.ts +68 -0
  345. package/src/{react → ui/hooks}/useLoading.tsx +16 -10
  346. package/src/ui/hooks/useProcessManagerRuntime.ts +78 -0
  347. package/src/ui/hooks/useSettingsState.ts +26 -0
  348. package/src/ui/hooks/useSurface.ts +13 -0
  349. package/src/ui/index.ts +6 -0
  350. package/src/vite-plugin/boot-loader/BootLoader.solid-stories.tsx +198 -0
  351. package/src/vite-plugin/boot-loader/index.ts +5 -0
  352. package/src/vite-plugin/boot-loader/loader-app/Loader.tsx +166 -0
  353. package/src/vite-plugin/boot-loader/loader-app/boot-loader.css +311 -0
  354. package/src/vite-plugin/boot-loader/loader-app/bridge.ts +25 -0
  355. package/src/vite-plugin/boot-loader/loader-app/entry.tsx +21 -0
  356. package/src/vite-plugin/boot-loader/loader-app/mount.tsx +70 -0
  357. package/src/vite-plugin/boot-loader/loader-app/store.test.ts +137 -0
  358. package/src/vite-plugin/boot-loader/loader-app/store.ts +149 -0
  359. package/src/vite-plugin/boot-loader/loader-app/tsconfig.json +11 -0
  360. package/src/vite-plugin/boot-loader/loader-app/types.ts +78 -0
  361. package/src/vite-plugin/boot-loader/loader.ts +204 -0
  362. package/src/vite-plugin/composer/index.ts +306 -0
  363. package/src/vite-plugin/import-map/index.ts +527 -0
  364. package/src/vite-plugin/index.ts +10 -0
  365. package/src/vite-plugin/manifest.test.ts +55 -0
  366. package/src/vite-plugin/manifest.ts +63 -0
  367. package/src/vite-plugin/packages.ts +187 -0
  368. package/tsconfig.json +27 -22
  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-OIEZZC45.mjs +0 -138
  375. package/dist/lib/browser/app-graph-builder-OIEZZC45.mjs.map +0 -7
  376. package/dist/lib/browser/chunk-6XKO24JP.mjs +0 -483
  377. package/dist/lib/browser/chunk-6XKO24JP.mjs.map +0 -7
  378. package/dist/lib/browser/chunk-SCPE4ZO2.mjs +0 -35
  379. package/dist/lib/browser/chunk-SCPE4ZO2.mjs.map +0 -7
  380. package/dist/lib/browser/chunk-WPW5VVAX.mjs +0 -1651
  381. package/dist/lib/browser/chunk-WPW5VVAX.mjs.map +0 -7
  382. package/dist/lib/browser/intent-dispatcher-LZ4AE66E.mjs +0 -11
  383. package/dist/lib/browser/intent-resolver-QVCKRX6G.mjs +0 -39
  384. package/dist/lib/browser/intent-resolver-QVCKRX6G.mjs.map +0 -7
  385. package/dist/lib/browser/react/index.mjs +0 -34
  386. package/dist/lib/browser/store-CNPHOYTJ.mjs +0 -30
  387. package/dist/lib/browser/store-CNPHOYTJ.mjs.map +0 -7
  388. package/dist/lib/node-esm/app-graph-builder-EBU4NVWD.mjs +0 -139
  389. package/dist/lib/node-esm/app-graph-builder-EBU4NVWD.mjs.map +0 -7
  390. package/dist/lib/node-esm/chunk-3UPX5OIS.mjs +0 -484
  391. package/dist/lib/node-esm/chunk-3UPX5OIS.mjs.map +0 -7
  392. package/dist/lib/node-esm/chunk-XJZGUJ3H.mjs +0 -1653
  393. package/dist/lib/node-esm/chunk-XJZGUJ3H.mjs.map +0 -7
  394. package/dist/lib/node-esm/chunk-ZX63QUGE.mjs +0 -37
  395. package/dist/lib/node-esm/chunk-ZX63QUGE.mjs.map +0 -7
  396. package/dist/lib/node-esm/intent-dispatcher-MGOJ3CHD.mjs +0 -12
  397. package/dist/lib/node-esm/intent-resolver-URF3HN3G.mjs +0 -40
  398. package/dist/lib/node-esm/intent-resolver-URF3HN3G.mjs.map +0 -7
  399. package/dist/lib/node-esm/react/index.mjs +0 -35
  400. package/dist/lib/node-esm/store-RK5B4XEL.mjs +0 -31
  401. package/dist/lib/node-esm/store-RK5B4XEL.mjs.map +0 -7
  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 -68
  413. package/dist/types/src/common/surface.d.ts.map +0 -1
  414. package/dist/types/src/core/capabilities.d.ts +0 -117
  415. package/dist/types/src/core/capabilities.d.ts.map +0 -1
  416. package/dist/types/src/core/capabilities.test.d.ts +0 -2
  417. package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
  418. package/dist/types/src/core/events.d.ts.map +0 -1
  419. package/dist/types/src/core/manager.d.ts +0 -126
  420. package/dist/types/src/core/manager.d.ts.map +0 -1
  421. package/dist/types/src/core/manager.test.d.ts +0 -2
  422. package/dist/types/src/core/manager.test.d.ts.map +0 -1
  423. package/dist/types/src/playground/debug/Debug.d.ts +0 -6
  424. package/dist/types/src/playground/debug/Debug.d.ts.map +0 -1
  425. package/dist/types/src/playground/debug/index.d.ts +0 -2
  426. package/dist/types/src/playground/debug/index.d.ts.map +0 -1
  427. package/dist/types/src/playground/debug/plugin.d.ts +0 -2
  428. package/dist/types/src/playground/debug/plugin.d.ts.map +0 -1
  429. package/dist/types/src/playground/generator/Main.d.ts +0 -6
  430. package/dist/types/src/playground/generator/Main.d.ts.map +0 -1
  431. package/dist/types/src/playground/generator/Toolbar.d.ts +0 -6
  432. package/dist/types/src/playground/generator/Toolbar.d.ts.map +0 -1
  433. package/dist/types/src/playground/generator/generator.d.ts +0 -7
  434. package/dist/types/src/playground/generator/generator.d.ts.map +0 -1
  435. package/dist/types/src/playground/generator/index.d.ts +0 -3
  436. package/dist/types/src/playground/generator/index.d.ts.map +0 -1
  437. package/dist/types/src/playground/generator/plugin.d.ts +0 -2
  438. package/dist/types/src/playground/generator/plugin.d.ts.map +0 -1
  439. package/dist/types/src/playground/layout/Layout.d.ts +0 -8
  440. package/dist/types/src/playground/layout/Layout.d.ts.map +0 -1
  441. package/dist/types/src/playground/layout/index.d.ts +0 -2
  442. package/dist/types/src/playground/layout/index.d.ts.map +0 -1
  443. package/dist/types/src/playground/layout/plugin.d.ts +0 -2
  444. package/dist/types/src/playground/layout/plugin.d.ts.map +0 -1
  445. package/dist/types/src/playground/logger/Toolbar.d.ts +0 -6
  446. package/dist/types/src/playground/logger/Toolbar.d.ts.map +0 -1
  447. package/dist/types/src/playground/logger/index.d.ts +0 -2
  448. package/dist/types/src/playground/logger/index.d.ts.map +0 -1
  449. package/dist/types/src/playground/logger/plugin.d.ts +0 -2
  450. package/dist/types/src/playground/logger/plugin.d.ts.map +0 -1
  451. package/dist/types/src/playground/logger/schema.d.ts +0 -13
  452. package/dist/types/src/playground/logger/schema.d.ts.map +0 -1
  453. package/dist/types/src/playground/playground.stories.d.ts +0 -11
  454. package/dist/types/src/playground/playground.stories.d.ts.map +0 -1
  455. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +0 -2
  456. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +0 -1
  457. package/dist/types/src/plugin-intent/actions.d.ts +0 -36
  458. package/dist/types/src/plugin-intent/actions.d.ts.map +0 -1
  459. package/dist/types/src/plugin-intent/errors.d.ts +0 -16
  460. package/dist/types/src/plugin-intent/errors.d.ts.map +0 -1
  461. package/dist/types/src/plugin-intent/index.d.ts +0 -6
  462. package/dist/types/src/plugin-intent/index.d.ts.map +0 -1
  463. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +0 -139
  464. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +0 -1
  465. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +0 -2
  466. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +0 -1
  467. package/dist/types/src/plugin-intent/intent.d.ts +0 -63
  468. package/dist/types/src/plugin-intent/intent.d.ts.map +0 -1
  469. package/dist/types/src/plugin-intent/meta.d.ts +0 -3
  470. package/dist/types/src/plugin-intent/meta.d.ts.map +0 -1
  471. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +0 -2
  472. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +0 -1
  473. package/dist/types/src/plugin-settings/actions.d.ts +0 -25
  474. package/dist/types/src/plugin-settings/actions.d.ts.map +0 -1
  475. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +0 -4
  476. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +0 -1
  477. package/dist/types/src/plugin-settings/index.d.ts +0 -3
  478. package/dist/types/src/plugin-settings/index.d.ts.map +0 -1
  479. package/dist/types/src/plugin-settings/intent-resolver.d.ts +0 -4
  480. package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +0 -1
  481. package/dist/types/src/plugin-settings/meta.d.ts +0 -3
  482. package/dist/types/src/plugin-settings/meta.d.ts.map +0 -1
  483. package/dist/types/src/plugin-settings/store.d.ts +0 -5
  484. package/dist/types/src/plugin-settings/store.d.ts.map +0 -1
  485. package/dist/types/src/plugin-settings/translations.d.ts +0 -11
  486. package/dist/types/src/plugin-settings/translations.d.ts.map +0 -1
  487. package/dist/types/src/react/App.d.ts +0 -10
  488. package/dist/types/src/react/App.d.ts.map +0 -1
  489. package/dist/types/src/react/App.stories.d.ts.map +0 -1
  490. package/dist/types/src/react/DefaultFallback.d.ts +0 -8
  491. package/dist/types/src/react/DefaultFallback.d.ts.map +0 -1
  492. package/dist/types/src/react/ErrorBoundary.d.ts +0 -30
  493. package/dist/types/src/react/ErrorBoundary.d.ts.map +0 -1
  494. package/dist/types/src/react/IntentContext.d.ts +0 -8
  495. package/dist/types/src/react/IntentContext.d.ts.map +0 -1
  496. package/dist/types/src/react/PluginManagerProvider.d.ts +0 -10
  497. package/dist/types/src/react/PluginManagerProvider.d.ts.map +0 -1
  498. package/dist/types/src/react/Surface.d.ts +0 -12
  499. package/dist/types/src/react/Surface.d.ts.map +0 -1
  500. package/dist/types/src/react/Surface.stories.d.ts.map +0 -1
  501. package/dist/types/src/react/common.d.ts +0 -13
  502. package/dist/types/src/react/common.d.ts.map +0 -1
  503. package/dist/types/src/react/index.d.ts +0 -9
  504. package/dist/types/src/react/index.d.ts.map +0 -1
  505. package/dist/types/src/react/types.d.ts +0 -14
  506. package/dist/types/src/react/types.d.ts.map +0 -1
  507. package/dist/types/src/react/useApp.d.ts +0 -44
  508. package/dist/types/src/react/useApp.d.ts.map +0 -1
  509. package/dist/types/src/react/useCapabilities.d.ts +0 -13
  510. package/dist/types/src/react/useCapabilities.d.ts.map +0 -1
  511. package/dist/types/src/react/useIntentResolver.d.ts +0 -3
  512. package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
  513. package/dist/types/src/react/useLoading.d.ts.map +0 -1
  514. package/src/common/collaboration.ts +0 -18
  515. package/src/common/events.ts +0 -79
  516. package/src/common/file.ts +0 -22
  517. package/src/common/graph.ts +0 -30
  518. package/src/common/layout.ts +0 -277
  519. package/src/common/surface.ts +0 -88
  520. package/src/core/capabilities.test.ts +0 -136
  521. package/src/core/capabilities.ts +0 -263
  522. package/src/core/manager.test.ts +0 -516
  523. package/src/core/manager.ts +0 -604
  524. package/src/playground/debug/Debug.tsx +0 -39
  525. package/src/playground/debug/plugin.ts +0 -16
  526. package/src/playground/generator/Main.tsx +0 -70
  527. package/src/playground/generator/Toolbar.tsx +0 -47
  528. package/src/playground/generator/generator.ts +0 -48
  529. package/src/playground/generator/index.ts +0 -6
  530. package/src/playground/generator/plugin.ts +0 -22
  531. package/src/playground/layout/Layout.tsx +0 -33
  532. package/src/playground/layout/plugin.ts +0 -18
  533. package/src/playground/logger/Toolbar.tsx +0 -30
  534. package/src/playground/logger/plugin.ts +0 -41
  535. package/src/playground/logger/schema.ts +0 -12
  536. package/src/playground/playground.stories.tsx +0 -46
  537. package/src/plugin-intent/IntentPlugin.ts +0 -20
  538. package/src/plugin-intent/actions.ts +0 -31
  539. package/src/plugin-intent/errors.ts +0 -40
  540. package/src/plugin-intent/index.ts +0 -9
  541. package/src/plugin-intent/intent-dispatcher.test.ts +0 -286
  542. package/src/plugin-intent/intent-dispatcher.ts +0 -342
  543. package/src/plugin-intent/intent.ts +0 -154
  544. package/src/plugin-intent/meta.ts +0 -10
  545. package/src/plugin-settings/SettingsPlugin.ts +0 -34
  546. package/src/plugin-settings/actions.ts +0 -25
  547. package/src/plugin-settings/app-graph-builder.ts +0 -160
  548. package/src/plugin-settings/index.ts +0 -6
  549. package/src/plugin-settings/intent-resolver.ts +0 -35
  550. package/src/plugin-settings/meta.ts +0 -10
  551. package/src/plugin-settings/store.ts +0 -33
  552. package/src/plugin-settings/translations.ts +0 -19
  553. package/src/react/App.stories.tsx +0 -33
  554. package/src/react/App.tsx +0 -59
  555. package/src/react/DefaultFallback.tsx +0 -26
  556. package/src/react/ErrorBoundary.tsx +0 -56
  557. package/src/react/IntentContext.tsx +0 -35
  558. package/src/react/Surface.stories.tsx +0 -125
  559. package/src/react/Surface.tsx +0 -109
  560. package/src/react/common.ts +0 -13
  561. package/src/react/index.ts +0 -14
  562. package/src/react/types.ts +0 -38
  563. package/src/react/useApp.tsx +0 -165
  564. package/src/react/useCapabilities.ts +0 -31
  565. package/src/react/useIntentResolver.ts +0 -22
  566. /package/dist/lib/browser/{intent-dispatcher-LZ4AE66E.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  567. /package/dist/lib/browser/{react/index.mjs.map → common/activation-events.mjs.map} +0 -0
  568. /package/dist/lib/{node-esm/intent-dispatcher-MGOJ3CHD.mjs.map → browser/common/capabilities.mjs.map} +0 -0
  569. /package/dist/lib/{node-esm/react/index.mjs.map → browser/core/activation-event.mjs.map} +0 -0
@@ -3,23 +3,18 @@
3
3
  //
4
4
 
5
5
  import { type Decorator, type StoryContext } from '@storybook/react';
6
- import React, { useEffect, useMemo } from 'react';
6
+ import * as Effect from 'effect/Effect';
7
+ import React, { useEffect, useState } from 'react';
7
8
 
8
9
  import { raise } from '@dxos/debug';
10
+ import { EffectEx } from '@dxos/effect';
11
+ import { DXN } from '@dxos/keys';
9
12
  import { useAsyncEffect } from '@dxos/react-hooks';
10
13
  import { type MaybeProvider, getProviderValue } from '@dxos/util';
11
14
 
12
- import { Capabilities, Events } from '../common';
13
- import {
14
- type ActivationEvent,
15
- type AnyCapability,
16
- type PluginContext,
17
- PluginManager,
18
- contributes,
19
- defineModule,
20
- definePlugin,
21
- } from '../core';
22
- import { type UseAppOptions, useApp } from '../react';
15
+ import { ActivationEvents, Capabilities } from '../common';
16
+ import { type ActivationEvent, Capability, type CapabilityManager, Plugin, PluginManager } from '../core';
17
+ import { type UseAppOptions, useApp } from '../ui';
23
18
 
24
19
  /**
25
20
  * @internal
@@ -27,19 +22,21 @@ import { type UseAppOptions, useApp } from '../react';
27
22
  export const setupPluginManager = ({
28
23
  capabilities,
29
24
  plugins = [],
30
- core = plugins.map(({ meta }) => meta.id),
31
25
  ...options
32
26
  }: UseAppOptions & Pick<WithPluginManagerOptions, 'capabilities'> = {}) => {
33
- const pluginManager = new PluginManager({
27
+ // Auto-enable every non-system plugin so stories don't have to spell out
28
+ // enablement. System-tagged plugins are force-enabled by the manager.
29
+ const enabled = plugins.filter(({ meta }) => !meta.tags?.includes('system')).map(({ meta }) => meta.id);
30
+ const pluginManager = PluginManager.make({
34
31
  pluginLoader: () => raise(new Error('Not implemented')),
35
- plugins: [StoryPlugin(), ...plugins],
36
- core: [StoryPlugin.meta.id, ...core],
32
+ plugins: [StoryPlugin, ...plugins],
33
+ enabled,
37
34
  ...options,
38
35
  });
39
36
 
40
37
  if (capabilities) {
41
- getProviderValue(capabilities, pluginManager.context).forEach((capability) => {
42
- pluginManager.context.contributeCapability({
38
+ getProviderValue(capabilities, pluginManager.capabilities).forEach((capability) => {
39
+ pluginManager.capabilities.contribute({
43
40
  interface: capability.interface,
44
41
  implementation: capability.implementation,
45
42
  module: 'story',
@@ -50,11 +47,18 @@ export const setupPluginManager = ({
50
47
  return pluginManager;
51
48
  };
52
49
 
50
+ type ManagedPluginManagerState = {
51
+ fireEvents?: (ActivationEvent.ActivationEvent | string)[];
52
+ pluginManager: PluginManager.PluginManager;
53
+ setupEvents?: ActivationEvent.ActivationEvent[];
54
+ storyId: string;
55
+ };
56
+
53
57
  export type WithPluginManagerOptions = UseAppOptions & {
54
58
  /** @deprecated */
55
- capabilities?: MaybeProvider<AnyCapability[], PluginContext>;
59
+ capabilities?: MaybeProvider<Capability.Any[], CapabilityManager.CapabilityManager>;
56
60
  /** @deprecated */
57
- fireEvents?: (ActivationEvent | string)[];
61
+ fireEvents?: (ActivationEvent.ActivationEvent | string)[];
58
62
  };
59
63
 
60
64
  export type WithPluginManagerInitializer<Args = void> =
@@ -67,45 +71,68 @@ export type WithPluginManagerInitializer<Args = void> =
67
71
  */
68
72
  export const withPluginManager = <Args,>(init: WithPluginManagerInitializer<Args> = {}): Decorator => {
69
73
  return (Story, context) => {
74
+ const storyId = context.id;
70
75
  const options = typeof init === 'function' ? init(context as any) : init;
71
- const pluginManager = useMemo(() => setupPluginManager(options), [init]);
76
+ const [managerState, setManagerState] = useState<ManagedPluginManagerState>();
72
77
 
73
- // Set-up root capability.
78
+ // Storybook replaces the full context object often, so key manager ownership by story id.
74
79
  useEffect(() => {
75
- const capability = contributes(Capabilities.ReactRoot, {
76
- id: context.id,
80
+ const pluginManager = setupPluginManager(options);
81
+ const capability = Capability.contributes(Capabilities.ReactRoot, {
82
+ id: storyId,
77
83
  root: () => <Story />,
78
84
  });
79
85
 
80
- pluginManager.context.contributeCapability({
86
+ pluginManager.capabilities.contribute({
81
87
  ...capability,
82
- module: 'dxos.org/app-framework/withPluginManager',
88
+ module: 'org.dxos.app-framework.with-plugin-manager',
89
+ });
90
+
91
+ setManagerState({
92
+ pluginManager,
93
+ setupEvents: options.setupEvents,
94
+ fireEvents: options.fireEvents,
95
+ storyId,
83
96
  });
84
97
 
85
98
  return () => {
86
- pluginManager.context.removeCapability(capability.interface, capability.implementation);
99
+ pluginManager.capabilities.remove(capability.interface, capability.implementation);
100
+ void EffectEx.runAndForwardErrors(pluginManager.shutdown());
87
101
  };
88
- }, [pluginManager, context]);
89
-
90
- // Fire events.
91
- useAsyncEffect(async () => {
92
- await Promise.all(options.fireEvents?.map((event) => pluginManager.activate(event)) ?? []);
93
- }, [pluginManager]);
102
+ }, [storyId, init]);
94
103
 
95
- // Create app.
96
- const App = useApp({ pluginManager });
104
+ // Avoid mounting useApp with a stale manager from the previous story.
105
+ if (!managerState || managerState.storyId !== storyId) {
106
+ return <></>;
107
+ }
97
108
 
98
- return <App />;
109
+ return <WithPluginManagerApp {...managerState} />;
99
110
  };
100
111
  };
101
112
 
102
- const storyMeta = {
103
- id: 'dxos.org/app-framework/story',
104
- name: 'Story',
113
+ const WithPluginManagerApp = ({ fireEvents, pluginManager, setupEvents, storyId }: ManagedPluginManagerState) => {
114
+ // Fire deprecated events only after the effect-owned manager for this story exists.
115
+ useAsyncEffect(async () => {
116
+ await Promise.all(fireEvents?.map((event) => pluginManager.activate(event)) ?? []);
117
+ }, [fireEvents, pluginManager, storyId]);
118
+
119
+ const App = useApp({ pluginManager, setupEvents });
120
+ return <App />;
105
121
  };
106
122
 
123
+ const storyMeta = Plugin.makeMeta({
124
+ key: DXN.make('org.dxos.appFramework.story'),
125
+ name: 'Story',
126
+ tags: ['system'],
127
+ });
128
+
107
129
  // No-op plugin to ensure there exists at least one plugin for the startup event.
108
130
  // This is necessary because `createApp` expects the startup event to complete before the app is ready.
109
- const StoryPlugin = definePlugin(storyMeta, () => [
110
- defineModule({ id: storyMeta.id, activatesOn: Events.Startup, activate: () => [] }),
111
- ]);
131
+ const StoryPlugin = Plugin.define(storyMeta).pipe(
132
+ Plugin.addModule({
133
+ id: 'Story',
134
+ activatesOn: ActivationEvents.Startup,
135
+ activate: () => Effect.succeed([]),
136
+ }),
137
+ Plugin.make,
138
+ )();
@@ -0,0 +1,84 @@
1
+ //
2
+ // Copyright 2022 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import * as Effect from 'effect/Effect';
7
+ import React, { useEffect } from 'react';
8
+
9
+ import { DXN } from '@dxos/keys';
10
+ import { withTheme } from '@dxos/react-ui/testing';
11
+
12
+ import { ActivationEvents, Capabilities } from '../../../common';
13
+ import { Capability, Plugin } from '../../../core';
14
+ import { useApp } from '../../hooks';
15
+
16
+ // Minimal plugin that contributes a ReactRoot.
17
+ const TestPlugin = Plugin.define<{ error?: boolean }>(
18
+ Plugin.makeMeta({
19
+ key: DXN.make('org.dxos.plugin.test'),
20
+ name: 'Test Plugin',
21
+ tags: ['system'],
22
+ }),
23
+ ).pipe(
24
+ Plugin.addModule(({ error }) => ({
25
+ id: 'TestMain',
26
+ activatesOn: ActivationEvents.Startup,
27
+ activate: () =>
28
+ Effect.succeed([
29
+ Capability.contributes(Capabilities.ReactRoot, {
30
+ id: 'org.dxos.plugin.test.root',
31
+ root: () => {
32
+ useEffect(() => {
33
+ let t: NodeJS.Timeout;
34
+ if (error) {
35
+ console.log('Ticking...');
36
+ t = setTimeout(() => {
37
+ console.log('Bang!');
38
+ throw new Error('Runtime error');
39
+ }, 3_000);
40
+ }
41
+
42
+ return () => clearTimeout(t);
43
+ }, [error]);
44
+
45
+ return <h1 className='text-lg'>App Started</h1>;
46
+ },
47
+ }),
48
+ ]),
49
+ })),
50
+ Plugin.make,
51
+ );
52
+
53
+ type DefaultStoryProps = { plugins?: Plugin.Plugin[] };
54
+
55
+ const DefaultStory = ({ plugins }: DefaultStoryProps) => {
56
+ const App = useApp({ plugins });
57
+
58
+ return <App />;
59
+ };
60
+
61
+ const meta = {
62
+ title: 'sdk/app-framework/components/App',
63
+ render: DefaultStory,
64
+ decorators: [withTheme()],
65
+ parameters: {
66
+ layout: 'centered',
67
+ },
68
+ } satisfies Meta;
69
+
70
+ export default meta;
71
+
72
+ type Story = StoryObj<typeof meta>;
73
+
74
+ export const Default: Story = {
75
+ args: {
76
+ plugins: [TestPlugin({})],
77
+ },
78
+ };
79
+
80
+ export const WithError: Story = {
81
+ args: {
82
+ plugins: [TestPlugin({ error: true })],
83
+ },
84
+ };
@@ -0,0 +1,144 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React, { type PropsWithChildren, useEffect, useLayoutEffect } from 'react';
6
+
7
+ import { Capabilities } from '../../../common';
8
+ import { topologicalSort } from '../../../helpers';
9
+ import { LoadingState, type StartupProgress, type UseAppOptions, useCapabilities, useLoading } from '../../hooks';
10
+
11
+ declare global {
12
+ interface Window {
13
+ /**
14
+ * Driver injected by `@dxos/app-framework/vite-plugin`'s `bootLoaderPlugin`
15
+ * (a Solid app inlined into `index.html`). Declared here — on a module that
16
+ * is part of the `@dxos/app-framework/ui` export surface — so the React side
17
+ * and host apps (e.g. composer-app) can drive the loader without each
18
+ * re-declaring the type. The canonical definition lives in the plugin's
19
+ * `loader-app/types.ts`; this mirror exists because that source compiles in a
20
+ * separate (Solid) program that doesn't ship its globals to consumers.
21
+ */
22
+ __bootLoader?: {
23
+ status: (payload: {
24
+ event?: string;
25
+ module?: string;
26
+ humanized: string;
27
+ /**
28
+ * Optional `(index/total)` tick. When present, the loader replaces the
29
+ * current line in place ("Loading plugins (12/80)") instead of appending
30
+ * a new entry — keeps the visible log compact during long counted phases.
31
+ */
32
+ range?: { index: number; total: number };
33
+ }) => void;
34
+ progress: (fraction?: number) => void;
35
+ ready: () => void;
36
+ dismiss: () => void;
37
+ };
38
+ }
39
+ }
40
+
41
+ export type AppProps = Pick<UseAppOptions, 'debounce'> & {
42
+ ready: boolean;
43
+ error: unknown;
44
+ progress?: StartupProgress;
45
+ };
46
+
47
+ const FIRST_INTERACTIVE_MARK = 'app-framework:first-interactive';
48
+
49
+ export const App = ({ ready, error, debounce, progress }: AppProps) => {
50
+ const reactContexts = useCapabilities(Capabilities.ReactContext);
51
+ const reactRoots = useCapabilities(Capabilities.ReactRoot);
52
+ const stage = useLoading(ready, debounce);
53
+ const placeholderDismissed = stage >= LoadingState.Done;
54
+
55
+ // Relay the startup lifecycle into the boot loader injected by
56
+ // `@dxos/app-framework/vite-plugin` (a Solid app inlined into `index.html`,
57
+ // the only visible loading UI). Plugin activation fills the `[0.5, 1]` half
58
+ // of the ring; the raw `event` / `module` ids ride along so the loader owns
59
+ // how each transition is rendered and traced. No-op once the outro has
60
+ // started (`FadeOut`), so the dismissal runs uncontended.
61
+ useEffect(() => {
62
+ if (stage >= LoadingState.FadeOut) {
63
+ return;
64
+ }
65
+ const fraction = progress?.progress ?? 0;
66
+ window.__bootLoader?.progress(0.5 + fraction * 0.5);
67
+ if (progress?.humanizedName) {
68
+ window.__bootLoader?.status({
69
+ event: progress.event,
70
+ module: progress.module,
71
+ humanized: `Activating ${progress.humanizedName}`,
72
+ });
73
+ }
74
+ }, [stage, progress?.progress, progress?.event, progress?.module, progress?.humanizedName]);
75
+
76
+ // Hand off at fade-out: play the loader's graceful shrink-and-fade outro.
77
+ // `useLayoutEffect` runs before the next paint so the outro begins in the
78
+ // same frame the real shell starts rendering beneath it.
79
+ useLayoutEffect(() => {
80
+ if (stage >= LoadingState.FadeOut) {
81
+ window.__bootLoader?.ready();
82
+ }
83
+ }, [stage]);
84
+
85
+ // Emit a once-per-app `app-framework:first-interactive` mark the first time
86
+ // the loader is dismissed and the real app shell renders. Closes the gap
87
+ // between `Startup` activated and the first interactive paint.
88
+ //
89
+ // Also the framework-owned handoff-complete signal: `dismiss()` removes the
90
+ // loader immediately on the fast-load path (where `useLoading` skips
91
+ // `FadeOut`), and is a no-op once an outro is already in flight, so it never
92
+ // cuts the animation short.
93
+ useEffect(() => {
94
+ if (!placeholderDismissed) {
95
+ return;
96
+ }
97
+ if (performance.getEntriesByName(FIRST_INTERACTIVE_MARK).length === 0) {
98
+ performance.mark(FIRST_INTERACTIVE_MARK);
99
+ }
100
+ window.__bootLoader?.dismiss();
101
+ }, [placeholderDismissed]);
102
+
103
+ // Used in tests to exercise the error boundary & reset dialog (see
104
+ // composer-app's `basic.spec.ts`). Thrown into the surrounding `ErrorBoundary`.
105
+ if (location.search === '?throw') {
106
+ throw new Error('Test error');
107
+ }
108
+
109
+ if (error) {
110
+ // This triggers the error boundary to provide UI feedback for the startup error.
111
+ throw error;
112
+ }
113
+
114
+ // The boot loader owns the screen until handoff completes; render nothing
115
+ // until then (any DOM here would sit invisibly behind the `z-index: 10`
116
+ // loader anyway).
117
+ // TODO(wittjosiah): Consider using Suspense instead.
118
+ if (!placeholderDismissed) {
119
+ return null;
120
+ }
121
+
122
+ const ComposedContext = composeContexts(reactContexts);
123
+ return (
124
+ <ComposedContext>
125
+ {reactRoots.map(({ id, root: Component }) => (
126
+ <Component key={id} />
127
+ ))}
128
+ </ComposedContext>
129
+ );
130
+ };
131
+
132
+ const composeContexts = (contexts: Capabilities.ReactContext[]) => {
133
+ if (contexts.length === 0) {
134
+ return ({ children }: PropsWithChildren) => <>{children}</>;
135
+ }
136
+
137
+ return topologicalSort(contexts)
138
+ .map(({ context }) => context)
139
+ .reduce((Acc, Next) => ({ children }) => (
140
+ <Acc>
141
+ <Next>{children}</Next>
142
+ </Acc>
143
+ ));
144
+ };
@@ -2,4 +2,4 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- export * from './plugin';
5
+ export * from './App';
@@ -0,0 +1,179 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { Atom, useAtomValue } from '@effect-atom/atom-react';
6
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
+ import * as Effect from 'effect/Effect';
8
+ import React, { useEffect, useMemo, useState } from 'react';
9
+
10
+ import { DXN } from '@dxos/keys';
11
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
12
+ import { useWebComponentContext } from '@dxos/web-context-react';
13
+
14
+ import { ActivationEvents, Capabilities } from '../../../common';
15
+ import { PluginManagerContext } from '../../../context';
16
+ import { Capability, Plugin } from '../../../core';
17
+ import { useApp } from '../../hooks';
18
+
19
+ // Define the Counter capability
20
+ const Counter = Capability.make<{ count: number; increment: () => void }>('example/counter');
21
+
22
+ const CountStatus = () => {
23
+ const manager = useWebComponentContext(PluginManagerContext);
24
+ const capabilitiesAtom = useMemo(
25
+ () => manager?.capabilities.atom(Counter) ?? Atom.make<{ count: number; increment: () => void }[]>([]),
26
+ [manager],
27
+ );
28
+ const capabilities = useAtomValue(capabilitiesAtom);
29
+ const counter = (capabilities as any)[0];
30
+ const [count, setCount] = useState(counter?.count ?? 0);
31
+
32
+ useEffect(() => {
33
+ if (!counter) {
34
+ return;
35
+ }
36
+ setCount(counter.count);
37
+ if ('subscribe' in counter && typeof counter.subscribe === 'function') {
38
+ return counter.subscribe(() => setCount(counter.count));
39
+ }
40
+ }, [counter]);
41
+
42
+ if (!manager) {
43
+ return null;
44
+ }
45
+
46
+ const isEven = count % 2 === 0;
47
+
48
+ return (
49
+ <div
50
+ className={`mt-4 px-4 py-2 rounded-full text-sm font-medium transition-colors ${
51
+ isEven
52
+ ? 'bg-emerald-100 text-emerald-800 dark:bg-emerald-900/30 dark:text-emerald-400'
53
+ : 'bg-amber-100 text-amber-800 dark:bg-amber-900/30 dark:text-amber-400'
54
+ }`}
55
+ >
56
+ Status: {isEven ? 'Even' : 'Odd'}
57
+ </div>
58
+ );
59
+ };
60
+
61
+ // A component that consumes the PluginManager via web context
62
+ const CounterComponent = () => {
63
+ // Use the web-context hook to get the PluginManager
64
+ const manager = useWebComponentContext(PluginManagerContext);
65
+ const capabilitiesAtom = useMemo(
66
+ () => manager?.capabilities.atom(Counter) ?? Atom.make<{ count: number; increment: () => void }[]>([]),
67
+ [manager],
68
+ );
69
+ const capabilities = useAtomValue(capabilitiesAtom);
70
+ const counter = (capabilities as any)[0];
71
+ const [count, setCount] = useState(counter?.count ?? 0);
72
+
73
+ useEffect(() => {
74
+ if (!counter) {
75
+ return;
76
+ }
77
+ setCount(counter.count);
78
+ if ('subscribe' in counter && typeof counter.subscribe === 'function') {
79
+ return counter.subscribe(() => setCount(counter.count));
80
+ }
81
+ }, [counter]);
82
+
83
+ if (!manager) {
84
+ return <div className='p-4 text-error-text'>Error: Context not found</div>;
85
+ }
86
+
87
+ return (
88
+ <div className='flex flex-col items-center justify-center h-screen bg-neutral-100 dark:bg-neutral-900 text-neutral-900 dark:text-white'>
89
+ <div className='p-8 bg-white dark:bg-neutral-800 rounded-lg shadow-xl border border-neutral-200 dark:border-neutral-700 max-w-md w-full'>
90
+ <h2 className='text-2xl font-bold mb-6 text-center text-primary-600 dark:text-primary-400'>
91
+ Web Context Counter
92
+ </h2>
93
+
94
+ <div className='flex flex-col items-center gap-6'>
95
+ <div className='text-6xl font-mono font-bold tabular-nums tracking-tighter'>{count}</div>
96
+
97
+ <button
98
+ className='px-6 py-3 bg-primary-600 hover:bg-primary-700 text-white font-semibold rounded-full transition-colors shadow-md active:transform active:scale-95'
99
+ onClick={() => {
100
+ const counter = manager.capabilities.get(Counter);
101
+ counter.increment();
102
+ }}
103
+ >
104
+ Increment
105
+ </button>
106
+
107
+ <CountStatus />
108
+ </div>
109
+
110
+ <div className='mt-8 pt-4 border-t border-neutral-200 dark:border-neutral-700 text-center'>
111
+ <p className='text-sm text-neutral-500 dark:text-neutral-400'>
112
+ This component accesses the <code>PluginManager</code> via <code>useWebComponentContext</code>.
113
+ </p>
114
+ </div>
115
+ </div>
116
+ </div>
117
+ );
118
+ };
119
+
120
+ // Plugin that provides the Counter capability and renders the UI
121
+ const CounterPlugin = Plugin.define(
122
+ Plugin.makeMeta({
123
+ key: DXN.make('org.dxos.plugin.counter'),
124
+ name: 'Counter Plugin',
125
+ tags: ['system'],
126
+ }),
127
+ ).pipe(
128
+ Plugin.addModule({
129
+ id: 'CounterMain',
130
+ activatesOn: ActivationEvents.Startup,
131
+ activate: () => {
132
+ const listeners = new Set<() => void>();
133
+ const counter = {
134
+ count: 0,
135
+ increment: () => {
136
+ counter.count++;
137
+ listeners.forEach((listener) => listener());
138
+ },
139
+ subscribe: (listener: () => void) => {
140
+ listeners.add(listener);
141
+ return () => listeners.delete(listener);
142
+ },
143
+ };
144
+
145
+ return Effect.succeed([
146
+ // Contribute the state/logic
147
+ Capability.contributes(Counter, counter),
148
+
149
+ // Contribute the UI
150
+ Capability.contributes(Capabilities.ReactRoot, {
151
+ id: 'org.dxos.plugin.counter.root',
152
+ root: CounterComponent,
153
+ }),
154
+ ]);
155
+ },
156
+ }),
157
+ Plugin.make,
158
+ )();
159
+
160
+ const plugins = [CounterPlugin];
161
+
162
+ const DefaultStory = () => {
163
+ const App = useApp({ plugins });
164
+
165
+ return <App />;
166
+ };
167
+
168
+ const meta = {
169
+ title: 'sdk/app-framework/components/PluginManagerContext',
170
+ render: DefaultStory,
171
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
172
+ parameters: {
173
+ layout: 'fullscreen',
174
+ },
175
+ } satisfies Meta;
176
+
177
+ export default meta;
178
+
179
+ export const Default: StoryObj<typeof meta> = {};
@@ -6,14 +6,14 @@ import { createContext, useContext } from 'react';
6
6
 
7
7
  import { raise } from '@dxos/debug';
8
8
 
9
- import { type PluginManager } from '../core';
9
+ import { type PluginManager } from '../../../core';
10
10
 
11
- const PluginManagerContext = createContext<PluginManager | undefined>(undefined);
11
+ const PluginManagerContext = createContext<PluginManager.PluginManager | undefined>(undefined);
12
12
 
13
13
  /**
14
14
  * Get the plugin manager.
15
15
  */
16
- export const usePluginManager = (): PluginManager =>
16
+ export const usePluginManager = (): PluginManager.PluginManager =>
17
17
  useContext(PluginManagerContext) ?? raise(new Error('Missing PluginManagerContext'));
18
18
 
19
19
  /**
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './PluginManagerProvider';