@dxos/app-framework 0.8.4-main.c1de068 → 0.8.4-main.c85a9c8dae

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 (472) hide show
  1. package/.storybook/main.mts +9 -0
  2. package/.storybook/preview.mts +8 -0
  3. package/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
  4. package/dist/lib/browser/capability-2GL5JAGJ.mjs +37 -0
  5. package/dist/lib/browser/capability-2GL5JAGJ.mjs.map +7 -0
  6. package/dist/lib/browser/capability-7RLVE42K.mjs +34 -0
  7. package/dist/lib/browser/capability-7RLVE42K.mjs.map +7 -0
  8. package/dist/lib/browser/chunk-4CTRO67U.mjs +703 -0
  9. package/dist/lib/browser/chunk-4CTRO67U.mjs.map +7 -0
  10. package/dist/lib/browser/chunk-5RJNZV7K.mjs +44 -0
  11. package/dist/lib/browser/chunk-5RJNZV7K.mjs.map +7 -0
  12. package/dist/lib/browser/chunk-FHQTHCX7.mjs +8 -0
  13. package/dist/lib/browser/chunk-FHQTHCX7.mjs.map +7 -0
  14. package/dist/lib/browser/chunk-FNKT2QQ2.mjs +145 -0
  15. package/dist/lib/browser/chunk-FNKT2QQ2.mjs.map +7 -0
  16. package/dist/lib/browser/chunk-HE27PNNQ.mjs +824 -0
  17. package/dist/lib/browser/chunk-HE27PNNQ.mjs.map +7 -0
  18. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  19. package/dist/lib/browser/chunk-NPUEVX42.mjs +34 -0
  20. package/dist/lib/browser/chunk-NPUEVX42.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-PKQT6C53.mjs +47 -0
  22. package/dist/lib/browser/chunk-PKQT6C53.mjs.map +7 -0
  23. package/dist/lib/browser/chunk-REORGDJT.mjs +80 -0
  24. package/dist/lib/browser/chunk-REORGDJT.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-YAFEA4GV.mjs +1 -0
  26. package/dist/lib/browser/chunk-YNFPIQGB.mjs +76 -0
  27. package/dist/lib/browser/chunk-YNFPIQGB.mjs.map +7 -0
  28. package/dist/lib/browser/chunk-ZRWBPIZG.mjs +170 -0
  29. package/dist/lib/browser/chunk-ZRWBPIZG.mjs.map +7 -0
  30. package/dist/lib/browser/cli/index.mjs +89 -0
  31. package/dist/lib/browser/cli/index.mjs.map +7 -0
  32. package/dist/lib/browser/common/activation-events.mjs +23 -0
  33. package/dist/lib/browser/common/capabilities.mjs +45 -0
  34. package/dist/lib/browser/core/activation-event.mjs +20 -0
  35. package/dist/lib/browser/core/activation-event.mjs.map +7 -0
  36. package/dist/lib/browser/core/capability.mjs +28 -0
  37. package/dist/lib/browser/core/capability.mjs.map +7 -0
  38. package/dist/lib/browser/core/plugin-manager.mjs +15 -0
  39. package/dist/lib/browser/core/plugin-manager.mjs.map +7 -0
  40. package/dist/lib/browser/core/plugin.mjs +27 -0
  41. package/dist/lib/browser/core/plugin.mjs.map +7 -0
  42. package/dist/lib/browser/index.mjs +87 -156
  43. package/dist/lib/browser/index.mjs.map +4 -4
  44. package/dist/lib/browser/invoker-capability-BNLVNYHU.mjs +36 -0
  45. package/dist/lib/browser/invoker-capability-BNLVNYHU.mjs.map +7 -0
  46. package/dist/lib/browser/meta.json +1 -1
  47. package/dist/lib/browser/testing/index.mjs +89 -39
  48. package/dist/lib/browser/testing/index.mjs.map +4 -4
  49. package/dist/lib/browser/ui/index.mjs +45 -0
  50. package/dist/lib/browser/ui/index.mjs.map +7 -0
  51. package/dist/lib/node-esm/capability-CHIMU6LX.mjs +38 -0
  52. package/dist/lib/node-esm/capability-CHIMU6LX.mjs.map +7 -0
  53. package/dist/lib/node-esm/capability-EVZK4REM.mjs +35 -0
  54. package/dist/lib/node-esm/capability-EVZK4REM.mjs.map +7 -0
  55. package/dist/lib/node-esm/chunk-2A4PRBIX.mjs +171 -0
  56. package/dist/lib/node-esm/chunk-2A4PRBIX.mjs.map +7 -0
  57. package/dist/lib/node-esm/chunk-7CPNAEGV.mjs +704 -0
  58. package/dist/lib/node-esm/chunk-7CPNAEGV.mjs.map +7 -0
  59. package/dist/lib/node-esm/chunk-7OWSHPYK.mjs +48 -0
  60. package/dist/lib/node-esm/chunk-7OWSHPYK.mjs.map +7 -0
  61. package/dist/lib/node-esm/chunk-CJCQS2YL.mjs +146 -0
  62. package/dist/lib/node-esm/chunk-CJCQS2YL.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-DTCHT2X2.mjs +825 -0
  64. package/dist/lib/node-esm/chunk-DTCHT2X2.mjs.map +7 -0
  65. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  66. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  67. package/dist/lib/node-esm/chunk-JAZVHID3.mjs +35 -0
  68. package/dist/lib/node-esm/chunk-JAZVHID3.mjs.map +7 -0
  69. package/dist/lib/node-esm/chunk-SB5ODNPX.mjs +77 -0
  70. package/dist/lib/node-esm/chunk-SB5ODNPX.mjs.map +7 -0
  71. package/dist/lib/node-esm/chunk-UEWJDI2L.mjs +10 -0
  72. package/dist/lib/node-esm/chunk-UEWJDI2L.mjs.map +7 -0
  73. package/dist/lib/node-esm/chunk-UFW652GS.mjs +81 -0
  74. package/dist/lib/node-esm/chunk-UFW652GS.mjs.map +7 -0
  75. package/dist/lib/node-esm/chunk-VUIUFIGT.mjs +45 -0
  76. package/dist/lib/node-esm/chunk-VUIUFIGT.mjs.map +7 -0
  77. package/dist/lib/node-esm/chunk-Z4TJPSMP.mjs +2 -0
  78. package/dist/lib/node-esm/chunk-Z4TJPSMP.mjs.map +7 -0
  79. package/dist/lib/node-esm/cli/index.mjs +90 -0
  80. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  81. package/dist/lib/node-esm/common/activation-events.mjs +24 -0
  82. package/dist/lib/node-esm/common/activation-events.mjs.map +7 -0
  83. package/dist/lib/node-esm/common/capabilities.mjs +46 -0
  84. package/dist/lib/node-esm/common/capabilities.mjs.map +7 -0
  85. package/dist/lib/node-esm/core/activation-event.mjs +21 -0
  86. package/dist/lib/node-esm/core/activation-event.mjs.map +7 -0
  87. package/dist/lib/node-esm/core/capability.mjs +29 -0
  88. package/dist/lib/node-esm/core/capability.mjs.map +7 -0
  89. package/dist/lib/node-esm/core/plugin-manager.mjs +16 -0
  90. package/dist/lib/node-esm/core/plugin-manager.mjs.map +7 -0
  91. package/dist/lib/node-esm/core/plugin.mjs +28 -0
  92. package/dist/lib/node-esm/core/plugin.mjs.map +7 -0
  93. package/dist/lib/node-esm/index.mjs +87 -156
  94. package/dist/lib/node-esm/index.mjs.map +4 -4
  95. package/dist/lib/node-esm/invoker-capability-VF6SP44V.mjs +37 -0
  96. package/dist/lib/node-esm/invoker-capability-VF6SP44V.mjs.map +7 -0
  97. package/dist/lib/node-esm/meta.json +1 -1
  98. package/dist/lib/node-esm/testing/index.mjs +89 -39
  99. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  100. package/dist/lib/node-esm/ui/index.mjs +46 -0
  101. package/dist/lib/node-esm/ui/index.mjs.map +7 -0
  102. package/dist/types/src/cli/cli.d.ts +39 -0
  103. package/dist/types/src/cli/cli.d.ts.map +1 -0
  104. package/dist/types/src/cli/index.d.ts +2 -0
  105. package/dist/types/src/cli/index.d.ts.map +1 -0
  106. package/dist/types/src/common/activation-events.d.ts +27 -0
  107. package/dist/types/src/common/activation-events.d.ts.map +1 -0
  108. package/dist/types/src/common/capabilities.d.ts +114 -123
  109. package/dist/types/src/common/capabilities.d.ts.map +1 -1
  110. package/dist/types/src/common/index.d.ts +4 -8
  111. package/dist/types/src/common/index.d.ts.map +1 -1
  112. package/dist/types/src/common/operations.d.ts +33 -0
  113. package/dist/types/src/common/operations.d.ts.map +1 -0
  114. package/dist/types/src/common/translations.d.ts +8 -8
  115. package/dist/types/src/common/translations.d.ts.map +1 -1
  116. package/dist/types/src/context.d.ts +5 -0
  117. package/dist/types/src/context.d.ts.map +1 -0
  118. package/dist/types/src/core/{events.d.ts → activation-event.d.ts} +6 -6
  119. package/dist/types/src/core/activation-event.d.ts.map +1 -0
  120. package/dist/types/src/core/capability-manager.d.ts +43 -0
  121. package/dist/types/src/core/capability-manager.d.ts.map +1 -0
  122. package/dist/types/src/core/capability-manager.test.d.ts +2 -0
  123. package/dist/types/src/core/capability-manager.test.d.ts.map +1 -0
  124. package/dist/types/src/core/capability.d.ts +150 -0
  125. package/dist/types/src/core/capability.d.ts.map +1 -0
  126. package/dist/types/src/core/index.d.ts +5 -4
  127. package/dist/types/src/core/index.d.ts.map +1 -1
  128. package/dist/types/src/core/plugin-manager.d.ts +66 -0
  129. package/dist/types/src/core/plugin-manager.d.ts.map +1 -0
  130. package/dist/types/src/core/plugin-manager.test.d.ts +2 -0
  131. package/dist/types/src/core/plugin-manager.test.d.ts.map +1 -0
  132. package/dist/types/src/core/plugin.d.ts +97 -32
  133. package/dist/types/src/core/plugin.d.ts.map +1 -1
  134. package/dist/types/src/index.d.ts +3 -4
  135. package/dist/types/src/index.d.ts.map +1 -1
  136. package/dist/types/src/plugin-operation/OperationPlugin.d.ts +3 -0
  137. package/dist/types/src/plugin-operation/OperationPlugin.d.ts.map +1 -0
  138. package/dist/types/src/plugin-operation/history/capability.d.ts +7 -0
  139. package/dist/types/src/plugin-operation/history/capability.d.ts.map +1 -0
  140. package/dist/types/src/plugin-operation/history/errors.d.ts +5 -0
  141. package/dist/types/src/plugin-operation/history/errors.d.ts.map +1 -0
  142. package/dist/types/src/plugin-operation/history/history-tracker.d.ts +18 -0
  143. package/dist/types/src/plugin-operation/history/history-tracker.d.ts.map +1 -0
  144. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts +2 -0
  145. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts.map +1 -0
  146. package/dist/types/src/plugin-operation/history/index.d.ts +6 -0
  147. package/dist/types/src/plugin-operation/history/index.d.ts.map +1 -0
  148. package/dist/types/src/plugin-operation/history/types.d.ts +13 -0
  149. package/dist/types/src/plugin-operation/history/types.d.ts.map +1 -0
  150. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts +101 -0
  151. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +1 -0
  152. package/dist/types/src/plugin-operation/history/undo-registry.d.ts +23 -0
  153. package/dist/types/src/plugin-operation/history/undo-registry.d.ts.map +1 -0
  154. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts +2 -0
  155. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts.map +1 -0
  156. package/dist/types/src/plugin-operation/index.d.ts +3 -0
  157. package/dist/types/src/plugin-operation/index.d.ts.map +1 -0
  158. package/dist/types/src/plugin-operation/invoker-capability.d.ts +6 -0
  159. package/dist/types/src/plugin-operation/invoker-capability.d.ts.map +1 -0
  160. package/dist/types/src/plugin-operation/meta.d.ts +3 -0
  161. package/dist/types/src/plugin-operation/meta.d.ts.map +1 -0
  162. package/dist/types/src/plugin-operation/testing.d.ts +109 -0
  163. package/dist/types/src/plugin-operation/testing.d.ts.map +1 -0
  164. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts +3 -0
  165. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts.map +1 -0
  166. package/dist/types/src/plugin-runtime/capability.d.ts +6 -0
  167. package/dist/types/src/plugin-runtime/capability.d.ts.map +1 -0
  168. package/dist/types/src/plugin-runtime/index.d.ts +2 -0
  169. package/dist/types/src/plugin-runtime/index.d.ts.map +1 -0
  170. package/dist/types/src/plugin-runtime/meta.d.ts +3 -0
  171. package/dist/types/src/plugin-runtime/meta.d.ts.map +1 -0
  172. package/dist/types/src/testing/index.d.ts +1 -0
  173. package/dist/types/src/testing/index.d.ts.map +1 -1
  174. package/dist/types/src/testing/service.d.ts +8 -0
  175. package/dist/types/src/testing/service.d.ts.map +1 -0
  176. package/dist/types/src/testing/withPluginManager.d.ts +11 -10
  177. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  178. package/dist/types/src/testing/withPluginManager.stories.d.ts +9 -3
  179. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
  180. package/dist/types/src/ui/components/App/App.d.ts +8 -0
  181. package/dist/types/src/ui/components/App/App.d.ts.map +1 -0
  182. package/dist/types/src/ui/components/App/App.stories.d.ts +19 -0
  183. package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -0
  184. package/dist/types/src/ui/components/App/index.d.ts +2 -0
  185. package/dist/types/src/ui/components/App/index.d.ts.map +1 -0
  186. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts +13 -0
  187. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -0
  188. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts +10 -0
  189. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts.map +1 -0
  190. package/dist/types/src/ui/components/PluginManager/index.d.ts +2 -0
  191. package/dist/types/src/ui/components/PluginManager/index.d.ts.map +1 -0
  192. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +12 -0
  193. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -0
  194. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts +14 -0
  195. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -0
  196. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts +11 -0
  197. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +1 -0
  198. package/dist/types/src/ui/components/Surface/context.d.ts +5 -0
  199. package/dist/types/src/ui/components/Surface/context.d.ts.map +1 -0
  200. package/dist/types/src/ui/components/Surface/index.d.ts +20 -0
  201. package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -0
  202. package/dist/types/src/ui/components/Surface/types.d.ts +96 -0
  203. package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -0
  204. package/dist/types/src/ui/components/index.d.ts +4 -0
  205. package/dist/types/src/ui/components/index.d.ts.map +1 -0
  206. package/dist/types/src/ui/hooks/index.d.ts +7 -0
  207. package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
  208. package/dist/types/src/{App.d.ts → ui/hooks/useApp.d.ts} +21 -14
  209. package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -0
  210. package/dist/types/src/ui/hooks/useCapabilities.d.ts +31 -0
  211. package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -0
  212. package/dist/types/src/ui/hooks/useLoading.d.ts +18 -0
  213. package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
  214. package/dist/types/src/ui/hooks/useOperationResolver.d.ts +19 -0
  215. package/dist/types/src/ui/hooks/useOperationResolver.d.ts.map +1 -0
  216. package/dist/types/src/ui/hooks/useSettingsState.d.ts +10 -0
  217. package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -0
  218. package/dist/types/src/ui/hooks/useSurface.d.ts +3 -0
  219. package/dist/types/src/ui/hooks/useSurface.d.ts.map +1 -0
  220. package/dist/types/src/ui/index.d.ts +3 -0
  221. package/dist/types/src/ui/index.d.ts.map +1 -0
  222. package/dist/types/tsconfig.tsbuildinfo +1 -1
  223. package/moon.yml +11 -3
  224. package/package.json +113 -44
  225. package/src/cli/cli.ts +107 -0
  226. package/src/{playground/layout → cli}/index.ts +1 -1
  227. package/src/common/activation-events.ts +44 -0
  228. package/src/common/capabilities.ts +174 -114
  229. package/src/common/index.ts +4 -8
  230. package/src/common/operations.ts +38 -0
  231. package/src/common/translations.ts +18 -10
  232. package/src/context.ts +9 -0
  233. package/src/core/{events.ts → activation-event.ts} +5 -5
  234. package/src/core/capability-manager.test.ts +151 -0
  235. package/src/core/capability-manager.ts +171 -0
  236. package/src/core/capability.ts +236 -0
  237. package/src/core/index.ts +5 -4
  238. package/src/core/plugin-manager.test.ts +845 -0
  239. package/src/core/plugin-manager.ts +715 -0
  240. package/src/core/plugin.ts +230 -36
  241. package/src/helpers.test.ts +1 -1
  242. package/src/index.ts +3 -4
  243. package/src/plugin-operation/OperationPlugin.ts +25 -0
  244. package/src/plugin-operation/history/capability.ts +37 -0
  245. package/src/plugin-operation/history/errors.ts +11 -0
  246. package/src/plugin-operation/history/history-tracker.test.ts +380 -0
  247. package/src/plugin-operation/history/history-tracker.ts +129 -0
  248. package/src/plugin-operation/history/index.ts +9 -0
  249. package/src/plugin-operation/history/types.ts +17 -0
  250. package/src/plugin-operation/history/undo-mapping.ts +135 -0
  251. package/src/plugin-operation/history/undo-registry.test.ts +73 -0
  252. package/src/plugin-operation/history/undo-registry.ts +54 -0
  253. package/src/plugin-operation/index.ts +6 -0
  254. package/src/plugin-operation/invoker-capability.ts +40 -0
  255. package/src/plugin-operation/meta.ts +11 -0
  256. package/src/plugin-operation/testing.ts +174 -0
  257. package/src/plugin-runtime/RuntimePlugin.ts +20 -0
  258. package/src/plugin-runtime/capability.ts +53 -0
  259. package/src/{playground/debug → plugin-runtime}/index.ts +1 -1
  260. package/src/plugin-runtime/meta.ts +11 -0
  261. package/src/testing/index.ts +1 -0
  262. package/src/testing/service.ts +52 -0
  263. package/src/testing/withPluginManager.stories.tsx +15 -11
  264. package/src/testing/withPluginManager.tsx +47 -45
  265. package/src/ui/components/App/App.stories.tsx +92 -0
  266. package/src/ui/components/App/App.tsx +57 -0
  267. package/src/{playground/logger → ui/components/App}/index.ts +1 -1
  268. package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +183 -0
  269. package/src/{react → ui/components/PluginManager}/PluginManagerProvider.ts +3 -3
  270. package/src/ui/components/PluginManager/index.ts +5 -0
  271. package/src/ui/components/Surface/SurfaceComponent.stories.tsx +143 -0
  272. package/src/ui/components/Surface/SurfaceComponent.tsx +247 -0
  273. package/src/ui/components/Surface/SurfaceInfo.tsx +107 -0
  274. package/src/ui/components/Surface/context.ts +12 -0
  275. package/src/ui/components/Surface/index.ts +20 -0
  276. package/src/ui/components/Surface/types.ts +117 -0
  277. package/src/ui/components/index.ts +7 -0
  278. package/src/ui/hooks/index.ts +10 -0
  279. package/src/ui/hooks/useApp.tsx +213 -0
  280. package/src/ui/hooks/useCapabilities.ts +67 -0
  281. package/src/ui/hooks/useLoading.tsx +68 -0
  282. package/src/ui/hooks/useOperationResolver.ts +40 -0
  283. package/src/ui/hooks/useSettingsState.ts +26 -0
  284. package/src/ui/hooks/useSurface.ts +13 -0
  285. package/src/ui/index.ts +6 -0
  286. package/tsconfig.json +14 -30
  287. package/tsconfig.node.json +1 -3
  288. package/typedoc.json +2 -4
  289. package/vitest.config.ts +8 -6
  290. package/.swc/plugins/v7_linux_x86_64_13.0.0/f45bdff002284d9e8f9ef3f0be909de12da36c049cbcf261ac78fc00abb09a2d +0 -0
  291. package/.swc/plugins/v7_linux_x86_64_13.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429 +0 -0
  292. package/dist/lib/browser/app-graph-builder-LYF7EKNN.mjs +0 -137
  293. package/dist/lib/browser/app-graph-builder-LYF7EKNN.mjs.map +0 -7
  294. package/dist/lib/browser/chunk-FMN65HSW.mjs +0 -1519
  295. package/dist/lib/browser/chunk-FMN65HSW.mjs.map +0 -7
  296. package/dist/lib/browser/chunk-FO2PH7M3.mjs +0 -415
  297. package/dist/lib/browser/chunk-FO2PH7M3.mjs.map +0 -7
  298. package/dist/lib/browser/chunk-ORWHM7CO.mjs +0 -32
  299. package/dist/lib/browser/chunk-ORWHM7CO.mjs.map +0 -7
  300. package/dist/lib/browser/intent-dispatcher-LSYQZSEB.mjs +0 -11
  301. package/dist/lib/browser/intent-resolver-ZTNOSO3A.mjs +0 -39
  302. package/dist/lib/browser/intent-resolver-ZTNOSO3A.mjs.map +0 -7
  303. package/dist/lib/browser/store-KML2R4IE.mjs +0 -30
  304. package/dist/lib/browser/store-KML2R4IE.mjs.map +0 -7
  305. package/dist/lib/browser/worker.mjs +0 -79
  306. package/dist/lib/node-esm/app-graph-builder-SAOWGJDK.mjs +0 -138
  307. package/dist/lib/node-esm/app-graph-builder-SAOWGJDK.mjs.map +0 -7
  308. package/dist/lib/node-esm/chunk-73HGSHKE.mjs +0 -416
  309. package/dist/lib/node-esm/chunk-73HGSHKE.mjs.map +0 -7
  310. package/dist/lib/node-esm/chunk-UMZQERLE.mjs +0 -34
  311. package/dist/lib/node-esm/chunk-UMZQERLE.mjs.map +0 -7
  312. package/dist/lib/node-esm/chunk-ZEZ4FVEU.mjs +0 -1521
  313. package/dist/lib/node-esm/chunk-ZEZ4FVEU.mjs.map +0 -7
  314. package/dist/lib/node-esm/intent-dispatcher-6CYNGPSW.mjs +0 -12
  315. package/dist/lib/node-esm/intent-resolver-W7Z7WFFM.mjs +0 -40
  316. package/dist/lib/node-esm/intent-resolver-W7Z7WFFM.mjs.map +0 -7
  317. package/dist/lib/node-esm/store-QEXGXLWZ.mjs +0 -31
  318. package/dist/lib/node-esm/store-QEXGXLWZ.mjs.map +0 -7
  319. package/dist/lib/node-esm/worker.mjs +0 -80
  320. package/dist/types/src/App.d.ts.map +0 -1
  321. package/dist/types/src/common/collaboration.d.ts +0 -19
  322. package/dist/types/src/common/collaboration.d.ts.map +0 -1
  323. package/dist/types/src/common/events.d.ts +0 -52
  324. package/dist/types/src/common/events.d.ts.map +0 -1
  325. package/dist/types/src/common/file.d.ts +0 -14
  326. package/dist/types/src/common/file.d.ts.map +0 -1
  327. package/dist/types/src/common/graph.d.ts +0 -21
  328. package/dist/types/src/common/graph.d.ts.map +0 -1
  329. package/dist/types/src/common/layout.d.ts +0 -281
  330. package/dist/types/src/common/layout.d.ts.map +0 -1
  331. package/dist/types/src/common/surface.d.ts +0 -65
  332. package/dist/types/src/common/surface.d.ts.map +0 -1
  333. package/dist/types/src/core/capabilities.d.ts +0 -114
  334. package/dist/types/src/core/capabilities.d.ts.map +0 -1
  335. package/dist/types/src/core/capabilities.test.d.ts +0 -2
  336. package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
  337. package/dist/types/src/core/events.d.ts.map +0 -1
  338. package/dist/types/src/core/manager.d.ts +0 -122
  339. package/dist/types/src/core/manager.d.ts.map +0 -1
  340. package/dist/types/src/core/manager.test.d.ts +0 -2
  341. package/dist/types/src/core/manager.test.d.ts.map +0 -1
  342. package/dist/types/src/playground/debug/Debug.d.ts +0 -6
  343. package/dist/types/src/playground/debug/Debug.d.ts.map +0 -1
  344. package/dist/types/src/playground/debug/index.d.ts +0 -2
  345. package/dist/types/src/playground/debug/index.d.ts.map +0 -1
  346. package/dist/types/src/playground/debug/plugin.d.ts +0 -2
  347. package/dist/types/src/playground/debug/plugin.d.ts.map +0 -1
  348. package/dist/types/src/playground/generator/Main.d.ts +0 -6
  349. package/dist/types/src/playground/generator/Main.d.ts.map +0 -1
  350. package/dist/types/src/playground/generator/Toolbar.d.ts +0 -6
  351. package/dist/types/src/playground/generator/Toolbar.d.ts.map +0 -1
  352. package/dist/types/src/playground/generator/generator.d.ts +0 -7
  353. package/dist/types/src/playground/generator/generator.d.ts.map +0 -1
  354. package/dist/types/src/playground/generator/index.d.ts +0 -3
  355. package/dist/types/src/playground/generator/index.d.ts.map +0 -1
  356. package/dist/types/src/playground/generator/plugin.d.ts +0 -2
  357. package/dist/types/src/playground/generator/plugin.d.ts.map +0 -1
  358. package/dist/types/src/playground/layout/Layout.d.ts +0 -8
  359. package/dist/types/src/playground/layout/Layout.d.ts.map +0 -1
  360. package/dist/types/src/playground/layout/index.d.ts +0 -2
  361. package/dist/types/src/playground/layout/index.d.ts.map +0 -1
  362. package/dist/types/src/playground/layout/plugin.d.ts +0 -2
  363. package/dist/types/src/playground/layout/plugin.d.ts.map +0 -1
  364. package/dist/types/src/playground/logger/Toolbar.d.ts +0 -6
  365. package/dist/types/src/playground/logger/Toolbar.d.ts.map +0 -1
  366. package/dist/types/src/playground/logger/index.d.ts +0 -2
  367. package/dist/types/src/playground/logger/index.d.ts.map +0 -1
  368. package/dist/types/src/playground/logger/plugin.d.ts +0 -2
  369. package/dist/types/src/playground/logger/plugin.d.ts.map +0 -1
  370. package/dist/types/src/playground/logger/schema.d.ts +0 -13
  371. package/dist/types/src/playground/logger/schema.d.ts.map +0 -1
  372. package/dist/types/src/playground/playground.stories.d.ts +0 -10
  373. package/dist/types/src/playground/playground.stories.d.ts.map +0 -1
  374. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +0 -2
  375. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +0 -1
  376. package/dist/types/src/plugin-intent/actions.d.ts +0 -38
  377. package/dist/types/src/plugin-intent/actions.d.ts.map +0 -1
  378. package/dist/types/src/plugin-intent/errors.d.ts +0 -16
  379. package/dist/types/src/plugin-intent/errors.d.ts.map +0 -1
  380. package/dist/types/src/plugin-intent/index.d.ts +0 -5
  381. package/dist/types/src/plugin-intent/index.d.ts.map +0 -1
  382. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +0 -139
  383. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +0 -1
  384. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +0 -2
  385. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +0 -1
  386. package/dist/types/src/plugin-intent/intent.d.ts +0 -63
  387. package/dist/types/src/plugin-intent/intent.d.ts.map +0 -1
  388. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +0 -2
  389. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +0 -1
  390. package/dist/types/src/plugin-settings/actions.d.ts +0 -27
  391. package/dist/types/src/plugin-settings/actions.d.ts.map +0 -1
  392. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +0 -4
  393. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +0 -1
  394. package/dist/types/src/plugin-settings/index.d.ts +0 -3
  395. package/dist/types/src/plugin-settings/index.d.ts.map +0 -1
  396. package/dist/types/src/plugin-settings/intent-resolver.d.ts +0 -4
  397. package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +0 -1
  398. package/dist/types/src/plugin-settings/store.d.ts +0 -5
  399. package/dist/types/src/plugin-settings/store.d.ts.map +0 -1
  400. package/dist/types/src/plugin-settings/translations.d.ts +0 -10
  401. package/dist/types/src/plugin-settings/translations.d.ts.map +0 -1
  402. package/dist/types/src/react/ErrorBoundary.d.ts +0 -31
  403. package/dist/types/src/react/ErrorBoundary.d.ts.map +0 -1
  404. package/dist/types/src/react/IntentContext.d.ts +0 -8
  405. package/dist/types/src/react/IntentContext.d.ts.map +0 -1
  406. package/dist/types/src/react/PluginManagerProvider.d.ts +0 -10
  407. package/dist/types/src/react/PluginManagerProvider.d.ts.map +0 -1
  408. package/dist/types/src/react/Surface.d.ts +0 -12
  409. package/dist/types/src/react/Surface.d.ts.map +0 -1
  410. package/dist/types/src/react/Surface.stories.d.ts +0 -16
  411. package/dist/types/src/react/Surface.stories.d.ts.map +0 -1
  412. package/dist/types/src/react/common.d.ts +0 -13
  413. package/dist/types/src/react/common.d.ts.map +0 -1
  414. package/dist/types/src/react/index.d.ts +0 -7
  415. package/dist/types/src/react/index.d.ts.map +0 -1
  416. package/dist/types/src/react/useCapabilities.d.ts +0 -13
  417. package/dist/types/src/react/useCapabilities.d.ts.map +0 -1
  418. package/dist/types/src/react/useIntentResolver.d.ts +0 -3
  419. package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
  420. package/dist/types/src/worker.d.ts +0 -4
  421. package/dist/types/src/worker.d.ts.map +0 -1
  422. package/src/App.tsx +0 -276
  423. package/src/common/collaboration.ts +0 -21
  424. package/src/common/events.ts +0 -77
  425. package/src/common/file.ts +0 -22
  426. package/src/common/graph.ts +0 -30
  427. package/src/common/layout.ts +0 -278
  428. package/src/common/surface.ts +0 -86
  429. package/src/core/capabilities.test.ts +0 -136
  430. package/src/core/capabilities.ts +0 -254
  431. package/src/core/manager.test.ts +0 -515
  432. package/src/core/manager.ts +0 -519
  433. package/src/playground/debug/Debug.tsx +0 -39
  434. package/src/playground/debug/plugin.ts +0 -17
  435. package/src/playground/generator/Main.tsx +0 -71
  436. package/src/playground/generator/Toolbar.tsx +0 -46
  437. package/src/playground/generator/generator.ts +0 -48
  438. package/src/playground/generator/index.ts +0 -6
  439. package/src/playground/generator/plugin.ts +0 -23
  440. package/src/playground/layout/Layout.tsx +0 -33
  441. package/src/playground/layout/plugin.ts +0 -17
  442. package/src/playground/logger/Toolbar.tsx +0 -29
  443. package/src/playground/logger/plugin.ts +0 -36
  444. package/src/playground/logger/schema.ts +0 -12
  445. package/src/playground/playground.stories.tsx +0 -42
  446. package/src/plugin-intent/IntentPlugin.ts +0 -20
  447. package/src/plugin-intent/actions.ts +0 -33
  448. package/src/plugin-intent/errors.ts +0 -39
  449. package/src/plugin-intent/index.ts +0 -8
  450. package/src/plugin-intent/intent-dispatcher.test.ts +0 -279
  451. package/src/plugin-intent/intent-dispatcher.ts +0 -333
  452. package/src/plugin-intent/intent.ts +0 -154
  453. package/src/plugin-settings/SettingsPlugin.ts +0 -35
  454. package/src/plugin-settings/actions.ts +0 -29
  455. package/src/plugin-settings/app-graph-builder.ts +0 -157
  456. package/src/plugin-settings/index.ts +0 -6
  457. package/src/plugin-settings/intent-resolver.ts +0 -34
  458. package/src/plugin-settings/store.ts +0 -33
  459. package/src/plugin-settings/translations.ts +0 -19
  460. package/src/react/ErrorBoundary.tsx +0 -45
  461. package/src/react/IntentContext.tsx +0 -34
  462. package/src/react/Surface.stories.tsx +0 -96
  463. package/src/react/Surface.tsx +0 -77
  464. package/src/react/common.ts +0 -12
  465. package/src/react/index.ts +0 -10
  466. package/src/react/useCapabilities.ts +0 -30
  467. package/src/react/useIntentResolver.ts +0 -22
  468. package/src/worker.ts +0 -11
  469. /package/dist/lib/browser/{intent-dispatcher-LSYQZSEB.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  470. /package/dist/lib/browser/{worker.mjs.map → chunk-YAFEA4GV.mjs.map} +0 -0
  471. /package/dist/lib/{node-esm/intent-dispatcher-6CYNGPSW.mjs.map → browser/common/activation-events.mjs.map} +0 -0
  472. /package/dist/lib/{node-esm/worker.mjs.map → browser/common/capabilities.mjs.map} +0 -0
@@ -2,29 +2,17 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { type Decorator } from '@storybook/react';
5
+ import { type Decorator, type StoryContext } from '@storybook/react';
6
+ import * as Effect from 'effect/Effect';
6
7
  import React, { useEffect, useMemo } from 'react';
7
8
 
8
9
  import { raise } from '@dxos/debug';
10
+ import { useAsyncEffect } from '@dxos/react-hooks';
11
+ import { type MaybeProvider, getProviderValue } from '@dxos/util';
9
12
 
10
- import { useApp, type CreateAppOptions } from '../App';
11
- import { Capabilities, Events } from '../common';
12
- import {
13
- contributes,
14
- defineModule,
15
- definePlugin,
16
- type ActivationEvent,
17
- type AnyCapability,
18
- PluginManager,
19
- type PluginContext,
20
- } from '../core';
21
-
22
- // TODO(burdon): Factor out (use consistently in plugin framework?)
23
- export type Provider<C, R> = (context: C) => R;
24
- export type ProviderOrValue<C, R> = Provider<C, R> | R;
25
- export const getValue = <C, R>(providerOrValue: ProviderOrValue<C, R>, context: C): R => {
26
- return typeof providerOrValue === 'function' ? (providerOrValue as Provider<C, R>)(context) : providerOrValue;
27
- };
13
+ import { ActivationEvents, Capabilities } from '../common';
14
+ import { type ActivationEvent, Capability, type CapabilityManager, Plugin, PluginManager } from '../core';
15
+ import { type UseAppOptions, useApp } from '../ui';
28
16
 
29
17
  /**
30
18
  * @internal
@@ -34,17 +22,17 @@ export const setupPluginManager = ({
34
22
  plugins = [],
35
23
  core = plugins.map(({ meta }) => meta.id),
36
24
  ...options
37
- }: CreateAppOptions & Pick<WithPluginManagerOptions, 'capabilities'> = {}) => {
38
- const pluginManager = new PluginManager({
25
+ }: UseAppOptions & Pick<WithPluginManagerOptions, 'capabilities'> = {}) => {
26
+ const pluginManager = PluginManager.make({
39
27
  pluginLoader: () => raise(new Error('Not implemented')),
40
- plugins: [storyPlugin(), ...plugins],
41
- core: [STORY_PLUGIN, ...core],
28
+ plugins: [StoryPlugin, ...plugins],
29
+ core: [StoryPlugin.meta.id, ...core],
42
30
  ...options,
43
31
  });
44
32
 
45
33
  if (capabilities) {
46
- getValue(capabilities, pluginManager.context).forEach((capability) => {
47
- pluginManager.context.contributeCapability({
34
+ getProviderValue(capabilities, pluginManager.capabilities).forEach((capability) => {
35
+ pluginManager.capabilities.contribute({
48
36
  interface: capability.interface,
49
37
  implementation: capability.implementation,
50
38
  module: 'story',
@@ -55,56 +43,70 @@ export const setupPluginManager = ({
55
43
  return pluginManager;
56
44
  };
57
45
 
58
- export type WithPluginManagerOptions = CreateAppOptions & {
59
- capabilities?: ProviderOrValue<PluginContext, AnyCapability[]>;
60
- fireEvents?: (ActivationEvent | string)[];
46
+ export type WithPluginManagerOptions = UseAppOptions & {
47
+ /** @deprecated */
48
+ capabilities?: MaybeProvider<Capability.Any[], CapabilityManager.CapabilityManager>;
49
+ /** @deprecated */
50
+ fireEvents?: (ActivationEvent.ActivationEvent | string)[];
61
51
  };
62
52
 
53
+ export type WithPluginManagerInitializer<Args = void> =
54
+ | WithPluginManagerOptions
55
+ | ((context: StoryContext<Args>) => WithPluginManagerOptions);
56
+
63
57
  /**
64
58
  * Wraps a story with a plugin manager.
65
59
  * NOTE: This builds up and tears down the plugin manager on every render.
66
60
  */
67
- export const withPluginManager = (options: WithPluginManagerOptions = {}): Decorator => {
61
+ export const withPluginManager = <Args,>(init: WithPluginManagerInitializer<Args> = {}): Decorator => {
68
62
  return (Story, context) => {
69
- const pluginManager = useMemo(() => setupPluginManager(options), [options]);
63
+ const options = typeof init === 'function' ? init(context as any) : init;
64
+ const { pluginManager, setupEvents } = useMemo(
65
+ () => ({ pluginManager: setupPluginManager(options), setupEvents: options.setupEvents }),
66
+ [init],
67
+ );
70
68
 
71
69
  // Set-up root capability.
72
70
  useEffect(() => {
73
- const capability = contributes(Capabilities.ReactRoot, {
71
+ const capability = Capability.contributes(Capabilities.ReactRoot, {
74
72
  id: context.id,
75
73
  root: () => <Story />,
76
74
  });
77
75
 
78
- pluginManager.context.contributeCapability({
76
+ pluginManager.capabilities.contribute({
79
77
  ...capability,
80
78
  module: 'dxos.org/app-framework/withPluginManager',
81
79
  });
82
80
 
83
81
  return () => {
84
- pluginManager.context.removeCapability(capability.interface, capability.implementation);
82
+ pluginManager.capabilities.remove(capability.interface, capability.implementation);
85
83
  };
86
84
  }, [pluginManager, context]);
87
85
 
88
86
  // Fire events.
89
- useEffect(() => {
90
- const timeout = setTimeout(async () => {
91
- await Promise.all(options.fireEvents?.map((event) => pluginManager.activate(event)) ?? []);
92
- });
93
-
94
- return () => clearTimeout(timeout);
87
+ useAsyncEffect(async () => {
88
+ await Promise.all(options.fireEvents?.map((event) => pluginManager.activate(event)) ?? []);
95
89
  }, [pluginManager]);
96
90
 
97
91
  // Create app.
98
- const App = useApp({ pluginManager });
92
+ const App = useApp({ pluginManager, setupEvents });
99
93
 
100
94
  return <App />;
101
95
  };
102
96
  };
103
97
 
98
+ const storyMeta = {
99
+ id: 'dxos.org/app-framework/story',
100
+ name: 'Story',
101
+ };
102
+
104
103
  // No-op plugin to ensure there exists at least one plugin for the startup event.
105
104
  // This is necessary because `createApp` expects the startup event to complete before the app is ready.
106
- const STORY_PLUGIN = 'dxos.org/app-framework/story';
107
- const storyPlugin = () =>
108
- definePlugin({ id: STORY_PLUGIN, name: 'Story' }, [
109
- defineModule({ id: STORY_PLUGIN, activatesOn: Events.Startup, activate: () => [] }),
110
- ]);
105
+ const StoryPlugin = Plugin.define(storyMeta).pipe(
106
+ Plugin.addModule({
107
+ id: 'Story',
108
+ activatesOn: ActivationEvents.Startup,
109
+ activate: () => Effect.succeed([]),
110
+ }),
111
+ Plugin.make,
112
+ )();
@@ -0,0 +1,92 @@
1
+ //
2
+ // Copyright 2022 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import * as Effect from 'effect/Effect';
7
+ import React, { useEffect } from 'react';
8
+
9
+ import { withTheme } from '@dxos/react-ui/testing';
10
+
11
+ import { ActivationEvents, Capabilities } from '../../../common';
12
+ import { Capability, Plugin } from '../../../core';
13
+ import { useApp } from '../../hooks';
14
+
15
+ // Minimal plugin that contributes a ReactRoot.
16
+ const TestPlugin = Plugin.define<{ error?: boolean }>({
17
+ id: 'dxos.org/plugin/test',
18
+ name: 'Test Plugin',
19
+ }).pipe(
20
+ Plugin.addModule(({ error }) => ({
21
+ id: 'TestMain',
22
+ activatesOn: ActivationEvents.Startup,
23
+ activate: () =>
24
+ Effect.succeed([
25
+ Capability.contributes(Capabilities.ReactRoot, {
26
+ id: 'dxos.org/plugin/test/root',
27
+ root: () => {
28
+ useEffect(() => {
29
+ let t: NodeJS.Timeout;
30
+ if (error) {
31
+ console.log('Ticking...');
32
+ t = setTimeout(() => {
33
+ console.log('Bang!');
34
+ throw new Error('Runtime error');
35
+ }, 3_000);
36
+ }
37
+
38
+ return () => clearTimeout(t);
39
+ }, [error]);
40
+
41
+ return <h1 className='text-lg'>App Started</h1>;
42
+ },
43
+ }),
44
+ ]),
45
+ })),
46
+ Plugin.make,
47
+ );
48
+
49
+ const core = [TestPlugin.meta.id];
50
+
51
+ type StoryProps = { plugins?: Plugin.Plugin[] };
52
+
53
+ const DefaultStory = ({ plugins }: StoryProps) => {
54
+ const App = useApp({
55
+ plugins,
56
+ core,
57
+ placeholder: () => {
58
+ return (
59
+ <div role='none' className='text-description'>
60
+ Loading...
61
+ </div>
62
+ );
63
+ },
64
+ });
65
+
66
+ return <App />;
67
+ };
68
+
69
+ const meta = {
70
+ title: 'sdk/app-framework/App',
71
+ render: DefaultStory,
72
+ decorators: [withTheme()],
73
+ parameters: {
74
+ layout: 'centered',
75
+ },
76
+ } satisfies Meta;
77
+
78
+ export default meta;
79
+
80
+ type Story = StoryObj<typeof meta>;
81
+
82
+ export const Default: Story = {
83
+ args: {
84
+ plugins: [TestPlugin({})],
85
+ },
86
+ };
87
+
88
+ export const WithError: Story = {
89
+ args: {
90
+ plugins: [TestPlugin({ error: true })],
91
+ },
92
+ };
@@ -0,0 +1,57 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React, { type PropsWithChildren } from 'react';
6
+
7
+ import { Capabilities } from '../../../common';
8
+ import { topologicalSort } from '../../../helpers';
9
+ import { LoadingState, type UseAppOptions, useCapabilities, useLoading } from '../../hooks';
10
+
11
+ export type AppProps = Pick<UseAppOptions, 'placeholder' | 'debounce'> & {
12
+ ready: boolean;
13
+ error: unknown;
14
+ };
15
+
16
+ export const App = ({ placeholder: Placeholder, ready, error, debounce }: AppProps) => {
17
+ const reactContexts = useCapabilities(Capabilities.ReactContext);
18
+ const reactRoots = useCapabilities(Capabilities.ReactRoot);
19
+ const stage = useLoading(ready, debounce);
20
+
21
+ if (error) {
22
+ // This triggers the error boundary to provide UI feedback for the startup error.
23
+ throw error;
24
+ }
25
+
26
+ // TODO(wittjosiah): Consider using Suspense instead.
27
+ if (stage < LoadingState.Done) {
28
+ if (!Placeholder) {
29
+ return null;
30
+ }
31
+
32
+ return <Placeholder stage={stage} />;
33
+ }
34
+
35
+ const ComposedContext = composeContexts(reactContexts);
36
+ return (
37
+ <ComposedContext>
38
+ {reactRoots.map(({ id, root: Component }) => (
39
+ <Component key={id} />
40
+ ))}
41
+ </ComposedContext>
42
+ );
43
+ };
44
+
45
+ const composeContexts = (contexts: Capabilities.ReactContext[]) => {
46
+ if (contexts.length === 0) {
47
+ return ({ children }: PropsWithChildren) => <>{children}</>;
48
+ }
49
+
50
+ return topologicalSort(contexts)
51
+ .map(({ context }) => context)
52
+ .reduce((Acc, Next) => ({ children }) => (
53
+ <Acc>
54
+ <Next>{children}</Next>
55
+ </Acc>
56
+ ));
57
+ };
@@ -2,4 +2,4 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- export * from './plugin';
5
+ export * from './App';
@@ -0,0 +1,183 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { Atom, useAtomValue } from '@effect-atom/atom-react';
6
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
+ import * as Effect from 'effect/Effect';
8
+ import React, { useEffect, useMemo, useState } from 'react';
9
+
10
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
11
+ import { useWebComponentContext } from '@dxos/web-context-react';
12
+
13
+ import { ActivationEvents, Capabilities } from '../../../common';
14
+ import { PluginManagerContext } from '../../../context';
15
+ import { Capability, Plugin } from '../../../core';
16
+ import { useApp } from '../../hooks';
17
+
18
+ // Define the Counter capability
19
+ const Counter = Capability.make<{ count: number; increment: () => void }>('example/counter');
20
+
21
+ const CountStatus = () => {
22
+ const manager = useWebComponentContext(PluginManagerContext);
23
+ const capabilitiesAtom = useMemo(
24
+ () => manager?.capabilities.atom(Counter) ?? Atom.make<{ count: number; increment: () => void }[]>([]),
25
+ [manager],
26
+ );
27
+ const capabilities = useAtomValue(capabilitiesAtom);
28
+ const counter = (capabilities as any)[0];
29
+ const [count, setCount] = useState(counter?.count ?? 0);
30
+
31
+ useEffect(() => {
32
+ if (!counter) {
33
+ return;
34
+ }
35
+ setCount(counter.count);
36
+ if ('subscribe' in counter && typeof counter.subscribe === 'function') {
37
+ return counter.subscribe(() => setCount(counter.count));
38
+ }
39
+ }, [counter]);
40
+
41
+ if (!manager) return null;
42
+
43
+ const isEven = count % 2 === 0;
44
+
45
+ return (
46
+ <div
47
+ className={`mt-4 px-4 py-2 rounded-full text-sm font-medium transition-colors ${
48
+ isEven
49
+ ? 'bg-emerald-100 text-emerald-800 dark:bg-emerald-900/30 dark:text-emerald-400'
50
+ : 'bg-amber-100 text-amber-800 dark:bg-amber-900/30 dark:text-amber-400'
51
+ }`}
52
+ >
53
+ Status: {isEven ? 'Even' : 'Odd'}
54
+ </div>
55
+ );
56
+ };
57
+
58
+ // A component that consumes the PluginManager via web context
59
+ const CounterComponent = () => {
60
+ // Use the web-context hook to get the PluginManager
61
+ const manager = useWebComponentContext(PluginManagerContext);
62
+ const capabilitiesAtom = useMemo(
63
+ () => manager?.capabilities.atom(Counter) ?? Atom.make<{ count: number; increment: () => void }[]>([]),
64
+ [manager],
65
+ );
66
+ const capabilities = useAtomValue(capabilitiesAtom);
67
+ const counter = (capabilities as any)[0];
68
+ const [count, setCount] = useState(counter?.count ?? 0);
69
+
70
+ useEffect(() => {
71
+ if (!counter) {
72
+ return;
73
+ }
74
+ setCount(counter.count);
75
+ if ('subscribe' in counter && typeof counter.subscribe === 'function') {
76
+ return counter.subscribe(() => setCount(counter.count));
77
+ }
78
+ }, [counter]);
79
+
80
+ if (!manager) {
81
+ return <div className='p-4 text-red-500'>Error: Context not found</div>;
82
+ }
83
+
84
+ return (
85
+ <div className='flex flex-col items-center justify-center h-screen bg-neutral-100 dark:bg-neutral-900 text-neutral-900 dark:text-white'>
86
+ <div className='p-8 bg-white dark:bg-neutral-800 rounded-lg shadow-xl border border-neutral-200 dark:border-neutral-700 max-w-md w-full'>
87
+ <h2 className='text-2xl font-bold mb-6 text-center text-primary-600 dark:text-primary-400'>
88
+ Web Context Counter
89
+ </h2>
90
+
91
+ <div className='flex flex-col items-center gap-6'>
92
+ <div className='text-6xl font-mono font-bold tabular-nums tracking-tighter'>{count}</div>
93
+
94
+ <button
95
+ className='px-6 py-3 bg-primary-600 hover:bg-primary-700 text-white font-semibold rounded-full transition-colors shadow-md active:transform active:scale-95'
96
+ onClick={() => {
97
+ const counter = manager.capabilities.get(Counter);
98
+ counter.increment();
99
+ }}
100
+ >
101
+ Increment
102
+ </button>
103
+
104
+ <CountStatus />
105
+ </div>
106
+
107
+ <div className='mt-8 pt-4 border-t border-neutral-200 dark:border-neutral-700 text-center'>
108
+ <p className='text-sm text-neutral-500 dark:text-neutral-400'>
109
+ This component accesses the <code>PluginManager</code> via <code>useWebComponentContext</code>.
110
+ </p>
111
+ </div>
112
+ </div>
113
+ </div>
114
+ );
115
+ };
116
+
117
+ // Plugin that provides the Counter capability and renders the UI
118
+ const CounterPlugin = Plugin.define({
119
+ id: 'dxos.org/plugin/counter',
120
+ name: 'Counter Plugin',
121
+ }).pipe(
122
+ Plugin.addModule({
123
+ id: 'CounterMain',
124
+ activatesOn: ActivationEvents.Startup,
125
+ activate: () => {
126
+ const listeners = new Set<() => void>();
127
+ const counter = {
128
+ count: 0,
129
+ increment: () => {
130
+ counter.count++;
131
+ listeners.forEach((listener) => listener());
132
+ },
133
+ subscribe: (listener: () => void) => {
134
+ listeners.add(listener);
135
+ return () => listeners.delete(listener);
136
+ },
137
+ };
138
+
139
+ return Effect.succeed([
140
+ // Contribute the state/logic
141
+ Capability.contributes(Counter, counter),
142
+
143
+ // Contribute the UI
144
+ Capability.contributes(Capabilities.ReactRoot, {
145
+ id: 'dxos.org/plugin/counter/root',
146
+ root: CounterComponent,
147
+ }),
148
+ ]);
149
+ },
150
+ }),
151
+ Plugin.make,
152
+ )();
153
+
154
+ const plugins = [CounterPlugin];
155
+ const core = ['dxos.org/plugin/counter'];
156
+ const placeholder = () => (
157
+ <div className='flex h-screen items-center justify-center p-4 text-lg text-neutral-500'>
158
+ Initializing Application...
159
+ </div>
160
+ );
161
+
162
+ const DefaultStory = () => {
163
+ const App = useApp({
164
+ plugins,
165
+ core,
166
+ placeholder,
167
+ });
168
+
169
+ return <App />;
170
+ };
171
+
172
+ const meta = {
173
+ title: 'sdk/app-framework/PluginManagerContext',
174
+ render: DefaultStory,
175
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
176
+ parameters: {
177
+ layout: 'fullscreen',
178
+ },
179
+ } satisfies Meta;
180
+
181
+ export default meta;
182
+
183
+ export const Default: StoryObj<typeof meta> = {};
@@ -6,14 +6,14 @@ import { createContext, useContext } from 'react';
6
6
 
7
7
  import { raise } from '@dxos/debug';
8
8
 
9
- import { type PluginManager } from '../core';
9
+ import { type PluginManager } from '../../../core';
10
10
 
11
- const PluginManagerContext = createContext<PluginManager | undefined>(undefined);
11
+ const PluginManagerContext = createContext<PluginManager.PluginManager | undefined>(undefined);
12
12
 
13
13
  /**
14
14
  * Get the plugin manager.
15
15
  */
16
- export const usePluginManager = (): PluginManager =>
16
+ export const usePluginManager = (): PluginManager.PluginManager =>
17
17
  useContext(PluginManagerContext) ?? raise(new Error('Missing PluginManagerContext'));
18
18
 
19
19
  /**
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './PluginManagerProvider';
@@ -0,0 +1,143 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';
7
+
8
+ import { faker } from '@dxos/random';
9
+ import { List, ListItem, Toolbar } from '@dxos/react-ui';
10
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
11
+ import { type ColorStyles, getHashStyles, mx } from '@dxos/ui-theme';
12
+
13
+ import { Capabilities } from '../../../common';
14
+ import { withPluginManager } from '../../../testing';
15
+ import { usePluginManager } from '../PluginManager';
16
+
17
+ import { SurfaceComponent, useSurfaces } from './SurfaceComponent';
18
+ import { create } from './types';
19
+
20
+ type TestComponentProps = {
21
+ id: string;
22
+ styles: ColorStyles;
23
+ };
24
+
25
+ const TestComponent = forwardRef<HTMLDivElement, TestComponentProps>(({ styles, id }, forwardedRef) => {
26
+ return (
27
+ <div
28
+ className={mx('flex justify-center items-center border rounded-sm', styles.surface, styles.border)}
29
+ ref={forwardedRef}
30
+ >
31
+ <span className={mx('dx-tag font-mono text-lg', styles.text)}>{id}</span>
32
+ </div>
33
+ );
34
+ });
35
+
36
+ const DefaultStory = () => {
37
+ const manager = usePluginManager();
38
+ const surfaces = useSurfaces();
39
+ const [selected, setSelected] = useState<string | undefined>();
40
+
41
+ const handleAdd = useCallback(() => {
42
+ const id = `test-${faker.number.int({ min: 0, max: 1_000 })}`;
43
+ const styles = getHashStyles(id);
44
+
45
+ manager.capabilities.contribute({
46
+ module: 'test',
47
+ interface: Capabilities.ReactSurface,
48
+ implementation: create({
49
+ id,
50
+ role: 'item',
51
+ filter: (data): data is any => (data as any)?.id === id,
52
+ component: ({ ref }) => <TestComponent id={id} styles={styles} ref={ref} />,
53
+ }),
54
+ });
55
+
56
+ setSelected(id);
57
+ }, [manager]);
58
+
59
+ const handleSelect = useCallback(() => {
60
+ setSelected(faker.helpers.arrayElement(surfaces)?.id);
61
+ }, [surfaces]);
62
+
63
+ const handleError = useCallback(() => {
64
+ manager.capabilities.contribute({
65
+ module: 'error',
66
+ interface: Capabilities.ReactSurface,
67
+ implementation: create({
68
+ id: 'error',
69
+ role: 'item',
70
+ filter: (data): data is any => (data as any)?.id === 'error',
71
+ component: () => {
72
+ const [count, setCount] = useState(3);
73
+ useEffect(() => {
74
+ const interval = setInterval(() => {
75
+ setCount((count) => {
76
+ if (count <= 1) {
77
+ clearInterval(interval);
78
+ }
79
+
80
+ return count - 1;
81
+ });
82
+ }, 1_000);
83
+ return () => clearInterval(interval);
84
+ }, []);
85
+
86
+ if (count <= 0) {
87
+ throw new Error('BANG!');
88
+ }
89
+
90
+ return (
91
+ <div className='flex justify-center items-center border border-rose-fill rounded-sm'>
92
+ <span className='font-mono'>Ticking... {count}</span>
93
+ </div>
94
+ );
95
+ },
96
+ }),
97
+ });
98
+
99
+ setSelected('error');
100
+ }, [manager]);
101
+
102
+ const ref = useRef<HTMLElement>(null);
103
+ useEffect(() => {
104
+ console.log(ref.current);
105
+ }, [ref]);
106
+
107
+ return (
108
+ <div className='flex flex-col h-full overflow-hidden'>
109
+ <Toolbar.Root>
110
+ <Toolbar.Button onClick={handleAdd}>Add</Toolbar.Button>
111
+ <Toolbar.Button onClick={handleSelect}>Pick</Toolbar.Button>
112
+ <Toolbar.Button onClick={handleError}>Error</Toolbar.Button>
113
+ </Toolbar.Root>
114
+ <div className='grid grid-cols-2 h-full gap-4 overflow-hidden'>
115
+ <SurfaceComponent role='item' data={selected ? { id: selected } : undefined} limit={1} ref={ref} />
116
+ <div className='overflow-y-auto h-full'>
117
+ <List>
118
+ {surfaces.map((surface) => (
119
+ <ListItem.Root key={surface.id} id={surface.id}>
120
+ <ListItem.Heading classNames='flex items-center'>{surface.id}</ListItem.Heading>
121
+ </ListItem.Root>
122
+ ))}
123
+ </List>
124
+ </div>
125
+ </div>
126
+ </div>
127
+ );
128
+ };
129
+
130
+ const meta = {
131
+ title: 'sdk/app-framework/Surface',
132
+ render: DefaultStory,
133
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' }), withPluginManager({ capabilities: [] })],
134
+ parameters: {
135
+ layout: 'fullscreen',
136
+ },
137
+ } satisfies Meta<typeof DefaultStory>;
138
+
139
+ export default meta;
140
+
141
+ type Story = StoryObj<typeof meta>;
142
+
143
+ export const Default: Story = {};