@dxos/app-framework 0.8.4-main.fd6878d → 0.8.4-staging.60fe92afc8

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 (556) hide show
  1. package/.storybook/main.mts +9 -0
  2. package/.storybook/preview.mts +8 -0
  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 +85 -157
  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 +321 -56
  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 +85 -157
  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 +321 -56
  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 -195
  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 +8 -8
  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 +308 -41
  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 -4
  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 +9 -10
  210. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  211. package/dist/types/src/testing/withPluginManager.stories.d.ts +9 -3
  212. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
  213. package/dist/types/src/ui/components/App/App.d.ts +41 -0
  214. package/dist/types/src/ui/components/App/App.d.ts.map +1 -0
  215. package/dist/types/src/ui/components/App/App.stories.d.ts +19 -0
  216. package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -0
  217. package/dist/types/src/ui/components/App/index.d.ts +2 -0
  218. package/dist/types/src/ui/components/App/index.d.ts.map +1 -0
  219. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts +13 -0
  220. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -0
  221. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts +10 -0
  222. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts.map +1 -0
  223. package/dist/types/src/ui/components/PluginManager/index.d.ts +2 -0
  224. package/dist/types/src/ui/components/PluginManager/index.d.ts.map +1 -0
  225. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +24 -0
  226. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -0
  227. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts +14 -0
  228. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -0
  229. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts +11 -0
  230. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +1 -0
  231. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts +48 -0
  232. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts.map +1 -0
  233. package/dist/types/src/ui/components/Surface/context.d.ts +5 -0
  234. package/dist/types/src/ui/components/Surface/context.d.ts.map +1 -0
  235. package/dist/types/src/ui/components/Surface/index.d.ts +36 -0
  236. package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -0
  237. package/dist/types/src/ui/components/Surface/types.d.ts +197 -0
  238. package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -0
  239. package/dist/types/src/ui/components/Surface/types.test.d.ts +2 -0
  240. package/dist/types/src/ui/components/Surface/types.test.d.ts.map +1 -0
  241. package/dist/types/src/ui/components/index.d.ts +4 -0
  242. package/dist/types/src/ui/components/index.d.ts.map +1 -0
  243. package/dist/types/src/ui/hooks/index.d.ts +7 -0
  244. package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
  245. package/dist/types/src/ui/hooks/useApp.d.ts +80 -0
  246. package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -0
  247. package/dist/types/src/ui/hooks/useApp.test.d.ts +2 -0
  248. package/dist/types/src/ui/hooks/useApp.test.d.ts.map +1 -0
  249. package/dist/types/src/ui/hooks/useCapabilities.d.ts +31 -0
  250. package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -0
  251. package/dist/types/src/ui/hooks/useLoading.d.ts +18 -0
  252. package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
  253. package/dist/types/src/ui/hooks/useProcessManagerRuntime.d.ts +30 -0
  254. package/dist/types/src/ui/hooks/useProcessManagerRuntime.d.ts.map +1 -0
  255. package/dist/types/src/ui/hooks/useSettingsState.d.ts +10 -0
  256. package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -0
  257. package/dist/types/src/ui/hooks/useSurface.d.ts +3 -0
  258. package/dist/types/src/ui/hooks/useSurface.d.ts.map +1 -0
  259. package/dist/types/src/ui/index.d.ts +3 -0
  260. package/dist/types/src/ui/index.d.ts.map +1 -0
  261. package/dist/types/src/vite-plugin/boot-loader/index.d.ts +2 -0
  262. package/dist/types/src/vite-plugin/boot-loader/index.d.ts.map +1 -0
  263. package/dist/types/src/vite-plugin/boot-loader/loader.d.ts +59 -0
  264. package/dist/types/src/vite-plugin/boot-loader/loader.d.ts.map +1 -0
  265. package/dist/types/src/vite-plugin/composer/index.d.ts +34 -0
  266. package/dist/types/src/vite-plugin/composer/index.d.ts.map +1 -0
  267. package/dist/types/src/vite-plugin/import-map/index.d.ts +28 -0
  268. package/dist/types/src/vite-plugin/import-map/index.d.ts.map +1 -0
  269. package/dist/types/src/vite-plugin/index.d.ts +5 -0
  270. package/dist/types/src/vite-plugin/index.d.ts.map +1 -0
  271. package/dist/types/src/vite-plugin/manifest.d.ts +41 -0
  272. package/dist/types/src/vite-plugin/manifest.d.ts.map +1 -0
  273. package/dist/types/src/vite-plugin/manifest.test.d.ts +2 -0
  274. package/dist/types/src/vite-plugin/manifest.test.d.ts.map +1 -0
  275. package/dist/types/src/vite-plugin/packages.d.ts +13 -0
  276. package/dist/types/src/vite-plugin/packages.d.ts.map +1 -0
  277. package/dist/types/tsconfig.tsbuildinfo +1 -1
  278. package/moon.yml +26 -3
  279. package/package.json +125 -55
  280. package/src/cli/cli.ts +102 -0
  281. package/src/{playground/layout → cli}/index.ts +1 -1
  282. package/src/common/activation-events.ts +39 -0
  283. package/src/{playground/debug/index.ts → common/annotations.ts} +0 -2
  284. package/src/common/capabilities.ts +287 -184
  285. package/src/common/index.ts +3 -8
  286. package/src/common/translations.ts +18 -10
  287. package/src/context.ts +9 -0
  288. package/src/core/{events.ts → activation-event.ts} +10 -7
  289. package/src/core/capability-manager.test.ts +154 -0
  290. package/src/core/capability-manager.ts +213 -0
  291. package/src/core/capability.ts +254 -0
  292. package/src/core/edge-registry-plugin-provider.ts +92 -0
  293. package/src/core/index.ts +11 -4
  294. package/src/core/plugin-asset-cache.ts +60 -0
  295. package/src/core/plugin-manager.test.ts +1929 -0
  296. package/src/core/plugin-manager.ts +1696 -0
  297. package/src/core/plugin-manifest.test.ts +75 -0
  298. package/src/core/plugin-manifest.ts +134 -0
  299. package/src/core/plugin.ts +458 -46
  300. package/src/core/registry.ts +163 -0
  301. package/src/core/url-loader.test.ts +222 -0
  302. package/src/core/url-loader.ts +388 -0
  303. package/src/index.ts +2 -4
  304. package/src/plugin-process-manager/ProcessManagerPlugin.ts +24 -0
  305. package/src/plugin-process-manager/history/capability.ts +36 -0
  306. package/src/plugin-process-manager/history/errors.ts +7 -0
  307. package/src/plugin-process-manager/history/history-tracker.test.ts +353 -0
  308. package/src/plugin-process-manager/history/history-tracker.ts +144 -0
  309. package/src/plugin-process-manager/history/index.ts +9 -0
  310. package/src/plugin-process-manager/history/types.ts +17 -0
  311. package/src/plugin-process-manager/history/undo-mapping.ts +135 -0
  312. package/src/plugin-process-manager/history/undo-registry.test.ts +74 -0
  313. package/src/plugin-process-manager/history/undo-registry.ts +54 -0
  314. package/src/plugin-process-manager/idb-key-value-store.ts +64 -0
  315. package/src/plugin-process-manager/index.ts +6 -0
  316. package/src/plugin-process-manager/meta.ts +16 -0
  317. package/src/plugin-process-manager/process-manager-capability.ts +178 -0
  318. package/src/plugin-process-manager/testing.ts +156 -0
  319. package/src/testing/harness.ts +247 -0
  320. package/src/testing/index.ts +3 -0
  321. package/src/testing/operationCapture.ts +144 -0
  322. package/src/testing/react.test.tsx +50 -0
  323. package/src/testing/react.tsx +113 -0
  324. package/src/testing/service.ts +52 -0
  325. package/src/testing/withPluginManager.stories.tsx +15 -13
  326. package/src/testing/withPluginManager.tsx +81 -56
  327. package/src/ui/components/App/App.stories.tsx +84 -0
  328. package/src/ui/components/App/App.tsx +144 -0
  329. package/src/{playground/logger → ui/components/App}/index.ts +1 -1
  330. package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +179 -0
  331. package/src/{react → ui/components/PluginManager}/PluginManagerProvider.ts +3 -3
  332. package/src/ui/components/PluginManager/index.ts +5 -0
  333. package/src/ui/components/Surface/SurfaceComponent.stories.tsx +144 -0
  334. package/src/ui/components/Surface/SurfaceComponent.tsx +303 -0
  335. package/src/ui/components/Surface/SurfaceInfo.tsx +106 -0
  336. package/src/ui/components/Surface/SurfaceProfilerContext.tsx +207 -0
  337. package/src/ui/components/Surface/context.ts +12 -0
  338. package/src/ui/components/Surface/index.ts +54 -0
  339. package/src/ui/components/Surface/types.test.ts +126 -0
  340. package/src/ui/components/Surface/types.ts +290 -0
  341. package/src/ui/components/index.ts +7 -0
  342. package/src/ui/hooks/index.ts +10 -0
  343. package/src/ui/hooks/useApp.test.tsx +161 -0
  344. package/src/ui/hooks/useApp.tsx +404 -0
  345. package/src/ui/hooks/useCapabilities.ts +68 -0
  346. package/src/ui/hooks/useLoading.tsx +76 -0
  347. package/src/ui/hooks/useProcessManagerRuntime.ts +78 -0
  348. package/src/ui/hooks/useSettingsState.ts +26 -0
  349. package/src/ui/hooks/useSurface.ts +13 -0
  350. package/src/ui/index.ts +6 -0
  351. package/src/vite-plugin/boot-loader/BootLoader.solid-stories.tsx +198 -0
  352. package/src/vite-plugin/boot-loader/index.ts +5 -0
  353. package/src/vite-plugin/boot-loader/loader-app/Loader.tsx +166 -0
  354. package/src/vite-plugin/boot-loader/loader-app/boot-loader.css +311 -0
  355. package/src/vite-plugin/boot-loader/loader-app/bridge.ts +25 -0
  356. package/src/vite-plugin/boot-loader/loader-app/entry.tsx +21 -0
  357. package/src/vite-plugin/boot-loader/loader-app/mount.tsx +70 -0
  358. package/src/vite-plugin/boot-loader/loader-app/store.test.ts +137 -0
  359. package/src/vite-plugin/boot-loader/loader-app/store.ts +149 -0
  360. package/src/vite-plugin/boot-loader/loader-app/tsconfig.json +11 -0
  361. package/src/vite-plugin/boot-loader/loader-app/types.ts +78 -0
  362. package/src/vite-plugin/boot-loader/loader.ts +204 -0
  363. package/src/vite-plugin/composer/index.ts +306 -0
  364. package/src/vite-plugin/import-map/index.ts +527 -0
  365. package/src/vite-plugin/index.ts +10 -0
  366. package/src/vite-plugin/manifest.test.ts +55 -0
  367. package/src/vite-plugin/manifest.ts +63 -0
  368. package/src/vite-plugin/packages.ts +187 -0
  369. package/tsconfig.json +31 -24
  370. package/tsconfig.node.json +2 -4
  371. package/typedoc.json +2 -4
  372. package/vitest.config.ts +8 -6
  373. package/.swc/plugins/v7_linux_x86_64_13.0.0/c614d7475354583212fbd7669acbae95b9832c305bf51bdaabe2e6de05abb6bf +0 -0
  374. package/.swc/plugins/v7_linux_x86_64_13.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429 +0 -0
  375. package/dist/lib/browser/app-graph-builder-MOVKFH3J.mjs +0 -137
  376. package/dist/lib/browser/app-graph-builder-MOVKFH3J.mjs.map +0 -7
  377. package/dist/lib/browser/chunk-NKCIDYDI.mjs +0 -1598
  378. package/dist/lib/browser/chunk-NKCIDYDI.mjs.map +0 -7
  379. package/dist/lib/browser/chunk-ORWHM7CO.mjs +0 -32
  380. package/dist/lib/browser/chunk-ORWHM7CO.mjs.map +0 -7
  381. package/dist/lib/browser/chunk-OSBZFKMO.mjs +0 -428
  382. package/dist/lib/browser/chunk-OSBZFKMO.mjs.map +0 -7
  383. package/dist/lib/browser/intent-dispatcher-FTTJLVGN.mjs +0 -11
  384. package/dist/lib/browser/intent-resolver-ZCGEAG3E.mjs +0 -39
  385. package/dist/lib/browser/intent-resolver-ZCGEAG3E.mjs.map +0 -7
  386. package/dist/lib/browser/store-3QB6Q2BC.mjs +0 -30
  387. package/dist/lib/browser/store-3QB6Q2BC.mjs.map +0 -7
  388. package/dist/lib/browser/worker.mjs +0 -79
  389. package/dist/lib/node-esm/app-graph-builder-ODE4B5GT.mjs +0 -138
  390. package/dist/lib/node-esm/app-graph-builder-ODE4B5GT.mjs.map +0 -7
  391. package/dist/lib/node-esm/chunk-UMZQERLE.mjs +0 -34
  392. package/dist/lib/node-esm/chunk-UMZQERLE.mjs.map +0 -7
  393. package/dist/lib/node-esm/chunk-WU3QN5B6.mjs +0 -429
  394. package/dist/lib/node-esm/chunk-WU3QN5B6.mjs.map +0 -7
  395. package/dist/lib/node-esm/chunk-YEN7NKTF.mjs +0 -1600
  396. package/dist/lib/node-esm/chunk-YEN7NKTF.mjs.map +0 -7
  397. package/dist/lib/node-esm/intent-dispatcher-YQIQ55LJ.mjs +0 -12
  398. package/dist/lib/node-esm/intent-resolver-KG27L7EQ.mjs +0 -40
  399. package/dist/lib/node-esm/intent-resolver-KG27L7EQ.mjs.map +0 -7
  400. package/dist/lib/node-esm/store-TIJAVO3D.mjs +0 -31
  401. package/dist/lib/node-esm/store-TIJAVO3D.mjs.map +0 -7
  402. package/dist/lib/node-esm/worker.mjs +0 -80
  403. package/dist/types/src/App.d.ts +0 -43
  404. package/dist/types/src/App.d.ts.map +0 -1
  405. package/dist/types/src/common/collaboration.d.ts +0 -19
  406. package/dist/types/src/common/collaboration.d.ts.map +0 -1
  407. package/dist/types/src/common/events.d.ts +0 -52
  408. package/dist/types/src/common/events.d.ts.map +0 -1
  409. package/dist/types/src/common/file.d.ts +0 -14
  410. package/dist/types/src/common/file.d.ts.map +0 -1
  411. package/dist/types/src/common/graph.d.ts +0 -21
  412. package/dist/types/src/common/graph.d.ts.map +0 -1
  413. package/dist/types/src/common/layout.d.ts +0 -281
  414. package/dist/types/src/common/layout.d.ts.map +0 -1
  415. package/dist/types/src/common/surface.d.ts +0 -65
  416. package/dist/types/src/common/surface.d.ts.map +0 -1
  417. package/dist/types/src/core/capabilities.d.ts +0 -114
  418. package/dist/types/src/core/capabilities.d.ts.map +0 -1
  419. package/dist/types/src/core/capabilities.test.d.ts +0 -2
  420. package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
  421. package/dist/types/src/core/events.d.ts.map +0 -1
  422. package/dist/types/src/core/manager.d.ts +0 -126
  423. package/dist/types/src/core/manager.d.ts.map +0 -1
  424. package/dist/types/src/core/manager.test.d.ts +0 -2
  425. package/dist/types/src/core/manager.test.d.ts.map +0 -1
  426. package/dist/types/src/playground/debug/Debug.d.ts +0 -6
  427. package/dist/types/src/playground/debug/Debug.d.ts.map +0 -1
  428. package/dist/types/src/playground/debug/index.d.ts +0 -2
  429. package/dist/types/src/playground/debug/index.d.ts.map +0 -1
  430. package/dist/types/src/playground/debug/plugin.d.ts +0 -2
  431. package/dist/types/src/playground/debug/plugin.d.ts.map +0 -1
  432. package/dist/types/src/playground/generator/Main.d.ts +0 -6
  433. package/dist/types/src/playground/generator/Main.d.ts.map +0 -1
  434. package/dist/types/src/playground/generator/Toolbar.d.ts +0 -6
  435. package/dist/types/src/playground/generator/Toolbar.d.ts.map +0 -1
  436. package/dist/types/src/playground/generator/generator.d.ts +0 -7
  437. package/dist/types/src/playground/generator/generator.d.ts.map +0 -1
  438. package/dist/types/src/playground/generator/index.d.ts +0 -3
  439. package/dist/types/src/playground/generator/index.d.ts.map +0 -1
  440. package/dist/types/src/playground/generator/plugin.d.ts +0 -2
  441. package/dist/types/src/playground/generator/plugin.d.ts.map +0 -1
  442. package/dist/types/src/playground/layout/Layout.d.ts +0 -8
  443. package/dist/types/src/playground/layout/Layout.d.ts.map +0 -1
  444. package/dist/types/src/playground/layout/index.d.ts +0 -2
  445. package/dist/types/src/playground/layout/index.d.ts.map +0 -1
  446. package/dist/types/src/playground/layout/plugin.d.ts +0 -2
  447. package/dist/types/src/playground/layout/plugin.d.ts.map +0 -1
  448. package/dist/types/src/playground/logger/Toolbar.d.ts +0 -6
  449. package/dist/types/src/playground/logger/Toolbar.d.ts.map +0 -1
  450. package/dist/types/src/playground/logger/index.d.ts +0 -2
  451. package/dist/types/src/playground/logger/index.d.ts.map +0 -1
  452. package/dist/types/src/playground/logger/plugin.d.ts +0 -2
  453. package/dist/types/src/playground/logger/plugin.d.ts.map +0 -1
  454. package/dist/types/src/playground/logger/schema.d.ts +0 -13
  455. package/dist/types/src/playground/logger/schema.d.ts.map +0 -1
  456. package/dist/types/src/playground/playground.stories.d.ts +0 -10
  457. package/dist/types/src/playground/playground.stories.d.ts.map +0 -1
  458. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +0 -2
  459. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +0 -1
  460. package/dist/types/src/plugin-intent/actions.d.ts +0 -38
  461. package/dist/types/src/plugin-intent/actions.d.ts.map +0 -1
  462. package/dist/types/src/plugin-intent/errors.d.ts +0 -16
  463. package/dist/types/src/plugin-intent/errors.d.ts.map +0 -1
  464. package/dist/types/src/plugin-intent/index.d.ts +0 -5
  465. package/dist/types/src/plugin-intent/index.d.ts.map +0 -1
  466. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +0 -139
  467. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +0 -1
  468. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +0 -2
  469. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +0 -1
  470. package/dist/types/src/plugin-intent/intent.d.ts +0 -63
  471. package/dist/types/src/plugin-intent/intent.d.ts.map +0 -1
  472. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +0 -2
  473. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +0 -1
  474. package/dist/types/src/plugin-settings/actions.d.ts +0 -27
  475. package/dist/types/src/plugin-settings/actions.d.ts.map +0 -1
  476. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +0 -4
  477. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +0 -1
  478. package/dist/types/src/plugin-settings/index.d.ts +0 -3
  479. package/dist/types/src/plugin-settings/index.d.ts.map +0 -1
  480. package/dist/types/src/plugin-settings/intent-resolver.d.ts +0 -4
  481. package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +0 -1
  482. package/dist/types/src/plugin-settings/store.d.ts +0 -5
  483. package/dist/types/src/plugin-settings/store.d.ts.map +0 -1
  484. package/dist/types/src/plugin-settings/translations.d.ts +0 -10
  485. package/dist/types/src/plugin-settings/translations.d.ts.map +0 -1
  486. package/dist/types/src/react/ErrorBoundary.d.ts +0 -30
  487. package/dist/types/src/react/ErrorBoundary.d.ts.map +0 -1
  488. package/dist/types/src/react/IntentContext.d.ts +0 -8
  489. package/dist/types/src/react/IntentContext.d.ts.map +0 -1
  490. package/dist/types/src/react/PluginManagerProvider.d.ts +0 -10
  491. package/dist/types/src/react/PluginManagerProvider.d.ts.map +0 -1
  492. package/dist/types/src/react/Surface.d.ts +0 -12
  493. package/dist/types/src/react/Surface.d.ts.map +0 -1
  494. package/dist/types/src/react/Surface.stories.d.ts +0 -16
  495. package/dist/types/src/react/Surface.stories.d.ts.map +0 -1
  496. package/dist/types/src/react/common.d.ts +0 -13
  497. package/dist/types/src/react/common.d.ts.map +0 -1
  498. package/dist/types/src/react/index.d.ts +0 -7
  499. package/dist/types/src/react/index.d.ts.map +0 -1
  500. package/dist/types/src/react/useCapabilities.d.ts +0 -13
  501. package/dist/types/src/react/useCapabilities.d.ts.map +0 -1
  502. package/dist/types/src/react/useIntentResolver.d.ts +0 -3
  503. package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
  504. package/dist/types/src/worker.d.ts +0 -4
  505. package/dist/types/src/worker.d.ts.map +0 -1
  506. package/src/App.tsx +0 -284
  507. package/src/common/collaboration.ts +0 -21
  508. package/src/common/events.ts +0 -79
  509. package/src/common/file.ts +0 -22
  510. package/src/common/graph.ts +0 -30
  511. package/src/common/layout.ts +0 -278
  512. package/src/common/surface.ts +0 -86
  513. package/src/core/capabilities.test.ts +0 -136
  514. package/src/core/capabilities.ts +0 -255
  515. package/src/core/manager.test.ts +0 -516
  516. package/src/core/manager.ts +0 -597
  517. package/src/playground/debug/Debug.tsx +0 -39
  518. package/src/playground/debug/plugin.ts +0 -17
  519. package/src/playground/generator/Main.tsx +0 -71
  520. package/src/playground/generator/Toolbar.tsx +0 -47
  521. package/src/playground/generator/generator.ts +0 -48
  522. package/src/playground/generator/index.ts +0 -6
  523. package/src/playground/generator/plugin.ts +0 -23
  524. package/src/playground/layout/Layout.tsx +0 -33
  525. package/src/playground/layout/plugin.ts +0 -17
  526. package/src/playground/logger/Toolbar.tsx +0 -30
  527. package/src/playground/logger/plugin.ts +0 -37
  528. package/src/playground/logger/schema.ts +0 -12
  529. package/src/playground/playground.stories.tsx +0 -43
  530. package/src/plugin-intent/IntentPlugin.ts +0 -21
  531. package/src/plugin-intent/actions.ts +0 -33
  532. package/src/plugin-intent/errors.ts +0 -39
  533. package/src/plugin-intent/index.ts +0 -8
  534. package/src/plugin-intent/intent-dispatcher.test.ts +0 -279
  535. package/src/plugin-intent/intent-dispatcher.ts +0 -334
  536. package/src/plugin-intent/intent.ts +0 -154
  537. package/src/plugin-settings/SettingsPlugin.ts +0 -36
  538. package/src/plugin-settings/actions.ts +0 -29
  539. package/src/plugin-settings/app-graph-builder.ts +0 -158
  540. package/src/plugin-settings/index.ts +0 -6
  541. package/src/plugin-settings/intent-resolver.ts +0 -35
  542. package/src/plugin-settings/store.ts +0 -33
  543. package/src/plugin-settings/translations.ts +0 -19
  544. package/src/react/ErrorBoundary.tsx +0 -54
  545. package/src/react/IntentContext.tsx +0 -35
  546. package/src/react/Surface.stories.tsx +0 -97
  547. package/src/react/Surface.tsx +0 -78
  548. package/src/react/common.ts +0 -13
  549. package/src/react/index.ts +0 -10
  550. package/src/react/useCapabilities.ts +0 -31
  551. package/src/react/useIntentResolver.ts +0 -22
  552. package/src/worker.ts +0 -11
  553. /package/dist/lib/browser/{intent-dispatcher-FTTJLVGN.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  554. /package/dist/lib/browser/{worker.mjs.map → common/activation-events.mjs.map} +0 -0
  555. /package/dist/lib/{node-esm/intent-dispatcher-YQIQ55LJ.mjs.map → browser/common/capabilities.mjs.map} +0 -0
  556. /package/dist/lib/{node-esm/worker.mjs.map → browser/core/activation-event.mjs.map} +0 -0
@@ -2,30 +2,19 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { type Decorator } from '@storybook/react';
6
- import React, { useEffect, useMemo } from 'react';
5
+ import { type Decorator, type StoryContext } from '@storybook/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';
12
+ import { useAsyncEffect } from '@dxos/react-hooks';
13
+ import { type MaybeProvider, getProviderValue } from '@dxos/util';
9
14
 
10
- import { type CreateAppOptions, useApp } from '../App';
11
- import { Capabilities, Events } from '../common';
12
- import {
13
- type ActivationEvent,
14
- type AnyCapability,
15
- type PluginContext,
16
- PluginManager,
17
- contributes,
18
- defineModule,
19
- definePlugin,
20
- } from '../core';
21
-
22
- // TODO(burdon): Factor out (use consistently in plugin framework?)
23
- export type Provider<C, R> = (context: C) => R;
24
- export type ProviderOrValue<C, R> = Provider<C, R> | R;
25
-
26
- export const getValue = <C, R>(providerOrValue: ProviderOrValue<C, R>, context: C): R => {
27
- return typeof providerOrValue === 'function' ? (providerOrValue as Provider<C, R>)(context) : providerOrValue;
28
- };
15
+ import { ActivationEvents, Capabilities } from '../common';
16
+ import { type ActivationEvent, Capability, type CapabilityManager, Plugin, PluginManager } from '../core';
17
+ import { type UseAppOptions, useApp } from '../ui';
29
18
 
30
19
  /**
31
20
  * @internal
@@ -33,19 +22,21 @@ export const getValue = <C, R>(providerOrValue: ProviderOrValue<C, R>, context:
33
22
  export const setupPluginManager = ({
34
23
  capabilities,
35
24
  plugins = [],
36
- core = plugins.map(({ meta }) => meta.id),
37
25
  ...options
38
- }: CreateAppOptions & Pick<WithPluginManagerOptions, 'capabilities'> = {}) => {
39
- const pluginManager = new PluginManager({
26
+ }: UseAppOptions & Pick<WithPluginManagerOptions, 'capabilities'> = {}) => {
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({
40
31
  pluginLoader: () => raise(new Error('Not implemented')),
41
- plugins: [storyPlugin(), ...plugins],
42
- core: [STORY_PLUGIN, ...core],
32
+ plugins: [StoryPlugin, ...plugins],
33
+ enabled,
43
34
  ...options,
44
35
  });
45
36
 
46
37
  if (capabilities) {
47
- getValue(capabilities, pluginManager.context).forEach((capability) => {
48
- pluginManager.context.contributeCapability({
38
+ getProviderValue(capabilities, pluginManager.capabilities).forEach((capability) => {
39
+ pluginManager.capabilities.contribute({
49
40
  interface: capability.interface,
50
41
  implementation: capability.implementation,
51
42
  module: 'story',
@@ -56,58 +47,92 @@ export const setupPluginManager = ({
56
47
  return pluginManager;
57
48
  };
58
49
 
59
- export type WithPluginManagerOptions = CreateAppOptions & {
50
+ type ManagedPluginManagerState = {
51
+ fireEvents?: (ActivationEvent.ActivationEvent | string)[];
52
+ pluginManager: PluginManager.PluginManager;
53
+ setupEvents?: ActivationEvent.ActivationEvent[];
54
+ storyId: string;
55
+ };
56
+
57
+ export type WithPluginManagerOptions = UseAppOptions & {
60
58
  /** @deprecated */
61
- capabilities?: ProviderOrValue<PluginContext, AnyCapability[]>;
59
+ capabilities?: MaybeProvider<Capability.Any[], CapabilityManager.CapabilityManager>;
62
60
  /** @deprecated */
63
- fireEvents?: (ActivationEvent | string)[];
61
+ fireEvents?: (ActivationEvent.ActivationEvent | string)[];
64
62
  };
65
63
 
64
+ export type WithPluginManagerInitializer<Args = void> =
65
+ | WithPluginManagerOptions
66
+ | ((context: StoryContext<Args>) => WithPluginManagerOptions);
67
+
66
68
  /**
67
69
  * Wraps a story with a plugin manager.
68
70
  * NOTE: This builds up and tears down the plugin manager on every render.
69
71
  */
70
- export const withPluginManager = (options: WithPluginManagerOptions = {}): Decorator => {
72
+ export const withPluginManager = <Args,>(init: WithPluginManagerInitializer<Args> = {}): Decorator => {
71
73
  return (Story, context) => {
72
- const pluginManager = useMemo(() => setupPluginManager(options), [options]);
74
+ const storyId = context.id;
75
+ const options = typeof init === 'function' ? init(context as any) : init;
76
+ const [managerState, setManagerState] = useState<ManagedPluginManagerState>();
73
77
 
74
- // Set-up root capability.
78
+ // Storybook replaces the full context object often, so key manager ownership by story id.
75
79
  useEffect(() => {
76
- const capability = contributes(Capabilities.ReactRoot, {
77
- id: context.id,
80
+ const pluginManager = setupPluginManager(options);
81
+ const capability = Capability.contributes(Capabilities.ReactRoot, {
82
+ id: storyId,
78
83
  root: () => <Story />,
79
84
  });
80
85
 
81
- pluginManager.context.contributeCapability({
86
+ pluginManager.capabilities.contribute({
82
87
  ...capability,
83
- 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,
84
96
  });
85
97
 
86
98
  return () => {
87
- pluginManager.context.removeCapability(capability.interface, capability.implementation);
99
+ pluginManager.capabilities.remove(capability.interface, capability.implementation);
100
+ void EffectEx.runAndForwardErrors(pluginManager.shutdown());
88
101
  };
89
- }, [pluginManager, context]);
102
+ }, [storyId, init]);
90
103
 
91
- // Fire events.
92
- useEffect(() => {
93
- const timeout = setTimeout(async () => {
94
- await Promise.all(options.fireEvents?.map((event) => pluginManager.activate(event)) ?? []);
95
- });
104
+ // Avoid mounting useApp with a stale manager from the previous story.
105
+ if (!managerState || managerState.storyId !== storyId) {
106
+ return <></>;
107
+ }
96
108
 
97
- return () => clearTimeout(timeout);
98
- }, [pluginManager]);
109
+ return <WithPluginManagerApp {...managerState} />;
110
+ };
111
+ };
99
112
 
100
- // Create app.
101
- const App = useApp({ pluginManager });
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]);
102
118
 
103
- return <App />;
104
- };
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 STORY_PLUGIN = 'dxos.org/app-framework/story';
110
- const storyPlugin = () =>
111
- definePlugin({ id: STORY_PLUGIN, name: 'Story' }, [
112
- defineModule({ id: STORY_PLUGIN, activatesOn: Events.Startup, activate: () => [] }),
113
- ]);
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';