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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (556) hide show
  1. package/.storybook/main.mts +9 -0
  2. package/.storybook/preview.mts +8 -0
  3. package/LICENSE +102 -5
  4. package/README.md +1 -1
  5. package/dist/lib/browser/capability-BOPAKKWG.mjs +35 -0
  6. package/dist/lib/browser/capability-BOPAKKWG.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-5GY3YOEL.mjs +28 -0
  8. package/dist/lib/browser/chunk-5GY3YOEL.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-66IXTIVK.mjs +48 -0
  10. package/dist/lib/browser/chunk-66IXTIVK.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-CO3XLNUX.mjs +95 -0
  12. package/dist/lib/browser/chunk-CO3XLNUX.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-DC3WRPBV.mjs +227 -0
  14. package/dist/lib/browser/chunk-DC3WRPBV.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-FJ4765WW.mjs +8 -0
  16. package/dist/lib/browser/chunk-FJ4765WW.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-FO3IYSLV.mjs +68 -0
  18. package/dist/lib/browser/chunk-FO3IYSLV.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-HFLKXMT7.mjs +587 -0
  20. package/dist/lib/browser/chunk-HFLKXMT7.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-IW44C7UL.mjs +83 -0
  22. package/dist/lib/browser/chunk-IW44C7UL.mjs.map +7 -0
  23. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  24. package/dist/lib/browser/chunk-KZUDO43J.mjs +422 -0
  25. package/dist/lib/browser/chunk-KZUDO43J.mjs.map +7 -0
  26. package/dist/lib/browser/chunk-Q2GLJTVV.mjs +12 -0
  27. package/dist/lib/browser/chunk-Q2GLJTVV.mjs.map +7 -0
  28. package/dist/lib/browser/chunk-SYXIYT6T.mjs +143 -0
  29. package/dist/lib/browser/chunk-SYXIYT6T.mjs.map +7 -0
  30. package/dist/lib/browser/chunk-XHS5KDNX.mjs +1471 -0
  31. package/dist/lib/browser/chunk-XHS5KDNX.mjs.map +7 -0
  32. package/dist/lib/browser/chunk-Y66ELD4U.mjs +476 -0
  33. package/dist/lib/browser/chunk-Y66ELD4U.mjs.map +7 -0
  34. package/dist/lib/browser/cli/index.mjs +74 -0
  35. package/dist/lib/browser/cli/index.mjs.map +7 -0
  36. package/dist/lib/browser/common/activation-events.mjs +20 -0
  37. package/dist/lib/browser/common/capabilities.mjs +56 -0
  38. package/dist/lib/browser/core/activation-event.mjs +20 -0
  39. package/dist/lib/browser/core/capability.mjs +32 -0
  40. package/dist/lib/browser/core/capability.mjs.map +7 -0
  41. package/dist/lib/browser/core/plugin-manager.mjs +19 -0
  42. package/dist/lib/browser/core/plugin-manager.mjs.map +7 -0
  43. package/dist/lib/browser/core/plugin.mjs +41 -0
  44. package/dist/lib/browser/core/plugin.mjs.map +7 -0
  45. package/dist/lib/browser/core/url-loader.mjs +24 -0
  46. package/dist/lib/browser/core/url-loader.mjs.map +7 -0
  47. package/dist/lib/browser/index.mjs +85 -157
  48. package/dist/lib/browser/index.mjs.map +4 -4
  49. package/dist/lib/browser/meta.json +1 -1
  50. package/dist/lib/browser/process-manager-capability-GXNUO7AR.mjs +132 -0
  51. package/dist/lib/browser/process-manager-capability-GXNUO7AR.mjs.map +7 -0
  52. package/dist/lib/browser/testing/index.mjs +321 -56
  53. package/dist/lib/browser/testing/index.mjs.map +4 -4
  54. package/dist/lib/browser/testing/react.mjs +78 -0
  55. package/dist/lib/browser/testing/react.mjs.map +7 -0
  56. package/dist/lib/browser/ui/index.mjs +52 -0
  57. package/dist/lib/browser/ui/index.mjs.map +7 -0
  58. package/dist/lib/node-esm/capability-KZWRTX7R.mjs +36 -0
  59. package/dist/lib/node-esm/capability-KZWRTX7R.mjs.map +7 -0
  60. package/dist/lib/node-esm/chunk-37Z53PXZ.mjs +10 -0
  61. package/dist/lib/node-esm/chunk-37Z53PXZ.mjs.map +7 -0
  62. package/dist/lib/node-esm/chunk-A5CHGAZE.mjs +588 -0
  63. package/dist/lib/node-esm/chunk-A5CHGAZE.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-COHOWGGJ.mjs +144 -0
  65. package/dist/lib/node-esm/chunk-COHOWGGJ.mjs.map +7 -0
  66. package/dist/lib/node-esm/chunk-CTKEZHKF.mjs +84 -0
  67. package/dist/lib/node-esm/chunk-CTKEZHKF.mjs.map +7 -0
  68. package/dist/lib/node-esm/chunk-FPW45EZH.mjs +14 -0
  69. package/dist/lib/node-esm/chunk-FPW45EZH.mjs.map +7 -0
  70. package/dist/lib/node-esm/chunk-FSVGKTF6.mjs +477 -0
  71. package/dist/lib/node-esm/chunk-FSVGKTF6.mjs.map +7 -0
  72. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  73. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  74. package/dist/lib/node-esm/chunk-KFZEB6BV.mjs +29 -0
  75. package/dist/lib/node-esm/chunk-KFZEB6BV.mjs.map +7 -0
  76. package/dist/lib/node-esm/chunk-NULBHQYS.mjs +96 -0
  77. package/dist/lib/node-esm/chunk-NULBHQYS.mjs.map +7 -0
  78. package/dist/lib/node-esm/chunk-SX5NVETP.mjs +1472 -0
  79. package/dist/lib/node-esm/chunk-SX5NVETP.mjs.map +7 -0
  80. package/dist/lib/node-esm/chunk-WK7OIQKI.mjs +70 -0
  81. package/dist/lib/node-esm/chunk-WK7OIQKI.mjs.map +7 -0
  82. package/dist/lib/node-esm/chunk-XGBUKRCK.mjs +423 -0
  83. package/dist/lib/node-esm/chunk-XGBUKRCK.mjs.map +7 -0
  84. package/dist/lib/node-esm/chunk-XIGPWXCQ.mjs +228 -0
  85. package/dist/lib/node-esm/chunk-XIGPWXCQ.mjs.map +7 -0
  86. package/dist/lib/node-esm/chunk-XOCUANHO.mjs +49 -0
  87. package/dist/lib/node-esm/chunk-XOCUANHO.mjs.map +7 -0
  88. package/dist/lib/node-esm/cli/index.mjs +75 -0
  89. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  90. package/dist/lib/node-esm/common/activation-events.mjs +21 -0
  91. package/dist/lib/node-esm/common/activation-events.mjs.map +7 -0
  92. package/dist/lib/node-esm/common/capabilities.mjs +57 -0
  93. package/dist/lib/node-esm/common/capabilities.mjs.map +7 -0
  94. package/dist/lib/node-esm/core/activation-event.mjs +21 -0
  95. package/dist/lib/node-esm/core/activation-event.mjs.map +7 -0
  96. package/dist/lib/node-esm/core/capability.mjs +33 -0
  97. package/dist/lib/node-esm/core/capability.mjs.map +7 -0
  98. package/dist/lib/node-esm/core/plugin-manager.mjs +20 -0
  99. package/dist/lib/node-esm/core/plugin-manager.mjs.map +7 -0
  100. package/dist/lib/node-esm/core/plugin.mjs +42 -0
  101. package/dist/lib/node-esm/core/plugin.mjs.map +7 -0
  102. package/dist/lib/node-esm/core/url-loader.mjs +25 -0
  103. package/dist/lib/node-esm/core/url-loader.mjs.map +7 -0
  104. package/dist/lib/node-esm/index.mjs +85 -157
  105. package/dist/lib/node-esm/index.mjs.map +4 -4
  106. package/dist/lib/node-esm/meta.json +1 -1
  107. package/dist/lib/node-esm/process-manager-capability-TX5TA6YN.mjs +133 -0
  108. package/dist/lib/node-esm/process-manager-capability-TX5TA6YN.mjs.map +7 -0
  109. package/dist/lib/node-esm/testing/index.mjs +321 -56
  110. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  111. package/dist/lib/node-esm/testing/react.mjs +79 -0
  112. package/dist/lib/node-esm/testing/react.mjs.map +7 -0
  113. package/dist/lib/node-esm/ui/index.mjs +53 -0
  114. package/dist/lib/node-esm/ui/index.mjs.map +7 -0
  115. package/dist/plugin/node-esm/index.mjs +977 -0
  116. package/dist/plugin/node-esm/index.mjs.map +7 -0
  117. package/dist/plugin/node-esm/meta.json +1 -0
  118. package/dist/types/src/cli/cli.d.ts +37 -0
  119. package/dist/types/src/cli/cli.d.ts.map +1 -0
  120. package/dist/types/src/cli/index.d.ts +2 -0
  121. package/dist/types/src/cli/index.d.ts.map +1 -0
  122. package/dist/types/src/common/activation-events.d.ts +24 -0
  123. package/dist/types/src/common/activation-events.d.ts.map +1 -0
  124. package/dist/types/src/common/annotations.d.ts +1 -0
  125. package/dist/types/src/common/annotations.d.ts.map +1 -0
  126. package/dist/types/src/common/capabilities.d.ts +214 -195
  127. package/dist/types/src/common/capabilities.d.ts.map +1 -1
  128. package/dist/types/src/common/index.d.ts +3 -8
  129. package/dist/types/src/common/index.d.ts.map +1 -1
  130. package/dist/types/src/common/translations.d.ts +8 -8
  131. package/dist/types/src/common/translations.d.ts.map +1 -1
  132. package/dist/types/src/context.d.ts +5 -0
  133. package/dist/types/src/context.d.ts.map +1 -0
  134. package/dist/types/src/core/{events.d.ts → activation-event.d.ts} +11 -11
  135. package/dist/types/src/core/activation-event.d.ts.map +1 -0
  136. package/dist/types/src/core/capability-manager.d.ts +52 -0
  137. package/dist/types/src/core/capability-manager.d.ts.map +1 -0
  138. package/dist/types/src/core/capability-manager.test.d.ts +2 -0
  139. package/dist/types/src/core/capability-manager.test.d.ts.map +1 -0
  140. package/dist/types/src/core/capability.d.ts +161 -0
  141. package/dist/types/src/core/capability.d.ts.map +1 -0
  142. package/dist/types/src/core/edge-registry-plugin-provider.d.ts +30 -0
  143. package/dist/types/src/core/edge-registry-plugin-provider.d.ts.map +1 -0
  144. package/dist/types/src/core/index.d.ts +11 -4
  145. package/dist/types/src/core/index.d.ts.map +1 -1
  146. package/dist/types/src/core/plugin-asset-cache.d.ts +71 -0
  147. package/dist/types/src/core/plugin-asset-cache.d.ts.map +1 -0
  148. package/dist/types/src/core/plugin-manager.d.ts +297 -0
  149. package/dist/types/src/core/plugin-manager.d.ts.map +1 -0
  150. package/dist/types/src/core/plugin-manager.test.d.ts +2 -0
  151. package/dist/types/src/core/plugin-manager.test.d.ts.map +1 -0
  152. package/dist/types/src/core/plugin-manifest.d.ts +101 -0
  153. package/dist/types/src/core/plugin-manifest.d.ts.map +1 -0
  154. package/dist/types/src/core/plugin-manifest.test.d.ts +2 -0
  155. package/dist/types/src/core/plugin-manifest.test.d.ts.map +1 -0
  156. package/dist/types/src/core/plugin.d.ts +308 -41
  157. package/dist/types/src/core/plugin.d.ts.map +1 -1
  158. package/dist/types/src/core/registry.d.ts +107 -0
  159. package/dist/types/src/core/registry.d.ts.map +1 -0
  160. package/dist/types/src/core/url-loader.d.ts +127 -0
  161. package/dist/types/src/core/url-loader.d.ts.map +1 -0
  162. package/dist/types/src/core/url-loader.test.d.ts +2 -0
  163. package/dist/types/src/core/url-loader.test.d.ts.map +1 -0
  164. package/dist/types/src/helpers.d.ts.map +1 -1
  165. package/dist/types/src/index.d.ts +2 -4
  166. package/dist/types/src/index.d.ts.map +1 -1
  167. package/dist/types/src/plugin-process-manager/ProcessManagerPlugin.d.ts +3 -0
  168. package/dist/types/src/plugin-process-manager/ProcessManagerPlugin.d.ts.map +1 -0
  169. package/dist/types/src/plugin-process-manager/history/capability.d.ts +7 -0
  170. package/dist/types/src/plugin-process-manager/history/capability.d.ts.map +1 -0
  171. package/dist/types/src/plugin-process-manager/history/errors.d.ts +32 -0
  172. package/dist/types/src/plugin-process-manager/history/errors.d.ts.map +1 -0
  173. package/dist/types/src/plugin-process-manager/history/history-tracker.d.ts +32 -0
  174. package/dist/types/src/plugin-process-manager/history/history-tracker.d.ts.map +1 -0
  175. package/dist/types/src/plugin-process-manager/history/history-tracker.test.d.ts +2 -0
  176. package/dist/types/src/plugin-process-manager/history/history-tracker.test.d.ts.map +1 -0
  177. package/dist/types/src/plugin-process-manager/history/index.d.ts +6 -0
  178. package/dist/types/src/plugin-process-manager/history/index.d.ts.map +1 -0
  179. package/dist/types/src/plugin-process-manager/history/types.d.ts +13 -0
  180. package/dist/types/src/plugin-process-manager/history/types.d.ts.map +1 -0
  181. package/dist/types/src/plugin-process-manager/history/undo-mapping.d.ts +101 -0
  182. package/dist/types/src/plugin-process-manager/history/undo-mapping.d.ts.map +1 -0
  183. package/dist/types/src/plugin-process-manager/history/undo-registry.d.ts +23 -0
  184. package/dist/types/src/plugin-process-manager/history/undo-registry.d.ts.map +1 -0
  185. package/dist/types/src/plugin-process-manager/history/undo-registry.test.d.ts +2 -0
  186. package/dist/types/src/plugin-process-manager/history/undo-registry.test.d.ts.map +1 -0
  187. package/dist/types/src/plugin-process-manager/idb-key-value-store.d.ts +10 -0
  188. package/dist/types/src/plugin-process-manager/idb-key-value-store.d.ts.map +1 -0
  189. package/dist/types/src/plugin-process-manager/index.d.ts +3 -0
  190. package/dist/types/src/plugin-process-manager/index.d.ts.map +1 -0
  191. package/dist/types/src/plugin-process-manager/meta.d.ts +3 -0
  192. package/dist/types/src/plugin-process-manager/meta.d.ts.map +1 -0
  193. package/dist/types/src/plugin-process-manager/process-manager-capability.d.ts +8 -0
  194. package/dist/types/src/plugin-process-manager/process-manager-capability.d.ts.map +1 -0
  195. package/dist/types/src/plugin-process-manager/testing.d.ts +59 -0
  196. package/dist/types/src/plugin-process-manager/testing.d.ts.map +1 -0
  197. package/dist/types/src/testing/harness.d.ts +79 -0
  198. package/dist/types/src/testing/harness.d.ts.map +1 -0
  199. package/dist/types/src/testing/index.d.ts +3 -0
  200. package/dist/types/src/testing/index.d.ts.map +1 -1
  201. package/dist/types/src/testing/operationCapture.d.ts +64 -0
  202. package/dist/types/src/testing/operationCapture.d.ts.map +1 -0
  203. package/dist/types/src/testing/react.d.ts +27 -0
  204. package/dist/types/src/testing/react.d.ts.map +1 -0
  205. package/dist/types/src/testing/react.test.d.ts +2 -0
  206. package/dist/types/src/testing/react.test.d.ts.map +1 -0
  207. package/dist/types/src/testing/service.d.ts +8 -0
  208. package/dist/types/src/testing/service.d.ts.map +1 -0
  209. package/dist/types/src/testing/withPluginManager.d.ts +9 -10
  210. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  211. package/dist/types/src/testing/withPluginManager.stories.d.ts +9 -3
  212. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
  213. package/dist/types/src/ui/components/App/App.d.ts +41 -0
  214. package/dist/types/src/ui/components/App/App.d.ts.map +1 -0
  215. package/dist/types/src/ui/components/App/App.stories.d.ts +19 -0
  216. package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -0
  217. package/dist/types/src/ui/components/App/index.d.ts +2 -0
  218. package/dist/types/src/ui/components/App/index.d.ts.map +1 -0
  219. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts +13 -0
  220. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -0
  221. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts +10 -0
  222. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts.map +1 -0
  223. package/dist/types/src/ui/components/PluginManager/index.d.ts +2 -0
  224. package/dist/types/src/ui/components/PluginManager/index.d.ts.map +1 -0
  225. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +24 -0
  226. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -0
  227. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts +14 -0
  228. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -0
  229. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts +11 -0
  230. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +1 -0
  231. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts +48 -0
  232. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts.map +1 -0
  233. package/dist/types/src/ui/components/Surface/context.d.ts +5 -0
  234. package/dist/types/src/ui/components/Surface/context.d.ts.map +1 -0
  235. package/dist/types/src/ui/components/Surface/index.d.ts +36 -0
  236. package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -0
  237. package/dist/types/src/ui/components/Surface/types.d.ts +197 -0
  238. package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -0
  239. package/dist/types/src/ui/components/Surface/types.test.d.ts +2 -0
  240. package/dist/types/src/ui/components/Surface/types.test.d.ts.map +1 -0
  241. package/dist/types/src/ui/components/index.d.ts +4 -0
  242. package/dist/types/src/ui/components/index.d.ts.map +1 -0
  243. package/dist/types/src/ui/hooks/index.d.ts +7 -0
  244. package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
  245. package/dist/types/src/ui/hooks/useApp.d.ts +80 -0
  246. package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -0
  247. package/dist/types/src/ui/hooks/useApp.test.d.ts +2 -0
  248. package/dist/types/src/ui/hooks/useApp.test.d.ts.map +1 -0
  249. package/dist/types/src/ui/hooks/useCapabilities.d.ts +31 -0
  250. package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -0
  251. package/dist/types/src/ui/hooks/useLoading.d.ts +18 -0
  252. package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
  253. package/dist/types/src/ui/hooks/useProcessManagerRuntime.d.ts +30 -0
  254. package/dist/types/src/ui/hooks/useProcessManagerRuntime.d.ts.map +1 -0
  255. package/dist/types/src/ui/hooks/useSettingsState.d.ts +10 -0
  256. package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -0
  257. package/dist/types/src/ui/hooks/useSurface.d.ts +3 -0
  258. package/dist/types/src/ui/hooks/useSurface.d.ts.map +1 -0
  259. package/dist/types/src/ui/index.d.ts +3 -0
  260. package/dist/types/src/ui/index.d.ts.map +1 -0
  261. package/dist/types/src/vite-plugin/boot-loader/index.d.ts +2 -0
  262. package/dist/types/src/vite-plugin/boot-loader/index.d.ts.map +1 -0
  263. package/dist/types/src/vite-plugin/boot-loader/loader.d.ts +59 -0
  264. package/dist/types/src/vite-plugin/boot-loader/loader.d.ts.map +1 -0
  265. package/dist/types/src/vite-plugin/composer/index.d.ts +34 -0
  266. package/dist/types/src/vite-plugin/composer/index.d.ts.map +1 -0
  267. package/dist/types/src/vite-plugin/import-map/index.d.ts +28 -0
  268. package/dist/types/src/vite-plugin/import-map/index.d.ts.map +1 -0
  269. package/dist/types/src/vite-plugin/index.d.ts +5 -0
  270. package/dist/types/src/vite-plugin/index.d.ts.map +1 -0
  271. package/dist/types/src/vite-plugin/manifest.d.ts +41 -0
  272. package/dist/types/src/vite-plugin/manifest.d.ts.map +1 -0
  273. package/dist/types/src/vite-plugin/manifest.test.d.ts +2 -0
  274. package/dist/types/src/vite-plugin/manifest.test.d.ts.map +1 -0
  275. package/dist/types/src/vite-plugin/packages.d.ts +13 -0
  276. package/dist/types/src/vite-plugin/packages.d.ts.map +1 -0
  277. package/dist/types/tsconfig.tsbuildinfo +1 -1
  278. package/moon.yml +26 -3
  279. package/package.json +125 -55
  280. package/src/cli/cli.ts +102 -0
  281. package/src/{playground/layout → cli}/index.ts +1 -1
  282. package/src/common/activation-events.ts +39 -0
  283. package/src/{playground/debug/index.ts → common/annotations.ts} +0 -2
  284. package/src/common/capabilities.ts +287 -184
  285. package/src/common/index.ts +3 -8
  286. package/src/common/translations.ts +18 -10
  287. package/src/context.ts +9 -0
  288. package/src/core/{events.ts → activation-event.ts} +10 -7
  289. package/src/core/capability-manager.test.ts +154 -0
  290. package/src/core/capability-manager.ts +213 -0
  291. package/src/core/capability.ts +254 -0
  292. package/src/core/edge-registry-plugin-provider.ts +92 -0
  293. package/src/core/index.ts +11 -4
  294. package/src/core/plugin-asset-cache.ts +60 -0
  295. package/src/core/plugin-manager.test.ts +1929 -0
  296. package/src/core/plugin-manager.ts +1696 -0
  297. package/src/core/plugin-manifest.test.ts +75 -0
  298. package/src/core/plugin-manifest.ts +134 -0
  299. package/src/core/plugin.ts +458 -46
  300. package/src/core/registry.ts +163 -0
  301. package/src/core/url-loader.test.ts +222 -0
  302. package/src/core/url-loader.ts +388 -0
  303. package/src/index.ts +2 -4
  304. package/src/plugin-process-manager/ProcessManagerPlugin.ts +24 -0
  305. package/src/plugin-process-manager/history/capability.ts +36 -0
  306. package/src/plugin-process-manager/history/errors.ts +7 -0
  307. package/src/plugin-process-manager/history/history-tracker.test.ts +353 -0
  308. package/src/plugin-process-manager/history/history-tracker.ts +144 -0
  309. package/src/plugin-process-manager/history/index.ts +9 -0
  310. package/src/plugin-process-manager/history/types.ts +17 -0
  311. package/src/plugin-process-manager/history/undo-mapping.ts +135 -0
  312. package/src/plugin-process-manager/history/undo-registry.test.ts +74 -0
  313. package/src/plugin-process-manager/history/undo-registry.ts +54 -0
  314. package/src/plugin-process-manager/idb-key-value-store.ts +64 -0
  315. package/src/plugin-process-manager/index.ts +6 -0
  316. package/src/plugin-process-manager/meta.ts +16 -0
  317. package/src/plugin-process-manager/process-manager-capability.ts +178 -0
  318. package/src/plugin-process-manager/testing.ts +156 -0
  319. package/src/testing/harness.ts +247 -0
  320. package/src/testing/index.ts +3 -0
  321. package/src/testing/operationCapture.ts +144 -0
  322. package/src/testing/react.test.tsx +50 -0
  323. package/src/testing/react.tsx +113 -0
  324. package/src/testing/service.ts +52 -0
  325. package/src/testing/withPluginManager.stories.tsx +15 -13
  326. package/src/testing/withPluginManager.tsx +81 -56
  327. package/src/ui/components/App/App.stories.tsx +84 -0
  328. package/src/ui/components/App/App.tsx +144 -0
  329. package/src/{playground/logger → ui/components/App}/index.ts +1 -1
  330. package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +179 -0
  331. package/src/{react → ui/components/PluginManager}/PluginManagerProvider.ts +3 -3
  332. package/src/ui/components/PluginManager/index.ts +5 -0
  333. package/src/ui/components/Surface/SurfaceComponent.stories.tsx +144 -0
  334. package/src/ui/components/Surface/SurfaceComponent.tsx +303 -0
  335. package/src/ui/components/Surface/SurfaceInfo.tsx +106 -0
  336. package/src/ui/components/Surface/SurfaceProfilerContext.tsx +207 -0
  337. package/src/ui/components/Surface/context.ts +12 -0
  338. package/src/ui/components/Surface/index.ts +54 -0
  339. package/src/ui/components/Surface/types.test.ts +126 -0
  340. package/src/ui/components/Surface/types.ts +290 -0
  341. package/src/ui/components/index.ts +7 -0
  342. package/src/ui/hooks/index.ts +10 -0
  343. package/src/ui/hooks/useApp.test.tsx +161 -0
  344. package/src/ui/hooks/useApp.tsx +404 -0
  345. package/src/ui/hooks/useCapabilities.ts +68 -0
  346. package/src/ui/hooks/useLoading.tsx +76 -0
  347. package/src/ui/hooks/useProcessManagerRuntime.ts +78 -0
  348. package/src/ui/hooks/useSettingsState.ts +26 -0
  349. package/src/ui/hooks/useSurface.ts +13 -0
  350. package/src/ui/index.ts +6 -0
  351. package/src/vite-plugin/boot-loader/BootLoader.solid-stories.tsx +198 -0
  352. package/src/vite-plugin/boot-loader/index.ts +5 -0
  353. package/src/vite-plugin/boot-loader/loader-app/Loader.tsx +166 -0
  354. package/src/vite-plugin/boot-loader/loader-app/boot-loader.css +311 -0
  355. package/src/vite-plugin/boot-loader/loader-app/bridge.ts +25 -0
  356. package/src/vite-plugin/boot-loader/loader-app/entry.tsx +21 -0
  357. package/src/vite-plugin/boot-loader/loader-app/mount.tsx +70 -0
  358. package/src/vite-plugin/boot-loader/loader-app/store.test.ts +137 -0
  359. package/src/vite-plugin/boot-loader/loader-app/store.ts +149 -0
  360. package/src/vite-plugin/boot-loader/loader-app/tsconfig.json +11 -0
  361. package/src/vite-plugin/boot-loader/loader-app/types.ts +78 -0
  362. package/src/vite-plugin/boot-loader/loader.ts +204 -0
  363. package/src/vite-plugin/composer/index.ts +306 -0
  364. package/src/vite-plugin/import-map/index.ts +527 -0
  365. package/src/vite-plugin/index.ts +10 -0
  366. package/src/vite-plugin/manifest.test.ts +55 -0
  367. package/src/vite-plugin/manifest.ts +63 -0
  368. package/src/vite-plugin/packages.ts +187 -0
  369. package/tsconfig.json +31 -24
  370. package/tsconfig.node.json +2 -4
  371. package/typedoc.json +2 -4
  372. package/vitest.config.ts +8 -6
  373. package/.swc/plugins/v7_linux_x86_64_13.0.0/c614d7475354583212fbd7669acbae95b9832c305bf51bdaabe2e6de05abb6bf +0 -0
  374. package/.swc/plugins/v7_linux_x86_64_13.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429 +0 -0
  375. package/dist/lib/browser/app-graph-builder-MOVKFH3J.mjs +0 -137
  376. package/dist/lib/browser/app-graph-builder-MOVKFH3J.mjs.map +0 -7
  377. package/dist/lib/browser/chunk-NKCIDYDI.mjs +0 -1598
  378. package/dist/lib/browser/chunk-NKCIDYDI.mjs.map +0 -7
  379. package/dist/lib/browser/chunk-ORWHM7CO.mjs +0 -32
  380. package/dist/lib/browser/chunk-ORWHM7CO.mjs.map +0 -7
  381. package/dist/lib/browser/chunk-OSBZFKMO.mjs +0 -428
  382. package/dist/lib/browser/chunk-OSBZFKMO.mjs.map +0 -7
  383. package/dist/lib/browser/intent-dispatcher-FTTJLVGN.mjs +0 -11
  384. package/dist/lib/browser/intent-resolver-ZCGEAG3E.mjs +0 -39
  385. package/dist/lib/browser/intent-resolver-ZCGEAG3E.mjs.map +0 -7
  386. package/dist/lib/browser/store-3QB6Q2BC.mjs +0 -30
  387. package/dist/lib/browser/store-3QB6Q2BC.mjs.map +0 -7
  388. package/dist/lib/browser/worker.mjs +0 -79
  389. package/dist/lib/node-esm/app-graph-builder-ODE4B5GT.mjs +0 -138
  390. package/dist/lib/node-esm/app-graph-builder-ODE4B5GT.mjs.map +0 -7
  391. package/dist/lib/node-esm/chunk-UMZQERLE.mjs +0 -34
  392. package/dist/lib/node-esm/chunk-UMZQERLE.mjs.map +0 -7
  393. package/dist/lib/node-esm/chunk-WU3QN5B6.mjs +0 -429
  394. package/dist/lib/node-esm/chunk-WU3QN5B6.mjs.map +0 -7
  395. package/dist/lib/node-esm/chunk-YEN7NKTF.mjs +0 -1600
  396. package/dist/lib/node-esm/chunk-YEN7NKTF.mjs.map +0 -7
  397. package/dist/lib/node-esm/intent-dispatcher-YQIQ55LJ.mjs +0 -12
  398. package/dist/lib/node-esm/intent-resolver-KG27L7EQ.mjs +0 -40
  399. package/dist/lib/node-esm/intent-resolver-KG27L7EQ.mjs.map +0 -7
  400. package/dist/lib/node-esm/store-TIJAVO3D.mjs +0 -31
  401. package/dist/lib/node-esm/store-TIJAVO3D.mjs.map +0 -7
  402. package/dist/lib/node-esm/worker.mjs +0 -80
  403. package/dist/types/src/App.d.ts +0 -43
  404. package/dist/types/src/App.d.ts.map +0 -1
  405. package/dist/types/src/common/collaboration.d.ts +0 -19
  406. package/dist/types/src/common/collaboration.d.ts.map +0 -1
  407. package/dist/types/src/common/events.d.ts +0 -52
  408. package/dist/types/src/common/events.d.ts.map +0 -1
  409. package/dist/types/src/common/file.d.ts +0 -14
  410. package/dist/types/src/common/file.d.ts.map +0 -1
  411. package/dist/types/src/common/graph.d.ts +0 -21
  412. package/dist/types/src/common/graph.d.ts.map +0 -1
  413. package/dist/types/src/common/layout.d.ts +0 -281
  414. package/dist/types/src/common/layout.d.ts.map +0 -1
  415. package/dist/types/src/common/surface.d.ts +0 -65
  416. package/dist/types/src/common/surface.d.ts.map +0 -1
  417. package/dist/types/src/core/capabilities.d.ts +0 -114
  418. package/dist/types/src/core/capabilities.d.ts.map +0 -1
  419. package/dist/types/src/core/capabilities.test.d.ts +0 -2
  420. package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
  421. package/dist/types/src/core/events.d.ts.map +0 -1
  422. package/dist/types/src/core/manager.d.ts +0 -126
  423. package/dist/types/src/core/manager.d.ts.map +0 -1
  424. package/dist/types/src/core/manager.test.d.ts +0 -2
  425. package/dist/types/src/core/manager.test.d.ts.map +0 -1
  426. package/dist/types/src/playground/debug/Debug.d.ts +0 -6
  427. package/dist/types/src/playground/debug/Debug.d.ts.map +0 -1
  428. package/dist/types/src/playground/debug/index.d.ts +0 -2
  429. package/dist/types/src/playground/debug/index.d.ts.map +0 -1
  430. package/dist/types/src/playground/debug/plugin.d.ts +0 -2
  431. package/dist/types/src/playground/debug/plugin.d.ts.map +0 -1
  432. package/dist/types/src/playground/generator/Main.d.ts +0 -6
  433. package/dist/types/src/playground/generator/Main.d.ts.map +0 -1
  434. package/dist/types/src/playground/generator/Toolbar.d.ts +0 -6
  435. package/dist/types/src/playground/generator/Toolbar.d.ts.map +0 -1
  436. package/dist/types/src/playground/generator/generator.d.ts +0 -7
  437. package/dist/types/src/playground/generator/generator.d.ts.map +0 -1
  438. package/dist/types/src/playground/generator/index.d.ts +0 -3
  439. package/dist/types/src/playground/generator/index.d.ts.map +0 -1
  440. package/dist/types/src/playground/generator/plugin.d.ts +0 -2
  441. package/dist/types/src/playground/generator/plugin.d.ts.map +0 -1
  442. package/dist/types/src/playground/layout/Layout.d.ts +0 -8
  443. package/dist/types/src/playground/layout/Layout.d.ts.map +0 -1
  444. package/dist/types/src/playground/layout/index.d.ts +0 -2
  445. package/dist/types/src/playground/layout/index.d.ts.map +0 -1
  446. package/dist/types/src/playground/layout/plugin.d.ts +0 -2
  447. package/dist/types/src/playground/layout/plugin.d.ts.map +0 -1
  448. package/dist/types/src/playground/logger/Toolbar.d.ts +0 -6
  449. package/dist/types/src/playground/logger/Toolbar.d.ts.map +0 -1
  450. package/dist/types/src/playground/logger/index.d.ts +0 -2
  451. package/dist/types/src/playground/logger/index.d.ts.map +0 -1
  452. package/dist/types/src/playground/logger/plugin.d.ts +0 -2
  453. package/dist/types/src/playground/logger/plugin.d.ts.map +0 -1
  454. package/dist/types/src/playground/logger/schema.d.ts +0 -13
  455. package/dist/types/src/playground/logger/schema.d.ts.map +0 -1
  456. package/dist/types/src/playground/playground.stories.d.ts +0 -10
  457. package/dist/types/src/playground/playground.stories.d.ts.map +0 -1
  458. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +0 -2
  459. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +0 -1
  460. package/dist/types/src/plugin-intent/actions.d.ts +0 -38
  461. package/dist/types/src/plugin-intent/actions.d.ts.map +0 -1
  462. package/dist/types/src/plugin-intent/errors.d.ts +0 -16
  463. package/dist/types/src/plugin-intent/errors.d.ts.map +0 -1
  464. package/dist/types/src/plugin-intent/index.d.ts +0 -5
  465. package/dist/types/src/plugin-intent/index.d.ts.map +0 -1
  466. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +0 -139
  467. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +0 -1
  468. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +0 -2
  469. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +0 -1
  470. package/dist/types/src/plugin-intent/intent.d.ts +0 -63
  471. package/dist/types/src/plugin-intent/intent.d.ts.map +0 -1
  472. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +0 -2
  473. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +0 -1
  474. package/dist/types/src/plugin-settings/actions.d.ts +0 -27
  475. package/dist/types/src/plugin-settings/actions.d.ts.map +0 -1
  476. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +0 -4
  477. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +0 -1
  478. package/dist/types/src/plugin-settings/index.d.ts +0 -3
  479. package/dist/types/src/plugin-settings/index.d.ts.map +0 -1
  480. package/dist/types/src/plugin-settings/intent-resolver.d.ts +0 -4
  481. package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +0 -1
  482. package/dist/types/src/plugin-settings/store.d.ts +0 -5
  483. package/dist/types/src/plugin-settings/store.d.ts.map +0 -1
  484. package/dist/types/src/plugin-settings/translations.d.ts +0 -10
  485. package/dist/types/src/plugin-settings/translations.d.ts.map +0 -1
  486. package/dist/types/src/react/ErrorBoundary.d.ts +0 -30
  487. package/dist/types/src/react/ErrorBoundary.d.ts.map +0 -1
  488. package/dist/types/src/react/IntentContext.d.ts +0 -8
  489. package/dist/types/src/react/IntentContext.d.ts.map +0 -1
  490. package/dist/types/src/react/PluginManagerProvider.d.ts +0 -10
  491. package/dist/types/src/react/PluginManagerProvider.d.ts.map +0 -1
  492. package/dist/types/src/react/Surface.d.ts +0 -12
  493. package/dist/types/src/react/Surface.d.ts.map +0 -1
  494. package/dist/types/src/react/Surface.stories.d.ts +0 -16
  495. package/dist/types/src/react/Surface.stories.d.ts.map +0 -1
  496. package/dist/types/src/react/common.d.ts +0 -13
  497. package/dist/types/src/react/common.d.ts.map +0 -1
  498. package/dist/types/src/react/index.d.ts +0 -7
  499. package/dist/types/src/react/index.d.ts.map +0 -1
  500. package/dist/types/src/react/useCapabilities.d.ts +0 -13
  501. package/dist/types/src/react/useCapabilities.d.ts.map +0 -1
  502. package/dist/types/src/react/useIntentResolver.d.ts +0 -3
  503. package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
  504. package/dist/types/src/worker.d.ts +0 -4
  505. package/dist/types/src/worker.d.ts.map +0 -1
  506. package/src/App.tsx +0 -284
  507. package/src/common/collaboration.ts +0 -21
  508. package/src/common/events.ts +0 -79
  509. package/src/common/file.ts +0 -22
  510. package/src/common/graph.ts +0 -30
  511. package/src/common/layout.ts +0 -278
  512. package/src/common/surface.ts +0 -86
  513. package/src/core/capabilities.test.ts +0 -136
  514. package/src/core/capabilities.ts +0 -255
  515. package/src/core/manager.test.ts +0 -516
  516. package/src/core/manager.ts +0 -597
  517. package/src/playground/debug/Debug.tsx +0 -39
  518. package/src/playground/debug/plugin.ts +0 -17
  519. package/src/playground/generator/Main.tsx +0 -71
  520. package/src/playground/generator/Toolbar.tsx +0 -47
  521. package/src/playground/generator/generator.ts +0 -48
  522. package/src/playground/generator/index.ts +0 -6
  523. package/src/playground/generator/plugin.ts +0 -23
  524. package/src/playground/layout/Layout.tsx +0 -33
  525. package/src/playground/layout/plugin.ts +0 -17
  526. package/src/playground/logger/Toolbar.tsx +0 -30
  527. package/src/playground/logger/plugin.ts +0 -37
  528. package/src/playground/logger/schema.ts +0 -12
  529. package/src/playground/playground.stories.tsx +0 -43
  530. package/src/plugin-intent/IntentPlugin.ts +0 -21
  531. package/src/plugin-intent/actions.ts +0 -33
  532. package/src/plugin-intent/errors.ts +0 -39
  533. package/src/plugin-intent/index.ts +0 -8
  534. package/src/plugin-intent/intent-dispatcher.test.ts +0 -279
  535. package/src/plugin-intent/intent-dispatcher.ts +0 -334
  536. package/src/plugin-intent/intent.ts +0 -154
  537. package/src/plugin-settings/SettingsPlugin.ts +0 -36
  538. package/src/plugin-settings/actions.ts +0 -29
  539. package/src/plugin-settings/app-graph-builder.ts +0 -158
  540. package/src/plugin-settings/index.ts +0 -6
  541. package/src/plugin-settings/intent-resolver.ts +0 -35
  542. package/src/plugin-settings/store.ts +0 -33
  543. package/src/plugin-settings/translations.ts +0 -19
  544. package/src/react/ErrorBoundary.tsx +0 -54
  545. package/src/react/IntentContext.tsx +0 -35
  546. package/src/react/Surface.stories.tsx +0 -97
  547. package/src/react/Surface.tsx +0 -78
  548. package/src/react/common.ts +0 -13
  549. package/src/react/index.ts +0 -10
  550. package/src/react/useCapabilities.ts +0 -31
  551. package/src/react/useIntentResolver.ts +0 -22
  552. package/src/worker.ts +0 -11
  553. /package/dist/lib/browser/{intent-dispatcher-FTTJLVGN.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  554. /package/dist/lib/browser/{worker.mjs.map → common/activation-events.mjs.map} +0 -0
  555. /package/dist/lib/{node-esm/intent-dispatcher-YQIQ55LJ.mjs.map → browser/common/capabilities.mjs.map} +0 -0
  556. /package/dist/lib/{node-esm/worker.mjs.map → browser/core/activation-event.mjs.map} +0 -0
@@ -0,0 +1,149 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Accessor, createSignal } from 'solid-js';
6
+
7
+ import { type StatusPayload } from './types';
8
+
9
+ //
10
+ // Creep tuning. The ring auto-creeps toward a moving ceiling so a long
11
+ // activation silence never reads as a frozen disc. See the original
12
+ // hand-written driver for the rationale behind each constant.
13
+ //
14
+
15
+ /** Creep timer cadence, in milliseconds. */
16
+ export const CREEP_TICK_MS = 100;
17
+ /** State-1 ease rate — a gentle "we're alive" hint before real progress lands. */
18
+ export const STATE_1_RATE = 0.05;
19
+ /** State-1 asymptote (percent) the creep eases toward before host progress. */
20
+ export const STATE_1_ASYMPTOTE = 40;
21
+ /** State-2 ease rate — bridges the gap between sparse host `progress()` calls. */
22
+ export const STATE_2_RATE = 0.05;
23
+ /** State-2 lead (percent) the ceiling sits ahead of the last host value. */
24
+ export const STATE_2_BUMP = 15;
25
+ /** Hard ceiling the auto-creep never crosses (host must drive the rest). */
26
+ export const ABSOLUTE_CEILING = 90;
27
+
28
+ /** Loader lifecycle phase. */
29
+ export type Phase = 'creep' | 'host' | 'dismissing';
30
+
31
+ /** A single rendered status line; `id` keys the `<For>` and survives in-place range ticks. */
32
+ export type StatusLine = {
33
+ id: number;
34
+ text: string;
35
+ event?: string;
36
+ module?: string;
37
+ };
38
+
39
+ /**
40
+ * Asymptotic ease — `next = raw + (ceiling - raw) * rate`, clamped so it never
41
+ * overshoots (or regresses past) the ceiling. Pure; unit-tested.
42
+ */
43
+ export const easeToward = (raw: number, ceiling: number, rate: number): number =>
44
+ raw >= ceiling - 0.1 ? raw : raw + (ceiling - raw) * rate;
45
+
46
+ /**
47
+ * Clamp a host-supplied fraction to a percent in [0, 100]. Invalid / negative /
48
+ * non-finite values collapse to 0 rather than poisoning the CSS var. Pure;
49
+ * unit-tested.
50
+ */
51
+ export const clampPercent = (fraction?: number): number =>
52
+ typeof fraction !== 'number' || !Number.isFinite(fraction) || fraction < 0 ? 0 : Math.min(1, fraction) * 100;
53
+
54
+ /** Display text for a payload — appends the `(index/total)` suffix when a range is present. */
55
+ export const displayText = (payload: StatusPayload): string =>
56
+ payload.range ? `${payload.humanized} (${payload.range.index}/${payload.range.total})` : payload.humanized;
57
+
58
+ /**
59
+ * Reactive loader store — owns the progress percent, the status-line log, and
60
+ * the lifecycle phase, plus the auto-creep timer. All DOM-free, so the creep
61
+ * math and status reduction are testable as plain functions; `Loader.tsx` binds
62
+ * the accessors to the DOM and `bridge.ts` wraps the mutators as the imperative
63
+ * `window.__bootLoader` facade.
64
+ */
65
+ export type LoaderStore = {
66
+ /** Progress as a percent in [0, 100] (the CSS `--boot-loader-bar-progress` value). */
67
+ progress: Accessor<number>;
68
+ /** Appended status lines, newest last. */
69
+ lines: Accessor<StatusLine[]>;
70
+ /** Current lifecycle phase. */
71
+ phase: Accessor<Phase>;
72
+ /** Apply a status update (append, or replace-in-place for range ticks). */
73
+ pushStatus: (payload: StatusPayload) => void;
74
+ /** Enter host-driven progress with `fraction` ∈ [0, 1]; never regresses. */
75
+ setProgress: (fraction?: number) => void;
76
+ /** Snap to 100%, stop the creep, and enter the dismissing phase. */
77
+ ready: () => void;
78
+ /** Stop the creep timer (call on teardown). */
79
+ dispose: () => void;
80
+ };
81
+
82
+ export const createLoaderStore = (initialStatus?: string): LoaderStore => {
83
+ const [progress, setProgressPct] = createSignal(0);
84
+ const [lines, setLines] = createSignal<StatusLine[]>(initialStatus ? [{ id: 0, text: initialStatus }] : []);
85
+ const [phase, setPhase] = createSignal<Phase>('creep');
86
+
87
+ let creepCeiling = STATE_1_ASYMPTOTE;
88
+ let creepRate = STATE_1_RATE;
89
+ let nextId = initialStatus ? 1 : 0;
90
+ let timer: ReturnType<typeof setInterval> | null = null;
91
+
92
+ const startCreep = (): void => {
93
+ if (timer == null) {
94
+ timer = setInterval(() => setProgressPct((raw) => easeToward(raw, creepCeiling, creepRate)), CREEP_TICK_MS);
95
+ }
96
+ };
97
+
98
+ const stopCreep = (): void => {
99
+ if (timer != null) {
100
+ clearInterval(timer);
101
+ timer = null;
102
+ }
103
+ };
104
+
105
+ const pushStatus = (payload: StatusPayload): void => {
106
+ const text = displayText(payload);
107
+ setLines((current) => {
108
+ const previous = current.at(-1);
109
+ // Dedup back-to-back identical transitions (same text + structured fields).
110
+ if (
111
+ previous &&
112
+ previous.text === text &&
113
+ (previous.event ?? null) === (payload.event ?? null) &&
114
+ (previous.module ?? null) === (payload.module ?? null)
115
+ ) {
116
+ return current;
117
+ }
118
+ // Range tick — replace the current line in place rather than appending,
119
+ // so a counted phase produces one entry with an updating suffix.
120
+ if (payload.range && previous) {
121
+ return [...current.slice(0, -1), { ...previous, text }];
122
+ }
123
+ return [...current, { id: nextId++, text, event: payload.event, module: payload.module }];
124
+ });
125
+ };
126
+
127
+ const setProgress = (fraction?: number): void => {
128
+ setPhase('host');
129
+ const pct = clampPercent(fraction);
130
+ // The ring never regresses: hold the current value if the host reports lower.
131
+ setProgressPct((current) => Math.max(current, pct));
132
+ // Switch the creep to its state-2 cadence and lead the host value by a bump.
133
+ creepRate = STATE_2_RATE;
134
+ creepCeiling = Math.min(Math.max(creepCeiling, pct + STATE_2_BUMP), ABSOLUTE_CEILING);
135
+ startCreep();
136
+ };
137
+
138
+ const ready = (): void => {
139
+ stopCreep();
140
+ setProgressPct(100);
141
+ setPhase('dismissing');
142
+ };
143
+
144
+ const dispose = (): void => stopCreep();
145
+
146
+ startCreep();
147
+
148
+ return { progress, lines, phase, pushStatus, setProgress, ready, dispose };
149
+ };
@@ -0,0 +1,11 @@
1
+ {
2
+ "extends": "../../../../../../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "jsx": "preserve",
5
+ "jsxImportSource": "solid-js",
6
+ "strict": false,
7
+ "noEmit": true,
8
+ "composite": false
9
+ },
10
+ "include": ["."]
11
+ }
@@ -0,0 +1,78 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ /**
6
+ * Status payload accepted by `window.__bootLoader.status(...)`. The caller owns
7
+ * formatting — `humanized` is the exact text rendered — while `event` / `module`
8
+ * carry the structured activation ids for the boot trace, and `range` drives an
9
+ * in-place `(index/total)` counter for long counted phases.
10
+ */
11
+ export type StatusPayload = {
12
+ /**
13
+ * Raw activation event key (e.g. `dxos.org/plugin/observability/activate`)
14
+ * when the transition is event-level.
15
+ */
16
+ event?: string;
17
+
18
+ /**
19
+ * Raw module id (e.g. `org.dxos.plugin.observability.module.ReactSurface`)
20
+ * when the transition is module-level.
21
+ */
22
+ module?: string;
23
+
24
+ /** Exact text to display (e.g. "Activating Observability: react-surface"). */
25
+ humanized: string;
26
+
27
+ /**
28
+ * Optional `(index/total)` tick. When present the loader replaces the current
29
+ * line in place ("Loading plugins (12/80)") instead of appending a new entry —
30
+ * keeps the visible log compact during long counted phases.
31
+ */
32
+ range?: { index: number; total: number };
33
+ };
34
+
35
+ /**
36
+ * Imperative facade exposed on `window.__bootLoader`, installed by the inlined
37
+ * loader bundle and driven by the host app (the React relay forwards `useApp`'s
38
+ * startup progress through it).
39
+ */
40
+ export type BootLoaderApi = {
41
+ /** Update the visible status line. */
42
+ status: (payload: StatusPayload) => void;
43
+ /** Enter host-driven progress — `fraction` ∈ [0, 1]. */
44
+ progress: (fraction?: number) => void;
45
+ /** Play the dismissal outro, then remove the loader DOM (graceful path). */
46
+ ready: () => void;
47
+ /** Remove the loader DOM immediately (fast-load backstop / terminal). */
48
+ dismiss: () => void;
49
+ };
50
+
51
+ /**
52
+ * Config baked into `index.html` by `bootLoaderPlugin` ahead of the loader
53
+ * bundle, so the compiled app stays static (compiled once, independent of the
54
+ * host's brand mark / initial status).
55
+ */
56
+ export type BootLoaderConfig = {
57
+ /**
58
+ * Id of the static backdrop element the plugin injects and the loader mounts
59
+ * into — the single coupling between `transformIndexHtml` and the app. The
60
+ * plugin owns the authoritative value and passes it here so `entry.tsx` reads
61
+ * it rather than hardcoding (the CSS selector mirrors it — see `boot-loader.css`).
62
+ */
63
+ rootId?: string;
64
+ /** Inline SVG markup for the brand mark rendered inside the ring. */
65
+ markSvg?: string;
66
+ /** Initial status text rendered before the host fires its first `status(...)`. */
67
+ status?: string;
68
+ };
69
+
70
+ /** Fallback backdrop id when no config is present (kept in sync with `loader.ts` + the CSS). */
71
+ export const DEFAULT_ROOT_ID = 'boot-loader';
72
+
73
+ declare global {
74
+ interface Window {
75
+ __bootLoader?: BootLoaderApi;
76
+ __BOOT_LOADER_CONFIG__?: BootLoaderConfig;
77
+ }
78
+ }
@@ -0,0 +1,204 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ // @ts-ignore — @types/babel__core present transitively but not declared here.
6
+ import * as babel from '@babel/core';
7
+ // @ts-ignore — @babel/preset-typescript ships no .d.ts.
8
+ import babelPresetTypeScript from '@babel/preset-typescript';
9
+ // @ts-ignore — babel-preset-solid ships no .d.ts.
10
+ import babelPresetSolid from 'babel-preset-solid';
11
+ import { build, type Plugin as EsbuildPlugin } from 'esbuild';
12
+ import { basename, dirname } from 'node:path';
13
+ import { fileURLToPath } from 'node:url';
14
+ import { type Plugin } from 'vite';
15
+
16
+ import css from './loader-app/boot-loader.css?raw';
17
+ // The loader-app Solid sources are inlined as raw text (never parsed by
18
+ // dx-compile — app-framework is a React package, so its build can't compile
19
+ // Solid JSX). They are compiled to a self-contained browser IIFE at the
20
+ // consuming app's build time by {@link compileLoaderBundle} below.
21
+ import bridgeSrc from './loader-app/bridge.ts?raw';
22
+ import entrySrc from './loader-app/entry.tsx?raw';
23
+ import loaderSrc from './loader-app/Loader.tsx?raw';
24
+ import mountSrc from './loader-app/mount.tsx?raw';
25
+ import storeSrc from './loader-app/store.ts?raw';
26
+ import typesSrc from './loader-app/types.ts?raw';
27
+
28
+ /**
29
+ * Options for {@link bootLoaderPlugin}.
30
+ */
31
+ export type BootLoaderOptions = {
32
+ /**
33
+ * Initial status text rendered by the loader (replaced via
34
+ * `window.__bootLoader.status(...)` once the host starts firing phase callbacks).
35
+ */
36
+ status?: string;
37
+
38
+ /**
39
+ * Inline SVG markup for an optional brand mark rendered inside the progress
40
+ * ring. The mark renders at full opacity with whatever fills the SVG declares,
41
+ * so pass a colour-palette logo for the strongest visual identity. SVGs that
42
+ * use `fill="currentColor"` still inherit the loader's `prefers-color-scheme`
43
+ * text colour. Leave empty/undefined to render only the ring.
44
+ */
45
+ markSvg?: string;
46
+
47
+ /**
48
+ * HTML entry filenames to inject the loader into. Defaults to `index.html` only
49
+ * so auxiliary pages (`recovery.html`, `reset.html`, etc.) stay unobstructed.
50
+ */
51
+ include?: string[];
52
+ };
53
+
54
+ const VIRTUAL_NS = 'boot-loader-app';
55
+
56
+ // Relative-import graph of the loader-app, keyed by module name (no extension).
57
+ // `tsx` modules carry JSX (compiled via `babel-preset-solid`); `ts` modules are
58
+ // type-stripped only. `solid-js` imports introduced by the Solid transform
59
+ // resolve from `node_modules` against `resolveDir`.
60
+ const MODULES: Record<string, { contents: string; tsx: boolean }> = {
61
+ entry: { contents: entrySrc, tsx: true },
62
+ mount: { contents: mountSrc, tsx: true },
63
+ Loader: { contents: loaderSrc, tsx: true },
64
+ bridge: { contents: bridgeSrc, tsx: false },
65
+ store: { contents: storeSrc, tsx: false },
66
+ types: { contents: typesSrc, tsx: false },
67
+ };
68
+
69
+ // Walk up from the compiled plugin to find a `node_modules` containing
70
+ // `solid-js` (a dependency of this package). Used as esbuild's `resolveDir`.
71
+ const resolveDir = dirname(fileURLToPath(import.meta.url));
72
+
73
+ /**
74
+ * Compile the loader-app from its inlined raw sources into a single
75
+ * self-contained IIFE (Solid runtime bundled in) suitable for inlining into
76
+ * `index.html`. Mirrors dx-compile's Solid pipeline: `@babel/preset-typescript`
77
+ * strips types, then `babel-preset-solid` compiles JSX into reactive primitives.
78
+ */
79
+ const compileLoaderBundle = async (): Promise<string> => {
80
+ const virtualSolid = (): EsbuildPlugin => ({
81
+ name: 'boot-loader-app-virtual',
82
+ setup: (esbuild) => {
83
+ esbuild.onResolve({ filter: /^\.\// }, (args) => {
84
+ const name = args.path.replace(/^\.\//, '').replace(/\.(tsx?|jsx?)$/, '');
85
+ return name in MODULES ? { path: name, namespace: VIRTUAL_NS } : undefined;
86
+ });
87
+
88
+ esbuild.onLoad({ filter: /.*/, namespace: VIRTUAL_NS }, async (args) => {
89
+ const module = MODULES[args.path];
90
+ const result = await babel.transformAsync(module.contents, {
91
+ filename: `${args.path}.${module.tsx ? 'tsx' : 'ts'}`,
92
+ babelrc: false,
93
+ configFile: false,
94
+ // Presets run last-to-first: TS strips first, then Solid sees plain JSX.
95
+ presets: [
96
+ [babelPresetSolid, { generate: 'dom', hydratable: false }],
97
+ [babelPresetTypeScript, { allowDeclareFields: true }],
98
+ ],
99
+ });
100
+ if (!result?.code) {
101
+ throw new Error(`babel-preset-solid returned no code for ${args.path}`);
102
+ }
103
+ return { contents: result.code, loader: 'js', resolveDir };
104
+ });
105
+ },
106
+ });
107
+
108
+ const result = await build({
109
+ stdin: { contents: "import './entry';", loader: 'ts', resolveDir, sourcefile: 'boot-loader-entry.ts' },
110
+ bundle: true,
111
+ format: 'iife',
112
+ platform: 'browser',
113
+ target: 'es2020',
114
+ minify: true,
115
+ write: false,
116
+ legalComments: 'none',
117
+ define: { 'process.env.NODE_ENV': '"production"' },
118
+ plugins: [virtualSolid()],
119
+ });
120
+
121
+ return result.outputFiles[0].text;
122
+ };
123
+
124
+ let bundlePromise: Promise<string> | undefined;
125
+ const getLoaderBundle = (): Promise<string> => (bundlePromise ??= compileLoaderBundle());
126
+
127
+ /**
128
+ * Vite plugin that injects a Solid "boot loader" app into the host app's
129
+ * `index.html`.
130
+ *
131
+ * The full-screen backdrop paints on the very first frame from an inline
132
+ * `<style>` (before any JS bundle is fetched), so the user sees the loading
133
+ * surface immediately on cold load instead of a blank document. A compiled,
134
+ * self-contained Solid IIFE — inlined ahead of the app bundle — then renders
135
+ * the determinate progress ring + status log into that backdrop and exposes the
136
+ * host-facing driver on `window.__bootLoader`.
137
+ *
138
+ * The host app drives the loader (the React relay forwards `useApp`'s startup
139
+ * progress):
140
+ * - `window.__bootLoader.status(payload)` updates the status line per phase.
141
+ * - `window.__bootLoader.progress(fraction)` grows the determinate ring (0–1).
142
+ * - `window.__bootLoader.ready()` plays the dismissal outro, then self-removes.
143
+ * - `window.__bootLoader.dismiss()` removes the loader immediately (fast path).
144
+ *
145
+ * Inject order (all at the start of `<body>`, except the stylesheet):
146
+ * - `<style>` → `<head>` (parses before any bundled stylesheet).
147
+ * - `<div id="boot-loader">` → the static backdrop the CSS styles instantly.
148
+ * - inline `<script>` config (`window.__BOOT_LOADER_CONFIG__`) → before the bundle.
149
+ * - inline `<script>` loader bundle → renders the Solid app into the backdrop.
150
+ *
151
+ * Keeping the loader a sibling of `#root` (rather than a child) means
152
+ * `createRoot(document.getElementById('root')).render(...)` does not fight the
153
+ * loader for ownership; the framework explicitly dismisses after the first
154
+ * React commit for a deterministic handoff.
155
+ *
156
+ * Color tokens are exposed as CSS custom properties (`--boot-loader-bg-light`,
157
+ * etc.) in `boot-loader.css`, so consumers can override them at the document
158
+ * level without re-parameterizing this plugin.
159
+ */
160
+ export const bootLoaderPlugin = ({ status, markSvg, include = ['index.html'] }: BootLoaderOptions = {}): Plugin => {
161
+ return {
162
+ name: 'app-framework:boot-loader',
163
+ async transformIndexHtml(_html, ctx) {
164
+ const filename = basename(ctx.filename ?? 'index.html');
165
+ if (!include.includes(filename)) {
166
+ return;
167
+ }
168
+
169
+ const bundle = await getLoaderBundle();
170
+ // Authoritative backdrop id: injected here, passed to the bundle via
171
+ // config (so `entry.tsx` reads it), and mirrored by the CSS selector in
172
+ // `boot-loader.css`. The inner DOM ↔ CSS contract is guarded by the story.
173
+ const rootId = 'boot-loader';
174
+ return [
175
+ {
176
+ tag: 'style',
177
+ injectTo: 'head',
178
+ children: css,
179
+ },
180
+ {
181
+ tag: 'div',
182
+ injectTo: 'body-prepend',
183
+ attrs: {
184
+ id: rootId,
185
+ role: 'status',
186
+ 'aria-live': 'polite',
187
+ 'aria-label': 'Initializing',
188
+ },
189
+ children: '',
190
+ },
191
+ {
192
+ tag: 'script',
193
+ injectTo: 'body-prepend',
194
+ children: `window.__BOOT_LOADER_CONFIG__=${JSON.stringify({ rootId, markSvg, status })};`,
195
+ },
196
+ {
197
+ tag: 'script',
198
+ injectTo: 'body-prepend',
199
+ children: bundle,
200
+ },
201
+ ];
202
+ },
203
+ };
204
+ };