@dxos/app-framework 0.8.4-main.f9ba587 → 0.8.4-main.fcc0d83b33

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 (727) hide show
  1. package/.storybook/main.mts +9 -0
  2. package/.storybook/preview.mts +8 -0
  3. package/dist/lib/browser/capability-FU2RXY4V.mjs +38 -0
  4. package/dist/lib/browser/capability-FU2RXY4V.mjs.map +7 -0
  5. package/dist/lib/browser/capability-UZNIX34E.mjs +35 -0
  6. package/dist/lib/browser/capability-UZNIX34E.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-2F5RSEOR.mjs +80 -0
  8. package/dist/lib/browser/chunk-2F5RSEOR.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-2FUSTGNO.mjs +828 -0
  10. package/dist/lib/browser/chunk-2FUSTGNO.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-45CHLTBV.mjs +34 -0
  12. package/dist/lib/browser/chunk-45CHLTBV.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-5GNRIKCE.mjs +42 -0
  14. package/dist/lib/browser/chunk-5GNRIKCE.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-66IXTIVK.mjs +48 -0
  16. package/dist/lib/browser/chunk-66IXTIVK.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-ASHDB736.mjs +584 -0
  18. package/dist/lib/browser/chunk-ASHDB736.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-EV4VOV4X.mjs +142 -0
  20. package/dist/lib/browser/chunk-EV4VOV4X.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-FJ4765WW.mjs +8 -0
  22. package/dist/lib/browser/chunk-FJ4765WW.mjs.map +7 -0
  23. package/dist/lib/browser/chunk-G7SDBRKH.mjs +1 -0
  24. package/dist/lib/browser/chunk-GUJTQEK7.mjs +140 -0
  25. package/dist/lib/browser/chunk-GUJTQEK7.mjs.map +7 -0
  26. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  27. package/dist/lib/browser/chunk-TZGMTFCT.mjs +79 -0
  28. package/dist/lib/browser/chunk-TZGMTFCT.mjs.map +7 -0
  29. package/dist/lib/browser/chunk-UNGY3SDY.mjs +354 -0
  30. package/dist/lib/browser/chunk-UNGY3SDY.mjs.map +7 -0
  31. package/dist/lib/browser/chunk-WSKPCXZC.mjs +467 -0
  32. package/dist/lib/browser/chunk-WSKPCXZC.mjs.map +7 -0
  33. package/dist/lib/browser/cli/index.mjs +74 -0
  34. package/dist/lib/browser/cli/index.mjs.map +7 -0
  35. package/dist/lib/browser/common/activation-events.mjs +24 -0
  36. package/dist/lib/browser/common/capabilities.mjs +46 -0
  37. package/dist/lib/browser/core/activation-event.mjs +20 -0
  38. package/dist/lib/browser/core/activation-event.mjs.map +7 -0
  39. package/dist/lib/browser/core/capability.mjs +30 -0
  40. package/dist/lib/browser/core/capability.mjs.map +7 -0
  41. package/dist/lib/browser/core/plugin-manager.mjs +15 -0
  42. package/dist/lib/browser/core/plugin-manager.mjs.map +7 -0
  43. package/dist/lib/browser/core/plugin.mjs +29 -0
  44. package/dist/lib/browser/core/plugin.mjs.map +7 -0
  45. package/dist/lib/browser/core/url-loader.mjs +20 -0
  46. package/dist/lib/browser/core/url-loader.mjs.map +7 -0
  47. package/dist/lib/browser/index.mjs +95 -156
  48. package/dist/lib/browser/index.mjs.map +4 -4
  49. package/dist/lib/browser/invoker-capability-GQJP42KT.mjs +43 -0
  50. package/dist/lib/browser/invoker-capability-GQJP42KT.mjs.map +7 -0
  51. package/dist/lib/browser/meta.json +1 -1
  52. package/dist/lib/browser/testing/index.mjs +232 -51
  53. package/dist/lib/browser/testing/index.mjs.map +4 -4
  54. package/dist/lib/browser/testing/react.mjs +78 -0
  55. package/dist/lib/browser/testing/react.mjs.map +7 -0
  56. package/dist/lib/browser/ui/index.mjs +48 -0
  57. package/dist/lib/browser/ui/index.mjs.map +7 -0
  58. package/dist/lib/node-esm/capability-4URDTXWH.mjs +36 -0
  59. package/dist/lib/node-esm/capability-4URDTXWH.mjs.map +7 -0
  60. package/dist/lib/node-esm/capability-HLUG6SDI.mjs +39 -0
  61. package/dist/lib/node-esm/capability-HLUG6SDI.mjs.map +7 -0
  62. package/dist/lib/node-esm/chunk-37Z53PXZ.mjs +10 -0
  63. package/dist/lib/node-esm/chunk-37Z53PXZ.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-6XW6LET6.mjs +35 -0
  65. package/dist/lib/node-esm/chunk-6XW6LET6.mjs.map +7 -0
  66. package/dist/lib/node-esm/chunk-ATESWMED.mjs +585 -0
  67. package/dist/lib/node-esm/chunk-ATESWMED.mjs.map +7 -0
  68. package/dist/lib/node-esm/chunk-FZLRFRYV.mjs +81 -0
  69. package/dist/lib/node-esm/chunk-FZLRFRYV.mjs.map +7 -0
  70. package/dist/lib/node-esm/chunk-GLBO7FJP.mjs +141 -0
  71. package/dist/lib/node-esm/chunk-GLBO7FJP.mjs.map +7 -0
  72. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  73. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  74. package/dist/lib/node-esm/chunk-IEAO4CAC.mjs +829 -0
  75. package/dist/lib/node-esm/chunk-IEAO4CAC.mjs.map +7 -0
  76. package/dist/lib/node-esm/chunk-KLDFWTG3.mjs +355 -0
  77. package/dist/lib/node-esm/chunk-KLDFWTG3.mjs.map +7 -0
  78. package/dist/lib/node-esm/chunk-MEX6YYWJ.mjs +43 -0
  79. package/dist/lib/node-esm/chunk-MEX6YYWJ.mjs.map +7 -0
  80. package/dist/lib/node-esm/chunk-OZ7DZA5Z.mjs +2 -0
  81. package/dist/lib/node-esm/chunk-OZ7DZA5Z.mjs.map +7 -0
  82. package/dist/lib/node-esm/chunk-TC5FX6VR.mjs +80 -0
  83. package/dist/lib/node-esm/chunk-TC5FX6VR.mjs.map +7 -0
  84. package/dist/lib/node-esm/chunk-X7AFIYKJ.mjs +143 -0
  85. package/dist/lib/node-esm/chunk-X7AFIYKJ.mjs.map +7 -0
  86. package/dist/lib/node-esm/chunk-XOCUANHO.mjs +49 -0
  87. package/dist/lib/node-esm/chunk-XOCUANHO.mjs.map +7 -0
  88. package/dist/lib/node-esm/chunk-Y7QUMO53.mjs +468 -0
  89. package/dist/lib/node-esm/chunk-Y7QUMO53.mjs.map +7 -0
  90. package/dist/lib/node-esm/cli/index.mjs +75 -0
  91. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  92. package/dist/lib/node-esm/common/activation-events.mjs +25 -0
  93. package/dist/lib/node-esm/common/activation-events.mjs.map +7 -0
  94. package/dist/lib/node-esm/common/capabilities.mjs +47 -0
  95. package/dist/lib/node-esm/common/capabilities.mjs.map +7 -0
  96. package/dist/lib/node-esm/core/activation-event.mjs +21 -0
  97. package/dist/lib/node-esm/core/activation-event.mjs.map +7 -0
  98. package/dist/lib/node-esm/core/capability.mjs +31 -0
  99. package/dist/lib/node-esm/core/capability.mjs.map +7 -0
  100. package/dist/lib/node-esm/core/plugin-manager.mjs +16 -0
  101. package/dist/lib/node-esm/core/plugin-manager.mjs.map +7 -0
  102. package/dist/lib/node-esm/core/plugin.mjs +30 -0
  103. package/dist/lib/node-esm/core/plugin.mjs.map +7 -0
  104. package/dist/lib/node-esm/core/url-loader.mjs +21 -0
  105. package/dist/lib/node-esm/core/url-loader.mjs.map +7 -0
  106. package/dist/lib/node-esm/index.mjs +95 -156
  107. package/dist/lib/node-esm/index.mjs.map +4 -4
  108. package/dist/lib/node-esm/invoker-capability-O4OTEP24.mjs +44 -0
  109. package/dist/lib/node-esm/invoker-capability-O4OTEP24.mjs.map +7 -0
  110. package/dist/lib/node-esm/meta.json +1 -1
  111. package/dist/lib/node-esm/testing/index.mjs +232 -51
  112. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  113. package/dist/lib/node-esm/testing/react.mjs +79 -0
  114. package/dist/lib/node-esm/testing/react.mjs.map +7 -0
  115. package/dist/lib/node-esm/ui/index.mjs +49 -0
  116. package/dist/lib/node-esm/ui/index.mjs.map +7 -0
  117. package/dist/plugin/node-esm/index.mjs +819 -0
  118. package/dist/plugin/node-esm/index.mjs.map +7 -0
  119. package/dist/plugin/node-esm/meta.json +1 -0
  120. package/dist/types/src/cli/cli.d.ts +39 -0
  121. package/dist/types/src/cli/cli.d.ts.map +1 -0
  122. package/dist/types/src/cli/index.d.ts +2 -0
  123. package/dist/types/src/cli/index.d.ts.map +1 -0
  124. package/dist/types/src/common/activation-events.d.ts +27 -0
  125. package/dist/types/src/common/activation-events.d.ts.map +1 -0
  126. package/dist/types/src/common/capabilities.d.ts +109 -121
  127. package/dist/types/src/common/capabilities.d.ts.map +1 -1
  128. package/dist/types/src/common/index.d.ts +4 -8
  129. package/dist/types/src/common/index.d.ts.map +1 -1
  130. package/dist/types/src/common/operations.d.ts +19 -0
  131. package/dist/types/src/common/operations.d.ts.map +1 -0
  132. package/dist/types/src/common/translations.d.ts +8 -8
  133. package/dist/types/src/common/translations.d.ts.map +1 -1
  134. package/dist/types/src/context.d.ts +5 -0
  135. package/dist/types/src/context.d.ts.map +1 -0
  136. package/dist/types/src/core/{events.d.ts → activation-event.d.ts} +11 -11
  137. package/dist/types/src/core/activation-event.d.ts.map +1 -0
  138. package/dist/types/src/core/capability-manager.d.ts +48 -0
  139. package/dist/types/src/core/capability-manager.d.ts.map +1 -0
  140. package/dist/types/src/core/capability-manager.test.d.ts +2 -0
  141. package/dist/types/src/core/capability-manager.test.d.ts.map +1 -0
  142. package/dist/types/src/core/capability.d.ts +156 -0
  143. package/dist/types/src/core/capability.d.ts.map +1 -0
  144. package/dist/types/src/core/index.d.ts +8 -4
  145. package/dist/types/src/core/index.d.ts.map +1 -1
  146. package/dist/types/src/core/plugin-asset-cache.d.ts +71 -0
  147. package/dist/types/src/core/plugin-asset-cache.d.ts.map +1 -0
  148. package/dist/types/src/core/plugin-manager.d.ts +84 -0
  149. package/dist/types/src/core/plugin-manager.d.ts.map +1 -0
  150. package/dist/types/src/core/plugin-manager.test.d.ts +2 -0
  151. package/dist/types/src/core/plugin-manager.test.d.ts.map +1 -0
  152. package/dist/types/src/core/plugin-manifest.d.ts +76 -0
  153. package/dist/types/src/core/plugin-manifest.d.ts.map +1 -0
  154. package/dist/types/src/core/plugin-manifest.test.d.ts +2 -0
  155. package/dist/types/src/core/plugin-manifest.test.d.ts.map +1 -0
  156. package/dist/types/src/core/plugin.d.ts +128 -37
  157. package/dist/types/src/core/plugin.d.ts.map +1 -1
  158. package/dist/types/src/core/url-loader.d.ts +101 -0
  159. package/dist/types/src/core/url-loader.d.ts.map +1 -0
  160. package/dist/types/src/core/url-loader.test.d.ts +2 -0
  161. package/dist/types/src/core/url-loader.test.d.ts.map +1 -0
  162. package/dist/types/src/helpers.d.ts.map +1 -1
  163. package/dist/types/src/index.d.ts +3 -4
  164. package/dist/types/src/index.d.ts.map +1 -1
  165. package/dist/types/src/plugin-operation/OperationPlugin.d.ts +3 -0
  166. package/dist/types/src/plugin-operation/OperationPlugin.d.ts.map +1 -0
  167. package/dist/types/src/plugin-operation/history/capability.d.ts +7 -0
  168. package/dist/types/src/plugin-operation/history/capability.d.ts.map +1 -0
  169. package/dist/types/src/plugin-operation/history/errors.d.ts +32 -0
  170. package/dist/types/src/plugin-operation/history/errors.d.ts.map +1 -0
  171. package/dist/types/src/plugin-operation/history/history-tracker.d.ts +18 -0
  172. package/dist/types/src/plugin-operation/history/history-tracker.d.ts.map +1 -0
  173. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts +2 -0
  174. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts.map +1 -0
  175. package/dist/types/src/plugin-operation/history/index.d.ts +6 -0
  176. package/dist/types/src/plugin-operation/history/index.d.ts.map +1 -0
  177. package/dist/types/src/plugin-operation/history/types.d.ts +13 -0
  178. package/dist/types/src/plugin-operation/history/types.d.ts.map +1 -0
  179. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts +101 -0
  180. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +1 -0
  181. package/dist/types/src/plugin-operation/history/undo-registry.d.ts +23 -0
  182. package/dist/types/src/plugin-operation/history/undo-registry.d.ts.map +1 -0
  183. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts +2 -0
  184. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts.map +1 -0
  185. package/dist/types/src/plugin-operation/index.d.ts +3 -0
  186. package/dist/types/src/plugin-operation/index.d.ts.map +1 -0
  187. package/dist/types/src/plugin-operation/invoker-capability.d.ts +6 -0
  188. package/dist/types/src/plugin-operation/invoker-capability.d.ts.map +1 -0
  189. package/dist/types/src/plugin-operation/meta.d.ts +3 -0
  190. package/dist/types/src/plugin-operation/meta.d.ts.map +1 -0
  191. package/dist/types/src/plugin-operation/testing.d.ts +58 -0
  192. package/dist/types/src/plugin-operation/testing.d.ts.map +1 -0
  193. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts +3 -0
  194. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts.map +1 -0
  195. package/dist/types/src/plugin-runtime/capability.d.ts +6 -0
  196. package/dist/types/src/plugin-runtime/capability.d.ts.map +1 -0
  197. package/dist/types/src/plugin-runtime/index.d.ts +2 -0
  198. package/dist/types/src/plugin-runtime/index.d.ts.map +1 -0
  199. package/dist/types/src/plugin-runtime/meta.d.ts +3 -0
  200. package/dist/types/src/plugin-runtime/meta.d.ts.map +1 -0
  201. package/dist/types/src/testing/harness.d.ts +67 -0
  202. package/dist/types/src/testing/harness.d.ts.map +1 -0
  203. package/dist/types/src/testing/index.d.ts +2 -0
  204. package/dist/types/src/testing/index.d.ts.map +1 -1
  205. package/dist/types/src/testing/react.d.ts +27 -0
  206. package/dist/types/src/testing/react.d.ts.map +1 -0
  207. package/dist/types/src/testing/react.test.d.ts +2 -0
  208. package/dist/types/src/testing/react.test.d.ts.map +1 -0
  209. package/dist/types/src/testing/service.d.ts +8 -0
  210. package/dist/types/src/testing/service.d.ts.map +1 -0
  211. package/dist/types/src/testing/withPluginManager.d.ts +11 -10
  212. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  213. package/dist/types/src/testing/withPluginManager.stories.d.ts +9 -3
  214. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
  215. package/dist/types/src/ui/components/App/App.d.ts +9 -0
  216. package/dist/types/src/ui/components/App/App.d.ts.map +1 -0
  217. package/dist/types/src/ui/components/App/App.stories.d.ts +19 -0
  218. package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -0
  219. package/dist/types/src/ui/components/App/index.d.ts +2 -0
  220. package/dist/types/src/ui/components/App/index.d.ts.map +1 -0
  221. package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts +64 -0
  222. package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts.map +1 -0
  223. package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts +19 -0
  224. package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts.map +1 -0
  225. package/dist/types/src/ui/components/Placeholder/index.d.ts +2 -0
  226. package/dist/types/src/ui/components/Placeholder/index.d.ts.map +1 -0
  227. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts +13 -0
  228. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -0
  229. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts +10 -0
  230. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts.map +1 -0
  231. package/dist/types/src/ui/components/PluginManager/index.d.ts +2 -0
  232. package/dist/types/src/ui/components/PluginManager/index.d.ts.map +1 -0
  233. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +24 -0
  234. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -0
  235. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts +14 -0
  236. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -0
  237. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts +11 -0
  238. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +1 -0
  239. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts +48 -0
  240. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts.map +1 -0
  241. package/dist/types/src/ui/components/Surface/context.d.ts +5 -0
  242. package/dist/types/src/ui/components/Surface/context.d.ts.map +1 -0
  243. package/dist/types/src/ui/components/Surface/index.d.ts +36 -0
  244. package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -0
  245. package/dist/types/src/ui/components/Surface/types.d.ts +197 -0
  246. package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -0
  247. package/dist/types/src/ui/components/Surface/types.test.d.ts +2 -0
  248. package/dist/types/src/ui/components/Surface/types.test.d.ts.map +1 -0
  249. package/dist/types/src/ui/components/index.d.ts +5 -0
  250. package/dist/types/src/ui/components/index.d.ts.map +1 -0
  251. package/dist/types/src/ui/hooks/index.d.ts +6 -0
  252. package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
  253. package/dist/types/src/ui/hooks/useApp.d.ts +88 -0
  254. package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -0
  255. package/dist/types/src/ui/hooks/useApp.test.d.ts +2 -0
  256. package/dist/types/src/ui/hooks/useApp.test.d.ts.map +1 -0
  257. package/dist/types/src/ui/hooks/useCapabilities.d.ts +31 -0
  258. package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -0
  259. package/dist/types/src/ui/hooks/useLoading.d.ts +18 -0
  260. package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
  261. package/dist/types/src/ui/hooks/useSettingsState.d.ts +10 -0
  262. package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -0
  263. package/dist/types/src/ui/hooks/useSurface.d.ts +3 -0
  264. package/dist/types/src/ui/hooks/useSurface.d.ts.map +1 -0
  265. package/dist/types/src/ui/index.d.ts +3 -0
  266. package/dist/types/src/ui/index.d.ts.map +1 -0
  267. package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts +34 -0
  268. package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts.map +1 -0
  269. package/dist/types/src/vite-plugin/boot-loader/index.d.ts +52 -0
  270. package/dist/types/src/vite-plugin/boot-loader/index.d.ts.map +1 -0
  271. package/dist/types/src/vite-plugin/composer/index.d.ts +34 -0
  272. package/dist/types/src/vite-plugin/composer/index.d.ts.map +1 -0
  273. package/dist/types/src/vite-plugin/import-map/index.d.ts +16 -0
  274. package/dist/types/src/vite-plugin/import-map/index.d.ts.map +1 -0
  275. package/dist/types/src/vite-plugin/index.d.ts +5 -0
  276. package/dist/types/src/vite-plugin/index.d.ts.map +1 -0
  277. package/dist/types/src/vite-plugin/manifest.d.ts +37 -0
  278. package/dist/types/src/vite-plugin/manifest.d.ts.map +1 -0
  279. package/dist/types/src/vite-plugin/manifest.test.d.ts +2 -0
  280. package/dist/types/src/vite-plugin/manifest.test.d.ts.map +1 -0
  281. package/dist/types/src/vite-plugin/packages.d.ts +13 -0
  282. package/dist/types/src/vite-plugin/packages.d.ts.map +1 -0
  283. package/dist/types/tsconfig.tsbuildinfo +1 -1
  284. package/moon.yml +26 -3
  285. package/package.json +113 -52
  286. package/src/cli/cli.ts +107 -0
  287. package/src/{playground/layout → cli}/index.ts +1 -1
  288. package/src/common/activation-events.ts +44 -0
  289. package/src/common/capabilities.ts +168 -109
  290. package/src/common/index.ts +4 -8
  291. package/src/common/operations.ts +35 -0
  292. package/src/common/translations.ts +18 -10
  293. package/src/context.ts +9 -0
  294. package/src/core/{events.ts → activation-event.ts} +10 -7
  295. package/src/core/capability-manager.test.ts +151 -0
  296. package/src/core/capability-manager.ts +192 -0
  297. package/src/core/capability.ts +247 -0
  298. package/src/core/index.ts +8 -4
  299. package/src/core/plugin-asset-cache.ts +60 -0
  300. package/src/core/plugin-manager.test.ts +1142 -0
  301. package/src/core/plugin-manager.ts +932 -0
  302. package/src/core/plugin-manifest.test.ts +48 -0
  303. package/src/core/plugin-manifest.ts +102 -0
  304. package/src/core/plugin.ts +266 -43
  305. package/src/core/url-loader.test.ts +178 -0
  306. package/src/core/url-loader.ts +308 -0
  307. package/src/helpers.test.ts +1 -1
  308. package/src/index.ts +3 -4
  309. package/src/plugin-operation/OperationPlugin.ts +24 -0
  310. package/src/plugin-operation/history/capability.ts +36 -0
  311. package/src/plugin-operation/history/errors.ts +7 -0
  312. package/src/plugin-operation/history/history-tracker.test.ts +373 -0
  313. package/src/plugin-operation/history/history-tracker.ts +128 -0
  314. package/src/plugin-operation/history/index.ts +9 -0
  315. package/src/plugin-operation/history/types.ts +17 -0
  316. package/src/plugin-operation/history/undo-mapping.ts +135 -0
  317. package/src/plugin-operation/history/undo-registry.test.ts +72 -0
  318. package/src/plugin-operation/history/undo-registry.ts +54 -0
  319. package/src/plugin-operation/index.ts +6 -0
  320. package/src/plugin-operation/invoker-capability.ts +54 -0
  321. package/src/plugin-operation/meta.ts +11 -0
  322. package/src/plugin-operation/testing.ts +154 -0
  323. package/src/plugin-runtime/RuntimePlugin.ts +19 -0
  324. package/src/plugin-runtime/capability.ts +53 -0
  325. package/src/plugin-runtime/index.ts +5 -0
  326. package/src/plugin-runtime/meta.ts +11 -0
  327. package/src/testing/harness.ts +229 -0
  328. package/src/testing/index.ts +2 -0
  329. package/src/testing/react.test.tsx +48 -0
  330. package/src/testing/react.tsx +113 -0
  331. package/src/testing/service.ts +52 -0
  332. package/src/testing/withPluginManager.stories.tsx +15 -12
  333. package/src/testing/withPluginManager.tsx +78 -54
  334. package/src/ui/components/App/App.stories.tsx +92 -0
  335. package/src/ui/components/App/App.tsx +81 -0
  336. package/src/{playground/logger → ui/components/App}/index.ts +1 -1
  337. package/src/ui/components/Placeholder/Placeholder.stories.tsx +77 -0
  338. package/src/ui/components/Placeholder/Placeholder.tsx +155 -0
  339. package/src/{playground/debug → ui/components/Placeholder}/index.ts +1 -1
  340. package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +185 -0
  341. package/src/{react → ui/components/PluginManager}/PluginManagerProvider.ts +3 -3
  342. package/src/ui/components/PluginManager/index.ts +5 -0
  343. package/src/ui/components/Surface/SurfaceComponent.stories.tsx +144 -0
  344. package/src/ui/components/Surface/SurfaceComponent.tsx +303 -0
  345. package/src/ui/components/Surface/SurfaceInfo.tsx +107 -0
  346. package/src/ui/components/Surface/SurfaceProfilerContext.tsx +207 -0
  347. package/src/ui/components/Surface/context.ts +12 -0
  348. package/src/ui/components/Surface/index.ts +54 -0
  349. package/src/ui/components/Surface/types.test.ts +126 -0
  350. package/src/ui/components/Surface/types.ts +269 -0
  351. package/src/ui/components/index.ts +8 -0
  352. package/src/ui/hooks/index.ts +9 -0
  353. package/src/ui/hooks/useApp.test.tsx +159 -0
  354. package/src/ui/hooks/useApp.tsx +413 -0
  355. package/src/ui/hooks/useCapabilities.ts +67 -0
  356. package/src/ui/hooks/useLoading.tsx +76 -0
  357. package/src/ui/hooks/useSettingsState.ts +26 -0
  358. package/src/ui/hooks/useSurface.ts +13 -0
  359. package/src/ui/index.ts +6 -0
  360. package/src/vite-plugin/boot-loader/BootLoader.stories.tsx +263 -0
  361. package/src/vite-plugin/boot-loader/boot-loader.css +294 -0
  362. package/src/vite-plugin/boot-loader/boot-loader.js +274 -0
  363. package/src/vite-plugin/boot-loader/index.ts +112 -0
  364. package/src/vite-plugin/composer/index.ts +277 -0
  365. package/src/vite-plugin/import-map/index.ts +499 -0
  366. package/src/vite-plugin/index.ts +10 -0
  367. package/src/vite-plugin/manifest.test.ts +24 -0
  368. package/src/vite-plugin/manifest.ts +50 -0
  369. package/src/vite-plugin/packages.ts +188 -0
  370. package/tsconfig.json +18 -22
  371. package/tsconfig.node.json +2 -4
  372. package/typedoc.json +2 -4
  373. package/vitest.config.ts +8 -6
  374. package/.eslintrc.cjs +0 -9
  375. package/.swc/plugins/v7_linux_x86_64_13.0.0/f45bdff002284d9e8f9ef3f0be909de12da36c049cbcf261ac78fc00abb09a2d +0 -0
  376. package/.swc/plugins/v7_linux_x86_64_13.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429 +0 -0
  377. package/dist/lib/browser/app-graph-builder-BGGXLD6T.mjs +0 -137
  378. package/dist/lib/browser/app-graph-builder-BGGXLD6T.mjs.map +0 -7
  379. package/dist/lib/browser/chunk-2636QSIK.mjs +0 -1518
  380. package/dist/lib/browser/chunk-2636QSIK.mjs.map +0 -7
  381. package/dist/lib/browser/chunk-DHZB7HG7.mjs +0 -413
  382. package/dist/lib/browser/chunk-DHZB7HG7.mjs.map +0 -7
  383. package/dist/lib/browser/chunk-ORWHM7CO.mjs +0 -32
  384. package/dist/lib/browser/chunk-ORWHM7CO.mjs.map +0 -7
  385. package/dist/lib/browser/intent-dispatcher-TWKB22NI.mjs +0 -11
  386. package/dist/lib/browser/intent-resolver-O67UANYP.mjs +0 -39
  387. package/dist/lib/browser/intent-resolver-O67UANYP.mjs.map +0 -7
  388. package/dist/lib/browser/store-LFKDWHUQ.mjs +0 -30
  389. package/dist/lib/browser/store-LFKDWHUQ.mjs.map +0 -7
  390. package/dist/lib/browser/worker.mjs +0 -79
  391. package/dist/lib/node-esm/app-graph-builder-QHIJUYYW.mjs +0 -138
  392. package/dist/lib/node-esm/app-graph-builder-QHIJUYYW.mjs.map +0 -7
  393. package/dist/lib/node-esm/chunk-NJAFK626.mjs +0 -414
  394. package/dist/lib/node-esm/chunk-NJAFK626.mjs.map +0 -7
  395. package/dist/lib/node-esm/chunk-UMZQERLE.mjs +0 -34
  396. package/dist/lib/node-esm/chunk-UMZQERLE.mjs.map +0 -7
  397. package/dist/lib/node-esm/chunk-VSKRV3NW.mjs +0 -1520
  398. package/dist/lib/node-esm/chunk-VSKRV3NW.mjs.map +0 -7
  399. package/dist/lib/node-esm/intent-dispatcher-5PRM3KGH.mjs +0 -12
  400. package/dist/lib/node-esm/intent-resolver-K3D4BXQQ.mjs +0 -40
  401. package/dist/lib/node-esm/intent-resolver-K3D4BXQQ.mjs.map +0 -7
  402. package/dist/lib/node-esm/store-53XDUBMD.mjs +0 -31
  403. package/dist/lib/node-esm/store-53XDUBMD.mjs.map +0 -7
  404. package/dist/lib/node-esm/worker.mjs +0 -80
  405. package/dist/types/src/App.d.ts +0 -43
  406. package/dist/types/src/App.d.ts.map +0 -1
  407. package/dist/types/src/common/collaboration.d.ts +0 -19
  408. package/dist/types/src/common/collaboration.d.ts.map +0 -1
  409. package/dist/types/src/common/events.d.ts +0 -52
  410. package/dist/types/src/common/events.d.ts.map +0 -1
  411. package/dist/types/src/common/file.d.ts +0 -14
  412. package/dist/types/src/common/file.d.ts.map +0 -1
  413. package/dist/types/src/common/graph.d.ts +0 -21
  414. package/dist/types/src/common/graph.d.ts.map +0 -1
  415. package/dist/types/src/common/layout.d.ts +0 -281
  416. package/dist/types/src/common/layout.d.ts.map +0 -1
  417. package/dist/types/src/common/surface.d.ts +0 -65
  418. package/dist/types/src/common/surface.d.ts.map +0 -1
  419. package/dist/types/src/core/capabilities.d.ts +0 -114
  420. package/dist/types/src/core/capabilities.d.ts.map +0 -1
  421. package/dist/types/src/core/capabilities.test.d.ts +0 -2
  422. package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
  423. package/dist/types/src/core/events.d.ts.map +0 -1
  424. package/dist/types/src/core/manager.d.ts +0 -122
  425. package/dist/types/src/core/manager.d.ts.map +0 -1
  426. package/dist/types/src/core/manager.test.d.ts +0 -2
  427. package/dist/types/src/core/manager.test.d.ts.map +0 -1
  428. package/dist/types/src/playground/debug/Debug.d.ts +0 -6
  429. package/dist/types/src/playground/debug/Debug.d.ts.map +0 -1
  430. package/dist/types/src/playground/debug/index.d.ts +0 -2
  431. package/dist/types/src/playground/debug/index.d.ts.map +0 -1
  432. package/dist/types/src/playground/debug/plugin.d.ts +0 -2
  433. package/dist/types/src/playground/debug/plugin.d.ts.map +0 -1
  434. package/dist/types/src/playground/generator/Main.d.ts +0 -6
  435. package/dist/types/src/playground/generator/Main.d.ts.map +0 -1
  436. package/dist/types/src/playground/generator/Toolbar.d.ts +0 -6
  437. package/dist/types/src/playground/generator/Toolbar.d.ts.map +0 -1
  438. package/dist/types/src/playground/generator/generator.d.ts +0 -7
  439. package/dist/types/src/playground/generator/generator.d.ts.map +0 -1
  440. package/dist/types/src/playground/generator/index.d.ts +0 -3
  441. package/dist/types/src/playground/generator/index.d.ts.map +0 -1
  442. package/dist/types/src/playground/generator/plugin.d.ts +0 -2
  443. package/dist/types/src/playground/generator/plugin.d.ts.map +0 -1
  444. package/dist/types/src/playground/layout/Layout.d.ts +0 -8
  445. package/dist/types/src/playground/layout/Layout.d.ts.map +0 -1
  446. package/dist/types/src/playground/layout/index.d.ts +0 -2
  447. package/dist/types/src/playground/layout/index.d.ts.map +0 -1
  448. package/dist/types/src/playground/layout/plugin.d.ts +0 -2
  449. package/dist/types/src/playground/layout/plugin.d.ts.map +0 -1
  450. package/dist/types/src/playground/logger/Toolbar.d.ts +0 -6
  451. package/dist/types/src/playground/logger/Toolbar.d.ts.map +0 -1
  452. package/dist/types/src/playground/logger/index.d.ts +0 -2
  453. package/dist/types/src/playground/logger/index.d.ts.map +0 -1
  454. package/dist/types/src/playground/logger/plugin.d.ts +0 -2
  455. package/dist/types/src/playground/logger/plugin.d.ts.map +0 -1
  456. package/dist/types/src/playground/logger/schema.d.ts +0 -13
  457. package/dist/types/src/playground/logger/schema.d.ts.map +0 -1
  458. package/dist/types/src/playground/playground.stories.d.ts +0 -10
  459. package/dist/types/src/playground/playground.stories.d.ts.map +0 -1
  460. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +0 -2
  461. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +0 -1
  462. package/dist/types/src/plugin-intent/actions.d.ts +0 -38
  463. package/dist/types/src/plugin-intent/actions.d.ts.map +0 -1
  464. package/dist/types/src/plugin-intent/errors.d.ts +0 -16
  465. package/dist/types/src/plugin-intent/errors.d.ts.map +0 -1
  466. package/dist/types/src/plugin-intent/index.d.ts +0 -5
  467. package/dist/types/src/plugin-intent/index.d.ts.map +0 -1
  468. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +0 -139
  469. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +0 -1
  470. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +0 -2
  471. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +0 -1
  472. package/dist/types/src/plugin-intent/intent.d.ts +0 -63
  473. package/dist/types/src/plugin-intent/intent.d.ts.map +0 -1
  474. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +0 -2
  475. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +0 -1
  476. package/dist/types/src/plugin-settings/actions.d.ts +0 -27
  477. package/dist/types/src/plugin-settings/actions.d.ts.map +0 -1
  478. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +0 -4
  479. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +0 -1
  480. package/dist/types/src/plugin-settings/index.d.ts +0 -3
  481. package/dist/types/src/plugin-settings/index.d.ts.map +0 -1
  482. package/dist/types/src/plugin-settings/intent-resolver.d.ts +0 -4
  483. package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +0 -1
  484. package/dist/types/src/plugin-settings/store.d.ts +0 -5
  485. package/dist/types/src/plugin-settings/store.d.ts.map +0 -1
  486. package/dist/types/src/plugin-settings/translations.d.ts +0 -10
  487. package/dist/types/src/plugin-settings/translations.d.ts.map +0 -1
  488. package/dist/types/src/react/ErrorBoundary.d.ts +0 -31
  489. package/dist/types/src/react/ErrorBoundary.d.ts.map +0 -1
  490. package/dist/types/src/react/IntentContext.d.ts +0 -8
  491. package/dist/types/src/react/IntentContext.d.ts.map +0 -1
  492. package/dist/types/src/react/PluginManagerProvider.d.ts +0 -10
  493. package/dist/types/src/react/PluginManagerProvider.d.ts.map +0 -1
  494. package/dist/types/src/react/Surface.d.ts +0 -12
  495. package/dist/types/src/react/Surface.d.ts.map +0 -1
  496. package/dist/types/src/react/Surface.stories.d.ts +0 -16
  497. package/dist/types/src/react/Surface.stories.d.ts.map +0 -1
  498. package/dist/types/src/react/common.d.ts +0 -13
  499. package/dist/types/src/react/common.d.ts.map +0 -1
  500. package/dist/types/src/react/index.d.ts +0 -7
  501. package/dist/types/src/react/index.d.ts.map +0 -1
  502. package/dist/types/src/react/useCapabilities.d.ts +0 -13
  503. package/dist/types/src/react/useCapabilities.d.ts.map +0 -1
  504. package/dist/types/src/react/useIntentResolver.d.ts +0 -3
  505. package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
  506. package/dist/types/src/worker.d.ts +0 -4
  507. package/dist/types/src/worker.d.ts.map +0 -1
  508. package/src/App.tsx +0 -276
  509. package/src/common/collaboration.ts +0 -21
  510. package/src/common/events.ts +0 -77
  511. package/src/common/file.ts +0 -22
  512. package/src/common/graph.ts +0 -30
  513. package/src/common/layout.ts +0 -278
  514. package/src/common/surface.ts +0 -86
  515. package/src/core/capabilities.test.ts +0 -136
  516. package/src/core/capabilities.ts +0 -254
  517. package/src/core/manager.test.ts +0 -515
  518. package/src/core/manager.ts +0 -519
  519. package/src/playground/debug/Debug.tsx +0 -39
  520. package/src/playground/debug/plugin.ts +0 -17
  521. package/src/playground/generator/Main.tsx +0 -71
  522. package/src/playground/generator/Toolbar.tsx +0 -46
  523. package/src/playground/generator/generator.ts +0 -48
  524. package/src/playground/generator/index.ts +0 -6
  525. package/src/playground/generator/plugin.ts +0 -23
  526. package/src/playground/layout/Layout.tsx +0 -33
  527. package/src/playground/layout/plugin.ts +0 -17
  528. package/src/playground/logger/Toolbar.tsx +0 -29
  529. package/src/playground/logger/plugin.ts +0 -36
  530. package/src/playground/logger/schema.ts +0 -12
  531. package/src/playground/playground.stories.tsx +0 -42
  532. package/src/plugin-intent/IntentPlugin.ts +0 -20
  533. package/src/plugin-intent/actions.ts +0 -33
  534. package/src/plugin-intent/errors.ts +0 -39
  535. package/src/plugin-intent/index.ts +0 -8
  536. package/src/plugin-intent/intent-dispatcher.test.ts +0 -279
  537. package/src/plugin-intent/intent-dispatcher.ts +0 -333
  538. package/src/plugin-intent/intent.ts +0 -154
  539. package/src/plugin-settings/SettingsPlugin.ts +0 -35
  540. package/src/plugin-settings/actions.ts +0 -29
  541. package/src/plugin-settings/app-graph-builder.ts +0 -157
  542. package/src/plugin-settings/index.ts +0 -6
  543. package/src/plugin-settings/intent-resolver.ts +0 -34
  544. package/src/plugin-settings/store.ts +0 -33
  545. package/src/plugin-settings/translations.ts +0 -19
  546. package/src/react/ErrorBoundary.tsx +0 -45
  547. package/src/react/IntentContext.tsx +0 -34
  548. package/src/react/Surface.stories.tsx +0 -96
  549. package/src/react/Surface.tsx +0 -77
  550. package/src/react/common.ts +0 -12
  551. package/src/react/index.ts +0 -10
  552. package/src/react/useCapabilities.ts +0 -30
  553. package/src/react/useIntentResolver.ts +0 -22
  554. package/src/worker.ts +0 -11
  555. package/typedoc/.nojekyll +0 -1
  556. package/typedoc/assets/hierarchy.js +0 -1
  557. package/typedoc/assets/highlight.css +0 -106
  558. package/typedoc/assets/icons.js +0 -18
  559. package/typedoc/assets/icons.svg +0 -1
  560. package/typedoc/assets/main.js +0 -60
  561. package/typedoc/assets/navigation.js +0 -1
  562. package/typedoc/assets/search.js +0 -1
  563. package/typedoc/assets/style.css +0 -1640
  564. package/typedoc/classes/CollaborationActions.InsertContent.html +0 -421
  565. package/typedoc/classes/ErrorBoundary.html +0 -125
  566. package/typedoc/classes/IntentAction.ShowUndo.html +0 -227
  567. package/typedoc/classes/IntentAction.Track.html +0 -266
  568. package/typedoc/classes/LayoutAction.AddToast.html +0 -265
  569. package/typedoc/classes/LayoutAction.Close.html +0 -382
  570. package/typedoc/classes/LayoutAction.Expose.html +0 -265
  571. package/typedoc/classes/LayoutAction.Open.html +0 -1123
  572. package/typedoc/classes/LayoutAction.RevertWorkspace.html +0 -343
  573. package/typedoc/classes/LayoutAction.ScrollIntoView.html +0 -460
  574. package/typedoc/classes/LayoutAction.Set.html +0 -460
  575. package/typedoc/classes/LayoutAction.SetLayoutMode.html +0 -499
  576. package/typedoc/classes/LayoutAction.SwitchWorkspace.html +0 -265
  577. package/typedoc/classes/LayoutAction.UpdateComplementary.html +0 -616
  578. package/typedoc/classes/LayoutAction.UpdateDialog.html +0 -1123
  579. package/typedoc/classes/LayoutAction.UpdateLayout.html +0 -461
  580. package/typedoc/classes/LayoutAction.UpdatePopover.html +0 -1435
  581. package/typedoc/classes/LayoutAction.UpdateSidebar.html +0 -616
  582. package/typedoc/classes/Plugin.html +0 -6
  583. package/typedoc/classes/PluginContext.html +0 -38
  584. package/typedoc/classes/PluginManager.html +0 -43
  585. package/typedoc/classes/PluginModule.html +0 -18
  586. package/typedoc/classes/SettingsAction.Open.html +0 -226
  587. package/typedoc/classes/SettingsAction.OpenPluginRegistry.html +0 -265
  588. package/typedoc/functions/Events.createStateEvent.html +0 -2
  589. package/typedoc/functions/IntentPlugin.html +0 -1
  590. package/typedoc/functions/SettingsPlugin.html +0 -1
  591. package/typedoc/functions/allOf.html +0 -2
  592. package/typedoc/functions/chain.html +0 -3
  593. package/typedoc/functions/contributes.html +0 -2
  594. package/typedoc/functions/createDispatcher.html +0 -3
  595. package/typedoc/functions/createIntent.html +0 -6
  596. package/typedoc/functions/createResolver.html +0 -2
  597. package/typedoc/functions/createSurface.html +0 -2
  598. package/typedoc/functions/defineCapability.html +0 -2
  599. package/typedoc/functions/defineEvent.html +0 -2
  600. package/typedoc/functions/defineModule.html +0 -2
  601. package/typedoc/functions/definePlugin.html +0 -2
  602. package/typedoc/functions/eventKey.html +0 -2
  603. package/typedoc/functions/getEvents.html +0 -2
  604. package/typedoc/functions/isAllOf.html +0 -2
  605. package/typedoc/functions/isOneOf.html +0 -2
  606. package/typedoc/functions/isSurfaceAvailable.html +0 -2
  607. package/typedoc/functions/lazy.html +0 -2
  608. package/typedoc/functions/oneOf.html +0 -2
  609. package/typedoc/functions/useApp.html +0 -6
  610. package/typedoc/functions/useAppGraph.html +0 -1
  611. package/typedoc/functions/useCapabilities.html +0 -3
  612. package/typedoc/functions/useCapability.html +0 -4
  613. package/typedoc/functions/useIntentDispatcher.html +0 -1
  614. package/typedoc/functions/useIntentResolver.html +0 -1
  615. package/typedoc/functions/useLayout.html +0 -1
  616. package/typedoc/functions/usePluginManager.html +0 -2
  617. package/typedoc/hierarchy.html +0 -1
  618. package/typedoc/index.html +0 -12
  619. package/typedoc/interfaces/LayoutAction.Toast.html +0 -10
  620. package/typedoc/media/LICENSE +0 -8
  621. package/typedoc/modules/Capabilities.html +0 -1
  622. package/typedoc/modules/CollaborationActions.html +0 -1
  623. package/typedoc/modules/Events.html +0 -1
  624. package/typedoc/modules/IntentAction.html +0 -1
  625. package/typedoc/modules/LayoutAction.html +0 -2
  626. package/typedoc/modules/SettingsAction.html +0 -1
  627. package/typedoc/modules.html +0 -1
  628. package/typedoc/types/ActivationEvent.html +0 -8
  629. package/typedoc/types/ActivationEvents.html +0 -2
  630. package/typedoc/types/AnyCapability.html +0 -1
  631. package/typedoc/types/AnyIntent.html +0 -1
  632. package/typedoc/types/AnyIntentChain.html +0 -1
  633. package/typedoc/types/AnyIntentEffectResult.html +0 -1
  634. package/typedoc/types/AnyIntentResolver.html +0 -1
  635. package/typedoc/types/AnyIntentResult.html +0 -1
  636. package/typedoc/types/Capabilities.FileUploader.html +0 -1
  637. package/typedoc/types/Capabilities.IntentResolver.html +0 -1
  638. package/typedoc/types/Capabilities.Layout.html +0 -1
  639. package/typedoc/types/Capabilities.Metadata.html +0 -1
  640. package/typedoc/types/Capabilities.ReactContext.html +0 -1
  641. package/typedoc/types/Capabilities.ReactRoot.html +0 -1
  642. package/typedoc/types/Capabilities.ReactSurface.html +0 -1
  643. package/typedoc/types/Capabilities.Settings.html +0 -4
  644. package/typedoc/types/Capability.html +0 -9
  645. package/typedoc/types/CreateAppOptions.html +0 -10
  646. package/typedoc/types/FileInfo.html +0 -1
  647. package/typedoc/types/Intent.html +0 -10
  648. package/typedoc/types/IntentChain.html +0 -6
  649. package/typedoc/types/IntentContext.html +0 -5
  650. package/typedoc/types/IntentData.html +0 -1
  651. package/typedoc/types/IntentDispatcher.html +0 -2
  652. package/typedoc/types/IntentDispatcherResult.html +0 -2
  653. package/typedoc/types/IntentEffectDefinition.html +0 -2
  654. package/typedoc/types/IntentEffectResult.html +0 -15
  655. package/typedoc/types/IntentParams.html +0 -3
  656. package/typedoc/types/IntentResolver.html +0 -2
  657. package/typedoc/types/IntentResultData.html +0 -1
  658. package/typedoc/types/IntentSchema.html +0 -1
  659. package/typedoc/types/IntentUndo.html +0 -2
  660. package/typedoc/types/InterfaceDef.html +0 -4
  661. package/typedoc/types/Label.html +0 -1
  662. package/typedoc/types/NodeSerializer.html +0 -8
  663. package/typedoc/types/PluginManagerOptions.html +0 -6
  664. package/typedoc/types/PluginMeta.html +0 -21
  665. package/typedoc/types/PromiseIntentDispatcher.html +0 -2
  666. package/typedoc/types/PromiseIntentUndo.html +0 -2
  667. package/typedoc/types/Resource.html +0 -1
  668. package/typedoc/types/ResourceKey.html +0 -1
  669. package/typedoc/types/ResourceLanguage.html +0 -1
  670. package/typedoc/types/SerializedNode.html +0 -4
  671. package/typedoc/types/SurfaceComponent.html +0 -2
  672. package/typedoc/types/SurfaceDefinition.html +0 -2
  673. package/typedoc/types/SurfaceProps.html +0 -4
  674. package/typedoc/variables/Capabilities.AnchorSort.html +0 -1
  675. package/typedoc/variables/Capabilities.AppGraph.html +0 -1
  676. package/typedoc/variables/Capabilities.AppGraphBuilder.html +0 -1
  677. package/typedoc/variables/Capabilities.AppGraphSerializer.html +0 -1
  678. package/typedoc/variables/Capabilities.ArtifactDefinition.html +0 -1
  679. package/typedoc/variables/Capabilities.FileUploader.html +0 -1
  680. package/typedoc/variables/Capabilities.IntentDispatcher.html +0 -1
  681. package/typedoc/variables/Capabilities.IntentResolver.html +0 -1
  682. package/typedoc/variables/Capabilities.Layout.html +0 -1
  683. package/typedoc/variables/Capabilities.Metadata.html +0 -1
  684. package/typedoc/variables/Capabilities.Null.html +0 -1
  685. package/typedoc/variables/Capabilities.PluginManager.html +0 -1
  686. package/typedoc/variables/Capabilities.ReactContext.html +0 -1
  687. package/typedoc/variables/Capabilities.ReactRoot.html +0 -1
  688. package/typedoc/variables/Capabilities.ReactSurface.html +0 -1
  689. package/typedoc/variables/Capabilities.RxRegistry.html +0 -1
  690. package/typedoc/variables/Capabilities.Settings.html +0 -1
  691. package/typedoc/variables/Capabilities.SettingsStore.html +0 -1
  692. package/typedoc/variables/Capabilities.Tools.html +0 -1
  693. package/typedoc/variables/Capabilities.Translations.html +0 -1
  694. package/typedoc/variables/Events.AppGraphReady.html +0 -2
  695. package/typedoc/variables/Events.DispatcherReady.html +0 -2
  696. package/typedoc/variables/Events.LayoutReady.html +0 -1
  697. package/typedoc/variables/Events.SettingsReady.html +0 -2
  698. package/typedoc/variables/Events.SetupAppGraph.html +0 -2
  699. package/typedoc/variables/Events.SetupArtifactDefinition.html +0 -2
  700. package/typedoc/variables/Events.SetupIntentResolver.html +0 -2
  701. package/typedoc/variables/Events.SetupMetadata.html +0 -2
  702. package/typedoc/variables/Events.SetupReactSurface.html +0 -2
  703. package/typedoc/variables/Events.SetupSettings.html +0 -2
  704. package/typedoc/variables/Events.SetupTranslations.html +0 -2
  705. package/typedoc/variables/Events.Startup.html +0 -2
  706. package/typedoc/variables/FileInfoSchema.html +0 -1
  707. package/typedoc/variables/INTENT_ACTION.html +0 -1
  708. package/typedoc/variables/INTENT_PLUGIN.html +0 -1
  709. package/typedoc/variables/LAYOUT_ACTION.html +0 -1
  710. package/typedoc/variables/LAYOUT_PLUGIN.html +0 -1
  711. package/typedoc/variables/Label.html +0 -1
  712. package/typedoc/variables/LayoutAction.Toast.html +0 -1
  713. package/typedoc/variables/LayoutAction.UPDATE_LAYOUT.html +0 -1
  714. package/typedoc/variables/PluginManagerProvider.html +0 -2
  715. package/typedoc/variables/Resource.html +0 -2
  716. package/typedoc/variables/ResourceKey.html +0 -1
  717. package/typedoc/variables/ResourceLanguage.html +0 -1
  718. package/typedoc/variables/SETTINGS_ACTION.html +0 -1
  719. package/typedoc/variables/SETTINGS_ID.html +0 -1
  720. package/typedoc/variables/SETTINGS_KEY.html +0 -1
  721. package/typedoc/variables/SETTINGS_PLUGIN.html +0 -1
  722. package/typedoc/variables/Surface.html +0 -2
  723. package/typedoc/variables/defaultFileTypes.html +0 -1
  724. /package/dist/lib/browser/{intent-dispatcher-TWKB22NI.mjs.map → chunk-G7SDBRKH.mjs.map} +0 -0
  725. /package/dist/lib/browser/{worker.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  726. /package/dist/lib/{node-esm/intent-dispatcher-5PRM3KGH.mjs.map → browser/common/activation-events.mjs.map} +0 -0
  727. /package/dist/lib/{node-esm/worker.mjs.map → browser/common/capabilities.mjs.map} +0 -0
@@ -0,0 +1,178 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { assert, describe, it } from '@effect/vitest';
6
+ import * as Effect from 'effect/Effect';
7
+
8
+ import { runAndForwardErrors } from '@dxos/effect';
9
+
10
+ import * as Plugin from './plugin';
11
+ import * as PluginAssetCache from './plugin-asset-cache';
12
+ import * as UrlLoader from './url-loader';
13
+
14
+ const testMeta = { id: 'org.dxos.plugin.test', name: 'Test' };
15
+
16
+ const memoryStorage = (initial: string | null = null): UrlLoader.Storage => {
17
+ let value = initial;
18
+ return {
19
+ get: () => value,
20
+ set: (_key, next) => {
21
+ value = next;
22
+ },
23
+ };
24
+ };
25
+
26
+ type CacheCall = { method: 'cache' | 'evict' | 'resolve'; pluginId: string; urls?: readonly string[]; url?: string };
27
+
28
+ const recordingCache = (): { cache: PluginAssetCache.Cache; calls: CacheCall[] } => {
29
+ const calls: CacheCall[] = [];
30
+ return {
31
+ calls,
32
+ cache: {
33
+ cache: (pluginId, urls) =>
34
+ Effect.sync(() => {
35
+ calls.push({ method: 'cache', pluginId, urls });
36
+ }),
37
+ evict: (pluginId) =>
38
+ Effect.sync(() => {
39
+ calls.push({ method: 'evict', pluginId });
40
+ }),
41
+ resolve: (pluginId, url) =>
42
+ Effect.sync(() => {
43
+ calls.push({ method: 'resolve', pluginId, url });
44
+ return url;
45
+ }),
46
+ list: () => Effect.succeed([] as readonly string[]),
47
+ },
48
+ };
49
+ };
50
+
51
+ describe('UrlLoader', () => {
52
+ describe('isLocalUrl', () => {
53
+ it('matches localhost, 127.0.0.1, and ::1', ({ expect }) => {
54
+ expect(UrlLoader.isLocalUrl('http://localhost:5173/plugin.mjs')).toBe(true);
55
+ expect(UrlLoader.isLocalUrl('https://LOCALHOST/plugin.mjs')).toBe(true);
56
+ expect(UrlLoader.isLocalUrl('http://127.0.0.1:8080/plugin.mjs')).toBe(true);
57
+ expect(UrlLoader.isLocalUrl('http://[::1]:8080/plugin.mjs')).toBe(true);
58
+ });
59
+
60
+ it('rejects public and malformed URLs', ({ expect }) => {
61
+ expect(UrlLoader.isLocalUrl('https://example.com/plugin.mjs')).toBe(false);
62
+ expect(UrlLoader.isLocalUrl('https://192.168.1.10/plugin.mjs')).toBe(false);
63
+ expect(UrlLoader.isLocalUrl('not a url')).toBe(false);
64
+ expect(UrlLoader.isLocalUrl('')).toBe(false);
65
+ });
66
+ });
67
+
68
+ describe('getRemoteEntries', () => {
69
+ it('returns persisted entries from storage', ({ expect }) => {
70
+ const storage: UrlLoader.Storage = {
71
+ get: () => '[{"id":"p1","url":"http://localhost:5173/p.mjs"}]',
72
+ set: () => {},
73
+ };
74
+ expect(UrlLoader.getRemoteEntries({ storage })).toEqual([{ id: 'p1', url: 'http://localhost:5173/p.mjs' }]);
75
+ });
76
+
77
+ it('returns an empty array when storage is empty or malformed', ({ expect }) => {
78
+ const empty: UrlLoader.Storage = { get: () => null, set: () => {} };
79
+ const malformed: UrlLoader.Storage = { get: () => '{not json', set: () => {} };
80
+ expect(UrlLoader.getRemoteEntries({ storage: empty })).toEqual([]);
81
+ expect(UrlLoader.getRemoteEntries({ storage: malformed })).toEqual([]);
82
+ });
83
+ });
84
+
85
+ describe('make', () => {
86
+ it.effect('resolves built-in plugins by meta.id', () =>
87
+ Effect.gen(function* () {
88
+ const testPlugin = Plugin.make(Plugin.define(testMeta))();
89
+ const loader = UrlLoader.make([testPlugin]);
90
+ const result = yield* loader(testMeta.id);
91
+ assert.strictEqual(result.meta.id, testMeta.id);
92
+ }),
93
+ );
94
+
95
+ it.effect('fails for unknown non-URL locator', () =>
96
+ Effect.gen(function* () {
97
+ const loader = UrlLoader.make([]);
98
+ const exit = yield* Effect.exit(loader('not-a-url'));
99
+ assert.isTrue(exit._tag === 'Failure');
100
+ }),
101
+ );
102
+ });
103
+
104
+ describe('preload', () => {
105
+ it('returns empty array when storage has no entries', async ({ expect }) => {
106
+ const storage: UrlLoader.Storage = {
107
+ get: () => null,
108
+ set: () => {},
109
+ };
110
+ const result = await runAndForwardErrors(UrlLoader.preload({ storage }));
111
+ expect(result).toEqual([]);
112
+ });
113
+
114
+ it('returns empty array when storage has invalid JSON', async ({ expect }) => {
115
+ const storage: UrlLoader.Storage = {
116
+ get: () => '{{invalid json',
117
+ set: () => {},
118
+ };
119
+ const result = await runAndForwardErrors(UrlLoader.preload({ storage }));
120
+ expect(result).toEqual([]);
121
+ });
122
+
123
+ it('returns empty array when storage contains null', async ({ expect }) => {
124
+ const storage: UrlLoader.Storage = {
125
+ get: () => 'null',
126
+ set: () => {},
127
+ };
128
+ const result = await runAndForwardErrors(UrlLoader.preload({ storage }));
129
+ expect(result).toEqual([]);
130
+ });
131
+
132
+ it('returns empty array when storage contains an object', async ({ expect }) => {
133
+ const storage: UrlLoader.Storage = {
134
+ get: () => '{}',
135
+ set: () => {},
136
+ };
137
+ const result = await runAndForwardErrors(UrlLoader.preload({ storage }));
138
+ expect(result).toEqual([]);
139
+ });
140
+
141
+ it('returns empty array when entries are missing required fields', async ({ expect }) => {
142
+ const storage: UrlLoader.Storage = {
143
+ get: () => '[{"title":"no url"}]',
144
+ set: () => {},
145
+ };
146
+ const result = await runAndForwardErrors(UrlLoader.preload({ storage }));
147
+ expect(result).toEqual([]);
148
+ });
149
+ });
150
+
151
+ describe('uninstall', () => {
152
+ it('removes the persisted entry and evicts cached assets', async ({ expect }) => {
153
+ const storage = memoryStorage('[{"id":"p1","url":"https://x/p1.json"},{"id":"p2","url":"https://x/p2.json"}]');
154
+ const { cache, calls } = recordingCache();
155
+ await runAndForwardErrors(UrlLoader.uninstall('p1', { storage, cache }));
156
+ expect(UrlLoader.getRemoteEntries({ storage })).toEqual([{ id: 'p2', url: 'https://x/p2.json' }]);
157
+ expect(calls).toEqual([{ method: 'evict', pluginId: 'p1' }]);
158
+ });
159
+
160
+ it('still removes entry when cache eviction fails', async ({ expect }) => {
161
+ const storage = memoryStorage('[{"id":"p1","url":"https://x/p1.json"}]');
162
+ const cache: PluginAssetCache.Cache = {
163
+ cache: () => Effect.void,
164
+ evict: () =>
165
+ Effect.fail(
166
+ new PluginAssetCache.PluginAssetCacheError({
167
+ context: { operation: 'evict', pluginId: 'p1' },
168
+ cause: 'boom',
169
+ }),
170
+ ),
171
+ resolve: (_id, url) => Effect.succeed(url),
172
+ list: () => Effect.succeed([] as readonly string[]),
173
+ };
174
+ await runAndForwardErrors(UrlLoader.uninstall('p1', { storage, cache }));
175
+ expect(UrlLoader.getRemoteEntries({ storage })).toEqual([]);
176
+ });
177
+ });
178
+ });
@@ -0,0 +1,308 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+ import * as Option from 'effect/Option';
7
+
8
+ import { BaseError } from '@dxos/errors';
9
+ import { log } from '@dxos/log';
10
+
11
+ import * as Plugin from './plugin';
12
+ import * as PluginAssetCache from './plugin-asset-cache';
13
+ import * as PluginManifest from './plugin-manifest';
14
+
15
+ const DEFAULT_KEY = 'org.dxos.composer.remote-plugins';
16
+
17
+ /**
18
+ * Tagged error for any failure during remote plugin loading. Construction sites
19
+ * set `context.locator` and `context.reason` (one of `'invalid-locator' |
20
+ * 'manifest-error' | 'cache-error' | 'import-failed' | 'meta-missing' |
21
+ * 'meta-mismatch' | 'duplicate-id'`) so handlers can route on the failure mode.
22
+ */
23
+ export class RemotePluginLoadError extends BaseError.extend('RemotePluginLoadError', 'Failed to load remote plugin') {}
24
+
25
+ /**
26
+ * Abstraction over key-value storage (defaults to localStorage).
27
+ */
28
+ export type Storage = {
29
+ get(key: string): string | null;
30
+ set(key: string, value: string): void;
31
+ };
32
+
33
+ /**
34
+ * Options for configuring the URL loader.
35
+ */
36
+ export type Options = {
37
+ storage?: Storage;
38
+ key?: string;
39
+ /**
40
+ * Per-platform offline asset cache. Defaults to a no-op cache (no offline support).
41
+ */
42
+ cache?: PluginAssetCache.Cache;
43
+ };
44
+
45
+ /**
46
+ * Persisted record of a remote plugin that has been loaded previously.
47
+ *
48
+ * `url` is the URL of the plugin manifest (`plugin.json`), not the entry module.
49
+ */
50
+ export type RemotePluginEntry = {
51
+ id: string;
52
+ url: string;
53
+ };
54
+
55
+ const defaultStorage = (): Storage => ({
56
+ get: (key) => localStorage.getItem(key),
57
+ set: (key, value) => localStorage.setItem(key, value),
58
+ });
59
+
60
+ const getPersistedRemotePlugins = (storage: Storage, key: string): RemotePluginEntry[] => {
61
+ try {
62
+ const parsed: unknown = JSON.parse(storage.get(key) ?? '[]');
63
+ if (!Array.isArray(parsed)) {
64
+ return [];
65
+ }
66
+ return parsed.filter(
67
+ (entry): entry is RemotePluginEntry =>
68
+ typeof entry === 'object' && entry !== null && typeof entry.id === 'string' && typeof entry.url === 'string',
69
+ );
70
+ } catch {
71
+ return [];
72
+ }
73
+ };
74
+
75
+ const persistRemotePlugin = (storage: Storage, key: string, entry: RemotePluginEntry): void => {
76
+ try {
77
+ const entries = getPersistedRemotePlugins(storage, key).filter((existing) => existing.id !== entry.id);
78
+ entries.push(entry);
79
+ storage.set(key, JSON.stringify(entries));
80
+ } catch (error) {
81
+ log.warn('failed to persist remote plugin entry', { entry, error });
82
+ }
83
+ };
84
+
85
+ const removePersistedRemotePlugin = (storage: Storage, key: string, pluginId: string): void => {
86
+ try {
87
+ const entries = getPersistedRemotePlugins(storage, key).filter((existing) => existing.id !== pluginId);
88
+ storage.set(key, JSON.stringify(entries));
89
+ } catch (error) {
90
+ log.warn('failed to remove remote plugin entry', { pluginId, error });
91
+ }
92
+ };
93
+
94
+ const isUrl = (locator: string): boolean => {
95
+ try {
96
+ const url = new URL(locator);
97
+ return url.protocol === 'http:' || url.protocol === 'https:';
98
+ } catch {
99
+ return false;
100
+ }
101
+ };
102
+
103
+ /**
104
+ * Returns true when the URL's hostname is the local host (localhost, 127.0.0.1, or ::1).
105
+ */
106
+ export const isLocalUrl = (locator: string): boolean => {
107
+ try {
108
+ const hostname = new URL(locator).hostname.toLowerCase();
109
+ // WHATWG URL returns '::1' without brackets in Node; some browsers return '[::1]'.
110
+ return hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '::1' || hostname === '[::1]';
111
+ } catch {
112
+ return false;
113
+ }
114
+ };
115
+
116
+ /**
117
+ * Returns the list of remote plugin entries previously persisted by {@link make}.
118
+ * Useful for UI code that needs to know which loaded plugins were installed from a URL
119
+ * (e.g. to surface a tag on remote or localhost-hosted plugins).
120
+ */
121
+ export const getRemoteEntries = (options: Options = {}): readonly RemotePluginEntry[] => {
122
+ const storage = options.storage ?? defaultStorage();
123
+ const key = options.key ?? DEFAULT_KEY;
124
+ return getPersistedRemotePlugins(storage, key);
125
+ };
126
+
127
+ const normalizePluginExport = (mod: Record<string, unknown>): Plugin.Plugin => {
128
+ const exported = mod.default;
129
+ if (Plugin.isPlugin(exported)) {
130
+ return exported;
131
+ }
132
+ if (typeof exported === 'function') {
133
+ const result = (exported as () => unknown)();
134
+ if (Plugin.isPlugin(result)) {
135
+ return result;
136
+ }
137
+ }
138
+ throw new Error('Remote module default export is not a Plugin or a zero-arg plugin factory.');
139
+ };
140
+
141
+ /**
142
+ * Loads stylesheets declared in the manifest by appending `<link rel="stylesheet">` elements to the host document.
143
+ * Each link is tagged with `data-dxos-plugin-id` so `uninstall` can clean them up.
144
+ */
145
+ const loadStylesheets = (
146
+ manifest: PluginManifest.ResolvedManifest,
147
+ cache: PluginAssetCache.Cache,
148
+ ): Effect.Effect<void, PluginAssetCache.PluginAssetCacheError> =>
149
+ Effect.gen(function* () {
150
+ if (typeof document === 'undefined') {
151
+ return;
152
+ }
153
+ const cssUrls = manifest.assetUrls.filter((url) => url.endsWith('.css'));
154
+ for (const url of cssUrls) {
155
+ const resolved = yield* cache.resolve(manifest.id, url);
156
+ if (document.querySelector(`link[data-dxos-plugin-id="${manifest.id}"][href="${resolved}"]`)) {
157
+ continue;
158
+ }
159
+ const link = document.createElement('link');
160
+ link.rel = 'stylesheet';
161
+ link.href = resolved;
162
+ link.dataset.dxosPluginId = manifest.id;
163
+ document.head.appendChild(link);
164
+ }
165
+ });
166
+
167
+ const loadFromManifest = (
168
+ manifestUrl: string,
169
+ cache: PluginAssetCache.Cache,
170
+ ): Effect.Effect<{ plugin: Plugin.Plugin; manifest: PluginManifest.ResolvedManifest }, RemotePluginLoadError> =>
171
+ Effect.gen(function* () {
172
+ log.info('loading remote plugin', { manifestUrl });
173
+ const manifest = yield* PluginManifest.fetchManifest(manifestUrl).pipe(
174
+ Effect.mapError(
175
+ (cause) => new RemotePluginLoadError({ context: { locator: manifestUrl, reason: 'manifest-error' }, cause }),
176
+ ),
177
+ );
178
+ // Cache the manifest URL alongside its declared assets. Without it, `preload` on a
179
+ // subsequent reload would fetch the manifest from the network — and fail when the
180
+ // plugin's host is offline, dropping the plugin from the runtime.
181
+ const cachedUrls =
182
+ manifest.assetUrls.indexOf(manifestUrl) === -1 ? [manifestUrl, ...manifest.assetUrls] : manifest.assetUrls;
183
+ const wrapCacheError = Effect.mapError(
184
+ (cause: PluginAssetCache.PluginAssetCacheError) =>
185
+ new RemotePluginLoadError({ context: { locator: manifestUrl, reason: 'cache-error' }, cause }),
186
+ );
187
+ yield* cache.cache(manifest.id, cachedUrls).pipe(wrapCacheError);
188
+ const entryUrl = yield* cache.resolve(manifest.id, manifest.entryUrl).pipe(wrapCacheError);
189
+ const mod = yield* Effect.tryPromise({
190
+ try: () => import(/* @vite-ignore */ entryUrl),
191
+ catch: (cause) =>
192
+ new RemotePluginLoadError({ context: { locator: manifestUrl, reason: 'import-failed' }, cause }),
193
+ });
194
+ const plugin = normalizePluginExport(mod);
195
+ if (!plugin.meta.id || !plugin.meta.name) {
196
+ return yield* Effect.fail(
197
+ new RemotePluginLoadError({ context: { locator: manifestUrl, reason: 'meta-missing' } }),
198
+ );
199
+ }
200
+ if (plugin.meta.id !== manifest.id) {
201
+ return yield* Effect.fail(
202
+ new RemotePluginLoadError({
203
+ context: {
204
+ locator: manifestUrl,
205
+ reason: 'meta-mismatch',
206
+ metaId: plugin.meta.id,
207
+ manifestId: manifest.id,
208
+ },
209
+ }),
210
+ );
211
+ }
212
+ // Append stylesheets only after the entry imports cleanly and meta validation
213
+ // passes. If we did this earlier and the import or meta checks failed, the
214
+ // `<link>` tags would leak into the host DOM with no plugin to own their
215
+ // teardown — `uninstall` only runs for plugins the manager actually accepted.
216
+ yield* loadStylesheets(manifest, cache).pipe(wrapCacheError);
217
+ return { plugin, manifest };
218
+ });
219
+
220
+ /**
221
+ * Preloads previously persisted remote plugins from storage. Per-entry failures
222
+ * are logged and swallowed — the returned effect always succeeds with whichever
223
+ * plugins loaded cleanly, so a single bad entry can't block the host's startup.
224
+ */
225
+ export const preload = (options: Options = {}): Effect.Effect<Plugin.Plugin[], never> =>
226
+ Effect.gen(function* () {
227
+ const storage = options.storage ?? defaultStorage();
228
+ const key = options.key ?? DEFAULT_KEY;
229
+ const cache = options.cache ?? PluginAssetCache.noop();
230
+
231
+ const entries = getPersistedRemotePlugins(storage, key);
232
+ if (entries.length === 0) {
233
+ return [];
234
+ }
235
+ log.info('preloading remote plugins', { count: entries.length });
236
+ const results = yield* Effect.all(
237
+ entries.map((entry) =>
238
+ loadFromManifest(entry.url, cache).pipe(
239
+ Effect.tapError((error) => Effect.sync(() => log.warn('failed to preload remote plugin', { entry, error }))),
240
+ Effect.option,
241
+ ),
242
+ ),
243
+ { concurrency: 'unbounded' },
244
+ );
245
+ return results.flatMap((result) =>
246
+ Option.match(result, {
247
+ onNone: () => [],
248
+ onSome: ({ plugin }) => [plugin],
249
+ }),
250
+ );
251
+ });
252
+
253
+ /**
254
+ * Creates a plugin loader that resolves built-in plugins by ID or loads remote plugins from URLs.
255
+ *
256
+ * Remote URLs must point at a plugin manifest (`plugin.json`). The loader fetches the manifest,
257
+ * eagerly persists every declared asset via the configured `PluginAssetCache`, then dynamic-imports
258
+ * the entry module.
259
+ */
260
+ export const make = (builtinPlugins: Plugin.Plugin[], options: Options = {}) => {
261
+ const storage = options.storage ?? defaultStorage();
262
+ const key = options.key ?? DEFAULT_KEY;
263
+ const cache = options.cache ?? PluginAssetCache.noop();
264
+
265
+ return (locator: string): Effect.Effect<Plugin.Plugin, RemotePluginLoadError> =>
266
+ Effect.gen(function* () {
267
+ const builtin = builtinPlugins.find((plugin) => plugin.meta.id === locator);
268
+ if (builtin) {
269
+ return builtin;
270
+ }
271
+ if (!isUrl(locator)) {
272
+ return yield* Effect.fail(new RemotePluginLoadError({ context: { locator, reason: 'invalid-locator' } }));
273
+ }
274
+ const { plugin } = yield* loadFromManifest(locator, cache);
275
+ const duplicate = builtinPlugins.find((existing) => existing.meta.id === plugin.meta.id);
276
+ if (duplicate) {
277
+ return yield* Effect.fail(
278
+ new RemotePluginLoadError({ context: { locator, reason: 'duplicate-id', id: plugin.meta.id } }),
279
+ );
280
+ }
281
+ persistRemotePlugin(storage, key, { id: plugin.meta.id, url: locator });
282
+ return plugin;
283
+ });
284
+ };
285
+
286
+ /**
287
+ * Removes a previously installed remote plugin: drops the persisted entry, evicts cached
288
+ * assets, and removes any stylesheet `<link>` tags that {@link loadFromManifest} appended.
289
+ *
290
+ * Cache eviction failures are logged and swallowed — the persisted entry has already been
291
+ * dropped so the user-visible state is consistent regardless of whether the platform
292
+ * cache cooperated.
293
+ */
294
+ export const uninstall = (pluginId: string, options: Options = {}): Effect.Effect<void, never> =>
295
+ Effect.gen(function* () {
296
+ const storage = options.storage ?? defaultStorage();
297
+ const key = options.key ?? DEFAULT_KEY;
298
+ const cache = options.cache ?? PluginAssetCache.noop();
299
+
300
+ removePersistedRemotePlugin(storage, key, pluginId);
301
+ if (typeof document !== 'undefined') {
302
+ document.querySelectorAll(`link[data-dxos-plugin-id="${pluginId}"]`).forEach((node) => node.remove());
303
+ }
304
+ yield* cache.evict(pluginId).pipe(
305
+ Effect.tapError((error) => Effect.sync(() => log.warn('failed to evict plugin assets', { pluginId, error }))),
306
+ Effect.ignore,
307
+ );
308
+ });
@@ -2,7 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { describe, it, expect } from 'vitest';
5
+ import { describe, expect, it } from 'vitest';
6
6
 
7
7
  import { topologicalSort } from './helpers';
8
8
 
package/src/index.ts CHANGED
@@ -2,9 +2,8 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- export * from './App';
6
5
  export * from './common';
6
+ export * from './context';
7
7
  export * from './core';
8
- export * from './plugin-intent';
9
- export * from './plugin-settings';
10
- export * from './react';
8
+ export * from './plugin-operation';
9
+ export * from './plugin-runtime';
@@ -0,0 +1,24 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { ActivationEvents } from '../common';
6
+ import { Capability, Plugin } from '../core';
7
+ import { meta } from './meta';
8
+
9
+ const OperationInvoker = Capability.lazy('OperationInvoker', () => import('./invoker-capability'));
10
+ const HistoryCapabilities = Capability.lazy('HistoryCapabilities', () => import('./history/capability'));
11
+
12
+ export const OperationPlugin = Plugin.define(meta).pipe(
13
+ Plugin.addModule({
14
+ activatesOn: ActivationEvents.ManagedRuntimeReady,
15
+ firesBeforeActivation: [ActivationEvents.SetupOperationHandler],
16
+ firesAfterActivation: [ActivationEvents.OperationInvokerReady],
17
+ activate: OperationInvoker,
18
+ }),
19
+ Plugin.addModule({
20
+ activatesOn: ActivationEvents.OperationInvokerReady,
21
+ activate: HistoryCapabilities,
22
+ }),
23
+ Plugin.make,
24
+ );
@@ -0,0 +1,36 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { type OperationInvoker } from '@dxos/compute';
8
+
9
+ import { Capabilities } from '../../common';
10
+ import { Capability } from '../../core';
11
+ import * as HistoryTracker from './history-tracker';
12
+ import * as UndoRegistry from './undo-registry';
13
+
14
+ //
15
+ // Capability Module - contributes both UndoRegistry and HistoryTracker.
16
+ //
17
+
18
+ export default Capability.makeModule(
19
+ Effect.fnUntraced(function* () {
20
+ // Get the context for synchronous access in callbacks.
21
+ const capabilities = yield* Capability.Service;
22
+
23
+ // Create UndoRegistry.
24
+ const undoRegistry = UndoRegistry.make(() => capabilities.getAll(Capabilities.UndoMapping).flat());
25
+
26
+ // Create HistoryTracker (depends on UndoRegistry and OperationInvoker).
27
+ const invoker = yield* Capability.get(Capabilities.OperationInvoker);
28
+ // Cast to internal type - the factory always returns OperationInvokerInternal.
29
+ const historyTracker = HistoryTracker.make(invoker as OperationInvoker.OperationInvokerInternal, undoRegistry);
30
+
31
+ return [
32
+ Capability.contributes(Capabilities.UndoRegistry, undoRegistry),
33
+ Capability.contributes(Capabilities.HistoryTracker, historyTracker),
34
+ ];
35
+ }),
36
+ );
@@ -0,0 +1,7 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { BaseError } from '@dxos/errors';
6
+
7
+ export class EmptyHistoryError extends BaseError.extend('EmptyHistoryError', 'Cannot undo: history is empty.') {}