@dxos/app-framework 0.8.4-main.72ec0f3 → 0.8.4-main.74a063c4e0

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 (512) hide show
  1. package/.storybook/main.mts +2 -4
  2. package/.storybook/preview.mts +2 -2
  3. package/dist/lib/browser/capability-BBBBAPDI.mjs +38 -0
  4. package/dist/lib/browser/capability-BBBBAPDI.mjs.map +7 -0
  5. package/dist/lib/browser/capability-OP63CD5N.mjs +35 -0
  6. package/dist/lib/browser/capability-OP63CD5N.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-2CKCJ6PN.mjs +79 -0
  8. package/dist/lib/browser/chunk-2CKCJ6PN.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-F7FW2RK2.mjs +167 -0
  10. package/dist/lib/browser/chunk-F7FW2RK2.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-FU4GAFUQ.mjs +148 -0
  12. package/dist/lib/browser/chunk-FU4GAFUQ.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-GX4TUNM6.mjs +963 -0
  14. package/dist/lib/browser/chunk-GX4TUNM6.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-I34GF4NG.mjs +34 -0
  16. package/dist/lib/browser/chunk-I34GF4NG.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  18. package/dist/lib/browser/chunk-JKWMHZP6.mjs +80 -0
  19. package/dist/lib/browser/chunk-JKWMHZP6.mjs.map +7 -0
  20. package/dist/lib/browser/chunk-LVJW5EFU.mjs +157 -0
  21. package/dist/lib/browser/chunk-LVJW5EFU.mjs.map +7 -0
  22. package/dist/lib/browser/chunk-QSXYHXCE.mjs +48 -0
  23. package/dist/lib/browser/chunk-QSXYHXCE.mjs.map +7 -0
  24. package/dist/lib/browser/chunk-RFSO3JRG.mjs +1 -0
  25. package/dist/lib/browser/chunk-T3Y4AEKX.mjs +42 -0
  26. package/dist/lib/browser/chunk-T3Y4AEKX.mjs.map +7 -0
  27. package/dist/lib/browser/chunk-TGX63LTL.mjs +8 -0
  28. package/dist/lib/browser/chunk-TGX63LTL.mjs.map +7 -0
  29. package/dist/lib/browser/chunk-WPE6AL7I.mjs +905 -0
  30. package/dist/lib/browser/chunk-WPE6AL7I.mjs.map +7 -0
  31. package/dist/lib/browser/cli/index.mjs +90 -0
  32. package/dist/lib/browser/cli/index.mjs.map +7 -0
  33. package/dist/lib/browser/common/activation-events.mjs +24 -0
  34. package/dist/lib/browser/common/capabilities.mjs +46 -0
  35. package/dist/lib/browser/core/activation-event.mjs +20 -0
  36. package/dist/lib/browser/core/activation-event.mjs.map +7 -0
  37. package/dist/lib/browser/core/capability.mjs +30 -0
  38. package/dist/lib/browser/core/capability.mjs.map +7 -0
  39. package/dist/lib/browser/core/plugin-manager.mjs +15 -0
  40. package/dist/lib/browser/core/plugin-manager.mjs.map +7 -0
  41. package/dist/lib/browser/core/plugin.mjs +29 -0
  42. package/dist/lib/browser/core/plugin.mjs.map +7 -0
  43. package/dist/lib/browser/core/url-loader.mjs +12 -0
  44. package/dist/lib/browser/core/url-loader.mjs.map +7 -0
  45. package/dist/lib/browser/index.mjs +92 -121
  46. package/dist/lib/browser/index.mjs.map +4 -4
  47. package/dist/lib/browser/invoker-capability-H5PPENOC.mjs +43 -0
  48. package/dist/lib/browser/invoker-capability-H5PPENOC.mjs.map +7 -0
  49. package/dist/lib/browser/meta.json +1 -1
  50. package/dist/lib/browser/testing/index.mjs +108 -40
  51. package/dist/lib/browser/testing/index.mjs.map +4 -4
  52. package/dist/lib/browser/ui/index.mjs +44 -0
  53. package/dist/lib/browser/ui/index.mjs.map +7 -0
  54. package/dist/lib/node-esm/capability-AWBEMRYR.mjs +39 -0
  55. package/dist/lib/node-esm/capability-AWBEMRYR.mjs.map +7 -0
  56. package/dist/lib/node-esm/capability-WFEG6CIZ.mjs +36 -0
  57. package/dist/lib/node-esm/capability-WFEG6CIZ.mjs.map +7 -0
  58. package/dist/lib/node-esm/chunk-42KBWDE4.mjs +80 -0
  59. package/dist/lib/node-esm/chunk-42KBWDE4.mjs.map +7 -0
  60. package/dist/lib/node-esm/chunk-4A3ZCMI3.mjs +158 -0
  61. package/dist/lib/node-esm/chunk-4A3ZCMI3.mjs.map +7 -0
  62. package/dist/lib/node-esm/chunk-BCEOLX47.mjs +964 -0
  63. package/dist/lib/node-esm/chunk-BCEOLX47.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-EL3R25OQ.mjs +2 -0
  65. package/dist/lib/node-esm/chunk-EL3R25OQ.mjs.map +7 -0
  66. package/dist/lib/node-esm/chunk-FKE4Z3D6.mjs +10 -0
  67. package/dist/lib/node-esm/chunk-FKE4Z3D6.mjs.map +7 -0
  68. package/dist/lib/node-esm/chunk-G3RTFSNG.mjs +81 -0
  69. package/dist/lib/node-esm/chunk-G3RTFSNG.mjs.map +7 -0
  70. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  71. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  72. package/dist/lib/node-esm/chunk-LQKOTNJW.mjs +906 -0
  73. package/dist/lib/node-esm/chunk-LQKOTNJW.mjs.map +7 -0
  74. package/dist/lib/node-esm/chunk-ULUEXB7Q.mjs +149 -0
  75. package/dist/lib/node-esm/chunk-ULUEXB7Q.mjs.map +7 -0
  76. package/dist/lib/node-esm/chunk-URWHJQT2.mjs +168 -0
  77. package/dist/lib/node-esm/chunk-URWHJQT2.mjs.map +7 -0
  78. package/dist/lib/node-esm/chunk-VKHGNEDB.mjs +43 -0
  79. package/dist/lib/node-esm/chunk-VKHGNEDB.mjs.map +7 -0
  80. package/dist/lib/node-esm/chunk-WZCSOX5Q.mjs +35 -0
  81. package/dist/lib/node-esm/chunk-WZCSOX5Q.mjs.map +7 -0
  82. package/dist/lib/node-esm/chunk-ZZ7CKK6W.mjs +49 -0
  83. package/dist/lib/node-esm/chunk-ZZ7CKK6W.mjs.map +7 -0
  84. package/dist/lib/node-esm/cli/index.mjs +91 -0
  85. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  86. package/dist/lib/node-esm/common/activation-events.mjs +25 -0
  87. package/dist/lib/node-esm/common/activation-events.mjs.map +7 -0
  88. package/dist/lib/node-esm/common/capabilities.mjs +47 -0
  89. package/dist/lib/node-esm/common/capabilities.mjs.map +7 -0
  90. package/dist/lib/node-esm/core/activation-event.mjs +21 -0
  91. package/dist/lib/node-esm/core/activation-event.mjs.map +7 -0
  92. package/dist/lib/node-esm/core/capability.mjs +31 -0
  93. package/dist/lib/node-esm/core/capability.mjs.map +7 -0
  94. package/dist/lib/node-esm/core/plugin-manager.mjs +16 -0
  95. package/dist/lib/node-esm/core/plugin-manager.mjs.map +7 -0
  96. package/dist/lib/node-esm/core/plugin.mjs +30 -0
  97. package/dist/lib/node-esm/core/plugin.mjs.map +7 -0
  98. package/dist/lib/node-esm/core/url-loader.mjs +13 -0
  99. package/dist/lib/node-esm/core/url-loader.mjs.map +7 -0
  100. package/dist/lib/node-esm/index.mjs +92 -121
  101. package/dist/lib/node-esm/index.mjs.map +4 -4
  102. package/dist/lib/node-esm/invoker-capability-S3ZA527J.mjs +44 -0
  103. package/dist/lib/node-esm/invoker-capability-S3ZA527J.mjs.map +7 -0
  104. package/dist/lib/node-esm/meta.json +1 -1
  105. package/dist/lib/node-esm/testing/index.mjs +108 -40
  106. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  107. package/dist/lib/node-esm/ui/index.mjs +45 -0
  108. package/dist/lib/node-esm/ui/index.mjs.map +7 -0
  109. package/dist/plugin/node-esm/index.mjs +384 -0
  110. package/dist/plugin/node-esm/index.mjs.map +7 -0
  111. package/dist/plugin/node-esm/meta.json +1 -0
  112. package/dist/types/src/cli/cli.d.ts +39 -0
  113. package/dist/types/src/cli/cli.d.ts.map +1 -0
  114. package/dist/types/src/cli/index.d.ts +2 -0
  115. package/dist/types/src/cli/index.d.ts.map +1 -0
  116. package/dist/types/src/common/activation-events.d.ts +27 -0
  117. package/dist/types/src/common/activation-events.d.ts.map +1 -0
  118. package/dist/types/src/common/capabilities.d.ts +109 -194
  119. package/dist/types/src/common/capabilities.d.ts.map +1 -1
  120. package/dist/types/src/common/index.d.ts +4 -8
  121. package/dist/types/src/common/index.d.ts.map +1 -1
  122. package/dist/types/src/common/operations.d.ts +19 -0
  123. package/dist/types/src/common/operations.d.ts.map +1 -0
  124. package/dist/types/src/common/translations.d.ts +7 -7
  125. package/dist/types/src/common/translations.d.ts.map +1 -1
  126. package/dist/types/src/context.d.ts +5 -0
  127. package/dist/types/src/context.d.ts.map +1 -0
  128. package/dist/types/src/core/{events.d.ts → activation-event.d.ts} +7 -7
  129. package/dist/types/src/core/activation-event.d.ts.map +1 -0
  130. package/dist/types/src/core/capability-manager.d.ts +48 -0
  131. package/dist/types/src/core/capability-manager.d.ts.map +1 -0
  132. package/dist/types/src/core/capability-manager.test.d.ts +2 -0
  133. package/dist/types/src/core/capability-manager.test.d.ts.map +1 -0
  134. package/dist/types/src/core/capability.d.ts +156 -0
  135. package/dist/types/src/core/capability.d.ts.map +1 -0
  136. package/dist/types/src/core/index.d.ts +6 -4
  137. package/dist/types/src/core/index.d.ts.map +1 -1
  138. package/dist/types/src/core/plugin-manager.d.ts +73 -0
  139. package/dist/types/src/core/plugin-manager.d.ts.map +1 -0
  140. package/dist/types/src/core/plugin-manager.test.d.ts +2 -0
  141. package/dist/types/src/core/plugin-manager.test.d.ts.map +1 -0
  142. package/dist/types/src/core/plugin.d.ts +98 -35
  143. package/dist/types/src/core/plugin.d.ts.map +1 -1
  144. package/dist/types/src/core/url-loader.d.ts +25 -0
  145. package/dist/types/src/core/url-loader.d.ts.map +1 -0
  146. package/dist/types/src/core/url-loader.test.d.ts +2 -0
  147. package/dist/types/src/core/url-loader.test.d.ts.map +1 -0
  148. package/dist/types/src/index.d.ts +3 -2
  149. package/dist/types/src/index.d.ts.map +1 -1
  150. package/dist/types/src/plugin-operation/OperationPlugin.d.ts +3 -0
  151. package/dist/types/src/plugin-operation/OperationPlugin.d.ts.map +1 -0
  152. package/dist/types/src/plugin-operation/history/capability.d.ts +7 -0
  153. package/dist/types/src/plugin-operation/history/capability.d.ts.map +1 -0
  154. package/dist/types/src/plugin-operation/history/errors.d.ts +32 -0
  155. package/dist/types/src/plugin-operation/history/errors.d.ts.map +1 -0
  156. package/dist/types/src/plugin-operation/history/history-tracker.d.ts +18 -0
  157. package/dist/types/src/plugin-operation/history/history-tracker.d.ts.map +1 -0
  158. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts +2 -0
  159. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts.map +1 -0
  160. package/dist/types/src/plugin-operation/history/index.d.ts +6 -0
  161. package/dist/types/src/plugin-operation/history/index.d.ts.map +1 -0
  162. package/dist/types/src/plugin-operation/history/types.d.ts +13 -0
  163. package/dist/types/src/plugin-operation/history/types.d.ts.map +1 -0
  164. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts +101 -0
  165. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +1 -0
  166. package/dist/types/src/plugin-operation/history/undo-registry.d.ts +23 -0
  167. package/dist/types/src/plugin-operation/history/undo-registry.d.ts.map +1 -0
  168. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts +2 -0
  169. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts.map +1 -0
  170. package/dist/types/src/plugin-operation/index.d.ts +3 -0
  171. package/dist/types/src/plugin-operation/index.d.ts.map +1 -0
  172. package/dist/types/src/plugin-operation/invoker-capability.d.ts +6 -0
  173. package/dist/types/src/plugin-operation/invoker-capability.d.ts.map +1 -0
  174. package/dist/types/src/plugin-operation/meta.d.ts +3 -0
  175. package/dist/types/src/plugin-operation/meta.d.ts.map +1 -0
  176. package/dist/types/src/plugin-operation/testing.d.ts +58 -0
  177. package/dist/types/src/plugin-operation/testing.d.ts.map +1 -0
  178. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts +3 -0
  179. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts.map +1 -0
  180. package/dist/types/src/plugin-runtime/capability.d.ts +6 -0
  181. package/dist/types/src/plugin-runtime/capability.d.ts.map +1 -0
  182. package/dist/types/src/plugin-runtime/index.d.ts +2 -0
  183. package/dist/types/src/plugin-runtime/index.d.ts.map +1 -0
  184. package/dist/types/src/plugin-runtime/meta.d.ts +3 -0
  185. package/dist/types/src/plugin-runtime/meta.d.ts.map +1 -0
  186. package/dist/types/src/testing/index.d.ts +1 -0
  187. package/dist/types/src/testing/index.d.ts.map +1 -1
  188. package/dist/types/src/testing/service.d.ts +8 -0
  189. package/dist/types/src/testing/service.d.ts.map +1 -0
  190. package/dist/types/src/testing/withPluginManager.d.ts +4 -4
  191. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  192. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
  193. package/dist/types/src/ui/components/App/App.d.ts +9 -0
  194. package/dist/types/src/ui/components/App/App.d.ts.map +1 -0
  195. package/dist/types/src/ui/components/App/App.stories.d.ts +19 -0
  196. package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -0
  197. package/dist/types/src/ui/components/App/index.d.ts +2 -0
  198. package/dist/types/src/ui/components/App/index.d.ts.map +1 -0
  199. package/dist/types/src/{react/Surface.stories.d.ts → ui/components/PluginManager/PluginManagerContext.stories.d.ts} +2 -3
  200. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -0
  201. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts +10 -0
  202. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts.map +1 -0
  203. package/dist/types/src/ui/components/PluginManager/index.d.ts +2 -0
  204. package/dist/types/src/ui/components/PluginManager/index.d.ts.map +1 -0
  205. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +12 -0
  206. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -0
  207. package/dist/types/src/{react/App.stories.d.ts → ui/components/Surface/SurfaceComponent.stories.d.ts} +1 -1
  208. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -0
  209. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts +11 -0
  210. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +1 -0
  211. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts +48 -0
  212. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts.map +1 -0
  213. package/dist/types/src/ui/components/Surface/context.d.ts +5 -0
  214. package/dist/types/src/ui/components/Surface/context.d.ts.map +1 -0
  215. package/dist/types/src/ui/components/Surface/index.d.ts +26 -0
  216. package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -0
  217. package/dist/types/src/ui/components/Surface/types.d.ts +96 -0
  218. package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -0
  219. package/dist/types/src/ui/components/index.d.ts +4 -0
  220. package/dist/types/src/ui/components/index.d.ts.map +1 -0
  221. package/dist/types/src/ui/hooks/index.d.ts +6 -0
  222. package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
  223. package/dist/types/src/{react → ui/hooks}/useApp.d.ts +30 -12
  224. package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -0
  225. package/dist/types/src/ui/hooks/useApp.test.d.ts +2 -0
  226. package/dist/types/src/ui/hooks/useApp.test.d.ts.map +1 -0
  227. package/dist/types/src/ui/hooks/useCapabilities.d.ts +31 -0
  228. package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -0
  229. package/dist/types/src/{react → ui/hooks}/useLoading.d.ts +1 -2
  230. package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
  231. package/dist/types/src/ui/hooks/useSettingsState.d.ts +10 -0
  232. package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -0
  233. package/dist/types/src/ui/hooks/useSurface.d.ts +3 -0
  234. package/dist/types/src/ui/hooks/useSurface.d.ts.map +1 -0
  235. package/dist/types/src/ui/index.d.ts +3 -0
  236. package/dist/types/src/ui/index.d.ts.map +1 -0
  237. package/dist/types/src/vite-plugin/composer-plugin.d.ts +18 -0
  238. package/dist/types/src/vite-plugin/composer-plugin.d.ts.map +1 -0
  239. package/dist/types/src/vite-plugin/import-map-plugin.d.ts +16 -0
  240. package/dist/types/src/vite-plugin/import-map-plugin.d.ts.map +1 -0
  241. package/dist/types/src/vite-plugin/index.d.ts +3 -0
  242. package/dist/types/src/vite-plugin/index.d.ts.map +1 -0
  243. package/dist/types/src/vite-plugin/packages.d.ts +7 -0
  244. package/dist/types/src/vite-plugin/packages.d.ts.map +1 -0
  245. package/dist/types/tsconfig.tsbuildinfo +1 -1
  246. package/moon.yml +24 -6
  247. package/package.json +130 -50
  248. package/src/cli/cli.ts +107 -0
  249. package/src/{playground/debug → cli}/index.ts +1 -1
  250. package/src/common/activation-events.ts +44 -0
  251. package/src/common/capabilities.ts +168 -210
  252. package/src/common/index.ts +4 -8
  253. package/src/common/operations.ts +35 -0
  254. package/src/common/translations.ts +17 -9
  255. package/src/context.ts +9 -0
  256. package/src/core/{events.ts → activation-event.ts} +10 -7
  257. package/src/core/capability-manager.test.ts +151 -0
  258. package/src/core/capability-manager.ts +192 -0
  259. package/src/core/capability.ts +247 -0
  260. package/src/core/index.ts +6 -4
  261. package/src/core/plugin-manager.test.ts +1113 -0
  262. package/src/core/plugin-manager.ts +883 -0
  263. package/src/core/plugin.ts +230 -40
  264. package/src/core/url-loader.test.ts +79 -0
  265. package/src/core/url-loader.ts +148 -0
  266. package/src/index.ts +3 -2
  267. package/src/plugin-operation/OperationPlugin.ts +24 -0
  268. package/src/plugin-operation/history/capability.ts +36 -0
  269. package/src/plugin-operation/history/errors.ts +7 -0
  270. package/src/plugin-operation/history/history-tracker.test.ts +373 -0
  271. package/src/plugin-operation/history/history-tracker.ts +128 -0
  272. package/src/plugin-operation/history/index.ts +9 -0
  273. package/src/plugin-operation/history/types.ts +17 -0
  274. package/src/plugin-operation/history/undo-mapping.ts +135 -0
  275. package/src/plugin-operation/history/undo-registry.test.ts +72 -0
  276. package/src/plugin-operation/history/undo-registry.ts +54 -0
  277. package/src/plugin-operation/index.ts +6 -0
  278. package/src/plugin-operation/invoker-capability.ts +54 -0
  279. package/src/plugin-operation/meta.ts +11 -0
  280. package/src/plugin-operation/testing.ts +154 -0
  281. package/src/plugin-runtime/RuntimePlugin.ts +19 -0
  282. package/src/plugin-runtime/capability.ts +53 -0
  283. package/src/{playground/logger → plugin-runtime}/index.ts +1 -1
  284. package/src/plugin-runtime/meta.ts +11 -0
  285. package/src/testing/index.ts +1 -0
  286. package/src/testing/service.ts +52 -0
  287. package/src/testing/withPluginManager.stories.tsx +7 -8
  288. package/src/testing/withPluginManager.tsx +63 -38
  289. package/src/ui/components/App/App.stories.tsx +92 -0
  290. package/src/{react → ui/components/App}/App.tsx +11 -12
  291. package/src/{playground/layout → ui/components/App}/index.ts +1 -1
  292. package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +183 -0
  293. package/src/{react → ui/components/PluginManager}/PluginManagerProvider.ts +3 -3
  294. package/src/ui/components/PluginManager/index.ts +5 -0
  295. package/src/{react/Surface.stories.tsx → ui/components/Surface/SurfaceComponent.stories.tsx} +55 -36
  296. package/src/ui/components/Surface/SurfaceComponent.tsx +266 -0
  297. package/src/ui/components/Surface/SurfaceInfo.tsx +107 -0
  298. package/src/ui/components/Surface/SurfaceProfilerContext.tsx +207 -0
  299. package/src/ui/components/Surface/context.ts +12 -0
  300. package/src/ui/components/Surface/index.ts +35 -0
  301. package/src/ui/components/Surface/types.ts +117 -0
  302. package/src/ui/components/index.ts +7 -0
  303. package/src/ui/hooks/index.ts +9 -0
  304. package/src/ui/hooks/useApp.test.tsx +159 -0
  305. package/src/ui/hooks/useApp.tsx +289 -0
  306. package/src/ui/hooks/useCapabilities.ts +67 -0
  307. package/src/{react → ui/hooks}/useLoading.tsx +4 -6
  308. package/src/ui/hooks/useSettingsState.ts +26 -0
  309. package/src/ui/hooks/useSurface.ts +13 -0
  310. package/src/ui/index.ts +6 -0
  311. package/src/vite-plugin/composer-plugin.ts +128 -0
  312. package/src/vite-plugin/import-map-plugin.ts +314 -0
  313. package/src/vite-plugin/index.ts +6 -0
  314. package/src/vite-plugin/packages.ts +29 -0
  315. package/tsconfig.json +12 -27
  316. package/tsconfig.node.json +2 -4
  317. package/typedoc.json +2 -4
  318. package/vitest.config.ts +1 -1
  319. package/.swc/plugins/linux_x86_64_19.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429.wasmer-v7 +0 -0
  320. package/dist/lib/browser/app-graph-builder-OIEZZC45.mjs +0 -138
  321. package/dist/lib/browser/app-graph-builder-OIEZZC45.mjs.map +0 -7
  322. package/dist/lib/browser/chunk-SCPE4ZO2.mjs +0 -35
  323. package/dist/lib/browser/chunk-SCPE4ZO2.mjs.map +0 -7
  324. package/dist/lib/browser/chunk-VFUKEZIN.mjs +0 -483
  325. package/dist/lib/browser/chunk-VFUKEZIN.mjs.map +0 -7
  326. package/dist/lib/browser/chunk-WPW5VVAX.mjs +0 -1651
  327. package/dist/lib/browser/chunk-WPW5VVAX.mjs.map +0 -7
  328. package/dist/lib/browser/intent-dispatcher-LZ4AE66E.mjs +0 -11
  329. package/dist/lib/browser/intent-resolver-QVCKRX6G.mjs +0 -39
  330. package/dist/lib/browser/intent-resolver-QVCKRX6G.mjs.map +0 -7
  331. package/dist/lib/browser/react/index.mjs +0 -34
  332. package/dist/lib/browser/store-CNPHOYTJ.mjs +0 -30
  333. package/dist/lib/browser/store-CNPHOYTJ.mjs.map +0 -7
  334. package/dist/lib/node-esm/app-graph-builder-EBU4NVWD.mjs +0 -139
  335. package/dist/lib/node-esm/app-graph-builder-EBU4NVWD.mjs.map +0 -7
  336. package/dist/lib/node-esm/chunk-IJOHO66N.mjs +0 -484
  337. package/dist/lib/node-esm/chunk-IJOHO66N.mjs.map +0 -7
  338. package/dist/lib/node-esm/chunk-XJZGUJ3H.mjs +0 -1653
  339. package/dist/lib/node-esm/chunk-XJZGUJ3H.mjs.map +0 -7
  340. package/dist/lib/node-esm/chunk-ZX63QUGE.mjs +0 -37
  341. package/dist/lib/node-esm/chunk-ZX63QUGE.mjs.map +0 -7
  342. package/dist/lib/node-esm/intent-dispatcher-MGOJ3CHD.mjs +0 -12
  343. package/dist/lib/node-esm/intent-resolver-URF3HN3G.mjs +0 -40
  344. package/dist/lib/node-esm/intent-resolver-URF3HN3G.mjs.map +0 -7
  345. package/dist/lib/node-esm/react/index.mjs +0 -35
  346. package/dist/lib/node-esm/store-RK5B4XEL.mjs +0 -31
  347. package/dist/lib/node-esm/store-RK5B4XEL.mjs.map +0 -7
  348. package/dist/types/src/common/collaboration.d.ts +0 -20
  349. package/dist/types/src/common/collaboration.d.ts.map +0 -1
  350. package/dist/types/src/common/events.d.ts +0 -52
  351. package/dist/types/src/common/events.d.ts.map +0 -1
  352. package/dist/types/src/common/file.d.ts +0 -14
  353. package/dist/types/src/common/file.d.ts.map +0 -1
  354. package/dist/types/src/common/graph.d.ts +0 -21
  355. package/dist/types/src/common/graph.d.ts.map +0 -1
  356. package/dist/types/src/common/layout.d.ts +0 -279
  357. package/dist/types/src/common/layout.d.ts.map +0 -1
  358. package/dist/types/src/common/surface.d.ts +0 -68
  359. package/dist/types/src/common/surface.d.ts.map +0 -1
  360. package/dist/types/src/core/capabilities.d.ts +0 -117
  361. package/dist/types/src/core/capabilities.d.ts.map +0 -1
  362. package/dist/types/src/core/capabilities.test.d.ts +0 -2
  363. package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
  364. package/dist/types/src/core/events.d.ts.map +0 -1
  365. package/dist/types/src/core/manager.d.ts +0 -126
  366. package/dist/types/src/core/manager.d.ts.map +0 -1
  367. package/dist/types/src/core/manager.test.d.ts +0 -2
  368. package/dist/types/src/core/manager.test.d.ts.map +0 -1
  369. package/dist/types/src/playground/debug/Debug.d.ts +0 -6
  370. package/dist/types/src/playground/debug/Debug.d.ts.map +0 -1
  371. package/dist/types/src/playground/debug/index.d.ts +0 -2
  372. package/dist/types/src/playground/debug/index.d.ts.map +0 -1
  373. package/dist/types/src/playground/debug/plugin.d.ts +0 -2
  374. package/dist/types/src/playground/debug/plugin.d.ts.map +0 -1
  375. package/dist/types/src/playground/generator/Main.d.ts +0 -6
  376. package/dist/types/src/playground/generator/Main.d.ts.map +0 -1
  377. package/dist/types/src/playground/generator/Toolbar.d.ts +0 -6
  378. package/dist/types/src/playground/generator/Toolbar.d.ts.map +0 -1
  379. package/dist/types/src/playground/generator/generator.d.ts +0 -7
  380. package/dist/types/src/playground/generator/generator.d.ts.map +0 -1
  381. package/dist/types/src/playground/generator/index.d.ts +0 -3
  382. package/dist/types/src/playground/generator/index.d.ts.map +0 -1
  383. package/dist/types/src/playground/generator/plugin.d.ts +0 -2
  384. package/dist/types/src/playground/generator/plugin.d.ts.map +0 -1
  385. package/dist/types/src/playground/layout/Layout.d.ts +0 -8
  386. package/dist/types/src/playground/layout/Layout.d.ts.map +0 -1
  387. package/dist/types/src/playground/layout/index.d.ts +0 -2
  388. package/dist/types/src/playground/layout/index.d.ts.map +0 -1
  389. package/dist/types/src/playground/layout/plugin.d.ts +0 -2
  390. package/dist/types/src/playground/layout/plugin.d.ts.map +0 -1
  391. package/dist/types/src/playground/logger/Toolbar.d.ts +0 -6
  392. package/dist/types/src/playground/logger/Toolbar.d.ts.map +0 -1
  393. package/dist/types/src/playground/logger/index.d.ts +0 -2
  394. package/dist/types/src/playground/logger/index.d.ts.map +0 -1
  395. package/dist/types/src/playground/logger/plugin.d.ts +0 -2
  396. package/dist/types/src/playground/logger/plugin.d.ts.map +0 -1
  397. package/dist/types/src/playground/logger/schema.d.ts +0 -13
  398. package/dist/types/src/playground/logger/schema.d.ts.map +0 -1
  399. package/dist/types/src/playground/playground.stories.d.ts +0 -11
  400. package/dist/types/src/playground/playground.stories.d.ts.map +0 -1
  401. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +0 -2
  402. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +0 -1
  403. package/dist/types/src/plugin-intent/actions.d.ts +0 -36
  404. package/dist/types/src/plugin-intent/actions.d.ts.map +0 -1
  405. package/dist/types/src/plugin-intent/errors.d.ts +0 -16
  406. package/dist/types/src/plugin-intent/errors.d.ts.map +0 -1
  407. package/dist/types/src/plugin-intent/index.d.ts +0 -6
  408. package/dist/types/src/plugin-intent/index.d.ts.map +0 -1
  409. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +0 -139
  410. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +0 -1
  411. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +0 -2
  412. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +0 -1
  413. package/dist/types/src/plugin-intent/intent.d.ts +0 -63
  414. package/dist/types/src/plugin-intent/intent.d.ts.map +0 -1
  415. package/dist/types/src/plugin-intent/meta.d.ts +0 -3
  416. package/dist/types/src/plugin-intent/meta.d.ts.map +0 -1
  417. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +0 -2
  418. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +0 -1
  419. package/dist/types/src/plugin-settings/actions.d.ts +0 -25
  420. package/dist/types/src/plugin-settings/actions.d.ts.map +0 -1
  421. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +0 -4
  422. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +0 -1
  423. package/dist/types/src/plugin-settings/index.d.ts +0 -3
  424. package/dist/types/src/plugin-settings/index.d.ts.map +0 -1
  425. package/dist/types/src/plugin-settings/intent-resolver.d.ts +0 -4
  426. package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +0 -1
  427. package/dist/types/src/plugin-settings/meta.d.ts +0 -3
  428. package/dist/types/src/plugin-settings/meta.d.ts.map +0 -1
  429. package/dist/types/src/plugin-settings/store.d.ts +0 -5
  430. package/dist/types/src/plugin-settings/store.d.ts.map +0 -1
  431. package/dist/types/src/plugin-settings/translations.d.ts +0 -11
  432. package/dist/types/src/plugin-settings/translations.d.ts.map +0 -1
  433. package/dist/types/src/react/App.d.ts +0 -10
  434. package/dist/types/src/react/App.d.ts.map +0 -1
  435. package/dist/types/src/react/App.stories.d.ts.map +0 -1
  436. package/dist/types/src/react/DefaultFallback.d.ts +0 -8
  437. package/dist/types/src/react/DefaultFallback.d.ts.map +0 -1
  438. package/dist/types/src/react/ErrorBoundary.d.ts +0 -30
  439. package/dist/types/src/react/ErrorBoundary.d.ts.map +0 -1
  440. package/dist/types/src/react/IntentContext.d.ts +0 -8
  441. package/dist/types/src/react/IntentContext.d.ts.map +0 -1
  442. package/dist/types/src/react/PluginManagerProvider.d.ts +0 -10
  443. package/dist/types/src/react/PluginManagerProvider.d.ts.map +0 -1
  444. package/dist/types/src/react/Surface.d.ts +0 -12
  445. package/dist/types/src/react/Surface.d.ts.map +0 -1
  446. package/dist/types/src/react/Surface.stories.d.ts.map +0 -1
  447. package/dist/types/src/react/common.d.ts +0 -13
  448. package/dist/types/src/react/common.d.ts.map +0 -1
  449. package/dist/types/src/react/index.d.ts +0 -9
  450. package/dist/types/src/react/index.d.ts.map +0 -1
  451. package/dist/types/src/react/types.d.ts +0 -14
  452. package/dist/types/src/react/types.d.ts.map +0 -1
  453. package/dist/types/src/react/useApp.d.ts.map +0 -1
  454. package/dist/types/src/react/useCapabilities.d.ts +0 -13
  455. package/dist/types/src/react/useCapabilities.d.ts.map +0 -1
  456. package/dist/types/src/react/useIntentResolver.d.ts +0 -3
  457. package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
  458. package/dist/types/src/react/useLoading.d.ts.map +0 -1
  459. package/src/common/collaboration.ts +0 -18
  460. package/src/common/events.ts +0 -79
  461. package/src/common/file.ts +0 -22
  462. package/src/common/graph.ts +0 -30
  463. package/src/common/layout.ts +0 -277
  464. package/src/common/surface.ts +0 -88
  465. package/src/core/capabilities.test.ts +0 -136
  466. package/src/core/capabilities.ts +0 -263
  467. package/src/core/manager.test.ts +0 -516
  468. package/src/core/manager.ts +0 -604
  469. package/src/playground/debug/Debug.tsx +0 -39
  470. package/src/playground/debug/plugin.ts +0 -16
  471. package/src/playground/generator/Main.tsx +0 -70
  472. package/src/playground/generator/Toolbar.tsx +0 -47
  473. package/src/playground/generator/generator.ts +0 -48
  474. package/src/playground/generator/index.ts +0 -6
  475. package/src/playground/generator/plugin.ts +0 -22
  476. package/src/playground/layout/Layout.tsx +0 -33
  477. package/src/playground/layout/plugin.ts +0 -18
  478. package/src/playground/logger/Toolbar.tsx +0 -30
  479. package/src/playground/logger/plugin.ts +0 -41
  480. package/src/playground/logger/schema.ts +0 -12
  481. package/src/playground/playground.stories.tsx +0 -46
  482. package/src/plugin-intent/IntentPlugin.ts +0 -20
  483. package/src/plugin-intent/actions.ts +0 -31
  484. package/src/plugin-intent/errors.ts +0 -40
  485. package/src/plugin-intent/index.ts +0 -9
  486. package/src/plugin-intent/intent-dispatcher.test.ts +0 -286
  487. package/src/plugin-intent/intent-dispatcher.ts +0 -342
  488. package/src/plugin-intent/intent.ts +0 -154
  489. package/src/plugin-intent/meta.ts +0 -10
  490. package/src/plugin-settings/SettingsPlugin.ts +0 -34
  491. package/src/plugin-settings/actions.ts +0 -25
  492. package/src/plugin-settings/app-graph-builder.ts +0 -160
  493. package/src/plugin-settings/index.ts +0 -6
  494. package/src/plugin-settings/intent-resolver.ts +0 -35
  495. package/src/plugin-settings/meta.ts +0 -10
  496. package/src/plugin-settings/store.ts +0 -33
  497. package/src/plugin-settings/translations.ts +0 -19
  498. package/src/react/App.stories.tsx +0 -33
  499. package/src/react/DefaultFallback.tsx +0 -26
  500. package/src/react/ErrorBoundary.tsx +0 -56
  501. package/src/react/IntentContext.tsx +0 -35
  502. package/src/react/Surface.tsx +0 -109
  503. package/src/react/common.ts +0 -13
  504. package/src/react/index.ts +0 -14
  505. package/src/react/types.ts +0 -37
  506. package/src/react/useApp.tsx +0 -165
  507. package/src/react/useCapabilities.ts +0 -31
  508. package/src/react/useIntentResolver.ts +0 -22
  509. /package/dist/lib/browser/{intent-dispatcher-LZ4AE66E.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  510. /package/dist/lib/browser/{react/index.mjs.map → chunk-RFSO3JRG.mjs.map} +0 -0
  511. /package/dist/lib/{node-esm/intent-dispatcher-MGOJ3CHD.mjs.map → browser/common/activation-events.mjs.map} +0 -0
  512. /package/dist/lib/{node-esm/react/index.mjs.map → browser/common/capabilities.mjs.map} +0 -0
@@ -0,0 +1,26 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Atom, RegistryContext, useAtomValue } from '@effect-atom/atom-react';
6
+ import { useCallback, useContext } from 'react';
7
+
8
+ /**
9
+ * Hook to read and update a settings atom.
10
+ * Returns the current value and an update function.
11
+ */
12
+ export const useSettingsState = <T>(
13
+ atom: Atom.Writable<T>,
14
+ ): { settings: T; updateSettings: (fn: (current: T) => T) => void } => {
15
+ const registry = useContext(RegistryContext);
16
+ const settings = useAtomValue(atom);
17
+
18
+ const updateSettings = useCallback(
19
+ (fn: (current: T) => T) => {
20
+ registry.set(atom, fn(registry.get(atom)));
21
+ },
22
+ [registry, atom],
23
+ );
24
+
25
+ return { settings, updateSettings };
26
+ };
@@ -0,0 +1,13 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { useContext } from 'react';
6
+
7
+ import { raise } from '@dxos/debug';
8
+
9
+ import { Surface } from '../components';
10
+
11
+ export const useSurface = (): Surface.Context => {
12
+ return useContext(Surface.Context) ?? raise(new Error('Missing SurfaceContext'));
13
+ };
@@ -0,0 +1,6 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ export * from './components';
6
+ export * from './hooks';
@@ -0,0 +1,128 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Plugin } from 'vite';
6
+
7
+ import { DEFAULT_PACKAGES } from './packages';
8
+
9
+ const JSX_DEV_RUNTIME = 'react/jsx-dev-runtime';
10
+
11
+ /** Regex patterns matching each shared package and all its subpath imports. */
12
+ const EXTERNAL_DEPS = DEFAULT_PACKAGES.map((pkg) => new RegExp(`^${pkg.replace('/', '\\/')}(\\/|$)`));
13
+
14
+ /** Checks whether an import should be externalized (all shared deps except jsx-dev-runtime). */
15
+ const isExternal = (id: string) => id !== JSX_DEV_RUNTIME && EXTERNAL_DEPS.some((pattern) => pattern.test(id));
16
+
17
+ /**
18
+ * Vite plugin for **external Composer plugin projects**. Configures the build to produce
19
+ * an ESM bundle that externalizes all framework dependencies, which the Composer host app
20
+ * provides at runtime via import map.
21
+ *
22
+ * Handles three concerns:
23
+ * 1. Build config — lib mode entry point, ES format output, rollup externals.
24
+ * 2. Dev externalization — marks shared deps as external during `vite serve` and strips
25
+ * the `/@id/` prefix that Vite's import analysis adds to external bare specifiers.
26
+ * 3. JSX dev runtime shim — bridges `react/jsx-dev-runtime` (used by React refresh in dev)
27
+ * to `react/jsx-runtime` (which is what the externalized React provides).
28
+ */
29
+ export const composerPlugin = (options?: { entry?: string; port?: number }): Plugin[] => {
30
+ const entry = options?.entry ?? 'src/plugin.tsx';
31
+ const port = options?.port ?? 3967;
32
+ const resolved = new Set<string>();
33
+ let base = '/';
34
+
35
+ return [
36
+ // Plugin 1: Configure vite for library-mode builds with externalized deps.
37
+ {
38
+ name: 'composer-plugin',
39
+ config: () => ({
40
+ server: {
41
+ port,
42
+ // Allow the Composer host (different origin) to dynamically import plugin modules.
43
+ cors: true,
44
+ },
45
+ preview: { port },
46
+ build: {
47
+ sourcemap: true,
48
+ lib: {
49
+ entry,
50
+ formats: ['es'],
51
+ },
52
+ rolldownOptions: {
53
+ external: EXTERNAL_DEPS,
54
+ },
55
+ },
56
+ }),
57
+ },
58
+
59
+ // Plugin 2: Dev-time externalization.
60
+ // Vite's dev server doesn't use rollup externals, so we need to handle it manually.
61
+ // We intercept imports of shared deps at resolve time, mark them external, and then
62
+ // strip the `/@id/` prefix that Vite's import analysis injects for external modules.
63
+ {
64
+ name: 'composer-plugin:externalize',
65
+ enforce: 'pre',
66
+ apply: 'serve',
67
+ // Exclude shared packages from Vite's dependency pre-bundling.
68
+ config: () => ({
69
+ optimizeDeps: {
70
+ exclude: DEFAULT_PACKAGES,
71
+ },
72
+ }),
73
+ // Mark shared deps as external so Vite doesn't try to bundle them.
74
+ resolveId: (id) => {
75
+ if (isExternal(id)) {
76
+ resolved.add(id);
77
+ return { id, external: true };
78
+ }
79
+ },
80
+ // Return a stub for any externalized module that Vite tries to load directly.
81
+ load: (id) => {
82
+ if (resolved.has(id)) {
83
+ return { code: 'export default {};' };
84
+ }
85
+ },
86
+ // After all plugins are resolved, inject a late-stage transform plugin that strips
87
+ // the `/@id/` prefix from externalized bare specifiers in the output.
88
+ // This must run after Vite's internal import analysis which rewrites bare specifiers.
89
+ configResolved: (config) => {
90
+ base = config.base ?? '/';
91
+ (config.plugins as Plugin[]).push({
92
+ name: 'composer-plugin:strip-prefix',
93
+ transform: (code: string) => {
94
+ if (resolved.size === 0) {
95
+ return;
96
+ }
97
+ const escaped = [...resolved].map((s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|');
98
+ const pattern = new RegExp(`${base}@id/(${escaped})`, 'g');
99
+ if (pattern.test(code)) {
100
+ return code.replace(pattern, (_: string, dep: string) => dep);
101
+ }
102
+ },
103
+ });
104
+ },
105
+ },
106
+
107
+ // Plugin 3: JSX dev runtime shim.
108
+ // React refresh (used by @vitejs/plugin-react) imports from `react/jsx-dev-runtime`,
109
+ // but the externalized React only exposes `react/jsx-runtime`. This virtual module
110
+ // bridges the gap by re-exporting jsx-runtime's functions under jsx-dev-runtime's API.
111
+ {
112
+ name: 'composer-plugin:jsx-dev-shim',
113
+ enforce: 'pre',
114
+ apply: 'serve',
115
+ resolveId: (id) => (id === JSX_DEV_RUNTIME ? `\0${JSX_DEV_RUNTIME}` : undefined),
116
+ load: (id) =>
117
+ id === `\0${JSX_DEV_RUNTIME}`
118
+ ? [
119
+ 'import { jsx, jsxs, Fragment } from "react/jsx-runtime";',
120
+ 'export { Fragment };',
121
+ 'export function jsxDEV(type, props, key, isStaticChildren) {',
122
+ ' return isStaticChildren ? jsxs(type, props, key) : jsx(type, props, key);',
123
+ '}',
124
+ ].join('\n')
125
+ : undefined,
126
+ },
127
+ ];
128
+ };
@@ -0,0 +1,314 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { init as initCjsLexer, parse as parseCjs } from 'cjs-module-lexer';
6
+ import { existsSync, readFileSync } from 'node:fs';
7
+ import { createRequire as nodeCreateRequire } from 'node:module';
8
+ import path from 'node:path';
9
+ import { type Plugin } from 'vite';
10
+
11
+ import { DEFAULT_PACKAGES } from './packages';
12
+
13
+ const require = nodeCreateRequire(import.meta.url);
14
+
15
+ //
16
+ // Import map helpers.
17
+ // These utilities support `importMapPlugin` by resolving package entrypoints,
18
+ // detecting module formats (ESM vs CJS), and extracting named exports from CJS bundles.
19
+ //
20
+
21
+ /** Strips vite query strings (e.g. `?v=123`) from resolved module IDs. */
22
+ const trimQueryString = (id: string) => id.replace(/\?.*$/, '');
23
+
24
+ /**
25
+ * Determines whether a resolved file is an ESM module by checking file extension
26
+ * first (.mjs/.cjs), then walking up to the nearest package.json for `"type": "module"`.
27
+ */
28
+ const resolvedIdIsEsmModule = (resolvedId: string): boolean => {
29
+ const file = trimQueryString(resolvedId);
30
+ if (file.endsWith('.mjs') || file.endsWith('.mts')) {
31
+ return true;
32
+ }
33
+ if (file.endsWith('.cjs') || file.endsWith('.cts')) {
34
+ return false;
35
+ }
36
+
37
+ let directory = path.dirname(file);
38
+ while (directory !== path.dirname(directory)) {
39
+ const packageJsonPath = path.join(directory, 'package.json');
40
+ if (existsSync(packageJsonPath)) {
41
+ try {
42
+ const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf8')) as { type?: string };
43
+ return pkg.type === 'module';
44
+ } catch {
45
+ return false;
46
+ }
47
+ }
48
+ directory = path.dirname(directory);
49
+ }
50
+
51
+ return false;
52
+ };
53
+
54
+ /**
55
+ * Walks up from a resolved file path to find the package.json whose `"name"` matches
56
+ * the given package name. Returns the path to that package.json, or undefined.
57
+ */
58
+ const findPackageJsonPath = (resolvedId: string, packageName: string): string | undefined => {
59
+ let directory = path.dirname(trimQueryString(resolvedId));
60
+
61
+ while (directory !== path.dirname(directory)) {
62
+ const packageJsonPath = path.join(directory, 'package.json');
63
+ if (existsSync(packageJsonPath)) {
64
+ try {
65
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8')) as { name?: string };
66
+ if (packageJson.name === packageName) {
67
+ return packageJsonPath;
68
+ }
69
+ } catch {}
70
+ }
71
+
72
+ directory = path.dirname(directory);
73
+ }
74
+
75
+ return undefined;
76
+ };
77
+
78
+ /** Resolves a package name to its package.json path using Node's require.resolve. */
79
+ const resolvePackageJsonPath = (packageName: string): string | undefined => {
80
+ try {
81
+ return findPackageJsonPath(require.resolve(packageName), packageName);
82
+ } catch {
83
+ return undefined;
84
+ }
85
+ };
86
+
87
+ /**
88
+ * Subpath exports that should be excluded from the import map.
89
+ * These are node-only entrypoints (vite plugins, native addons) that shouldn't be pre-bundled for the browser.
90
+ */
91
+ const importMapExcludedSubpaths: Readonly<Record<string, ReadonlySet<string>>> = {
92
+ '@dxos/app-framework': new Set(['vite-plugin']),
93
+ '@dxos/ui-theme': new Set(['plugin']),
94
+ };
95
+
96
+ /**
97
+ * Reads a package's `exports` field and returns all JS subpath entrypoints as bare specifiers
98
+ * (e.g. `@dxos/client`, `@dxos/client/echo`). Skips wildcard patterns, non-JS assets,
99
+ * and excluded subpaths. Falls back to just the package name if exports is absent or simple.
100
+ */
101
+ const getPackageEntrypoints = (packageName: string, packageJsonPath: string): string[] => {
102
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8')) as {
103
+ exports?: Record<string, unknown> | string | string[];
104
+ };
105
+ const exportsField = packageJson.exports;
106
+
107
+ if (!exportsField || typeof exportsField === 'string' || Array.isArray(exportsField)) {
108
+ return [packageName];
109
+ }
110
+
111
+ const exportKeys = Object.keys(exportsField);
112
+ if (!exportKeys.some((key) => key.startsWith('.'))) {
113
+ return [packageName];
114
+ }
115
+
116
+ const excluded = importMapExcludedSubpaths[packageName];
117
+ const modules = exportKeys.flatMap((key) => {
118
+ if (key === '.') {
119
+ return [packageName];
120
+ }
121
+
122
+ if (!key.startsWith('./') || key === './package.json' || key.includes('*')) {
123
+ return [];
124
+ }
125
+
126
+ const subpath = key.slice(2);
127
+ if (excluded?.has(subpath)) {
128
+ return [];
129
+ }
130
+
131
+ if (/\.(css|pcss|scss|less|json|node|wasm|html|svg|png|jpg)$/.test(subpath)) {
132
+ return [];
133
+ }
134
+
135
+ return [`${packageName}/${subpath}`];
136
+ });
137
+
138
+ return modules.length > 0 ? modules : [packageName];
139
+ };
140
+
141
+ /**
142
+ * Statically analyzes a CJS file to extract named exports using cjs-module-lexer.
143
+ * Follows re-exports (e.g. react's index.js re-exports from cjs/react.development.js)
144
+ * and deduplicates. Filters out `default` and `__esModule` pseudo-exports.
145
+ */
146
+ const getCjsNamedExports = (filePath: string, seen = new Set<string>()): string[] => {
147
+ const normalized = trimQueryString(filePath);
148
+ if (seen.has(normalized)) {
149
+ return [];
150
+ }
151
+ seen.add(normalized);
152
+
153
+ try {
154
+ const source = readFileSync(normalized, 'utf8');
155
+ const { exports: directExports, reexports } = parseCjs(source);
156
+
157
+ const reexportedNames = reexports.flatMap((reexport) => {
158
+ const resolved = path.resolve(path.dirname(normalized), reexport);
159
+ const candidates = [resolved, `${resolved}.js`, `${resolved}.cjs`];
160
+ const found = candidates.find((candidate) => existsSync(candidate));
161
+ return found ? getCjsNamedExports(found, seen) : [];
162
+ });
163
+
164
+ return [...new Set([...directExports, ...reexportedNames])].filter(
165
+ (name) => name !== 'default' && name !== '__esModule',
166
+ );
167
+ } catch {
168
+ return [];
169
+ }
170
+ };
171
+
172
+ /**
173
+ * Vite plugin for the **host app** (Composer). Generates a browser import map so that
174
+ * shared packages are loaded once and reused by both the host and any remote plugins.
175
+ *
176
+ * In dev mode, maps bare specifiers directly to resolved file paths.
177
+ * In production, emits a dedicated chunk per specifier via virtual wrapper modules,
178
+ * then injects a `<script type="importmap">` tag into the HTML with the chunk URLs.
179
+ *
180
+ * Virtual wrappers are needed because directly emitting chunks for CJS packages loses
181
+ * their named exports due to Rollup's interop. The wrapper re-exports them explicitly.
182
+ */
183
+ export const importMapPlugin = (options?: { packages?: string[] }): Plugin[] => {
184
+ const packages = options?.packages ?? DEFAULT_PACKAGES;
185
+ const WRAPPER_PREFIX = '\0import-map:';
186
+ const chunkRefIds: Record<string, string> = {};
187
+ const resolvedIds: Record<string, string> = {};
188
+ let imports: Record<string, string> = {};
189
+ let modules: string[] = [];
190
+ let importMapIsDev = false;
191
+ let base = '/';
192
+
193
+ return [
194
+ // Phase 1: Resolve all package entrypoints and emit chunks (or record dev paths).
195
+ {
196
+ name: 'import-map:get-chunk-ref-ids',
197
+ configResolved(config) {
198
+ base = config.base ?? '/';
199
+ },
200
+ async buildStart() {
201
+ importMapIsDev = this.environment.mode === 'dev';
202
+ await initCjsLexer();
203
+
204
+ // Expand each package name into its full set of subpath entrypoints
205
+ // (e.g. '@dxos/client' -> ['@dxos/client', '@dxos/client/echo', ...]).
206
+ modules = [
207
+ ...new Set(
208
+ (
209
+ await Promise.all(
210
+ packages.map(async (packageName) => {
211
+ const packageJsonPath = resolvePackageJsonPath(packageName);
212
+ if (!packageJsonPath) {
213
+ this.warn(`Unable to locate package.json for import map package: ${packageName}`);
214
+ return [packageName];
215
+ }
216
+
217
+ return getPackageEntrypoints(packageName, packageJsonPath);
218
+ }),
219
+ )
220
+ ).flat(),
221
+ ),
222
+ ];
223
+
224
+ for (const specifier of modules) {
225
+ const resolved = await this.resolve(specifier);
226
+ if (!resolved) {
227
+ this.warn(`Import map: unable to resolve "${specifier}"; omitting from import map.`);
228
+ continue;
229
+ }
230
+
231
+ if (importMapIsDev) {
232
+ // Dev: map bare specifier directly to the resolved file path.
233
+ imports[specifier] = trimQueryString(resolved.id);
234
+ } else {
235
+ // Prod: emit a virtual wrapper chunk that re-exports from the real module.
236
+ resolvedIds[specifier] = resolved.id;
237
+ chunkRefIds[specifier] = this.emitFile({
238
+ type: 'chunk',
239
+ id: `${WRAPPER_PREFIX}${specifier}`,
240
+ preserveSignature: 'strict',
241
+ });
242
+ }
243
+ }
244
+ },
245
+
246
+ // Intercept virtual wrapper IDs so Rollup doesn't try to resolve them as files.
247
+ resolveId(id) {
248
+ if (id.startsWith(WRAPPER_PREFIX)) {
249
+ return id;
250
+ }
251
+ },
252
+
253
+ // Generate the source for each virtual wrapper module.
254
+ // For CJS packages, explicitly re-export named exports (discovered via static analysis)
255
+ // because Rollup's `export *` interop doesn't preserve them for CJS.
256
+ load(id) {
257
+ if (!id.startsWith(WRAPPER_PREFIX)) {
258
+ return;
259
+ }
260
+ const specifier = id.slice(WRAPPER_PREFIX.length);
261
+ const resolvedId = resolvedIds[specifier];
262
+ if (!resolvedId) {
263
+ return `export * from ${JSON.stringify(specifier)};\n`;
264
+ }
265
+
266
+ const filePath = trimQueryString(resolvedId);
267
+ const isCjs = filePath.endsWith('.cjs') || (!filePath.endsWith('.mjs') && !resolvedIdIsEsmModule(filePath));
268
+
269
+ if (isCjs) {
270
+ const named = getCjsNamedExports(filePath);
271
+ if (named.length > 0) {
272
+ return `export { default, ${named.join(', ')} } from ${JSON.stringify(specifier)};\n`;
273
+ }
274
+ }
275
+ return `export * from ${JSON.stringify(specifier)};\n`;
276
+ },
277
+
278
+ // After bundling, map each specifier to the URL of its emitted chunk.
279
+ generateBundle() {
280
+ if (importMapIsDev) {
281
+ return;
282
+ }
283
+
284
+ imports = Object.fromEntries(
285
+ modules
286
+ .filter((specifier) => chunkRefIds[specifier] !== undefined)
287
+ .map((specifier) => [specifier, `${base}${this.getFileName(chunkRefIds[specifier])}`]),
288
+ );
289
+ },
290
+ },
291
+
292
+ // Phase 2: Inject the import map into the HTML as a <script type="importmap"> tag.
293
+ {
294
+ name: 'import-map:transform-index-html',
295
+ enforce: 'post',
296
+ transformIndexHtml(html: string) {
297
+ const tags = [
298
+ {
299
+ tag: 'script',
300
+ attrs: {
301
+ type: 'importmap',
302
+ },
303
+ children: JSON.stringify({ imports }, null, 2),
304
+ },
305
+ ];
306
+
307
+ return {
308
+ html,
309
+ tags,
310
+ };
311
+ },
312
+ },
313
+ ];
314
+ };
@@ -0,0 +1,6 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export * from './composer-plugin';
6
+ export * from './import-map-plugin';
@@ -0,0 +1,29 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ /**
6
+ * Packages shared between the Composer host app and remote plugins.
7
+ * The host provides these via import map so plugins don't bundle their own copies.
8
+ * Used as the default list for both `importMapPlugin` (host) and `composerPlugin` (plugin).
9
+ */
10
+ export const DEFAULT_PACKAGES = [
11
+ '@dxos/app-framework',
12
+ '@dxos/app-graph',
13
+ '@dxos/app-toolkit',
14
+ '@dxos/client',
15
+ '@dxos/client-protocol',
16
+ '@dxos/client-services',
17
+ '@dxos/config',
18
+ '@dxos/echo',
19
+ '@dxos/lit-ui',
20
+ '@dxos/react-client',
21
+ '@dxos/react-ui',
22
+ '@dxos/schema',
23
+ '@dxos/ui-theme',
24
+ '@effect/platform',
25
+ 'effect',
26
+ 'lit',
27
+ 'react',
28
+ 'react-dom',
29
+ ];
package/tsconfig.json CHANGED
@@ -15,13 +15,13 @@
15
15
  "path": "../../common/debug"
16
16
  },
17
17
  {
18
- "path": "../../common/invariant"
18
+ "path": "../../common/effect"
19
19
  },
20
20
  {
21
- "path": "../../common/keys"
21
+ "path": "../../common/errors"
22
22
  },
23
23
  {
24
- "path": "../../common/local-storage"
24
+ "path": "../../common/invariant"
25
25
  },
26
26
  {
27
27
  "path": "../../common/log"
@@ -33,52 +33,37 @@
33
33
  "path": "../../common/storybook-utils"
34
34
  },
35
35
  {
36
- "path": "../../common/util"
36
+ "path": "../../common/test-utils"
37
37
  },
38
38
  {
39
- "path": "../../core/ai"
39
+ "path": "../../common/util"
40
40
  },
41
41
  {
42
- "path": "../../core/assistant"
42
+ "path": "../../common/web-context"
43
43
  },
44
44
  {
45
- "path": "../../core/blueprints"
45
+ "path": "../../common/web-context-react"
46
46
  },
47
47
  {
48
48
  "path": "../../core/echo/echo"
49
49
  },
50
50
  {
51
- "path": "../../core/echo/echo-signals"
51
+ "path": "../../core/echo/echo-db"
52
52
  },
53
53
  {
54
- "path": "../../core/echo/live-object"
54
+ "path": "../../core/operation"
55
55
  },
56
56
  {
57
- "path": "../../core/functions"
57
+ "path": "../../ui/react-primitives/react-error-boundary"
58
58
  },
59
59
  {
60
- "path": "../../ui/primitives/react-hooks"
60
+ "path": "../../ui/react-primitives/react-hooks"
61
61
  },
62
62
  {
63
63
  "path": "../../ui/react-ui"
64
64
  },
65
65
  {
66
- "path": "../../ui/react-ui-syntax-highlighter"
67
- },
68
- {
69
- "path": "../../ui/react-ui-theme"
70
- },
71
- {
72
- "path": "../app-graph"
73
- },
74
- {
75
- "path": "../client-protocol"
76
- },
77
- {
78
- "path": "../schema"
79
- },
80
- {
81
- "path": "../types"
66
+ "path": "../../ui/ui-theme"
82
67
  }
83
68
  ]
84
69
  }
@@ -2,10 +2,8 @@
2
2
  "compilerOptions": {
3
3
  "composite": true,
4
4
  "module": "ESNext",
5
- "moduleResolution": "Node",
5
+ "moduleResolution": "Bundler",
6
6
  "allowSyntheticDefaultImports": true
7
7
  },
8
- "include": [
9
- "vite.config.ts"
10
- ]
8
+ "include": ["vite.config.ts"]
11
9
  }
package/typedoc.json CHANGED
@@ -1,7 +1,5 @@
1
1
  {
2
2
  "$schema": "https://typedoc.org/schema.json",
3
3
  "includeVersion": true,
4
- "entryPoints": [
5
- "src/index.ts"
6
- ]
7
- }
4
+ "entryPoints": ["src/index.ts"]
5
+ }
package/vitest.config.ts CHANGED
@@ -9,6 +9,6 @@ import { createConfig } from '../../../vitest.base.config';
9
9
 
10
10
  export default createConfig({
11
11
  dirname: typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)),
12
- node: true,
12
+ node: { environment: 'jsdom' },
13
13
  storybook: true,
14
14
  });