@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
package/moon.yml CHANGED
@@ -5,6 +5,7 @@ tags:
5
5
  - ts-build
6
6
  - ts-test
7
7
  - typedoc
8
+ - storybook
8
9
  tasks:
9
10
  compile:
10
11
  args:
@@ -12,3 +13,6 @@ tasks:
12
13
  - '--entryPoint=src/testing/index.ts'
13
14
  - '--entryPoint=src/worker.ts'
14
15
  - '--preactSignalTracking'
16
+ test:
17
+ inputs:
18
+ - .storybook/*
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/app-framework",
3
- "version": "0.8.4-main.84f28bd",
3
+ "version": "0.8.4-main.a4bbb77",
4
4
  "description": "A framework for building applications from composible plugins.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -10,16 +10,19 @@
10
10
  "type": "module",
11
11
  "exports": {
12
12
  ".": {
13
+ "source": "./src/index.ts",
13
14
  "types": "./dist/types/src/index.d.ts",
14
15
  "browser": "./dist/lib/browser/index.mjs",
15
16
  "node": "./dist/lib/node-esm/index.mjs"
16
17
  },
17
18
  "./testing": {
19
+ "source": "./src/testing/index.ts",
18
20
  "types": "./dist/types/src/testing/index.d.ts",
19
21
  "browser": "./dist/lib/browser/testing/index.mjs",
20
22
  "node": "./dist/lib/node-esm/testing/index.mjs"
21
23
  },
22
24
  "./worker": {
25
+ "source": "./src/worker.ts",
23
26
  "types": "./dist/types/src/worker.d.ts",
24
27
  "browser": "./dist/lib/browser/worker.mjs",
25
28
  "node": "./dist/lib/node-esm/worker.mjs"
@@ -37,43 +40,45 @@
37
40
  }
38
41
  },
39
42
  "dependencies": {
43
+ "@effect/ai": "0.29.1",
44
+ "@effect/experimental": "0.56.0",
40
45
  "@preact-signals/safe-react": "^0.9.0",
41
- "@preact/signals-core": "^1.9.0",
42
- "@dxos/ai": "0.8.4-main.84f28bd",
43
- "@dxos/app-graph": "0.8.4-main.84f28bd",
44
- "@dxos/async": "0.8.4-main.84f28bd",
45
- "@dxos/artifact": "0.8.4-main.84f28bd",
46
- "@dxos/client-protocol": "0.8.4-main.84f28bd",
47
- "@dxos/debug": "0.8.4-main.84f28bd",
48
- "@dxos/echo-schema": "0.8.4-main.84f28bd",
49
- "@dxos/invariant": "0.8.4-main.84f28bd",
50
- "@dxos/keys": "0.8.4-main.84f28bd",
51
- "@dxos/live-object": "0.8.4-main.84f28bd",
52
- "@dxos/local-storage": "0.8.4-main.84f28bd",
53
- "@dxos/react-hooks": "0.8.4-main.84f28bd",
54
- "@dxos/schema": "0.8.4-main.84f28bd",
55
- "@dxos/log": "0.8.4-main.84f28bd",
56
- "@dxos/util": "0.8.4-main.84f28bd"
46
+ "@preact/signals-core": "^1.12.1",
47
+ "@dxos/app-graph": "0.8.4-main.a4bbb77",
48
+ "@dxos/ai": "0.8.4-main.a4bbb77",
49
+ "@dxos/blueprints": "0.8.4-main.a4bbb77",
50
+ "@dxos/debug": "0.8.4-main.a4bbb77",
51
+ "@dxos/echo-schema": "0.8.4-main.a4bbb77",
52
+ "@dxos/client-protocol": "0.8.4-main.a4bbb77",
53
+ "@dxos/async": "0.8.4-main.a4bbb77",
54
+ "@dxos/functions": "0.8.4-main.a4bbb77",
55
+ "@dxos/invariant": "0.8.4-main.a4bbb77",
56
+ "@dxos/keys": "0.8.4-main.a4bbb77",
57
+ "@dxos/live-object": "0.8.4-main.a4bbb77",
58
+ "@dxos/local-storage": "0.8.4-main.a4bbb77",
59
+ "@dxos/log": "0.8.4-main.a4bbb77",
60
+ "@dxos/schema": "0.8.4-main.a4bbb77",
61
+ "@dxos/react-hooks": "0.8.4-main.a4bbb77",
62
+ "@dxos/util": "0.8.4-main.a4bbb77"
57
63
  },
58
64
  "devDependencies": {
59
- "@effect-rx/rx-react": "0.38.0",
60
- "@effect/platform": "0.88.0",
61
- "@phosphor-icons/react": "^2.1.5",
62
- "@types/react": "~18.2.0",
63
- "effect": "3.16.13",
64
- "react": "~18.2.0",
65
+ "@effect-rx/rx-react": "0.42.4",
66
+ "@effect/platform": "0.92.1",
67
+ "@types/react": "~19.2.0",
68
+ "effect": "3.18.3",
69
+ "react": "~19.2.0",
65
70
  "typedoc": "0.28.1",
66
- "@dxos/echo-signals": "0.8.4-main.84f28bd",
67
- "@dxos/random": "0.8.4-main.84f28bd",
68
- "@dxos/react-ui": "0.8.4-main.84f28bd",
69
- "@dxos/storybook-utils": "0.8.4-main.84f28bd",
70
- "@dxos/react-ui-syntax-highlighter": "0.8.4-main.84f28bd"
71
+ "@dxos/echo-signals": "0.8.4-main.a4bbb77",
72
+ "@dxos/random": "0.8.4-main.a4bbb77",
73
+ "@dxos/react-ui-syntax-highlighter": "0.8.4-main.a4bbb77",
74
+ "@dxos/storybook-utils": "0.8.4-main.a4bbb77",
75
+ "@dxos/react-ui": "0.8.4-main.a4bbb77"
71
76
  },
72
77
  "peerDependencies": {
73
78
  "@effect-rx/rx-react": "^0.34.1",
74
79
  "@effect/platform": "^0.80.12",
75
80
  "effect": "^3.13.3",
76
- "react": "~18.2.0"
81
+ "react": "^19.0.0"
77
82
  },
78
83
  "publishConfig": {
79
84
  "access": "public"
@@ -2,43 +2,75 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ import { type Tool, type Toolkit } from '@effect/ai';
5
6
  import { type Registry } from '@effect-rx/rx-react';
6
- import { type Schema } from 'effect';
7
+ import { type Layer, type Schema } from 'effect';
7
8
  import { type FC, type PropsWithChildren } from 'react';
8
9
 
9
- import { type ExecutableTool } from '@dxos/ai';
10
- import { type GraphBuilder, type BuilderExtensions } from '@dxos/app-graph';
11
- import { type ArtifactDefinition } from '@dxos/artifact';
10
+ import { type AiService, type AiServiceRouter } from '@dxos/ai';
11
+ import { type BuilderExtensions, type GraphBuilder } from '@dxos/app-graph';
12
+ import { type Blueprint } from '@dxos/blueprints';
12
13
  import { type Space } from '@dxos/client-protocol';
14
+ import { type FunctionDefinition } from '@dxos/functions';
13
15
  import { type RootSettingsStore } from '@dxos/local-storage';
14
16
  import { type AnchoredTo } from '@dxos/schema';
15
17
 
18
+ import { type PluginManager, defineCapability } from '../core';
19
+ import { type AnyIntentResolver, type IntentContext } from '../plugin-intent';
20
+
16
21
  import { type FileInfo } from './file';
17
22
  import { type NodeSerializer } from './graph';
18
23
  import { type SurfaceDefinition } from './surface';
19
24
  import { type Resource } from './translations';
20
- import { type PluginManager, defineCapability } from '../core';
21
- import { type AnyIntentResolver, type IntentContext } from '../plugin-intent';
22
25
 
26
+ // TODO(burdon): Sort.
23
27
  export namespace Capabilities {
24
- export const PluginManager = defineCapability<PluginManager>('dxos.org/app-framework/capability/plugin-manager');
25
-
28
+ /**
29
+ * @category Capability
30
+ */
26
31
  export const Null = defineCapability<null>('dxos.org/app-framework/capability/null');
27
32
 
33
+ /**
34
+ * @category Capability
35
+ */
36
+ export const PluginManager = defineCapability<PluginManager>('dxos.org/app-framework/capability/plugin-manager');
37
+
38
+ /**
39
+ * @category Capability
40
+ */
28
41
  export const RxRegistry = defineCapability<Registry.Registry>('dxos.org/app-framework/capability/rx-registry');
29
42
 
30
43
  export type ReactContext = Readonly<{ id: string; dependsOn?: string[]; context: FC<PropsWithChildren> }>;
44
+
45
+ /**
46
+ * @category Capability
47
+ */
31
48
  export const ReactContext = defineCapability<ReactContext>('dxos.org/app-framework/capability/react-context');
32
49
 
33
50
  export type ReactRoot = Readonly<{ id: string; root: FC<PropsWithChildren> }>;
51
+
52
+ /**
53
+ * @category Capability
54
+ */
34
55
  export const ReactRoot = defineCapability<ReactRoot>('dxos.org/app-framework/capability/react-root');
35
56
 
36
57
  export type ReactSurface = SurfaceDefinition | readonly SurfaceDefinition[];
58
+
59
+ /**
60
+ * @category Capability
61
+ */
37
62
  export const ReactSurface = defineCapability<ReactSurface>('dxos.org/app-framework/common/react-surface');
38
63
 
39
64
  export type IntentResolver = AnyIntentResolver | readonly AnyIntentResolver[];
65
+
66
+ /**
67
+ * @category Capability
68
+ */
40
69
  export const IntentResolver = defineCapability<IntentResolver>('dxos.org/app-framework/capability/intent-resolver');
41
70
 
71
+ /**
72
+ * @category Capability
73
+ */
42
74
  export const IntentDispatcher = defineCapability<IntentContext>(
43
75
  'dxos.org/app-framework/capability/intent-dispatcher',
44
76
  );
@@ -65,23 +97,41 @@ export namespace Capabilities {
65
97
  */
66
98
  scrollIntoView: string | undefined;
67
99
  }>;
100
+
101
+ /**
102
+ * @category Capability
103
+ */
68
104
  export const Layout = defineCapability<Layout>('dxos.org/app-framework/capability/layout');
69
105
 
70
- // TODO(burdon): Why array?
106
+ /**
107
+ * @category Capability
108
+ */
71
109
  export const Translations = defineCapability<Readonly<Resource[]>>('dxos.org/app-framework/capability/translations');
72
110
 
111
+ /**
112
+ * @category Capability
113
+ */
73
114
  export const AppGraph = defineCapability<Readonly<Pick<GraphBuilder, 'graph' | 'explore'>>>(
74
115
  'dxos.org/app-framework/capability/app-graph',
75
116
  );
76
117
 
118
+ /**
119
+ * @category Capability
120
+ */
77
121
  export const AppGraphBuilder = defineCapability<BuilderExtensions>(
78
122
  'dxos.org/app-framework/capability/app-graph-builder',
79
123
  );
80
124
 
125
+ /**
126
+ * @category Capability
127
+ */
81
128
  export const AppGraphSerializer = defineCapability<NodeSerializer[]>(
82
129
  'dxos.org/app-framework/capability/app-graph-serializer',
83
130
  );
84
131
 
132
+ /**
133
+ * @category Capability
134
+ */
85
135
  export const SettingsStore = defineCapability<RootSettingsStore>('dxos.org/app-framework/capability/settings-store');
86
136
 
87
137
  // TODO(wittjosiah): The generics caused type inference issues for schemas when contributing settings.
@@ -92,22 +142,73 @@ export namespace Capabilities {
92
142
  schema: Schema.Schema.All;
93
143
  value?: Record<string, any>;
94
144
  };
145
+
146
+ /**
147
+ * @category Capability
148
+ */
95
149
  export const Settings = defineCapability<Settings>('dxos.org/app-framework/capability/settings');
96
150
 
97
151
  export type Metadata = Readonly<{ id: string; metadata: Record<string, any> }>;
152
+
153
+ /**
154
+ * @category Capability
155
+ */
98
156
  export const Metadata = defineCapability<Metadata>('dxos.org/app-framework/capability/metadata');
99
157
 
100
- export const Tools = defineCapability<ExecutableTool[]>('dxos.org/app-framework/capability/tools');
101
- export const ArtifactDefinition = defineCapability<ArtifactDefinition>(
102
- 'dxos.org/app-framework/capability/artifact-definition',
158
+ // TODO(dmaretskyi): Consider combining Toolkit and ToolkitHandler for type-safe context.
159
+
160
+ /**
161
+ * @category Capability
162
+ */
163
+ export const Toolkit = defineCapability<Toolkit.Any>('dxos.org/app-framework/capability/ai-toolkit');
164
+
165
+ /**
166
+ * @category Capability
167
+ */
168
+ export const ToolkitHandler = defineCapability<Layer.Layer<Tool.Handler<any>, never, never>>(
169
+ 'dxos.org/app-framework/capability/ai-toolkit-handler',
170
+ );
171
+
172
+ /**
173
+ * @category Capability
174
+ */
175
+ export const BlueprintDefinition = defineCapability<Blueprint.Blueprint>(
176
+ 'dxos.org/app-framework/capability/blueprint-definition',
177
+ );
178
+
179
+ export type AiServiceLayer = Layer.Layer<AiService.AiService>;
180
+ export const AiServiceLayer = defineCapability<AiServiceLayer>(
181
+ 'dxos.org/app-framework/capability/ai-service-factory',
182
+ );
183
+
184
+ /**
185
+ * Plugins can contribute them to provide model resolvers.
186
+ */
187
+ export const AiModelResolver = defineCapability<Layer.Layer<AiServiceRouter.AiModelResolver>>(
188
+ 'dxos.org/app-framework/capability/ai-model-resolver',
189
+ );
190
+
191
+ /**
192
+ * @category Capability
193
+ */
194
+ export const Functions = defineCapability<FunctionDefinition<any, any>[]>(
195
+ 'dxos.org/app-framework/capability/functions',
103
196
  );
104
197
 
105
198
  export type FileUploader = (file: File, space: Space) => Promise<FileInfo | undefined>;
199
+
200
+ /**
201
+ * @category Capability
202
+ */
106
203
  export const FileUploader = defineCapability<FileUploader>('dxos.org/app-framework/capability/file-uploader');
107
204
 
108
205
  type AnchorSort = {
109
206
  key: string;
110
207
  sort: (anchorA: AnchoredTo, anchorB: AnchoredTo) => number;
111
208
  };
209
+
210
+ /**
211
+ * @category Capability
212
+ */
112
213
  export const AnchorSort = defineCapability<AnchorSort>('dxos.org/app-framework/capability/anchor-sort');
113
214
  }
@@ -4,17 +4,14 @@
4
4
 
5
5
  import { Schema } from 'effect';
6
6
 
7
- import { Expando, Ref } from '@dxos/echo-schema';
7
+ import { DataType } from '@dxos/schema';
8
8
 
9
9
  export namespace CollaborationActions {
10
- export class InsertContent extends Schema.TaggedClass<InsertContent>()('assistant/intent-content', {
10
+ export class AcceptProposal extends Schema.TaggedClass<AcceptProposal>()('collaboration/accept-proposal', {
11
11
  input: Schema.Struct({
12
- target: Expando,
13
- object: Ref(Expando),
14
- at: Schema.optional(Schema.String),
15
- label: Schema.String.pipe(Schema.optional),
16
- }).annotations({
17
- description: 'Enables plugins to inject content blocks or references into a related entity.',
12
+ subject: Schema.Any,
13
+ anchor: Schema.String,
14
+ proposal: DataType.MessageBlock.Proposal,
18
15
  }),
19
16
  output: Schema.Void,
20
17
  }) {}
@@ -2,9 +2,10 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Capabilities } from './capabilities';
6
5
  import { defineEvent } from '../core';
7
6
 
7
+ import { Capabilities } from './capabilities';
8
+
8
9
  export namespace Events {
9
10
  /**
10
11
  * Fired when the app is started.
@@ -48,6 +49,7 @@ export namespace Events {
48
49
  /**
49
50
  * Fired to load any newly available artifacts definitions.
50
51
  */
52
+ // TODO(burdon): Rename.
51
53
  export const SetupArtifactDefinition = defineEvent('dxos.org/app-framework/event/setup-artifact-definition');
52
54
 
53
55
  //
@@ -6,14 +6,13 @@ import { Schema } from 'effect';
6
6
 
7
7
  import { Label } from '../plugin-intent';
8
8
 
9
- export const LAYOUT_PLUGIN = 'dxos.org/plugin/layout';
10
- export const LAYOUT_ACTION = `${LAYOUT_PLUGIN}/action`;
9
+ const LAYOUT_PLUGIN = 'dxos.org/plugin/layout';
11
10
 
12
11
  /**
13
12
  * Expected payload for layout actions.
14
13
  */
15
14
  export namespace LayoutAction {
16
- export const UPDATE_LAYOUT = `${LAYOUT_ACTION}/update-layout`;
15
+ export const UPDATE_LAYOUT = `${LAYOUT_PLUGIN}/action/update-layout`;
17
16
 
18
17
  /**
19
18
  * Generic layout action.
@@ -2,7 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { type JSX, type ForwardedRef, type PropsWithChildren, type ReactNode } from 'react';
5
+ import type { ComponentType, PropsWithChildren, ReactNode } from 'react';
6
6
 
7
7
  import { type GuardedType, type MakeOptional, type Position } from '@dxos/util';
8
8
 
@@ -11,7 +11,7 @@ import { type ErrorBoundary } from '../react';
11
11
  /**
12
12
  * SurfaceProps are the props that are passed to the Surface component.
13
13
  */
14
- export type SurfaceProps<T extends Record<string, any> = Record<string, unknown>> = PropsWithChildren<{
14
+ export type SurfaceProps<T extends Record<string, any> = Record<string, unknown>> = {
15
15
  /**
16
16
  * If specified, the Surface will be wrapped in an error boundary.
17
17
  * The fallback component will be rendered if an error occurs.
@@ -23,17 +23,16 @@ export type SurfaceProps<T extends Record<string, any> = Record<string, unknown>
23
23
  * The placeholder component will be rendered while the surface component is loading.
24
24
  */
25
25
  placeholder?: ReactNode;
26
- }> &
27
- MakeOptional<CoreSurfaceProps<T>, 'id' | 'data'> & {
28
- /**
29
- * Additional props to pass to the component.
30
- * These props are not used by Surface itself but may be used by components which resolve the surface.
31
- */
32
- [key: string]: unknown;
26
+ } & MakeOptional<CoreSurfaceProps<T>, 'id' | 'data'> &
27
+ // Additional props to pass to the component.
28
+ // These props are not used by Surface itself but may be used by components which resolve the surface.
29
+ // Exclude known prop names to prevent overriding well-defined props.
30
+ {
31
+ [K in keyof Record<string, any>]: K extends keyof CoreSurfaceProps<T> | 'fallback' | 'placeholder' ? never : any;
33
32
  };
34
33
 
35
34
  // NOTE: If `[key: string]: unknown` is included in shared types, when re-used other fields become unknown as well.
36
- type CoreSurfaceProps<T extends Record<string, any> = Record<string, unknown>> = {
35
+ type CoreSurfaceProps<T extends Record<string, any> = Record<string, unknown>> = PropsWithChildren<{
37
36
  /**
38
37
  * ID for debugging.
39
38
  */
@@ -53,19 +52,17 @@ type CoreSurfaceProps<T extends Record<string, any> = Record<string, unknown>> =
53
52
  * If more than one component is resolved, the limit determines how many are rendered.
54
53
  */
55
54
  limit?: number | undefined;
56
- };
55
+ }>;
57
56
 
58
- type SurfaceComponentProps<T extends Record<string, any> = Record<string, unknown>> = PropsWithChildren<
59
- CoreSurfaceProps<T> & { [key: string]: unknown }
60
- >;
57
+ type SurfaceComponentProps<T extends Record<string, any> = Record<string, unknown>> = CoreSurfaceProps<T> &
58
+ Record<string, any>;
61
59
 
62
60
  /**
63
61
  * React component used to render a surface once is has matched.
64
62
  */
65
- export type SurfaceComponent<T extends Record<string, any> = Record<string, unknown>> = (
66
- props: SurfaceComponentProps<T>,
67
- forwardedRef: ForwardedRef<HTMLElement>,
68
- ) => JSX.Element | null;
63
+ export type SurfaceComponent<T extends Record<string, any> = Record<string, unknown>> = ComponentType<
64
+ SurfaceComponentProps<T>
65
+ >;
69
66
 
70
67
  /**
71
68
  * Definition of when a SurfaceComponent should be rendered.
@@ -0,0 +1,33 @@
1
+ //
2
+ // Copyright 2022 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React from 'react';
7
+
8
+ import { withTheme } from '@dxos/react-ui/testing';
9
+
10
+ import { useApp } from './useApp';
11
+
12
+ const DefaultStory = () => {
13
+ const App = useApp({
14
+ placeholder: () => <div className='fixed inset-0 flex items-center justify-center'>Loading...</div>,
15
+ });
16
+
17
+ return <App />;
18
+ };
19
+
20
+ const meta = {
21
+ title: 'sdk/app-framework/App',
22
+ render: DefaultStory,
23
+ decorators: [withTheme],
24
+ parameters: {
25
+ layout: 'fullscreen',
26
+ },
27
+ } satisfies Meta;
28
+
29
+ export default meta;
30
+
31
+ type Story = StoryObj<typeof meta>;
32
+
33
+ export const Default: Story = {};
@@ -0,0 +1,59 @@
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 { useCapabilities } from '../react';
10
+
11
+ import { type UseAppOptions } from './useApp';
12
+ import { LoadingState, useLoading } from './useLoading';
13
+
14
+ export type AppProps = Pick<UseAppOptions, 'placeholder' | 'debounce'> & {
15
+ state: { ready: boolean; error: unknown };
16
+ };
17
+
18
+ export const App = ({ placeholder: Placeholder, state, debounce }: AppProps) => {
19
+ const reactContexts = useCapabilities(Capabilities.ReactContext);
20
+ const reactRoots = useCapabilities(Capabilities.ReactRoot);
21
+ const stage = useLoading(state, debounce);
22
+
23
+ if (state.error) {
24
+ // This triggers the error boundary to provide UI feedback for the startup error.
25
+ throw state.error;
26
+ }
27
+
28
+ // TODO(wittjosiah): Consider using Suspense instead.
29
+ if (stage < LoadingState.Done) {
30
+ if (!Placeholder) {
31
+ return null;
32
+ }
33
+
34
+ return <Placeholder stage={stage} />;
35
+ }
36
+
37
+ const ComposedContext = composeContexts(reactContexts);
38
+ return (
39
+ <ComposedContext>
40
+ {reactRoots.map(({ id, root: Component }) => (
41
+ <Component key={id} />
42
+ ))}
43
+ </ComposedContext>
44
+ );
45
+ };
46
+
47
+ const composeContexts = (contexts: Capabilities.ReactContext[]) => {
48
+ if (contexts.length === 0) {
49
+ return ({ children }: PropsWithChildren) => <>{children}</>;
50
+ }
51
+
52
+ return topologicalSort(contexts)
53
+ .map(({ context }) => context)
54
+ .reduce((Acc, Next) => ({ children }) => (
55
+ <Acc>
56
+ <Next>{children}</Next>
57
+ </Acc>
58
+ ));
59
+ };
@@ -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,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './useApp';