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

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 (471) hide show
  1. package/.storybook/main.mts +11 -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-7LE5X2NH.mjs +37 -0
  5. package/dist/lib/browser/capability-7LE5X2NH.mjs.map +7 -0
  6. package/dist/lib/browser/capability-DU35RXMD.mjs +34 -0
  7. package/dist/lib/browser/capability-DU35RXMD.mjs.map +7 -0
  8. package/dist/lib/browser/chunk-4DQMLMGU.mjs +44 -0
  9. package/dist/lib/browser/chunk-4DQMLMGU.mjs.map +7 -0
  10. package/dist/lib/browser/chunk-EIFGKQSA.mjs +170 -0
  11. package/dist/lib/browser/chunk-EIFGKQSA.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-IGRQWMWW.mjs +80 -0
  15. package/dist/lib/browser/chunk-IGRQWMWW.mjs.map +7 -0
  16. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  17. package/dist/lib/browser/chunk-KWP6PKIU.mjs +145 -0
  18. package/dist/lib/browser/chunk-KWP6PKIU.mjs.map +7 -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-WGWEEBUV.mjs +807 -0
  24. package/dist/lib/browser/chunk-WGWEEBUV.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-YAFEA4GV.mjs +1 -0
  26. package/dist/lib/browser/chunk-YZQ6NFG4.mjs +781 -0
  27. package/dist/lib/browser/chunk-YZQ6NFG4.mjs.map +7 -0
  28. package/dist/lib/browser/chunk-ZQO3UZ4R.mjs +77 -0
  29. package/dist/lib/browser/chunk-ZQO3UZ4R.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-7QW56NOM.mjs +36 -0
  45. package/dist/lib/browser/invoker-capability-7QW56NOM.mjs.map +7 -0
  46. package/dist/lib/browser/meta.json +1 -1
  47. package/dist/lib/browser/testing/index.mjs +83 -37
  48. package/dist/lib/browser/testing/index.mjs.map +4 -4
  49. package/dist/lib/browser/ui/index.mjs +49 -0
  50. package/dist/lib/browser/ui/index.mjs.map +7 -0
  51. package/dist/lib/node-esm/capability-OSVYGK4X.mjs +38 -0
  52. package/dist/lib/node-esm/capability-OSVYGK4X.mjs.map +7 -0
  53. package/dist/lib/node-esm/capability-SR2EIZFP.mjs +35 -0
  54. package/dist/lib/node-esm/capability-SR2EIZFP.mjs.map +7 -0
  55. package/dist/lib/node-esm/chunk-64IMLAS2.mjs +78 -0
  56. package/dist/lib/node-esm/chunk-64IMLAS2.mjs.map +7 -0
  57. package/dist/lib/node-esm/chunk-7OWSHPYK.mjs +48 -0
  58. package/dist/lib/node-esm/chunk-7OWSHPYK.mjs.map +7 -0
  59. package/dist/lib/node-esm/chunk-DHSHRYIB.mjs +171 -0
  60. package/dist/lib/node-esm/chunk-DHSHRYIB.mjs.map +7 -0
  61. package/dist/lib/node-esm/chunk-DZ2XLAGI.mjs +146 -0
  62. package/dist/lib/node-esm/chunk-DZ2XLAGI.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  64. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  65. package/dist/lib/node-esm/chunk-J2PHTRHC.mjs +45 -0
  66. package/dist/lib/node-esm/chunk-J2PHTRHC.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-OQYHRZYF.mjs +81 -0
  70. package/dist/lib/node-esm/chunk-OQYHRZYF.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-VV4YHPQQ.mjs +782 -0
  74. package/dist/lib/node-esm/chunk-VV4YHPQQ.mjs.map +7 -0
  75. package/dist/lib/node-esm/chunk-XHAKT6UD.mjs +808 -0
  76. package/dist/lib/node-esm/chunk-XHAKT6UD.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-CK4AMF2R.mjs +37 -0
  96. package/dist/lib/node-esm/invoker-capability-CK4AMF2R.mjs.map +7 -0
  97. package/dist/lib/node-esm/meta.json +1 -1
  98. package/dist/lib/node-esm/testing/index.mjs +83 -37
  99. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  100. package/dist/lib/node-esm/ui/index.mjs +50 -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.d.ts +8 -0
  181. package/dist/types/src/ui/components/App.d.ts.map +1 -0
  182. package/dist/types/src/ui/components/App.stories.d.ts +14 -0
  183. package/dist/types/src/ui/components/App.stories.d.ts.map +1 -0
  184. package/dist/types/src/ui/components/DefaultFallback.d.ts +8 -0
  185. package/dist/types/src/ui/components/DefaultFallback.d.ts.map +1 -0
  186. package/dist/types/src/ui/components/ErrorBoundary.d.ts +30 -0
  187. package/dist/types/src/ui/components/ErrorBoundary.d.ts.map +1 -0
  188. package/dist/types/src/ui/components/PluginManagerContext.stories.d.ts +13 -0
  189. package/dist/types/src/ui/components/PluginManagerContext.stories.d.ts.map +1 -0
  190. package/dist/types/src/ui/components/PluginManagerProvider.d.ts +10 -0
  191. package/dist/types/src/ui/components/PluginManagerProvider.d.ts.map +1 -0
  192. package/dist/types/src/ui/components/index.d.ts +5 -0
  193. package/dist/types/src/ui/components/index.d.ts.map +1 -0
  194. package/dist/types/src/ui/components/surface/SurfaceComponent.d.ts +12 -0
  195. package/dist/types/src/ui/components/surface/SurfaceComponent.d.ts.map +1 -0
  196. package/dist/types/src/ui/components/surface/SurfaceComponent.stories.d.ts +14 -0
  197. package/dist/types/src/ui/components/surface/SurfaceComponent.stories.d.ts.map +1 -0
  198. package/dist/types/src/ui/components/surface/SurfaceInfo.d.ts +11 -0
  199. package/dist/types/src/ui/components/surface/SurfaceInfo.d.ts.map +1 -0
  200. package/dist/types/src/ui/components/surface/context.d.ts +5 -0
  201. package/dist/types/src/ui/components/surface/context.d.ts.map +1 -0
  202. package/dist/types/src/ui/components/surface/index.d.ts +5 -0
  203. package/dist/types/src/ui/components/surface/index.d.ts.map +1 -0
  204. package/dist/types/src/ui/components/surface/types.d.ts +94 -0
  205. package/dist/types/src/ui/components/surface/types.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} +16 -9
  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 +4 -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 +14 -3
  224. package/package.json +112 -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 +696 -0
  240. package/src/core/plugin.ts +229 -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/logger → 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 +43 -44
  265. package/src/ui/components/App.stories.tsx +62 -0
  266. package/src/ui/components/App.tsx +57 -0
  267. package/src/ui/components/DefaultFallback.tsx +26 -0
  268. package/src/ui/components/ErrorBoundary.tsx +56 -0
  269. package/src/ui/components/PluginManagerContext.stories.tsx +183 -0
  270. package/src/{react → ui/components}/PluginManagerProvider.ts +3 -3
  271. package/src/ui/components/index.ts +8 -0
  272. package/src/ui/components/surface/SurfaceComponent.stories.tsx +142 -0
  273. package/src/ui/components/surface/SurfaceComponent.tsx +262 -0
  274. package/src/ui/components/surface/SurfaceInfo.tsx +107 -0
  275. package/src/ui/components/surface/context.ts +12 -0
  276. package/src/ui/components/surface/index.ts +8 -0
  277. package/src/ui/components/surface/types.ts +119 -0
  278. package/src/ui/hooks/index.ts +10 -0
  279. package/src/ui/hooks/useApp.tsx +215 -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 +7 -0
  286. package/tsconfig.json +12 -31
  287. package/vitest.config.ts +8 -6
  288. package/.swc/plugins/v7_linux_x86_64_13.0.0/f45bdff002284d9e8f9ef3f0be909de12da36c049cbcf261ac78fc00abb09a2d +0 -0
  289. package/.swc/plugins/v7_linux_x86_64_13.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429 +0 -0
  290. package/dist/lib/browser/app-graph-builder-LYF7EKNN.mjs +0 -137
  291. package/dist/lib/browser/app-graph-builder-LYF7EKNN.mjs.map +0 -7
  292. package/dist/lib/browser/chunk-FMN65HSW.mjs +0 -1519
  293. package/dist/lib/browser/chunk-FMN65HSW.mjs.map +0 -7
  294. package/dist/lib/browser/chunk-FO2PH7M3.mjs +0 -415
  295. package/dist/lib/browser/chunk-FO2PH7M3.mjs.map +0 -7
  296. package/dist/lib/browser/chunk-ORWHM7CO.mjs +0 -32
  297. package/dist/lib/browser/chunk-ORWHM7CO.mjs.map +0 -7
  298. package/dist/lib/browser/intent-dispatcher-LSYQZSEB.mjs +0 -11
  299. package/dist/lib/browser/intent-resolver-ZTNOSO3A.mjs +0 -39
  300. package/dist/lib/browser/intent-resolver-ZTNOSO3A.mjs.map +0 -7
  301. package/dist/lib/browser/store-KML2R4IE.mjs +0 -30
  302. package/dist/lib/browser/store-KML2R4IE.mjs.map +0 -7
  303. package/dist/lib/browser/worker.mjs +0 -79
  304. package/dist/lib/node-esm/app-graph-builder-SAOWGJDK.mjs +0 -138
  305. package/dist/lib/node-esm/app-graph-builder-SAOWGJDK.mjs.map +0 -7
  306. package/dist/lib/node-esm/chunk-73HGSHKE.mjs +0 -416
  307. package/dist/lib/node-esm/chunk-73HGSHKE.mjs.map +0 -7
  308. package/dist/lib/node-esm/chunk-UMZQERLE.mjs +0 -34
  309. package/dist/lib/node-esm/chunk-UMZQERLE.mjs.map +0 -7
  310. package/dist/lib/node-esm/chunk-ZEZ4FVEU.mjs +0 -1521
  311. package/dist/lib/node-esm/chunk-ZEZ4FVEU.mjs.map +0 -7
  312. package/dist/lib/node-esm/intent-dispatcher-6CYNGPSW.mjs +0 -12
  313. package/dist/lib/node-esm/intent-resolver-W7Z7WFFM.mjs +0 -40
  314. package/dist/lib/node-esm/intent-resolver-W7Z7WFFM.mjs.map +0 -7
  315. package/dist/lib/node-esm/store-QEXGXLWZ.mjs +0 -31
  316. package/dist/lib/node-esm/store-QEXGXLWZ.mjs.map +0 -7
  317. package/dist/lib/node-esm/worker.mjs +0 -80
  318. package/dist/types/src/App.d.ts.map +0 -1
  319. package/dist/types/src/common/collaboration.d.ts +0 -19
  320. package/dist/types/src/common/collaboration.d.ts.map +0 -1
  321. package/dist/types/src/common/events.d.ts +0 -52
  322. package/dist/types/src/common/events.d.ts.map +0 -1
  323. package/dist/types/src/common/file.d.ts +0 -14
  324. package/dist/types/src/common/file.d.ts.map +0 -1
  325. package/dist/types/src/common/graph.d.ts +0 -21
  326. package/dist/types/src/common/graph.d.ts.map +0 -1
  327. package/dist/types/src/common/layout.d.ts +0 -281
  328. package/dist/types/src/common/layout.d.ts.map +0 -1
  329. package/dist/types/src/common/surface.d.ts +0 -65
  330. package/dist/types/src/common/surface.d.ts.map +0 -1
  331. package/dist/types/src/core/capabilities.d.ts +0 -114
  332. package/dist/types/src/core/capabilities.d.ts.map +0 -1
  333. package/dist/types/src/core/capabilities.test.d.ts +0 -2
  334. package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
  335. package/dist/types/src/core/events.d.ts.map +0 -1
  336. package/dist/types/src/core/manager.d.ts +0 -122
  337. package/dist/types/src/core/manager.d.ts.map +0 -1
  338. package/dist/types/src/core/manager.test.d.ts +0 -2
  339. package/dist/types/src/core/manager.test.d.ts.map +0 -1
  340. package/dist/types/src/playground/debug/Debug.d.ts +0 -6
  341. package/dist/types/src/playground/debug/Debug.d.ts.map +0 -1
  342. package/dist/types/src/playground/debug/index.d.ts +0 -2
  343. package/dist/types/src/playground/debug/index.d.ts.map +0 -1
  344. package/dist/types/src/playground/debug/plugin.d.ts +0 -2
  345. package/dist/types/src/playground/debug/plugin.d.ts.map +0 -1
  346. package/dist/types/src/playground/generator/Main.d.ts +0 -6
  347. package/dist/types/src/playground/generator/Main.d.ts.map +0 -1
  348. package/dist/types/src/playground/generator/Toolbar.d.ts +0 -6
  349. package/dist/types/src/playground/generator/Toolbar.d.ts.map +0 -1
  350. package/dist/types/src/playground/generator/generator.d.ts +0 -7
  351. package/dist/types/src/playground/generator/generator.d.ts.map +0 -1
  352. package/dist/types/src/playground/generator/index.d.ts +0 -3
  353. package/dist/types/src/playground/generator/index.d.ts.map +0 -1
  354. package/dist/types/src/playground/generator/plugin.d.ts +0 -2
  355. package/dist/types/src/playground/generator/plugin.d.ts.map +0 -1
  356. package/dist/types/src/playground/layout/Layout.d.ts +0 -8
  357. package/dist/types/src/playground/layout/Layout.d.ts.map +0 -1
  358. package/dist/types/src/playground/layout/index.d.ts +0 -2
  359. package/dist/types/src/playground/layout/index.d.ts.map +0 -1
  360. package/dist/types/src/playground/layout/plugin.d.ts +0 -2
  361. package/dist/types/src/playground/layout/plugin.d.ts.map +0 -1
  362. package/dist/types/src/playground/logger/Toolbar.d.ts +0 -6
  363. package/dist/types/src/playground/logger/Toolbar.d.ts.map +0 -1
  364. package/dist/types/src/playground/logger/index.d.ts +0 -2
  365. package/dist/types/src/playground/logger/index.d.ts.map +0 -1
  366. package/dist/types/src/playground/logger/plugin.d.ts +0 -2
  367. package/dist/types/src/playground/logger/plugin.d.ts.map +0 -1
  368. package/dist/types/src/playground/logger/schema.d.ts +0 -13
  369. package/dist/types/src/playground/logger/schema.d.ts.map +0 -1
  370. package/dist/types/src/playground/playground.stories.d.ts +0 -10
  371. package/dist/types/src/playground/playground.stories.d.ts.map +0 -1
  372. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +0 -2
  373. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +0 -1
  374. package/dist/types/src/plugin-intent/actions.d.ts +0 -38
  375. package/dist/types/src/plugin-intent/actions.d.ts.map +0 -1
  376. package/dist/types/src/plugin-intent/errors.d.ts +0 -16
  377. package/dist/types/src/plugin-intent/errors.d.ts.map +0 -1
  378. package/dist/types/src/plugin-intent/index.d.ts +0 -5
  379. package/dist/types/src/plugin-intent/index.d.ts.map +0 -1
  380. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +0 -139
  381. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +0 -1
  382. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +0 -2
  383. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +0 -1
  384. package/dist/types/src/plugin-intent/intent.d.ts +0 -63
  385. package/dist/types/src/plugin-intent/intent.d.ts.map +0 -1
  386. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +0 -2
  387. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +0 -1
  388. package/dist/types/src/plugin-settings/actions.d.ts +0 -27
  389. package/dist/types/src/plugin-settings/actions.d.ts.map +0 -1
  390. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +0 -4
  391. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +0 -1
  392. package/dist/types/src/plugin-settings/index.d.ts +0 -3
  393. package/dist/types/src/plugin-settings/index.d.ts.map +0 -1
  394. package/dist/types/src/plugin-settings/intent-resolver.d.ts +0 -4
  395. package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +0 -1
  396. package/dist/types/src/plugin-settings/store.d.ts +0 -5
  397. package/dist/types/src/plugin-settings/store.d.ts.map +0 -1
  398. package/dist/types/src/plugin-settings/translations.d.ts +0 -10
  399. package/dist/types/src/plugin-settings/translations.d.ts.map +0 -1
  400. package/dist/types/src/react/ErrorBoundary.d.ts +0 -31
  401. package/dist/types/src/react/ErrorBoundary.d.ts.map +0 -1
  402. package/dist/types/src/react/IntentContext.d.ts +0 -8
  403. package/dist/types/src/react/IntentContext.d.ts.map +0 -1
  404. package/dist/types/src/react/PluginManagerProvider.d.ts +0 -10
  405. package/dist/types/src/react/PluginManagerProvider.d.ts.map +0 -1
  406. package/dist/types/src/react/Surface.d.ts +0 -12
  407. package/dist/types/src/react/Surface.d.ts.map +0 -1
  408. package/dist/types/src/react/Surface.stories.d.ts +0 -16
  409. package/dist/types/src/react/Surface.stories.d.ts.map +0 -1
  410. package/dist/types/src/react/common.d.ts +0 -13
  411. package/dist/types/src/react/common.d.ts.map +0 -1
  412. package/dist/types/src/react/index.d.ts +0 -7
  413. package/dist/types/src/react/index.d.ts.map +0 -1
  414. package/dist/types/src/react/useCapabilities.d.ts +0 -13
  415. package/dist/types/src/react/useCapabilities.d.ts.map +0 -1
  416. package/dist/types/src/react/useIntentResolver.d.ts +0 -3
  417. package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
  418. package/dist/types/src/worker.d.ts +0 -4
  419. package/dist/types/src/worker.d.ts.map +0 -1
  420. package/src/App.tsx +0 -276
  421. package/src/common/collaboration.ts +0 -21
  422. package/src/common/events.ts +0 -77
  423. package/src/common/file.ts +0 -22
  424. package/src/common/graph.ts +0 -30
  425. package/src/common/layout.ts +0 -278
  426. package/src/common/surface.ts +0 -86
  427. package/src/core/capabilities.test.ts +0 -136
  428. package/src/core/capabilities.ts +0 -254
  429. package/src/core/manager.test.ts +0 -515
  430. package/src/core/manager.ts +0 -519
  431. package/src/playground/debug/Debug.tsx +0 -39
  432. package/src/playground/debug/index.ts +0 -5
  433. package/src/playground/debug/plugin.ts +0 -17
  434. package/src/playground/generator/Main.tsx +0 -71
  435. package/src/playground/generator/Toolbar.tsx +0 -46
  436. package/src/playground/generator/generator.ts +0 -48
  437. package/src/playground/generator/index.ts +0 -6
  438. package/src/playground/generator/plugin.ts +0 -23
  439. package/src/playground/layout/Layout.tsx +0 -33
  440. package/src/playground/layout/plugin.ts +0 -17
  441. package/src/playground/logger/Toolbar.tsx +0 -29
  442. package/src/playground/logger/plugin.ts +0 -36
  443. package/src/playground/logger/schema.ts +0 -12
  444. package/src/playground/playground.stories.tsx +0 -42
  445. package/src/plugin-intent/IntentPlugin.ts +0 -20
  446. package/src/plugin-intent/actions.ts +0 -33
  447. package/src/plugin-intent/errors.ts +0 -39
  448. package/src/plugin-intent/index.ts +0 -8
  449. package/src/plugin-intent/intent-dispatcher.test.ts +0 -279
  450. package/src/plugin-intent/intent-dispatcher.ts +0 -333
  451. package/src/plugin-intent/intent.ts +0 -154
  452. package/src/plugin-settings/SettingsPlugin.ts +0 -35
  453. package/src/plugin-settings/actions.ts +0 -29
  454. package/src/plugin-settings/app-graph-builder.ts +0 -157
  455. package/src/plugin-settings/index.ts +0 -6
  456. package/src/plugin-settings/intent-resolver.ts +0 -34
  457. package/src/plugin-settings/store.ts +0 -33
  458. package/src/plugin-settings/translations.ts +0 -19
  459. package/src/react/ErrorBoundary.tsx +0 -45
  460. package/src/react/IntentContext.tsx +0 -34
  461. package/src/react/Surface.stories.tsx +0 -96
  462. package/src/react/Surface.tsx +0 -77
  463. package/src/react/common.ts +0 -12
  464. package/src/react/index.ts +0 -10
  465. package/src/react/useCapabilities.ts +0 -30
  466. package/src/react/useIntentResolver.ts +0 -22
  467. package/src/worker.ts +0 -11
  468. /package/dist/lib/browser/{intent-dispatcher-LSYQZSEB.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  469. /package/dist/lib/browser/{worker.mjs.map → chunk-YAFEA4GV.mjs.map} +0 -0
  470. /package/dist/lib/{node-esm/intent-dispatcher-6CYNGPSW.mjs.map → browser/common/activation-events.mjs.map} +0 -0
  471. /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,43 +43,46 @@ 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 = useMemo(() => setupPluginManager(options), [init]);
70
65
 
71
66
  // Set-up root capability.
72
67
  useEffect(() => {
73
- const capability = contributes(Capabilities.ReactRoot, {
68
+ const capability = Capability.contributes(Capabilities.ReactRoot, {
74
69
  id: context.id,
75
70
  root: () => <Story />,
76
71
  });
77
72
 
78
- pluginManager.context.contributeCapability({
73
+ pluginManager.capabilities.contribute({
79
74
  ...capability,
80
75
  module: 'dxos.org/app-framework/withPluginManager',
81
76
  });
82
77
 
83
78
  return () => {
84
- pluginManager.context.removeCapability(capability.interface, capability.implementation);
79
+ pluginManager.capabilities.remove(capability.interface, capability.implementation);
85
80
  };
86
81
  }, [pluginManager, context]);
87
82
 
88
83
  // 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);
84
+ useAsyncEffect(async () => {
85
+ await Promise.all(options.fireEvents?.map((event) => pluginManager.activate(event)) ?? []);
95
86
  }, [pluginManager]);
96
87
 
97
88
  // Create app.
@@ -101,10 +92,18 @@ export const withPluginManager = (options: WithPluginManagerOptions = {}): Decor
101
92
  };
102
93
  };
103
94
 
95
+ const storyMeta = {
96
+ id: 'dxos.org/app-framework/story',
97
+ name: 'Story',
98
+ };
99
+
104
100
  // No-op plugin to ensure there exists at least one plugin for the startup event.
105
101
  // 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
- ]);
102
+ const StoryPlugin = Plugin.define(storyMeta).pipe(
103
+ Plugin.addModule({
104
+ id: 'Story',
105
+ activatesOn: ActivationEvents.Startup,
106
+ activate: () => Effect.succeed([]),
107
+ }),
108
+ Plugin.make,
109
+ )();
@@ -0,0 +1,62 @@
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 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({
17
+ id: 'dxos.org/plugin/test',
18
+ name: 'Test Plugin',
19
+ }).pipe(
20
+ Plugin.addModule({
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
+ <div className='fixed inset-0 flex items-center justify-center text-2xl'>App Started Successfully!</div>
29
+ ),
30
+ }),
31
+ ]),
32
+ }),
33
+ Plugin.make,
34
+ );
35
+
36
+ const plugins = [TestPlugin()];
37
+ const core = [TestPlugin.meta.id];
38
+
39
+ const DefaultStory = () => {
40
+ const App = useApp({
41
+ plugins,
42
+ core,
43
+ placeholder: () => <div className='fixed inset-0 flex items-center justify-center'>Loading...</div>,
44
+ });
45
+
46
+ return <App />;
47
+ };
48
+
49
+ const meta = {
50
+ title: 'sdk/app-framework/App',
51
+ render: DefaultStory,
52
+ decorators: [withTheme()],
53
+ parameters: {
54
+ layout: 'fullscreen',
55
+ },
56
+ } satisfies Meta;
57
+
58
+ export default meta;
59
+
60
+ type Story = StoryObj<typeof meta>;
61
+
62
+ export const Default: Story = {};
@@ -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
+ };
@@ -0,0 +1,26 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ /**
8
+ * NOTE: Default fallback should not use tailwind or theme.
9
+ */
10
+ export const DefaultFallback = ({ error }: { error: Error }) => {
11
+ return (
12
+ <div
13
+ style={{
14
+ margin: '1rem',
15
+ padding: '1rem',
16
+ overflow: 'hidden',
17
+ border: '4px solid teal',
18
+ borderRadius: '1rem',
19
+ }}
20
+ >
21
+ {/* TODO(wittjosiah): Link to docs for replacing default. */}
22
+ <h1 style={{ margin: '0.5rem 0', fontSize: '1.2rem' }}>ERROR: {error.message}</h1>
23
+ <pre style={{ overflow: 'auto', fontSize: '1rem', whiteSpace: 'pre-wrap', color: '#888888' }}>{error.stack}</pre>
24
+ </div>
25
+ );
26
+ };
@@ -0,0 +1,56 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import React, { Component, type FC, type PropsWithChildren, type ReactNode } from 'react';
6
+
7
+ type State = {
8
+ error: Error | undefined;
9
+ };
10
+
11
+ export type ErrorBoundaryProps = PropsWithChildren<{
12
+ data?: any;
13
+ fallback?: FC<{ data?: any; error: Error }>;
14
+ }>;
15
+
16
+ /**
17
+ * Surface error boundary.
18
+ * For basic usage prefer providing a fallback component to `Surface`.
19
+ *
20
+ * Ref: https://react.dev/reference/react/Component#catching-rendering-errors-with-an-error-boundary
21
+ */
22
+ export class ErrorBoundary extends Component<ErrorBoundaryProps, State> {
23
+ static getDerivedStateFromError(error: Error): { error: Error } {
24
+ return { error };
25
+ }
26
+
27
+ override state = { error: undefined };
28
+
29
+ override componentDidUpdate(prevProps: ErrorBoundaryProps): void {
30
+ if (prevProps.data !== this.props.data) {
31
+ this.resetError();
32
+ }
33
+ }
34
+
35
+ override render(): ReactNode {
36
+ if (this.state.error) {
37
+ const Fallback = this.props.fallback ?? DefaultFallback;
38
+ return <Fallback data={this.props.data} error={this.state.error} />;
39
+ }
40
+
41
+ return this.props.children;
42
+ }
43
+
44
+ private resetError(): void {
45
+ this.setState({ error: undefined });
46
+ }
47
+ }
48
+
49
+ const DefaultFallback: NonNullable<ErrorBoundaryProps['fallback']> = ({ data, error }) => {
50
+ return (
51
+ <div className='flex flex-col gap-2 overflow-hidden border border-red-500 rounded-sm'>
52
+ <h1 className='p-2'>ERROR: {error.message}</h1>
53
+ <pre className='p-2 overflow-y-auto text-sm text-subdued'>{JSON.stringify(data, null, 2)}</pre>
54
+ </div>
55
+ );
56
+ };
@@ -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 { 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-bs 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()],
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,8 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './App';
6
+ export * from './DefaultFallback';
7
+ export * from './ErrorBoundary';
8
+ export * from './PluginManagerProvider';