@dxos/app-framework 0.8.4-main.84f28bd → 0.8.4-main.8baae0fced

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 (728) 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-K5XIVCQU.mjs +35 -0
  6. package/dist/lib/browser/capability-K5XIVCQU.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-5AHASNDW.mjs +95 -0
  8. package/dist/lib/browser/chunk-5AHASNDW.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-5GY3YOEL.mjs +28 -0
  10. package/dist/lib/browser/chunk-5GY3YOEL.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-66IXTIVK.mjs +48 -0
  12. package/dist/lib/browser/chunk-66IXTIVK.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-BRK6GYNB.mjs +142 -0
  14. package/dist/lib/browser/chunk-BRK6GYNB.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-IW44C7UL.mjs +83 -0
  20. package/dist/lib/browser/chunk-IW44C7UL.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  22. package/dist/lib/browser/chunk-KFDF7KR3.mjs +42 -0
  23. package/dist/lib/browser/chunk-KFDF7KR3.mjs.map +7 -0
  24. package/dist/lib/browser/chunk-KLHQNYJ2.mjs +422 -0
  25. package/dist/lib/browser/chunk-KLHQNYJ2.mjs.map +7 -0
  26. package/dist/lib/browser/chunk-QLML5QFJ.mjs +581 -0
  27. package/dist/lib/browser/chunk-QLML5QFJ.mjs.map +7 -0
  28. package/dist/lib/browser/chunk-SLX73WRZ.mjs +218 -0
  29. package/dist/lib/browser/chunk-SLX73WRZ.mjs.map +7 -0
  30. package/dist/lib/browser/chunk-UVTGHZQF.mjs +513 -0
  31. package/dist/lib/browser/chunk-UVTGHZQF.mjs.map +7 -0
  32. package/dist/lib/browser/chunk-VJ5PFAWC.mjs +1446 -0
  33. package/dist/lib/browser/chunk-VJ5PFAWC.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 +39 -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 -156
  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-JIWLN7SU.mjs +89 -0
  51. package/dist/lib/browser/process-manager-capability-JIWLN7SU.mjs.map +7 -0
  52. package/dist/lib/browser/testing/index.mjs +249 -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 +54 -0
  57. package/dist/lib/browser/ui/index.mjs.map +7 -0
  58. package/dist/lib/node-esm/capability-RLKFFLTB.mjs +36 -0
  59. package/dist/lib/node-esm/capability-RLKFFLTB.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-42UNAKYO.mjs +423 -0
  63. package/dist/lib/node-esm/chunk-42UNAKYO.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-6S45OMUP.mjs +219 -0
  65. package/dist/lib/node-esm/chunk-6S45OMUP.mjs.map +7 -0
  66. package/dist/lib/node-esm/chunk-BYHYYJZH.mjs +143 -0
  67. package/dist/lib/node-esm/chunk-BYHYYJZH.mjs.map +7 -0
  68. package/dist/lib/node-esm/chunk-CTKEZHKF.mjs +84 -0
  69. package/dist/lib/node-esm/chunk-CTKEZHKF.mjs.map +7 -0
  70. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  71. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  72. package/dist/lib/node-esm/chunk-JNT72ZCN.mjs +514 -0
  73. package/dist/lib/node-esm/chunk-JNT72ZCN.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-LJNUFNDO.mjs +582 -0
  77. package/dist/lib/node-esm/chunk-LJNUFNDO.mjs.map +7 -0
  78. package/dist/lib/node-esm/chunk-OUEMWPIW.mjs +43 -0
  79. package/dist/lib/node-esm/chunk-OUEMWPIW.mjs.map +7 -0
  80. package/dist/lib/node-esm/chunk-PW2VYGOS.mjs +96 -0
  81. package/dist/lib/node-esm/chunk-PW2VYGOS.mjs.map +7 -0
  82. package/dist/lib/node-esm/chunk-SFYCO3PT.mjs +1447 -0
  83. package/dist/lib/node-esm/chunk-SFYCO3PT.mjs.map +7 -0
  84. package/dist/lib/node-esm/chunk-WK7OIQKI.mjs +70 -0
  85. package/dist/lib/node-esm/chunk-WK7OIQKI.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 +40 -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 -156
  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-PHKLO2BL.mjs +90 -0
  108. package/dist/lib/node-esm/process-manager-capability-PHKLO2BL.mjs.map +7 -0
  109. package/dist/lib/node-esm/testing/index.mjs +249 -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 +55 -0
  114. package/dist/lib/node-esm/ui/index.mjs.map +7 -0
  115. package/dist/plugin/node-esm/index.mjs +893 -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 -120
  127. package/dist/types/src/common/capabilities.d.ts.map +1 -1
  128. package/dist/types/src/common/index.d.ts +4 -8
  129. package/dist/types/src/common/index.d.ts.map +1 -1
  130. package/dist/types/src/common/operations.d.ts +19 -0
  131. package/dist/types/src/common/operations.d.ts.map +1 -0
  132. package/dist/types/src/common/translations.d.ts +8 -8
  133. package/dist/types/src/common/translations.d.ts.map +1 -1
  134. package/dist/types/src/context.d.ts +5 -0
  135. package/dist/types/src/context.d.ts.map +1 -0
  136. package/dist/types/src/core/{events.d.ts → activation-event.d.ts} +11 -11
  137. package/dist/types/src/core/activation-event.d.ts.map +1 -0
  138. package/dist/types/src/core/capability-manager.d.ts +48 -0
  139. package/dist/types/src/core/capability-manager.d.ts.map +1 -0
  140. package/dist/types/src/core/capability-manager.test.d.ts +2 -0
  141. package/dist/types/src/core/capability-manager.test.d.ts.map +1 -0
  142. package/dist/types/src/core/capability.d.ts +161 -0
  143. package/dist/types/src/core/capability.d.ts.map +1 -0
  144. package/dist/types/src/core/edge-registry-plugin-provider.d.ts +30 -0
  145. package/dist/types/src/core/edge-registry-plugin-provider.d.ts.map +1 -0
  146. package/dist/types/src/core/index.d.ts +11 -4
  147. package/dist/types/src/core/index.d.ts.map +1 -1
  148. package/dist/types/src/core/plugin-asset-cache.d.ts +71 -0
  149. package/dist/types/src/core/plugin-asset-cache.d.ts.map +1 -0
  150. package/dist/types/src/core/plugin-manager.d.ts +297 -0
  151. package/dist/types/src/core/plugin-manager.d.ts.map +1 -0
  152. package/dist/types/src/core/plugin-manager.test.d.ts +2 -0
  153. package/dist/types/src/core/plugin-manager.test.d.ts.map +1 -0
  154. package/dist/types/src/core/plugin-manifest.d.ts +101 -0
  155. package/dist/types/src/core/plugin-manifest.d.ts.map +1 -0
  156. package/dist/types/src/core/plugin-manifest.test.d.ts +2 -0
  157. package/dist/types/src/core/plugin-manifest.test.d.ts.map +1 -0
  158. package/dist/types/src/core/plugin.d.ts +277 -37
  159. package/dist/types/src/core/plugin.d.ts.map +1 -1
  160. package/dist/types/src/core/registry.d.ts +107 -0
  161. package/dist/types/src/core/registry.d.ts.map +1 -0
  162. package/dist/types/src/core/url-loader.d.ts +127 -0
  163. package/dist/types/src/core/url-loader.d.ts.map +1 -0
  164. package/dist/types/src/core/url-loader.test.d.ts +2 -0
  165. package/dist/types/src/core/url-loader.test.d.ts.map +1 -0
  166. package/dist/types/src/helpers.d.ts.map +1 -1
  167. package/dist/types/src/index.d.ts +2 -4
  168. package/dist/types/src/index.d.ts.map +1 -1
  169. package/dist/types/src/plugin-process-manager/ProcessManagerPlugin.d.ts +3 -0
  170. package/dist/types/src/plugin-process-manager/ProcessManagerPlugin.d.ts.map +1 -0
  171. package/dist/types/src/plugin-process-manager/history/capability.d.ts +7 -0
  172. package/dist/types/src/plugin-process-manager/history/capability.d.ts.map +1 -0
  173. package/dist/types/src/plugin-process-manager/history/errors.d.ts +32 -0
  174. package/dist/types/src/plugin-process-manager/history/errors.d.ts.map +1 -0
  175. package/dist/types/src/plugin-process-manager/history/history-tracker.d.ts +18 -0
  176. package/dist/types/src/plugin-process-manager/history/history-tracker.d.ts.map +1 -0
  177. package/dist/types/src/plugin-process-manager/history/history-tracker.test.d.ts +2 -0
  178. package/dist/types/src/plugin-process-manager/history/history-tracker.test.d.ts.map +1 -0
  179. package/dist/types/src/plugin-process-manager/history/index.d.ts +6 -0
  180. package/dist/types/src/plugin-process-manager/history/index.d.ts.map +1 -0
  181. package/dist/types/src/plugin-process-manager/history/types.d.ts +13 -0
  182. package/dist/types/src/plugin-process-manager/history/types.d.ts.map +1 -0
  183. package/dist/types/src/plugin-process-manager/history/undo-mapping.d.ts +101 -0
  184. package/dist/types/src/plugin-process-manager/history/undo-mapping.d.ts.map +1 -0
  185. package/dist/types/src/plugin-process-manager/history/undo-registry.d.ts +23 -0
  186. package/dist/types/src/plugin-process-manager/history/undo-registry.d.ts.map +1 -0
  187. package/dist/types/src/plugin-process-manager/history/undo-registry.test.d.ts +2 -0
  188. package/dist/types/src/plugin-process-manager/history/undo-registry.test.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 +2 -0
  200. package/dist/types/src/testing/index.d.ts.map +1 -1
  201. package/dist/types/src/testing/react.d.ts +27 -0
  202. package/dist/types/src/testing/react.d.ts.map +1 -0
  203. package/dist/types/src/testing/react.test.d.ts +2 -0
  204. package/dist/types/src/testing/react.test.d.ts.map +1 -0
  205. package/dist/types/src/testing/service.d.ts +8 -0
  206. package/dist/types/src/testing/service.d.ts.map +1 -0
  207. package/dist/types/src/testing/withPluginManager.d.ts +11 -10
  208. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  209. package/dist/types/src/testing/withPluginManager.stories.d.ts +9 -3
  210. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
  211. package/dist/types/src/ui/components/App/App.d.ts +9 -0
  212. package/dist/types/src/ui/components/App/App.d.ts.map +1 -0
  213. package/dist/types/src/ui/components/App/App.stories.d.ts +19 -0
  214. package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -0
  215. package/dist/types/src/ui/components/App/index.d.ts +2 -0
  216. package/dist/types/src/ui/components/App/index.d.ts.map +1 -0
  217. package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts +64 -0
  218. package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts.map +1 -0
  219. package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts +19 -0
  220. package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts.map +1 -0
  221. package/dist/types/src/ui/components/Placeholder/index.d.ts +2 -0
  222. package/dist/types/src/ui/components/Placeholder/index.d.ts.map +1 -0
  223. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts +13 -0
  224. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -0
  225. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts +10 -0
  226. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts.map +1 -0
  227. package/dist/types/src/ui/components/PluginManager/index.d.ts +2 -0
  228. package/dist/types/src/ui/components/PluginManager/index.d.ts.map +1 -0
  229. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +24 -0
  230. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -0
  231. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts +14 -0
  232. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -0
  233. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts +11 -0
  234. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +1 -0
  235. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts +48 -0
  236. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts.map +1 -0
  237. package/dist/types/src/ui/components/Surface/context.d.ts +5 -0
  238. package/dist/types/src/ui/components/Surface/context.d.ts.map +1 -0
  239. package/dist/types/src/ui/components/Surface/index.d.ts +36 -0
  240. package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -0
  241. package/dist/types/src/ui/components/Surface/types.d.ts +197 -0
  242. package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -0
  243. package/dist/types/src/ui/components/Surface/types.test.d.ts +2 -0
  244. package/dist/types/src/ui/components/Surface/types.test.d.ts.map +1 -0
  245. package/dist/types/src/ui/components/index.d.ts +5 -0
  246. package/dist/types/src/ui/components/index.d.ts.map +1 -0
  247. package/dist/types/src/ui/hooks/index.d.ts +7 -0
  248. package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
  249. package/dist/types/src/ui/hooks/useApp.d.ts +86 -0
  250. package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -0
  251. package/dist/types/src/ui/hooks/useApp.test.d.ts +2 -0
  252. package/dist/types/src/ui/hooks/useApp.test.d.ts.map +1 -0
  253. package/dist/types/src/ui/hooks/useCapabilities.d.ts +31 -0
  254. package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -0
  255. package/dist/types/src/ui/hooks/useLoading.d.ts +18 -0
  256. package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
  257. package/dist/types/src/ui/hooks/useProcessManagerRuntime.d.ts +24 -0
  258. package/dist/types/src/ui/hooks/useProcessManagerRuntime.d.ts.map +1 -0
  259. package/dist/types/src/ui/hooks/useSettingsState.d.ts +10 -0
  260. package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -0
  261. package/dist/types/src/ui/hooks/useSurface.d.ts +3 -0
  262. package/dist/types/src/ui/hooks/useSurface.d.ts.map +1 -0
  263. package/dist/types/src/ui/index.d.ts +3 -0
  264. package/dist/types/src/ui/index.d.ts.map +1 -0
  265. package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts +34 -0
  266. package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts.map +1 -0
  267. package/dist/types/src/vite-plugin/boot-loader/index.d.ts +2 -0
  268. package/dist/types/src/vite-plugin/boot-loader/index.d.ts.map +1 -0
  269. package/dist/types/src/vite-plugin/boot-loader/loader.d.ts +51 -0
  270. package/dist/types/src/vite-plugin/boot-loader/loader.d.ts.map +1 -0
  271. package/dist/types/src/vite-plugin/composer/index.d.ts +34 -0
  272. package/dist/types/src/vite-plugin/composer/index.d.ts.map +1 -0
  273. package/dist/types/src/vite-plugin/import-map/index.d.ts +28 -0
  274. package/dist/types/src/vite-plugin/import-map/index.d.ts.map +1 -0
  275. package/dist/types/src/vite-plugin/index.d.ts +5 -0
  276. package/dist/types/src/vite-plugin/index.d.ts.map +1 -0
  277. package/dist/types/src/vite-plugin/manifest.d.ts +41 -0
  278. package/dist/types/src/vite-plugin/manifest.d.ts.map +1 -0
  279. package/dist/types/src/vite-plugin/manifest.test.d.ts +2 -0
  280. package/dist/types/src/vite-plugin/manifest.test.d.ts.map +1 -0
  281. package/dist/types/src/vite-plugin/packages.d.ts +13 -0
  282. package/dist/types/src/vite-plugin/packages.d.ts.map +1 -0
  283. package/dist/types/tsconfig.tsbuildinfo +1 -1
  284. package/moon.yml +26 -3
  285. package/package.json +121 -53
  286. package/src/cli/cli.ts +102 -0
  287. package/src/{playground/layout → cli}/index.ts +1 -1
  288. package/src/common/activation-events.ts +39 -0
  289. package/src/{playground/debug/index.ts → common/annotations.ts} +0 -2
  290. package/src/common/capabilities.ts +304 -108
  291. package/src/common/index.ts +4 -8
  292. package/src/common/operations.ts +35 -0
  293. package/src/common/translations.ts +18 -10
  294. package/src/context.ts +9 -0
  295. package/src/core/{events.ts → activation-event.ts} +10 -7
  296. package/src/core/capability-manager.test.ts +151 -0
  297. package/src/core/capability-manager.ts +192 -0
  298. package/src/core/capability.ts +254 -0
  299. package/src/core/edge-registry-plugin-provider.ts +92 -0
  300. package/src/core/index.ts +11 -4
  301. package/src/core/plugin-asset-cache.ts +60 -0
  302. package/src/core/plugin-manager.test.ts +1899 -0
  303. package/src/core/plugin-manager.ts +1687 -0
  304. package/src/core/plugin-manifest.test.ts +75 -0
  305. package/src/core/plugin-manifest.ts +134 -0
  306. package/src/core/plugin.ts +419 -43
  307. package/src/core/registry.ts +163 -0
  308. package/src/core/url-loader.test.ts +221 -0
  309. package/src/core/url-loader.ts +388 -0
  310. package/src/helpers.test.ts +1 -1
  311. package/src/index.ts +2 -4
  312. package/src/plugin-process-manager/ProcessManagerPlugin.ts +24 -0
  313. package/src/plugin-process-manager/history/capability.ts +36 -0
  314. package/src/plugin-process-manager/history/errors.ts +7 -0
  315. package/src/plugin-process-manager/history/history-tracker.test.ts +374 -0
  316. package/src/plugin-process-manager/history/history-tracker.ts +128 -0
  317. package/src/plugin-process-manager/history/index.ts +9 -0
  318. package/src/plugin-process-manager/history/types.ts +17 -0
  319. package/src/plugin-process-manager/history/undo-mapping.ts +135 -0
  320. package/src/plugin-process-manager/history/undo-registry.test.ts +72 -0
  321. package/src/plugin-process-manager/history/undo-registry.ts +54 -0
  322. package/src/plugin-process-manager/index.ts +6 -0
  323. package/src/plugin-process-manager/meta.ts +14 -0
  324. package/src/plugin-process-manager/process-manager-capability.ts +178 -0
  325. package/src/plugin-process-manager/testing.ts +155 -0
  326. package/src/testing/harness.ts +247 -0
  327. package/src/testing/index.ts +2 -0
  328. package/src/testing/react.test.tsx +48 -0
  329. package/src/testing/react.tsx +113 -0
  330. package/src/testing/service.ts +52 -0
  331. package/src/testing/withPluginManager.stories.tsx +15 -12
  332. package/src/testing/withPluginManager.tsx +82 -55
  333. package/src/ui/components/App/App.stories.tsx +86 -0
  334. package/src/ui/components/App/App.tsx +81 -0
  335. package/src/{playground/logger → ui/components/App}/index.ts +1 -1
  336. package/src/ui/components/Placeholder/Placeholder.stories.tsx +77 -0
  337. package/src/ui/components/Placeholder/Placeholder.tsx +155 -0
  338. package/src/ui/components/Placeholder/index.ts +5 -0
  339. package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +184 -0
  340. package/src/{react → ui/components/PluginManager}/PluginManagerProvider.ts +3 -3
  341. package/src/ui/components/PluginManager/index.ts +5 -0
  342. package/src/ui/components/Surface/SurfaceComponent.stories.tsx +144 -0
  343. package/src/ui/components/Surface/SurfaceComponent.tsx +303 -0
  344. package/src/ui/components/Surface/SurfaceInfo.tsx +106 -0
  345. package/src/ui/components/Surface/SurfaceProfilerContext.tsx +207 -0
  346. package/src/ui/components/Surface/context.ts +12 -0
  347. package/src/ui/components/Surface/index.ts +54 -0
  348. package/src/ui/components/Surface/types.test.ts +126 -0
  349. package/src/ui/components/Surface/types.ts +269 -0
  350. package/src/ui/components/index.ts +8 -0
  351. package/src/ui/hooks/index.ts +10 -0
  352. package/src/ui/hooks/useApp.test.tsx +159 -0
  353. package/src/ui/hooks/useApp.tsx +418 -0
  354. package/src/ui/hooks/useCapabilities.ts +67 -0
  355. package/src/ui/hooks/useLoading.tsx +76 -0
  356. package/src/ui/hooks/useProcessManagerRuntime.ts +68 -0
  357. package/src/ui/hooks/useSettingsState.ts +26 -0
  358. package/src/ui/hooks/useSurface.ts +13 -0
  359. package/src/ui/index.ts +6 -0
  360. package/src/vite-plugin/boot-loader/BootLoader.stories.tsx +270 -0
  361. package/src/vite-plugin/boot-loader/boot-loader.css +320 -0
  362. package/src/vite-plugin/boot-loader/boot-loader.js +325 -0
  363. package/src/vite-plugin/boot-loader/index.ts +5 -0
  364. package/src/vite-plugin/boot-loader/loader.ts +123 -0
  365. package/src/vite-plugin/composer/index.ts +306 -0
  366. package/src/vite-plugin/import-map/index.ts +527 -0
  367. package/src/vite-plugin/index.ts +10 -0
  368. package/src/vite-plugin/manifest.test.ts +46 -0
  369. package/src/vite-plugin/manifest.ts +57 -0
  370. package/src/vite-plugin/packages.ts +187 -0
  371. package/tsconfig.json +33 -22
  372. package/tsconfig.node.json +2 -4
  373. package/typedoc.json +2 -4
  374. package/vitest.config.ts +8 -6
  375. package/.eslintrc.cjs +0 -9
  376. package/.swc/plugins/v7_linux_x86_64_13.0.0/f45bdff002284d9e8f9ef3f0be909de12da36c049cbcf261ac78fc00abb09a2d +0 -0
  377. package/.swc/plugins/v7_linux_x86_64_13.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429 +0 -0
  378. package/dist/lib/browser/app-graph-builder-BGGXLD6T.mjs +0 -137
  379. package/dist/lib/browser/app-graph-builder-BGGXLD6T.mjs.map +0 -7
  380. package/dist/lib/browser/chunk-2636QSIK.mjs +0 -1518
  381. package/dist/lib/browser/chunk-2636QSIK.mjs.map +0 -7
  382. package/dist/lib/browser/chunk-DHZB7HG7.mjs +0 -413
  383. package/dist/lib/browser/chunk-DHZB7HG7.mjs.map +0 -7
  384. package/dist/lib/browser/chunk-ORWHM7CO.mjs +0 -32
  385. package/dist/lib/browser/chunk-ORWHM7CO.mjs.map +0 -7
  386. package/dist/lib/browser/intent-dispatcher-TWKB22NI.mjs +0 -11
  387. package/dist/lib/browser/intent-resolver-O67UANYP.mjs +0 -39
  388. package/dist/lib/browser/intent-resolver-O67UANYP.mjs.map +0 -7
  389. package/dist/lib/browser/store-LFKDWHUQ.mjs +0 -30
  390. package/dist/lib/browser/store-LFKDWHUQ.mjs.map +0 -7
  391. package/dist/lib/browser/worker.mjs +0 -79
  392. package/dist/lib/node-esm/app-graph-builder-QHIJUYYW.mjs +0 -138
  393. package/dist/lib/node-esm/app-graph-builder-QHIJUYYW.mjs.map +0 -7
  394. package/dist/lib/node-esm/chunk-NJAFK626.mjs +0 -414
  395. package/dist/lib/node-esm/chunk-NJAFK626.mjs.map +0 -7
  396. package/dist/lib/node-esm/chunk-UMZQERLE.mjs +0 -34
  397. package/dist/lib/node-esm/chunk-UMZQERLE.mjs.map +0 -7
  398. package/dist/lib/node-esm/chunk-VSKRV3NW.mjs +0 -1520
  399. package/dist/lib/node-esm/chunk-VSKRV3NW.mjs.map +0 -7
  400. package/dist/lib/node-esm/intent-dispatcher-5PRM3KGH.mjs +0 -12
  401. package/dist/lib/node-esm/intent-resolver-K3D4BXQQ.mjs +0 -40
  402. package/dist/lib/node-esm/intent-resolver-K3D4BXQQ.mjs.map +0 -7
  403. package/dist/lib/node-esm/store-53XDUBMD.mjs +0 -31
  404. package/dist/lib/node-esm/store-53XDUBMD.mjs.map +0 -7
  405. package/dist/lib/node-esm/worker.mjs +0 -80
  406. package/dist/types/src/App.d.ts +0 -43
  407. package/dist/types/src/App.d.ts.map +0 -1
  408. package/dist/types/src/common/collaboration.d.ts +0 -19
  409. package/dist/types/src/common/collaboration.d.ts.map +0 -1
  410. package/dist/types/src/common/events.d.ts +0 -52
  411. package/dist/types/src/common/events.d.ts.map +0 -1
  412. package/dist/types/src/common/file.d.ts +0 -14
  413. package/dist/types/src/common/file.d.ts.map +0 -1
  414. package/dist/types/src/common/graph.d.ts +0 -21
  415. package/dist/types/src/common/graph.d.ts.map +0 -1
  416. package/dist/types/src/common/layout.d.ts +0 -281
  417. package/dist/types/src/common/layout.d.ts.map +0 -1
  418. package/dist/types/src/common/surface.d.ts +0 -65
  419. package/dist/types/src/common/surface.d.ts.map +0 -1
  420. package/dist/types/src/core/capabilities.d.ts +0 -114
  421. package/dist/types/src/core/capabilities.d.ts.map +0 -1
  422. package/dist/types/src/core/capabilities.test.d.ts +0 -2
  423. package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
  424. package/dist/types/src/core/events.d.ts.map +0 -1
  425. package/dist/types/src/core/manager.d.ts +0 -122
  426. package/dist/types/src/core/manager.d.ts.map +0 -1
  427. package/dist/types/src/core/manager.test.d.ts +0 -2
  428. package/dist/types/src/core/manager.test.d.ts.map +0 -1
  429. package/dist/types/src/playground/debug/Debug.d.ts +0 -6
  430. package/dist/types/src/playground/debug/Debug.d.ts.map +0 -1
  431. package/dist/types/src/playground/debug/index.d.ts +0 -2
  432. package/dist/types/src/playground/debug/index.d.ts.map +0 -1
  433. package/dist/types/src/playground/debug/plugin.d.ts +0 -2
  434. package/dist/types/src/playground/debug/plugin.d.ts.map +0 -1
  435. package/dist/types/src/playground/generator/Main.d.ts +0 -6
  436. package/dist/types/src/playground/generator/Main.d.ts.map +0 -1
  437. package/dist/types/src/playground/generator/Toolbar.d.ts +0 -6
  438. package/dist/types/src/playground/generator/Toolbar.d.ts.map +0 -1
  439. package/dist/types/src/playground/generator/generator.d.ts +0 -7
  440. package/dist/types/src/playground/generator/generator.d.ts.map +0 -1
  441. package/dist/types/src/playground/generator/index.d.ts +0 -3
  442. package/dist/types/src/playground/generator/index.d.ts.map +0 -1
  443. package/dist/types/src/playground/generator/plugin.d.ts +0 -2
  444. package/dist/types/src/playground/generator/plugin.d.ts.map +0 -1
  445. package/dist/types/src/playground/layout/Layout.d.ts +0 -8
  446. package/dist/types/src/playground/layout/Layout.d.ts.map +0 -1
  447. package/dist/types/src/playground/layout/index.d.ts +0 -2
  448. package/dist/types/src/playground/layout/index.d.ts.map +0 -1
  449. package/dist/types/src/playground/layout/plugin.d.ts +0 -2
  450. package/dist/types/src/playground/layout/plugin.d.ts.map +0 -1
  451. package/dist/types/src/playground/logger/Toolbar.d.ts +0 -6
  452. package/dist/types/src/playground/logger/Toolbar.d.ts.map +0 -1
  453. package/dist/types/src/playground/logger/index.d.ts +0 -2
  454. package/dist/types/src/playground/logger/index.d.ts.map +0 -1
  455. package/dist/types/src/playground/logger/plugin.d.ts +0 -2
  456. package/dist/types/src/playground/logger/plugin.d.ts.map +0 -1
  457. package/dist/types/src/playground/logger/schema.d.ts +0 -13
  458. package/dist/types/src/playground/logger/schema.d.ts.map +0 -1
  459. package/dist/types/src/playground/playground.stories.d.ts +0 -10
  460. package/dist/types/src/playground/playground.stories.d.ts.map +0 -1
  461. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +0 -2
  462. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +0 -1
  463. package/dist/types/src/plugin-intent/actions.d.ts +0 -38
  464. package/dist/types/src/plugin-intent/actions.d.ts.map +0 -1
  465. package/dist/types/src/plugin-intent/errors.d.ts +0 -16
  466. package/dist/types/src/plugin-intent/errors.d.ts.map +0 -1
  467. package/dist/types/src/plugin-intent/index.d.ts +0 -5
  468. package/dist/types/src/plugin-intent/index.d.ts.map +0 -1
  469. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +0 -139
  470. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +0 -1
  471. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +0 -2
  472. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +0 -1
  473. package/dist/types/src/plugin-intent/intent.d.ts +0 -63
  474. package/dist/types/src/plugin-intent/intent.d.ts.map +0 -1
  475. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +0 -2
  476. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +0 -1
  477. package/dist/types/src/plugin-settings/actions.d.ts +0 -27
  478. package/dist/types/src/plugin-settings/actions.d.ts.map +0 -1
  479. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +0 -4
  480. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +0 -1
  481. package/dist/types/src/plugin-settings/index.d.ts +0 -3
  482. package/dist/types/src/plugin-settings/index.d.ts.map +0 -1
  483. package/dist/types/src/plugin-settings/intent-resolver.d.ts +0 -4
  484. package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +0 -1
  485. package/dist/types/src/plugin-settings/store.d.ts +0 -5
  486. package/dist/types/src/plugin-settings/store.d.ts.map +0 -1
  487. package/dist/types/src/plugin-settings/translations.d.ts +0 -10
  488. package/dist/types/src/plugin-settings/translations.d.ts.map +0 -1
  489. package/dist/types/src/react/ErrorBoundary.d.ts +0 -31
  490. package/dist/types/src/react/ErrorBoundary.d.ts.map +0 -1
  491. package/dist/types/src/react/IntentContext.d.ts +0 -8
  492. package/dist/types/src/react/IntentContext.d.ts.map +0 -1
  493. package/dist/types/src/react/PluginManagerProvider.d.ts +0 -10
  494. package/dist/types/src/react/PluginManagerProvider.d.ts.map +0 -1
  495. package/dist/types/src/react/Surface.d.ts +0 -12
  496. package/dist/types/src/react/Surface.d.ts.map +0 -1
  497. package/dist/types/src/react/Surface.stories.d.ts +0 -16
  498. package/dist/types/src/react/Surface.stories.d.ts.map +0 -1
  499. package/dist/types/src/react/common.d.ts +0 -13
  500. package/dist/types/src/react/common.d.ts.map +0 -1
  501. package/dist/types/src/react/index.d.ts +0 -7
  502. package/dist/types/src/react/index.d.ts.map +0 -1
  503. package/dist/types/src/react/useCapabilities.d.ts +0 -13
  504. package/dist/types/src/react/useCapabilities.d.ts.map +0 -1
  505. package/dist/types/src/react/useIntentResolver.d.ts +0 -3
  506. package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
  507. package/dist/types/src/worker.d.ts +0 -4
  508. package/dist/types/src/worker.d.ts.map +0 -1
  509. package/src/App.tsx +0 -276
  510. package/src/common/collaboration.ts +0 -21
  511. package/src/common/events.ts +0 -77
  512. package/src/common/file.ts +0 -22
  513. package/src/common/graph.ts +0 -30
  514. package/src/common/layout.ts +0 -278
  515. package/src/common/surface.ts +0 -86
  516. package/src/core/capabilities.test.ts +0 -136
  517. package/src/core/capabilities.ts +0 -254
  518. package/src/core/manager.test.ts +0 -515
  519. package/src/core/manager.ts +0 -519
  520. package/src/playground/debug/Debug.tsx +0 -39
  521. package/src/playground/debug/plugin.ts +0 -17
  522. package/src/playground/generator/Main.tsx +0 -71
  523. package/src/playground/generator/Toolbar.tsx +0 -46
  524. package/src/playground/generator/generator.ts +0 -48
  525. package/src/playground/generator/index.ts +0 -6
  526. package/src/playground/generator/plugin.ts +0 -23
  527. package/src/playground/layout/Layout.tsx +0 -33
  528. package/src/playground/layout/plugin.ts +0 -17
  529. package/src/playground/logger/Toolbar.tsx +0 -29
  530. package/src/playground/logger/plugin.ts +0 -36
  531. package/src/playground/logger/schema.ts +0 -12
  532. package/src/playground/playground.stories.tsx +0 -42
  533. package/src/plugin-intent/IntentPlugin.ts +0 -20
  534. package/src/plugin-intent/actions.ts +0 -33
  535. package/src/plugin-intent/errors.ts +0 -39
  536. package/src/plugin-intent/index.ts +0 -8
  537. package/src/plugin-intent/intent-dispatcher.test.ts +0 -279
  538. package/src/plugin-intent/intent-dispatcher.ts +0 -333
  539. package/src/plugin-intent/intent.ts +0 -154
  540. package/src/plugin-settings/SettingsPlugin.ts +0 -35
  541. package/src/plugin-settings/actions.ts +0 -29
  542. package/src/plugin-settings/app-graph-builder.ts +0 -157
  543. package/src/plugin-settings/index.ts +0 -6
  544. package/src/plugin-settings/intent-resolver.ts +0 -34
  545. package/src/plugin-settings/store.ts +0 -33
  546. package/src/plugin-settings/translations.ts +0 -19
  547. package/src/react/ErrorBoundary.tsx +0 -45
  548. package/src/react/IntentContext.tsx +0 -34
  549. package/src/react/Surface.stories.tsx +0 -96
  550. package/src/react/Surface.tsx +0 -77
  551. package/src/react/common.ts +0 -12
  552. package/src/react/index.ts +0 -10
  553. package/src/react/useCapabilities.ts +0 -30
  554. package/src/react/useIntentResolver.ts +0 -22
  555. package/src/worker.ts +0 -11
  556. package/typedoc/.nojekyll +0 -1
  557. package/typedoc/assets/hierarchy.js +0 -1
  558. package/typedoc/assets/highlight.css +0 -106
  559. package/typedoc/assets/icons.js +0 -18
  560. package/typedoc/assets/icons.svg +0 -1
  561. package/typedoc/assets/main.js +0 -60
  562. package/typedoc/assets/navigation.js +0 -1
  563. package/typedoc/assets/search.js +0 -1
  564. package/typedoc/assets/style.css +0 -1640
  565. package/typedoc/classes/CollaborationActions.InsertContent.html +0 -421
  566. package/typedoc/classes/ErrorBoundary.html +0 -125
  567. package/typedoc/classes/IntentAction.ShowUndo.html +0 -227
  568. package/typedoc/classes/IntentAction.Track.html +0 -266
  569. package/typedoc/classes/LayoutAction.AddToast.html +0 -265
  570. package/typedoc/classes/LayoutAction.Close.html +0 -382
  571. package/typedoc/classes/LayoutAction.Expose.html +0 -265
  572. package/typedoc/classes/LayoutAction.Open.html +0 -1123
  573. package/typedoc/classes/LayoutAction.RevertWorkspace.html +0 -343
  574. package/typedoc/classes/LayoutAction.ScrollIntoView.html +0 -460
  575. package/typedoc/classes/LayoutAction.Set.html +0 -460
  576. package/typedoc/classes/LayoutAction.SetLayoutMode.html +0 -499
  577. package/typedoc/classes/LayoutAction.SwitchWorkspace.html +0 -265
  578. package/typedoc/classes/LayoutAction.UpdateComplementary.html +0 -616
  579. package/typedoc/classes/LayoutAction.UpdateDialog.html +0 -1123
  580. package/typedoc/classes/LayoutAction.UpdateLayout.html +0 -461
  581. package/typedoc/classes/LayoutAction.UpdatePopover.html +0 -1435
  582. package/typedoc/classes/LayoutAction.UpdateSidebar.html +0 -616
  583. package/typedoc/classes/Plugin.html +0 -6
  584. package/typedoc/classes/PluginContext.html +0 -38
  585. package/typedoc/classes/PluginManager.html +0 -43
  586. package/typedoc/classes/PluginModule.html +0 -18
  587. package/typedoc/classes/SettingsAction.Open.html +0 -226
  588. package/typedoc/classes/SettingsAction.OpenPluginRegistry.html +0 -265
  589. package/typedoc/functions/Events.createStateEvent.html +0 -2
  590. package/typedoc/functions/IntentPlugin.html +0 -1
  591. package/typedoc/functions/SettingsPlugin.html +0 -1
  592. package/typedoc/functions/allOf.html +0 -2
  593. package/typedoc/functions/chain.html +0 -3
  594. package/typedoc/functions/contributes.html +0 -2
  595. package/typedoc/functions/createDispatcher.html +0 -3
  596. package/typedoc/functions/createIntent.html +0 -6
  597. package/typedoc/functions/createResolver.html +0 -2
  598. package/typedoc/functions/createSurface.html +0 -2
  599. package/typedoc/functions/defineCapability.html +0 -2
  600. package/typedoc/functions/defineEvent.html +0 -2
  601. package/typedoc/functions/defineModule.html +0 -2
  602. package/typedoc/functions/definePlugin.html +0 -2
  603. package/typedoc/functions/eventKey.html +0 -2
  604. package/typedoc/functions/getEvents.html +0 -2
  605. package/typedoc/functions/isAllOf.html +0 -2
  606. package/typedoc/functions/isOneOf.html +0 -2
  607. package/typedoc/functions/isSurfaceAvailable.html +0 -2
  608. package/typedoc/functions/lazy.html +0 -2
  609. package/typedoc/functions/oneOf.html +0 -2
  610. package/typedoc/functions/useApp.html +0 -6
  611. package/typedoc/functions/useAppGraph.html +0 -1
  612. package/typedoc/functions/useCapabilities.html +0 -3
  613. package/typedoc/functions/useCapability.html +0 -4
  614. package/typedoc/functions/useIntentDispatcher.html +0 -1
  615. package/typedoc/functions/useIntentResolver.html +0 -1
  616. package/typedoc/functions/useLayout.html +0 -1
  617. package/typedoc/functions/usePluginManager.html +0 -2
  618. package/typedoc/hierarchy.html +0 -1
  619. package/typedoc/index.html +0 -12
  620. package/typedoc/interfaces/LayoutAction.Toast.html +0 -10
  621. package/typedoc/media/LICENSE +0 -8
  622. package/typedoc/modules/Capabilities.html +0 -1
  623. package/typedoc/modules/CollaborationActions.html +0 -1
  624. package/typedoc/modules/Events.html +0 -1
  625. package/typedoc/modules/IntentAction.html +0 -1
  626. package/typedoc/modules/LayoutAction.html +0 -2
  627. package/typedoc/modules/SettingsAction.html +0 -1
  628. package/typedoc/modules.html +0 -1
  629. package/typedoc/types/ActivationEvent.html +0 -8
  630. package/typedoc/types/ActivationEvents.html +0 -2
  631. package/typedoc/types/AnyCapability.html +0 -1
  632. package/typedoc/types/AnyIntent.html +0 -1
  633. package/typedoc/types/AnyIntentChain.html +0 -1
  634. package/typedoc/types/AnyIntentEffectResult.html +0 -1
  635. package/typedoc/types/AnyIntentResolver.html +0 -1
  636. package/typedoc/types/AnyIntentResult.html +0 -1
  637. package/typedoc/types/Capabilities.FileUploader.html +0 -1
  638. package/typedoc/types/Capabilities.IntentResolver.html +0 -1
  639. package/typedoc/types/Capabilities.Layout.html +0 -1
  640. package/typedoc/types/Capabilities.Metadata.html +0 -1
  641. package/typedoc/types/Capabilities.ReactContext.html +0 -1
  642. package/typedoc/types/Capabilities.ReactRoot.html +0 -1
  643. package/typedoc/types/Capabilities.ReactSurface.html +0 -1
  644. package/typedoc/types/Capabilities.Settings.html +0 -4
  645. package/typedoc/types/Capability.html +0 -9
  646. package/typedoc/types/CreateAppOptions.html +0 -10
  647. package/typedoc/types/FileInfo.html +0 -1
  648. package/typedoc/types/Intent.html +0 -10
  649. package/typedoc/types/IntentChain.html +0 -6
  650. package/typedoc/types/IntentContext.html +0 -5
  651. package/typedoc/types/IntentData.html +0 -1
  652. package/typedoc/types/IntentDispatcher.html +0 -2
  653. package/typedoc/types/IntentDispatcherResult.html +0 -2
  654. package/typedoc/types/IntentEffectDefinition.html +0 -2
  655. package/typedoc/types/IntentEffectResult.html +0 -15
  656. package/typedoc/types/IntentParams.html +0 -3
  657. package/typedoc/types/IntentResolver.html +0 -2
  658. package/typedoc/types/IntentResultData.html +0 -1
  659. package/typedoc/types/IntentSchema.html +0 -1
  660. package/typedoc/types/IntentUndo.html +0 -2
  661. package/typedoc/types/InterfaceDef.html +0 -4
  662. package/typedoc/types/Label.html +0 -1
  663. package/typedoc/types/NodeSerializer.html +0 -8
  664. package/typedoc/types/PluginManagerOptions.html +0 -6
  665. package/typedoc/types/PluginMeta.html +0 -21
  666. package/typedoc/types/PromiseIntentDispatcher.html +0 -2
  667. package/typedoc/types/PromiseIntentUndo.html +0 -2
  668. package/typedoc/types/Resource.html +0 -1
  669. package/typedoc/types/ResourceKey.html +0 -1
  670. package/typedoc/types/ResourceLanguage.html +0 -1
  671. package/typedoc/types/SerializedNode.html +0 -4
  672. package/typedoc/types/SurfaceComponent.html +0 -2
  673. package/typedoc/types/SurfaceDefinition.html +0 -2
  674. package/typedoc/types/SurfaceProps.html +0 -4
  675. package/typedoc/variables/Capabilities.AnchorSort.html +0 -1
  676. package/typedoc/variables/Capabilities.AppGraph.html +0 -1
  677. package/typedoc/variables/Capabilities.AppGraphBuilder.html +0 -1
  678. package/typedoc/variables/Capabilities.AppGraphSerializer.html +0 -1
  679. package/typedoc/variables/Capabilities.ArtifactDefinition.html +0 -1
  680. package/typedoc/variables/Capabilities.FileUploader.html +0 -1
  681. package/typedoc/variables/Capabilities.IntentDispatcher.html +0 -1
  682. package/typedoc/variables/Capabilities.IntentResolver.html +0 -1
  683. package/typedoc/variables/Capabilities.Layout.html +0 -1
  684. package/typedoc/variables/Capabilities.Metadata.html +0 -1
  685. package/typedoc/variables/Capabilities.Null.html +0 -1
  686. package/typedoc/variables/Capabilities.PluginManager.html +0 -1
  687. package/typedoc/variables/Capabilities.ReactContext.html +0 -1
  688. package/typedoc/variables/Capabilities.ReactRoot.html +0 -1
  689. package/typedoc/variables/Capabilities.ReactSurface.html +0 -1
  690. package/typedoc/variables/Capabilities.RxRegistry.html +0 -1
  691. package/typedoc/variables/Capabilities.Settings.html +0 -1
  692. package/typedoc/variables/Capabilities.SettingsStore.html +0 -1
  693. package/typedoc/variables/Capabilities.Tools.html +0 -1
  694. package/typedoc/variables/Capabilities.Translations.html +0 -1
  695. package/typedoc/variables/Events.AppGraphReady.html +0 -2
  696. package/typedoc/variables/Events.DispatcherReady.html +0 -2
  697. package/typedoc/variables/Events.LayoutReady.html +0 -1
  698. package/typedoc/variables/Events.SettingsReady.html +0 -2
  699. package/typedoc/variables/Events.SetupAppGraph.html +0 -2
  700. package/typedoc/variables/Events.SetupArtifactDefinition.html +0 -2
  701. package/typedoc/variables/Events.SetupIntentResolver.html +0 -2
  702. package/typedoc/variables/Events.SetupMetadata.html +0 -2
  703. package/typedoc/variables/Events.SetupReactSurface.html +0 -2
  704. package/typedoc/variables/Events.SetupSettings.html +0 -2
  705. package/typedoc/variables/Events.SetupTranslations.html +0 -2
  706. package/typedoc/variables/Events.Startup.html +0 -2
  707. package/typedoc/variables/FileInfoSchema.html +0 -1
  708. package/typedoc/variables/INTENT_ACTION.html +0 -1
  709. package/typedoc/variables/INTENT_PLUGIN.html +0 -1
  710. package/typedoc/variables/LAYOUT_ACTION.html +0 -1
  711. package/typedoc/variables/LAYOUT_PLUGIN.html +0 -1
  712. package/typedoc/variables/Label.html +0 -1
  713. package/typedoc/variables/LayoutAction.Toast.html +0 -1
  714. package/typedoc/variables/LayoutAction.UPDATE_LAYOUT.html +0 -1
  715. package/typedoc/variables/PluginManagerProvider.html +0 -2
  716. package/typedoc/variables/Resource.html +0 -2
  717. package/typedoc/variables/ResourceKey.html +0 -1
  718. package/typedoc/variables/ResourceLanguage.html +0 -1
  719. package/typedoc/variables/SETTINGS_ACTION.html +0 -1
  720. package/typedoc/variables/SETTINGS_ID.html +0 -1
  721. package/typedoc/variables/SETTINGS_KEY.html +0 -1
  722. package/typedoc/variables/SETTINGS_PLUGIN.html +0 -1
  723. package/typedoc/variables/Surface.html +0 -2
  724. package/typedoc/variables/defaultFileTypes.html +0 -1
  725. /package/dist/lib/browser/{intent-dispatcher-TWKB22NI.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  726. /package/dist/lib/browser/{worker.mjs.map → common/activation-events.mjs.map} +0 -0
  727. /package/dist/lib/{node-esm/intent-dispatcher-5PRM3KGH.mjs.map → browser/common/capabilities.mjs.map} +0 -0
  728. /package/dist/lib/{node-esm/worker.mjs.map → browser/core/activation-event.mjs.map} +0 -0
@@ -2,29 +2,18 @@
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 { runAndForwardErrors } from '@dxos/effect';
11
+ import { useAsyncEffect } from '@dxos/react-hooks';
12
+ import { type MaybeProvider, getProviderValue } from '@dxos/util';
9
13
 
10
- import { useApp, type CreateAppOptions } from '../App';
11
- import { Capabilities, Events } from '../common';
12
- import {
13
- contributes,
14
- defineModule,
15
- definePlugin,
16
- type ActivationEvent,
17
- type AnyCapability,
18
- PluginManager,
19
- type PluginContext,
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
- export const getValue = <C, R>(providerOrValue: ProviderOrValue<C, R>, context: C): R => {
26
- return typeof providerOrValue === 'function' ? (providerOrValue as Provider<C, R>)(context) : providerOrValue;
27
- };
14
+ import { ActivationEvents, Capabilities } from '../common';
15
+ import { type ActivationEvent, Capability, type CapabilityManager, Plugin, PluginManager } from '../core';
16
+ import { type UseAppOptions, useApp } from '../ui';
28
17
 
29
18
  /**
30
19
  * @internal
@@ -32,19 +21,21 @@ export const getValue = <C, R>(providerOrValue: ProviderOrValue<C, R>, context:
32
21
  export const setupPluginManager = ({
33
22
  capabilities,
34
23
  plugins = [],
35
- core = plugins.map(({ meta }) => meta.id),
36
24
  ...options
37
- }: CreateAppOptions & Pick<WithPluginManagerOptions, 'capabilities'> = {}) => {
38
- const pluginManager = new PluginManager({
25
+ }: UseAppOptions & Pick<WithPluginManagerOptions, 'capabilities'> = {}) => {
26
+ // Auto-enable every non-system plugin so stories don't have to spell out
27
+ // enablement. System-tagged plugins are force-enabled by the manager.
28
+ const enabled = plugins.filter(({ meta }) => !meta.tags?.includes('system')).map(({ meta }) => meta.id);
29
+ const pluginManager = PluginManager.make({
39
30
  pluginLoader: () => raise(new Error('Not implemented')),
40
- plugins: [storyPlugin(), ...plugins],
41
- core: [STORY_PLUGIN, ...core],
31
+ plugins: [StoryPlugin, ...plugins],
32
+ enabled,
42
33
  ...options,
43
34
  });
44
35
 
45
36
  if (capabilities) {
46
- getValue(capabilities, pluginManager.context).forEach((capability) => {
47
- pluginManager.context.contributeCapability({
37
+ getProviderValue(capabilities, pluginManager.capabilities).forEach((capability) => {
38
+ pluginManager.capabilities.contribute({
48
39
  interface: capability.interface,
49
40
  implementation: capability.implementation,
50
41
  module: 'story',
@@ -55,56 +46,92 @@ export const setupPluginManager = ({
55
46
  return pluginManager;
56
47
  };
57
48
 
58
- export type WithPluginManagerOptions = CreateAppOptions & {
59
- capabilities?: ProviderOrValue<PluginContext, AnyCapability[]>;
60
- fireEvents?: (ActivationEvent | string)[];
49
+ type ManagedPluginManagerState = {
50
+ fireEvents?: (ActivationEvent.ActivationEvent | string)[];
51
+ pluginManager: PluginManager.PluginManager;
52
+ setupEvents?: ActivationEvent.ActivationEvent[];
53
+ storyId: string;
54
+ };
55
+
56
+ export type WithPluginManagerOptions = UseAppOptions & {
57
+ /** @deprecated */
58
+ capabilities?: MaybeProvider<Capability.Any[], CapabilityManager.CapabilityManager>;
59
+ /** @deprecated */
60
+ fireEvents?: (ActivationEvent.ActivationEvent | string)[];
61
61
  };
62
62
 
63
+ export type WithPluginManagerInitializer<Args = void> =
64
+ | WithPluginManagerOptions
65
+ | ((context: StoryContext<Args>) => WithPluginManagerOptions);
66
+
63
67
  /**
64
68
  * Wraps a story with a plugin manager.
65
69
  * NOTE: This builds up and tears down the plugin manager on every render.
66
70
  */
67
- export const withPluginManager = (options: WithPluginManagerOptions = {}): Decorator => {
71
+ export const withPluginManager = <Args,>(init: WithPluginManagerInitializer<Args> = {}): Decorator => {
68
72
  return (Story, context) => {
69
- const pluginManager = useMemo(() => setupPluginManager(options), [options]);
73
+ const storyId = context.id;
74
+ const options = typeof init === 'function' ? init(context as any) : init;
75
+ const [managerState, setManagerState] = useState<ManagedPluginManagerState>();
70
76
 
71
- // Set-up root capability.
77
+ // Storybook replaces the full context object often, so key manager ownership by story id.
72
78
  useEffect(() => {
73
- const capability = contributes(Capabilities.ReactRoot, {
74
- id: context.id,
79
+ const pluginManager = setupPluginManager(options);
80
+ const capability = Capability.contributes(Capabilities.ReactRoot, {
81
+ id: storyId,
75
82
  root: () => <Story />,
76
83
  });
77
84
 
78
- pluginManager.context.contributeCapability({
85
+ pluginManager.capabilities.contribute({
79
86
  ...capability,
80
- module: 'dxos.org/app-framework/withPluginManager',
87
+ module: 'org.dxos.app-framework.with-plugin-manager',
88
+ });
89
+
90
+ setManagerState({
91
+ pluginManager,
92
+ setupEvents: options.setupEvents,
93
+ fireEvents: options.fireEvents,
94
+ storyId,
81
95
  });
82
96
 
83
97
  return () => {
84
- pluginManager.context.removeCapability(capability.interface, capability.implementation);
98
+ pluginManager.capabilities.remove(capability.interface, capability.implementation);
99
+ void runAndForwardErrors(pluginManager.shutdown());
85
100
  };
86
- }, [pluginManager, context]);
101
+ }, [storyId, init]);
87
102
 
88
- // Fire events.
89
- useEffect(() => {
90
- const timeout = setTimeout(async () => {
91
- await Promise.all(options.fireEvents?.map((event) => pluginManager.activate(event)) ?? []);
92
- });
103
+ // Avoid mounting useApp with a stale manager from the previous story.
104
+ if (!managerState || managerState.storyId !== storyId) {
105
+ return <></>;
106
+ }
107
+
108
+ return <WithPluginManagerApp {...managerState} />;
109
+ };
110
+ };
93
111
 
94
- return () => clearTimeout(timeout);
95
- }, [pluginManager]);
112
+ const WithPluginManagerApp = ({ fireEvents, pluginManager, setupEvents, storyId }: ManagedPluginManagerState) => {
113
+ // Fire deprecated events only after the effect-owned manager for this story exists.
114
+ useAsyncEffect(async () => {
115
+ await Promise.all(fireEvents?.map((event) => pluginManager.activate(event)) ?? []);
116
+ }, [fireEvents, pluginManager, storyId]);
96
117
 
97
- // Create app.
98
- const App = useApp({ pluginManager });
118
+ const App = useApp({ pluginManager, setupEvents });
119
+ return <App />;
120
+ };
99
121
 
100
- return <App />;
101
- };
122
+ const storyMeta = {
123
+ id: 'org.dxos.app-framework.story',
124
+ name: 'Story',
125
+ tags: ['system'],
102
126
  };
103
127
 
104
128
  // No-op plugin to ensure there exists at least one plugin for the startup event.
105
129
  // This is necessary because `createApp` expects the startup event to complete before the app is ready.
106
- const STORY_PLUGIN = 'dxos.org/app-framework/story';
107
- const storyPlugin = () =>
108
- definePlugin({ id: STORY_PLUGIN, name: 'Story' }, [
109
- defineModule({ id: STORY_PLUGIN, activatesOn: Events.Startup, activate: () => [] }),
110
- ]);
130
+ const StoryPlugin = Plugin.define(storyMeta).pipe(
131
+ Plugin.addModule({
132
+ id: 'Story',
133
+ activatesOn: ActivationEvents.Startup,
134
+ activate: () => Effect.succeed([]),
135
+ }),
136
+ Plugin.make,
137
+ )();
@@ -0,0 +1,86 @@
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 { withTheme } from '@dxos/react-ui/testing';
10
+
11
+ import { ActivationEvents, Capabilities } from '../../../common';
12
+ import { Capability, Plugin } from '../../../core';
13
+ import { useApp } from '../../hooks';
14
+
15
+ // Minimal plugin that contributes a ReactRoot.
16
+ const TestPlugin = Plugin.define<{ error?: boolean }>({
17
+ id: 'org.dxos.plugin.test',
18
+ name: 'Test Plugin',
19
+ tags: ['system'],
20
+ }).pipe(
21
+ Plugin.addModule(({ error }) => ({
22
+ id: 'TestMain',
23
+ activatesOn: ActivationEvents.Startup,
24
+ activate: () =>
25
+ Effect.succeed([
26
+ Capability.contributes(Capabilities.ReactRoot, {
27
+ id: 'org.dxos.plugin.test.root',
28
+ root: () => {
29
+ useEffect(() => {
30
+ let t: NodeJS.Timeout;
31
+ if (error) {
32
+ console.log('Ticking...');
33
+ t = setTimeout(() => {
34
+ console.log('Bang!');
35
+ throw new Error('Runtime error');
36
+ }, 3_000);
37
+ }
38
+
39
+ return () => clearTimeout(t);
40
+ }, [error]);
41
+
42
+ return <h1 className='text-lg'>App Started</h1>;
43
+ },
44
+ }),
45
+ ]),
46
+ })),
47
+ Plugin.make,
48
+ );
49
+
50
+ type DefaultStoryProps = { plugins?: Plugin.Plugin[] };
51
+
52
+ const DefaultStory = ({ plugins }: DefaultStoryProps) => {
53
+ const App = useApp({
54
+ plugins,
55
+ placeholder: () => {
56
+ return <div className='text-description'>Loading...</div>;
57
+ },
58
+ });
59
+
60
+ return <App />;
61
+ };
62
+
63
+ const meta = {
64
+ title: 'sdk/app-framework/components/App',
65
+ render: DefaultStory,
66
+ decorators: [withTheme()],
67
+ parameters: {
68
+ layout: 'centered',
69
+ },
70
+ } satisfies Meta;
71
+
72
+ export default meta;
73
+
74
+ type Story = StoryObj<typeof meta>;
75
+
76
+ export const Default: Story = {
77
+ args: {
78
+ plugins: [TestPlugin({})],
79
+ },
80
+ };
81
+
82
+ export const WithError: Story = {
83
+ args: {
84
+ plugins: [TestPlugin({ error: true })],
85
+ },
86
+ };
@@ -0,0 +1,81 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React, { type PropsWithChildren, useEffect } 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
+ export type AppProps = Pick<UseAppOptions, 'placeholder' | 'debounce'> & {
12
+ ready: boolean;
13
+ error: unknown;
14
+ progress?: StartupProgress;
15
+ };
16
+
17
+ const FIRST_INTERACTIVE_MARK = 'app-framework:first-interactive';
18
+
19
+ export const App = ({ placeholder: Placeholder, ready, error, debounce, progress }: AppProps) => {
20
+ const reactContexts = useCapabilities(Capabilities.ReactContext);
21
+ const reactRoots = useCapabilities(Capabilities.ReactRoot);
22
+ const stage = useLoading(ready, debounce);
23
+ const placeholderDismissed = stage >= LoadingState.Done;
24
+
25
+ // Emit a once-per-app `app-framework:first-interactive` mark the first time
26
+ // the placeholder is dismissed and the real app shell renders. Closes the
27
+ // gap between `Startup` activated and the first interactive paint.
28
+ //
29
+ // Also dismisses the native-DOM boot loader from
30
+ // `@dxos/app-framework/vite-plugin` here — the framework owns the
31
+ // handoff-complete signal, so dismissing in `App` covers both hosts that
32
+ // wire in a `Placeholder` (which may have its own dismiss path) and hosts
33
+ // that don't (the loader would otherwise sit forever as a `z-index: 10`
34
+ // overlay covering the rendered shell).
35
+ useEffect(() => {
36
+ if (!placeholderDismissed) {
37
+ return;
38
+ }
39
+ if (performance.getEntriesByName(FIRST_INTERACTIVE_MARK).length === 0) {
40
+ performance.mark(FIRST_INTERACTIVE_MARK);
41
+ }
42
+ (window as { __bootLoader?: { dismiss?: () => void } }).__bootLoader?.dismiss?.();
43
+ }, [placeholderDismissed]);
44
+
45
+ if (error) {
46
+ // This triggers the error boundary to provide UI feedback for the startup error.
47
+ throw error;
48
+ }
49
+
50
+ // TODO(wittjosiah): Consider using Suspense instead.
51
+ if (!placeholderDismissed) {
52
+ if (!Placeholder) {
53
+ return null;
54
+ }
55
+
56
+ return <Placeholder stage={stage} progress={progress} />;
57
+ }
58
+
59
+ const ComposedContext = composeContexts(reactContexts);
60
+ return (
61
+ <ComposedContext>
62
+ {reactRoots.map(({ id, root: Component }) => (
63
+ <Component key={id} />
64
+ ))}
65
+ </ComposedContext>
66
+ );
67
+ };
68
+
69
+ const composeContexts = (contexts: Capabilities.ReactContext[]) => {
70
+ if (contexts.length === 0) {
71
+ return ({ children }: PropsWithChildren) => <>{children}</>;
72
+ }
73
+
74
+ return topologicalSort(contexts)
75
+ .map(({ context }) => context)
76
+ .reduce((Acc, Next) => ({ children }) => (
77
+ <Acc>
78
+ <Next>{children}</Next>
79
+ </Acc>
80
+ ));
81
+ };
@@ -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,77 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { useEffect, useState } from 'react';
7
+ import { expect, within } from 'storybook/test';
8
+
9
+ import { Composer } from '@dxos/brand';
10
+ import { Input, Panel, Toolbar } from '@dxos/react-ui';
11
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
12
+
13
+ import { Placeholder } from './Placeholder';
14
+
15
+ /**
16
+ * The story renders the brand-agnostic `Placeholder` from `@dxos/app-framework/ui`
17
+ * with the Composer brand icon as its `logo`, so the storybook mirrors what
18
+ * composer-app actually mounts in production. The render function form lets
19
+ * the SVG accept the placeholder's animation `className` directly.
20
+ */
21
+ const meta = {
22
+ title: 'sdk/app-framework/components/Placeholder',
23
+ component: Placeholder,
24
+ render: () => {
25
+ const [stage, setStage] = useState(0);
26
+ const [auto, setAuto] = useState(false);
27
+ useEffect(() => {
28
+ if (!auto) {
29
+ return;
30
+ }
31
+
32
+ const interval = setInterval(() => {
33
+ setStage((prev) => {
34
+ return prev >= 2 ? 0 : prev + 1;
35
+ });
36
+ }, 3_000);
37
+
38
+ return () => clearInterval(interval);
39
+ }, [auto]);
40
+
41
+ return (
42
+ <Panel.Root>
43
+ <Panel.Toolbar asChild>
44
+ <Toolbar.Root classNames='gap-2'>
45
+ <Input.Root>
46
+ <Input.Checkbox checked={auto} onCheckedChange={(checked) => setAuto(checked === true)} />
47
+ <Input.Label>Auto</Input.Label>
48
+ </Input.Root>
49
+ <Toolbar.Button onClick={() => setStage((prev) => (prev < 2 ? prev + 1 : 0))}>Next</Toolbar.Button>
50
+ <Toolbar.Text>{stage}</Toolbar.Text>
51
+ </Toolbar.Root>
52
+ </Panel.Toolbar>
53
+ <Panel.Content>
54
+ <Placeholder stage={stage} logo={(logoProps) => <Composer {...logoProps} />} />
55
+ </Panel.Content>
56
+ </Panel.Root>
57
+ );
58
+ },
59
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
60
+ tags: ['test'],
61
+ } satisfies Meta<typeof Placeholder>;
62
+
63
+ export default meta;
64
+
65
+ type Story = StoryObj<typeof meta>;
66
+
67
+ export const Default: Story = {
68
+ args: {
69
+ stage: 0,
70
+ },
71
+ play: async ({ canvasElement }) => {
72
+ const canvas = within(canvasElement);
73
+ // Smoke test: the toolbar's `Next` button is rendered alongside the
74
+ // placeholder, so the story mounted without throwing.
75
+ await expect(canvas.getByRole('button', { name: 'Next' })).toBeInTheDocument();
76
+ },
77
+ };
@@ -0,0 +1,155 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React, { type ReactNode, useEffect, useLayoutEffect, useRef } from 'react';
6
+
7
+ import { ThemeProvider } from '@dxos/react-ui';
8
+ import { defaultTx, mx } from '@dxos/ui-theme';
9
+
10
+ import { type PlaceholderProps as PlaceholderSlotProps } from '../../hooks';
11
+
12
+ declare global {
13
+ interface Window {
14
+ /**
15
+ * Driver injected by `@dxos/app-framework/vite-plugin`'s `bootLoaderPlugin`.
16
+ * Declared here so the {@link Placeholder} can dismiss the native-DOM
17
+ * loader once the React placeholder commits without each host having to
18
+ * re-declare the type.
19
+ */
20
+ __bootLoader?: {
21
+ status: (payload: {
22
+ event?: string;
23
+ module?: string;
24
+ humanized: string;
25
+ /**
26
+ * Optional `(index/total)` tick. When present, the loader replaces the
27
+ * current line in place ("Loading plugins (12/80)") instead of
28
+ * appending a new entry — keeps the visible log compact during long
29
+ * counted phases like plugin chunk-loading or module activation.
30
+ */
31
+ range?: { index: number; total: number };
32
+ }) => void;
33
+ progress: (fraction?: number) => void;
34
+ dismiss: () => void;
35
+ };
36
+ }
37
+ }
38
+
39
+ export type PlaceholderComponentProps = PlaceholderSlotProps & {
40
+ /**
41
+ * Brand mark rendered while the React tree settles. Pass either a static
42
+ * `ReactNode` (the framework wraps it in a sizing/animation div) or a
43
+ * render function that receives the precomputed `className` so the host
44
+ * can apply it directly to its logo (e.g. an SVG that accepts `className`
45
+ * — `composer-app` passes `(p) => <Composer {...p} />` from `@dxos/brand`).
46
+ */
47
+ logo?: ReactNode | ((props: { className: string }) => ReactNode);
48
+ };
49
+
50
+ /**
51
+ * React placeholder. The native-DOM boot loader is the visible UI through
52
+ * stages 0 (Loading) and 1 (FadeIn): we render `null` until `stage >= 2`
53
+ * (FadeOut) and instead feed activation progress + status into the still-
54
+ * alive boot loader. At stage 2 the loader dismisses and the React mark
55
+ * appears for the cross-fade to the real shell:
56
+ *
57
+ * - composer-app fills `0 → 50%` from `getPlugins`'s per-chunk counter.
58
+ * - this component fills `50 → 100%` from `useApp`'s
59
+ * `startupProgress.progress` (`activated / total` modules) and pushes
60
+ * the per-module status text to the loader's status line.
61
+ * - at `stage >= 2` the boot loader is dismissed and the React mark
62
+ * starts its `FadeOut → Done` shrink-and-fade.
63
+ *
64
+ * Stage progression (driven by `useApp`):
65
+ * - `0` — Loading: native-DOM boot loader visible. Placeholder renders nothing.
66
+ * - `1` — FadeIn: same — boot loader still owns the screen.
67
+ * - `2` — FadeOut: boot loader dismissed, React mark visible at full opacity then shrinks.
68
+ */
69
+ export const Placeholder = ({ stage = 1, progress, logo }: PlaceholderComponentProps) => {
70
+ // Used in tests to exercise the error boundary & reset dialog.
71
+ if (location.search === '?throw') {
72
+ throw new Error('Test error');
73
+ }
74
+
75
+ // Phase B: feed activation progress + status to the still-visible boot
76
+ // loader. Maps `[0, 1]` activation → `[0.5, 1]` of the ring; forwards
77
+ // the raw activation source (`event` / `module`) plus the pre-humanised
78
+ // label to `__bootLoader.status` so the loader gets to decide how to
79
+ // render and trace each transition (current default policy: "Activating
80
+ // <humanizedName>"; trace mode and timings track the structured fields).
81
+ // No-op once the loader has been dismissed (its `status()` early-returns
82
+ // when the boot DOM is gone). Skipping `stage >= 2` lets the dismissal
83
+ // run uncontended.
84
+ useEffect(() => {
85
+ if (stage >= 2) {
86
+ return;
87
+ }
88
+ const fraction = progress?.progress ?? 0;
89
+ window.__bootLoader?.progress(0.5 + fraction * 0.5);
90
+ if (progress?.humanizedName) {
91
+ window.__bootLoader?.status({
92
+ event: progress.event,
93
+ module: progress.module,
94
+ humanized: `Activating ${progress.humanizedName}`,
95
+ });
96
+ }
97
+ }, [stage, progress?.progress, progress?.event, progress?.module, progress?.humanizedName]);
98
+
99
+ // Hand off from the native-DOM boot loader once the placeholder starts
100
+ // fading out — keeping the loader visible through `stage 0` and `stage 1`
101
+ // means the ring stays the visible source of truth for activation
102
+ // progress. `useLayoutEffect` runs before the next paint so the loader
103
+ // DOM is removed in the same frame the cross-fade begins.
104
+ useLayoutEffect(() => {
105
+ if (stage >= 2) {
106
+ window.__bootLoader?.dismiss();
107
+ }
108
+ }, [stage]);
109
+
110
+ // Backstop for the fast-load path where `useLoading` can skip straight
111
+ // from stage 0 to `Done` (ready=true at the first debounce tick) — the
112
+ // stage-driven effect above never sees `stage >= 2`, so dismiss on
113
+ // unmount instead. The `stageRef` guard is what keeps StrictMode's
114
+ // synthetic mount → cleanup → remount cycle from prematurely dismissing
115
+ // the loader: the synthetic cleanup runs while `stageRef.current === 0`,
116
+ // skips the dismiss, and the real unmount (later, at stage `Done`)
117
+ // performs it.
118
+ const stageRef = useRef(stage);
119
+ stageRef.current = stage;
120
+ useEffect(() => {
121
+ return () => {
122
+ if (stageRef.current >= 3 /* Done */) {
123
+ window.__bootLoader?.dismiss();
124
+ }
125
+ };
126
+ }, []);
127
+
128
+ // Defer rendering anything until the FadeOut stage. The boot loader owns
129
+ // the screen during stages 0 and 1, so any DOM we render here would just
130
+ // sit invisibly behind it — and rendering null avoids paint cost during
131
+ // the longest part of the loading sequence (plugin activation).
132
+ if (stage < 2) {
133
+ return null;
134
+ }
135
+
136
+ const logoClassName = mx(
137
+ 'h-[300px] w-[300px] scale-600 transition-all duration-500 ease-in-out filter grayscale opacity-0',
138
+ stage >= 1 && 'scale-100 grayscale-0 opacity-70',
139
+ stage >= 2 && 'scale-50 opacity-0',
140
+ );
141
+
142
+ return (
143
+ <ThemeProvider tx={defaultTx}>
144
+ <div className='relative dx-container h-dvh flex flex-col'>
145
+ <div className='flex flex-col grow justify-center items-center'>
146
+ {typeof logo === 'function' ? (
147
+ logo({ className: logoClassName })
148
+ ) : logo ? (
149
+ <div className={logoClassName}>{logo}</div>
150
+ ) : null}
151
+ </div>
152
+ </div>
153
+ </ThemeProvider>
154
+ );
155
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './Placeholder';