@dxos/app-framework 0.8.4-main.84f28bd → 0.8.4-main.a4bbb77

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 (366) 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/.swc/plugins/{v7_linux_x86_64_13.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429 → linux_x86_64_19.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429.wasmer-v7} +0 -0
  5. package/dist/lib/browser/{app-graph-builder-BGGXLD6T.mjs → app-graph-builder-XH4OYQLC.mjs} +25 -25
  6. package/dist/lib/browser/app-graph-builder-XH4OYQLC.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-2636QSIK.mjs → chunk-6V54SRFL.mjs} +390 -270
  8. package/dist/lib/browser/chunk-6V54SRFL.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-ORWHM7CO.mjs → chunk-RGKMLI6U.mjs} +10 -7
  10. package/dist/lib/browser/chunk-RGKMLI6U.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-DHZB7HG7.mjs → chunk-ZZVFNUHZ.mjs} +189 -135
  12. package/dist/lib/browser/chunk-ZZVFNUHZ.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +20 -28
  14. package/dist/lib/browser/index.mjs.map +3 -3
  15. package/dist/lib/browser/{intent-dispatcher-TWKB22NI.mjs → intent-dispatcher-VFMJVO2M.mjs} +2 -2
  16. package/dist/lib/browser/{intent-resolver-O67UANYP.mjs → intent-resolver-ICAPD4JL.mjs} +5 -5
  17. package/dist/lib/browser/intent-resolver-ICAPD4JL.mjs.map +7 -0
  18. package/dist/lib/browser/meta.json +1 -1
  19. package/dist/lib/browser/{store-LFKDWHUQ.mjs → store-7ZGMHOGB.mjs} +4 -4
  20. package/dist/lib/browser/{store-LFKDWHUQ.mjs.map → store-7ZGMHOGB.mjs.map} +2 -2
  21. package/dist/lib/browser/testing/index.mjs +14 -19
  22. package/dist/lib/browser/testing/index.mjs.map +3 -3
  23. package/dist/lib/browser/worker.mjs +7 -9
  24. package/dist/lib/node-esm/{app-graph-builder-QHIJUYYW.mjs → app-graph-builder-C7H22SOL.mjs} +25 -25
  25. package/dist/lib/node-esm/app-graph-builder-C7H22SOL.mjs.map +7 -0
  26. package/dist/lib/node-esm/{chunk-NJAFK626.mjs → chunk-AXSZKZFD.mjs} +189 -135
  27. package/dist/lib/node-esm/chunk-AXSZKZFD.mjs.map +7 -0
  28. package/dist/lib/node-esm/{chunk-UMZQERLE.mjs → chunk-LKPMRTRR.mjs} +10 -7
  29. package/dist/lib/node-esm/chunk-LKPMRTRR.mjs.map +7 -0
  30. package/dist/lib/node-esm/{chunk-VSKRV3NW.mjs → chunk-SOVTUUAY.mjs} +390 -270
  31. package/dist/lib/node-esm/chunk-SOVTUUAY.mjs.map +7 -0
  32. package/dist/lib/node-esm/index.mjs +20 -28
  33. package/dist/lib/node-esm/index.mjs.map +3 -3
  34. package/dist/lib/node-esm/{intent-dispatcher-5PRM3KGH.mjs → intent-dispatcher-SAPOKSLZ.mjs} +2 -2
  35. package/dist/lib/node-esm/{intent-resolver-K3D4BXQQ.mjs → intent-resolver-CRNJ6BMD.mjs} +5 -5
  36. package/dist/lib/node-esm/intent-resolver-CRNJ6BMD.mjs.map +7 -0
  37. package/dist/lib/node-esm/meta.json +1 -1
  38. package/dist/lib/node-esm/{store-53XDUBMD.mjs → store-H4F4RMYD.mjs} +4 -4
  39. package/dist/lib/node-esm/{store-53XDUBMD.mjs.map → store-H4F4RMYD.mjs.map} +2 -2
  40. package/dist/lib/node-esm/testing/index.mjs +14 -19
  41. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  42. package/dist/lib/node-esm/worker.mjs +7 -9
  43. package/dist/types/src/common/capabilities.d.ts +85 -9
  44. package/dist/types/src/common/capabilities.d.ts.map +1 -1
  45. package/dist/types/src/common/collaboration.d.ts +9 -8
  46. package/dist/types/src/common/collaboration.d.ts.map +1 -1
  47. package/dist/types/src/common/events.d.ts.map +1 -1
  48. package/dist/types/src/common/layout.d.ts +0 -2
  49. package/dist/types/src/common/layout.d.ts.map +1 -1
  50. package/dist/types/src/common/surface.d.ts +7 -13
  51. package/dist/types/src/common/surface.d.ts.map +1 -1
  52. package/dist/types/src/components/App.d.ts +10 -0
  53. package/dist/types/src/components/App.d.ts.map +1 -0
  54. package/dist/types/src/components/App.stories.d.ts +14 -0
  55. package/dist/types/src/components/App.stories.d.ts.map +1 -0
  56. package/dist/types/src/components/DefaultFallback.d.ts +8 -0
  57. package/dist/types/src/components/DefaultFallback.d.ts.map +1 -0
  58. package/dist/types/src/components/index.d.ts +2 -0
  59. package/dist/types/src/components/index.d.ts.map +1 -0
  60. package/dist/types/src/{App.d.ts → components/useApp.d.ts} +7 -6
  61. package/dist/types/src/components/useApp.d.ts.map +1 -0
  62. package/dist/types/src/components/useLoading.d.ts +19 -0
  63. package/dist/types/src/components/useLoading.d.ts.map +1 -0
  64. package/dist/types/src/core/capabilities.d.ts +4 -1
  65. package/dist/types/src/core/capabilities.d.ts.map +1 -1
  66. package/dist/types/src/core/manager.d.ts +6 -2
  67. package/dist/types/src/core/manager.d.ts.map +1 -1
  68. package/dist/types/src/core/plugin.d.ts +4 -1
  69. package/dist/types/src/core/plugin.d.ts.map +1 -1
  70. package/dist/types/src/index.d.ts +1 -1
  71. package/dist/types/src/index.d.ts.map +1 -1
  72. package/dist/types/src/playground/debug/Debug.d.ts +1 -1
  73. package/dist/types/src/playground/debug/plugin.d.ts +1 -1
  74. package/dist/types/src/playground/debug/plugin.d.ts.map +1 -1
  75. package/dist/types/src/playground/generator/Main.d.ts +1 -1
  76. package/dist/types/src/playground/generator/Toolbar.d.ts +1 -1
  77. package/dist/types/src/playground/generator/Toolbar.d.ts.map +1 -1
  78. package/dist/types/src/playground/generator/generator.d.ts +1 -1
  79. package/dist/types/src/playground/generator/generator.d.ts.map +1 -1
  80. package/dist/types/src/playground/generator/plugin.d.ts +1 -1
  81. package/dist/types/src/playground/generator/plugin.d.ts.map +1 -1
  82. package/dist/types/src/playground/layout/Layout.d.ts +2 -2
  83. package/dist/types/src/playground/layout/plugin.d.ts +1 -1
  84. package/dist/types/src/playground/layout/plugin.d.ts.map +1 -1
  85. package/dist/types/src/playground/logger/Toolbar.d.ts +1 -1
  86. package/dist/types/src/playground/logger/Toolbar.d.ts.map +1 -1
  87. package/dist/types/src/playground/logger/plugin.d.ts +1 -1
  88. package/dist/types/src/playground/logger/plugin.d.ts.map +1 -1
  89. package/dist/types/src/playground/playground.stories.d.ts +5 -4
  90. package/dist/types/src/playground/playground.stories.d.ts.map +1 -1
  91. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +1 -1
  92. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +1 -1
  93. package/dist/types/src/plugin-intent/actions.d.ts +4 -6
  94. package/dist/types/src/plugin-intent/actions.d.ts.map +1 -1
  95. package/dist/types/src/plugin-intent/errors.d.ts.map +1 -1
  96. package/dist/types/src/plugin-intent/index.d.ts +1 -0
  97. package/dist/types/src/plugin-intent/index.d.ts.map +1 -1
  98. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +3 -3
  99. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +1 -1
  100. package/dist/types/src/plugin-intent/meta.d.ts +3 -0
  101. package/dist/types/src/plugin-intent/meta.d.ts.map +1 -0
  102. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +1 -1
  103. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +1 -1
  104. package/dist/types/src/plugin-settings/actions.d.ts +4 -6
  105. package/dist/types/src/plugin-settings/actions.d.ts.map +1 -1
  106. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +1 -1
  107. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +1 -1
  108. package/dist/types/src/plugin-settings/intent-resolver.d.ts +1 -1
  109. package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +1 -1
  110. package/dist/types/src/plugin-settings/meta.d.ts +3 -0
  111. package/dist/types/src/plugin-settings/meta.d.ts.map +1 -0
  112. package/dist/types/src/plugin-settings/store.d.ts +1 -1
  113. package/dist/types/src/plugin-settings/store.d.ts.map +1 -1
  114. package/dist/types/src/plugin-settings/translations.d.ts +2 -1
  115. package/dist/types/src/plugin-settings/translations.d.ts.map +1 -1
  116. package/dist/types/src/react/ErrorBoundary.d.ts +13 -14
  117. package/dist/types/src/react/ErrorBoundary.d.ts.map +1 -1
  118. package/dist/types/src/react/IntentContext.d.ts.map +1 -1
  119. package/dist/types/src/react/Surface.d.ts +2 -2
  120. package/dist/types/src/react/Surface.d.ts.map +1 -1
  121. package/dist/types/src/react/Surface.stories.d.ts +6 -5
  122. package/dist/types/src/react/Surface.stories.d.ts.map +1 -1
  123. package/dist/types/src/react/common.d.ts.map +1 -1
  124. package/dist/types/src/react/useCapabilities.d.ts.map +1 -1
  125. package/dist/types/src/testing/withPluginManager.d.ts +6 -6
  126. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  127. package/dist/types/src/testing/withPluginManager.stories.d.ts +9 -3
  128. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
  129. package/dist/types/tsconfig.tsbuildinfo +1 -1
  130. package/moon.yml +4 -0
  131. package/package.json +34 -29
  132. package/src/common/capabilities.ts +113 -12
  133. package/src/common/collaboration.ts +5 -8
  134. package/src/common/events.ts +3 -1
  135. package/src/common/layout.ts +2 -3
  136. package/src/common/surface.ts +15 -18
  137. package/src/components/App.stories.tsx +33 -0
  138. package/src/components/App.tsx +59 -0
  139. package/src/components/DefaultFallback.tsx +26 -0
  140. package/src/components/index.ts +5 -0
  141. package/src/{App.tsx → components/useApp.tsx} +24 -136
  142. package/src/components/useLoading.tsx +70 -0
  143. package/src/core/capabilities.test.ts +1 -1
  144. package/src/core/capabilities.ts +11 -6
  145. package/src/core/manager.test.ts +21 -20
  146. package/src/core/manager.ts +132 -54
  147. package/src/core/plugin.ts +8 -2
  148. package/src/helpers.test.ts +1 -1
  149. package/src/index.ts +1 -1
  150. package/src/playground/debug/Debug.tsx +1 -1
  151. package/src/playground/debug/plugin.ts +7 -8
  152. package/src/playground/generator/Toolbar.tsx +2 -1
  153. package/src/playground/generator/generator.ts +3 -3
  154. package/src/playground/generator/plugin.ts +12 -13
  155. package/src/playground/layout/plugin.ts +10 -9
  156. package/src/playground/logger/Toolbar.tsx +2 -1
  157. package/src/playground/logger/plugin.ts +30 -25
  158. package/src/playground/playground.stories.tsx +20 -16
  159. package/src/plugin-intent/IntentPlugin.ts +13 -13
  160. package/src/plugin-intent/actions.ts +3 -5
  161. package/src/plugin-intent/errors.ts +1 -0
  162. package/src/plugin-intent/index.ts +1 -0
  163. package/src/plugin-intent/intent-dispatcher.test.ts +1 -1
  164. package/src/plugin-intent/intent-dispatcher.ts +9 -8
  165. package/src/plugin-intent/meta.ts +10 -0
  166. package/src/plugin-settings/SettingsPlugin.ts +27 -28
  167. package/src/plugin-settings/actions.ts +8 -12
  168. package/src/plugin-settings/app-graph-builder.ts +14 -12
  169. package/src/plugin-settings/intent-resolver.ts +3 -2
  170. package/src/plugin-settings/meta.ts +10 -0
  171. package/src/plugin-settings/store.ts +1 -1
  172. package/src/plugin-settings/translations.ts +3 -3
  173. package/src/react/ErrorBoundary.tsx +24 -15
  174. package/src/react/IntentContext.tsx +3 -2
  175. package/src/react/Surface.stories.tsx +23 -18
  176. package/src/react/Surface.tsx +14 -5
  177. package/src/react/common.ts +2 -1
  178. package/src/react/useCapabilities.ts +2 -1
  179. package/src/testing/withPluginManager.stories.tsx +9 -5
  180. package/src/testing/withPluginManager.tsx +25 -29
  181. package/tsconfig.json +5 -9
  182. package/vitest.config.ts +8 -6
  183. package/.eslintrc.cjs +0 -9
  184. package/.swc/plugins/v7_linux_x86_64_13.0.0/f45bdff002284d9e8f9ef3f0be909de12da36c049cbcf261ac78fc00abb09a2d +0 -0
  185. package/dist/lib/browser/app-graph-builder-BGGXLD6T.mjs.map +0 -7
  186. package/dist/lib/browser/chunk-2636QSIK.mjs.map +0 -7
  187. package/dist/lib/browser/chunk-DHZB7HG7.mjs.map +0 -7
  188. package/dist/lib/browser/chunk-ORWHM7CO.mjs.map +0 -7
  189. package/dist/lib/browser/intent-resolver-O67UANYP.mjs.map +0 -7
  190. package/dist/lib/node-esm/app-graph-builder-QHIJUYYW.mjs.map +0 -7
  191. package/dist/lib/node-esm/chunk-NJAFK626.mjs.map +0 -7
  192. package/dist/lib/node-esm/chunk-UMZQERLE.mjs.map +0 -7
  193. package/dist/lib/node-esm/chunk-VSKRV3NW.mjs.map +0 -7
  194. package/dist/lib/node-esm/intent-resolver-K3D4BXQQ.mjs.map +0 -7
  195. package/dist/types/src/App.d.ts.map +0 -1
  196. package/typedoc/.nojekyll +0 -1
  197. package/typedoc/assets/hierarchy.js +0 -1
  198. package/typedoc/assets/highlight.css +0 -106
  199. package/typedoc/assets/icons.js +0 -18
  200. package/typedoc/assets/icons.svg +0 -1
  201. package/typedoc/assets/main.js +0 -60
  202. package/typedoc/assets/navigation.js +0 -1
  203. package/typedoc/assets/search.js +0 -1
  204. package/typedoc/assets/style.css +0 -1640
  205. package/typedoc/classes/CollaborationActions.InsertContent.html +0 -421
  206. package/typedoc/classes/ErrorBoundary.html +0 -125
  207. package/typedoc/classes/IntentAction.ShowUndo.html +0 -227
  208. package/typedoc/classes/IntentAction.Track.html +0 -266
  209. package/typedoc/classes/LayoutAction.AddToast.html +0 -265
  210. package/typedoc/classes/LayoutAction.Close.html +0 -382
  211. package/typedoc/classes/LayoutAction.Expose.html +0 -265
  212. package/typedoc/classes/LayoutAction.Open.html +0 -1123
  213. package/typedoc/classes/LayoutAction.RevertWorkspace.html +0 -343
  214. package/typedoc/classes/LayoutAction.ScrollIntoView.html +0 -460
  215. package/typedoc/classes/LayoutAction.Set.html +0 -460
  216. package/typedoc/classes/LayoutAction.SetLayoutMode.html +0 -499
  217. package/typedoc/classes/LayoutAction.SwitchWorkspace.html +0 -265
  218. package/typedoc/classes/LayoutAction.UpdateComplementary.html +0 -616
  219. package/typedoc/classes/LayoutAction.UpdateDialog.html +0 -1123
  220. package/typedoc/classes/LayoutAction.UpdateLayout.html +0 -461
  221. package/typedoc/classes/LayoutAction.UpdatePopover.html +0 -1435
  222. package/typedoc/classes/LayoutAction.UpdateSidebar.html +0 -616
  223. package/typedoc/classes/Plugin.html +0 -6
  224. package/typedoc/classes/PluginContext.html +0 -38
  225. package/typedoc/classes/PluginManager.html +0 -43
  226. package/typedoc/classes/PluginModule.html +0 -18
  227. package/typedoc/classes/SettingsAction.Open.html +0 -226
  228. package/typedoc/classes/SettingsAction.OpenPluginRegistry.html +0 -265
  229. package/typedoc/functions/Events.createStateEvent.html +0 -2
  230. package/typedoc/functions/IntentPlugin.html +0 -1
  231. package/typedoc/functions/SettingsPlugin.html +0 -1
  232. package/typedoc/functions/allOf.html +0 -2
  233. package/typedoc/functions/chain.html +0 -3
  234. package/typedoc/functions/contributes.html +0 -2
  235. package/typedoc/functions/createDispatcher.html +0 -3
  236. package/typedoc/functions/createIntent.html +0 -6
  237. package/typedoc/functions/createResolver.html +0 -2
  238. package/typedoc/functions/createSurface.html +0 -2
  239. package/typedoc/functions/defineCapability.html +0 -2
  240. package/typedoc/functions/defineEvent.html +0 -2
  241. package/typedoc/functions/defineModule.html +0 -2
  242. package/typedoc/functions/definePlugin.html +0 -2
  243. package/typedoc/functions/eventKey.html +0 -2
  244. package/typedoc/functions/getEvents.html +0 -2
  245. package/typedoc/functions/isAllOf.html +0 -2
  246. package/typedoc/functions/isOneOf.html +0 -2
  247. package/typedoc/functions/isSurfaceAvailable.html +0 -2
  248. package/typedoc/functions/lazy.html +0 -2
  249. package/typedoc/functions/oneOf.html +0 -2
  250. package/typedoc/functions/useApp.html +0 -6
  251. package/typedoc/functions/useAppGraph.html +0 -1
  252. package/typedoc/functions/useCapabilities.html +0 -3
  253. package/typedoc/functions/useCapability.html +0 -4
  254. package/typedoc/functions/useIntentDispatcher.html +0 -1
  255. package/typedoc/functions/useIntentResolver.html +0 -1
  256. package/typedoc/functions/useLayout.html +0 -1
  257. package/typedoc/functions/usePluginManager.html +0 -2
  258. package/typedoc/hierarchy.html +0 -1
  259. package/typedoc/index.html +0 -12
  260. package/typedoc/interfaces/LayoutAction.Toast.html +0 -10
  261. package/typedoc/media/LICENSE +0 -8
  262. package/typedoc/modules/Capabilities.html +0 -1
  263. package/typedoc/modules/CollaborationActions.html +0 -1
  264. package/typedoc/modules/Events.html +0 -1
  265. package/typedoc/modules/IntentAction.html +0 -1
  266. package/typedoc/modules/LayoutAction.html +0 -2
  267. package/typedoc/modules/SettingsAction.html +0 -1
  268. package/typedoc/modules.html +0 -1
  269. package/typedoc/types/ActivationEvent.html +0 -8
  270. package/typedoc/types/ActivationEvents.html +0 -2
  271. package/typedoc/types/AnyCapability.html +0 -1
  272. package/typedoc/types/AnyIntent.html +0 -1
  273. package/typedoc/types/AnyIntentChain.html +0 -1
  274. package/typedoc/types/AnyIntentEffectResult.html +0 -1
  275. package/typedoc/types/AnyIntentResolver.html +0 -1
  276. package/typedoc/types/AnyIntentResult.html +0 -1
  277. package/typedoc/types/Capabilities.FileUploader.html +0 -1
  278. package/typedoc/types/Capabilities.IntentResolver.html +0 -1
  279. package/typedoc/types/Capabilities.Layout.html +0 -1
  280. package/typedoc/types/Capabilities.Metadata.html +0 -1
  281. package/typedoc/types/Capabilities.ReactContext.html +0 -1
  282. package/typedoc/types/Capabilities.ReactRoot.html +0 -1
  283. package/typedoc/types/Capabilities.ReactSurface.html +0 -1
  284. package/typedoc/types/Capabilities.Settings.html +0 -4
  285. package/typedoc/types/Capability.html +0 -9
  286. package/typedoc/types/CreateAppOptions.html +0 -10
  287. package/typedoc/types/FileInfo.html +0 -1
  288. package/typedoc/types/Intent.html +0 -10
  289. package/typedoc/types/IntentChain.html +0 -6
  290. package/typedoc/types/IntentContext.html +0 -5
  291. package/typedoc/types/IntentData.html +0 -1
  292. package/typedoc/types/IntentDispatcher.html +0 -2
  293. package/typedoc/types/IntentDispatcherResult.html +0 -2
  294. package/typedoc/types/IntentEffectDefinition.html +0 -2
  295. package/typedoc/types/IntentEffectResult.html +0 -15
  296. package/typedoc/types/IntentParams.html +0 -3
  297. package/typedoc/types/IntentResolver.html +0 -2
  298. package/typedoc/types/IntentResultData.html +0 -1
  299. package/typedoc/types/IntentSchema.html +0 -1
  300. package/typedoc/types/IntentUndo.html +0 -2
  301. package/typedoc/types/InterfaceDef.html +0 -4
  302. package/typedoc/types/Label.html +0 -1
  303. package/typedoc/types/NodeSerializer.html +0 -8
  304. package/typedoc/types/PluginManagerOptions.html +0 -6
  305. package/typedoc/types/PluginMeta.html +0 -21
  306. package/typedoc/types/PromiseIntentDispatcher.html +0 -2
  307. package/typedoc/types/PromiseIntentUndo.html +0 -2
  308. package/typedoc/types/Resource.html +0 -1
  309. package/typedoc/types/ResourceKey.html +0 -1
  310. package/typedoc/types/ResourceLanguage.html +0 -1
  311. package/typedoc/types/SerializedNode.html +0 -4
  312. package/typedoc/types/SurfaceComponent.html +0 -2
  313. package/typedoc/types/SurfaceDefinition.html +0 -2
  314. package/typedoc/types/SurfaceProps.html +0 -4
  315. package/typedoc/variables/Capabilities.AnchorSort.html +0 -1
  316. package/typedoc/variables/Capabilities.AppGraph.html +0 -1
  317. package/typedoc/variables/Capabilities.AppGraphBuilder.html +0 -1
  318. package/typedoc/variables/Capabilities.AppGraphSerializer.html +0 -1
  319. package/typedoc/variables/Capabilities.ArtifactDefinition.html +0 -1
  320. package/typedoc/variables/Capabilities.FileUploader.html +0 -1
  321. package/typedoc/variables/Capabilities.IntentDispatcher.html +0 -1
  322. package/typedoc/variables/Capabilities.IntentResolver.html +0 -1
  323. package/typedoc/variables/Capabilities.Layout.html +0 -1
  324. package/typedoc/variables/Capabilities.Metadata.html +0 -1
  325. package/typedoc/variables/Capabilities.Null.html +0 -1
  326. package/typedoc/variables/Capabilities.PluginManager.html +0 -1
  327. package/typedoc/variables/Capabilities.ReactContext.html +0 -1
  328. package/typedoc/variables/Capabilities.ReactRoot.html +0 -1
  329. package/typedoc/variables/Capabilities.ReactSurface.html +0 -1
  330. package/typedoc/variables/Capabilities.RxRegistry.html +0 -1
  331. package/typedoc/variables/Capabilities.Settings.html +0 -1
  332. package/typedoc/variables/Capabilities.SettingsStore.html +0 -1
  333. package/typedoc/variables/Capabilities.Tools.html +0 -1
  334. package/typedoc/variables/Capabilities.Translations.html +0 -1
  335. package/typedoc/variables/Events.AppGraphReady.html +0 -2
  336. package/typedoc/variables/Events.DispatcherReady.html +0 -2
  337. package/typedoc/variables/Events.LayoutReady.html +0 -1
  338. package/typedoc/variables/Events.SettingsReady.html +0 -2
  339. package/typedoc/variables/Events.SetupAppGraph.html +0 -2
  340. package/typedoc/variables/Events.SetupArtifactDefinition.html +0 -2
  341. package/typedoc/variables/Events.SetupIntentResolver.html +0 -2
  342. package/typedoc/variables/Events.SetupMetadata.html +0 -2
  343. package/typedoc/variables/Events.SetupReactSurface.html +0 -2
  344. package/typedoc/variables/Events.SetupSettings.html +0 -2
  345. package/typedoc/variables/Events.SetupTranslations.html +0 -2
  346. package/typedoc/variables/Events.Startup.html +0 -2
  347. package/typedoc/variables/FileInfoSchema.html +0 -1
  348. package/typedoc/variables/INTENT_ACTION.html +0 -1
  349. package/typedoc/variables/INTENT_PLUGIN.html +0 -1
  350. package/typedoc/variables/LAYOUT_ACTION.html +0 -1
  351. package/typedoc/variables/LAYOUT_PLUGIN.html +0 -1
  352. package/typedoc/variables/Label.html +0 -1
  353. package/typedoc/variables/LayoutAction.Toast.html +0 -1
  354. package/typedoc/variables/LayoutAction.UPDATE_LAYOUT.html +0 -1
  355. package/typedoc/variables/PluginManagerProvider.html +0 -2
  356. package/typedoc/variables/Resource.html +0 -2
  357. package/typedoc/variables/ResourceKey.html +0 -1
  358. package/typedoc/variables/ResourceLanguage.html +0 -1
  359. package/typedoc/variables/SETTINGS_ACTION.html +0 -1
  360. package/typedoc/variables/SETTINGS_ID.html +0 -1
  361. package/typedoc/variables/SETTINGS_KEY.html +0 -1
  362. package/typedoc/variables/SETTINGS_PLUGIN.html +0 -1
  363. package/typedoc/variables/Surface.html +0 -2
  364. package/typedoc/variables/defaultFileTypes.html +0 -1
  365. /package/dist/lib/browser/{intent-dispatcher-TWKB22NI.mjs.map → intent-dispatcher-VFMJVO2M.mjs.map} +0 -0
  366. /package/dist/lib/node-esm/{intent-dispatcher-5PRM3KGH.mjs.map → intent-dispatcher-SAPOKSLZ.mjs.map} +0 -0
@@ -4,16 +4,16 @@
4
4
 
5
5
  import { Registry } from '@effect-rx/rx-react';
6
6
  import { untracked } from '@preact/signals-core';
7
- import { Array as A, Effect, Either, Match, pipe } from 'effect';
7
+ import { Array, Duration, Effect, Fiber, HashSet, Match, Ref, pipe } from 'effect';
8
8
 
9
9
  import { Event } from '@dxos/async';
10
- import { live, type Live } from '@dxos/live-object';
10
+ import { type Live, live } from '@dxos/live-object';
11
11
  import { log } from '@dxos/log';
12
12
  import { type MaybePromise } from '@dxos/util';
13
13
 
14
14
  import { type AnyCapability, PluginContext } from './capabilities';
15
15
  import { type ActivationEvent, eventKey, getEvents, isAllOf } from './events';
16
- import { type PluginModule, type Plugin } from './plugin';
16
+ import { type Plugin, type PluginModule } from './plugin';
17
17
 
18
18
  // TODO(wittjosiah): Factor out?
19
19
  const isPromise = (value: unknown): value is Promise<unknown> => {
@@ -52,6 +52,9 @@ export class PluginManager {
52
52
  private readonly _state: Live<PluginManagerState>;
53
53
  private readonly _pluginLoader: PluginManagerOptions['pluginLoader'];
54
54
  private readonly _capabilities = new Map<string, AnyCapability[]>();
55
+ private readonly _moduleMemoMap = new Map<PluginModule['id'], Promise<AnyCapability[]>>();
56
+ private readonly _activatingEvents = Effect.runSync(Ref.make<string[]>([]));
57
+ private readonly _activatingModules = Effect.runSync(Ref.make<string[]>([]));
55
58
 
56
59
  constructor({
57
60
  pluginLoader,
@@ -74,8 +77,8 @@ export class PluginManager {
74
77
  enabled,
75
78
  modules: [],
76
79
  active: [],
77
- pendingReset: [],
78
80
  eventsFired: [],
81
+ pendingReset: [],
79
82
  });
80
83
  plugins.forEach((plugin) => this._addPlugin(plugin));
81
84
  core.forEach((id) => this.enable(id));
@@ -268,6 +271,7 @@ export class PluginManager {
268
271
  private _addPlugin(plugin: Plugin): void {
269
272
  untracked(() => {
270
273
  log('add plugin', { id: plugin.meta.id });
274
+ // TODO(wittjosiah): Find a way to add a warning for duplicate plugins that doesn't cause log spam.
271
275
  if (!this._state.plugins.includes(plugin)) {
272
276
  this._state.plugins.push(plugin);
273
277
  }
@@ -287,6 +291,7 @@ export class PluginManager {
287
291
  private _addModule(module: PluginModule): void {
288
292
  untracked(() => {
289
293
  log('add module', { id: module.id });
294
+ // TODO(wittjosiah): Find a way to add a warning for duplicate modules that doesn't cause log spam.
290
295
  if (!this._state.modules.includes(module)) {
291
296
  this._state.modules.push(module);
292
297
  }
@@ -329,7 +334,7 @@ export class PluginManager {
329
334
  .map(eventKey)
330
335
  .filter((key) => this._state.eventsFired.includes(key));
331
336
 
332
- const pendingReset = Array.from(new Set(activationEvents)).filter(
337
+ const pendingReset = Array.fromIterable(new Set(activationEvents)).filter(
333
338
  (event) => !this._state.pendingReset.includes(event),
334
339
  );
335
340
  if (pendingReset.length > 0) {
@@ -343,24 +348,42 @@ export class PluginManager {
343
348
  * @internal
344
349
  */
345
350
  // TODO(wittjosiah): Improve error typing.
346
- _activate(event: ActivationEvent | string): Effect.Effect<boolean, Error> {
351
+ _activate(
352
+ event: ActivationEvent | string,
353
+ params?: { before?: string; after?: string },
354
+ ): Effect.Effect<boolean, Error> {
347
355
  return Effect.gen(this, function* () {
348
356
  const key = typeof event === 'string' ? event : eventKey(event);
349
- log('activating', { key });
357
+ log('activating', { key, ...params });
358
+ yield* Ref.update(this._activatingEvents, (activating) => Array.append(activating, key));
350
359
  const pendingIndex = this._state.pendingReset.findIndex((event) => event === key);
351
360
  if (pendingIndex !== -1) {
352
361
  this._state.pendingReset.splice(pendingIndex, 1);
353
362
  }
354
363
 
364
+ const activatingEvents = yield* this._activatingEvents;
365
+ const activatingModules = yield* this._activatingModules;
355
366
  const modules = this._getInactiveModulesByEvent(key).filter((module) => {
356
367
  const allOf = isAllOf(module.activatesOn);
357
368
  if (!allOf) {
358
369
  return true;
359
370
  }
360
371
 
372
+ // Check to see if all of the events in the `allOf` have been fired.
373
+ // An event can be considered "fired" if it is in the `eventsFired` list or if it is currently being activated.
361
374
  const events = module.activatesOn.events.filter((event) => eventKey(event) !== key);
362
- return events.every((event) => this._state.eventsFired.includes(eventKey(event)));
375
+ return (
376
+ events.every(
377
+ (event) => this._state.eventsFired.includes(eventKey(event)) || activatingEvents.includes(eventKey(event)),
378
+ ) && !activatingModules.includes(module.id)
379
+ );
363
380
  });
381
+ yield* Ref.update(this._activatingModules, (activating) =>
382
+ Array.appendAll(
383
+ activating,
384
+ modules.map((module) => module.id),
385
+ ),
386
+ );
364
387
  if (modules.length === 0) {
365
388
  log('no modules to activate', { key });
366
389
  if (!this._state.eventsFired.includes(key)) {
@@ -372,31 +395,53 @@ export class PluginManager {
372
395
  log('activating modules', { key, modules: modules.map((module) => module.id) });
373
396
  this.activation.emit({ event: key, state: 'activating' });
374
397
 
398
+ // Fire activatesBefore events.
399
+ yield* pipe(
400
+ modules,
401
+ Array.flatMap((module) => module.activatesBefore ?? []),
402
+ HashSet.fromIterable,
403
+ HashSet.toValues,
404
+ Array.filter((event) => !activatingEvents.includes(eventKey(event))),
405
+ Array.map((event) => this._activate(event, { before: key })),
406
+ Effect.allWith({ concurrency: 'unbounded' }),
407
+ );
408
+
375
409
  // Concurrently triggers loading of lazy capabilities.
376
- const getCapabilities = yield* Effect.all(
377
- modules.map(({ activate }) =>
378
- Effect.tryPromise({
379
- try: async () => activate(this.context),
380
- catch: (error) => error as Error,
381
- }),
382
- ),
383
- { concurrency: 'unbounded' },
410
+ const getCapabilities = yield* pipe(
411
+ modules,
412
+ Array.map((mod) => this._loadModule(mod)),
413
+ Effect.allWith({ concurrency: 'unbounded' }),
414
+ Effect.catchAll((error) => {
415
+ this.activation.emit({ event: key, state: 'error', error });
416
+ return Effect.fail(error);
417
+ }),
384
418
  );
385
419
 
386
- const result = yield* pipe(
420
+ // Contribute the capabilities from the activated modules.
421
+ yield* pipe(
387
422
  modules,
388
- A.zip(getCapabilities),
389
- A.map(([module, getCapabilities]) => this._activateModule(module, getCapabilities)),
423
+ Array.zip(getCapabilities),
424
+ Array.map(([module, capabilities]) => this._contributeCapabilities(module, capabilities)),
390
425
  // TODO(wittjosiah): This currently can't be run in parallel.
391
426
  // Running this with concurrency causes races with `allOf` activation events.
392
427
  Effect.all,
393
- Effect.either,
394
428
  );
395
429
 
396
- if (Either.isLeft(result)) {
397
- this.activation.emit({ event: key, state: 'error', error: result.left });
398
- yield* Effect.fail(result.left);
399
- }
430
+ // Fire activatesAfter events.
431
+ yield* pipe(
432
+ modules,
433
+ Array.flatMap((module) => module.activatesAfter ?? []),
434
+ HashSet.fromIterable,
435
+ HashSet.toValues,
436
+ Array.filter((event) => !activatingEvents.includes(eventKey(event))),
437
+ Array.map((event) => this._activate(event, { after: key })),
438
+ Effect.allWith({ concurrency: 'unbounded' }),
439
+ );
440
+
441
+ yield* Ref.update(this._activatingEvents, (activating) => Array.filter(activating, (event) => event !== key));
442
+ yield* Ref.update(this._activatingModules, (activating) =>
443
+ Array.filter(activating, (module) => !modules.map((module) => module.id).includes(module)),
444
+ );
400
445
 
401
446
  if (!this._state.eventsFired.includes(key)) {
402
447
  this._state.eventsFired.push(key);
@@ -409,43 +454,60 @@ export class PluginManager {
409
454
  });
410
455
  }
411
456
 
412
- private _activateModule(
413
- module: PluginModule,
414
- getCapabilities: AnyCapability | AnyCapability[] | (() => Promise<AnyCapability | AnyCapability[]>),
415
- ): Effect.Effect<void, Error> {
416
- return Effect.gen(this, function* () {
417
- yield* Effect.all(module.activatesBefore?.map((event) => this._activate(event)) ?? [], {
418
- concurrency: 'unbounded',
419
- });
457
+ // Memoized with _moduleMemoMap
458
+ private _loadModule = (mod: PluginModule): Effect.Effect<AnyCapability[], Error> =>
459
+ Effect.tryPromise({
460
+ try: async () => {
461
+ const entry = this._moduleMemoMap.get(mod.id);
462
+ if (entry) {
463
+ return entry;
464
+ }
420
465
 
421
- log('activating module...', { module: module.id });
422
- // TODO(wittjosiah): This is not handling errors thrown if this is synchronous.
423
- const maybeCapabilities = typeof getCapabilities === 'function' ? getCapabilities() : getCapabilities;
424
- const resolvedCapabilities = yield* Match.value(maybeCapabilities).pipe(
425
- // TODO(wittjosiah): Activate with an effect?
426
- // Match.when(Effect.isEffect, (effect) => effect),
427
- Match.when(isPromise, (promise) =>
428
- Effect.tryPromise({
429
- try: () => promise,
430
- catch: (error) => error as Error,
431
- }),
466
+ const promise = (async () => {
467
+ const start = performance.now();
468
+ let failed = false;
469
+ try {
470
+ log('loading module', { module: mod.id });
471
+ // TODO(wittjosiah): Support activation with an effect.
472
+ let activationResult = await mod.activate(this.context);
473
+ if (typeof activationResult === 'function') {
474
+ activationResult = await activationResult();
475
+ }
476
+ return Array.isArray(activationResult) ? activationResult : [activationResult];
477
+ } catch (error) {
478
+ failed = true;
479
+ throw error;
480
+ } finally {
481
+ performance.measure('activate-module', {
482
+ start,
483
+ end: performance.now(),
484
+ detail: {
485
+ module: mod.id,
486
+ },
487
+ });
488
+ log('loaded module', { module: mod.id, elapsed: performance.now() - start, failed });
489
+ }
490
+ })();
491
+ this._moduleMemoMap.set(mod.id, promise);
492
+ return promise;
493
+ },
494
+ catch: (error) => error as Error,
495
+ }).pipe(
496
+ Effect.withSpan('PluginManager._loadModule'),
497
+ together(
498
+ Effect.sleep(Duration.seconds(10)).pipe(
499
+ Effect.andThen(Effect.sync(() => log.warn(`module is taking a long time to activate`, { module: mod.id }))),
432
500
  ),
433
- Match.orElse((program) => Effect.succeed(program)),
434
- );
435
- const capabilities = Match.value(resolvedCapabilities).pipe(
436
- Match.when(Array.isArray, (array) => array),
437
- Match.orElse((value) => [value]),
438
- );
501
+ ),
502
+ );
503
+
504
+ private _contributeCapabilities(module: PluginModule, capabilities: AnyCapability[]): Effect.Effect<void, Error> {
505
+ return Effect.gen(this, function* () {
439
506
  capabilities.forEach((capability) => {
440
507
  this.context.contributeCapability({ module: module.id, ...capability });
441
508
  });
442
509
  this._state.active.push(module.id);
443
510
  this._capabilities.set(module.id, capabilities);
444
- log('activated module', { module: module.id });
445
-
446
- yield* Effect.all(module.activatesAfter?.map((event) => this._activate(event)) ?? [], {
447
- concurrency: 'unbounded',
448
- });
449
511
  });
450
512
  }
451
513
 
@@ -469,6 +531,7 @@ export class PluginManager {
469
531
  return Effect.gen(this, function* () {
470
532
  const id = module.id;
471
533
  log('deactivating', { id });
534
+ this._moduleMemoMap.delete(id);
472
535
 
473
536
  const capabilities = this._capabilities.get(id);
474
537
  if (capabilities) {
@@ -517,3 +580,18 @@ export class PluginManager {
517
580
  });
518
581
  }
519
582
  }
583
+
584
+ /**
585
+ * Runs an effect concurrently with another effect.
586
+ * If the first effect completes, the second effect is interrupted.
587
+ */
588
+ // TODO(dmaretskyi): Effect.race > Effect.asVoid
589
+ const together =
590
+ <R1>(togetherEffect: Effect.Effect<void, never, R1>) =>
591
+ <A, E, R2>(effect: Effect.Effect<A, E, R2>): Effect.Effect<A, E, R1 | R2> =>
592
+ Effect.gen(function* () {
593
+ const togetherFiber = yield* Effect.fork(togetherEffect);
594
+ const result = yield* effect;
595
+ yield* Fiber.interrupt(togetherFiber);
596
+ return result;
597
+ });
@@ -124,9 +124,15 @@ export class Plugin {
124
124
  ) {}
125
125
  }
126
126
 
127
+ export type PluginFactory<T = void> = ((args: T) => Plugin) & { meta: PluginMeta };
128
+
127
129
  /**
128
130
  * Helper to define a plugin.
129
131
  */
130
- export const definePlugin = (meta: PluginMeta, modules: PluginModule[]) => {
131
- return new Plugin(meta, modules);
132
+ export const definePlugin = <T = void>(meta: PluginMeta, provider: (args: T) => PluginModule[]): PluginFactory<T> => {
133
+ const factory = (args: T) => {
134
+ return new Plugin(meta, provider(args));
135
+ };
136
+
137
+ return Object.assign(factory, { meta });
132
138
  };
@@ -2,7 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { describe, it, expect } from 'vitest';
5
+ import { describe, expect, it } from 'vitest';
6
6
 
7
7
  import { topologicalSort } from './helpers';
8
8
 
package/src/index.ts CHANGED
@@ -2,8 +2,8 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- export * from './App';
6
5
  export * from './common';
6
+ export * from './components';
7
7
  export * from './core';
8
8
  export * from './plugin-intent';
9
9
  export * from './plugin-settings';
@@ -22,7 +22,7 @@ export const Debug = () => {
22
22
  };
23
23
 
24
24
  return (
25
- <SyntaxHighlighter language='json' classNames='flex w-full text-xs opacity-75 rounded'>
25
+ <SyntaxHighlighter language='json' classNames='text-xs opacity-75 rounded'>
26
26
  {JSON.stringify(object, undefined, 2)}
27
27
  </SyntaxHighlighter>
28
28
  );
@@ -7,11 +7,10 @@ import { defineModule, definePlugin, lazy } from '../../core';
7
7
 
8
8
  const Debug = lazy(() => import('./Debug'));
9
9
 
10
- export const DebugPlugin = () =>
11
- definePlugin({ id: 'dxos.org/test/plugin-debug', name: 'Debug' }, [
12
- defineModule({
13
- id: 'dxos.org/test/debug/main',
14
- activatesOn: Events.Startup,
15
- activate: Debug,
16
- }),
17
- ]);
10
+ export const DebugPlugin = definePlugin({ id: 'dxos.org/test/plugin-debug', name: 'Debug' }, () => [
11
+ defineModule({
12
+ id: 'dxos.org/test/debug/main',
13
+ activatesOn: Events.Startup,
14
+ activate: Debug,
15
+ }),
16
+ ]);
@@ -6,12 +6,13 @@ import React, { useCallback } from 'react';
6
6
 
7
7
  import { Button } from '@dxos/react-ui';
8
8
 
9
- import { createGeneratorIntent, createPluginId, Number } from './generator';
10
9
  import { Capabilities } from '../../common';
11
10
  import { contributes } from '../../core';
12
11
  import { createIntent } from '../../plugin-intent';
13
12
  import { useCapabilities, useIntentDispatcher, usePluginManager } from '../../react';
14
13
 
14
+ import { Number, createGeneratorIntent, createPluginId } from './generator';
15
+
15
16
  export const Toolbar = () => {
16
17
  const manager = usePluginManager();
17
18
  const { dispatchPromise: dispatch } = useIntentDispatcher();
@@ -5,8 +5,8 @@
5
5
  import { Schema } from 'effect';
6
6
 
7
7
  import { Capabilities, Events } from '../../common';
8
- import { contributes, defineEvent, defineCapability, defineModule, definePlugin } from '../../core';
9
- import { createResolver, type IntentSchema } from '../../plugin-intent';
8
+ import { contributes, defineCapability, defineEvent, defineModule, definePlugin } from '../../core';
9
+ import { type IntentSchema, createResolver } from '../../plugin-intent';
10
10
 
11
11
  export const Number = defineCapability<number>('dxos.org/test/generator/number');
12
12
 
@@ -26,7 +26,7 @@ export const createGeneratorIntent = (id: string) => {
26
26
  export const createNumberPlugin = (id: string) => {
27
27
  const number = Math.floor(Math.random() * 100);
28
28
 
29
- return definePlugin({ id, name: `Plugin ${id}` }, [
29
+ return definePlugin({ id, name: `Plugin ${id}` }, () => [
30
30
  defineModule({
31
31
  id: `${id}/main`,
32
32
  activatesOn: CountEvent,
@@ -8,16 +8,15 @@ import { defineModule, definePlugin, lazy } from '../../core';
8
8
  const Main = lazy(() => import('./Main'));
9
9
  const Toolbar = lazy(() => import('./Toolbar'));
10
10
 
11
- export const GeneratorPlugin = () =>
12
- definePlugin({ id: 'dxos.org/test/generator', name: 'Generator' }, [
13
- defineModule({
14
- id: 'dxos.org/test/generator/main',
15
- activatesOn: Events.Startup,
16
- activate: Main,
17
- }),
18
- defineModule({
19
- id: 'dxos.org/test/generator/toolbar',
20
- activatesOn: Events.Startup,
21
- activate: Toolbar,
22
- }),
23
- ]);
11
+ export const GeneratorPlugin = definePlugin({ id: 'dxos.org/test/generator', name: 'Generator' }, () => [
12
+ defineModule({
13
+ id: 'dxos.org/test/generator/main',
14
+ activatesOn: Events.Startup,
15
+ activate: Main,
16
+ }),
17
+ defineModule({
18
+ id: 'dxos.org/test/generator/toolbar',
19
+ activatesOn: Events.Startup,
20
+ activate: Toolbar,
21
+ }),
22
+ ]);
@@ -3,15 +3,16 @@
3
3
  //
4
4
 
5
5
  import { Events } from '../../common';
6
- import { definePlugin, lazy, defineModule } from '../../core';
6
+ import { defineModule, definePlugin, lazy } from '../../core';
7
7
 
8
8
  const Layout = lazy(() => import('./Layout'));
9
9
 
10
- export const LayoutPlugin = () =>
11
- definePlugin({ id: 'dxos.org/test/layout', name: 'Layout' }, [
12
- defineModule({
13
- id: 'dxos.org/test/layout/root',
14
- activatesOn: Events.Startup,
15
- activate: Layout,
16
- }),
17
- ]);
10
+ const meta = { id: 'dxos.org/test/layout', name: 'Layout' };
11
+
12
+ export const LayoutPlugin = definePlugin(meta, () => [
13
+ defineModule({
14
+ id: 'dxos.org/test/layout/root',
15
+ activatesOn: Events.Startup,
16
+ activate: Layout,
17
+ }),
18
+ ]);
@@ -6,12 +6,13 @@ import React, { useCallback } from 'react';
6
6
 
7
7
  import { Button } from '@dxos/react-ui';
8
8
 
9
- import { Log } from './schema';
10
9
  import { Capabilities, createSurface } from '../../common';
11
10
  import { contributes } from '../../core';
12
11
  import { createIntent } from '../../plugin-intent';
13
12
  import { useIntentDispatcher } from '../../react';
14
13
 
14
+ import { Log } from './schema';
15
+
15
16
  export const Logger = () => {
16
17
  const { dispatchPromise } = useIntentDispatcher();
17
18
  const handleClick = useCallback(() => dispatchPromise(createIntent(Log, { message: 'Hello, world!' })), []);
@@ -4,33 +4,38 @@
4
4
 
5
5
  import { log } from '@dxos/log';
6
6
 
7
- import { Log } from './schema';
8
7
  import { Capabilities, Events } from '../../common';
9
- import { contributes, defineModule, lazy, definePlugin } from '../../core';
8
+ import { contributes, defineModule, definePlugin, lazy } from '../../core';
10
9
  import { createResolver } from '../../plugin-intent';
11
10
 
11
+ import { Log } from './schema';
12
+
12
13
  const Toolbar = lazy(() => import('./Toolbar'));
13
14
 
14
- export const LoggerPlugin = () =>
15
- definePlugin({ id: 'dxos.org/test/logger', name: 'Logger' }, [
16
- defineModule({
17
- id: 'dxos.org/test/logger/intents',
18
- activatesOn: Events.SetupIntentResolver,
19
- activate: () => [
20
- contributes(
21
- Capabilities.IntentResolver,
22
- createResolver({
23
- intent: Log,
24
- resolve: ({ message }) => {
25
- log.info(message);
26
- },
27
- }),
28
- ),
29
- ],
30
- }),
31
- defineModule({
32
- id: 'dxos.org/test/logger/surfaces',
33
- activatesOn: Events.Startup,
34
- activate: Toolbar,
35
- }),
36
- ]);
15
+ const meta = {
16
+ id: 'dxos.org/test/logger',
17
+ name: 'Logger',
18
+ };
19
+
20
+ export const LoggerPlugin = definePlugin(meta, () => [
21
+ defineModule({
22
+ id: 'dxos.org/test/logger/intents',
23
+ activatesOn: Events.SetupIntentResolver,
24
+ activate: () => [
25
+ contributes(
26
+ Capabilities.IntentResolver,
27
+ createResolver({
28
+ intent: Log,
29
+ resolve: ({ message }) => {
30
+ log.info(message);
31
+ },
32
+ }),
33
+ ),
34
+ ],
35
+ }),
36
+ defineModule({
37
+ id: 'dxos.org/test/logger/surfaces',
38
+ activatesOn: Events.Startup,
39
+ activate: Toolbar,
40
+ }),
41
+ ]);
@@ -2,41 +2,45 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
6
  import React from 'react';
8
7
 
9
- import { withLayout, withTheme } from '@dxos/storybook-utils';
8
+ import { withTheme } from '@dxos/react-ui/testing';
9
+
10
+ import { useApp } from '../components';
11
+ import { IntentPlugin } from '../plugin-intent';
10
12
 
11
13
  import { DebugPlugin } from './debug';
12
- import { createNumberPlugin, GeneratorPlugin } from './generator';
14
+ import { GeneratorPlugin, createNumberPlugin } from './generator';
13
15
  import { LayoutPlugin } from './layout';
14
16
  import { LoggerPlugin } from './logger';
15
- import { useApp } from '../App';
16
- import { IntentPlugin } from '../plugin-intent';
17
17
 
18
- const plugins = [IntentPlugin(), LayoutPlugin(), DebugPlugin(), LoggerPlugin(), GeneratorPlugin()];
18
+ const pluginFactories = [IntentPlugin, LayoutPlugin, DebugPlugin(), LoggerPlugin(), GeneratorPlugin()];
19
+ const plugins = pluginFactories.map((factory) => (typeof factory === 'function' ? factory() : factory));
19
20
 
20
21
  const Placeholder = () => {
21
22
  return <div>Loading...</div>;
22
23
  };
23
24
 
24
- const Story = () => {
25
+ const DefaultStory = () => {
25
26
  const App = useApp({
26
- pluginLoader: (id) => createNumberPlugin(id),
27
+ pluginLoader: (id) => createNumberPlugin(id)(),
27
28
  plugins,
28
29
  core: plugins.map((plugin) => plugin.meta.id),
29
- // Having a non-empty placeholder makes it clear if it's taking a while to load.
30
30
  placeholder: Placeholder,
31
31
  });
32
32
 
33
33
  return <App />;
34
34
  };
35
35
 
36
- export const Playground = {};
37
-
38
- export default {
36
+ const meta = {
39
37
  title: 'sdk/app-framework/playground',
40
- render: Story,
41
- decorators: [withTheme, withLayout()],
42
- };
38
+ render: DefaultStory,
39
+ decorators: [withTheme],
40
+ } satisfies Meta<typeof DefaultStory>;
41
+
42
+ export default meta;
43
+
44
+ type Story = StoryObj<typeof meta>;
45
+
46
+ export const Playground: Story = {};
@@ -2,19 +2,19 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { INTENT_PLUGIN } from './actions';
6
5
  import { Events } from '../common';
7
6
  import { defineModule, definePlugin, lazy } from '../core';
8
7
 
9
- export const IntentPlugin = () =>
10
- definePlugin({ id: INTENT_PLUGIN, name: 'Intent' }, [
11
- defineModule({
12
- id: `${INTENT_PLUGIN}/module/dispatcher`,
13
- // TODO(wittjosiah): This will mean that startup needs to be reset when intents are added or removed.
14
- // This is fine for now because it's how it worked prior to capabilities api anyways.
15
- // In the future, the intent dispatcher should be able to be reset without resetting the entire app.
16
- activatesOn: Events.Startup,
17
- activatesAfter: [Events.DispatcherReady],
18
- activate: lazy(() => import('./intent-dispatcher')),
19
- }),
20
- ]);
8
+ import { meta } from './meta';
9
+
10
+ export const IntentPlugin = definePlugin(meta, () => [
11
+ defineModule({
12
+ id: `${meta.id}/module/dispatcher`,
13
+ // TODO(wittjosiah): This will mean that startup needs to be reset when intents are added or removed.
14
+ // This is fine for now because it's how it worked prior to capabilities api anyways.
15
+ // In the future, the intent dispatcher should be able to be reset without resetting the entire app.
16
+ activatesOn: Events.Startup,
17
+ activatesAfter: [Events.DispatcherReady],
18
+ activate: lazy(() => import('./intent-dispatcher')),
19
+ }),
20
+ ]);