@dxos/app-framework 0.7.4 → 0.7.5-feature-compute.4d9d99a

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 (327) hide show
  1. package/dist/lib/browser/chunk-EGGZVV7Q.mjs +1595 -0
  2. package/dist/lib/browser/chunk-EGGZVV7Q.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +136 -527
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +67 -0
  7. package/dist/lib/browser/testing/index.mjs.map +7 -0
  8. package/dist/lib/node/chunk-UBX6GP2N.cjs +1639 -0
  9. package/dist/lib/node/chunk-UBX6GP2N.cjs.map +7 -0
  10. package/dist/lib/node/index.cjs +141 -551
  11. package/dist/lib/node/index.cjs.map +4 -4
  12. package/dist/lib/node/meta.json +1 -1
  13. package/dist/lib/node/testing/index.cjs +91 -0
  14. package/dist/lib/node/testing/index.cjs.map +7 -0
  15. package/dist/lib/node-esm/chunk-HG5P55WF.mjs +1597 -0
  16. package/dist/lib/node-esm/chunk-HG5P55WF.mjs.map +7 -0
  17. package/dist/lib/node-esm/index.mjs +136 -527
  18. package/dist/lib/node-esm/index.mjs.map +4 -4
  19. package/dist/lib/node-esm/meta.json +1 -1
  20. package/dist/lib/node-esm/testing/index.mjs +68 -0
  21. package/dist/lib/node-esm/testing/index.mjs.map +7 -0
  22. package/dist/types/src/App.d.ts +22 -13
  23. package/dist/types/src/App.d.ts.map +1 -1
  24. package/dist/types/src/common/capabilities.d.ts +340 -0
  25. package/dist/types/src/common/capabilities.d.ts.map +1 -0
  26. package/dist/types/src/common/events.d.ts +41 -0
  27. package/dist/types/src/common/events.d.ts.map +1 -0
  28. package/dist/types/src/common/file.d.ts +14 -0
  29. package/dist/types/src/common/file.d.ts.map +1 -0
  30. package/dist/types/src/common/graph.d.ts +21 -0
  31. package/dist/types/src/common/graph.d.ts.map +1 -0
  32. package/dist/types/src/{plugins/common → common}/index.d.ts +3 -1
  33. package/dist/types/src/common/index.d.ts.map +1 -0
  34. package/dist/types/src/common/layout.d.ts +165 -0
  35. package/dist/types/src/common/layout.d.ts.map +1 -0
  36. package/dist/types/src/{plugins/common → common}/navigation.d.ts +77 -32
  37. package/dist/types/src/common/navigation.d.ts.map +1 -0
  38. package/dist/types/src/common/surface.d.ts +68 -0
  39. package/dist/types/src/common/surface.d.ts.map +1 -0
  40. package/dist/types/src/{plugins/common → common}/translations.d.ts +0 -11
  41. package/dist/types/src/common/translations.d.ts.map +1 -0
  42. package/dist/types/src/core/capabilities.d.ts +90 -0
  43. package/dist/types/src/core/capabilities.d.ts.map +1 -0
  44. package/dist/types/src/core/capabilities.test.d.ts +2 -0
  45. package/dist/types/src/core/capabilities.test.d.ts.map +1 -0
  46. package/dist/types/src/core/events.d.ts +58 -0
  47. package/dist/types/src/core/events.d.ts.map +1 -0
  48. package/dist/types/src/core/index.d.ts +5 -0
  49. package/dist/types/src/core/index.d.ts.map +1 -0
  50. package/dist/types/src/core/manager.d.ts +126 -0
  51. package/dist/types/src/core/manager.d.ts.map +1 -0
  52. package/dist/types/src/core/manager.test.d.ts +2 -0
  53. package/dist/types/src/core/manager.test.d.ts.map +1 -0
  54. package/dist/types/src/core/plugin.d.ts +94 -0
  55. package/dist/types/src/core/plugin.d.ts.map +1 -0
  56. package/dist/types/src/helpers.d.ts +10 -0
  57. package/dist/types/src/helpers.d.ts.map +1 -0
  58. package/dist/types/src/helpers.test.d.ts +2 -0
  59. package/dist/types/src/helpers.test.d.ts.map +1 -0
  60. package/dist/types/src/index.d.ts +5 -1
  61. package/dist/types/src/index.d.ts.map +1 -1
  62. package/dist/types/src/playground/debug/Debug.d.ts +6 -0
  63. package/dist/types/src/playground/debug/Debug.d.ts.map +1 -0
  64. package/dist/types/src/playground/debug/index.d.ts +2 -0
  65. package/dist/types/src/playground/debug/index.d.ts.map +1 -0
  66. package/dist/types/src/playground/debug/plugin.d.ts +2 -0
  67. package/dist/types/src/playground/debug/plugin.d.ts.map +1 -0
  68. package/dist/types/src/playground/generator/Main.d.ts +6 -0
  69. package/dist/types/src/playground/generator/Main.d.ts.map +1 -0
  70. package/dist/types/src/playground/generator/Toolbar.d.ts +6 -0
  71. package/dist/types/src/playground/generator/Toolbar.d.ts.map +1 -0
  72. package/dist/types/src/playground/generator/generator.d.ts +5 -0
  73. package/dist/types/src/playground/generator/generator.d.ts.map +1 -0
  74. package/dist/types/src/playground/generator/index.d.ts +3 -0
  75. package/dist/types/src/playground/generator/index.d.ts.map +1 -0
  76. package/dist/types/src/playground/generator/plugin.d.ts +2 -0
  77. package/dist/types/src/playground/generator/plugin.d.ts.map +1 -0
  78. package/dist/types/src/playground/layout/Layout.d.ts +8 -0
  79. package/dist/types/src/playground/layout/Layout.d.ts.map +1 -0
  80. package/dist/types/src/playground/layout/index.d.ts +2 -0
  81. package/dist/types/src/playground/layout/index.d.ts.map +1 -0
  82. package/dist/types/src/playground/layout/plugin.d.ts +2 -0
  83. package/dist/types/src/playground/layout/plugin.d.ts.map +1 -0
  84. package/dist/types/src/playground/logger/Toolbar.d.ts +6 -0
  85. package/dist/types/src/playground/logger/Toolbar.d.ts.map +1 -0
  86. package/dist/types/src/playground/logger/index.d.ts +2 -0
  87. package/dist/types/src/playground/logger/index.d.ts.map +1 -0
  88. package/dist/types/src/playground/logger/plugin.d.ts +2 -0
  89. package/dist/types/src/playground/logger/plugin.d.ts.map +1 -0
  90. package/dist/types/src/playground/logger/schema.d.ts +13 -0
  91. package/dist/types/src/playground/logger/schema.d.ts.map +1 -0
  92. package/dist/types/src/playground/playground.stories.d.ts +10 -0
  93. package/dist/types/src/playground/playground.stories.d.ts.map +1 -0
  94. package/dist/types/src/plugin-intent/IntentContext.d.ts +8 -0
  95. package/dist/types/src/plugin-intent/IntentContext.d.ts.map +1 -0
  96. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +2 -0
  97. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +1 -0
  98. package/dist/types/src/plugin-intent/actions.d.ts +23 -0
  99. package/dist/types/src/plugin-intent/actions.d.ts.map +1 -0
  100. package/dist/types/src/plugin-intent/errors.d.ts +16 -0
  101. package/dist/types/src/plugin-intent/errors.d.ts.map +1 -0
  102. package/dist/types/src/plugin-intent/index.d.ts +6 -0
  103. package/dist/types/src/plugin-intent/index.d.ts.map +1 -0
  104. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +106 -0
  105. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +1 -0
  106. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +2 -0
  107. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +1 -0
  108. package/dist/types/src/plugin-intent/intent.d.ts +68 -0
  109. package/dist/types/src/plugin-intent/intent.d.ts.map +1 -0
  110. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +2 -0
  111. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +1 -0
  112. package/dist/types/src/plugin-settings/actions.d.ts +17 -0
  113. package/dist/types/src/plugin-settings/actions.d.ts.map +1 -0
  114. package/dist/types/src/plugin-settings/index.d.ts +3 -0
  115. package/dist/types/src/plugin-settings/index.d.ts.map +1 -0
  116. package/dist/types/src/react/ErrorBoundary.d.ts.map +1 -0
  117. package/dist/types/src/react/PluginManagerProvider.d.ts +10 -0
  118. package/dist/types/src/react/PluginManagerProvider.d.ts.map +1 -0
  119. package/dist/types/src/react/Surface.d.ts +12 -0
  120. package/dist/types/src/react/Surface.d.ts.map +1 -0
  121. package/dist/types/src/react/index.d.ts +5 -0
  122. package/dist/types/src/react/index.d.ts.map +1 -0
  123. package/dist/types/src/react/useCapabilities.d.ts +13 -0
  124. package/dist/types/src/react/useCapabilities.d.ts.map +1 -0
  125. package/dist/types/src/testing/index.d.ts +2 -0
  126. package/dist/types/src/testing/index.d.ts.map +1 -0
  127. package/dist/types/src/testing/withPluginManager.d.ts +10 -0
  128. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -0
  129. package/dist/types/src/testing/withPluginManager.stories.d.ts +5 -0
  130. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -0
  131. package/dist/types/tsconfig.tsbuildinfo +1 -0
  132. package/package.json +30 -14
  133. package/project.json +2 -1
  134. package/src/App.tsx +138 -34
  135. package/src/common/capabilities.ts +82 -0
  136. package/src/common/events.ts +63 -0
  137. package/src/common/file.ts +22 -0
  138. package/src/common/graph.ts +30 -0
  139. package/src/{plugins/common → common}/index.ts +3 -1
  140. package/src/common/layout.ts +157 -0
  141. package/src/{plugins/common → common}/navigation.ts +59 -45
  142. package/src/common/surface.ts +81 -0
  143. package/src/common/translations.ts +18 -0
  144. package/src/core/capabilities.test.ts +116 -0
  145. package/src/core/capabilities.ts +213 -0
  146. package/src/core/events.ts +58 -0
  147. package/src/core/index.ts +8 -0
  148. package/src/core/manager.test.ts +567 -0
  149. package/src/core/manager.ts +497 -0
  150. package/src/core/plugin.ts +128 -0
  151. package/src/helpers.test.ts +97 -0
  152. package/src/helpers.ts +45 -0
  153. package/src/index.ts +6 -3
  154. package/src/playground/debug/Debug.tsx +39 -0
  155. package/src/playground/debug/index.ts +5 -0
  156. package/src/playground/debug/plugin.ts +17 -0
  157. package/src/playground/generator/Main.tsx +71 -0
  158. package/src/playground/generator/Toolbar.tsx +46 -0
  159. package/src/playground/generator/generator.ts +23 -0
  160. package/src/playground/generator/index.ts +6 -0
  161. package/src/playground/generator/plugin.ts +18 -0
  162. package/src/playground/layout/Layout.tsx +33 -0
  163. package/src/playground/layout/index.ts +5 -0
  164. package/src/playground/layout/plugin.ts +17 -0
  165. package/src/playground/logger/Toolbar.tsx +28 -0
  166. package/src/playground/logger/index.ts +5 -0
  167. package/src/playground/logger/plugin.ts +33 -0
  168. package/src/playground/logger/schema.ts +12 -0
  169. package/src/playground/playground.stories.tsx +34 -0
  170. package/src/plugin-intent/IntentContext.tsx +34 -0
  171. package/src/plugin-intent/IntentPlugin.tsx +60 -0
  172. package/src/plugin-intent/actions.ts +22 -0
  173. package/src/plugin-intent/errors.ts +39 -0
  174. package/src/plugin-intent/index.ts +9 -0
  175. package/src/plugin-intent/intent-dispatcher.test.ts +280 -0
  176. package/src/plugin-intent/intent-dispatcher.ts +269 -0
  177. package/src/plugin-intent/intent.ts +146 -0
  178. package/src/plugin-settings/SettingsPlugin.ts +29 -0
  179. package/src/plugin-settings/actions.ts +17 -0
  180. package/src/plugin-settings/index.ts +6 -0
  181. package/src/react/PluginManagerProvider.ts +22 -0
  182. package/src/react/Surface.tsx +72 -0
  183. package/src/react/index.ts +8 -0
  184. package/src/react/useCapabilities.ts +40 -0
  185. package/src/testing/index.ts +5 -0
  186. package/src/testing/withPluginManager.stories.tsx +47 -0
  187. package/src/testing/withPluginManager.tsx +67 -0
  188. package/tsconfig.json +51 -2
  189. package/dist/lib/browser/chunk-3E7RY3CE.mjs +0 -72
  190. package/dist/lib/browser/chunk-3E7RY3CE.mjs.map +0 -7
  191. package/dist/lib/browser/chunk-653Y45CL.mjs +0 -41
  192. package/dist/lib/browser/chunk-653Y45CL.mjs.map +0 -7
  193. package/dist/lib/browser/chunk-FRXJ25VI.mjs +0 -214
  194. package/dist/lib/browser/chunk-FRXJ25VI.mjs.map +0 -7
  195. package/dist/lib/browser/chunk-YXM35XRE.mjs +0 -213
  196. package/dist/lib/browser/chunk-YXM35XRE.mjs.map +0 -7
  197. package/dist/lib/browser/plugin-intent-LU4KL2RO.mjs +0 -22
  198. package/dist/lib/browser/plugin-intent-LU4KL2RO.mjs.map +0 -7
  199. package/dist/lib/browser/plugin-settings-OM3G2QFY.mjs +0 -11
  200. package/dist/lib/browser/plugin-settings-OM3G2QFY.mjs.map +0 -7
  201. package/dist/lib/browser/plugin-surface-LECZMKSQ.mjs +0 -24
  202. package/dist/lib/browser/plugin-surface-LECZMKSQ.mjs.map +0 -7
  203. package/dist/lib/node/chunk-JZ2JVKRY.cjs +0 -58
  204. package/dist/lib/node/chunk-JZ2JVKRY.cjs.map +0 -7
  205. package/dist/lib/node/chunk-QBM42OQ6.cjs +0 -97
  206. package/dist/lib/node/chunk-QBM42OQ6.cjs.map +0 -7
  207. package/dist/lib/node/chunk-QSVP5HOW.cjs +0 -238
  208. package/dist/lib/node/chunk-QSVP5HOW.cjs.map +0 -7
  209. package/dist/lib/node/chunk-SOVLKUWI.cjs +0 -236
  210. package/dist/lib/node/chunk-SOVLKUWI.cjs.map +0 -7
  211. package/dist/lib/node/plugin-intent-FVFR2LKB.cjs +0 -43
  212. package/dist/lib/node/plugin-intent-FVFR2LKB.cjs.map +0 -7
  213. package/dist/lib/node/plugin-settings-OZ6IKAE5.cjs +0 -32
  214. package/dist/lib/node/plugin-settings-OZ6IKAE5.cjs.map +0 -7
  215. package/dist/lib/node/plugin-surface-YWDRXQTD.cjs +0 -45
  216. package/dist/lib/node/plugin-surface-YWDRXQTD.cjs.map +0 -7
  217. package/dist/lib/node-esm/chunk-2R4GVK7O.mjs +0 -215
  218. package/dist/lib/node-esm/chunk-2R4GVK7O.mjs.map +0 -7
  219. package/dist/lib/node-esm/chunk-EYCTSFEJ.mjs +0 -74
  220. package/dist/lib/node-esm/chunk-EYCTSFEJ.mjs.map +0 -7
  221. package/dist/lib/node-esm/chunk-YFMFQBB4.mjs +0 -214
  222. package/dist/lib/node-esm/chunk-YFMFQBB4.mjs.map +0 -7
  223. package/dist/lib/node-esm/chunk-YNU7FTGJ.mjs +0 -43
  224. package/dist/lib/node-esm/chunk-YNU7FTGJ.mjs.map +0 -7
  225. package/dist/lib/node-esm/plugin-intent-V7ER24Y6.mjs +0 -23
  226. package/dist/lib/node-esm/plugin-intent-V7ER24Y6.mjs.map +0 -7
  227. package/dist/lib/node-esm/plugin-settings-37UVWF2V.mjs +0 -12
  228. package/dist/lib/node-esm/plugin-settings-37UVWF2V.mjs.map +0 -7
  229. package/dist/lib/node-esm/plugin-surface-TEU42XQN.mjs +0 -25
  230. package/dist/lib/node-esm/plugin-surface-TEU42XQN.mjs.map +0 -7
  231. package/dist/types/src/plugins/common/file.d.ts +0 -22
  232. package/dist/types/src/plugins/common/file.d.ts.map +0 -1
  233. package/dist/types/src/plugins/common/graph.d.ts +0 -51
  234. package/dist/types/src/plugins/common/graph.d.ts.map +0 -1
  235. package/dist/types/src/plugins/common/index.d.ts.map +0 -1
  236. package/dist/types/src/plugins/common/layout.d.ts +0 -202
  237. package/dist/types/src/plugins/common/layout.d.ts.map +0 -1
  238. package/dist/types/src/plugins/common/metadata.d.ts +0 -16
  239. package/dist/types/src/plugins/common/metadata.d.ts.map +0 -1
  240. package/dist/types/src/plugins/common/navigation.d.ts.map +0 -1
  241. package/dist/types/src/plugins/common/translations.d.ts.map +0 -1
  242. package/dist/types/src/plugins/helpers.d.ts +0 -41
  243. package/dist/types/src/plugins/helpers.d.ts.map +0 -1
  244. package/dist/types/src/plugins/index.d.ts +0 -7
  245. package/dist/types/src/plugins/index.d.ts.map +0 -1
  246. package/dist/types/src/plugins/plugin-host/HostPlugin.d.ts +0 -21
  247. package/dist/types/src/plugins/plugin-host/HostPlugin.d.ts.map +0 -1
  248. package/dist/types/src/plugins/plugin-host/PluginContainer.d.ts +0 -14
  249. package/dist/types/src/plugins/plugin-host/PluginContainer.d.ts.map +0 -1
  250. package/dist/types/src/plugins/plugin-host/PluginContext.d.ts +0 -47
  251. package/dist/types/src/plugins/plugin-host/PluginContext.d.ts.map +0 -1
  252. package/dist/types/src/plugins/plugin-host/index.d.ts +0 -4
  253. package/dist/types/src/plugins/plugin-host/index.d.ts.map +0 -1
  254. package/dist/types/src/plugins/plugin-host/plugin.d.ts +0 -98
  255. package/dist/types/src/plugins/plugin-host/plugin.d.ts.map +0 -1
  256. package/dist/types/src/plugins/plugin-host/plugin.test.d.ts +0 -35
  257. package/dist/types/src/plugins/plugin-host/plugin.test.d.ts.map +0 -1
  258. package/dist/types/src/plugins/plugin-intent/IntentContext.d.ts +0 -21
  259. package/dist/types/src/plugins/plugin-intent/IntentContext.d.ts.map +0 -1
  260. package/dist/types/src/plugins/plugin-intent/IntentPlugin.d.ts +0 -8
  261. package/dist/types/src/plugins/plugin-intent/IntentPlugin.d.ts.map +0 -1
  262. package/dist/types/src/plugins/plugin-intent/helpers.d.ts +0 -6
  263. package/dist/types/src/plugins/plugin-intent/helpers.d.ts.map +0 -1
  264. package/dist/types/src/plugins/plugin-intent/index.d.ts +0 -6
  265. package/dist/types/src/plugins/plugin-intent/index.d.ts.map +0 -1
  266. package/dist/types/src/plugins/plugin-intent/intent.d.ts +0 -81
  267. package/dist/types/src/plugins/plugin-intent/intent.d.ts.map +0 -1
  268. package/dist/types/src/plugins/plugin-intent/meta.d.ts +0 -5
  269. package/dist/types/src/plugins/plugin-intent/meta.d.ts.map +0 -1
  270. package/dist/types/src/plugins/plugin-intent/provides.d.ts +0 -20
  271. package/dist/types/src/plugins/plugin-intent/provides.d.ts.map +0 -1
  272. package/dist/types/src/plugins/plugin-settings/SettingsPlugin.d.ts +0 -4
  273. package/dist/types/src/plugins/plugin-settings/SettingsPlugin.d.ts.map +0 -1
  274. package/dist/types/src/plugins/plugin-settings/index.d.ts +0 -4
  275. package/dist/types/src/plugins/plugin-settings/index.d.ts.map +0 -1
  276. package/dist/types/src/plugins/plugin-settings/meta.d.ts +0 -5
  277. package/dist/types/src/plugins/plugin-settings/meta.d.ts.map +0 -1
  278. package/dist/types/src/plugins/plugin-settings/provides.d.ts +0 -13
  279. package/dist/types/src/plugins/plugin-settings/provides.d.ts.map +0 -1
  280. package/dist/types/src/plugins/plugin-surface/ErrorBoundary.d.ts.map +0 -1
  281. package/dist/types/src/plugins/plugin-surface/Surface.d.ts +0 -62
  282. package/dist/types/src/plugins/plugin-surface/Surface.d.ts.map +0 -1
  283. package/dist/types/src/plugins/plugin-surface/SurfacePlugin.d.ts +0 -7
  284. package/dist/types/src/plugins/plugin-surface/SurfacePlugin.d.ts.map +0 -1
  285. package/dist/types/src/plugins/plugin-surface/SurfaceRootContext.d.ts +0 -39
  286. package/dist/types/src/plugins/plugin-surface/SurfaceRootContext.d.ts.map +0 -1
  287. package/dist/types/src/plugins/plugin-surface/helpers.d.ts +0 -21
  288. package/dist/types/src/plugins/plugin-surface/helpers.d.ts.map +0 -1
  289. package/dist/types/src/plugins/plugin-surface/index.d.ts +0 -8
  290. package/dist/types/src/plugins/plugin-surface/index.d.ts.map +0 -1
  291. package/dist/types/src/plugins/plugin-surface/meta.d.ts +0 -5
  292. package/dist/types/src/plugins/plugin-surface/meta.d.ts.map +0 -1
  293. package/dist/types/src/plugins/plugin-surface/provides.d.ts +0 -16
  294. package/dist/types/src/plugins/plugin-surface/provides.d.ts.map +0 -1
  295. package/src/plugins/common/file.ts +0 -36
  296. package/src/plugins/common/graph.ts +0 -70
  297. package/src/plugins/common/layout.ts +0 -155
  298. package/src/plugins/common/metadata.ts +0 -29
  299. package/src/plugins/common/translations.ts +0 -36
  300. package/src/plugins/helpers.ts +0 -92
  301. package/src/plugins/index.ts +0 -11
  302. package/src/plugins/plugin-host/HostPlugin.tsx +0 -96
  303. package/src/plugins/plugin-host/PluginContainer.tsx +0 -120
  304. package/src/plugins/plugin-host/PluginContext.tsx +0 -79
  305. package/src/plugins/plugin-host/index.ts +0 -8
  306. package/src/plugins/plugin-host/plugin.test.ts +0 -158
  307. package/src/plugins/plugin-host/plugin.ts +0 -126
  308. package/src/plugins/plugin-intent/IntentContext.tsx +0 -49
  309. package/src/plugins/plugin-intent/IntentPlugin.tsx +0 -151
  310. package/src/plugins/plugin-intent/helpers.ts +0 -11
  311. package/src/plugins/plugin-intent/index.ts +0 -12
  312. package/src/plugins/plugin-intent/intent.ts +0 -101
  313. package/src/plugins/plugin-intent/meta.ts +0 -9
  314. package/src/plugins/plugin-intent/provides.ts +0 -38
  315. package/src/plugins/plugin-settings/SettingsPlugin.tsx +0 -22
  316. package/src/plugins/plugin-settings/index.ts +0 -9
  317. package/src/plugins/plugin-settings/meta.ts +0 -9
  318. package/src/plugins/plugin-settings/provides.ts +0 -29
  319. package/src/plugins/plugin-surface/Surface.tsx +0 -195
  320. package/src/plugins/plugin-surface/SurfacePlugin.tsx +0 -33
  321. package/src/plugins/plugin-surface/SurfaceRootContext.tsx +0 -60
  322. package/src/plugins/plugin-surface/helpers.ts +0 -22
  323. package/src/plugins/plugin-surface/index.ts +0 -14
  324. package/src/plugins/plugin-surface/meta.ts +0 -9
  325. package/src/plugins/plugin-surface/provides.ts +0 -26
  326. /package/dist/types/src/{plugins/plugin-surface → react}/ErrorBoundary.d.ts +0 -0
  327. /package/src/{plugins/plugin-surface → react}/ErrorBoundary.tsx +0 -0
@@ -0,0 +1,497 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { untracked } from '@preact/signals-core';
6
+ import { Effect, Either, Match } from 'effect';
7
+
8
+ import { Event } from '@dxos/async';
9
+ import { create, type ReactiveObject } from '@dxos/live-object';
10
+ import { log } from '@dxos/log';
11
+ import { type MaybePromise } from '@dxos/util';
12
+
13
+ import { type AnyCapability, PluginsContext } from './capabilities';
14
+ import { type ActivationEvent, eventKey, getEvents, isAllOf } from './events';
15
+ import { type PluginModule, type Plugin } from './plugin';
16
+
17
+ // TODO(wittjosiah): Factor out?
18
+ const isPromise = (value: unknown): value is Promise<unknown> => {
19
+ return value !== null && typeof value === 'object' && 'then' in value;
20
+ };
21
+
22
+ export type PluginManagerOptions = {
23
+ pluginLoader: (id: string) => MaybePromise<Plugin>;
24
+ plugins?: Plugin[];
25
+ core?: string[];
26
+ enabled?: string[];
27
+ };
28
+
29
+ type PluginManagerState = {
30
+ // Plugins
31
+ plugins: Plugin[];
32
+ core: string[];
33
+ enabled: string[];
34
+
35
+ // Modules
36
+ modules: PluginModule[];
37
+ active: string[];
38
+ pendingRemoval: string[];
39
+
40
+ // Events
41
+ eventsFired: string[];
42
+ pendingReset: string[];
43
+ };
44
+
45
+ export class PluginManager {
46
+ readonly activation = new Event<{ event: string; state: 'activating' | 'activated' | 'error'; error?: any }>();
47
+
48
+ readonly context = new PluginsContext({
49
+ activate: (event) => this.activate(event),
50
+ reset: (id) => this.reset(id),
51
+ });
52
+
53
+ private readonly _state: ReactiveObject<PluginManagerState>;
54
+ private readonly _pluginLoader: PluginManagerOptions['pluginLoader'];
55
+ private readonly _capabilities = new Map<string, AnyCapability[]>();
56
+
57
+ constructor({
58
+ pluginLoader,
59
+ plugins = [],
60
+ core = plugins.map(({ meta }) => meta.id),
61
+ enabled = [],
62
+ }: PluginManagerOptions) {
63
+ this._pluginLoader = pluginLoader;
64
+ this._state = create({
65
+ plugins,
66
+ core,
67
+ enabled,
68
+ modules: [],
69
+ active: [],
70
+ pendingRemoval: [],
71
+ pendingReset: [],
72
+ eventsFired: [],
73
+ });
74
+ plugins.forEach((plugin) => this._addPlugin(plugin));
75
+ core.forEach((id) => this.enable(id));
76
+ enabled.forEach((id) => this.enable(id));
77
+ }
78
+
79
+ /**
80
+ * Plugins that are currently registered.
81
+ *
82
+ * @reactive
83
+ */
84
+ get plugins(): ReactiveObject<readonly Plugin[]> {
85
+ return this._state.plugins;
86
+ }
87
+
88
+ /**
89
+ * Ids of plugins that are core and cannot be removed.
90
+ *
91
+ * @reactive
92
+ */
93
+ get core(): ReactiveObject<readonly string[]> {
94
+ return this._state.core;
95
+ }
96
+
97
+ /**
98
+ * Ids of plugins that are currently enabled.
99
+ *
100
+ * @reactive
101
+ */
102
+ get enabled(): ReactiveObject<readonly string[]> {
103
+ return this._state.enabled;
104
+ }
105
+
106
+ /**
107
+ * Modules of plugins which are currently enabled.
108
+ *
109
+ * @reactive
110
+ */
111
+ get modules(): ReactiveObject<readonly PluginModule[]> {
112
+ return this._state.modules;
113
+ }
114
+
115
+ /**
116
+ * Ids of modules which are currently active.
117
+ *
118
+ * @reactive
119
+ */
120
+ get active(): ReactiveObject<readonly string[]> {
121
+ return this._state.active;
122
+ }
123
+
124
+ /**
125
+ * Ids of modules which are pending removal.
126
+ *
127
+ * @reactive
128
+ */
129
+ get pendingRemoval(): ReactiveObject<readonly string[]> {
130
+ return this._state.pendingRemoval;
131
+ }
132
+
133
+ /**
134
+ * Ids of events which have been fired.
135
+ *
136
+ * @reactive
137
+ */
138
+ get eventsFired(): ReactiveObject<readonly string[]> {
139
+ return this._state.eventsFired;
140
+ }
141
+
142
+ /**
143
+ * Ids of modules which are pending reset.
144
+ *
145
+ * @reactive
146
+ */
147
+ get pendingReset(): ReactiveObject<readonly string[]> {
148
+ return this._state.pendingReset;
149
+ }
150
+
151
+ /**
152
+ * Adds a plugin to the manager via the plugin loader.
153
+ * @param id The id of the plugin.
154
+ */
155
+ async add(id: string): Promise<boolean> {
156
+ return untracked(async () => {
157
+ log('add plugin', { id });
158
+ const plugin = await this._pluginLoader(id);
159
+ this._addPlugin(plugin);
160
+ return this.enable(id);
161
+ });
162
+ }
163
+
164
+ /**
165
+ * Enables a plugin.
166
+ * @param id The id of the plugin.
167
+ */
168
+ enable(id: string): boolean {
169
+ return untracked(() => {
170
+ log('enable plugin', { id });
171
+ const plugin = this._getPlugin(id);
172
+ if (!plugin) {
173
+ return false;
174
+ }
175
+
176
+ if (!this._state.enabled.includes(id)) {
177
+ this._state.enabled.push(id);
178
+ }
179
+
180
+ plugin.modules.forEach((module) => {
181
+ this._addModule(module);
182
+ this._setPendingResetByModule(module);
183
+ });
184
+ return true;
185
+ });
186
+ }
187
+
188
+ /**
189
+ * Removes a plugin from the manager.
190
+ * @param id The id of the plugin.
191
+ */
192
+ remove(id: string): boolean {
193
+ return untracked(() => {
194
+ log('remove plugin', { id });
195
+ const result = this.disable(id);
196
+ if (!result) {
197
+ return false;
198
+ }
199
+
200
+ this._removePlugin(id);
201
+ return true;
202
+ });
203
+ }
204
+
205
+ /**
206
+ * Disables a plugin.
207
+ * @param id The id of the plugin.
208
+ */
209
+ disable(id: string): boolean {
210
+ return untracked(() => {
211
+ log('disable plugin', { id });
212
+ if (this._state.core.includes(id)) {
213
+ return false;
214
+ }
215
+
216
+ const plugin = this._getPlugin(id);
217
+ if (!plugin) {
218
+ return false;
219
+ }
220
+
221
+ const enabledIndex = this._state.enabled.findIndex((enabled) => enabled === id);
222
+ if (enabledIndex !== -1) {
223
+ this._state.enabled.splice(enabledIndex, 1);
224
+
225
+ plugin.modules.forEach((module) => {
226
+ if (this._state.active.includes(module.id)) {
227
+ this._setPendingResetByModule(module);
228
+ if (!this._state.pendingRemoval.includes(module.id)) {
229
+ this._state.pendingRemoval.push(module.id);
230
+ }
231
+ } else {
232
+ this._removeModule(module.id);
233
+ }
234
+ });
235
+ }
236
+
237
+ return true;
238
+ });
239
+ }
240
+
241
+ /**
242
+ * Activates plugins based on the activation event.
243
+ * @param event The activation event.
244
+ * @returns Whether the activation was successful.
245
+ */
246
+ activate(event: ActivationEvent | string): Promise<boolean> {
247
+ return untracked(() => Effect.runPromise(this._activate(event)));
248
+ }
249
+
250
+ /**
251
+ * Deactivates all of the modules for a plugin.
252
+ * @param id The id of the plugin.
253
+ * @returns Whether the deactivation was successful.
254
+ */
255
+ deactivate(id: string): Promise<boolean> {
256
+ return untracked(() => Effect.runPromise(this._deactivate(id)));
257
+ }
258
+
259
+ /**
260
+ * Re-activates the modules that were activated by the event.
261
+ * @param event The activation event.
262
+ * @returns Whether the reset was successful.
263
+ */
264
+ reset(event: ActivationEvent | string): Promise<boolean> {
265
+ return untracked(() => Effect.runPromise(this._reset(event)));
266
+ }
267
+
268
+ private _addPlugin(plugin: Plugin) {
269
+ untracked(() => {
270
+ log('add plugin', { id: plugin.meta.id });
271
+ if (!this._state.plugins.includes(plugin)) {
272
+ this._state.plugins.push(plugin);
273
+ }
274
+ });
275
+ }
276
+
277
+ private _removePlugin(id: string) {
278
+ untracked(() => {
279
+ log('remove plugin', { id });
280
+ const pluginIndex = this._state.plugins.findIndex((plugin) => plugin.meta.id === id);
281
+ if (pluginIndex !== -1) {
282
+ this._state.plugins.splice(pluginIndex, 1);
283
+ }
284
+ });
285
+ }
286
+
287
+ private _addModule(module: PluginModule) {
288
+ untracked(() => {
289
+ log('add module', { id: module.id });
290
+ if (!this._state.modules.includes(module)) {
291
+ this._state.modules.push(module);
292
+ }
293
+ });
294
+ }
295
+
296
+ private _removeModule(id: string) {
297
+ untracked(() => {
298
+ log('remove module', { id });
299
+ const moduleIndex = this._state.modules.findIndex((module) => module.id === id);
300
+ if (moduleIndex !== -1) {
301
+ this._state.modules.splice(moduleIndex, 1);
302
+ }
303
+ });
304
+ }
305
+
306
+ private _getPlugin(id: string) {
307
+ return this._state.plugins.find((plugin) => plugin.meta.id === id);
308
+ }
309
+
310
+ private _getActiveModules() {
311
+ return this._state.modules.filter((module) => this._state.active.includes(module.id));
312
+ }
313
+
314
+ private _getInactiveModules() {
315
+ return this._state.modules.filter((module) => !this._state.active.includes(module.id));
316
+ }
317
+
318
+ private _getActiveModulesByEvent(key: string) {
319
+ return this._getActiveModules().filter((module) => getEvents(module.activatesOn).map(eventKey).includes(key));
320
+ }
321
+
322
+ private _getInactiveModulesByEvent(key: string) {
323
+ return this._getInactiveModules().filter((module) => getEvents(module.activatesOn).map(eventKey).includes(key));
324
+ }
325
+
326
+ private _setPendingResetByModule(module: PluginModule) {
327
+ return untracked(() => {
328
+ const activationEvents = getEvents(module.activatesOn)
329
+ .map(eventKey)
330
+ .filter((key) => this._state.eventsFired.includes(key));
331
+ const parentEvents = activationEvents.flatMap((event) => {
332
+ const modules = this._getActiveModules().filter((module) =>
333
+ module.activatesBefore?.map(eventKey).includes(event),
334
+ );
335
+ return modules.flatMap((module) => getEvents(module.activatesOn)).map(eventKey);
336
+ });
337
+
338
+ const pendingReset = Array.from(new Set([...activationEvents, ...parentEvents])).filter(
339
+ (event) => !this._state.pendingReset.includes(event),
340
+ );
341
+ if (pendingReset.length > 0) {
342
+ log('pending reset', { events: pendingReset });
343
+ this._state.pendingReset.push(...pendingReset);
344
+ }
345
+ });
346
+ }
347
+
348
+ // TODO(wittjosiah): Improve error typing.
349
+ private _activate(event: ActivationEvent | string): Effect.Effect<boolean, Error> {
350
+ const self = this;
351
+ return Effect.gen(function* () {
352
+ const key = typeof event === 'string' ? event : eventKey(event);
353
+ log('activating', { key });
354
+ const pendingIndex = self._state.pendingReset.findIndex((event) => event === key);
355
+ if (pendingIndex !== -1) {
356
+ self._state.pendingReset.splice(pendingIndex, 1);
357
+ }
358
+
359
+ const modules = self._getInactiveModulesByEvent(key);
360
+ if (modules.length === 0) {
361
+ log('no modules to activate', { key });
362
+ return false;
363
+ }
364
+
365
+ self.activation.emit({ event: key, state: 'activating' });
366
+
367
+ for (const module of modules) {
368
+ if (
369
+ isAllOf(module.activatesOn) &&
370
+ !module.activatesOn.events
371
+ .filter((event) => eventKey(event) !== key)
372
+ .every((event) => self._state.eventsFired.includes(eventKey(event)))
373
+ ) {
374
+ continue;
375
+ }
376
+
377
+ yield* Effect.all(module.activatesBefore?.map((event) => self._activate(event)) ?? []);
378
+
379
+ const result = yield* self._activateModule(module).pipe(Effect.either);
380
+ if (Either.isLeft(result)) {
381
+ self.activation.emit({ event: key, state: 'error', error: result.left });
382
+ yield* Effect.fail(result.left);
383
+ }
384
+
385
+ yield* Effect.all(module.activatesAfter?.map((event) => self._activate(event)) ?? []);
386
+ }
387
+
388
+ if (!self._state.eventsFired.includes(key)) {
389
+ self._state.eventsFired.push(key);
390
+ }
391
+
392
+ self.activation.emit({ event: key, state: 'activated' });
393
+ log('activated', { key });
394
+
395
+ return true;
396
+ });
397
+ }
398
+
399
+ private _activateModule(module: PluginModule): Effect.Effect<void, Error> {
400
+ const self = this;
401
+ return Effect.gen(function* () {
402
+ // TODO(wittjosiah): This is not handling errors thrown if this is synchronous.
403
+ const program = module.activate(self.context);
404
+ const maybeCapabilities = yield* Match.value(program).pipe(
405
+ Match.when(Effect.isEffect, (effect) => effect),
406
+ Match.when(isPromise, (promise) =>
407
+ Effect.tryPromise({
408
+ try: () => promise,
409
+ catch: (error) => error as Error,
410
+ }),
411
+ ),
412
+ Match.orElse((program) => Effect.succeed(program)),
413
+ );
414
+ const capabilities = Match.value(maybeCapabilities).pipe(
415
+ Match.when(Array.isArray, (array) => array),
416
+ Match.orElse((value) => [value]),
417
+ );
418
+ capabilities.forEach((capability) => {
419
+ self.context.contributeCapability({ module: module.id, ...capability });
420
+ });
421
+ self._state.active.push(module.id);
422
+ self._capabilities.set(module.id, capabilities);
423
+ });
424
+ }
425
+
426
+ private _deactivate(id: string): Effect.Effect<boolean, Error> {
427
+ const self = this;
428
+ return Effect.gen(function* () {
429
+ const plugin = self._getPlugin(id);
430
+ if (!plugin) {
431
+ return false;
432
+ }
433
+
434
+ const modules = plugin.modules;
435
+ const results = yield* Effect.all(modules.map((module) => self._deactivateModule(module)));
436
+ return results.every((result) => result);
437
+ });
438
+ }
439
+
440
+ private _deactivateModule(module: PluginModule): Effect.Effect<boolean, Error> {
441
+ const self = this;
442
+ return Effect.gen(function* () {
443
+ const id = module.id;
444
+ log('deactivating', { id });
445
+
446
+ const capabilities = self._capabilities.get(id);
447
+ if (capabilities) {
448
+ for (const capability of capabilities) {
449
+ self.context.removeCapability(capability.interface, capability.implementation);
450
+ const program = capability.deactivate?.();
451
+ yield* Match.value(program).pipe(
452
+ Match.when(Effect.isEffect, (effect) => effect),
453
+ Match.when(isPromise, (promise) =>
454
+ Effect.tryPromise({
455
+ try: () => promise,
456
+ catch: (error) => error as Error,
457
+ }),
458
+ ),
459
+ Match.orElse((program) => Effect.succeed(program)),
460
+ );
461
+ }
462
+ self._capabilities.delete(id);
463
+ }
464
+
465
+ const activeIndex = self._state.active.findIndex((event) => event === id);
466
+ if (activeIndex !== -1) {
467
+ self._state.active.splice(activeIndex, 1);
468
+ }
469
+
470
+ log('deactivated', { id });
471
+ return true;
472
+ });
473
+ }
474
+
475
+ private _reset(event: ActivationEvent | string): Effect.Effect<boolean, Error> {
476
+ const self = this;
477
+ return Effect.gen(function* () {
478
+ const key = typeof event === 'string' ? event : eventKey(event);
479
+ log('reset', { key });
480
+ const modules = self._getActiveModulesByEvent(key);
481
+ const results = yield* Effect.all(modules.map((module) => self._deactivateModule(module)));
482
+
483
+ if (self._state.pendingRemoval.length > 0) {
484
+ self._state.pendingRemoval.forEach((id) => {
485
+ self._removeModule(id);
486
+ });
487
+ self._state.pendingRemoval.splice(0, self._state.pendingRemoval.length);
488
+ }
489
+
490
+ if (results.every((result) => result)) {
491
+ return yield* self._activate(key);
492
+ } else {
493
+ return false;
494
+ }
495
+ });
496
+ }
497
+ }
@@ -0,0 +1,128 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Effect } from 'effect';
6
+
7
+ import { type MaybePromise } from '@dxos/util';
8
+
9
+ import { type AnyCapability, type PluginsContext } from './capabilities';
10
+ import { type ActivationEvent, type ActivationEvents } from './events';
11
+
12
+ interface PluginModuleInterface {
13
+ /**
14
+ * Unique id of the module.
15
+ */
16
+ id: string;
17
+
18
+ /**
19
+ * Events for which the module will be activated.
20
+ */
21
+ activatesOn: ActivationEvents;
22
+
23
+ /**
24
+ * Events which the plugin depends on being activated.
25
+ * Plugin is marked as needing reset a plugin activated by a dependent event is removed.
26
+ * Events are automatically activated before activation of the plugin.
27
+ */
28
+ activatesBefore?: ActivationEvent[];
29
+
30
+ /**
31
+ * Events which this plugin triggers upon activation.
32
+ */
33
+ activatesAfter?: ActivationEvent[];
34
+
35
+ /**
36
+ * Called when the module is activated.
37
+ * @param context The plugin context.
38
+ * @returns The capabilities of the module.
39
+ */
40
+ activate: (
41
+ context: PluginsContext,
42
+ ) => MaybePromise<AnyCapability | AnyCapability[]> | Effect.Effect<AnyCapability | AnyCapability[], Error>;
43
+ }
44
+
45
+ /**
46
+ * A unit of containment of modular functionality that can be provided to an application.
47
+ * Plugins provide things like components, state, actions, etc. to the application.
48
+ */
49
+ // NOTE: This is implemented as a class to prevent it from being proxied by PluginManager state.
50
+ export class PluginModule implements PluginModuleInterface {
51
+ readonly id: PluginModuleInterface['id'];
52
+ readonly activatesOn: PluginModuleInterface['activatesOn'];
53
+ readonly activatesBefore?: PluginModuleInterface['activatesBefore'];
54
+ readonly activatesAfter?: PluginModuleInterface['activatesAfter'];
55
+ readonly activate: PluginModuleInterface['activate'];
56
+
57
+ constructor(options: PluginModuleInterface) {
58
+ this.id = options.id;
59
+ this.activatesOn = options.activatesOn;
60
+ this.activatesBefore = options.activatesBefore;
61
+ this.activatesAfter = options.activatesAfter;
62
+ this.activate = options.activate;
63
+ }
64
+ }
65
+
66
+ /**
67
+ * Helper to define a module.
68
+ */
69
+ export const defineModule = (options: PluginModuleInterface) => new PluginModule(options);
70
+
71
+ export type PluginMeta = {
72
+ /**
73
+ * Globally unique ID.
74
+ *
75
+ * Expected to be in the form of a valid URL.
76
+ *
77
+ * @example dxos.org/plugin/example
78
+ */
79
+ id: string;
80
+
81
+ /**
82
+ * Human-readable name.
83
+ */
84
+ name?: string;
85
+
86
+ /**
87
+ * Short description of plugin functionality.
88
+ */
89
+ description?: string;
90
+
91
+ /**
92
+ * URL of home page.
93
+ */
94
+ homePage?: string;
95
+
96
+ /**
97
+ * URL of source code.
98
+ */
99
+ source?: string;
100
+
101
+ /**
102
+ * Tags to help categorize the plugin.
103
+ */
104
+ tags?: string[];
105
+
106
+ /**
107
+ * A grep-able symbol string which can be resolved to an icon asset by @ch-ui/icons, via @ch-ui/vite-plugin-icons.
108
+ */
109
+ icon?: string;
110
+ };
111
+
112
+ /**
113
+ * A collection of modules that are be enabled/disabled as a unit.
114
+ */
115
+ // NOTE: This is implemented as a class to prevent it from being proxied by PluginManager state.
116
+ export class Plugin {
117
+ constructor(
118
+ readonly meta: PluginMeta,
119
+ readonly modules: PluginModule[],
120
+ ) {}
121
+ }
122
+
123
+ /**
124
+ * Helper to define a plugin.
125
+ */
126
+ export const definePlugin = (meta: PluginMeta, modules: PluginModule[]) => {
127
+ return new Plugin(meta, modules);
128
+ };