@dxos/app-framework 0.8.4-main.3eb6e50203 → 0.8.4-main.3fbcb4aa9b

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 (379) hide show
  1. package/.storybook/main.mts +1 -3
  2. package/dist/lib/browser/{capability-DU35RXMD.mjs → capability-5RRH3WIB.mjs} +11 -10
  3. package/dist/lib/browser/capability-5RRH3WIB.mjs.map +7 -0
  4. package/dist/lib/browser/{capability-7LE5X2NH.mjs → capability-LUKGKUQH.mjs} +10 -9
  5. package/dist/lib/browser/{chunk-4DQMLMGU.mjs → chunk-23D4SJUE.mjs} +11 -13
  6. package/dist/lib/browser/{chunk-4DQMLMGU.mjs.map → chunk-23D4SJUE.mjs.map} +3 -3
  7. package/dist/lib/browser/{chunk-ZQO3UZ4R.mjs → chunk-3JWJXGLK.mjs} +6 -4
  8. package/dist/lib/browser/chunk-3JWJXGLK.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-45CHLTBV.mjs +34 -0
  10. package/dist/lib/browser/chunk-45CHLTBV.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-PKQT6C53.mjs → chunk-66IXTIVK.mjs} +3 -2
  12. package/dist/lib/browser/chunk-66IXTIVK.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-7VZJR2OA.mjs +581 -0
  14. package/dist/lib/browser/chunk-7VZJR2OA.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-CZ4BIAHH.mjs +422 -0
  16. package/dist/lib/browser/chunk-CZ4BIAHH.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-FJ4765WW.mjs +8 -0
  18. package/dist/lib/browser/{chunk-FHQTHCX7.mjs.map → chunk-FJ4765WW.mjs.map} +3 -3
  19. package/dist/lib/browser/chunk-FO3IYSLV.mjs +68 -0
  20. package/dist/lib/browser/chunk-FO3IYSLV.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-JD3Z5NEF.mjs +469 -0
  22. package/dist/lib/browser/chunk-JD3Z5NEF.mjs.map +7 -0
  23. package/dist/lib/browser/chunk-NBXPP7JR.mjs +1174 -0
  24. package/dist/lib/browser/chunk-NBXPP7JR.mjs.map +7 -0
  25. package/dist/lib/browser/{chunk-IGRQWMWW.mjs → chunk-WBHCSOBW.mjs} +18 -18
  26. package/dist/lib/browser/chunk-WBHCSOBW.mjs.map +7 -0
  27. package/dist/lib/browser/{chunk-KWP6PKIU.mjs → chunk-Z55LVAGN.mjs} +87 -19
  28. package/dist/lib/browser/chunk-Z55LVAGN.mjs.map +7 -0
  29. package/dist/lib/browser/{chunk-EIFGKQSA.mjs → chunk-ZGJAZSNE.mjs} +9 -37
  30. package/dist/lib/browser/chunk-ZGJAZSNE.mjs.map +7 -0
  31. package/dist/lib/browser/cli/index.mjs +16 -29
  32. package/dist/lib/browser/cli/index.mjs.map +3 -3
  33. package/dist/lib/browser/common/activation-events.mjs +9 -8
  34. package/dist/lib/browser/common/capabilities.mjs +9 -8
  35. package/dist/lib/browser/core/activation-event.mjs +1 -1
  36. package/dist/lib/browser/core/capability.mjs +3 -1
  37. package/dist/lib/browser/core/plugin-manager.mjs +8 -4
  38. package/dist/lib/browser/core/plugin.mjs +14 -4
  39. package/dist/lib/browser/core/url-loader.mjs +24 -0
  40. package/dist/lib/browser/index.mjs +45 -24
  41. package/dist/lib/browser/index.mjs.map +3 -3
  42. package/dist/lib/browser/{invoker-capability-7QW56NOM.mjs → invoker-capability-K4GHUFXF.mjs} +22 -14
  43. package/dist/lib/browser/invoker-capability-K4GHUFXF.mjs.map +7 -0
  44. package/dist/lib/browser/meta.json +1 -1
  45. package/dist/lib/browser/testing/index.mjs +184 -45
  46. package/dist/lib/browser/testing/index.mjs.map +4 -4
  47. package/dist/lib/browser/testing/react.mjs +78 -0
  48. package/dist/lib/browser/testing/react.mjs.map +7 -0
  49. package/dist/lib/browser/ui/index.mjs +19 -20
  50. package/dist/lib/node-esm/{capability-OSVYGK4X.mjs → capability-FCGZVIEG.mjs} +10 -9
  51. package/dist/lib/{browser/capability-7LE5X2NH.mjs.map → node-esm/capability-FCGZVIEG.mjs.map} +1 -1
  52. package/dist/lib/node-esm/{capability-SR2EIZFP.mjs → capability-JOIQ2MQE.mjs} +11 -10
  53. package/dist/lib/node-esm/capability-JOIQ2MQE.mjs.map +7 -0
  54. package/dist/lib/node-esm/{chunk-UEWJDI2L.mjs → chunk-37Z53PXZ.mjs} +2 -2
  55. package/dist/lib/node-esm/{chunk-UEWJDI2L.mjs.map → chunk-37Z53PXZ.mjs.map} +3 -3
  56. package/dist/lib/node-esm/chunk-6XW6LET6.mjs +35 -0
  57. package/dist/lib/node-esm/chunk-6XW6LET6.mjs.map +7 -0
  58. package/dist/lib/node-esm/{chunk-DHSHRYIB.mjs → chunk-D347W3KO.mjs} +9 -37
  59. package/dist/lib/node-esm/chunk-D347W3KO.mjs.map +7 -0
  60. package/dist/lib/node-esm/chunk-DRZKO5UZ.mjs +470 -0
  61. package/dist/lib/node-esm/chunk-DRZKO5UZ.mjs.map +7 -0
  62. package/dist/lib/node-esm/{chunk-DZ2XLAGI.mjs → chunk-HTBJU5FX.mjs} +87 -19
  63. package/dist/lib/node-esm/chunk-HTBJU5FX.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-M3HKPRPO.mjs +423 -0
  65. package/dist/lib/node-esm/chunk-M3HKPRPO.mjs.map +7 -0
  66. package/dist/lib/node-esm/chunk-MUVUQC3G.mjs +1175 -0
  67. package/dist/lib/node-esm/chunk-MUVUQC3G.mjs.map +7 -0
  68. package/dist/lib/node-esm/{chunk-J2PHTRHC.mjs → chunk-SBS2YMPT.mjs} +11 -13
  69. package/dist/lib/node-esm/{chunk-J2PHTRHC.mjs.map → chunk-SBS2YMPT.mjs.map} +3 -3
  70. package/dist/lib/node-esm/{chunk-64IMLAS2.mjs → chunk-SDJ4B2LU.mjs} +6 -4
  71. package/dist/lib/node-esm/chunk-SDJ4B2LU.mjs.map +7 -0
  72. package/dist/lib/node-esm/chunk-V24UWT36.mjs +582 -0
  73. package/dist/lib/node-esm/chunk-V24UWT36.mjs.map +7 -0
  74. package/dist/lib/node-esm/{chunk-OQYHRZYF.mjs → chunk-WFSRZKBP.mjs} +18 -18
  75. package/dist/lib/node-esm/chunk-WFSRZKBP.mjs.map +7 -0
  76. package/dist/lib/node-esm/chunk-WK7OIQKI.mjs +70 -0
  77. package/dist/lib/node-esm/chunk-WK7OIQKI.mjs.map +7 -0
  78. package/dist/lib/node-esm/{chunk-7OWSHPYK.mjs → chunk-XOCUANHO.mjs} +3 -2
  79. package/dist/lib/node-esm/chunk-XOCUANHO.mjs.map +7 -0
  80. package/dist/lib/node-esm/cli/index.mjs +16 -29
  81. package/dist/lib/node-esm/cli/index.mjs.map +3 -3
  82. package/dist/lib/node-esm/common/activation-events.mjs +9 -8
  83. package/dist/lib/node-esm/common/capabilities.mjs +9 -8
  84. package/dist/lib/node-esm/core/activation-event.mjs +1 -1
  85. package/dist/lib/node-esm/core/capability.mjs +3 -1
  86. package/dist/lib/node-esm/core/plugin-manager.mjs +8 -4
  87. package/dist/lib/node-esm/core/plugin.mjs +14 -4
  88. package/dist/lib/node-esm/core/url-loader.mjs +25 -0
  89. package/dist/lib/node-esm/index.mjs +45 -24
  90. package/dist/lib/node-esm/index.mjs.map +3 -3
  91. package/dist/lib/node-esm/{invoker-capability-CK4AMF2R.mjs → invoker-capability-XEPW5LMJ.mjs} +22 -14
  92. package/dist/lib/node-esm/invoker-capability-XEPW5LMJ.mjs.map +7 -0
  93. package/dist/lib/node-esm/meta.json +1 -1
  94. package/dist/lib/node-esm/testing/index.mjs +184 -45
  95. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  96. package/dist/lib/node-esm/testing/react.mjs +79 -0
  97. package/dist/lib/node-esm/testing/react.mjs.map +7 -0
  98. package/dist/lib/node-esm/ui/index.mjs +19 -20
  99. package/dist/plugin/node-esm/index.mjs +893 -0
  100. package/dist/plugin/node-esm/index.mjs.map +7 -0
  101. package/dist/plugin/node-esm/meta.json +1 -0
  102. package/dist/types/src/common/activation-events.d.ts +1 -1
  103. package/dist/types/src/common/activation-events.d.ts.map +1 -1
  104. package/dist/types/src/common/annotations.d.ts +1 -0
  105. package/dist/types/src/common/annotations.d.ts.map +1 -0
  106. package/dist/types/src/common/capabilities.d.ts +4 -8
  107. package/dist/types/src/common/capabilities.d.ts.map +1 -1
  108. package/dist/types/src/common/operations.d.ts +8 -22
  109. package/dist/types/src/common/operations.d.ts.map +1 -1
  110. package/dist/types/src/core/activation-event.d.ts +5 -5
  111. package/dist/types/src/core/activation-event.d.ts.map +1 -1
  112. package/dist/types/src/core/capability-manager.d.ts +5 -0
  113. package/dist/types/src/core/capability-manager.d.ts.map +1 -1
  114. package/dist/types/src/core/capability.d.ts +14 -8
  115. package/dist/types/src/core/capability.d.ts.map +1 -1
  116. package/dist/types/src/core/edge-registry-plugin-provider.d.ts +30 -0
  117. package/dist/types/src/core/edge-registry-plugin-provider.d.ts.map +1 -0
  118. package/dist/types/src/core/index.d.ts +6 -0
  119. package/dist/types/src/core/index.d.ts.map +1 -1
  120. package/dist/types/src/core/plugin-asset-cache.d.ts +71 -0
  121. package/dist/types/src/core/plugin-asset-cache.d.ts.map +1 -0
  122. package/dist/types/src/core/plugin-manager.d.ts +177 -4
  123. package/dist/types/src/core/plugin-manager.d.ts.map +1 -1
  124. package/dist/types/src/core/plugin-manifest.d.ts +101 -0
  125. package/dist/types/src/core/plugin-manifest.d.ts.map +1 -0
  126. package/dist/types/src/core/plugin-manifest.test.d.ts +2 -0
  127. package/dist/types/src/core/plugin-manifest.test.d.ts.map +1 -0
  128. package/dist/types/src/core/plugin.d.ts +113 -7
  129. package/dist/types/src/core/plugin.d.ts.map +1 -1
  130. package/dist/types/src/core/registry.d.ts +101 -0
  131. package/dist/types/src/core/registry.d.ts.map +1 -0
  132. package/dist/types/src/core/url-loader.d.ts +127 -0
  133. package/dist/types/src/core/url-loader.d.ts.map +1 -0
  134. package/dist/types/src/core/url-loader.test.d.ts +2 -0
  135. package/dist/types/src/core/url-loader.test.d.ts.map +1 -0
  136. package/dist/types/src/helpers.d.ts.map +1 -1
  137. package/dist/types/src/plugin-operation/OperationPlugin.d.ts.map +1 -1
  138. package/dist/types/src/plugin-operation/history/capability.d.ts +1 -1
  139. package/dist/types/src/plugin-operation/history/capability.d.ts.map +1 -1
  140. package/dist/types/src/plugin-operation/history/errors.d.ts +30 -3
  141. package/dist/types/src/plugin-operation/history/errors.d.ts.map +1 -1
  142. package/dist/types/src/plugin-operation/history/history-tracker.d.ts +1 -1
  143. package/dist/types/src/plugin-operation/history/history-tracker.d.ts.map +1 -1
  144. package/dist/types/src/plugin-operation/history/types.d.ts +1 -1
  145. package/dist/types/src/plugin-operation/history/types.d.ts.map +1 -1
  146. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts +1 -1
  147. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +1 -1
  148. package/dist/types/src/plugin-operation/history/undo-registry.d.ts +1 -1
  149. package/dist/types/src/plugin-operation/history/undo-registry.d.ts.map +1 -1
  150. package/dist/types/src/plugin-operation/invoker-capability.d.ts +1 -1
  151. package/dist/types/src/plugin-operation/invoker-capability.d.ts.map +1 -1
  152. package/dist/types/src/plugin-operation/meta.d.ts.map +1 -1
  153. package/dist/types/src/plugin-operation/testing.d.ts +27 -77
  154. package/dist/types/src/plugin-operation/testing.d.ts.map +1 -1
  155. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts.map +1 -1
  156. package/dist/types/src/plugin-runtime/capability.d.ts +1 -1
  157. package/dist/types/src/plugin-runtime/capability.d.ts.map +1 -1
  158. package/dist/types/src/plugin-runtime/meta.d.ts.map +1 -1
  159. package/dist/types/src/testing/harness.d.ts +67 -0
  160. package/dist/types/src/testing/harness.d.ts.map +1 -0
  161. package/dist/types/src/testing/index.d.ts +1 -0
  162. package/dist/types/src/testing/index.d.ts.map +1 -1
  163. package/dist/types/src/testing/react.d.ts +27 -0
  164. package/dist/types/src/testing/react.d.ts.map +1 -0
  165. package/dist/types/src/testing/react.test.d.ts +2 -0
  166. package/dist/types/src/testing/react.test.d.ts.map +1 -0
  167. package/dist/types/src/testing/service.d.ts.map +1 -1
  168. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  169. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
  170. package/dist/types/src/ui/components/{App.d.ts → App/App.d.ts} +3 -2
  171. package/dist/types/src/ui/components/App/App.d.ts.map +1 -0
  172. package/dist/types/src/ui/components/{App.stories.d.ts → App/App.stories.d.ts} +6 -1
  173. package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -0
  174. package/dist/types/src/ui/components/App/index.d.ts +2 -0
  175. package/dist/types/src/ui/components/App/index.d.ts.map +1 -0
  176. package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts +64 -0
  177. package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts.map +1 -0
  178. package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts +19 -0
  179. package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts.map +1 -0
  180. package/dist/types/src/ui/components/Placeholder/index.d.ts +2 -0
  181. package/dist/types/src/ui/components/Placeholder/index.d.ts.map +1 -0
  182. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -0
  183. package/dist/types/src/ui/components/{PluginManagerProvider.d.ts → PluginManager/PluginManagerProvider.d.ts} +1 -1
  184. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts.map +1 -0
  185. package/dist/types/src/ui/components/PluginManager/index.d.ts +2 -0
  186. package/dist/types/src/ui/components/PluginManager/index.d.ts.map +1 -0
  187. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +24 -0
  188. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -0
  189. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -0
  190. package/dist/types/src/ui/components/{surface → Surface}/SurfaceInfo.d.ts.map +1 -1
  191. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts +48 -0
  192. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts.map +1 -0
  193. package/dist/types/src/ui/components/{surface → Surface}/context.d.ts.map +1 -1
  194. package/dist/types/src/ui/components/Surface/index.d.ts +36 -0
  195. package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -0
  196. package/dist/types/src/ui/components/Surface/types.d.ts +197 -0
  197. package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -0
  198. package/dist/types/src/ui/components/Surface/types.test.d.ts +2 -0
  199. package/dist/types/src/ui/components/Surface/types.test.d.ts.map +1 -0
  200. package/dist/types/src/ui/components/index.d.ts +3 -3
  201. package/dist/types/src/ui/components/index.d.ts.map +1 -1
  202. package/dist/types/src/ui/hooks/index.d.ts +0 -1
  203. package/dist/types/src/ui/hooks/index.d.ts.map +1 -1
  204. package/dist/types/src/ui/hooks/useApp.d.ts +47 -8
  205. package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -1
  206. package/dist/types/src/ui/hooks/useApp.test.d.ts +2 -0
  207. package/dist/types/src/ui/hooks/useApp.test.d.ts.map +1 -0
  208. package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -1
  209. package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -1
  210. package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -1
  211. package/dist/types/src/ui/hooks/useSurface.d.ts +2 -2
  212. package/dist/types/src/ui/hooks/useSurface.d.ts.map +1 -1
  213. package/dist/types/src/ui/index.d.ts +0 -1
  214. package/dist/types/src/ui/index.d.ts.map +1 -1
  215. package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts +34 -0
  216. package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts.map +1 -0
  217. package/dist/types/src/vite-plugin/boot-loader/index.d.ts +2 -0
  218. package/dist/types/src/vite-plugin/boot-loader/index.d.ts.map +1 -0
  219. package/dist/types/src/vite-plugin/boot-loader/loader.d.ts +51 -0
  220. package/dist/types/src/vite-plugin/boot-loader/loader.d.ts.map +1 -0
  221. package/dist/types/src/vite-plugin/composer/index.d.ts +34 -0
  222. package/dist/types/src/vite-plugin/composer/index.d.ts.map +1 -0
  223. package/dist/types/src/vite-plugin/import-map/index.d.ts +28 -0
  224. package/dist/types/src/vite-plugin/import-map/index.d.ts.map +1 -0
  225. package/dist/types/src/vite-plugin/index.d.ts +5 -0
  226. package/dist/types/src/vite-plugin/index.d.ts.map +1 -0
  227. package/dist/types/src/vite-plugin/manifest.d.ts +41 -0
  228. package/dist/types/src/vite-plugin/manifest.d.ts.map +1 -0
  229. package/dist/types/src/vite-plugin/manifest.test.d.ts +2 -0
  230. package/dist/types/src/vite-plugin/manifest.test.d.ts.map +1 -0
  231. package/dist/types/src/vite-plugin/packages.d.ts +13 -0
  232. package/dist/types/src/vite-plugin/packages.d.ts.map +1 -0
  233. package/dist/types/tsconfig.tsbuildinfo +1 -1
  234. package/moon.yml +16 -4
  235. package/package.json +58 -62
  236. package/src/cli/cli.ts +3 -3
  237. package/src/common/activation-events.ts +6 -6
  238. package/src/common/annotations.ts +3 -0
  239. package/src/common/capabilities.ts +18 -23
  240. package/src/common/operations.ts +7 -10
  241. package/src/context.ts +1 -1
  242. package/src/core/activation-event.ts +5 -2
  243. package/src/core/capability-manager.test.ts +1 -1
  244. package/src/core/capability-manager.ts +22 -1
  245. package/src/core/capability.ts +21 -10
  246. package/src/core/edge-registry-plugin-provider.ts +92 -0
  247. package/src/core/index.ts +6 -0
  248. package/src/core/plugin-asset-cache.ts +60 -0
  249. package/src/core/plugin-manager.test.ts +855 -29
  250. package/src/core/plugin-manager.ts +818 -179
  251. package/src/core/plugin-manifest.test.ts +75 -0
  252. package/src/core/plugin-manifest.ts +134 -0
  253. package/src/core/plugin.ts +145 -12
  254. package/src/core/registry.ts +157 -0
  255. package/src/core/url-loader.test.ts +221 -0
  256. package/src/core/url-loader.ts +388 -0
  257. package/src/plugin-operation/OperationPlugin.ts +2 -3
  258. package/src/plugin-operation/history/capability.ts +1 -2
  259. package/src/plugin-operation/history/errors.ts +2 -6
  260. package/src/plugin-operation/history/history-tracker.test.ts +37 -43
  261. package/src/plugin-operation/history/history-tracker.ts +1 -2
  262. package/src/plugin-operation/history/types.ts +1 -1
  263. package/src/plugin-operation/history/undo-mapping.ts +1 -1
  264. package/src/plugin-operation/history/undo-registry.test.ts +3 -4
  265. package/src/plugin-operation/history/undo-registry.ts +1 -1
  266. package/src/plugin-operation/invoker-capability.ts +19 -4
  267. package/src/plugin-operation/meta.ts +2 -1
  268. package/src/plugin-operation/testing.ts +26 -45
  269. package/src/plugin-runtime/RuntimePlugin.ts +2 -3
  270. package/src/plugin-runtime/meta.ts +2 -1
  271. package/src/testing/harness.ts +229 -0
  272. package/src/testing/index.ts +1 -0
  273. package/src/testing/react.test.tsx +48 -0
  274. package/src/testing/react.tsx +113 -0
  275. package/src/testing/service.ts +3 -3
  276. package/src/testing/withPluginManager.stories.tsx +1 -2
  277. package/src/testing/withPluginManager.tsx +40 -15
  278. package/src/ui/components/App/App.stories.tsx +88 -0
  279. package/src/ui/components/App/App.tsx +81 -0
  280. package/src/ui/components/App/index.ts +5 -0
  281. package/src/ui/components/Placeholder/Placeholder.stories.tsx +77 -0
  282. package/src/ui/components/Placeholder/Placeholder.tsx +155 -0
  283. package/src/ui/components/Placeholder/index.ts +5 -0
  284. package/src/ui/components/{PluginManagerContext.stories.tsx → PluginManager/PluginManagerContext.stories.tsx} +15 -13
  285. package/src/ui/components/{PluginManagerProvider.ts → PluginManager/PluginManagerProvider.ts} +1 -1
  286. package/src/ui/components/PluginManager/index.ts +5 -0
  287. package/src/ui/components/{surface → Surface}/SurfaceComponent.stories.tsx +25 -23
  288. package/src/ui/components/Surface/SurfaceComponent.tsx +303 -0
  289. package/src/ui/components/{surface → Surface}/SurfaceInfo.tsx +1 -2
  290. package/src/ui/components/Surface/SurfaceProfilerContext.tsx +207 -0
  291. package/src/ui/components/Surface/index.ts +54 -0
  292. package/src/ui/components/Surface/types.test.ts +126 -0
  293. package/src/ui/components/Surface/types.ts +269 -0
  294. package/src/ui/components/index.ts +3 -3
  295. package/src/ui/hooks/index.ts +0 -1
  296. package/src/ui/hooks/useApp.test.tsx +159 -0
  297. package/src/ui/hooks/useApp.tsx +233 -24
  298. package/src/ui/hooks/useCapabilities.ts +1 -1
  299. package/src/ui/hooks/useLoading.tsx +14 -6
  300. package/src/ui/hooks/useSurface.ts +3 -3
  301. package/src/ui/index.ts +0 -1
  302. package/src/vite-plugin/boot-loader/BootLoader.stories.tsx +270 -0
  303. package/src/vite-plugin/boot-loader/boot-loader.css +320 -0
  304. package/src/vite-plugin/boot-loader/boot-loader.js +325 -0
  305. package/src/vite-plugin/boot-loader/index.ts +5 -0
  306. package/src/vite-plugin/boot-loader/loader.ts +123 -0
  307. package/src/vite-plugin/composer/index.ts +306 -0
  308. package/src/vite-plugin/import-map/index.ts +527 -0
  309. package/src/vite-plugin/index.ts +10 -0
  310. package/src/vite-plugin/manifest.test.ts +46 -0
  311. package/src/vite-plugin/manifest.ts +57 -0
  312. package/src/vite-plugin/packages.ts +187 -0
  313. package/tsconfig.json +22 -1
  314. package/tsconfig.node.json +2 -4
  315. package/typedoc.json +2 -4
  316. package/vitest.config.ts +1 -1
  317. package/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
  318. package/dist/lib/browser/capability-DU35RXMD.mjs.map +0 -7
  319. package/dist/lib/browser/chunk-EIFGKQSA.mjs.map +0 -7
  320. package/dist/lib/browser/chunk-FHQTHCX7.mjs +0 -8
  321. package/dist/lib/browser/chunk-IGRQWMWW.mjs.map +0 -7
  322. package/dist/lib/browser/chunk-KWP6PKIU.mjs.map +0 -7
  323. package/dist/lib/browser/chunk-NPUEVX42.mjs +0 -34
  324. package/dist/lib/browser/chunk-NPUEVX42.mjs.map +0 -7
  325. package/dist/lib/browser/chunk-PKQT6C53.mjs.map +0 -7
  326. package/dist/lib/browser/chunk-WGWEEBUV.mjs +0 -807
  327. package/dist/lib/browser/chunk-WGWEEBUV.mjs.map +0 -7
  328. package/dist/lib/browser/chunk-YAFEA4GV.mjs +0 -1
  329. package/dist/lib/browser/chunk-YZQ6NFG4.mjs +0 -781
  330. package/dist/lib/browser/chunk-YZQ6NFG4.mjs.map +0 -7
  331. package/dist/lib/browser/chunk-ZQO3UZ4R.mjs.map +0 -7
  332. package/dist/lib/browser/invoker-capability-7QW56NOM.mjs.map +0 -7
  333. package/dist/lib/node-esm/capability-SR2EIZFP.mjs.map +0 -7
  334. package/dist/lib/node-esm/chunk-64IMLAS2.mjs.map +0 -7
  335. package/dist/lib/node-esm/chunk-7OWSHPYK.mjs.map +0 -7
  336. package/dist/lib/node-esm/chunk-DHSHRYIB.mjs.map +0 -7
  337. package/dist/lib/node-esm/chunk-DZ2XLAGI.mjs.map +0 -7
  338. package/dist/lib/node-esm/chunk-JAZVHID3.mjs +0 -35
  339. package/dist/lib/node-esm/chunk-JAZVHID3.mjs.map +0 -7
  340. package/dist/lib/node-esm/chunk-OQYHRZYF.mjs.map +0 -7
  341. package/dist/lib/node-esm/chunk-VV4YHPQQ.mjs +0 -782
  342. package/dist/lib/node-esm/chunk-VV4YHPQQ.mjs.map +0 -7
  343. package/dist/lib/node-esm/chunk-XHAKT6UD.mjs +0 -808
  344. package/dist/lib/node-esm/chunk-XHAKT6UD.mjs.map +0 -7
  345. package/dist/lib/node-esm/chunk-Z4TJPSMP.mjs +0 -2
  346. package/dist/lib/node-esm/invoker-capability-CK4AMF2R.mjs.map +0 -7
  347. package/dist/types/src/ui/components/App.d.ts.map +0 -1
  348. package/dist/types/src/ui/components/App.stories.d.ts.map +0 -1
  349. package/dist/types/src/ui/components/DefaultFallback.d.ts +0 -8
  350. package/dist/types/src/ui/components/DefaultFallback.d.ts.map +0 -1
  351. package/dist/types/src/ui/components/ErrorBoundary.d.ts +0 -30
  352. package/dist/types/src/ui/components/ErrorBoundary.d.ts.map +0 -1
  353. package/dist/types/src/ui/components/PluginManagerContext.stories.d.ts.map +0 -1
  354. package/dist/types/src/ui/components/PluginManagerProvider.d.ts.map +0 -1
  355. package/dist/types/src/ui/components/surface/SurfaceComponent.d.ts +0 -12
  356. package/dist/types/src/ui/components/surface/SurfaceComponent.d.ts.map +0 -1
  357. package/dist/types/src/ui/components/surface/SurfaceComponent.stories.d.ts.map +0 -1
  358. package/dist/types/src/ui/components/surface/index.d.ts +0 -5
  359. package/dist/types/src/ui/components/surface/index.d.ts.map +0 -1
  360. package/dist/types/src/ui/components/surface/types.d.ts +0 -94
  361. package/dist/types/src/ui/components/surface/types.d.ts.map +0 -1
  362. package/dist/types/src/ui/hooks/useOperationResolver.d.ts +0 -19
  363. package/dist/types/src/ui/hooks/useOperationResolver.d.ts.map +0 -1
  364. package/src/ui/components/App.stories.tsx +0 -62
  365. package/src/ui/components/App.tsx +0 -57
  366. package/src/ui/components/DefaultFallback.tsx +0 -26
  367. package/src/ui/components/ErrorBoundary.tsx +0 -56
  368. package/src/ui/components/surface/SurfaceComponent.tsx +0 -262
  369. package/src/ui/components/surface/index.ts +0 -8
  370. package/src/ui/components/surface/types.ts +0 -119
  371. package/src/ui/hooks/useOperationResolver.ts +0 -40
  372. /package/dist/lib/{node-esm/capability-OSVYGK4X.mjs.map → browser/capability-LUKGKUQH.mjs.map} +0 -0
  373. /package/dist/lib/browser/{chunk-YAFEA4GV.mjs.map → core/url-loader.mjs.map} +0 -0
  374. /package/dist/lib/node-esm/{chunk-Z4TJPSMP.mjs.map → core/url-loader.mjs.map} +0 -0
  375. /package/dist/types/src/ui/components/{PluginManagerContext.stories.d.ts → PluginManager/PluginManagerContext.stories.d.ts} +0 -0
  376. /package/dist/types/src/ui/components/{surface → Surface}/SurfaceComponent.stories.d.ts +0 -0
  377. /package/dist/types/src/ui/components/{surface → Surface}/SurfaceInfo.d.ts +0 -0
  378. /package/dist/types/src/ui/components/{surface → Surface}/context.d.ts +0 -0
  379. /package/src/ui/components/{surface → Surface}/context.ts +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/context.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext } from '@dxos/web-context';\n\nimport { type PluginManager } from './core';\n\nexport const PluginManagerContext = createContext<PluginManager.PluginManager>('dxos.org/app-framework/plugin-manager');\n"],
5
- "mappings": ";AAIA,SAASA,qBAAqB;AAIvB,IAAMC,uBAAuBC,cAA2C,uCAAA;",
6
- "names": ["createContext", "PluginManagerContext", "createContext"]
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext } from '@dxos/web-context';\n\nimport { type PluginManager } from './core';\n\nexport const PluginManagerContext = createContext<PluginManager.PluginManager>('org.dxos.app-framework.plugin-manager');\n"],
5
+ "mappings": ";AAIA,SAASA,qBAAqB;AAIvB,IAAMC,uBAAuBD,cAA2C,uCAAA;",
6
+ "names": ["createContext", "PluginManagerContext"]
7
7
  }
@@ -0,0 +1,68 @@
1
+ // src/core/edge-registry-plugin-provider.ts
2
+ import * as Effect from "effect/Effect";
3
+ import { Context } from "@dxos/context";
4
+ var __dxlog_file = "/__w/dxos/dxos/packages/sdk/app-framework/src/core/edge-registry-plugin-provider.ts";
5
+ var toRegistryPlugin = (entry) => ({
6
+ id: entry.meta.id,
7
+ name: entry.meta.name,
8
+ description: entry.meta.description,
9
+ homePage: entry.meta.homePage,
10
+ source: entry.meta.source,
11
+ screenshots: entry.meta.screenshots ? [
12
+ ...entry.meta.screenshots
13
+ ] : void 0,
14
+ tags: entry.meta.tags ? [
15
+ ...entry.meta.tags
16
+ ] : void 0,
17
+ icon: entry.meta.icon,
18
+ iconHue: entry.meta.iconHue,
19
+ moduleUrl: entry.moduleUrl,
20
+ repo: entry.repo,
21
+ version: entry.releaseTag
22
+ });
23
+ var EdgeRegistryPluginProvider = class {
24
+ _client;
25
+ // Cached on first load so getPlugin/listVersions can resolve without re-fetching.
26
+ #cachedPlugins = [];
27
+ constructor(_client) {
28
+ this._client = _client;
29
+ }
30
+ listPlugins() {
31
+ return Effect.tryPromise({
32
+ try: () => this._client.getRegistryPlugins(Context.default(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 56 })),
33
+ catch: (error) => error instanceof Error ? error : new Error(String(error))
34
+ }).pipe(Effect.map((body) => {
35
+ const plugins = body.plugins.filter((entry) => entry.health === "ok").map(toRegistryPlugin);
36
+ this.#cachedPlugins = plugins;
37
+ return plugins;
38
+ }));
39
+ }
40
+ listVersions(repo) {
41
+ const plugin = this.#cachedPlugins.find((candidate) => candidate.repo === repo);
42
+ if (!plugin) {
43
+ return Effect.fail(new Error(`Plugin not found in catalog: ${repo}`));
44
+ }
45
+ const version = {
46
+ tag: plugin.version,
47
+ moduleUrl: plugin.moduleUrl
48
+ };
49
+ return Effect.succeed([
50
+ version
51
+ ]);
52
+ }
53
+ getPlugin(repo, version) {
54
+ const plugin = this.#cachedPlugins.find((p) => p.repo === repo);
55
+ if (!plugin) {
56
+ return Effect.fail(new Error(`Plugin not found in catalog: ${repo}`));
57
+ }
58
+ if (version && version !== plugin.version) {
59
+ return Effect.fail(new Error(`Version ${version} not available for ${repo}; only ${plugin.version} is cached`));
60
+ }
61
+ return Effect.succeed(plugin);
62
+ }
63
+ };
64
+
65
+ export {
66
+ EdgeRegistryPluginProvider
67
+ };
68
+ //# sourceMappingURL=chunk-FO3IYSLV.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/core/edge-registry-plugin-provider.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Context } from '@dxos/context';\nimport { type EdgeHttpClient } from '@dxos/edge-client';\nimport { type PluginEntry } from '@dxos/protocols';\n\nimport * as Registry from './registry';\n\n/**\n * Maps a wire-format `PluginEntry` (from `@dxos/protocols`) to a\n * `Registry.Plugin` (the app-framework domain type).\n *\n * This is the only translation seam between the two independently-defined type\n * hierarchies — fields are mapped explicitly, with no shared type between them.\n */\nconst toRegistryPlugin = (entry: PluginEntry): Registry.Plugin => ({\n id: entry.meta.id,\n name: entry.meta.name,\n description: entry.meta.description,\n homePage: entry.meta.homePage,\n source: entry.meta.source,\n screenshots: entry.meta.screenshots ? [...entry.meta.screenshots] : undefined,\n tags: entry.meta.tags ? [...entry.meta.tags] : undefined,\n icon: entry.meta.icon,\n iconHue: entry.meta.iconHue,\n moduleUrl: entry.moduleUrl,\n repo: entry.repo,\n version: entry.releaseTag,\n});\n\n/**\n * Implements `Registry.PluginProvider` against the Edge `/registry` HTTP endpoints.\n *\n * Lives in app-framework (rather than the more obvious home of `@dxos/edge-client`)\n * because edge-client doesn't depend on app-framework; siting the implementation\n * here keeps the dependency arrow `app-framework → edge-client` and avoids a\n * cycle. The class needs only the public `EdgeHttpClient` type, so a one-way\n * type-import is enough.\n *\n * `listVersions` is currently a stub: it returns the single latest version derived\n * from the cached plugin list, so the host's version picker has something to render.\n * The wire contract for the real endpoint already exists — see\n * `GetPluginVersionsResponseBodySchema` in `@dxos/protocols/edge/registry` and\n * {@link EdgeHttpClient.getRegistryPluginVersions} — so once Edge ships\n * `GET /registry/plugins/:repo/versions`, swap this stub for a call to\n * `this._client.getRegistryPluginVersions(...)` and map each entry through a\n * `toRegistryPluginVersion` helper (mirror of {@link toRegistryPlugin}).\n */\nexport class EdgeRegistryPluginProvider implements Registry.PluginProvider {\n // Cached on first load so getPlugin/listVersions can resolve without re-fetching.\n #cachedPlugins: readonly Registry.Plugin[] = [];\n\n constructor(private readonly _client: EdgeHttpClient) {}\n\n listPlugins(): Effect.Effect<readonly Registry.Plugin[], Error> {\n return Effect.tryPromise({\n try: () => this._client.getRegistryPlugins(Context.default()),\n catch: (error) => (error instanceof Error ? error : new Error(String(error))),\n }).pipe(\n Effect.map((body) => {\n const plugins = body.plugins.filter((entry) => entry.health === 'ok').map(toRegistryPlugin);\n this.#cachedPlugins = plugins;\n return plugins;\n }),\n );\n }\n\n listVersions(repo: string): Effect.Effect<readonly Registry.PluginVersion[], Error> {\n // Stub: return only the currently-known version until Edge implements the versions endpoint.\n const plugin = this.#cachedPlugins.find((candidate) => candidate.repo === repo);\n if (!plugin) {\n return Effect.fail(new Error(`Plugin not found in catalog: ${repo}`));\n }\n const version: Registry.PluginVersion = { tag: plugin.version, moduleUrl: plugin.moduleUrl };\n return Effect.succeed([version]);\n }\n\n getPlugin(repo: string, version?: string): Effect.Effect<Registry.Plugin, Error> {\n const plugin = this.#cachedPlugins.find((p) => p.repo === repo);\n if (!plugin) {\n return Effect.fail(new Error(`Plugin not found in catalog: ${repo}`));\n }\n if (version && version !== plugin.version) {\n return Effect.fail(new Error(`Version ${version} not available for ${repo}; only ${plugin.version} is cached`));\n }\n return Effect.succeed(plugin);\n }\n}\n"],
5
+ "mappings": ";AAIA,YAAYA,YAAY;AAExB,SAASC,eAAe;AAMxB,IAAA,eAAA;IASEC,mBAAqB,CAAA,WAAA;EACrBC,IAAAA,MAAAA,KAAaC;EACbC,MAAAA,MAAUD,KAAME;EAChBC,aAAQH,MAAWG,KAAAA;EACnBC,UAAAA,MAAaJ,KAAME;UAAuBF,MAAME,KAAKE;eAAeC,MAAAA,KAAAA,cAAAA;IACpEC,GAAMN,MAAME,KAAKI;;QAA8BD,MAAAA,KAAAA,OAAAA;IAC/CE,GAAMP,MAAME,KAAKK;EACjBC,IAAAA;EACAC,MAAAA,MAAWT,KAAMS;EACjBC,SAAMV,MAAMU,KAAI;EAChBC,WAASX,MAAMY;EACjB,MAAA,MAAA;EAEA,SAAA,MAAA;;AAmBE,IAAA,6BAAA,MAAA;EACA;;mBAE6BC,CAAAA;EAA0B,YAAA,SAAA;AAEvDC,SAAAA,UAAgE;;gBAEvD;WACGC,kBAAWA;MAClBC,KACDpB,MAAAA,KAAU,QAAEqB,mBAAAA,QAAAA,QAAAA,QAAAA,EAAAA,YAAAA,YAAAA,GAAAA,cAAAA,GAAAA,GAAAA,CAAAA,CAAAA;MACV,OAAMC,CAAAA,UAAUD,iBAAaE,QAAQnB,QAAUA,IAAMoB,MAAM,OAAK,KAAS,CAACC;YACrE,WAAA,CAAA,SAAiBH;AACtB,YAAA,UAAOA,KAAAA,QAAAA,OAAAA,CAAAA,UAAAA,MAAAA,WAAAA,IAAAA,EAAAA,IAAAA,gBAAAA;AACT,WAAA,iBAAA;AAEJ,aAAA;IAEAI,CAAAA,CAAAA;;eAEQC,MAAS;UAEb,SAAO3B,KAAO4B,eAAgB,KAAA,CAAA,cAAA,UAA6B,SAAQ,IAAA;AACrE,QAAA,CAAA,QAAA;AACA,aAAwC,YAAA,IAAA,MAAA,gCAAA,IAAA,EAAA,CAAA;;UAAuBf,UAAWc;MAAiB,KAAA,OAAA;MAC3F,WAAcE,OAAQ;;WAAS,eAAA;MACjC;IAEAC,CAAAA;;YAEOH,MAAAA,SAAQ;UACX,SAAO3B,KAAO4B,eAAgB,KAAA,CAAA,MAAA,EAAA,SAAA,IAAA;AAChC,QAAA,CAAA,QAAA;AACIb,aAAWA,YAAAA,IAAYY,MAAAA,gCAAgB,IAAA,EAAA,CAAA;;AAE3C,QAAA,WAAA,YAAA,OAAA,SAAA;AACA,aAAcE,YAAQF,IAAAA,MAAAA,WAAAA,OAAAA,sBAAAA,IAAAA,UAAAA,OAAAA,OAAAA,YAAAA,CAAAA;IACxB;AACF,WAAA,eAAA,MAAA;;;",
6
+ "names": ["Effect", "Context", "name", "description", "entry", "homePage", "meta", "source", "screenshots", "undefined", "tags", "icon", "iconHue", "moduleUrl", "repo", "version", "releaseTag", "_client", "listPlugins", "error", "pipe", "body", "plugins", "filter", "health", "toRegistryPlugin", "listVersions", "plugin", "fail", "succeed", "getPlugin"]
7
+ }
@@ -0,0 +1,469 @@
1
+ import {
2
+ PluginManagerProvider,
3
+ topologicalSort,
4
+ usePluginManager
5
+ } from "./chunk-7VZJR2OA.mjs";
6
+ import {
7
+ PluginManagerContext
8
+ } from "./chunk-FJ4765WW.mjs";
9
+ import {
10
+ capabilities_exports
11
+ } from "./chunk-WBHCSOBW.mjs";
12
+ import {
13
+ activation_events_exports
14
+ } from "./chunk-45CHLTBV.mjs";
15
+ import {
16
+ plugin_manager_exports
17
+ } from "./chunk-NBXPP7JR.mjs";
18
+
19
+ // src/ui/components/App/App.tsx
20
+ import React2, { useEffect as useEffect3 } from "react";
21
+
22
+ // src/ui/hooks/useApp.tsx
23
+ import { RegistryContext } from "@effect-atom/atom-react";
24
+ import * as Effect from "effect/Effect";
25
+ import * as Fiber from "effect/Fiber";
26
+ import * as PubSub from "effect/PubSub";
27
+ import * as Queue from "effect/Queue";
28
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
29
+ import { runAndForwardErrors } from "@dxos/effect";
30
+ import { invariant } from "@dxos/invariant";
31
+ import { log } from "@dxos/log";
32
+ import { ErrorBoundary, ErrorFallback } from "@dxos/react-error-boundary";
33
+ import { useAsyncEffect, useDefaultValue } from "@dxos/react-hooks";
34
+ import { ContextProtocolProvider } from "@dxos/web-context-react";
35
+ var __dxlog_file = "/__w/dxos/dxos/packages/sdk/app-framework/src/ui/hooks/useApp.tsx";
36
+ var ENABLED_KEY = "org.dxos.app-framework.enabled";
37
+ var useApp = ({ pluginManager, pluginLoader: pluginLoaderProp, onPluginRemove, pluginRegistryProvider, plugins: pluginsProp, core: coreProp, defaults: defaultsProp, setupEvents: setupEventsProp, placeholder, fallback = ErrorFallback, cacheEnabled = false, safeMode = false, debounce = 0, timeout = 3e4 }) => {
38
+ const plugins = useDefaultValue(pluginsProp, () => []);
39
+ const core = useDefaultValue(coreProp, () => plugins.map(({ meta }) => meta.id));
40
+ const defaults = useDefaultValue(defaultsProp, () => []);
41
+ const setupEvents = useDefaultValue(setupEventsProp, () => []);
42
+ const pluginLoader = useMemo(() => pluginLoaderProp ?? ((id) => Effect.sync(() => {
43
+ const plugin = plugins.find((plugin2) => plugin2.meta.id === id);
44
+ invariant(plugin, `Plugin not found: ${id}`, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 52, S: void 0, A: ["plugin", "`Plugin not found: ${id}`"] });
45
+ return {
46
+ plugin
47
+ };
48
+ })), [
49
+ pluginLoaderProp,
50
+ plugins
51
+ ]);
52
+ const readyRef = useRef(false);
53
+ const [ready, setReady] = useState(false);
54
+ const errorRef = useRef(null);
55
+ const [error, setError] = useState(null);
56
+ const [startupProgress, setStartupProgress] = useState({
57
+ activated: 0,
58
+ total: 0,
59
+ progress: 0
60
+ });
61
+ const cached = useMemo(() => JSON.parse(localStorage.getItem(ENABLED_KEY) ?? "[]"), []);
62
+ const enabled = useMemo(() => safeMode ? [] : cacheEnabled && cached.length > 0 ? cached : defaults, [
63
+ safeMode,
64
+ cacheEnabled,
65
+ cached,
66
+ defaults
67
+ ]);
68
+ const isExternalManager = !!pluginManager;
69
+ const manager = useMemo(() => {
70
+ const mgr = pluginManager ?? plugin_manager_exports.make({
71
+ pluginLoader,
72
+ plugins,
73
+ core,
74
+ enabled,
75
+ onRemove: onPluginRemove,
76
+ pluginRegistryProvider
77
+ });
78
+ log("useApp: useMemo created/reused manager", {
79
+ provided: !!pluginManager
80
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 87, S: void 0 });
81
+ return mgr;
82
+ }, [
83
+ pluginManager,
84
+ pluginLoader,
85
+ plugins,
86
+ core,
87
+ enabled,
88
+ onPluginRemove,
89
+ pluginRegistryProvider
90
+ ]);
91
+ useEffect(() => {
92
+ if (!cacheEnabled) {
93
+ return;
94
+ }
95
+ return manager.registry.subscribe(manager.enabled, (value) => {
96
+ localStorage.setItem(ENABLED_KEY, JSON.stringify(value));
97
+ });
98
+ }, [
99
+ cacheEnabled,
100
+ manager
101
+ ]);
102
+ useEffect(() => {
103
+ setupDevtools(manager);
104
+ }, [
105
+ manager
106
+ ]);
107
+ useAsyncEffect(async () => {
108
+ log("useApp: effect mount", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 117, S: void 0 });
109
+ manager.capabilities.contribute({
110
+ interface: capabilities_exports.PluginManager,
111
+ implementation: manager,
112
+ module: "org.dxos.app-framework.plugin-manager"
113
+ });
114
+ manager.capabilities.contribute({
115
+ interface: capabilities_exports.AtomRegistry,
116
+ implementation: manager.registry,
117
+ module: "org.dxos.app-framework.atom-registry"
118
+ });
119
+ const fiber = Effect.gen(function* () {
120
+ const queue = yield* PubSub.subscribe(manager.activation);
121
+ const listener = yield* Effect.forkDaemon(Queue.take(queue).pipe(Effect.tap(({ event, state, module, error: error$ }) => Effect.sync(() => {
122
+ if (event === activation_events_exports.Startup.id && state === "activated" && !module) {
123
+ clearTimeout(timeoutId);
124
+ setReady(true);
125
+ readyRef.current = true;
126
+ globalThis.composer?.profiler?.dump();
127
+ if (typeof window !== "undefined") {
128
+ window.dispatchEvent(new CustomEvent("app-framework:startup-activated"));
129
+ }
130
+ return;
131
+ }
132
+ if (module && state === "activating" && !readyRef.current) {
133
+ setStartupProgress((current) => ({
134
+ ...current,
135
+ // `event` here is the activation event that first
136
+ // triggered this module load (plumbed through
137
+ // `_loadCapabilitiesForModules` → `_loadModule`).
138
+ // Falsy/empty falls back to undefined so consumers can
139
+ // tell "no parent context" from "parent context: <X>".
140
+ event: event || void 0,
141
+ module,
142
+ humanizedName: humanizeModuleId(module)
143
+ }));
144
+ }
145
+ if (module && state === "activated" && !readyRef.current) {
146
+ const active = manager.getActive();
147
+ const total = manager.getModules().length;
148
+ setStartupProgress((current) => ({
149
+ ...current,
150
+ activated: active.length,
151
+ total,
152
+ progress: total > 0 ? active.length / total : 0
153
+ }));
154
+ }
155
+ if (event && !module && state === "activating" && !readyRef.current) {
156
+ setStartupProgress((current) => ({
157
+ ...current,
158
+ event,
159
+ module: void 0,
160
+ humanizedName: humanizeEventKey(event)
161
+ }));
162
+ }
163
+ if (error$ && !readyRef.current) {
164
+ setError(error$);
165
+ errorRef.current = error$;
166
+ }
167
+ })), Effect.forever));
168
+ yield* Effect.all([
169
+ ...setupEvents.map((event) => manager.activate(event)),
170
+ manager.activate(activation_events_exports.SetupReactSurface),
171
+ manager.activate(activation_events_exports.Startup)
172
+ ]);
173
+ return yield* Fiber.join(listener);
174
+ }).pipe(Effect.scoped, Effect.runFork);
175
+ const timeoutId = setTimeout(() => {
176
+ if (!readyRef.current && !errorRef.current) {
177
+ log.warn("startup timeout diagnostic", {
178
+ eventsFired: manager.getEventsFired(),
179
+ activeModules: manager.getActive(),
180
+ pendingReset: manager.getPendingReset()
181
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 224, S: void 0 });
182
+ void runAndForwardErrors(Fiber.interrupt(fiber));
183
+ setError(new Error(`Startup timed out after ${timeout}ms`));
184
+ }
185
+ }, timeout);
186
+ return () => {
187
+ log("useApp: effect cleanup", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 234, S: void 0 });
188
+ clearTimeout(timeoutId);
189
+ void runAndForwardErrors(Fiber.interrupt(fiber));
190
+ if (!isExternalManager) {
191
+ void runAndForwardErrors(manager.shutdown());
192
+ }
193
+ };
194
+ }, [
195
+ manager
196
+ ]);
197
+ const progressRef = useRef(startupProgress);
198
+ progressRef.current = startupProgress;
199
+ return useCallback(() => /* @__PURE__ */ React.createElement(ErrorBoundary, {
200
+ name: "app",
201
+ FallbackComponent: fallback
202
+ }, /* @__PURE__ */ React.createElement(PluginManagerProvider, {
203
+ value: manager
204
+ }, /* @__PURE__ */ React.createElement(ContextProtocolProvider, {
205
+ value: manager,
206
+ context: PluginManagerContext
207
+ }, /* @__PURE__ */ React.createElement(RegistryContext.Provider, {
208
+ value: manager.registry
209
+ }, /* @__PURE__ */ React.createElement(App, {
210
+ placeholder,
211
+ ready,
212
+ error,
213
+ debounce,
214
+ progress: progressRef.current
215
+ }))))), [
216
+ fallback,
217
+ manager,
218
+ placeholder,
219
+ ready,
220
+ error
221
+ ]);
222
+ };
223
+ var setupDevtools = (manager) => {
224
+ globalThis.composer ??= {};
225
+ globalThis.composer.manager = manager;
226
+ };
227
+ var humanizeModuleId = (moduleId) => {
228
+ const match = moduleId.match(/\.plugin\.([^.]+)\.module\.(.+)$/);
229
+ if (!match) {
230
+ const parts = moduleId.split(".");
231
+ return parts[parts.length - 1];
232
+ }
233
+ const [, pluginSlug, moduleName] = match;
234
+ const pluginLabel = pluginSlug.split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
235
+ const moduleLabel = moduleName.replace(/([a-z0-9])([A-Z])/g, "$1-$2").replace(/([A-Z]+)([A-Z][a-z])/g, "$1-$2").toLowerCase();
236
+ if (moduleLabel === pluginSlug) {
237
+ return pluginLabel;
238
+ }
239
+ return `${pluginLabel}: ${moduleLabel}`;
240
+ };
241
+ var humanizeEventKey = (eventKey) => {
242
+ const id = eventKey.split(":")[0];
243
+ const match = id.match(/\.event\.(.+)$/);
244
+ const slug = match ? match[1] : id.split(".").pop() ?? id;
245
+ return slug.split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
246
+ };
247
+
248
+ // src/ui/hooks/useCapabilities.ts
249
+ import { useAtomValue } from "@effect-atom/atom-react";
250
+ import { useCallback as useCallback2 } from "react";
251
+ import { invariant as invariant2 } from "@dxos/invariant";
252
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/sdk/app-framework/src/ui/hooks/useCapabilities.ts";
253
+ var useCapabilities = (interfaceDef) => {
254
+ const manager = usePluginManager();
255
+ return useAtomValue(manager.capabilities.atom(interfaceDef));
256
+ };
257
+ var useCapability = (interfaceDef) => {
258
+ const capabilities = useCapabilities(interfaceDef);
259
+ invariant2(capabilities.length > 0, `No capability found for ${interfaceDef.identifier}`, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 22, S: void 0, A: ["capabilities.length > 0", "`No capability found for ${interfaceDef.identifier}`"] });
260
+ return capabilities[0];
261
+ };
262
+ var useAtomCapability = (atomCapability) => {
263
+ const atom = useCapability(atomCapability);
264
+ return useAtomValue(atom);
265
+ };
266
+ var useAtomCapabilityState = (atomCapability) => {
267
+ const registry = useCapability(capabilities_exports.AtomRegistry);
268
+ const atom = useCapability(atomCapability);
269
+ const value = useAtomValue(atom);
270
+ const update = useCallback2((fn) => {
271
+ registry.set(atom, fn(registry.get(atom)));
272
+ }, [
273
+ registry,
274
+ atom
275
+ ]);
276
+ return [
277
+ value,
278
+ update
279
+ ];
280
+ };
281
+ var useOperationInvoker = () => useCapability(capabilities_exports.OperationInvoker);
282
+
283
+ // src/ui/hooks/useLoading.tsx
284
+ import { useEffect as useEffect2, useRef as useRef2, useState as useState2 } from "react";
285
+ var LoadingState = /* @__PURE__ */ (function(LoadingState2) {
286
+ LoadingState2[LoadingState2["Loading"] = 0] = "Loading";
287
+ LoadingState2[LoadingState2["FadeIn"] = 1] = "FadeIn";
288
+ LoadingState2[LoadingState2["FadeOut"] = 2] = "FadeOut";
289
+ LoadingState2[LoadingState2["Done"] = 3] = "Done";
290
+ return LoadingState2;
291
+ })({});
292
+ var useLoading = (ready, debounce = 0) => {
293
+ const [stage, setStage] = useState2(0);
294
+ const readyRef = useRef2(ready);
295
+ readyRef.current = ready;
296
+ useEffect2(() => {
297
+ if (!debounce) {
298
+ return;
299
+ }
300
+ const i = setInterval(() => {
301
+ setStage((stage2) => {
302
+ const isReady = readyRef.current;
303
+ switch (stage2) {
304
+ case 0: {
305
+ if (!isReady) {
306
+ return 1;
307
+ }
308
+ clearInterval(i);
309
+ return 3;
310
+ }
311
+ case 1: {
312
+ if (isReady) {
313
+ return 2;
314
+ }
315
+ break;
316
+ }
317
+ case 2: {
318
+ clearInterval(i);
319
+ return 3;
320
+ }
321
+ }
322
+ return stage2;
323
+ });
324
+ }, debounce);
325
+ return () => clearInterval(i);
326
+ }, [
327
+ debounce
328
+ ]);
329
+ if (!debounce) {
330
+ return ready ? 3 : 0;
331
+ }
332
+ return stage;
333
+ };
334
+
335
+ // src/ui/hooks/useSettingsState.ts
336
+ import { RegistryContext as RegistryContext2, useAtomValue as useAtomValue2 } from "@effect-atom/atom-react";
337
+ import { useCallback as useCallback3, useContext } from "react";
338
+ var useSettingsState = (atom) => {
339
+ const registry = useContext(RegistryContext2);
340
+ const settings = useAtomValue2(atom);
341
+ const updateSettings = useCallback3((fn) => {
342
+ registry.set(atom, fn(registry.get(atom)));
343
+ }, [
344
+ registry,
345
+ atom
346
+ ]);
347
+ return {
348
+ settings,
349
+ updateSettings
350
+ };
351
+ };
352
+
353
+ // src/ui/components/App/App.tsx
354
+ var FIRST_INTERACTIVE_MARK = "app-framework:first-interactive";
355
+ var App = ({ placeholder: Placeholder2, ready, error, debounce, progress }) => {
356
+ const reactContexts = useCapabilities(capabilities_exports.ReactContext);
357
+ const reactRoots = useCapabilities(capabilities_exports.ReactRoot);
358
+ const stage = useLoading(ready, debounce);
359
+ const placeholderDismissed = stage >= LoadingState.Done;
360
+ useEffect3(() => {
361
+ if (!placeholderDismissed) {
362
+ return;
363
+ }
364
+ if (performance.getEntriesByName(FIRST_INTERACTIVE_MARK).length === 0) {
365
+ performance.mark(FIRST_INTERACTIVE_MARK);
366
+ }
367
+ window.__bootLoader?.dismiss?.();
368
+ }, [
369
+ placeholderDismissed
370
+ ]);
371
+ if (error) {
372
+ throw error;
373
+ }
374
+ if (!placeholderDismissed) {
375
+ if (!Placeholder2) {
376
+ return null;
377
+ }
378
+ return /* @__PURE__ */ React2.createElement(Placeholder2, {
379
+ stage,
380
+ progress
381
+ });
382
+ }
383
+ const ComposedContext = composeContexts(reactContexts);
384
+ return /* @__PURE__ */ React2.createElement(ComposedContext, null, reactRoots.map(({ id, root: Component }) => /* @__PURE__ */ React2.createElement(Component, {
385
+ key: id
386
+ })));
387
+ };
388
+ var composeContexts = (contexts) => {
389
+ if (contexts.length === 0) {
390
+ return ({ children }) => /* @__PURE__ */ React2.createElement(React2.Fragment, null, children);
391
+ }
392
+ return topologicalSort(contexts).map(({ context }) => context).reduce((Acc, Next) => ({ children }) => /* @__PURE__ */ React2.createElement(Acc, null, /* @__PURE__ */ React2.createElement(Next, null, children)));
393
+ };
394
+
395
+ // src/ui/components/Placeholder/Placeholder.tsx
396
+ import React3, { useEffect as useEffect4, useLayoutEffect, useRef as useRef3 } from "react";
397
+ import { ThemeProvider } from "@dxos/react-ui";
398
+ import { defaultTx, mx } from "@dxos/ui-theme";
399
+ var Placeholder = ({ stage = 1, progress, logo }) => {
400
+ if (location.search === "?throw") {
401
+ throw new Error("Test error");
402
+ }
403
+ useEffect4(() => {
404
+ if (stage >= 2) {
405
+ return;
406
+ }
407
+ const fraction = progress?.progress ?? 0;
408
+ window.__bootLoader?.progress(0.5 + fraction * 0.5);
409
+ if (progress?.humanizedName) {
410
+ window.__bootLoader?.status({
411
+ event: progress.event,
412
+ module: progress.module,
413
+ humanized: `Activating ${progress.humanizedName}`
414
+ });
415
+ }
416
+ }, [
417
+ stage,
418
+ progress?.progress,
419
+ progress?.event,
420
+ progress?.module,
421
+ progress?.humanizedName
422
+ ]);
423
+ useLayoutEffect(() => {
424
+ if (stage >= 2) {
425
+ window.__bootLoader?.dismiss();
426
+ }
427
+ }, [
428
+ stage
429
+ ]);
430
+ const stageRef = useRef3(stage);
431
+ stageRef.current = stage;
432
+ useEffect4(() => {
433
+ return () => {
434
+ if (stageRef.current >= 3) {
435
+ window.__bootLoader?.dismiss();
436
+ }
437
+ };
438
+ }, []);
439
+ if (stage < 2) {
440
+ return null;
441
+ }
442
+ const logoClassName = mx("h-[300px] w-[300px] scale-600 transition-all duration-500 ease-in-out filter grayscale opacity-0", stage >= 1 && "scale-100 grayscale-0 opacity-70", stage >= 2 && "scale-50 opacity-0");
443
+ return /* @__PURE__ */ React3.createElement(ThemeProvider, {
444
+ tx: defaultTx
445
+ }, /* @__PURE__ */ React3.createElement("div", {
446
+ className: "relative dx-container h-dvh flex flex-col"
447
+ }, /* @__PURE__ */ React3.createElement("div", {
448
+ className: "flex flex-col grow justify-center items-center"
449
+ }, typeof logo === "function" ? logo({
450
+ className: logoClassName
451
+ }) : logo ? /* @__PURE__ */ React3.createElement("div", {
452
+ className: logoClassName
453
+ }, logo) : null)));
454
+ };
455
+
456
+ export {
457
+ useApp,
458
+ useCapabilities,
459
+ useCapability,
460
+ useAtomCapability,
461
+ useAtomCapabilityState,
462
+ useOperationInvoker,
463
+ LoadingState,
464
+ useLoading,
465
+ useSettingsState,
466
+ App,
467
+ Placeholder
468
+ };
469
+ //# sourceMappingURL=chunk-JD3Z5NEF.mjs.map