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

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 (594) hide show
  1. package/.storybook/main.mts +11 -0
  2. package/.storybook/preview.mts +8 -0
  3. package/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
  4. package/dist/lib/browser/app-graph-builder-M2VPYQC6.mjs +149 -0
  5. package/dist/lib/browser/app-graph-builder-M2VPYQC6.mjs.map +7 -0
  6. package/dist/lib/browser/capability-7PCNSWBT.mjs +33 -0
  7. package/dist/lib/browser/capability-7PCNSWBT.mjs.map +7 -0
  8. package/dist/lib/browser/capability-KP3PFEXD.mjs +31 -0
  9. package/dist/lib/browser/capability-KP3PFEXD.mjs.map +7 -0
  10. package/dist/lib/browser/chunk-6Y7PZV72.mjs +77 -0
  11. package/dist/lib/browser/chunk-6Y7PZV72.mjs.map +7 -0
  12. package/dist/lib/browser/chunk-7IQHKD4U.mjs +170 -0
  13. package/dist/lib/browser/chunk-7IQHKD4U.mjs.map +7 -0
  14. package/dist/lib/browser/chunk-BLQJSGL3.mjs +732 -0
  15. package/dist/lib/browser/chunk-BLQJSGL3.mjs.map +7 -0
  16. package/dist/lib/browser/chunk-FHQTHCX7.mjs +8 -0
  17. package/dist/lib/browser/chunk-FHQTHCX7.mjs.map +7 -0
  18. package/dist/lib/browser/chunk-FMZN33N4.mjs +807 -0
  19. package/dist/lib/browser/chunk-FMZN33N4.mjs.map +7 -0
  20. package/dist/lib/browser/chunk-H4WPA7U7.mjs +77 -0
  21. package/dist/lib/browser/chunk-H4WPA7U7.mjs.map +7 -0
  22. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  23. package/dist/lib/browser/chunk-PKQT6C53.mjs +47 -0
  24. package/dist/lib/browser/chunk-PKQT6C53.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-TCLLRCS3.mjs +145 -0
  26. package/dist/lib/browser/chunk-TCLLRCS3.mjs.map +7 -0
  27. package/dist/lib/browser/chunk-XYNO72GQ.mjs +746 -0
  28. package/dist/lib/browser/chunk-XYNO72GQ.mjs.map +7 -0
  29. package/dist/lib/browser/common/index.mjs +38 -0
  30. package/dist/lib/browser/core/activation-event.mjs +20 -0
  31. package/dist/lib/browser/core/capability.mjs +28 -0
  32. package/dist/lib/browser/core/plugin-manager.mjs +15 -0
  33. package/dist/lib/browser/core/plugin-manager.mjs.map +7 -0
  34. package/dist/lib/browser/core/plugin.mjs +27 -0
  35. package/dist/lib/browser/core/plugin.mjs.map +7 -0
  36. package/dist/lib/browser/index.mjs +165 -139
  37. package/dist/lib/browser/index.mjs.map +4 -4
  38. package/dist/lib/browser/invoker-capability-SZRSTHEH.mjs +32 -0
  39. package/dist/lib/browser/invoker-capability-SZRSTHEH.mjs.map +7 -0
  40. package/dist/lib/browser/meta.json +1 -1
  41. package/dist/lib/browser/operation-resolver-6MP2MYOY.mjs +64 -0
  42. package/dist/lib/browser/operation-resolver-6MP2MYOY.mjs.map +7 -0
  43. package/dist/lib/browser/react/index.mjs +46 -0
  44. package/dist/lib/browser/react/index.mjs.map +7 -0
  45. package/dist/lib/browser/testing/index.mjs +79 -37
  46. package/dist/lib/browser/testing/index.mjs.map +4 -4
  47. package/dist/lib/node-esm/app-graph-builder-LROHGJEM.mjs +150 -0
  48. package/dist/lib/node-esm/app-graph-builder-LROHGJEM.mjs.map +7 -0
  49. package/dist/lib/node-esm/capability-CFLQ2QQU.mjs +34 -0
  50. package/dist/lib/node-esm/capability-CFLQ2QQU.mjs.map +7 -0
  51. package/dist/lib/node-esm/capability-RCUNM2M7.mjs +32 -0
  52. package/dist/lib/node-esm/capability-RCUNM2M7.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-663A54LQ.mjs +171 -0
  54. package/dist/lib/node-esm/chunk-663A54LQ.mjs.map +7 -0
  55. package/dist/lib/node-esm/chunk-6WXBT3EC.mjs +747 -0
  56. package/dist/lib/node-esm/chunk-6WXBT3EC.mjs.map +7 -0
  57. package/dist/lib/node-esm/chunk-7OWSHPYK.mjs +48 -0
  58. package/dist/lib/node-esm/chunk-7OWSHPYK.mjs.map +7 -0
  59. package/dist/lib/node-esm/chunk-GQEBIGKD.mjs +733 -0
  60. package/dist/lib/node-esm/chunk-GQEBIGKD.mjs.map +7 -0
  61. package/dist/lib/node-esm/chunk-GT6OKM5I.mjs +146 -0
  62. package/dist/lib/node-esm/chunk-GT6OKM5I.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  64. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  65. package/dist/lib/node-esm/chunk-STMXUEPO.mjs +78 -0
  66. package/dist/lib/node-esm/chunk-STMXUEPO.mjs.map +7 -0
  67. package/dist/lib/node-esm/chunk-UEWJDI2L.mjs +10 -0
  68. package/dist/lib/node-esm/chunk-UEWJDI2L.mjs.map +7 -0
  69. package/dist/lib/node-esm/chunk-XR6NMKEP.mjs +78 -0
  70. package/dist/lib/node-esm/chunk-XR6NMKEP.mjs.map +7 -0
  71. package/dist/lib/node-esm/chunk-XYQTBFPA.mjs +808 -0
  72. package/dist/lib/node-esm/chunk-XYQTBFPA.mjs.map +7 -0
  73. package/dist/lib/node-esm/common/index.mjs +39 -0
  74. package/dist/lib/node-esm/common/index.mjs.map +7 -0
  75. package/dist/lib/node-esm/core/activation-event.mjs +21 -0
  76. package/dist/lib/node-esm/core/activation-event.mjs.map +7 -0
  77. package/dist/lib/node-esm/core/capability.mjs +29 -0
  78. package/dist/lib/node-esm/core/capability.mjs.map +7 -0
  79. package/dist/lib/node-esm/core/plugin-manager.mjs +16 -0
  80. package/dist/lib/node-esm/core/plugin-manager.mjs.map +7 -0
  81. package/dist/lib/node-esm/core/plugin.mjs +28 -0
  82. package/dist/lib/node-esm/core/plugin.mjs.map +7 -0
  83. package/dist/lib/node-esm/index.mjs +165 -139
  84. package/dist/lib/node-esm/index.mjs.map +4 -4
  85. package/dist/lib/node-esm/invoker-capability-PNMA5JOS.mjs +33 -0
  86. package/dist/lib/node-esm/invoker-capability-PNMA5JOS.mjs.map +7 -0
  87. package/dist/lib/node-esm/meta.json +1 -1
  88. package/dist/lib/node-esm/operation-resolver-7YWDMTNU.mjs +65 -0
  89. package/dist/lib/node-esm/operation-resolver-7YWDMTNU.mjs.map +7 -0
  90. package/dist/lib/node-esm/react/index.mjs +47 -0
  91. package/dist/lib/node-esm/react/index.mjs.map +7 -0
  92. package/dist/lib/node-esm/testing/index.mjs +79 -37
  93. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  94. package/dist/types/src/cli.d.ts +39 -0
  95. package/dist/types/src/cli.d.ts.map +1 -0
  96. package/dist/types/src/common/activation-event.d.ts +66 -0
  97. package/dist/types/src/common/activation-event.d.ts.map +1 -0
  98. package/dist/types/src/common/capability.d.ts +265 -0
  99. package/dist/types/src/common/capability.d.ts.map +1 -0
  100. package/dist/types/src/common/collaboration.d.ts +24 -17
  101. package/dist/types/src/common/collaboration.d.ts.map +1 -1
  102. package/dist/types/src/common/file.d.ts +1 -1
  103. package/dist/types/src/common/file.d.ts.map +1 -1
  104. package/dist/types/src/common/graph.d.ts +2 -2
  105. package/dist/types/src/common/graph.d.ts.map +1 -1
  106. package/dist/types/src/common/index.d.ts +4 -3
  107. package/dist/types/src/common/index.d.ts.map +1 -1
  108. package/dist/types/src/common/operations.d.ts +380 -0
  109. package/dist/types/src/common/operations.d.ts.map +1 -0
  110. package/dist/types/src/common/plugin.d.ts +201 -0
  111. package/dist/types/src/common/plugin.d.ts.map +1 -0
  112. package/dist/types/src/common/surface.d.ts +50 -21
  113. package/dist/types/src/common/surface.d.ts.map +1 -1
  114. package/dist/types/src/common/translations.d.ts +10 -1
  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 +5 -4
  135. package/dist/types/src/index.d.ts.map +1 -1
  136. package/dist/types/src/playground/debug/Debug.d.ts +4 -2
  137. package/dist/types/src/playground/debug/Debug.d.ts.map +1 -1
  138. package/dist/types/src/playground/debug/plugin.d.ts +2 -1
  139. package/dist/types/src/playground/debug/plugin.d.ts.map +1 -1
  140. package/dist/types/src/playground/generator/Main.d.ts +4 -2
  141. package/dist/types/src/playground/generator/Main.d.ts.map +1 -1
  142. package/dist/types/src/playground/generator/Toolbar.d.ts +4 -2
  143. package/dist/types/src/playground/generator/Toolbar.d.ts.map +1 -1
  144. package/dist/types/src/playground/generator/generator.d.ts +17 -5
  145. package/dist/types/src/playground/generator/generator.d.ts.map +1 -1
  146. package/dist/types/src/playground/generator/plugin.d.ts +2 -1
  147. package/dist/types/src/playground/generator/plugin.d.ts.map +1 -1
  148. package/dist/types/src/playground/layout/Layout.d.ts +4 -2
  149. package/dist/types/src/playground/layout/Layout.d.ts.map +1 -1
  150. package/dist/types/src/playground/layout/plugin.d.ts +2 -1
  151. package/dist/types/src/playground/layout/plugin.d.ts.map +1 -1
  152. package/dist/types/src/playground/logger/Toolbar.d.ts +4 -2
  153. package/dist/types/src/playground/logger/Toolbar.d.ts.map +1 -1
  154. package/dist/types/src/playground/logger/plugin.d.ts +2 -1
  155. package/dist/types/src/playground/logger/plugin.d.ts.map +1 -1
  156. package/dist/types/src/playground/logger/schema.d.ts +15 -1
  157. package/dist/types/src/playground/logger/schema.d.ts.map +1 -1
  158. package/dist/types/src/playground/playground.stories.d.ts +5 -4
  159. package/dist/types/src/playground/playground.stories.d.ts.map +1 -1
  160. package/dist/types/src/plugin-operation/OperationPlugin.d.ts +3 -0
  161. package/dist/types/src/plugin-operation/OperationPlugin.d.ts.map +1 -0
  162. package/dist/types/src/plugin-operation/history/capability.d.ts +7 -0
  163. package/dist/types/src/plugin-operation/history/capability.d.ts.map +1 -0
  164. package/dist/types/src/plugin-operation/history/errors.d.ts +5 -0
  165. package/dist/types/src/plugin-operation/history/errors.d.ts.map +1 -0
  166. package/dist/types/src/plugin-operation/history/history-tracker.d.ts +18 -0
  167. package/dist/types/src/plugin-operation/history/history-tracker.d.ts.map +1 -0
  168. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts +2 -0
  169. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts.map +1 -0
  170. package/dist/types/src/plugin-operation/history/index.d.ts +6 -0
  171. package/dist/types/src/plugin-operation/history/index.d.ts.map +1 -0
  172. package/dist/types/src/plugin-operation/history/types.d.ts +13 -0
  173. package/dist/types/src/plugin-operation/history/types.d.ts.map +1 -0
  174. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts +93 -0
  175. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +1 -0
  176. package/dist/types/src/plugin-operation/history/undo-registry.d.ts +23 -0
  177. package/dist/types/src/plugin-operation/history/undo-registry.d.ts.map +1 -0
  178. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts +2 -0
  179. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts.map +1 -0
  180. package/dist/types/src/plugin-operation/index.d.ts +3 -0
  181. package/dist/types/src/plugin-operation/index.d.ts.map +1 -0
  182. package/dist/types/src/plugin-operation/invoker-capability.d.ts +6 -0
  183. package/dist/types/src/plugin-operation/invoker-capability.d.ts.map +1 -0
  184. package/dist/types/src/plugin-operation/meta.d.ts +3 -0
  185. package/dist/types/src/plugin-operation/meta.d.ts.map +1 -0
  186. package/dist/types/src/plugin-operation/testing.d.ts +109 -0
  187. package/dist/types/src/plugin-operation/testing.d.ts.map +1 -0
  188. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts +3 -0
  189. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts.map +1 -0
  190. package/dist/types/src/plugin-runtime/capability.d.ts +6 -0
  191. package/dist/types/src/plugin-runtime/capability.d.ts.map +1 -0
  192. package/dist/types/src/plugin-runtime/index.d.ts +2 -0
  193. package/dist/types/src/plugin-runtime/index.d.ts.map +1 -0
  194. package/dist/types/src/plugin-runtime/meta.d.ts +3 -0
  195. package/dist/types/src/plugin-runtime/meta.d.ts.map +1 -0
  196. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +2 -1
  197. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +1 -1
  198. package/dist/types/src/plugin-settings/actions.d.ts +41 -7
  199. package/dist/types/src/plugin-settings/actions.d.ts.map +1 -1
  200. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +4 -2
  201. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +1 -1
  202. package/dist/types/src/plugin-settings/meta.d.ts +3 -0
  203. package/dist/types/src/plugin-settings/meta.d.ts.map +1 -0
  204. package/dist/types/src/plugin-settings/operation-resolver.d.ts +6 -0
  205. package/dist/types/src/plugin-settings/operation-resolver.d.ts.map +1 -0
  206. package/dist/types/src/plugin-settings/translations.d.ts +2 -1
  207. package/dist/types/src/plugin-settings/translations.d.ts.map +1 -1
  208. package/dist/types/src/react/App.d.ts +8 -0
  209. package/dist/types/src/react/App.d.ts.map +1 -0
  210. package/dist/types/src/react/App.stories.d.ts +14 -0
  211. package/dist/types/src/react/App.stories.d.ts.map +1 -0
  212. package/dist/types/src/react/DefaultFallback.d.ts +8 -0
  213. package/dist/types/src/react/DefaultFallback.d.ts.map +1 -0
  214. package/dist/types/src/react/ErrorBoundary.d.ts +13 -14
  215. package/dist/types/src/react/ErrorBoundary.d.ts.map +1 -1
  216. package/dist/types/src/react/PluginManagerContext.stories.d.ts +13 -0
  217. package/dist/types/src/react/PluginManagerContext.stories.d.ts.map +1 -0
  218. package/dist/types/src/react/PluginManagerProvider.d.ts +2 -2
  219. package/dist/types/src/react/PluginManagerProvider.d.ts.map +1 -1
  220. package/dist/types/src/react/Surface.d.ts +9 -7
  221. package/dist/types/src/react/Surface.d.ts.map +1 -1
  222. package/dist/types/src/react/Surface.stories.d.ts +8 -10
  223. package/dist/types/src/react/Surface.stories.d.ts.map +1 -1
  224. package/dist/types/src/react/SurfaceInfo.d.ts +11 -0
  225. package/dist/types/src/react/SurfaceInfo.d.ts.map +1 -0
  226. package/dist/types/src/react/common.d.ts +13 -12
  227. package/dist/types/src/react/common.d.ts.map +1 -1
  228. package/dist/types/src/react/index.d.ts +3 -1
  229. package/dist/types/src/react/index.d.ts.map +1 -1
  230. package/dist/types/src/react/types.d.ts +12 -0
  231. package/dist/types/src/react/types.d.ts.map +1 -0
  232. package/dist/types/src/{App.d.ts → react/useApp.d.ts} +11 -9
  233. package/dist/types/src/react/useApp.d.ts.map +1 -0
  234. package/dist/types/src/react/useCapabilities.d.ts +16 -3
  235. package/dist/types/src/react/useCapabilities.d.ts.map +1 -1
  236. package/dist/types/src/react/useLoading.d.ts +18 -0
  237. package/dist/types/src/react/useLoading.d.ts.map +1 -0
  238. package/dist/types/src/react/useOperationResolver.d.ts +19 -0
  239. package/dist/types/src/react/useOperationResolver.d.ts.map +1 -0
  240. package/dist/types/src/testing/index.d.ts +1 -0
  241. package/dist/types/src/testing/index.d.ts.map +1 -1
  242. package/dist/types/src/testing/service.d.ts +8 -0
  243. package/dist/types/src/testing/service.d.ts.map +1 -0
  244. package/dist/types/src/testing/withPluginManager.d.ts +11 -10
  245. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  246. package/dist/types/src/testing/withPluginManager.stories.d.ts +9 -3
  247. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
  248. package/dist/types/tsconfig.tsbuildinfo +1 -1
  249. package/moon.yml +10 -2
  250. package/package.json +103 -42
  251. package/src/cli.ts +107 -0
  252. package/src/common/activation-event.ts +99 -0
  253. package/src/common/capability.ts +343 -0
  254. package/src/common/collaboration.ts +24 -14
  255. package/src/common/file.ts +1 -1
  256. package/src/common/graph.ts +2 -2
  257. package/src/common/index.ts +4 -3
  258. package/src/common/operations.ts +412 -0
  259. package/src/common/plugin.ts +364 -0
  260. package/src/common/surface.ts +60 -26
  261. package/src/common/translations.ts +21 -1
  262. package/src/context.ts +9 -0
  263. package/src/core/{events.ts → activation-event.ts} +5 -5
  264. package/src/core/capability-manager.test.ts +151 -0
  265. package/src/core/capability-manager.ts +171 -0
  266. package/src/core/capability.ts +236 -0
  267. package/src/core/index.ts +5 -4
  268. package/src/core/plugin-manager.test.ts +845 -0
  269. package/src/core/plugin-manager.ts +696 -0
  270. package/src/core/plugin.ts +229 -36
  271. package/src/helpers.test.ts +1 -1
  272. package/src/index.ts +5 -4
  273. package/src/playground/debug/Debug.tsx +27 -17
  274. package/src/playground/debug/plugin.ts +10 -11
  275. package/src/playground/generator/Main.tsx +20 -11
  276. package/src/playground/generator/Toolbar.tsx +27 -16
  277. package/src/playground/generator/generator.ts +28 -28
  278. package/src/playground/generator/plugin.ts +15 -17
  279. package/src/playground/layout/Layout.tsx +11 -7
  280. package/src/playground/layout/plugin.ts +12 -11
  281. package/src/playground/logger/Toolbar.tsx +20 -16
  282. package/src/playground/logger/plugin.ts +33 -27
  283. package/src/playground/logger/schema.ts +11 -1
  284. package/src/playground/playground.stories.tsx +29 -17
  285. package/src/plugin-operation/OperationPlugin.ts +25 -0
  286. package/src/plugin-operation/history/capability.ts +37 -0
  287. package/src/plugin-operation/history/errors.ts +11 -0
  288. package/src/plugin-operation/history/history-tracker.test.ts +380 -0
  289. package/src/plugin-operation/history/history-tracker.ts +129 -0
  290. package/src/plugin-operation/history/index.ts +9 -0
  291. package/src/plugin-operation/history/types.ts +17 -0
  292. package/src/plugin-operation/history/undo-mapping.ts +132 -0
  293. package/src/plugin-operation/history/undo-registry.test.ts +73 -0
  294. package/src/plugin-operation/history/undo-registry.ts +54 -0
  295. package/src/plugin-operation/index.ts +6 -0
  296. package/src/plugin-operation/invoker-capability.ts +40 -0
  297. package/src/plugin-operation/meta.ts +11 -0
  298. package/src/plugin-operation/testing.ts +174 -0
  299. package/src/plugin-runtime/RuntimePlugin.ts +20 -0
  300. package/src/plugin-runtime/capability.ts +53 -0
  301. package/src/plugin-runtime/index.ts +5 -0
  302. package/src/plugin-runtime/meta.ts +11 -0
  303. package/src/plugin-settings/SettingsPlugin.ts +13 -29
  304. package/src/plugin-settings/actions.ts +45 -10
  305. package/src/plugin-settings/app-graph-builder.ts +124 -141
  306. package/src/plugin-settings/meta.ts +10 -0
  307. package/src/plugin-settings/operation-resolver.ts +55 -0
  308. package/src/plugin-settings/translations.ts +4 -4
  309. package/src/react/App.stories.tsx +63 -0
  310. package/src/react/App.tsx +60 -0
  311. package/src/react/DefaultFallback.tsx +26 -0
  312. package/src/react/ErrorBoundary.tsx +26 -15
  313. package/src/react/PluginManagerContext.stories.tsx +184 -0
  314. package/src/react/PluginManagerProvider.ts +2 -2
  315. package/src/react/Surface.stories.tsx +103 -58
  316. package/src/react/Surface.tsx +236 -46
  317. package/src/react/SurfaceInfo.tsx +107 -0
  318. package/src/react/common.ts +30 -5
  319. package/src/react/index.ts +5 -1
  320. package/src/react/types.ts +27 -0
  321. package/src/react/useApp.tsx +209 -0
  322. package/src/react/useCapabilities.ts +38 -5
  323. package/src/react/useLoading.tsx +68 -0
  324. package/src/react/useOperationResolver.ts +40 -0
  325. package/src/testing/index.ts +1 -0
  326. package/src/testing/service.ts +52 -0
  327. package/src/testing/withPluginManager.stories.tsx +14 -10
  328. package/src/testing/withPluginManager.tsx +43 -44
  329. package/tsconfig.json +30 -16
  330. package/vitest.config.ts +8 -6
  331. package/.eslintrc.cjs +0 -9
  332. package/.swc/plugins/v7_linux_x86_64_13.0.0/f45bdff002284d9e8f9ef3f0be909de12da36c049cbcf261ac78fc00abb09a2d +0 -0
  333. package/.swc/plugins/v7_linux_x86_64_13.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429 +0 -0
  334. package/dist/lib/browser/app-graph-builder-BGGXLD6T.mjs +0 -137
  335. package/dist/lib/browser/app-graph-builder-BGGXLD6T.mjs.map +0 -7
  336. package/dist/lib/browser/chunk-2636QSIK.mjs +0 -1518
  337. package/dist/lib/browser/chunk-2636QSIK.mjs.map +0 -7
  338. package/dist/lib/browser/chunk-DHZB7HG7.mjs +0 -413
  339. package/dist/lib/browser/chunk-DHZB7HG7.mjs.map +0 -7
  340. package/dist/lib/browser/chunk-ORWHM7CO.mjs +0 -32
  341. package/dist/lib/browser/chunk-ORWHM7CO.mjs.map +0 -7
  342. package/dist/lib/browser/intent-dispatcher-TWKB22NI.mjs +0 -11
  343. package/dist/lib/browser/intent-resolver-O67UANYP.mjs +0 -39
  344. package/dist/lib/browser/intent-resolver-O67UANYP.mjs.map +0 -7
  345. package/dist/lib/browser/store-LFKDWHUQ.mjs +0 -30
  346. package/dist/lib/browser/store-LFKDWHUQ.mjs.map +0 -7
  347. package/dist/lib/browser/worker.mjs +0 -79
  348. package/dist/lib/node-esm/app-graph-builder-QHIJUYYW.mjs +0 -138
  349. package/dist/lib/node-esm/app-graph-builder-QHIJUYYW.mjs.map +0 -7
  350. package/dist/lib/node-esm/chunk-NJAFK626.mjs +0 -414
  351. package/dist/lib/node-esm/chunk-NJAFK626.mjs.map +0 -7
  352. package/dist/lib/node-esm/chunk-UMZQERLE.mjs +0 -34
  353. package/dist/lib/node-esm/chunk-UMZQERLE.mjs.map +0 -7
  354. package/dist/lib/node-esm/chunk-VSKRV3NW.mjs +0 -1520
  355. package/dist/lib/node-esm/chunk-VSKRV3NW.mjs.map +0 -7
  356. package/dist/lib/node-esm/intent-dispatcher-5PRM3KGH.mjs +0 -12
  357. package/dist/lib/node-esm/intent-resolver-K3D4BXQQ.mjs +0 -40
  358. package/dist/lib/node-esm/intent-resolver-K3D4BXQQ.mjs.map +0 -7
  359. package/dist/lib/node-esm/store-53XDUBMD.mjs +0 -31
  360. package/dist/lib/node-esm/store-53XDUBMD.mjs.map +0 -7
  361. package/dist/lib/node-esm/worker.mjs +0 -80
  362. package/dist/types/src/App.d.ts.map +0 -1
  363. package/dist/types/src/common/capabilities.d.ts +0 -122
  364. package/dist/types/src/common/capabilities.d.ts.map +0 -1
  365. package/dist/types/src/common/events.d.ts +0 -52
  366. package/dist/types/src/common/events.d.ts.map +0 -1
  367. package/dist/types/src/common/layout.d.ts +0 -281
  368. package/dist/types/src/common/layout.d.ts.map +0 -1
  369. package/dist/types/src/core/capabilities.d.ts +0 -114
  370. package/dist/types/src/core/capabilities.d.ts.map +0 -1
  371. package/dist/types/src/core/capabilities.test.d.ts +0 -2
  372. package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
  373. package/dist/types/src/core/events.d.ts.map +0 -1
  374. package/dist/types/src/core/manager.d.ts +0 -122
  375. package/dist/types/src/core/manager.d.ts.map +0 -1
  376. package/dist/types/src/core/manager.test.d.ts +0 -2
  377. package/dist/types/src/core/manager.test.d.ts.map +0 -1
  378. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +0 -2
  379. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +0 -1
  380. package/dist/types/src/plugin-intent/actions.d.ts +0 -38
  381. package/dist/types/src/plugin-intent/actions.d.ts.map +0 -1
  382. package/dist/types/src/plugin-intent/errors.d.ts +0 -16
  383. package/dist/types/src/plugin-intent/errors.d.ts.map +0 -1
  384. package/dist/types/src/plugin-intent/index.d.ts +0 -5
  385. package/dist/types/src/plugin-intent/index.d.ts.map +0 -1
  386. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +0 -139
  387. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +0 -1
  388. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +0 -2
  389. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +0 -1
  390. package/dist/types/src/plugin-intent/intent.d.ts +0 -63
  391. package/dist/types/src/plugin-intent/intent.d.ts.map +0 -1
  392. package/dist/types/src/plugin-settings/intent-resolver.d.ts +0 -4
  393. package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +0 -1
  394. package/dist/types/src/plugin-settings/store.d.ts +0 -5
  395. package/dist/types/src/plugin-settings/store.d.ts.map +0 -1
  396. package/dist/types/src/react/IntentContext.d.ts +0 -8
  397. package/dist/types/src/react/IntentContext.d.ts.map +0 -1
  398. package/dist/types/src/react/useIntentResolver.d.ts +0 -3
  399. package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
  400. package/dist/types/src/worker.d.ts +0 -4
  401. package/dist/types/src/worker.d.ts.map +0 -1
  402. package/src/App.tsx +0 -276
  403. package/src/common/capabilities.ts +0 -113
  404. package/src/common/events.ts +0 -77
  405. package/src/common/layout.ts +0 -278
  406. package/src/core/capabilities.test.ts +0 -136
  407. package/src/core/capabilities.ts +0 -254
  408. package/src/core/manager.test.ts +0 -515
  409. package/src/core/manager.ts +0 -519
  410. package/src/plugin-intent/IntentPlugin.ts +0 -20
  411. package/src/plugin-intent/actions.ts +0 -33
  412. package/src/plugin-intent/errors.ts +0 -39
  413. package/src/plugin-intent/index.ts +0 -8
  414. package/src/plugin-intent/intent-dispatcher.test.ts +0 -279
  415. package/src/plugin-intent/intent-dispatcher.ts +0 -333
  416. package/src/plugin-intent/intent.ts +0 -154
  417. package/src/plugin-settings/intent-resolver.ts +0 -34
  418. package/src/plugin-settings/store.ts +0 -33
  419. package/src/react/IntentContext.tsx +0 -34
  420. package/src/react/useIntentResolver.ts +0 -22
  421. package/src/worker.ts +0 -11
  422. package/typedoc/.nojekyll +0 -1
  423. package/typedoc/assets/hierarchy.js +0 -1
  424. package/typedoc/assets/highlight.css +0 -106
  425. package/typedoc/assets/icons.js +0 -18
  426. package/typedoc/assets/icons.svg +0 -1
  427. package/typedoc/assets/main.js +0 -60
  428. package/typedoc/assets/navigation.js +0 -1
  429. package/typedoc/assets/search.js +0 -1
  430. package/typedoc/assets/style.css +0 -1640
  431. package/typedoc/classes/CollaborationActions.InsertContent.html +0 -421
  432. package/typedoc/classes/ErrorBoundary.html +0 -125
  433. package/typedoc/classes/IntentAction.ShowUndo.html +0 -227
  434. package/typedoc/classes/IntentAction.Track.html +0 -266
  435. package/typedoc/classes/LayoutAction.AddToast.html +0 -265
  436. package/typedoc/classes/LayoutAction.Close.html +0 -382
  437. package/typedoc/classes/LayoutAction.Expose.html +0 -265
  438. package/typedoc/classes/LayoutAction.Open.html +0 -1123
  439. package/typedoc/classes/LayoutAction.RevertWorkspace.html +0 -343
  440. package/typedoc/classes/LayoutAction.ScrollIntoView.html +0 -460
  441. package/typedoc/classes/LayoutAction.Set.html +0 -460
  442. package/typedoc/classes/LayoutAction.SetLayoutMode.html +0 -499
  443. package/typedoc/classes/LayoutAction.SwitchWorkspace.html +0 -265
  444. package/typedoc/classes/LayoutAction.UpdateComplementary.html +0 -616
  445. package/typedoc/classes/LayoutAction.UpdateDialog.html +0 -1123
  446. package/typedoc/classes/LayoutAction.UpdateLayout.html +0 -461
  447. package/typedoc/classes/LayoutAction.UpdatePopover.html +0 -1435
  448. package/typedoc/classes/LayoutAction.UpdateSidebar.html +0 -616
  449. package/typedoc/classes/Plugin.html +0 -6
  450. package/typedoc/classes/PluginContext.html +0 -38
  451. package/typedoc/classes/PluginManager.html +0 -43
  452. package/typedoc/classes/PluginModule.html +0 -18
  453. package/typedoc/classes/SettingsAction.Open.html +0 -226
  454. package/typedoc/classes/SettingsAction.OpenPluginRegistry.html +0 -265
  455. package/typedoc/functions/Events.createStateEvent.html +0 -2
  456. package/typedoc/functions/IntentPlugin.html +0 -1
  457. package/typedoc/functions/SettingsPlugin.html +0 -1
  458. package/typedoc/functions/allOf.html +0 -2
  459. package/typedoc/functions/chain.html +0 -3
  460. package/typedoc/functions/contributes.html +0 -2
  461. package/typedoc/functions/createDispatcher.html +0 -3
  462. package/typedoc/functions/createIntent.html +0 -6
  463. package/typedoc/functions/createResolver.html +0 -2
  464. package/typedoc/functions/createSurface.html +0 -2
  465. package/typedoc/functions/defineCapability.html +0 -2
  466. package/typedoc/functions/defineEvent.html +0 -2
  467. package/typedoc/functions/defineModule.html +0 -2
  468. package/typedoc/functions/definePlugin.html +0 -2
  469. package/typedoc/functions/eventKey.html +0 -2
  470. package/typedoc/functions/getEvents.html +0 -2
  471. package/typedoc/functions/isAllOf.html +0 -2
  472. package/typedoc/functions/isOneOf.html +0 -2
  473. package/typedoc/functions/isSurfaceAvailable.html +0 -2
  474. package/typedoc/functions/lazy.html +0 -2
  475. package/typedoc/functions/oneOf.html +0 -2
  476. package/typedoc/functions/useApp.html +0 -6
  477. package/typedoc/functions/useAppGraph.html +0 -1
  478. package/typedoc/functions/useCapabilities.html +0 -3
  479. package/typedoc/functions/useCapability.html +0 -4
  480. package/typedoc/functions/useIntentDispatcher.html +0 -1
  481. package/typedoc/functions/useIntentResolver.html +0 -1
  482. package/typedoc/functions/useLayout.html +0 -1
  483. package/typedoc/functions/usePluginManager.html +0 -2
  484. package/typedoc/hierarchy.html +0 -1
  485. package/typedoc/index.html +0 -12
  486. package/typedoc/interfaces/LayoutAction.Toast.html +0 -10
  487. package/typedoc/media/LICENSE +0 -8
  488. package/typedoc/modules/Capabilities.html +0 -1
  489. package/typedoc/modules/CollaborationActions.html +0 -1
  490. package/typedoc/modules/Events.html +0 -1
  491. package/typedoc/modules/IntentAction.html +0 -1
  492. package/typedoc/modules/LayoutAction.html +0 -2
  493. package/typedoc/modules/SettingsAction.html +0 -1
  494. package/typedoc/modules.html +0 -1
  495. package/typedoc/types/ActivationEvent.html +0 -8
  496. package/typedoc/types/ActivationEvents.html +0 -2
  497. package/typedoc/types/AnyCapability.html +0 -1
  498. package/typedoc/types/AnyIntent.html +0 -1
  499. package/typedoc/types/AnyIntentChain.html +0 -1
  500. package/typedoc/types/AnyIntentEffectResult.html +0 -1
  501. package/typedoc/types/AnyIntentResolver.html +0 -1
  502. package/typedoc/types/AnyIntentResult.html +0 -1
  503. package/typedoc/types/Capabilities.FileUploader.html +0 -1
  504. package/typedoc/types/Capabilities.IntentResolver.html +0 -1
  505. package/typedoc/types/Capabilities.Layout.html +0 -1
  506. package/typedoc/types/Capabilities.Metadata.html +0 -1
  507. package/typedoc/types/Capabilities.ReactContext.html +0 -1
  508. package/typedoc/types/Capabilities.ReactRoot.html +0 -1
  509. package/typedoc/types/Capabilities.ReactSurface.html +0 -1
  510. package/typedoc/types/Capabilities.Settings.html +0 -4
  511. package/typedoc/types/Capability.html +0 -9
  512. package/typedoc/types/CreateAppOptions.html +0 -10
  513. package/typedoc/types/FileInfo.html +0 -1
  514. package/typedoc/types/Intent.html +0 -10
  515. package/typedoc/types/IntentChain.html +0 -6
  516. package/typedoc/types/IntentContext.html +0 -5
  517. package/typedoc/types/IntentData.html +0 -1
  518. package/typedoc/types/IntentDispatcher.html +0 -2
  519. package/typedoc/types/IntentDispatcherResult.html +0 -2
  520. package/typedoc/types/IntentEffectDefinition.html +0 -2
  521. package/typedoc/types/IntentEffectResult.html +0 -15
  522. package/typedoc/types/IntentParams.html +0 -3
  523. package/typedoc/types/IntentResolver.html +0 -2
  524. package/typedoc/types/IntentResultData.html +0 -1
  525. package/typedoc/types/IntentSchema.html +0 -1
  526. package/typedoc/types/IntentUndo.html +0 -2
  527. package/typedoc/types/InterfaceDef.html +0 -4
  528. package/typedoc/types/Label.html +0 -1
  529. package/typedoc/types/NodeSerializer.html +0 -8
  530. package/typedoc/types/PluginManagerOptions.html +0 -6
  531. package/typedoc/types/PluginMeta.html +0 -21
  532. package/typedoc/types/PromiseIntentDispatcher.html +0 -2
  533. package/typedoc/types/PromiseIntentUndo.html +0 -2
  534. package/typedoc/types/Resource.html +0 -1
  535. package/typedoc/types/ResourceKey.html +0 -1
  536. package/typedoc/types/ResourceLanguage.html +0 -1
  537. package/typedoc/types/SerializedNode.html +0 -4
  538. package/typedoc/types/SurfaceComponent.html +0 -2
  539. package/typedoc/types/SurfaceDefinition.html +0 -2
  540. package/typedoc/types/SurfaceProps.html +0 -4
  541. package/typedoc/variables/Capabilities.AnchorSort.html +0 -1
  542. package/typedoc/variables/Capabilities.AppGraph.html +0 -1
  543. package/typedoc/variables/Capabilities.AppGraphBuilder.html +0 -1
  544. package/typedoc/variables/Capabilities.AppGraphSerializer.html +0 -1
  545. package/typedoc/variables/Capabilities.ArtifactDefinition.html +0 -1
  546. package/typedoc/variables/Capabilities.FileUploader.html +0 -1
  547. package/typedoc/variables/Capabilities.IntentDispatcher.html +0 -1
  548. package/typedoc/variables/Capabilities.IntentResolver.html +0 -1
  549. package/typedoc/variables/Capabilities.Layout.html +0 -1
  550. package/typedoc/variables/Capabilities.Metadata.html +0 -1
  551. package/typedoc/variables/Capabilities.Null.html +0 -1
  552. package/typedoc/variables/Capabilities.PluginManager.html +0 -1
  553. package/typedoc/variables/Capabilities.ReactContext.html +0 -1
  554. package/typedoc/variables/Capabilities.ReactRoot.html +0 -1
  555. package/typedoc/variables/Capabilities.ReactSurface.html +0 -1
  556. package/typedoc/variables/Capabilities.RxRegistry.html +0 -1
  557. package/typedoc/variables/Capabilities.Settings.html +0 -1
  558. package/typedoc/variables/Capabilities.SettingsStore.html +0 -1
  559. package/typedoc/variables/Capabilities.Tools.html +0 -1
  560. package/typedoc/variables/Capabilities.Translations.html +0 -1
  561. package/typedoc/variables/Events.AppGraphReady.html +0 -2
  562. package/typedoc/variables/Events.DispatcherReady.html +0 -2
  563. package/typedoc/variables/Events.LayoutReady.html +0 -1
  564. package/typedoc/variables/Events.SettingsReady.html +0 -2
  565. package/typedoc/variables/Events.SetupAppGraph.html +0 -2
  566. package/typedoc/variables/Events.SetupArtifactDefinition.html +0 -2
  567. package/typedoc/variables/Events.SetupIntentResolver.html +0 -2
  568. package/typedoc/variables/Events.SetupMetadata.html +0 -2
  569. package/typedoc/variables/Events.SetupReactSurface.html +0 -2
  570. package/typedoc/variables/Events.SetupSettings.html +0 -2
  571. package/typedoc/variables/Events.SetupTranslations.html +0 -2
  572. package/typedoc/variables/Events.Startup.html +0 -2
  573. package/typedoc/variables/FileInfoSchema.html +0 -1
  574. package/typedoc/variables/INTENT_ACTION.html +0 -1
  575. package/typedoc/variables/INTENT_PLUGIN.html +0 -1
  576. package/typedoc/variables/LAYOUT_ACTION.html +0 -1
  577. package/typedoc/variables/LAYOUT_PLUGIN.html +0 -1
  578. package/typedoc/variables/Label.html +0 -1
  579. package/typedoc/variables/LayoutAction.Toast.html +0 -1
  580. package/typedoc/variables/LayoutAction.UPDATE_LAYOUT.html +0 -1
  581. package/typedoc/variables/PluginManagerProvider.html +0 -2
  582. package/typedoc/variables/Resource.html +0 -2
  583. package/typedoc/variables/ResourceKey.html +0 -1
  584. package/typedoc/variables/ResourceLanguage.html +0 -1
  585. package/typedoc/variables/SETTINGS_ACTION.html +0 -1
  586. package/typedoc/variables/SETTINGS_ID.html +0 -1
  587. package/typedoc/variables/SETTINGS_KEY.html +0 -1
  588. package/typedoc/variables/SETTINGS_PLUGIN.html +0 -1
  589. package/typedoc/variables/Surface.html +0 -2
  590. package/typedoc/variables/defaultFileTypes.html +0 -1
  591. /package/dist/lib/browser/{intent-dispatcher-TWKB22NI.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  592. /package/dist/lib/browser/{worker.mjs.map → common/index.mjs.map} +0 -0
  593. /package/dist/lib/{node-esm/intent-dispatcher-5PRM3KGH.mjs.map → browser/core/activation-event.mjs.map} +0 -0
  594. /package/dist/lib/{node-esm/worker.mjs.map → browser/core/capability.mjs.map} +0 -0
@@ -0,0 +1,73 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { describe, test } from 'vitest';
6
+
7
+ import { Compute, HalveCompute } from '../testing';
8
+
9
+ import * as UndoMapping from './undo-mapping';
10
+ import * as UndoRegistry from './undo-registry';
11
+
12
+ describe('UndoRegistry', () => {
13
+ test('looks up undo mapping by operation key', ({ expect }) => {
14
+ const undoMapping = UndoMapping.make({
15
+ operation: Compute,
16
+ inverse: HalveCompute,
17
+ deriveContext: (_input, output) => ({ value: output.value }),
18
+ });
19
+ const registry = UndoRegistry.make(() => [undoMapping]);
20
+
21
+ const result = registry.lookup(Compute);
22
+ expect(result).not.toBe(undefined);
23
+ expect(result?.inverse.meta.key).toBe('test.halve-compute');
24
+ });
25
+
26
+ test('returns undefined for unmapped operations', ({ expect }) => {
27
+ const registry = UndoRegistry.make(() => []);
28
+
29
+ const result = registry.lookup(Compute);
30
+ expect(result).toBe(undefined);
31
+ });
32
+
33
+ test('deriveContext extracts correct undo input', ({ expect }) => {
34
+ const undoMapping = UndoMapping.make({
35
+ operation: Compute,
36
+ inverse: HalveCompute,
37
+ // Note: This tests that input and output types are inferred correctly.
38
+ deriveContext: (input, output) => ({ value: output.value + input.value }),
39
+ });
40
+ const registry = UndoRegistry.make(() => [undoMapping]);
41
+
42
+ const result = registry.lookup(Compute);
43
+ const context = result?.deriveContext({ value: 5 }, { value: 10 });
44
+ expect(context).toEqual({ value: 15 });
45
+ });
46
+ });
47
+
48
+ describe('resolveMessage', () => {
49
+ test('returns undefined for undefined message', ({ expect }) => {
50
+ const result = UndoMapping.resolveMessage(undefined, { value: 1 }, { value: 2 });
51
+ expect(result).toBe(undefined);
52
+ });
53
+
54
+ test('returns static label as-is', ({ expect }) => {
55
+ const staticMessage: [string, { ns: string }] = ['test message', { ns: 'test' }];
56
+ const result = UndoMapping.resolveMessage(staticMessage, { value: 1 }, { value: 2 });
57
+ expect(result).toEqual(staticMessage);
58
+ });
59
+
60
+ test('calls function message with input and output', ({ expect }) => {
61
+ const messageFunc = (input: { value: number }, output: { value: number }): [string, { ns: string }] => [
62
+ `input: ${input.value}, output: ${output.value}`,
63
+ { ns: 'test' },
64
+ ];
65
+ const result = UndoMapping.resolveMessage(messageFunc, { value: 5 }, { value: 10 });
66
+ expect(result).toEqual(['input: 5, output: 10', { ns: 'test' }]);
67
+ });
68
+
69
+ test('returns string label as-is', ({ expect }) => {
70
+ const result = UndoMapping.resolveMessage('simple string', { value: 1 }, { value: 2 });
71
+ expect(result).toBe('simple string');
72
+ });
73
+ });
@@ -0,0 +1,54 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import type { Operation } from '@dxos/operation';
6
+
7
+ import type * as UndoMapping from './undo-mapping';
8
+
9
+ //
10
+ // Public Interface
11
+ //
12
+
13
+ /**
14
+ * Lookup result from UndoRegistry.
15
+ */
16
+ export type UndoMappingResult = {
17
+ inverse: Operation.Definition<any, any>;
18
+ /** Returns undefined to indicate the operation is not undoable. */
19
+ deriveContext: (input: any, output: any) => any | undefined;
20
+ /** Message provider - may be a static Label or a function. */
21
+ message?: UndoMapping.MessageProvider<Operation.Definition<any, any>>;
22
+ };
23
+
24
+ /**
25
+ * UndoRegistry interface - looks up inverse operations.
26
+ */
27
+ export interface UndoRegistry {
28
+ lookup: (operation: Operation.Definition<any, any>) => UndoMappingResult | undefined;
29
+ }
30
+
31
+ //
32
+ // Factory
33
+ //
34
+
35
+ /**
36
+ * Creates an UndoRegistry that looks up inverse operations.
37
+ */
38
+ export const make = (getMappings: () => UndoMapping.UndoMapping[]): UndoRegistry => {
39
+ const lookup = (operation: Operation.Definition<any, any>): UndoMappingResult | undefined => {
40
+ const mappings = getMappings();
41
+ const mapping = mappings.find((m) => m.operation.meta.key === operation.meta.key);
42
+ if (!mapping) {
43
+ return undefined;
44
+ }
45
+
46
+ return {
47
+ inverse: mapping.inverse,
48
+ deriveContext: mapping.deriveContext,
49
+ message: mapping.message,
50
+ };
51
+ };
52
+
53
+ return { lookup };
54
+ };
@@ -0,0 +1,6 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './history';
6
+ export * from './OperationPlugin';
@@ -0,0 +1,40 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { OperationInvoker } from '@dxos/operation';
8
+
9
+ import * as Common from '../common';
10
+ import { Capability, Plugin } from '../core';
11
+
12
+ //
13
+ // Capability Module
14
+ //
15
+
16
+ export default Capability.makeModule(
17
+ Effect.fnUntraced(function* () {
18
+ // Get the services for synchronous access in callbacks.
19
+ const capabilityManager = yield* Capability.Service;
20
+ const pluginManager = yield* Plugin.Service;
21
+
22
+ // Get the ManagedRuntime capability (should be available since we activate after ManagedRuntimeReady).
23
+ const managedRuntimes = yield* Capability.getAll(Common.Capability.ManagedRuntime);
24
+ const managedRuntime = managedRuntimes.length > 0 ? managedRuntimes[0] : undefined;
25
+
26
+ const invoker = OperationInvoker.make(
27
+ () =>
28
+ Effect.gen(function* () {
29
+ yield* Plugin.activate(Common.ActivationEvent.SetupOperationResolver);
30
+ return (yield* Capability.getAll(Common.Capability.OperationResolver)).flat();
31
+ }).pipe(
32
+ Effect.provideService(Capability.Service, capabilityManager),
33
+ Effect.provideService(Plugin.Service, pluginManager),
34
+ ),
35
+ managedRuntime,
36
+ );
37
+
38
+ return Capability.contributes(Common.Capability.OperationInvoker, invoker);
39
+ }),
40
+ );
@@ -0,0 +1,11 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Plugin } from '../core';
6
+
7
+ export const meta: Plugin.Meta = {
8
+ id: 'dxos.org/plugin/operation',
9
+ name: 'Operation Plugin',
10
+ description: 'Provides operation invocation, undo registry, and history tracking.',
11
+ };
@@ -0,0 +1,174 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Deferred from 'effect/Deferred';
6
+ import * as Effect from 'effect/Effect';
7
+ import * as Fiber from 'effect/Fiber';
8
+ import * as Ref from 'effect/Ref';
9
+ import * as Schema from 'effect/Schema';
10
+ import * as Stream from 'effect/Stream';
11
+
12
+ import { Operation, type OperationInvoker, OperationResolver } from '@dxos/operation';
13
+
14
+ //
15
+ // Test Operations
16
+ //
17
+
18
+ export const Compute = Operation.make({
19
+ schema: {
20
+ input: Schema.Struct({ value: Schema.Number }),
21
+ output: Schema.Struct({ value: Schema.Number }),
22
+ },
23
+ meta: { key: 'test.compute' },
24
+ });
25
+
26
+ export const HalveCompute = Operation.make({
27
+ schema: {
28
+ input: Schema.Struct({ value: Schema.Number }),
29
+ output: Schema.Struct({ value: Schema.Number }),
30
+ },
31
+ meta: { key: 'test.halve-compute' },
32
+ });
33
+
34
+ export const ToString = Operation.make({
35
+ schema: {
36
+ input: Schema.Struct({ value: Schema.Number }),
37
+ output: Schema.Struct({ string: Schema.String }),
38
+ },
39
+ meta: { key: 'test.to-string' },
40
+ });
41
+
42
+ export const Add = Operation.make({
43
+ schema: {
44
+ input: Schema.Tuple(Schema.Number, Schema.Number),
45
+ output: Schema.Number,
46
+ },
47
+ meta: { key: 'test.add' },
48
+ });
49
+
50
+ export const SideEffect = Operation.make({
51
+ schema: {
52
+ input: Schema.Void,
53
+ output: Schema.Void,
54
+ },
55
+ meta: { key: 'test.side-effect' },
56
+ });
57
+
58
+ //
59
+ // Test Handlers
60
+ //
61
+
62
+ export const computeHandler = OperationResolver.make({
63
+ operation: Compute,
64
+ handler: (data) =>
65
+ Effect.gen(function* () {
66
+ yield* Effect.sleep(data.value * 10);
67
+ return { value: data.value * 2 };
68
+ }),
69
+ });
70
+
71
+ export const halveComputeHandler = OperationResolver.make({
72
+ operation: HalveCompute,
73
+ handler: (data) => Effect.succeed({ value: data.value / 2 }),
74
+ });
75
+
76
+ export const toStringHandler = OperationResolver.make({
77
+ operation: ToString,
78
+ handler: (data) => Effect.succeed({ string: data.value.toString() }),
79
+ });
80
+
81
+ export const addHandler = OperationResolver.make({
82
+ operation: Add,
83
+ handler: (data) => Effect.succeed(data[0] + data[1]),
84
+ });
85
+
86
+ export const sideEffectHandler = OperationResolver.make({
87
+ operation: SideEffect,
88
+ handler: () => Effect.succeed(undefined),
89
+ });
90
+
91
+ //
92
+ // Test Utilities
93
+ //
94
+
95
+ /**
96
+ * Event collector for testing - provides deterministic event collection using Effect primitives.
97
+ */
98
+ export interface EventCollector {
99
+ /** All collected events. */
100
+ readonly events: OperationInvoker.InvocationEvent[];
101
+ /** Wait until N events have been collected. */
102
+ waitForEvents: (count: number) => Effect.Effect<void>;
103
+ /** Clean up the subscription fiber. */
104
+ dispose: Effect.Effect<void>;
105
+ }
106
+
107
+ /**
108
+ * Creates an event collector that subscribes to invoker events.
109
+ * Uses Effect primitives for synchronization.
110
+ */
111
+ export const createEventCollector = (invoker: OperationInvoker.OperationInvoker): Effect.Effect<EventCollector> =>
112
+ Effect.gen(function* () {
113
+ const events: OperationInvoker.InvocationEvent[] = [];
114
+
115
+ // Ref to track current waiter (waiting for N events).
116
+ const waiterRef = yield* Ref.make<{ count: number; deferred: Deferred.Deferred<void> } | null>(null);
117
+
118
+ // Deferred to signal when subscription is ready.
119
+ const subscriptionReady = yield* Deferred.make<void>();
120
+
121
+ const checkWaiter = Effect.gen(function* () {
122
+ const waiter = yield* Ref.get(waiterRef);
123
+ if (waiter && events.length >= waiter.count) {
124
+ yield* Deferred.succeed(waiter.deferred, undefined);
125
+ yield* Ref.set(waiterRef, null);
126
+ }
127
+ });
128
+
129
+ // Fork a fiber to consume the invocation stream.
130
+ const fiber = yield* Effect.fork(
131
+ Effect.gen(function* () {
132
+ // Signal that subscription is about to start.
133
+ yield* Deferred.succeed(subscriptionReady, undefined);
134
+ yield* Stream.fromPubSub(invoker.invocations).pipe(
135
+ Stream.runForEach((event) =>
136
+ Effect.gen(function* () {
137
+ events.push(event);
138
+ yield* checkWaiter;
139
+ }),
140
+ ),
141
+ );
142
+ }),
143
+ );
144
+
145
+ // Wait for the subscription to be established.
146
+ yield* Deferred.await(subscriptionReady);
147
+ // Additional yield to ensure PubSub subscription is fully registered.
148
+ yield* Effect.yieldNow();
149
+
150
+ const waitForEvents = (count: number): Effect.Effect<void> =>
151
+ Effect.gen(function* () {
152
+ if (events.length >= count) {
153
+ return;
154
+ }
155
+ const deferred = yield* Deferred.make<void>();
156
+ yield* Ref.set(waiterRef, { count, deferred });
157
+ yield* Deferred.await(deferred);
158
+ });
159
+
160
+ const dispose = Fiber.interrupt(fiber);
161
+
162
+ return { events, waitForEvents, dispose };
163
+ });
164
+
165
+ /**
166
+ * Waits until a condition is true, yielding to the JS event loop between checks.
167
+ * Uses setImmediate to allow other async work to complete.
168
+ */
169
+ export const waitUntil = (condition: () => boolean): Effect.Effect<void> =>
170
+ Effect.gen(function* () {
171
+ while (!condition()) {
172
+ yield* Effect.promise(() => new Promise((r) => setImmediate(r)));
173
+ }
174
+ });
@@ -0,0 +1,20 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Common from '../common';
6
+ import { Capability, Plugin } from '../core';
7
+
8
+ import { meta } from './meta';
9
+
10
+ const ManagedRuntimeCapability = Capability.lazy('ManagedRuntime', () => import('./capability'));
11
+
12
+ export const RuntimePlugin = Plugin.define(meta).pipe(
13
+ Plugin.addModule({
14
+ activatesOn: Common.ActivationEvent.Startup,
15
+ activatesBefore: [Common.ActivationEvent.SetupLayer],
16
+ activatesAfter: [Common.ActivationEvent.ManagedRuntimeReady],
17
+ activate: ManagedRuntimeCapability,
18
+ }),
19
+ Plugin.make,
20
+ );
@@ -0,0 +1,53 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+ import * as Layer from 'effect/Layer';
7
+ import * as ManagedRuntime from 'effect/ManagedRuntime';
8
+
9
+ import * as Common from '../common';
10
+ import { Capability, Plugin } from '../core';
11
+
12
+ //
13
+ // Capability Module
14
+ //
15
+
16
+ export default Capability.makeModule(
17
+ Effect.fnUntraced(function* () {
18
+ // Get the CapabilityManager to create a layer for it.
19
+ const capabilityManager = yield* Capability.Service;
20
+
21
+ // Get the PluginManager to create a layer for it.
22
+ const pluginManager = yield* Plugin.Service;
23
+
24
+ // Trigger setup event so plugins can contribute their layers.
25
+ yield* Plugin.activate(Common.ActivationEvent.SetupLayer);
26
+
27
+ // Gather all contributed layers.
28
+ const layers = yield* Capability.getAll(Common.Capability.Layer);
29
+
30
+ // Create layers that provide Capability.Service and Plugin.Service.
31
+ const capabilityServiceLayer = Layer.succeed(Capability.Service, capabilityManager);
32
+ const pluginServiceLayer = Layer.succeed(Plugin.Service, pluginManager);
33
+
34
+ // Merge all layers including service layers.
35
+ // Layer.mergeAll requires a tuple type, so we use a cast for dynamic arrays.
36
+ const composedLayer =
37
+ layers.length > 0
38
+ ? (Layer.mergeAll as (...args: Layer.Layer<any, any, any>[]) => Layer.Layer<any, any, never>)(
39
+ capabilityServiceLayer,
40
+ pluginServiceLayer,
41
+ ...layers,
42
+ )
43
+ : (Layer.mergeAll as (...args: Layer.Layer<any, any, any>[]) => Layer.Layer<any, any, never>)(
44
+ capabilityServiceLayer,
45
+ pluginServiceLayer,
46
+ );
47
+
48
+ // Create the managed runtime from the composed layer.
49
+ const runtime = ManagedRuntime.make(composedLayer) as Common.Capability.ManagedRuntime;
50
+
51
+ return Capability.contributes(Common.Capability.ManagedRuntime, runtime);
52
+ }),
53
+ );
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './RuntimePlugin';
@@ -0,0 +1,11 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Plugin } from '../core';
6
+
7
+ export const meta: Plugin.Meta = {
8
+ id: 'dxos.org/plugin/runtime',
9
+ name: 'Runtime Plugin',
10
+ description: 'Provides a managed Effect runtime by composing contributed layers.',
11
+ };
@@ -2,34 +2,18 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { SETTINGS_PLUGIN } from './actions';
5
+ import * as Common from '../common';
6
+ import { Capability, Plugin } from '../core';
7
+
8
+ import { meta } from './meta';
6
9
  import { translations } from './translations';
7
- import { Capabilities, Events } from '../common';
8
- import { contributes, defineModule, definePlugin, lazy } from '../core';
9
10
 
10
- // TODO(wittjosiah): Add options to exclude some modules.
11
- export const SettingsPlugin = () =>
12
- definePlugin({ id: SETTINGS_PLUGIN, name: 'Settings' }, [
13
- defineModule({
14
- id: `${SETTINGS_PLUGIN}/module/store`,
15
- activatesOn: Events.Startup,
16
- activatesBefore: [Events.SetupSettings],
17
- activatesAfter: [Events.SettingsReady],
18
- activate: lazy(() => import('./store')),
19
- }),
20
- defineModule({
21
- id: `${SETTINGS_PLUGIN}/module/translations`,
22
- activatesOn: Events.SetupTranslations,
23
- activate: () => contributes(Capabilities.Translations, translations),
24
- }),
25
- defineModule({
26
- id: `${SETTINGS_PLUGIN}/module/intent-resolver`,
27
- activatesOn: Events.SetupIntentResolver,
28
- activate: lazy(() => import('./intent-resolver')),
29
- }),
30
- defineModule({
31
- id: `${SETTINGS_PLUGIN}/module/app-graph-builder`,
32
- activatesOn: Events.SetupAppGraph,
33
- activate: lazy(() => import('./app-graph-builder')),
34
- }),
35
- ]);
11
+ const SettingsOperationResolver = Capability.lazy('SettingsOperationResolver', () => import('./operation-resolver'));
12
+ const SettingsAppGraphBuilder = Capability.lazy('SettingsAppGraphBuilder', () => import('./app-graph-builder'));
13
+
14
+ export const SettingsPlugin = Plugin.define(meta).pipe(
15
+ Common.Plugin.addTranslationsModule({ translations }),
16
+ Common.Plugin.addOperationResolverModule({ activate: SettingsOperationResolver }),
17
+ Common.Plugin.addAppGraphModule({ activate: SettingsAppGraphBuilder }),
18
+ Plugin.make,
19
+ );
@@ -2,28 +2,63 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { Schema } from 'effect';
5
+ import * as Schema from 'effect/Schema';
6
6
 
7
- export const SETTINGS_PLUGIN = 'dxos.org/plugin/settings';
8
- export const SETTINGS_ACTION = `${SETTINGS_PLUGIN}/action`;
9
- // TODO(wittjosiah): This is a hack to prevent the previous deck from being set for pinned items.
10
- // Ideally this should be worked into the data model in a generic way.
7
+ import { Operation } from '@dxos/operation';
8
+
9
+ import { Capability } from '../core';
10
+
11
+ import { meta } from './meta';
12
+
13
+ // TODO(burdon): Document.
11
14
  export const SETTINGS_ID = '!dxos:settings';
12
15
  export const SETTINGS_KEY = 'settings';
13
16
 
14
17
  export namespace SettingsAction {
15
- export class Open extends Schema.TaggedClass<Open>()(`${SETTINGS_ACTION}/open`, {
18
+ export class Open extends Schema.TaggedClass<Open>()(`${meta.id}/open`, {
16
19
  input: Schema.Struct({
17
20
  plugin: Schema.optional(Schema.String),
18
21
  }),
19
22
  output: Schema.Void,
20
23
  }) {}
21
24
 
22
- export class OpenPluginRegistry extends Schema.TaggedClass<OpenPluginRegistry>()(
23
- `${SETTINGS_ACTION}/open-plugin-registry`,
24
- {
25
+ export class OpenPluginRegistry extends Schema.TaggedClass<OpenPluginRegistry>()(`${meta.id}/open-plugin-registry`, {
26
+ input: Schema.Void,
27
+ output: Schema.Void,
28
+ }) {}
29
+ }
30
+
31
+ const SETTINGS_OPERATION = `${meta.id}/operation`;
32
+
33
+ /**
34
+ * Operations for the Settings plugin.
35
+ */
36
+ export namespace SettingsOperation {
37
+ export const Open = Operation.make({
38
+ meta: {
39
+ key: `${SETTINGS_OPERATION}/open`,
40
+ name: 'Open Settings',
41
+ description: 'Open the settings panel.',
42
+ },
43
+ services: [Capability.Service],
44
+ schema: {
45
+ input: Schema.Struct({
46
+ plugin: Schema.optional(Schema.String.annotations({ description: 'The plugin to open settings for.' })),
47
+ }),
48
+ output: Schema.Void,
49
+ },
50
+ });
51
+
52
+ export const OpenPluginRegistry = Operation.make({
53
+ meta: {
54
+ key: `${SETTINGS_OPERATION}/open-plugin-registry`,
55
+ name: 'Open Plugin Registry',
56
+ description: 'Open the plugin registry.',
57
+ },
58
+ services: [Capability.Service],
59
+ schema: {
25
60
  input: Schema.Void,
26
61
  output: Schema.Void,
27
62
  },
28
- ) {}
63
+ });
29
64
  }