@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,48 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { describe, test } from 'vitest';
6
+
7
+ import * as PluginManifest from './plugin-manifest';
8
+
9
+ describe('PluginManifest', () => {
10
+ describe('parse', () => {
11
+ test('resolves entry and assets relative to manifest URL', ({ expect }) => {
12
+ const resolved = PluginManifest.parse('https://example.com/plugins/foo/manifest.json', {
13
+ id: 'com.example.foo',
14
+ name: 'Foo',
15
+ version: '1.0.0',
16
+ assets: ['index.mjs', 'style.css', 'chunks/lib-abc.js'],
17
+ });
18
+ expect(resolved.id).toBe('com.example.foo');
19
+ expect(resolved.entryUrl).toBe('https://example.com/plugins/foo/index.mjs');
20
+ expect(resolved.assetUrls).toEqual([
21
+ 'https://example.com/plugins/foo/index.mjs',
22
+ 'https://example.com/plugins/foo/style.css',
23
+ 'https://example.com/plugins/foo/chunks/lib-abc.js',
24
+ ]);
25
+ });
26
+
27
+ test('throws if the canonical entry filename is not listed in assets', ({ expect }) => {
28
+ expect(() =>
29
+ PluginManifest.parse('https://example.com/manifest.json', {
30
+ id: 'a',
31
+ name: 'A',
32
+ version: '0.0.1',
33
+ assets: ['style.css'],
34
+ }),
35
+ ).toThrow();
36
+ });
37
+
38
+ test('throws on missing required fields', ({ expect }) => {
39
+ expect(() =>
40
+ PluginManifest.parse('https://example.com/manifest.json', {
41
+ name: 'A',
42
+ version: '0.0.1',
43
+ assets: ['index.mjs'],
44
+ }),
45
+ ).toThrow();
46
+ });
47
+ });
48
+ });
@@ -0,0 +1,102 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import * as FetchHttpClient from '@effect/platform/FetchHttpClient';
6
+ import * as HttpClient from '@effect/platform/HttpClient';
7
+ import * as HttpClientRequest from '@effect/platform/HttpClientRequest';
8
+ import * as HttpClientResponse from '@effect/platform/HttpClientResponse';
9
+ import * as Effect from 'effect/Effect';
10
+ import * as Schema from 'effect/Schema';
11
+
12
+ import { BaseError } from '@dxos/errors';
13
+ import { PLUGIN_ENTRY_FILENAME } from '@dxos/protocols';
14
+
15
+ /**
16
+ * Tagged error for manifest fetch / parse failures. Construction sites set
17
+ * `context.manifestUrl` and `context.reason` (one of `'fetch-failed' |
18
+ * 'http-error' | 'parse-failed' | 'invalid'`) so handlers can route on the
19
+ * specific failure mode.
20
+ */
21
+ export class PluginManifestError extends BaseError.extend('PluginManifestError', 'Plugin manifest is invalid') {}
22
+
23
+ /**
24
+ * Schema for a third-party plugin manifest.
25
+ *
26
+ * The manifest is published as a sibling of the plugin's entry module
27
+ * ({@link PLUGIN_ENTRY_FILENAME}) and advertises every file the plugin needs at
28
+ * runtime so the host can eagerly cache them for offline use.
29
+ */
30
+ export const Manifest = Schema.Struct({
31
+ id: Schema.String,
32
+ name: Schema.String,
33
+ version: Schema.String,
34
+ assets: Schema.Array(Schema.String),
35
+ });
36
+
37
+ export type Manifest = Schema.Schema.Type<typeof Manifest>;
38
+
39
+ /**
40
+ * Resolved manifest with all asset paths converted to absolute URLs.
41
+ */
42
+ export type ResolvedManifest = {
43
+ id: string;
44
+ name: string;
45
+ version: string;
46
+ entryUrl: string;
47
+ assetUrls: readonly string[];
48
+ };
49
+
50
+ /**
51
+ * Resolves a parsed manifest's relative asset paths against the manifest's URL.
52
+ */
53
+ const resolve = (manifestUrl: string, manifest: Manifest): ResolvedManifest => ({
54
+ id: manifest.id,
55
+ name: manifest.name,
56
+ version: manifest.version,
57
+ entryUrl: new URL(PLUGIN_ENTRY_FILENAME, manifestUrl).toString(),
58
+ assetUrls: manifest.assets.map((asset) => new URL(asset, manifestUrl).toString()),
59
+ });
60
+
61
+ /**
62
+ * Synchronous decode + validate + resolve for an in-memory manifest payload. Used
63
+ * by tests and tooling that have the manifest body already loaded; the runtime
64
+ * path goes through {@link fetchManifest}.
65
+ */
66
+ export const parse = (manifestUrl: string, payload: unknown): ResolvedManifest => {
67
+ const manifest = Schema.decodeUnknownSync(Manifest)(payload);
68
+ if (!manifest.assets.includes(PLUGIN_ENTRY_FILENAME)) {
69
+ throw new Error(`Manifest at ${manifestUrl} does not list ${PLUGIN_ENTRY_FILENAME} in assets.`);
70
+ }
71
+ return resolve(manifestUrl, manifest);
72
+ };
73
+
74
+ /**
75
+ * Fetches and parses a manifest from the given URL via Effect's HTTP client and
76
+ * Schema-driven JSON decoding. All failure modes surface as a single tagged
77
+ * {@link PluginManifestError}; callers route on `error.context.reason`.
78
+ */
79
+ export const fetchManifest = (manifestUrl: string): Effect.Effect<ResolvedManifest, PluginManifestError> =>
80
+ Effect.gen(function* () {
81
+ const response = yield* HttpClientRequest.get(manifestUrl).pipe(
82
+ HttpClient.execute,
83
+ Effect.mapError((cause) => new PluginManifestError({ context: { manifestUrl, reason: 'fetch-failed' }, cause })),
84
+ );
85
+ if (response.status >= 400) {
86
+ return yield* Effect.fail(
87
+ new PluginManifestError({ context: { manifestUrl, reason: 'http-error', status: response.status } }),
88
+ );
89
+ }
90
+ const manifest = yield* HttpClientResponse.schemaBodyJson(Manifest)(response).pipe(
91
+ Effect.mapError((cause) => new PluginManifestError({ context: { manifestUrl, reason: 'parse-failed' }, cause })),
92
+ );
93
+ if (!manifest.assets.includes(PLUGIN_ENTRY_FILENAME)) {
94
+ return yield* Effect.fail(
95
+ new PluginManifestError({
96
+ context: { manifestUrl, reason: 'invalid' },
97
+ cause: `assets does not include ${PLUGIN_ENTRY_FILENAME}`,
98
+ }),
99
+ );
100
+ }
101
+ return resolve(manifestUrl, manifest);
102
+ }).pipe(Effect.scoped, Effect.provide(FetchHttpClient.layer));
@@ -2,12 +2,82 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { type MaybePromise } from '@dxos/util';
5
+ import * as Context from 'effect/Context';
6
+ import * as Effect from 'effect/Effect';
7
+ import * as Option from 'effect/Option';
8
+ import * as Pipeable from 'effect/Pipeable';
6
9
 
7
- import { type AnyCapability, type PluginContext } from './capabilities';
8
- import { type ActivationEvent, type ActivationEvents } from './events';
10
+ import { invariant } from '@dxos/invariant';
9
11
 
10
- interface PluginModuleInterface {
12
+ import type * as ActivationEvent from './activation-event';
13
+ import * as Capability from './capability';
14
+ import type * as PluginManager from './plugin-manager';
15
+
16
+ //
17
+ // Plugin Service Layer
18
+ //
19
+
20
+ /**
21
+ * Effect Context.Tag for accessing PluginManager via the Effect layer system.
22
+ * This allows lifecycle operations to access the plugin manager without having it passed as an argument.
23
+ */
24
+ export class Service extends Context.Tag('@dxos/app-framework/PluginManager')<Service, PluginManager.PluginManager>() {}
25
+
26
+ //
27
+ // Lifecycle Functions
28
+ //
29
+
30
+ /**
31
+ * Activates plugins based on the activation event.
32
+ * Accesses the PluginManager via the Effect layer system.
33
+ * @param event The activation event.
34
+ * @returns Whether the activation was successful.
35
+ */
36
+ export const activate = (event: ActivationEvent.ActivationEvent): Effect.Effect<boolean, Error, Service> =>
37
+ Effect.flatMap(Service, (manager) => manager.activate(event));
38
+
39
+ /**
40
+ * Re-activates the modules that were activated by the event.
41
+ * Accesses the PluginManager via the Effect layer system.
42
+ * @param event The activation event.
43
+ * @returns Whether the reset was successful.
44
+ */
45
+ export const reset = (event: ActivationEvent.ActivationEvent): Effect.Effect<boolean, Error, Service> =>
46
+ Effect.flatMap(Service, (manager) => manager.reset(event));
47
+
48
+ /**
49
+ * Shuts down the plugin manager, deactivating all active modules and clearing lifecycle state.
50
+ * Accesses the PluginManager via the Effect layer system.
51
+ */
52
+ export const shutdown = (): Effect.Effect<boolean, Error, Service> =>
53
+ Effect.flatMap(Service, (manager) => manager.shutdown());
54
+
55
+ /**
56
+ * Computes a module ID from plugin ID and export name.
57
+ */
58
+ const computeModuleId = (pluginId: string, moduleName: string): string => {
59
+ return `${pluginId}.module.${moduleName}`;
60
+ };
61
+
62
+ /**
63
+ * Identifier denoting a PluginModule.
64
+ */
65
+ export const PluginModuleTypeId: unique symbol = Symbol.for('@dxos/app-framework/PluginModule');
66
+ export type PluginModuleTypeId = typeof PluginModuleTypeId;
67
+
68
+ /**
69
+ * Type guard to check if a value is a PluginModule.
70
+ */
71
+ export const isPluginModule = (value: unknown): value is PluginModule => {
72
+ return typeof value === 'object' && value !== null && PluginModuleTypeId in value;
73
+ };
74
+
75
+ /**
76
+ * A unit of containment of modular functionality that can be provided to an application.
77
+ * Activation of a module is async allowing for code to split and loaded lazily.
78
+ */
79
+ export interface PluginModule {
80
+ readonly [PluginModuleTypeId]: PluginModuleTypeId;
11
81
  /**
12
82
  * Unique id of the module.
13
83
  */
@@ -16,63 +86,73 @@ interface PluginModuleInterface {
16
86
  /**
17
87
  * Events for which the module will be activated.
18
88
  */
19
- activatesOn: ActivationEvents;
89
+ activatesOn: ActivationEvent.Events;
20
90
 
21
91
  /**
22
- * Events which the plugin depends on being activated.
23
- * Plugin is marked as needing reset a plugin activated by a dependent event is removed.
24
- * Events are automatically activated before activation of the plugin.
92
+ * Events that this module fires *before* its own activation runs.
93
+ *
94
+ * When this module is asked to activate (via {@link activatesOn}), the
95
+ * plugin manager first activates every event listed here, ensuring any
96
+ * other modules that contribute to those events have completed before
97
+ * this module's {@link activate} body executes. These events are fired
98
+ * by the framework on this module's behalf — the module does not need
99
+ * to wait for some other code to fire them.
100
+ *
101
+ * The module is marked as needing reset if a module activated by one
102
+ * of these events is later removed.
103
+ *
104
+ * Read as: "this module fires these events before [its] activation".
25
105
  */
26
- activatesBefore?: ActivationEvent[];
106
+ firesBeforeActivation?: ActivationEvent.ActivationEvent[];
27
107
 
28
108
  /**
29
- * Events which this plugin triggers upon activation.
109
+ * Events that this module fires *after* its own activation completes.
110
+ *
111
+ * Once this module's {@link activate} body has finished executing, the
112
+ * plugin manager activates every event listed here, causing any modules
113
+ * listening on those events to run. These events are fired by the
114
+ * framework on this module's behalf as part of this module's lifecycle.
115
+ *
116
+ * Read as: "this module fires these events after [its] activation".
30
117
  */
31
- activatesAfter?: ActivationEvent[];
118
+ firesAfterActivation?: ActivationEvent.ActivationEvent[];
32
119
 
33
120
  /**
34
121
  * Called when the module is activated.
35
- * @param context The plugin context.
122
+ * CapabilityManager is accessed via the Effect layer system (Capability.Service).
123
+ * PluginManager is accessed via Plugin.Service.
124
+ * @param props Optional props passed to the module.
36
125
  * @returns The capabilities of the module.
37
126
  */
38
- activate: (
39
- context: PluginContext,
40
- ) => MaybePromise<AnyCapability | AnyCapability[]> | Promise<() => Promise<AnyCapability | AnyCapability[]>>;
127
+ activate: (props?: any) => Effect.Effect<Capability.ModuleReturn, Error, Capability.Service | Service | never>;
41
128
  }
42
129
 
43
- /**
44
- * A unit of containment of modular functionality that can be provided to an application.
45
- * Activation of a module is async allowing for code to split and loaded lazily.
46
- */
47
- // NOTE: This is implemented as a class to prevent it from being proxied by PluginManager state.
48
- export class PluginModule implements PluginModuleInterface {
49
- readonly id: PluginModuleInterface['id'];
50
- readonly activatesOn: PluginModuleInterface['activatesOn'];
51
- readonly activatesBefore?: PluginModuleInterface['activatesBefore'];
52
- readonly activatesAfter?: PluginModuleInterface['activatesAfter'];
53
- readonly activate: PluginModuleInterface['activate'];
130
+ export type PluginModuleOptions = Omit<PluginModule, 'id' | typeof PluginModuleTypeId> & { id?: string };
131
+
132
+ class PluginModuleImpl implements PluginModule {
133
+ readonly [PluginModuleTypeId]: PluginModuleTypeId = PluginModuleTypeId;
134
+ readonly id: PluginModule['id'];
135
+ readonly activatesOn: PluginModule['activatesOn'];
136
+ readonly firesBeforeActivation?: PluginModule['firesBeforeActivation'];
137
+ readonly firesAfterActivation?: PluginModule['firesAfterActivation'];
138
+ readonly activate: PluginModule['activate'];
54
139
 
55
- constructor(options: PluginModuleInterface) {
140
+ constructor(options: Omit<PluginModule, typeof PluginModuleTypeId>) {
56
141
  this.id = options.id;
57
142
  this.activatesOn = options.activatesOn;
58
- this.activatesBefore = options.activatesBefore;
59
- this.activatesAfter = options.activatesAfter;
143
+ this.firesBeforeActivation = options.firesBeforeActivation;
144
+ this.firesAfterActivation = options.firesAfterActivation;
60
145
  this.activate = options.activate;
61
146
  }
62
147
  }
63
148
 
64
- /**
65
- * Helper to define a module.
66
- */
67
- export const defineModule = (options: PluginModuleInterface) => new PluginModule(options);
68
-
69
- export type PluginMeta = {
149
+ export type Meta = {
70
150
  /**
71
151
  * Globally unique ID.
72
152
  *
73
153
  * Expected to be in the form of a valid URL.
74
154
  *
75
- * @example dxos.org/plugin/example
155
+ * @example org.dxos.plugin.example
76
156
  */
77
157
  id: string;
78
158
 
@@ -86,6 +166,11 @@ export type PluginMeta = {
86
166
  */
87
167
  description?: string;
88
168
 
169
+ /**
170
+ * Name of the author or organization that created the plugin.
171
+ */
172
+ author?: string;
173
+
89
174
  /**
90
175
  * URL of home page.
91
176
  */
@@ -110,23 +195,161 @@ export type PluginMeta = {
110
195
  * A grep-able symbol string which can be resolved to an icon asset by @ch-ui/icons, via @ch-ui/vite-plugin-icons.
111
196
  */
112
197
  icon?: string;
198
+
199
+ /**
200
+ * Icon hue (ChromaticPalette).
201
+ */
202
+ iconHue?: string;
203
+ };
204
+
205
+ /**
206
+ * Identifier denoting a Plugin.
207
+ */
208
+ export const PluginTypeId: unique symbol = Symbol.for('@dxos/app-framework/Plugin');
209
+ export type PluginTypeId = typeof PluginTypeId;
210
+
211
+ /**
212
+ * Type guard to check if a value is a Plugin.
213
+ */
214
+ export const isPlugin = (value: unknown): value is Plugin => {
215
+ return typeof value === 'object' && value !== null && PluginTypeId in value;
113
216
  };
114
217
 
115
218
  /**
116
219
  * A collection of modules that are be enabled/disabled as a unit.
117
220
  * Plugins provide things such as components, state, actions, etc. to the application.
118
221
  */
119
- // NOTE: This is implemented as a class to prevent it from being proxied by PluginManager state.
120
- export class Plugin {
222
+ // TODO(burdon): Convert to ECHO schema.
223
+ export interface Plugin {
224
+ readonly [PluginTypeId]: PluginTypeId;
225
+ readonly meta: Readonly<Meta>;
226
+ readonly modules: ReadonlyArray<PluginModule>;
227
+ }
228
+
229
+ /**
230
+ * Internal implementation of Plugin.
231
+ * @internal
232
+ */
233
+ class PluginImpl implements Plugin {
234
+ readonly [PluginTypeId]: PluginTypeId = PluginTypeId;
235
+
121
236
  constructor(
122
- readonly meta: PluginMeta,
123
- readonly modules: PluginModule[],
237
+ private readonly _meta: Meta,
238
+ private readonly _modules: PluginModule[],
124
239
  ) {}
240
+
241
+ get meta(): Readonly<Meta> {
242
+ return this._meta;
243
+ }
244
+
245
+ get modules(): ReadonlyArray<PluginModule> {
246
+ return this._modules;
247
+ }
248
+ }
249
+
250
+ /**
251
+ * Builder interface for creating plugins incrementally.
252
+ */
253
+ export interface PluginBuilder<T = void> extends Pipeable.Pipeable {
254
+ readonly meta: Meta;
255
+ readonly modules: ReadonlyArray<PluginModuleOptions | ((options: T) => PluginModuleOptions)>;
256
+ addModule(moduleOptions: PluginModuleOptions | ((options: T) => PluginModuleOptions)): PluginBuilder<T>;
257
+ }
258
+
259
+ /**
260
+ * Builder implementation for creating plugins incrementally.
261
+ */
262
+ class PluginBuilderImpl<T = void> implements PluginBuilder<T> {
263
+ readonly meta: Meta;
264
+ private readonly _modules: Array<PluginModuleOptions | ((options: T) => PluginModuleOptions)> = [];
265
+
266
+ constructor(meta: Meta) {
267
+ this.meta = meta;
268
+ }
269
+
270
+ get modules(): ReadonlyArray<PluginModuleOptions | ((options: T) => PluginModuleOptions)> {
271
+ return this._modules;
272
+ }
273
+
274
+ addModule(moduleOptions: PluginModuleOptions | ((options: T) => PluginModuleOptions)): PluginBuilder<T> {
275
+ this._modules.push(moduleOptions);
276
+ return this;
277
+ }
278
+
279
+ pipe() {
280
+ // eslint-disable-next-line prefer-rest-params
281
+ return Pipeable.pipeArguments(this, arguments);
282
+ }
125
283
  }
126
284
 
127
285
  /**
128
- * Helper to define a plugin.
286
+ * Creates a new PluginBuilder to start building a plugin.
287
+ */
288
+ export const define = <T = void>(meta: Meta): PluginBuilder<T> => new PluginBuilderImpl<T>(meta);
289
+
290
+ /**
291
+ * Adds a module to a plugin builder.
292
+ * Supports both pipeline and direct call styles.
293
+ * Modules can be either PluginModuleOptions or functions that receive options.
129
294
  */
130
- export const definePlugin = (meta: PluginMeta, modules: PluginModule[]) => {
131
- return new Plugin(meta, modules);
295
+ export function addModule<T>(
296
+ moduleOptions: PluginModuleOptions | ((options: T) => PluginModuleOptions),
297
+ ): (builder: PluginBuilder<T>) => PluginBuilder<T>;
298
+ export function addModule<T>(
299
+ builder: PluginBuilder<T>,
300
+ moduleOptions: PluginModuleOptions | ((options: T) => PluginModuleOptions),
301
+ ): PluginBuilder<T>;
302
+ export function addModule<T>(
303
+ moduleOptionsOrBuilder: PluginModuleOptions | ((options: T) => PluginModuleOptions) | PluginBuilder<T>,
304
+ moduleOptions?: PluginModuleOptions | ((options: T) => PluginModuleOptions),
305
+ ): ((builder: PluginBuilder<T>) => PluginBuilder<T>) | PluginBuilder<T> {
306
+ // If second arg is provided, it's the direct call style: addModule(builder, moduleOptions)
307
+ if (moduleOptions !== undefined) {
308
+ return (moduleOptionsOrBuilder as PluginBuilder<T>).addModule(moduleOptions);
309
+ }
310
+ // Otherwise it's pipeline style: addModule(moduleOptions) returns a function
311
+ const moduleOpts = moduleOptionsOrBuilder as PluginModuleOptions | ((options: T) => PluginModuleOptions);
312
+ return (builder: PluginBuilder<T>) => builder.addModule(moduleOpts);
313
+ }
314
+
315
+ export type PluginFactory<T = void> = ((options: T) => Plugin) & { meta: Meta };
316
+
317
+ /**
318
+ * Resolves a module from either PluginModuleOptions or a function that returns PluginModuleOptions.
319
+ */
320
+ const resolveModule = (
321
+ meta: Meta,
322
+ module: PluginModuleOptions | ((options: any) => PluginModuleOptions),
323
+ options?: any,
324
+ ): PluginModuleImpl => {
325
+ const moduleOptions = typeof module === 'function' ? module(options) : module;
326
+ const id = Option.fromNullable(moduleOptions.id).pipe(
327
+ Option.match({
328
+ onNone: () => {
329
+ const exportName = Capability.getModuleTag(moduleOptions.activate);
330
+ invariant(exportName, `Plugin module missing name. Plugin: ${meta.id}`);
331
+ return computeModuleId(meta.id, exportName);
332
+ },
333
+ onSome: (id) => computeModuleId(meta.id, id),
334
+ }),
335
+ );
336
+ return new PluginModuleImpl({ ...moduleOptions, id });
132
337
  };
338
+
339
+ /**
340
+ * Creates a Plugin from a builder.
341
+ * Supports both pipeline and direct call styles.
342
+ * Always returns a factory function (options: T) => Plugin.
343
+ * When T is void, the function takes no arguments: () => Plugin.
344
+ */
345
+ export function make<T>(builder: PluginBuilder<T>): PluginFactory<T>;
346
+ export function make<T>(builder: PluginBuilder<T>): PluginFactory<T> {
347
+ const meta = builder.meta;
348
+
349
+ const factory = (options: T) => {
350
+ const modules = builder.modules.map((module) => resolveModule(meta, module, options));
351
+ return new PluginImpl(meta, modules);
352
+ };
353
+
354
+ return Object.assign(factory, { meta });
355
+ }