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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (472) hide show
  1. package/.storybook/main.mts +9 -0
  2. package/.storybook/preview.mts +8 -0
  3. package/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
  4. package/dist/lib/browser/capability-2GL5JAGJ.mjs +37 -0
  5. package/dist/lib/browser/capability-2GL5JAGJ.mjs.map +7 -0
  6. package/dist/lib/browser/capability-7RLVE42K.mjs +34 -0
  7. package/dist/lib/browser/capability-7RLVE42K.mjs.map +7 -0
  8. package/dist/lib/browser/chunk-4CTRO67U.mjs +703 -0
  9. package/dist/lib/browser/chunk-4CTRO67U.mjs.map +7 -0
  10. package/dist/lib/browser/chunk-5RJNZV7K.mjs +44 -0
  11. package/dist/lib/browser/chunk-5RJNZV7K.mjs.map +7 -0
  12. package/dist/lib/browser/chunk-FHQTHCX7.mjs +8 -0
  13. package/dist/lib/browser/chunk-FHQTHCX7.mjs.map +7 -0
  14. package/dist/lib/browser/chunk-FNKT2QQ2.mjs +145 -0
  15. package/dist/lib/browser/chunk-FNKT2QQ2.mjs.map +7 -0
  16. package/dist/lib/browser/chunk-HE27PNNQ.mjs +824 -0
  17. package/dist/lib/browser/chunk-HE27PNNQ.mjs.map +7 -0
  18. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  19. package/dist/lib/browser/chunk-NPUEVX42.mjs +34 -0
  20. package/dist/lib/browser/chunk-NPUEVX42.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-PKQT6C53.mjs +47 -0
  22. package/dist/lib/browser/chunk-PKQT6C53.mjs.map +7 -0
  23. package/dist/lib/browser/chunk-REORGDJT.mjs +80 -0
  24. package/dist/lib/browser/chunk-REORGDJT.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-YAFEA4GV.mjs +1 -0
  26. package/dist/lib/browser/chunk-YNFPIQGB.mjs +76 -0
  27. package/dist/lib/browser/chunk-YNFPIQGB.mjs.map +7 -0
  28. package/dist/lib/browser/chunk-ZRWBPIZG.mjs +170 -0
  29. package/dist/lib/browser/chunk-ZRWBPIZG.mjs.map +7 -0
  30. package/dist/lib/browser/cli/index.mjs +89 -0
  31. package/dist/lib/browser/cli/index.mjs.map +7 -0
  32. package/dist/lib/browser/common/activation-events.mjs +23 -0
  33. package/dist/lib/browser/common/capabilities.mjs +45 -0
  34. package/dist/lib/browser/core/activation-event.mjs +20 -0
  35. package/dist/lib/browser/core/activation-event.mjs.map +7 -0
  36. package/dist/lib/browser/core/capability.mjs +28 -0
  37. package/dist/lib/browser/core/capability.mjs.map +7 -0
  38. package/dist/lib/browser/core/plugin-manager.mjs +15 -0
  39. package/dist/lib/browser/core/plugin-manager.mjs.map +7 -0
  40. package/dist/lib/browser/core/plugin.mjs +27 -0
  41. package/dist/lib/browser/core/plugin.mjs.map +7 -0
  42. package/dist/lib/browser/index.mjs +87 -156
  43. package/dist/lib/browser/index.mjs.map +4 -4
  44. package/dist/lib/browser/invoker-capability-BNLVNYHU.mjs +36 -0
  45. package/dist/lib/browser/invoker-capability-BNLVNYHU.mjs.map +7 -0
  46. package/dist/lib/browser/meta.json +1 -1
  47. package/dist/lib/browser/testing/index.mjs +89 -39
  48. package/dist/lib/browser/testing/index.mjs.map +4 -4
  49. package/dist/lib/browser/ui/index.mjs +45 -0
  50. package/dist/lib/browser/ui/index.mjs.map +7 -0
  51. package/dist/lib/node-esm/capability-CHIMU6LX.mjs +38 -0
  52. package/dist/lib/node-esm/capability-CHIMU6LX.mjs.map +7 -0
  53. package/dist/lib/node-esm/capability-EVZK4REM.mjs +35 -0
  54. package/dist/lib/node-esm/capability-EVZK4REM.mjs.map +7 -0
  55. package/dist/lib/node-esm/chunk-2A4PRBIX.mjs +171 -0
  56. package/dist/lib/node-esm/chunk-2A4PRBIX.mjs.map +7 -0
  57. package/dist/lib/node-esm/chunk-7CPNAEGV.mjs +704 -0
  58. package/dist/lib/node-esm/chunk-7CPNAEGV.mjs.map +7 -0
  59. package/dist/lib/node-esm/chunk-7OWSHPYK.mjs +48 -0
  60. package/dist/lib/node-esm/chunk-7OWSHPYK.mjs.map +7 -0
  61. package/dist/lib/node-esm/chunk-CJCQS2YL.mjs +146 -0
  62. package/dist/lib/node-esm/chunk-CJCQS2YL.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-DTCHT2X2.mjs +825 -0
  64. package/dist/lib/node-esm/chunk-DTCHT2X2.mjs.map +7 -0
  65. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  66. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  67. package/dist/lib/node-esm/chunk-JAZVHID3.mjs +35 -0
  68. package/dist/lib/node-esm/chunk-JAZVHID3.mjs.map +7 -0
  69. package/dist/lib/node-esm/chunk-SB5ODNPX.mjs +77 -0
  70. package/dist/lib/node-esm/chunk-SB5ODNPX.mjs.map +7 -0
  71. package/dist/lib/node-esm/chunk-UEWJDI2L.mjs +10 -0
  72. package/dist/lib/node-esm/chunk-UEWJDI2L.mjs.map +7 -0
  73. package/dist/lib/node-esm/chunk-UFW652GS.mjs +81 -0
  74. package/dist/lib/node-esm/chunk-UFW652GS.mjs.map +7 -0
  75. package/dist/lib/node-esm/chunk-VUIUFIGT.mjs +45 -0
  76. package/dist/lib/node-esm/chunk-VUIUFIGT.mjs.map +7 -0
  77. package/dist/lib/node-esm/chunk-Z4TJPSMP.mjs +2 -0
  78. package/dist/lib/node-esm/chunk-Z4TJPSMP.mjs.map +7 -0
  79. package/dist/lib/node-esm/cli/index.mjs +90 -0
  80. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  81. package/dist/lib/node-esm/common/activation-events.mjs +24 -0
  82. package/dist/lib/node-esm/common/activation-events.mjs.map +7 -0
  83. package/dist/lib/node-esm/common/capabilities.mjs +46 -0
  84. package/dist/lib/node-esm/common/capabilities.mjs.map +7 -0
  85. package/dist/lib/node-esm/core/activation-event.mjs +21 -0
  86. package/dist/lib/node-esm/core/activation-event.mjs.map +7 -0
  87. package/dist/lib/node-esm/core/capability.mjs +29 -0
  88. package/dist/lib/node-esm/core/capability.mjs.map +7 -0
  89. package/dist/lib/node-esm/core/plugin-manager.mjs +16 -0
  90. package/dist/lib/node-esm/core/plugin-manager.mjs.map +7 -0
  91. package/dist/lib/node-esm/core/plugin.mjs +28 -0
  92. package/dist/lib/node-esm/core/plugin.mjs.map +7 -0
  93. package/dist/lib/node-esm/index.mjs +87 -156
  94. package/dist/lib/node-esm/index.mjs.map +4 -4
  95. package/dist/lib/node-esm/invoker-capability-VF6SP44V.mjs +37 -0
  96. package/dist/lib/node-esm/invoker-capability-VF6SP44V.mjs.map +7 -0
  97. package/dist/lib/node-esm/meta.json +1 -1
  98. package/dist/lib/node-esm/testing/index.mjs +89 -39
  99. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  100. package/dist/lib/node-esm/ui/index.mjs +46 -0
  101. package/dist/lib/node-esm/ui/index.mjs.map +7 -0
  102. package/dist/types/src/cli/cli.d.ts +39 -0
  103. package/dist/types/src/cli/cli.d.ts.map +1 -0
  104. package/dist/types/src/cli/index.d.ts +2 -0
  105. package/dist/types/src/cli/index.d.ts.map +1 -0
  106. package/dist/types/src/common/activation-events.d.ts +27 -0
  107. package/dist/types/src/common/activation-events.d.ts.map +1 -0
  108. package/dist/types/src/common/capabilities.d.ts +114 -123
  109. package/dist/types/src/common/capabilities.d.ts.map +1 -1
  110. package/dist/types/src/common/index.d.ts +4 -8
  111. package/dist/types/src/common/index.d.ts.map +1 -1
  112. package/dist/types/src/common/operations.d.ts +33 -0
  113. package/dist/types/src/common/operations.d.ts.map +1 -0
  114. package/dist/types/src/common/translations.d.ts +8 -8
  115. package/dist/types/src/common/translations.d.ts.map +1 -1
  116. package/dist/types/src/context.d.ts +5 -0
  117. package/dist/types/src/context.d.ts.map +1 -0
  118. package/dist/types/src/core/{events.d.ts → activation-event.d.ts} +6 -6
  119. package/dist/types/src/core/activation-event.d.ts.map +1 -0
  120. package/dist/types/src/core/capability-manager.d.ts +43 -0
  121. package/dist/types/src/core/capability-manager.d.ts.map +1 -0
  122. package/dist/types/src/core/capability-manager.test.d.ts +2 -0
  123. package/dist/types/src/core/capability-manager.test.d.ts.map +1 -0
  124. package/dist/types/src/core/capability.d.ts +150 -0
  125. package/dist/types/src/core/capability.d.ts.map +1 -0
  126. package/dist/types/src/core/index.d.ts +5 -4
  127. package/dist/types/src/core/index.d.ts.map +1 -1
  128. package/dist/types/src/core/plugin-manager.d.ts +66 -0
  129. package/dist/types/src/core/plugin-manager.d.ts.map +1 -0
  130. package/dist/types/src/core/plugin-manager.test.d.ts +2 -0
  131. package/dist/types/src/core/plugin-manager.test.d.ts.map +1 -0
  132. package/dist/types/src/core/plugin.d.ts +97 -32
  133. package/dist/types/src/core/plugin.d.ts.map +1 -1
  134. package/dist/types/src/index.d.ts +3 -4
  135. package/dist/types/src/index.d.ts.map +1 -1
  136. package/dist/types/src/plugin-operation/OperationPlugin.d.ts +3 -0
  137. package/dist/types/src/plugin-operation/OperationPlugin.d.ts.map +1 -0
  138. package/dist/types/src/plugin-operation/history/capability.d.ts +7 -0
  139. package/dist/types/src/plugin-operation/history/capability.d.ts.map +1 -0
  140. package/dist/types/src/plugin-operation/history/errors.d.ts +5 -0
  141. package/dist/types/src/plugin-operation/history/errors.d.ts.map +1 -0
  142. package/dist/types/src/plugin-operation/history/history-tracker.d.ts +18 -0
  143. package/dist/types/src/plugin-operation/history/history-tracker.d.ts.map +1 -0
  144. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts +2 -0
  145. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts.map +1 -0
  146. package/dist/types/src/plugin-operation/history/index.d.ts +6 -0
  147. package/dist/types/src/plugin-operation/history/index.d.ts.map +1 -0
  148. package/dist/types/src/plugin-operation/history/types.d.ts +13 -0
  149. package/dist/types/src/plugin-operation/history/types.d.ts.map +1 -0
  150. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts +101 -0
  151. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +1 -0
  152. package/dist/types/src/plugin-operation/history/undo-registry.d.ts +23 -0
  153. package/dist/types/src/plugin-operation/history/undo-registry.d.ts.map +1 -0
  154. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts +2 -0
  155. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts.map +1 -0
  156. package/dist/types/src/plugin-operation/index.d.ts +3 -0
  157. package/dist/types/src/plugin-operation/index.d.ts.map +1 -0
  158. package/dist/types/src/plugin-operation/invoker-capability.d.ts +6 -0
  159. package/dist/types/src/plugin-operation/invoker-capability.d.ts.map +1 -0
  160. package/dist/types/src/plugin-operation/meta.d.ts +3 -0
  161. package/dist/types/src/plugin-operation/meta.d.ts.map +1 -0
  162. package/dist/types/src/plugin-operation/testing.d.ts +109 -0
  163. package/dist/types/src/plugin-operation/testing.d.ts.map +1 -0
  164. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts +3 -0
  165. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts.map +1 -0
  166. package/dist/types/src/plugin-runtime/capability.d.ts +6 -0
  167. package/dist/types/src/plugin-runtime/capability.d.ts.map +1 -0
  168. package/dist/types/src/plugin-runtime/index.d.ts +2 -0
  169. package/dist/types/src/plugin-runtime/index.d.ts.map +1 -0
  170. package/dist/types/src/plugin-runtime/meta.d.ts +3 -0
  171. package/dist/types/src/plugin-runtime/meta.d.ts.map +1 -0
  172. package/dist/types/src/testing/index.d.ts +1 -0
  173. package/dist/types/src/testing/index.d.ts.map +1 -1
  174. package/dist/types/src/testing/service.d.ts +8 -0
  175. package/dist/types/src/testing/service.d.ts.map +1 -0
  176. package/dist/types/src/testing/withPluginManager.d.ts +11 -10
  177. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  178. package/dist/types/src/testing/withPluginManager.stories.d.ts +9 -3
  179. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
  180. package/dist/types/src/ui/components/App/App.d.ts +8 -0
  181. package/dist/types/src/ui/components/App/App.d.ts.map +1 -0
  182. package/dist/types/src/ui/components/App/App.stories.d.ts +19 -0
  183. package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -0
  184. package/dist/types/src/ui/components/App/index.d.ts +2 -0
  185. package/dist/types/src/ui/components/App/index.d.ts.map +1 -0
  186. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts +13 -0
  187. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -0
  188. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts +10 -0
  189. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts.map +1 -0
  190. package/dist/types/src/ui/components/PluginManager/index.d.ts +2 -0
  191. package/dist/types/src/ui/components/PluginManager/index.d.ts.map +1 -0
  192. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +12 -0
  193. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -0
  194. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts +14 -0
  195. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -0
  196. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts +11 -0
  197. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +1 -0
  198. package/dist/types/src/ui/components/Surface/context.d.ts +5 -0
  199. package/dist/types/src/ui/components/Surface/context.d.ts.map +1 -0
  200. package/dist/types/src/ui/components/Surface/index.d.ts +20 -0
  201. package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -0
  202. package/dist/types/src/ui/components/Surface/types.d.ts +96 -0
  203. package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -0
  204. package/dist/types/src/ui/components/index.d.ts +4 -0
  205. package/dist/types/src/ui/components/index.d.ts.map +1 -0
  206. package/dist/types/src/ui/hooks/index.d.ts +7 -0
  207. package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
  208. package/dist/types/src/{App.d.ts → ui/hooks/useApp.d.ts} +21 -14
  209. package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -0
  210. package/dist/types/src/ui/hooks/useCapabilities.d.ts +31 -0
  211. package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -0
  212. package/dist/types/src/ui/hooks/useLoading.d.ts +18 -0
  213. package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
  214. package/dist/types/src/ui/hooks/useOperationResolver.d.ts +19 -0
  215. package/dist/types/src/ui/hooks/useOperationResolver.d.ts.map +1 -0
  216. package/dist/types/src/ui/hooks/useSettingsState.d.ts +10 -0
  217. package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -0
  218. package/dist/types/src/ui/hooks/useSurface.d.ts +3 -0
  219. package/dist/types/src/ui/hooks/useSurface.d.ts.map +1 -0
  220. package/dist/types/src/ui/index.d.ts +3 -0
  221. package/dist/types/src/ui/index.d.ts.map +1 -0
  222. package/dist/types/tsconfig.tsbuildinfo +1 -1
  223. package/moon.yml +11 -3
  224. package/package.json +113 -44
  225. package/src/cli/cli.ts +107 -0
  226. package/src/{playground/layout → cli}/index.ts +1 -1
  227. package/src/common/activation-events.ts +44 -0
  228. package/src/common/capabilities.ts +174 -114
  229. package/src/common/index.ts +4 -8
  230. package/src/common/operations.ts +38 -0
  231. package/src/common/translations.ts +18 -10
  232. package/src/context.ts +9 -0
  233. package/src/core/{events.ts → activation-event.ts} +5 -5
  234. package/src/core/capability-manager.test.ts +151 -0
  235. package/src/core/capability-manager.ts +171 -0
  236. package/src/core/capability.ts +236 -0
  237. package/src/core/index.ts +5 -4
  238. package/src/core/plugin-manager.test.ts +845 -0
  239. package/src/core/plugin-manager.ts +715 -0
  240. package/src/core/plugin.ts +230 -36
  241. package/src/helpers.test.ts +1 -1
  242. package/src/index.ts +3 -4
  243. package/src/plugin-operation/OperationPlugin.ts +25 -0
  244. package/src/plugin-operation/history/capability.ts +37 -0
  245. package/src/plugin-operation/history/errors.ts +11 -0
  246. package/src/plugin-operation/history/history-tracker.test.ts +380 -0
  247. package/src/plugin-operation/history/history-tracker.ts +129 -0
  248. package/src/plugin-operation/history/index.ts +9 -0
  249. package/src/plugin-operation/history/types.ts +17 -0
  250. package/src/plugin-operation/history/undo-mapping.ts +135 -0
  251. package/src/plugin-operation/history/undo-registry.test.ts +73 -0
  252. package/src/plugin-operation/history/undo-registry.ts +54 -0
  253. package/src/plugin-operation/index.ts +6 -0
  254. package/src/plugin-operation/invoker-capability.ts +40 -0
  255. package/src/plugin-operation/meta.ts +11 -0
  256. package/src/plugin-operation/testing.ts +174 -0
  257. package/src/plugin-runtime/RuntimePlugin.ts +20 -0
  258. package/src/plugin-runtime/capability.ts +53 -0
  259. package/src/{playground/debug → plugin-runtime}/index.ts +1 -1
  260. package/src/plugin-runtime/meta.ts +11 -0
  261. package/src/testing/index.ts +1 -0
  262. package/src/testing/service.ts +52 -0
  263. package/src/testing/withPluginManager.stories.tsx +15 -11
  264. package/src/testing/withPluginManager.tsx +47 -45
  265. package/src/ui/components/App/App.stories.tsx +92 -0
  266. package/src/ui/components/App/App.tsx +57 -0
  267. package/src/{playground/logger → ui/components/App}/index.ts +1 -1
  268. package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +183 -0
  269. package/src/{react → ui/components/PluginManager}/PluginManagerProvider.ts +3 -3
  270. package/src/ui/components/PluginManager/index.ts +5 -0
  271. package/src/ui/components/Surface/SurfaceComponent.stories.tsx +143 -0
  272. package/src/ui/components/Surface/SurfaceComponent.tsx +247 -0
  273. package/src/ui/components/Surface/SurfaceInfo.tsx +107 -0
  274. package/src/ui/components/Surface/context.ts +12 -0
  275. package/src/ui/components/Surface/index.ts +20 -0
  276. package/src/ui/components/Surface/types.ts +117 -0
  277. package/src/ui/components/index.ts +7 -0
  278. package/src/ui/hooks/index.ts +10 -0
  279. package/src/ui/hooks/useApp.tsx +213 -0
  280. package/src/ui/hooks/useCapabilities.ts +67 -0
  281. package/src/ui/hooks/useLoading.tsx +68 -0
  282. package/src/ui/hooks/useOperationResolver.ts +40 -0
  283. package/src/ui/hooks/useSettingsState.ts +26 -0
  284. package/src/ui/hooks/useSurface.ts +13 -0
  285. package/src/ui/index.ts +6 -0
  286. package/tsconfig.json +14 -30
  287. package/tsconfig.node.json +1 -3
  288. package/typedoc.json +2 -4
  289. package/vitest.config.ts +8 -6
  290. package/.swc/plugins/v7_linux_x86_64_13.0.0/f45bdff002284d9e8f9ef3f0be909de12da36c049cbcf261ac78fc00abb09a2d +0 -0
  291. package/.swc/plugins/v7_linux_x86_64_13.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429 +0 -0
  292. package/dist/lib/browser/app-graph-builder-LYF7EKNN.mjs +0 -137
  293. package/dist/lib/browser/app-graph-builder-LYF7EKNN.mjs.map +0 -7
  294. package/dist/lib/browser/chunk-FMN65HSW.mjs +0 -1519
  295. package/dist/lib/browser/chunk-FMN65HSW.mjs.map +0 -7
  296. package/dist/lib/browser/chunk-FO2PH7M3.mjs +0 -415
  297. package/dist/lib/browser/chunk-FO2PH7M3.mjs.map +0 -7
  298. package/dist/lib/browser/chunk-ORWHM7CO.mjs +0 -32
  299. package/dist/lib/browser/chunk-ORWHM7CO.mjs.map +0 -7
  300. package/dist/lib/browser/intent-dispatcher-LSYQZSEB.mjs +0 -11
  301. package/dist/lib/browser/intent-resolver-ZTNOSO3A.mjs +0 -39
  302. package/dist/lib/browser/intent-resolver-ZTNOSO3A.mjs.map +0 -7
  303. package/dist/lib/browser/store-KML2R4IE.mjs +0 -30
  304. package/dist/lib/browser/store-KML2R4IE.mjs.map +0 -7
  305. package/dist/lib/browser/worker.mjs +0 -79
  306. package/dist/lib/node-esm/app-graph-builder-SAOWGJDK.mjs +0 -138
  307. package/dist/lib/node-esm/app-graph-builder-SAOWGJDK.mjs.map +0 -7
  308. package/dist/lib/node-esm/chunk-73HGSHKE.mjs +0 -416
  309. package/dist/lib/node-esm/chunk-73HGSHKE.mjs.map +0 -7
  310. package/dist/lib/node-esm/chunk-UMZQERLE.mjs +0 -34
  311. package/dist/lib/node-esm/chunk-UMZQERLE.mjs.map +0 -7
  312. package/dist/lib/node-esm/chunk-ZEZ4FVEU.mjs +0 -1521
  313. package/dist/lib/node-esm/chunk-ZEZ4FVEU.mjs.map +0 -7
  314. package/dist/lib/node-esm/intent-dispatcher-6CYNGPSW.mjs +0 -12
  315. package/dist/lib/node-esm/intent-resolver-W7Z7WFFM.mjs +0 -40
  316. package/dist/lib/node-esm/intent-resolver-W7Z7WFFM.mjs.map +0 -7
  317. package/dist/lib/node-esm/store-QEXGXLWZ.mjs +0 -31
  318. package/dist/lib/node-esm/store-QEXGXLWZ.mjs.map +0 -7
  319. package/dist/lib/node-esm/worker.mjs +0 -80
  320. package/dist/types/src/App.d.ts.map +0 -1
  321. package/dist/types/src/common/collaboration.d.ts +0 -19
  322. package/dist/types/src/common/collaboration.d.ts.map +0 -1
  323. package/dist/types/src/common/events.d.ts +0 -52
  324. package/dist/types/src/common/events.d.ts.map +0 -1
  325. package/dist/types/src/common/file.d.ts +0 -14
  326. package/dist/types/src/common/file.d.ts.map +0 -1
  327. package/dist/types/src/common/graph.d.ts +0 -21
  328. package/dist/types/src/common/graph.d.ts.map +0 -1
  329. package/dist/types/src/common/layout.d.ts +0 -281
  330. package/dist/types/src/common/layout.d.ts.map +0 -1
  331. package/dist/types/src/common/surface.d.ts +0 -65
  332. package/dist/types/src/common/surface.d.ts.map +0 -1
  333. package/dist/types/src/core/capabilities.d.ts +0 -114
  334. package/dist/types/src/core/capabilities.d.ts.map +0 -1
  335. package/dist/types/src/core/capabilities.test.d.ts +0 -2
  336. package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
  337. package/dist/types/src/core/events.d.ts.map +0 -1
  338. package/dist/types/src/core/manager.d.ts +0 -122
  339. package/dist/types/src/core/manager.d.ts.map +0 -1
  340. package/dist/types/src/core/manager.test.d.ts +0 -2
  341. package/dist/types/src/core/manager.test.d.ts.map +0 -1
  342. package/dist/types/src/playground/debug/Debug.d.ts +0 -6
  343. package/dist/types/src/playground/debug/Debug.d.ts.map +0 -1
  344. package/dist/types/src/playground/debug/index.d.ts +0 -2
  345. package/dist/types/src/playground/debug/index.d.ts.map +0 -1
  346. package/dist/types/src/playground/debug/plugin.d.ts +0 -2
  347. package/dist/types/src/playground/debug/plugin.d.ts.map +0 -1
  348. package/dist/types/src/playground/generator/Main.d.ts +0 -6
  349. package/dist/types/src/playground/generator/Main.d.ts.map +0 -1
  350. package/dist/types/src/playground/generator/Toolbar.d.ts +0 -6
  351. package/dist/types/src/playground/generator/Toolbar.d.ts.map +0 -1
  352. package/dist/types/src/playground/generator/generator.d.ts +0 -7
  353. package/dist/types/src/playground/generator/generator.d.ts.map +0 -1
  354. package/dist/types/src/playground/generator/index.d.ts +0 -3
  355. package/dist/types/src/playground/generator/index.d.ts.map +0 -1
  356. package/dist/types/src/playground/generator/plugin.d.ts +0 -2
  357. package/dist/types/src/playground/generator/plugin.d.ts.map +0 -1
  358. package/dist/types/src/playground/layout/Layout.d.ts +0 -8
  359. package/dist/types/src/playground/layout/Layout.d.ts.map +0 -1
  360. package/dist/types/src/playground/layout/index.d.ts +0 -2
  361. package/dist/types/src/playground/layout/index.d.ts.map +0 -1
  362. package/dist/types/src/playground/layout/plugin.d.ts +0 -2
  363. package/dist/types/src/playground/layout/plugin.d.ts.map +0 -1
  364. package/dist/types/src/playground/logger/Toolbar.d.ts +0 -6
  365. package/dist/types/src/playground/logger/Toolbar.d.ts.map +0 -1
  366. package/dist/types/src/playground/logger/index.d.ts +0 -2
  367. package/dist/types/src/playground/logger/index.d.ts.map +0 -1
  368. package/dist/types/src/playground/logger/plugin.d.ts +0 -2
  369. package/dist/types/src/playground/logger/plugin.d.ts.map +0 -1
  370. package/dist/types/src/playground/logger/schema.d.ts +0 -13
  371. package/dist/types/src/playground/logger/schema.d.ts.map +0 -1
  372. package/dist/types/src/playground/playground.stories.d.ts +0 -10
  373. package/dist/types/src/playground/playground.stories.d.ts.map +0 -1
  374. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +0 -2
  375. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +0 -1
  376. package/dist/types/src/plugin-intent/actions.d.ts +0 -38
  377. package/dist/types/src/plugin-intent/actions.d.ts.map +0 -1
  378. package/dist/types/src/plugin-intent/errors.d.ts +0 -16
  379. package/dist/types/src/plugin-intent/errors.d.ts.map +0 -1
  380. package/dist/types/src/plugin-intent/index.d.ts +0 -5
  381. package/dist/types/src/plugin-intent/index.d.ts.map +0 -1
  382. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +0 -139
  383. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +0 -1
  384. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +0 -2
  385. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +0 -1
  386. package/dist/types/src/plugin-intent/intent.d.ts +0 -63
  387. package/dist/types/src/plugin-intent/intent.d.ts.map +0 -1
  388. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +0 -2
  389. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +0 -1
  390. package/dist/types/src/plugin-settings/actions.d.ts +0 -27
  391. package/dist/types/src/plugin-settings/actions.d.ts.map +0 -1
  392. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +0 -4
  393. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +0 -1
  394. package/dist/types/src/plugin-settings/index.d.ts +0 -3
  395. package/dist/types/src/plugin-settings/index.d.ts.map +0 -1
  396. package/dist/types/src/plugin-settings/intent-resolver.d.ts +0 -4
  397. package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +0 -1
  398. package/dist/types/src/plugin-settings/store.d.ts +0 -5
  399. package/dist/types/src/plugin-settings/store.d.ts.map +0 -1
  400. package/dist/types/src/plugin-settings/translations.d.ts +0 -10
  401. package/dist/types/src/plugin-settings/translations.d.ts.map +0 -1
  402. package/dist/types/src/react/ErrorBoundary.d.ts +0 -31
  403. package/dist/types/src/react/ErrorBoundary.d.ts.map +0 -1
  404. package/dist/types/src/react/IntentContext.d.ts +0 -8
  405. package/dist/types/src/react/IntentContext.d.ts.map +0 -1
  406. package/dist/types/src/react/PluginManagerProvider.d.ts +0 -10
  407. package/dist/types/src/react/PluginManagerProvider.d.ts.map +0 -1
  408. package/dist/types/src/react/Surface.d.ts +0 -12
  409. package/dist/types/src/react/Surface.d.ts.map +0 -1
  410. package/dist/types/src/react/Surface.stories.d.ts +0 -16
  411. package/dist/types/src/react/Surface.stories.d.ts.map +0 -1
  412. package/dist/types/src/react/common.d.ts +0 -13
  413. package/dist/types/src/react/common.d.ts.map +0 -1
  414. package/dist/types/src/react/index.d.ts +0 -7
  415. package/dist/types/src/react/index.d.ts.map +0 -1
  416. package/dist/types/src/react/useCapabilities.d.ts +0 -13
  417. package/dist/types/src/react/useCapabilities.d.ts.map +0 -1
  418. package/dist/types/src/react/useIntentResolver.d.ts +0 -3
  419. package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
  420. package/dist/types/src/worker.d.ts +0 -4
  421. package/dist/types/src/worker.d.ts.map +0 -1
  422. package/src/App.tsx +0 -276
  423. package/src/common/collaboration.ts +0 -21
  424. package/src/common/events.ts +0 -77
  425. package/src/common/file.ts +0 -22
  426. package/src/common/graph.ts +0 -30
  427. package/src/common/layout.ts +0 -278
  428. package/src/common/surface.ts +0 -86
  429. package/src/core/capabilities.test.ts +0 -136
  430. package/src/core/capabilities.ts +0 -254
  431. package/src/core/manager.test.ts +0 -515
  432. package/src/core/manager.ts +0 -519
  433. package/src/playground/debug/Debug.tsx +0 -39
  434. package/src/playground/debug/plugin.ts +0 -17
  435. package/src/playground/generator/Main.tsx +0 -71
  436. package/src/playground/generator/Toolbar.tsx +0 -46
  437. package/src/playground/generator/generator.ts +0 -48
  438. package/src/playground/generator/index.ts +0 -6
  439. package/src/playground/generator/plugin.ts +0 -23
  440. package/src/playground/layout/Layout.tsx +0 -33
  441. package/src/playground/layout/plugin.ts +0 -17
  442. package/src/playground/logger/Toolbar.tsx +0 -29
  443. package/src/playground/logger/plugin.ts +0 -36
  444. package/src/playground/logger/schema.ts +0 -12
  445. package/src/playground/playground.stories.tsx +0 -42
  446. package/src/plugin-intent/IntentPlugin.ts +0 -20
  447. package/src/plugin-intent/actions.ts +0 -33
  448. package/src/plugin-intent/errors.ts +0 -39
  449. package/src/plugin-intent/index.ts +0 -8
  450. package/src/plugin-intent/intent-dispatcher.test.ts +0 -279
  451. package/src/plugin-intent/intent-dispatcher.ts +0 -333
  452. package/src/plugin-intent/intent.ts +0 -154
  453. package/src/plugin-settings/SettingsPlugin.ts +0 -35
  454. package/src/plugin-settings/actions.ts +0 -29
  455. package/src/plugin-settings/app-graph-builder.ts +0 -157
  456. package/src/plugin-settings/index.ts +0 -6
  457. package/src/plugin-settings/intent-resolver.ts +0 -34
  458. package/src/plugin-settings/store.ts +0 -33
  459. package/src/plugin-settings/translations.ts +0 -19
  460. package/src/react/ErrorBoundary.tsx +0 -45
  461. package/src/react/IntentContext.tsx +0 -34
  462. package/src/react/Surface.stories.tsx +0 -96
  463. package/src/react/Surface.tsx +0 -77
  464. package/src/react/common.ts +0 -12
  465. package/src/react/index.ts +0 -10
  466. package/src/react/useCapabilities.ts +0 -30
  467. package/src/react/useIntentResolver.ts +0 -22
  468. package/src/worker.ts +0 -11
  469. /package/dist/lib/browser/{intent-dispatcher-LSYQZSEB.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  470. /package/dist/lib/browser/{worker.mjs.map → chunk-YAFEA4GV.mjs.map} +0 -0
  471. /package/dist/lib/{node-esm/intent-dispatcher-6CYNGPSW.mjs.map → browser/common/activation-events.mjs.map} +0 -0
  472. /package/dist/lib/{node-esm/worker.mjs.map → browser/common/capabilities.mjs.map} +0 -0
@@ -0,0 +1,213 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { RegistryContext } from '@effect-atom/atom-react';
6
+ import * as Effect from 'effect/Effect';
7
+ import * as Fiber from 'effect/Fiber';
8
+ import * as PubSub from 'effect/PubSub';
9
+ import * as Queue from 'effect/Queue';
10
+ import React, { type FC, useCallback, useEffect, useMemo, useRef, useState } from 'react';
11
+
12
+ import { runAndForwardErrors } from '@dxos/effect';
13
+ import { invariant } from '@dxos/invariant';
14
+ import { log } from '@dxos/log';
15
+ import { ErrorBoundary, ErrorFallback, type FallbackProps } from '@dxos/react-error-boundary';
16
+ import { useAsyncEffect, useDefaultValue } from '@dxos/react-hooks';
17
+ import { ContextProtocolProvider } from '@dxos/web-context-react';
18
+
19
+ import { ActivationEvents, Capabilities } from '../../common';
20
+ import { PluginManagerContext } from '../../context';
21
+ import { type ActivationEvent, type Plugin, PluginManager } from '../../core';
22
+ import { App, PluginManagerProvider } from '../components';
23
+
24
+ const ENABLED_KEY = 'dxos.org/app-framework/enabled';
25
+
26
+ export type UseAppOptions = {
27
+ pluginManager?: PluginManager.PluginManager;
28
+ pluginLoader?: PluginManager.ManagerOptions['pluginLoader'];
29
+ plugins?: Plugin.Plugin[];
30
+ core?: string[];
31
+ defaults?: string[];
32
+ /**
33
+ * Additional activation events to fire before startup.
34
+ * These are fired alongside SetupReactSurface before the Startup event.
35
+ */
36
+ setupEvents?: ActivationEvent.ActivationEvent[];
37
+ cacheEnabled?: boolean;
38
+ safeMode?: boolean;
39
+ debounce?: number;
40
+ timeout?: number;
41
+ fallback?: FC<FallbackProps>;
42
+ placeholder?: FC<{ stage: number }>;
43
+ };
44
+
45
+ /**
46
+ * Expected usage is for this to be the entrypoint of the application.
47
+ * Initializes plugins and renders the root components.
48
+ *
49
+ * @example
50
+ * const plugins = [LayoutPlugin(), MyPlugin()];
51
+ * const core = [LayoutPluginId];
52
+ * const default = [MyPluginId];
53
+ * const fallback = <div>Initializing Plugins...</div>;
54
+ * const App = useApp({ plugins, core, default, fallback });
55
+ * createRoot(document.getElementById('root')!).render(
56
+ * <StrictMode>
57
+ * <App />
58
+ * </StrictMode>,
59
+ * );
60
+ *
61
+ * @param params.pluginLoader A function which loads new plugins.
62
+ * @param params.plugins All plugins available to the application.
63
+ * @param params.core Core plugins which will always be enabled.
64
+ * @param params.defaults Default plugins are enabled by default but can be disabled by the user.
65
+ * @param params.cacheEnabled Whether to cache enabled plugins in localStorage.
66
+ * @param params.safeMode Whether to enable safe mode, which disables optional plugins.
67
+ * @param params.fallback Fallback component to render if an error occurs during startup.
68
+ * @param params.placeholder Placeholder component to render during startup.
69
+ */
70
+ export const useApp = ({
71
+ pluginManager,
72
+ pluginLoader: pluginLoaderProp,
73
+ plugins: pluginsProp,
74
+ core: coreProp,
75
+ defaults: defaultsProp,
76
+ setupEvents: setupEventsProp,
77
+ placeholder,
78
+ fallback = ErrorFallback,
79
+ cacheEnabled = false,
80
+ safeMode = false,
81
+ debounce = 0,
82
+ timeout = 30_000,
83
+ }: UseAppOptions) => {
84
+ const plugins = useDefaultValue(pluginsProp, () => []);
85
+ const core = useDefaultValue(coreProp, () => plugins.map(({ meta }) => meta.id));
86
+ const defaults = useDefaultValue(defaultsProp, () => []);
87
+ const setupEvents = useDefaultValue(setupEventsProp, () => []);
88
+
89
+ // TODO(wittjosiah): Provide a custom plugin loader which supports loading via url.
90
+ const pluginLoader = useMemo(
91
+ () =>
92
+ pluginLoaderProp ??
93
+ ((id: string) =>
94
+ Effect.sync(() => {
95
+ const plugin = plugins.find((plugin) => plugin.meta.id === id);
96
+ invariant(plugin, `Plugin not found: ${id}`);
97
+ return plugin;
98
+ })),
99
+ [pluginLoaderProp, plugins],
100
+ );
101
+
102
+ const readyRef = useRef(false);
103
+ const [ready, setReady] = useState(false);
104
+ const errorRef = useRef<unknown>(null);
105
+ const [error, setError] = useState<unknown>(null);
106
+ // TODO(wittjosiah): Migrate to Atom.kvs for isomorphic storage.
107
+ const cached: string[] = useMemo(() => JSON.parse(localStorage.getItem(ENABLED_KEY) ?? '[]'), []);
108
+ const enabled = useMemo(
109
+ () => (safeMode ? [] : cacheEnabled && cached.length > 0 ? cached : defaults),
110
+ [safeMode, cacheEnabled, cached, defaults],
111
+ );
112
+ const manager = useMemo(
113
+ () => pluginManager ?? PluginManager.make({ pluginLoader, plugins, core, enabled }),
114
+ [pluginManager, pluginLoader, plugins, core, enabled],
115
+ );
116
+
117
+ useEffect(() => {
118
+ if (!cacheEnabled) {
119
+ return;
120
+ }
121
+ return manager.registry.subscribe(manager.enabled, (value) => {
122
+ localStorage.setItem(ENABLED_KEY, JSON.stringify(value));
123
+ });
124
+ }, [cacheEnabled, manager]);
125
+
126
+ useEffect(() => {
127
+ setupDevtools(manager);
128
+ }, [manager]);
129
+
130
+ useAsyncEffect(async () => {
131
+ manager.capabilities.contribute({
132
+ interface: Capabilities.PluginManager,
133
+ implementation: manager,
134
+ module: 'dxos.org/app-framework/plugin-manager',
135
+ });
136
+
137
+ manager.capabilities.contribute({
138
+ interface: Capabilities.AtomRegistry,
139
+ implementation: manager.registry,
140
+ module: 'dxos.org/app-framework/atom-registry',
141
+ });
142
+
143
+ const fiber = Effect.gen(function* () {
144
+ const queue = yield* PubSub.subscribe(manager.activation);
145
+ const listener = yield* Effect.forkDaemon(
146
+ Queue.take(queue).pipe(
147
+ Effect.tap(({ event, state, error: error$ }) =>
148
+ Effect.sync(() => {
149
+ if (event === ActivationEvents.Startup.id && state === 'activated') {
150
+ clearTimeout(timeoutId);
151
+ setReady(true);
152
+ readyRef.current = true;
153
+ }
154
+ if (error$ && !readyRef.current) {
155
+ setError(error$);
156
+ errorRef.current = error$;
157
+ }
158
+ }),
159
+ ),
160
+ Effect.forever,
161
+ ),
162
+ );
163
+
164
+ yield* Effect.all([
165
+ ...setupEvents.map((event) => manager.activate(event)),
166
+ manager.activate(ActivationEvents.SetupReactSurface),
167
+ manager.activate(ActivationEvents.Startup),
168
+ ]);
169
+
170
+ return yield* Fiber.join(listener);
171
+ }).pipe(Effect.scoped, Effect.runFork);
172
+
173
+ // Set up a timeout for startup.
174
+ const timeoutId = setTimeout(() => {
175
+ if (!readyRef.current && !errorRef.current) {
176
+ log.warn('startup timeout diagnostic', {
177
+ eventsFired: manager.getEventsFired(),
178
+ activeModules: manager.getActive(),
179
+ pendingReset: manager.getPendingReset(),
180
+ });
181
+ void runAndForwardErrors(Fiber.interrupt(fiber));
182
+ setError(new Error(`Startup timed out after ${timeout}ms`));
183
+ }
184
+ }, timeout);
185
+
186
+ return () => {
187
+ clearTimeout(timeoutId);
188
+ void runAndForwardErrors(Fiber.interrupt(fiber));
189
+ manager.capabilities.remove(Capabilities.PluginManager, manager);
190
+ manager.capabilities.remove(Capabilities.AtomRegistry, manager.registry);
191
+ };
192
+ }, [manager]);
193
+
194
+ return useCallback(
195
+ () => (
196
+ <ErrorBoundary name='app' FallbackComponent={fallback}>
197
+ <PluginManagerProvider value={manager}>
198
+ <ContextProtocolProvider value={manager} context={PluginManagerContext}>
199
+ <RegistryContext.Provider value={manager.registry}>
200
+ <App placeholder={placeholder} ready={ready} error={error} debounce={debounce} />
201
+ </RegistryContext.Provider>
202
+ </ContextProtocolProvider>
203
+ </PluginManagerProvider>
204
+ </ErrorBoundary>
205
+ ),
206
+ [fallback, manager, placeholder, ready, error],
207
+ );
208
+ };
209
+
210
+ const setupDevtools = (manager: PluginManager.PluginManager) => {
211
+ (globalThis as any).composer ??= {};
212
+ (globalThis as any).composer.manager = manager;
213
+ };
@@ -0,0 +1,67 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Atom, useAtomValue } from '@effect-atom/atom-react';
6
+ import { useCallback } from 'react';
7
+
8
+ import { invariant } from '@dxos/invariant';
9
+
10
+ import { Capabilities } from '../../common';
11
+ import { type Capability } from '../../core';
12
+ import { usePluginManager } from '../components';
13
+
14
+ /**
15
+ * Hook to request capabilities from the plugin context.
16
+ * @returns An array of capabilities.
17
+ */
18
+ export const useCapabilities = <T>(interfaceDef: Capability.InterfaceDef<T>) => {
19
+ const manager = usePluginManager();
20
+ return useAtomValue(manager.capabilities.atom(interfaceDef));
21
+ };
22
+
23
+ /**
24
+ * Hook to request a capability from the plugin context.
25
+ * @returns The capability.
26
+ * @throws If no capability is found.
27
+ */
28
+ export const useCapability = <T>(interfaceDef: Capability.InterfaceDef<T>) => {
29
+ const capabilities = useCapabilities(interfaceDef);
30
+ invariant(capabilities.length > 0, `No capability found for ${interfaceDef.identifier}`);
31
+ return capabilities[0];
32
+ };
33
+
34
+ /**
35
+ * Hook to get the current value of an atom capability.
36
+ * Automatically subscribes to changes.
37
+ * @example const settings = useAtomCapability(ThreadCapabilities.Settings);
38
+ */
39
+ export const useAtomCapability = <T>(atomCapability: Capability.InterfaceDef<Atom.Atom<T>>): T => {
40
+ const atom = useCapability(atomCapability);
41
+ return useAtomValue(atom);
42
+ };
43
+
44
+ /**
45
+ * Hook to get value and updater for an atom capability.
46
+ * Returns [currentValue, updateFn] similar to useState.
47
+ * @example const [settings, updateSettings] = useAtomCapabilityState(ThreadCapabilities.Settings);
48
+ */
49
+ export const useAtomCapabilityState = <T>(
50
+ atomCapability: Capability.InterfaceDef<Atom.Writable<T>>,
51
+ ): [T, (fn: (current: T) => T) => void] => {
52
+ const registry = useCapability(Capabilities.AtomRegistry);
53
+ const atom = useCapability(atomCapability);
54
+ const value = useAtomValue(atom);
55
+ const update = useCallback(
56
+ (fn: (current: T) => T) => {
57
+ registry.set(atom, fn(registry.get(atom)));
58
+ },
59
+ [registry, atom],
60
+ );
61
+ return [value, update];
62
+ };
63
+
64
+ /**
65
+ * Hook to get the operation invoker capability.
66
+ */
67
+ export const useOperationInvoker = (): Capabilities.OperationInvoker => useCapability(Capabilities.OperationInvoker);
@@ -0,0 +1,68 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { useEffect, useState } from 'react';
6
+
7
+ export enum LoadingState {
8
+ Loading = 0,
9
+ FadeIn = 1,
10
+ FadeOut = 2,
11
+ Done = 3,
12
+ }
13
+
14
+ /**
15
+ * To avoid "flashing" the placeholder, we wait a period of time before starting the loading animation.
16
+ * If loading completes during this time the placehoder is not shown, otherwise is it displayed for a minimum period of time.
17
+ *
18
+ * States:
19
+ * 0: Loading - Wait for a period of time before starting the loading animation.
20
+ * 1: Fade-in - Display a loading animation.
21
+ * 2: Fade-out - Fade out the loading animation.
22
+ * 3: Done - Remove the placeholder.
23
+ */
24
+ export const useLoading = (ready: boolean, debounce = 0) => {
25
+ const [stage, setStage] = useState<LoadingState>(LoadingState.Loading);
26
+ useEffect(() => {
27
+ if (!debounce) {
28
+ return;
29
+ }
30
+
31
+ const i = setInterval(() => {
32
+ setStage((stage) => {
33
+ switch (stage) {
34
+ case LoadingState.Loading: {
35
+ if (!ready) {
36
+ return LoadingState.FadeIn;
37
+ } else {
38
+ clearInterval(i);
39
+ return LoadingState.Done;
40
+ }
41
+ }
42
+
43
+ case LoadingState.FadeIn: {
44
+ if (ready) {
45
+ return LoadingState.FadeOut;
46
+ }
47
+ break;
48
+ }
49
+
50
+ case LoadingState.FadeOut: {
51
+ clearInterval(i);
52
+ return LoadingState.Done;
53
+ }
54
+ }
55
+
56
+ return stage;
57
+ });
58
+ }, debounce);
59
+
60
+ return () => clearInterval(i);
61
+ }, [debounce]);
62
+
63
+ if (!debounce) {
64
+ return ready ? LoadingState.Done : LoadingState.Loading;
65
+ }
66
+
67
+ return stage;
68
+ };
@@ -0,0 +1,40 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { useEffect, useMemo } from 'react';
6
+
7
+ import { Capabilities } from '../../common';
8
+ import { usePluginManager } from '../components';
9
+
10
+ /**
11
+ * Hook to dynamically register an operation resolver (handler) within a React component.
12
+ * The resolver is added when the component mounts and removed when it unmounts.
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * const scrollHandler = useMemo(() => OperationResolver.make({
17
+ * operation: LayoutOperation.ScrollIntoView,
18
+ * handler: (input) => Effect.sync(() => {
19
+ * // Handle scroll
20
+ * }),
21
+ * }), [deps]);
22
+ *
23
+ * useOperationResolver(meta.id, scrollHandler);
24
+ * ```
25
+ */
26
+ export const useOperationResolver = (module: string, resolver: Capabilities.OperationResolver) => {
27
+ const manager = usePluginManager();
28
+ // Wrap single resolver in array as the capability expects an array.
29
+ const resolverArray = useMemo(() => [resolver], [resolver]);
30
+
31
+ useEffect(() => {
32
+ manager.capabilities.contribute({
33
+ module,
34
+ interface: Capabilities.OperationResolver,
35
+ implementation: resolverArray,
36
+ });
37
+
38
+ return () => manager.capabilities.remove(Capabilities.OperationResolver, resolverArray);
39
+ }, [module, resolverArray]);
40
+ };
@@ -0,0 +1,26 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Atom, RegistryContext, useAtomValue } from '@effect-atom/atom-react';
6
+ import { useCallback, useContext } from 'react';
7
+
8
+ /**
9
+ * Hook to read and update a settings atom.
10
+ * Returns the current value and an update function.
11
+ */
12
+ export const useSettingsState = <T>(
13
+ atom: Atom.Writable<T>,
14
+ ): { settings: T; updateSettings: (fn: (current: T) => T) => void } => {
15
+ const registry = useContext(RegistryContext);
16
+ const settings = useAtomValue(atom);
17
+
18
+ const updateSettings = useCallback(
19
+ (fn: (current: T) => T) => {
20
+ registry.set(atom, fn(registry.get(atom)));
21
+ },
22
+ [registry, atom],
23
+ );
24
+
25
+ return { settings, updateSettings };
26
+ };
@@ -0,0 +1,13 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { useContext } from 'react';
6
+
7
+ import { raise } from '@dxos/debug';
8
+
9
+ import { Surface } from '../components';
10
+
11
+ export const useSurface = (): Surface.Context => {
12
+ return useContext(Surface.Context) ?? raise(new Error('Missing SurfaceContext'));
13
+ };
@@ -0,0 +1,6 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ export * from './components';
6
+ export * from './hooks';
package/tsconfig.json CHANGED
@@ -15,13 +15,10 @@
15
15
  "path": "../../common/debug"
16
16
  },
17
17
  {
18
- "path": "../../common/invariant"
19
- },
20
- {
21
- "path": "../../common/keys"
18
+ "path": "../../common/effect"
22
19
  },
23
20
  {
24
- "path": "../../common/local-storage"
21
+ "path": "../../common/invariant"
25
22
  },
26
23
  {
27
24
  "path": "../../common/log"
@@ -33,50 +30,37 @@
33
30
  "path": "../../common/storybook-utils"
34
31
  },
35
32
  {
36
- "path": "../../common/util"
37
- },
38
- {
39
- "path": "../../core/ai"
33
+ "path": "../../common/test-utils"
40
34
  },
41
35
  {
42
- "path": "../../core/blueprints"
43
- },
44
- {
45
- "path": "../../core/echo/echo-schema"
36
+ "path": "../../common/util"
46
37
  },
47
38
  {
48
- "path": "../../core/echo/echo-signals"
39
+ "path": "../../common/web-context"
49
40
  },
50
41
  {
51
- "path": "../../core/echo/live-object"
42
+ "path": "../../common/web-context-react"
52
43
  },
53
44
  {
54
- "path": "../../core/functions"
45
+ "path": "../../core/echo/echo"
55
46
  },
56
47
  {
57
- "path": "../../ui/primitives/react-hooks"
48
+ "path": "../../core/echo/echo-db"
58
49
  },
59
50
  {
60
- "path": "../../ui/react-ui"
51
+ "path": "../../core/operation"
61
52
  },
62
53
  {
63
- "path": "../../ui/react-ui-syntax-highlighter"
54
+ "path": "../../ui/react-primitives/react-error-boundary"
64
55
  },
65
56
  {
66
- "path": "../app-graph"
57
+ "path": "../../ui/react-primitives/react-hooks"
67
58
  },
68
59
  {
69
- "path": "../client-protocol"
60
+ "path": "../../ui/react-ui"
70
61
  },
71
62
  {
72
- "path": "../schema"
63
+ "path": "../../ui/ui-theme"
73
64
  }
74
- ],
75
- "ts-node": {
76
- "compilerOptions": {
77
- "module": "CommonJS"
78
- },
79
- "files": true,
80
- "transpileOnly": true
81
- }
65
+ ]
82
66
  }
@@ -5,7 +5,5 @@
5
5
  "moduleResolution": "Node",
6
6
  "allowSyntheticDefaultImports": true
7
7
  },
8
- "include": [
9
- "vite.config.ts"
10
- ]
8
+ "include": ["vite.config.ts"]
11
9
  }
package/typedoc.json CHANGED
@@ -1,7 +1,5 @@
1
1
  {
2
2
  "$schema": "https://typedoc.org/schema.json",
3
3
  "includeVersion": true,
4
- "entryPoints": [
5
- "src/index.ts"
6
- ]
7
- }
4
+ "entryPoints": ["src/index.ts"]
5
+ }
package/vitest.config.ts CHANGED
@@ -2,11 +2,13 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { defineConfig, mergeConfig } from 'vitest/config';
5
+ import path from 'node:path';
6
+ import { fileURLToPath } from 'node:url';
6
7
 
7
- import { baseConfig } from '../../../vitest.base.config';
8
+ import { createConfig } from '../../../vitest.base.config';
8
9
 
9
- export default mergeConfig(
10
- baseConfig({ cwd: __dirname }),
11
- defineConfig({}),
12
- );
10
+ export default createConfig({
11
+ dirname: typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)),
12
+ node: true,
13
+ storybook: true,
14
+ });