@dxos/app-framework 0.8.4-main.ead640a → 0.8.4-main.effb148878

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 (572) hide show
  1. package/.storybook/main.mts +2 -4
  2. package/.storybook/preview.mts +2 -2
  3. package/LICENSE +102 -5
  4. package/README.md +1 -1
  5. package/dist/lib/browser/capability-C4WE22TJ.mjs +35 -0
  6. package/dist/lib/browser/capability-C4WE22TJ.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-2ZIYRDAF.mjs +95 -0
  8. package/dist/lib/browser/chunk-2ZIYRDAF.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-67GCXX5I.mjs +581 -0
  14. package/dist/lib/browser/chunk-67GCXX5I.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-KLHQNYJ2.mjs +422 -0
  23. package/dist/lib/browser/chunk-KLHQNYJ2.mjs.map +7 -0
  24. package/dist/lib/browser/chunk-LPWOVOOB.mjs +142 -0
  25. package/dist/lib/browser/chunk-LPWOVOOB.mjs.map +7 -0
  26. package/dist/lib/browser/chunk-LUQOVTWB.mjs +43 -0
  27. package/dist/lib/browser/chunk-LUQOVTWB.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-SZMB3K2N.mjs +517 -0
  31. package/dist/lib/browser/chunk-SZMB3K2N.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 -148
  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-3Q4TA73T.mjs +89 -0
  51. package/dist/lib/browser/process-manager-capability-3Q4TA73T.mjs.map +7 -0
  52. package/dist/lib/browser/testing/index.mjs +245 -47
  53. package/dist/lib/browser/testing/index.mjs.map +4 -4
  54. package/dist/lib/browser/testing/react.mjs +78 -0
  55. package/dist/lib/browser/testing/react.mjs.map +7 -0
  56. package/dist/lib/browser/ui/index.mjs +54 -0
  57. package/dist/lib/browser/ui/index.mjs.map +7 -0
  58. package/dist/lib/node-esm/capability-GPN6OS6M.mjs +36 -0
  59. package/dist/lib/node-esm/capability-GPN6OS6M.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-CTKEZHKF.mjs +84 -0
  67. package/dist/lib/node-esm/chunk-CTKEZHKF.mjs.map +7 -0
  68. package/dist/lib/node-esm/chunk-FEVJEUD7.mjs +143 -0
  69. package/dist/lib/node-esm/chunk-FEVJEUD7.mjs.map +7 -0
  70. package/dist/lib/node-esm/chunk-GBHZF46K.mjs +518 -0
  71. package/dist/lib/node-esm/chunk-GBHZF46K.mjs.map +7 -0
  72. package/dist/lib/node-esm/chunk-GUE5V5CG.mjs +582 -0
  73. package/dist/lib/node-esm/chunk-GUE5V5CG.mjs.map +7 -0
  74. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  75. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  76. package/dist/lib/node-esm/chunk-KFZEB6BV.mjs +29 -0
  77. package/dist/lib/node-esm/chunk-KFZEB6BV.mjs.map +7 -0
  78. package/dist/lib/node-esm/chunk-MXWDXYV2.mjs +44 -0
  79. package/dist/lib/node-esm/chunk-MXWDXYV2.mjs.map +7 -0
  80. package/dist/lib/node-esm/chunk-QBUGLR4H.mjs +96 -0
  81. package/dist/lib/node-esm/chunk-QBUGLR4H.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 -148
  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-5KCLSNQM.mjs +90 -0
  108. package/dist/lib/node-esm/process-manager-capability-5KCLSNQM.mjs.map +7 -0
  109. package/dist/lib/node-esm/testing/index.mjs +245 -47
  110. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  111. package/dist/lib/node-esm/testing/react.mjs +79 -0
  112. package/dist/lib/node-esm/testing/react.mjs.map +7 -0
  113. package/dist/lib/node-esm/ui/index.mjs +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 -199
  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 +7 -7
  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 +276 -39
  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 +7 -6
  208. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  209. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
  210. package/dist/types/src/ui/components/App/App.d.ts +9 -0
  211. package/dist/types/src/ui/components/App/App.d.ts.map +1 -0
  212. package/dist/types/src/ui/components/App/App.stories.d.ts +19 -0
  213. package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -0
  214. package/dist/types/src/ui/components/App/index.d.ts +2 -0
  215. package/dist/types/src/ui/components/App/index.d.ts.map +1 -0
  216. package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts +64 -0
  217. package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts.map +1 -0
  218. package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts +19 -0
  219. package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts.map +1 -0
  220. package/dist/types/src/ui/components/Placeholder/index.d.ts +2 -0
  221. package/dist/types/src/ui/components/Placeholder/index.d.ts.map +1 -0
  222. package/dist/types/src/{playground/playground.stories.d.ts → ui/components/PluginManager/PluginManagerContext.stories.d.ts} +5 -3
  223. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -0
  224. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts +10 -0
  225. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts.map +1 -0
  226. package/dist/types/src/ui/components/PluginManager/index.d.ts +2 -0
  227. package/dist/types/src/ui/components/PluginManager/index.d.ts.map +1 -0
  228. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +24 -0
  229. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -0
  230. package/dist/types/src/{components/App.stories.d.ts → ui/components/Surface/SurfaceComponent.stories.d.ts} +1 -1
  231. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -0
  232. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts +11 -0
  233. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +1 -0
  234. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts +48 -0
  235. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts.map +1 -0
  236. package/dist/types/src/ui/components/Surface/context.d.ts +5 -0
  237. package/dist/types/src/ui/components/Surface/context.d.ts.map +1 -0
  238. package/dist/types/src/ui/components/Surface/index.d.ts +36 -0
  239. package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -0
  240. package/dist/types/src/ui/components/Surface/types.d.ts +197 -0
  241. package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -0
  242. package/dist/types/src/ui/components/Surface/types.test.d.ts +2 -0
  243. package/dist/types/src/ui/components/Surface/types.test.d.ts.map +1 -0
  244. package/dist/types/src/ui/components/index.d.ts +5 -0
  245. package/dist/types/src/ui/components/index.d.ts.map +1 -0
  246. package/dist/types/src/ui/hooks/index.d.ts +7 -0
  247. package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
  248. package/dist/types/src/ui/hooks/useApp.d.ts +86 -0
  249. package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -0
  250. package/dist/types/src/ui/hooks/useApp.test.d.ts +2 -0
  251. package/dist/types/src/ui/hooks/useApp.test.d.ts.map +1 -0
  252. package/dist/types/src/ui/hooks/useCapabilities.d.ts +31 -0
  253. package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -0
  254. package/dist/types/src/{components → ui/hooks}/useLoading.d.ts +1 -2
  255. package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
  256. package/dist/types/src/ui/hooks/useProcessManagerRuntime.d.ts +30 -0
  257. package/dist/types/src/ui/hooks/useProcessManagerRuntime.d.ts.map +1 -0
  258. package/dist/types/src/ui/hooks/useSettingsState.d.ts +10 -0
  259. package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -0
  260. package/dist/types/src/ui/hooks/useSurface.d.ts +3 -0
  261. package/dist/types/src/ui/hooks/useSurface.d.ts.map +1 -0
  262. package/dist/types/src/ui/index.d.ts +3 -0
  263. package/dist/types/src/ui/index.d.ts.map +1 -0
  264. package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts +34 -0
  265. package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts.map +1 -0
  266. package/dist/types/src/vite-plugin/boot-loader/index.d.ts +2 -0
  267. package/dist/types/src/vite-plugin/boot-loader/index.d.ts.map +1 -0
  268. package/dist/types/src/vite-plugin/boot-loader/loader.d.ts +51 -0
  269. package/dist/types/src/vite-plugin/boot-loader/loader.d.ts.map +1 -0
  270. package/dist/types/src/vite-plugin/composer/index.d.ts +34 -0
  271. package/dist/types/src/vite-plugin/composer/index.d.ts.map +1 -0
  272. package/dist/types/src/vite-plugin/import-map/index.d.ts +28 -0
  273. package/dist/types/src/vite-plugin/import-map/index.d.ts.map +1 -0
  274. package/dist/types/src/vite-plugin/index.d.ts +5 -0
  275. package/dist/types/src/vite-plugin/index.d.ts.map +1 -0
  276. package/dist/types/src/vite-plugin/manifest.d.ts +41 -0
  277. package/dist/types/src/vite-plugin/manifest.d.ts.map +1 -0
  278. package/dist/types/src/vite-plugin/manifest.test.d.ts +2 -0
  279. package/dist/types/src/vite-plugin/manifest.test.d.ts.map +1 -0
  280. package/dist/types/src/vite-plugin/packages.d.ts +13 -0
  281. package/dist/types/src/vite-plugin/packages.d.ts.map +1 -0
  282. package/dist/types/tsconfig.tsbuildinfo +1 -1
  283. package/moon.yml +25 -6
  284. package/package.json +119 -56
  285. package/src/cli/cli.ts +102 -0
  286. package/src/{components → cli}/index.ts +1 -1
  287. package/src/common/activation-events.ts +39 -0
  288. package/src/{playground/layout/index.ts → common/annotations.ts} +0 -2
  289. package/src/common/capabilities.ts +287 -195
  290. package/src/common/index.ts +4 -8
  291. package/src/common/operations.ts +36 -0
  292. package/src/common/translations.ts +17 -9
  293. package/src/context.ts +9 -0
  294. package/src/core/{events.ts → activation-event.ts} +10 -7
  295. package/src/core/capability-manager.test.ts +151 -0
  296. package/src/core/capability-manager.ts +192 -0
  297. package/src/core/capability.ts +254 -0
  298. package/src/core/edge-registry-plugin-provider.ts +92 -0
  299. package/src/core/index.ts +11 -4
  300. package/src/core/plugin-asset-cache.ts +60 -0
  301. package/src/core/plugin-manager.test.ts +1899 -0
  302. package/src/core/plugin-manager.ts +1687 -0
  303. package/src/core/plugin-manifest.test.ts +75 -0
  304. package/src/core/plugin-manifest.ts +134 -0
  305. package/src/core/plugin.ts +415 -45
  306. package/src/core/registry.ts +163 -0
  307. package/src/core/url-loader.test.ts +221 -0
  308. package/src/core/url-loader.ts +388 -0
  309. package/src/index.ts +2 -4
  310. package/src/plugin-process-manager/ProcessManagerPlugin.ts +24 -0
  311. package/src/plugin-process-manager/history/capability.ts +36 -0
  312. package/src/plugin-process-manager/history/errors.ts +7 -0
  313. package/src/plugin-process-manager/history/history-tracker.test.ts +374 -0
  314. package/src/plugin-process-manager/history/history-tracker.ts +128 -0
  315. package/src/plugin-process-manager/history/index.ts +9 -0
  316. package/src/plugin-process-manager/history/types.ts +17 -0
  317. package/src/plugin-process-manager/history/undo-mapping.ts +135 -0
  318. package/src/plugin-process-manager/history/undo-registry.test.ts +72 -0
  319. package/src/plugin-process-manager/history/undo-registry.ts +54 -0
  320. package/src/plugin-process-manager/index.ts +6 -0
  321. package/src/plugin-process-manager/meta.ts +14 -0
  322. package/src/plugin-process-manager/process-manager-capability.ts +178 -0
  323. package/src/plugin-process-manager/testing.ts +155 -0
  324. package/src/testing/harness.ts +247 -0
  325. package/src/testing/index.ts +2 -0
  326. package/src/testing/react.test.tsx +48 -0
  327. package/src/testing/react.tsx +113 -0
  328. package/src/testing/service.ts +52 -0
  329. package/src/testing/withPluginManager.stories.tsx +8 -9
  330. package/src/testing/withPluginManager.tsx +73 -42
  331. package/src/ui/components/App/App.stories.tsx +86 -0
  332. package/src/ui/components/App/App.tsx +81 -0
  333. package/src/{playground/debug → ui/components/App}/index.ts +1 -1
  334. package/src/ui/components/Placeholder/Placeholder.stories.tsx +77 -0
  335. package/src/ui/components/Placeholder/Placeholder.tsx +156 -0
  336. package/src/{playground/logger → ui/components/Placeholder}/index.ts +1 -1
  337. package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +184 -0
  338. package/src/{react → ui/components/PluginManager}/PluginManagerProvider.ts +3 -3
  339. package/src/ui/components/PluginManager/index.ts +5 -0
  340. package/src/ui/components/Surface/SurfaceComponent.stories.tsx +144 -0
  341. package/src/ui/components/Surface/SurfaceComponent.tsx +303 -0
  342. package/src/ui/components/Surface/SurfaceInfo.tsx +106 -0
  343. package/src/ui/components/Surface/SurfaceProfilerContext.tsx +207 -0
  344. package/src/ui/components/Surface/context.ts +12 -0
  345. package/src/ui/components/Surface/index.ts +54 -0
  346. package/src/ui/components/Surface/types.test.ts +126 -0
  347. package/src/ui/components/Surface/types.ts +269 -0
  348. package/src/ui/components/index.ts +8 -0
  349. package/src/ui/hooks/index.ts +10 -0
  350. package/src/ui/hooks/useApp.test.tsx +159 -0
  351. package/src/ui/hooks/useApp.tsx +418 -0
  352. package/src/ui/hooks/useCapabilities.ts +68 -0
  353. package/src/{components → ui/hooks}/useLoading.tsx +16 -10
  354. package/src/ui/hooks/useProcessManagerRuntime.ts +78 -0
  355. package/src/ui/hooks/useSettingsState.ts +26 -0
  356. package/src/ui/hooks/useSurface.ts +13 -0
  357. package/src/ui/index.ts +6 -0
  358. package/src/vite-plugin/boot-loader/BootLoader.stories.tsx +270 -0
  359. package/src/vite-plugin/boot-loader/boot-loader.css +320 -0
  360. package/src/vite-plugin/boot-loader/boot-loader.js +325 -0
  361. package/src/vite-plugin/boot-loader/index.ts +5 -0
  362. package/src/vite-plugin/boot-loader/loader.ts +123 -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 +46 -0
  367. package/src/vite-plugin/manifest.ts +57 -0
  368. package/src/vite-plugin/packages.ts +187 -0
  369. package/tsconfig.json +30 -15
  370. package/tsconfig.node.json +2 -4
  371. package/typedoc.json +2 -4
  372. package/vitest.config.ts +1 -1
  373. package/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
  374. package/.swc/plugins/linux_x86_64_19.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429.wasmer-v7 +0 -0
  375. package/dist/lib/browser/app-graph-builder-LG4RG2LM.mjs +0 -138
  376. package/dist/lib/browser/app-graph-builder-LG4RG2LM.mjs.map +0 -7
  377. package/dist/lib/browser/chunk-2GRQ4QXA.mjs +0 -1646
  378. package/dist/lib/browser/chunk-2GRQ4QXA.mjs.map +0 -7
  379. package/dist/lib/browser/chunk-FRUTKCPG.mjs +0 -467
  380. package/dist/lib/browser/chunk-FRUTKCPG.mjs.map +0 -7
  381. package/dist/lib/browser/chunk-SCPE4ZO2.mjs +0 -35
  382. package/dist/lib/browser/chunk-SCPE4ZO2.mjs.map +0 -7
  383. package/dist/lib/browser/intent-dispatcher-6SHA5B3N.mjs +0 -11
  384. package/dist/lib/browser/intent-resolver-UZZ4OANZ.mjs +0 -39
  385. package/dist/lib/browser/intent-resolver-UZZ4OANZ.mjs.map +0 -7
  386. package/dist/lib/browser/store-ACBEYK4B.mjs +0 -30
  387. package/dist/lib/browser/store-ACBEYK4B.mjs.map +0 -7
  388. package/dist/lib/browser/worker.mjs +0 -77
  389. package/dist/lib/node-esm/app-graph-builder-FMHVHPWA.mjs +0 -139
  390. package/dist/lib/node-esm/app-graph-builder-FMHVHPWA.mjs.map +0 -7
  391. package/dist/lib/node-esm/chunk-CXT6CYPE.mjs +0 -468
  392. package/dist/lib/node-esm/chunk-CXT6CYPE.mjs.map +0 -7
  393. package/dist/lib/node-esm/chunk-KSPOOYT3.mjs +0 -1648
  394. package/dist/lib/node-esm/chunk-KSPOOYT3.mjs.map +0 -7
  395. package/dist/lib/node-esm/chunk-ZX63QUGE.mjs +0 -37
  396. package/dist/lib/node-esm/chunk-ZX63QUGE.mjs.map +0 -7
  397. package/dist/lib/node-esm/intent-dispatcher-SIYQ5ZIU.mjs +0 -12
  398. package/dist/lib/node-esm/intent-resolver-7FYJMXAG.mjs +0 -40
  399. package/dist/lib/node-esm/intent-resolver-7FYJMXAG.mjs.map +0 -7
  400. package/dist/lib/node-esm/store-6OBLTVXC.mjs +0 -31
  401. package/dist/lib/node-esm/store-6OBLTVXC.mjs.map +0 -7
  402. package/dist/lib/node-esm/worker.mjs +0 -78
  403. package/dist/types/src/common/collaboration.d.ts +0 -20
  404. package/dist/types/src/common/collaboration.d.ts.map +0 -1
  405. package/dist/types/src/common/events.d.ts +0 -52
  406. package/dist/types/src/common/events.d.ts.map +0 -1
  407. package/dist/types/src/common/file.d.ts +0 -14
  408. package/dist/types/src/common/file.d.ts.map +0 -1
  409. package/dist/types/src/common/graph.d.ts +0 -21
  410. package/dist/types/src/common/graph.d.ts.map +0 -1
  411. package/dist/types/src/common/layout.d.ts +0 -279
  412. package/dist/types/src/common/layout.d.ts.map +0 -1
  413. package/dist/types/src/common/surface.d.ts +0 -59
  414. package/dist/types/src/common/surface.d.ts.map +0 -1
  415. package/dist/types/src/components/App.d.ts +0 -10
  416. package/dist/types/src/components/App.d.ts.map +0 -1
  417. package/dist/types/src/components/App.stories.d.ts.map +0 -1
  418. package/dist/types/src/components/DefaultFallback.d.ts +0 -8
  419. package/dist/types/src/components/DefaultFallback.d.ts.map +0 -1
  420. package/dist/types/src/components/index.d.ts +0 -2
  421. package/dist/types/src/components/index.d.ts.map +0 -1
  422. package/dist/types/src/components/useApp.d.ts +0 -44
  423. package/dist/types/src/components/useApp.d.ts.map +0 -1
  424. package/dist/types/src/components/useLoading.d.ts.map +0 -1
  425. package/dist/types/src/core/capabilities.d.ts +0 -117
  426. package/dist/types/src/core/capabilities.d.ts.map +0 -1
  427. package/dist/types/src/core/capabilities.test.d.ts +0 -2
  428. package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
  429. package/dist/types/src/core/events.d.ts.map +0 -1
  430. package/dist/types/src/core/manager.d.ts +0 -126
  431. package/dist/types/src/core/manager.d.ts.map +0 -1
  432. package/dist/types/src/core/manager.test.d.ts +0 -2
  433. package/dist/types/src/core/manager.test.d.ts.map +0 -1
  434. package/dist/types/src/playground/debug/Debug.d.ts +0 -6
  435. package/dist/types/src/playground/debug/Debug.d.ts.map +0 -1
  436. package/dist/types/src/playground/debug/index.d.ts +0 -2
  437. package/dist/types/src/playground/debug/index.d.ts.map +0 -1
  438. package/dist/types/src/playground/debug/plugin.d.ts +0 -2
  439. package/dist/types/src/playground/debug/plugin.d.ts.map +0 -1
  440. package/dist/types/src/playground/generator/Main.d.ts +0 -6
  441. package/dist/types/src/playground/generator/Main.d.ts.map +0 -1
  442. package/dist/types/src/playground/generator/Toolbar.d.ts +0 -6
  443. package/dist/types/src/playground/generator/Toolbar.d.ts.map +0 -1
  444. package/dist/types/src/playground/generator/generator.d.ts +0 -7
  445. package/dist/types/src/playground/generator/generator.d.ts.map +0 -1
  446. package/dist/types/src/playground/generator/index.d.ts +0 -3
  447. package/dist/types/src/playground/generator/index.d.ts.map +0 -1
  448. package/dist/types/src/playground/generator/plugin.d.ts +0 -2
  449. package/dist/types/src/playground/generator/plugin.d.ts.map +0 -1
  450. package/dist/types/src/playground/layout/Layout.d.ts +0 -8
  451. package/dist/types/src/playground/layout/Layout.d.ts.map +0 -1
  452. package/dist/types/src/playground/layout/index.d.ts +0 -2
  453. package/dist/types/src/playground/layout/index.d.ts.map +0 -1
  454. package/dist/types/src/playground/layout/plugin.d.ts +0 -2
  455. package/dist/types/src/playground/layout/plugin.d.ts.map +0 -1
  456. package/dist/types/src/playground/logger/Toolbar.d.ts +0 -6
  457. package/dist/types/src/playground/logger/Toolbar.d.ts.map +0 -1
  458. package/dist/types/src/playground/logger/index.d.ts +0 -2
  459. package/dist/types/src/playground/logger/index.d.ts.map +0 -1
  460. package/dist/types/src/playground/logger/plugin.d.ts +0 -2
  461. package/dist/types/src/playground/logger/plugin.d.ts.map +0 -1
  462. package/dist/types/src/playground/logger/schema.d.ts +0 -13
  463. package/dist/types/src/playground/logger/schema.d.ts.map +0 -1
  464. package/dist/types/src/playground/playground.stories.d.ts.map +0 -1
  465. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +0 -2
  466. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +0 -1
  467. package/dist/types/src/plugin-intent/actions.d.ts +0 -36
  468. package/dist/types/src/plugin-intent/actions.d.ts.map +0 -1
  469. package/dist/types/src/plugin-intent/errors.d.ts +0 -16
  470. package/dist/types/src/plugin-intent/errors.d.ts.map +0 -1
  471. package/dist/types/src/plugin-intent/index.d.ts +0 -6
  472. package/dist/types/src/plugin-intent/index.d.ts.map +0 -1
  473. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +0 -139
  474. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +0 -1
  475. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +0 -2
  476. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +0 -1
  477. package/dist/types/src/plugin-intent/intent.d.ts +0 -63
  478. package/dist/types/src/plugin-intent/intent.d.ts.map +0 -1
  479. package/dist/types/src/plugin-intent/meta.d.ts +0 -3
  480. package/dist/types/src/plugin-intent/meta.d.ts.map +0 -1
  481. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +0 -2
  482. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +0 -1
  483. package/dist/types/src/plugin-settings/actions.d.ts +0 -25
  484. package/dist/types/src/plugin-settings/actions.d.ts.map +0 -1
  485. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +0 -4
  486. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +0 -1
  487. package/dist/types/src/plugin-settings/index.d.ts +0 -3
  488. package/dist/types/src/plugin-settings/index.d.ts.map +0 -1
  489. package/dist/types/src/plugin-settings/intent-resolver.d.ts +0 -4
  490. package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +0 -1
  491. package/dist/types/src/plugin-settings/meta.d.ts +0 -3
  492. package/dist/types/src/plugin-settings/meta.d.ts.map +0 -1
  493. package/dist/types/src/plugin-settings/store.d.ts +0 -5
  494. package/dist/types/src/plugin-settings/store.d.ts.map +0 -1
  495. package/dist/types/src/plugin-settings/translations.d.ts +0 -11
  496. package/dist/types/src/plugin-settings/translations.d.ts.map +0 -1
  497. package/dist/types/src/react/ErrorBoundary.d.ts +0 -30
  498. package/dist/types/src/react/ErrorBoundary.d.ts.map +0 -1
  499. package/dist/types/src/react/IntentContext.d.ts +0 -8
  500. package/dist/types/src/react/IntentContext.d.ts.map +0 -1
  501. package/dist/types/src/react/PluginManagerProvider.d.ts +0 -10
  502. package/dist/types/src/react/PluginManagerProvider.d.ts.map +0 -1
  503. package/dist/types/src/react/Surface.d.ts +0 -12
  504. package/dist/types/src/react/Surface.d.ts.map +0 -1
  505. package/dist/types/src/react/Surface.stories.d.ts +0 -17
  506. package/dist/types/src/react/Surface.stories.d.ts.map +0 -1
  507. package/dist/types/src/react/common.d.ts +0 -13
  508. package/dist/types/src/react/common.d.ts.map +0 -1
  509. package/dist/types/src/react/index.d.ts +0 -7
  510. package/dist/types/src/react/index.d.ts.map +0 -1
  511. package/dist/types/src/react/useCapabilities.d.ts +0 -13
  512. package/dist/types/src/react/useCapabilities.d.ts.map +0 -1
  513. package/dist/types/src/react/useIntentResolver.d.ts +0 -3
  514. package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
  515. package/dist/types/src/worker.d.ts +0 -4
  516. package/dist/types/src/worker.d.ts.map +0 -1
  517. package/src/common/collaboration.ts +0 -18
  518. package/src/common/events.ts +0 -79
  519. package/src/common/file.ts +0 -22
  520. package/src/common/graph.ts +0 -30
  521. package/src/common/layout.ts +0 -277
  522. package/src/common/surface.ts +0 -83
  523. package/src/components/App.stories.tsx +0 -33
  524. package/src/components/App.tsx +0 -59
  525. package/src/components/DefaultFallback.tsx +0 -26
  526. package/src/components/useApp.tsx +0 -164
  527. package/src/core/capabilities.test.ts +0 -136
  528. package/src/core/capabilities.ts +0 -259
  529. package/src/core/manager.test.ts +0 -516
  530. package/src/core/manager.ts +0 -604
  531. package/src/playground/debug/Debug.tsx +0 -39
  532. package/src/playground/debug/plugin.ts +0 -16
  533. package/src/playground/generator/Main.tsx +0 -71
  534. package/src/playground/generator/Toolbar.tsx +0 -47
  535. package/src/playground/generator/generator.ts +0 -48
  536. package/src/playground/generator/index.ts +0 -6
  537. package/src/playground/generator/plugin.ts +0 -22
  538. package/src/playground/layout/Layout.tsx +0 -33
  539. package/src/playground/layout/plugin.ts +0 -18
  540. package/src/playground/logger/Toolbar.tsx +0 -30
  541. package/src/playground/logger/plugin.ts +0 -41
  542. package/src/playground/logger/schema.ts +0 -12
  543. package/src/playground/playground.stories.tsx +0 -46
  544. package/src/plugin-intent/IntentPlugin.ts +0 -20
  545. package/src/plugin-intent/actions.ts +0 -31
  546. package/src/plugin-intent/errors.ts +0 -40
  547. package/src/plugin-intent/index.ts +0 -9
  548. package/src/plugin-intent/intent-dispatcher.test.ts +0 -286
  549. package/src/plugin-intent/intent-dispatcher.ts +0 -337
  550. package/src/plugin-intent/intent.ts +0 -154
  551. package/src/plugin-intent/meta.ts +0 -10
  552. package/src/plugin-settings/SettingsPlugin.ts +0 -34
  553. package/src/plugin-settings/actions.ts +0 -25
  554. package/src/plugin-settings/app-graph-builder.ts +0 -160
  555. package/src/plugin-settings/index.ts +0 -6
  556. package/src/plugin-settings/intent-resolver.ts +0 -35
  557. package/src/plugin-settings/meta.ts +0 -10
  558. package/src/plugin-settings/store.ts +0 -33
  559. package/src/plugin-settings/translations.ts +0 -19
  560. package/src/react/ErrorBoundary.tsx +0 -56
  561. package/src/react/IntentContext.tsx +0 -35
  562. package/src/react/Surface.stories.tsx +0 -101
  563. package/src/react/Surface.tsx +0 -86
  564. package/src/react/common.ts +0 -13
  565. package/src/react/index.ts +0 -10
  566. package/src/react/useCapabilities.ts +0 -31
  567. package/src/react/useIntentResolver.ts +0 -22
  568. package/src/worker.ts +0 -11
  569. /package/dist/lib/browser/{intent-dispatcher-6SHA5B3N.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  570. /package/dist/lib/browser/{worker.mjs.map → common/activation-events.mjs.map} +0 -0
  571. /package/dist/lib/{node-esm/intent-dispatcher-SIYQ5ZIU.mjs.map → browser/common/capabilities.mjs.map} +0 -0
  572. /package/dist/lib/{node-esm/worker.mjs.map → browser/core/activation-event.mjs.map} +0 -0
@@ -0,0 +1,123 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Plugin } from 'vite';
6
+
7
+ import css from './boot-loader.css?raw';
8
+ import driverScript from './boot-loader.js?raw';
9
+
10
+ /**
11
+ * Options for {@link bootLoaderPlugin}.
12
+ */
13
+ export type BootLoaderOptions = {
14
+ /**
15
+ * Initial status text rendered by the loader (replaced via
16
+ * `window.__bootLoader.status(...)` once the host starts firing phase callbacks).
17
+ */
18
+ status?: string;
19
+
20
+ /**
21
+ * Inline SVG markup for an optional brand mark rendered above the progress bar.
22
+ * The mark renders at full opacity with whatever fills the SVG declares, so
23
+ * pass a colour-palette logo for the strongest visual identity. SVGs that use
24
+ * `fill="currentColor"` still inherit the loader's `prefers-color-scheme`
25
+ * text colour. Leave empty/undefined to render only the bar.
26
+ */
27
+ markSvg?: string;
28
+ };
29
+
30
+ /**
31
+ * Vite plugin that injects a tiny native-DOM "boot loader" into the host app's
32
+ * `index.html`.
33
+ *
34
+ * The loader paints on the very first frame, before any JS bundle is fetched —
35
+ * so the user sees something immediately on cold load instead of staring at a
36
+ * blank document while the compiled module graph is parsed. The brand mark
37
+ * sits centred inside a thin determinate progress ring; both layers are
38
+ * composited so the ring's fill stays visually smooth even while the JS main
39
+ * thread is busy.
40
+ *
41
+ * The host app drives the loader from `main.tsx`:
42
+ * - `window.__bootLoader.status(text)` updates the status line per phase.
43
+ * - `window.__bootLoader.progress(fraction)` grows the determinate ring (0–1).
44
+ * - `window.__bootLoader.dismiss()` removes the loader once React has mounted.
45
+ *
46
+ * Inject order:
47
+ * - `<style>` → `<head>` (parses before any bundled stylesheet).
48
+ * - `<div id="boot-loader">…</div>` → start of `<body>` (sibling of `#root`).
49
+ * - inline `<script>` defining `window.__bootLoader` → start of `<body>`.
50
+ *
51
+ * Keeping the loader as a sibling of `#root` (rather than a child of it) means
52
+ * `createRoot(document.getElementById('root')).render(...)` does not fight the
53
+ * loader for ownership; the host explicitly calls `dismiss()` after the first
54
+ * React commit, which gives a deterministic handoff.
55
+ *
56
+ * Color tokens are exposed as CSS custom properties (`--boot-loader-bg-light`,
57
+ * `--boot-loader-bg-dark`, etc.) defined in `boot-loader.css`, so consumers can
58
+ * override them at the document level without us re-parameterizing this plugin.
59
+ */
60
+ export const bootLoaderPlugin = ({ status, markSvg }: BootLoaderOptions = {}): Plugin => {
61
+ return {
62
+ name: 'app-framework:boot-loader',
63
+ transformIndexHtml() {
64
+ // The mark slot uses `children: <raw-svg>` (vite emits string children as
65
+ // raw HTML, not text-escaped) so the host can pass an SVG file's contents
66
+ // straight through. The mark and ring are siblings inside `#boot-loader-disc`
67
+ // so CSS grid-stacking can centre the mark inside the ring without the ring's
68
+ // radial-gradient mask clipping the SVG.
69
+ const markChildren = markSvg ? [{ tag: 'div', attrs: { id: 'boot-loader-mark' }, children: markSvg }] : [];
70
+
71
+ return [
72
+ {
73
+ tag: 'style',
74
+ injectTo: 'head',
75
+ children: css,
76
+ },
77
+ {
78
+ tag: 'div',
79
+ injectTo: 'body-prepend',
80
+ attrs: {
81
+ id: 'boot-loader',
82
+ role: 'status',
83
+ 'aria-live': 'polite',
84
+ 'aria-label': 'Initializing',
85
+ },
86
+ children: [
87
+ {
88
+ tag: 'div',
89
+ attrs: { id: 'boot-loader-disc' },
90
+ children: [
91
+ { tag: 'div', attrs: { id: 'boot-loader-bar' }, children: '' },
92
+ { tag: 'div', attrs: { id: 'boot-loader-dot' }, children: '' },
93
+ ...markChildren,
94
+ ],
95
+ },
96
+ {
97
+ tag: 'div',
98
+ attrs: { id: 'boot-loader-status' },
99
+ children: [
100
+ {
101
+ tag: 'div',
102
+ attrs: { id: 'boot-loader-status-fade' },
103
+ },
104
+ {
105
+ tag: 'div',
106
+ attrs: { id: 'boot-loader-status-track' },
107
+ children: status
108
+ ? [{ tag: 'div', attrs: { class: 'boot-loader-status-line' }, children: status }]
109
+ : [],
110
+ },
111
+ ],
112
+ },
113
+ ],
114
+ },
115
+ {
116
+ tag: 'script',
117
+ injectTo: 'body-prepend',
118
+ children: driverScript,
119
+ },
120
+ ];
121
+ },
122
+ };
123
+ };
@@ -0,0 +1,306 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Plugin as VitePlugin } from 'vite';
6
+
7
+ import { PLUGIN_DEV_SERVER_PORT } from '../../core';
8
+ import { type BuildMeta, ENTRY_FILENAME, MANIFEST_ASSET_NAME, serializeManifest } from '../manifest';
9
+ import { DEFAULT_PACKAGES, isSharedPackage } from '../packages';
10
+
11
+ export { ENTRY_FILENAME, MANIFEST_ASSET_NAME, serializeManifest };
12
+ export type { BuildMeta };
13
+
14
+ const JSX_DEV_RUNTIME = 'react/jsx-dev-runtime';
15
+
16
+ /**
17
+ * Whether an import should be externalized by the plugin bundle.
18
+ * Uses the shared-package predicate directly so plugins automatically pick up any
19
+ * new `@dxos/*` (non-plugin) package the host provides, without a code change here.
20
+ */
21
+ const isExternal = (id: string) => id !== JSX_DEV_RUNTIME && isSharedPackage(id);
22
+
23
+ /**
24
+ * Banner injected at the top of every plugin bundle.
25
+ *
26
+ * Why: rolldown emits ESM `import` for externalized deps, but when a *bundled* module
27
+ * is CJS and contains `require('react')` (or any other external), rolldown keeps the
28
+ * `require(...)` call in the output and relies on a runtime `require` function. The
29
+ * browser doesn't have `require`, so rolldown's fallback shim throws:
30
+ * `Calling `require` for "react" in an environment that doesn't expose the `require`
31
+ * function`.
32
+ *
33
+ * The full dependency graphs of non-trivial plugins unavoidably drag in CJS-only
34
+ * helpers (`use-sync-external-store` via xstate / zustand / preact-signals / … ),
35
+ * and waiting for every one of those packages to ship ESM isn't realistic. Instead
36
+ * we install a tiny module-local `require` at the top of the bundle that looks up
37
+ * a handful of well-known host-provided modules by name and returns their already
38
+ * ESM-imported namespaces. Rolldown's own shim honours an existing `require`
39
+ * before falling through to the throw path, so this entirely removes the runtime
40
+ * error without changing how externalization itself works.
41
+ *
42
+ * Keep the list aligned with the externals that CJS code actually reaches for;
43
+ * adding entries here is safe (unused imports get tree-shaken), but the list is
44
+ * deliberately small to keep the banner noise-free.
45
+ */
46
+ const REQUIRE_SHIM_BANNER = [
47
+ '// --- composer-plugin: CJS require shim ---',
48
+ '// See @dxos/app-framework/vite-plugin/composer-plugin.ts for rationale.',
49
+ "import * as __composerReact from 'react';",
50
+ "import * as __composerReactDom from 'react-dom';",
51
+ "import * as __composerReactJsxRuntime from 'react/jsx-runtime';",
52
+ 'const __composerRequireShim = new Map([',
53
+ " ['react', __composerReact.default ?? __composerReact],",
54
+ " ['react-dom', __composerReactDom.default ?? __composerReactDom],",
55
+ " ['react/jsx-runtime', __composerReactJsxRuntime],",
56
+ ']);',
57
+ "// Module-local binding: rolldown's CJS fallback does a `typeof require` check",
58
+ '// and uses whichever `require` is in lexical scope. Declaring this as `const`',
59
+ "// (instead of `globalThis.require ??=`) keeps each bundle's shim isolated from",
60
+ '// the host page and from other plugins sharing the window.',
61
+ 'const require = (id) => {',
62
+ ' if (__composerRequireShim.has(id)) return __composerRequireShim.get(id);',
63
+ " throw new Error('composer-plugin: unsupported CJS require at runtime: ' + id);",
64
+ '};',
65
+ '// --- end CJS require shim ---',
66
+ ].join('\n');
67
+
68
+ export type ComposerPluginOptions = {
69
+ /** Entry point for the plugin bundle. Defaults to `src/plugin.tsx`. */
70
+ entry?: string;
71
+ /** Dev server port. Defaults to {@link PLUGIN_DEV_SERVER_PORT}. */
72
+ port?: number;
73
+ /**
74
+ * Plugin metadata. When provided, a `manifest.json` asset is emitted alongside the bundle
75
+ * listing every emitted file. The host fetches this manifest at install time and persists
76
+ * the declared assets in its offline cache so the plugin works without network. The bundle's
77
+ * entry module is always written as {@link ENTRY_FILENAME} (`index.mjs`).
78
+ */
79
+ meta?: BuildMeta;
80
+ };
81
+
82
+ /**
83
+ * Vite plugin for **external Composer plugin projects**. Configures the build to produce
84
+ * an ESM bundle that externalizes all framework dependencies, which the Composer host app
85
+ * provides at runtime via import map.
86
+ *
87
+ * Handles:
88
+ * 1. Build config — lib mode entry point, ES format output, rollup externals, code-split chunks.
89
+ * 2. Dev externalization — marks shared deps as external during `vite serve` and strips
90
+ * the `/@id/` prefix that Vite's import analysis adds to external bare specifiers.
91
+ * 3. JSX dev runtime shim — bridges `react/jsx-dev-runtime` (used by React refresh in dev)
92
+ * to `react/jsx-runtime` (which is what the externalized React provides).
93
+ * 4. Manifest emit — when `meta` is supplied, writes `manifest.json` next to the bundled
94
+ * module listing every emitted asset (entry, CSS, chunks, etc.) so the host can eagerly
95
+ * cache them for offline use.
96
+ */
97
+ export const composerPlugin = (options?: ComposerPluginOptions): VitePlugin[] => {
98
+ const entry = options?.entry ?? 'src/plugin.tsx';
99
+ const port = options?.port ?? PLUGIN_DEV_SERVER_PORT;
100
+ const meta = options?.meta;
101
+ const resolved = new Set<string>();
102
+ let base = '/';
103
+
104
+ const plugins: VitePlugin[] = [
105
+ // Configure vite for library-mode builds with externalized deps.
106
+ {
107
+ name: 'composer-plugin',
108
+ config: () => ({
109
+ server: {
110
+ port,
111
+ // Allow the Composer host (different origin) to dynamically import plugin modules.
112
+ cors: true,
113
+ },
114
+ preview: { port },
115
+ build: {
116
+ sourcemap: true,
117
+ // Transitively-bundled WASM modules (automerge, tiktoken, …) emit top-level
118
+ // await; `esnext` lets rolldown pass that through without an explicit polyfill.
119
+ target: 'esnext',
120
+ lib: {
121
+ entry,
122
+ formats: ['es'],
123
+ fileName: () => ENTRY_FILENAME,
124
+ },
125
+ rolldownOptions: {
126
+ external: (id: string) => isExternal(id),
127
+ output: {
128
+ chunkFileNames: 'chunks/[name]-[hash].js',
129
+ assetFileNames: 'assets/[name]-[hash][extname]',
130
+ // Install the CJS require shim at the top of plugin.mjs so transitively
131
+ // bundled CJS helpers (that call `require('react')` et al. at runtime) can
132
+ // resolve against the host-provided externals instead of throwing.
133
+ banner: REQUIRE_SHIM_BANNER,
134
+ },
135
+ },
136
+ },
137
+ }),
138
+ },
139
+
140
+ // Dev-time externalization.
141
+ // Vite's dev server doesn't use rollup externals, so we need to handle it manually.
142
+ // We intercept imports of shared deps at resolve time, mark them external, and then
143
+ // strip the `/@id/` prefix that Vite's import analysis injects for external modules.
144
+ {
145
+ name: 'composer-plugin:externalize',
146
+ enforce: 'pre',
147
+ apply: 'serve',
148
+ // Exclude shared packages from Vite's dependency pre-bundling.
149
+ config: () => ({
150
+ optimizeDeps: {
151
+ exclude: DEFAULT_PACKAGES,
152
+ },
153
+ }),
154
+ // Mark shared deps as external so Vite doesn't try to bundle them.
155
+ resolveId: (id) => {
156
+ if (isExternal(id)) {
157
+ resolved.add(id);
158
+ return { id, external: true };
159
+ }
160
+ },
161
+ // Return a stub for any externalized module that Vite tries to load directly.
162
+ load: (id) => {
163
+ if (resolved.has(id)) {
164
+ return { code: 'export default {};' };
165
+ }
166
+ },
167
+ // After all plugins are resolved, inject a late-stage transform plugin that strips
168
+ // the `/@id/` prefix from externalized bare specifiers in the output.
169
+ // This must run after Vite's internal import analysis which rewrites bare specifiers.
170
+ configResolved: (config) => {
171
+ base = config.base ?? '/';
172
+ (config.plugins as VitePlugin[]).push({
173
+ name: 'composer-plugin:strip-prefix',
174
+ transform: (code: string) => {
175
+ if (resolved.size === 0) {
176
+ return;
177
+ }
178
+ const escaped = [...resolved].map((s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|');
179
+ const pattern = new RegExp(`${base}@id/(${escaped})`, 'g');
180
+ if (pattern.test(code)) {
181
+ return code.replace(pattern, (_: string, dep: string) => dep);
182
+ }
183
+ },
184
+ });
185
+ },
186
+ },
187
+
188
+ // JSX dev runtime shim.
189
+ // React refresh (used by @vitejs/plugin-react) imports from `react/jsx-dev-runtime`,
190
+ // but the externalized React only exposes `react/jsx-runtime`. This virtual module
191
+ // bridges the gap by re-exporting jsx-runtime's functions under jsx-dev-runtime's API.
192
+ {
193
+ name: 'composer-plugin:jsx-dev-shim',
194
+ enforce: 'pre',
195
+ apply: 'serve',
196
+ resolveId: (id) => (id === JSX_DEV_RUNTIME ? `\0${JSX_DEV_RUNTIME}` : undefined),
197
+ load: (id) =>
198
+ id === `\0${JSX_DEV_RUNTIME}`
199
+ ? [
200
+ 'import { jsx, jsxs, Fragment } from "react/jsx-runtime";',
201
+ 'export { Fragment };',
202
+ 'export function jsxDEV(type, props, key, isStaticChildren) {',
203
+ ' return isStaticChildren ? jsxs(type, props, key) : jsx(type, props, key);',
204
+ '}',
205
+ ].join('\n')
206
+ : undefined,
207
+ },
208
+
209
+ // React Refresh preamble stub.
210
+ //
211
+ // @vitejs/plugin-react's JSX transform prepends a runtime check to every module:
212
+ // if (!window.$RefreshReg$) throw new Error("@vitejs/plugin-react can't detect preamble…");
213
+ // In a normal single-origin app, vite injects a `<script type="module">` preamble
214
+ // into `index.html` that sets up `$RefreshReg$` / `$RefreshSig$` on `window` before any
215
+ // app code runs. When a community plugin is dev-served at its own origin and then
216
+ // dynamic-imported into the Composer host at a different origin, the host's window
217
+ // never receives that preamble, so every JSX module throws on first import.
218
+ //
219
+ // Inject a no-op refresh shim on the host's window from the plugin's entrypoint: fast-
220
+ // refresh itself doesn't work cross-origin anyway, so silencing the check lets the
221
+ // plugin load and ordinary page reloads take care of picking up edits. Production
222
+ // builds are untouched (`apply: 'serve'`).
223
+ {
224
+ name: 'composer-plugin:react-refresh-shim',
225
+ enforce: 'pre',
226
+ apply: 'serve',
227
+ transform(code, id) {
228
+ // Only patch the plugin entrypoint (an absolute path ending in the configured entry).
229
+ // Matching by suffix keeps us from prepending the shim to every transformed module,
230
+ // which would both bloat the output and defeat vite's caching.
231
+ if (!id.endsWith(entry.replace(/^\.?\//, '/'))) {
232
+ return;
233
+ }
234
+ const shim = [
235
+ '// composer-plugin: no-op React Refresh shim so cross-origin plugin modules',
236
+ "// don't throw the @vitejs/plugin-react preamble check at dynamic-import time.",
237
+ 'if (typeof window !== "undefined") {',
238
+ ' window.$RefreshReg$ = window.$RefreshReg$ || (() => {});',
239
+ ' window.$RefreshSig$ = window.$RefreshSig$ || (() => (type) => type);',
240
+ ' window.__vite_plugin_react_preamble_installed__ = true;',
241
+ '}',
242
+ '',
243
+ ].join('\n');
244
+ return { code: shim + code, map: null };
245
+ },
246
+ },
247
+ ];
248
+
249
+ if (meta) {
250
+ // Emit `manifest.json` alongside the built module listing every emitted asset, so the
251
+ // dist directory can be uploaded as-is to a GitHub Release for the DXOS community
252
+ // registry to pick up. The host loader fetches this file at install time and eagerly
253
+ // caches every listed asset for offline use.
254
+ plugins.push({
255
+ name: 'composer-plugin:emit-manifest',
256
+ apply: 'build',
257
+ // `enforce: 'post'` is load-bearing: vite's CSS extraction plugin emits sibling
258
+ // `.css` assets in its own `generateBundle` hook. Without `post`, ours runs first
259
+ // and sees only the JS chunks — the manifest then omits CSS, so the host can't
260
+ // inject `<link>` tags for the plugin's stylesheet at install time.
261
+ enforce: 'post',
262
+ generateBundle(_options, bundle) {
263
+ // Source maps are large and only fetched when devtools opens — exclude them
264
+ // from the manifest so the host doesn't precache megabytes of debug data.
265
+ const assets = Object.keys(bundle)
266
+ .filter((name) => name !== MANIFEST_ASSET_NAME && !name.endsWith('.map'))
267
+ .sort();
268
+ this.emitFile({
269
+ type: 'asset',
270
+ fileName: MANIFEST_ASSET_NAME,
271
+ source: serializeManifest(meta, { assets }),
272
+ });
273
+ },
274
+ });
275
+
276
+ // Dev-server manifest. `vite dev` can't enumerate transitive chunks/CSS up front
277
+ // (they resolve on demand), so we serve a `devEntry`-flavored manifest at the dev
278
+ // root and let the host loader skip eager caching + static stylesheet injection.
279
+ // The host imports `entry` directly from the dev server, where Vite handles
280
+ // JSX transforms, externalization, and runtime CSS injection.
281
+ plugins.push({
282
+ name: 'composer-plugin:serve-manifest',
283
+ apply: 'serve',
284
+ configureServer(server) {
285
+ const body = serializeManifest(meta, { assets: [], devEntry: entry.replace(/^\.?\//, '') });
286
+ server.middlewares.use(`/${MANIFEST_ASSET_NAME}`, (req, res, next) => {
287
+ // Only intercept the bare manifest URL — let any sub-paths fall through.
288
+ if (req.url && req.url !== '/' && req.url !== '') {
289
+ return next();
290
+ }
291
+ // CORS mirrors `server.cors: true` (see plugin config above) so the host
292
+ // app at a different origin can read the manifest. Vite's built-in CORS
293
+ // covers most paths but middlewares mounted before its `cors` middleware
294
+ // need to set the header themselves.
295
+ res.setHeader('Access-Control-Allow-Origin', '*');
296
+ res.setHeader('Content-Type', 'application/json');
297
+ res.setHeader('Cache-Control', 'no-store');
298
+ res.statusCode = 200;
299
+ res.end(body);
300
+ });
301
+ },
302
+ });
303
+ }
304
+
305
+ return plugins;
306
+ };