@dxos/plugin-space 0.7.4 → 0.7.5-labs.071a3e2

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 (257) hide show
  1. package/dist/lib/browser/app-graph-builder-TTM2YZVS.mjs +367 -0
  2. package/dist/lib/browser/app-graph-builder-TTM2YZVS.mjs.map +7 -0
  3. package/dist/lib/browser/app-graph-serializer-ZGM5NDXE.mjs +80 -0
  4. package/dist/lib/browser/app-graph-serializer-ZGM5NDXE.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-2NMUVDMZ.mjs +1715 -0
  6. package/dist/lib/browser/chunk-2NMUVDMZ.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-ENRYFGYE.mjs +133 -0
  8. package/dist/lib/browser/chunk-ENRYFGYE.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-H2AR4OLP.mjs +316 -0
  10. package/dist/lib/browser/chunk-H2AR4OLP.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-PQXZCNAU.mjs +13 -0
  12. package/dist/lib/browser/chunk-PQXZCNAU.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-RLZQJD47.mjs +22 -0
  14. package/dist/lib/browser/chunk-RLZQJD47.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-S5IGZNXJ.mjs +528 -0
  16. package/dist/lib/browser/chunk-S5IGZNXJ.mjs.map +7 -0
  17. package/dist/lib/browser/identity-created-VICTPQX7.mjs +28 -0
  18. package/dist/lib/browser/identity-created-VICTPQX7.mjs.map +7 -0
  19. package/dist/lib/browser/index.mjs +193 -3521
  20. package/dist/lib/browser/index.mjs.map +4 -4
  21. package/dist/lib/browser/intent-resolver-A5274MUR.mjs +537 -0
  22. package/dist/lib/browser/intent-resolver-A5274MUR.mjs.map +7 -0
  23. package/dist/lib/browser/meta.json +1 -1
  24. package/dist/lib/browser/react-root-N6QTWYCV.mjs +28 -0
  25. package/dist/lib/browser/react-root-N6QTWYCV.mjs.map +7 -0
  26. package/dist/lib/browser/react-surface-STMNA7W7.mjs +231 -0
  27. package/dist/lib/browser/react-surface-STMNA7W7.mjs.map +7 -0
  28. package/dist/lib/browser/settings-HN5UIYQO.mjs +24 -0
  29. package/dist/lib/browser/settings-HN5UIYQO.mjs.map +7 -0
  30. package/dist/lib/browser/spaces-ready-F57ITJDR.mjs +199 -0
  31. package/dist/lib/browser/spaces-ready-F57ITJDR.mjs.map +7 -0
  32. package/dist/lib/browser/state-6DCY5YJP.mjs +47 -0
  33. package/dist/lib/browser/state-6DCY5YJP.mjs.map +7 -0
  34. package/dist/lib/browser/types/index.mjs +14 -5
  35. package/dist/lib/node/app-graph-builder-6N4TEVHH.cjs +370 -0
  36. package/dist/lib/node/app-graph-builder-6N4TEVHH.cjs.map +7 -0
  37. package/dist/lib/node/app-graph-serializer-AWKVTYAB.cjs +88 -0
  38. package/dist/lib/node/app-graph-serializer-AWKVTYAB.cjs.map +7 -0
  39. package/dist/lib/node/chunk-2RCJT3P2.cjs +1712 -0
  40. package/dist/lib/node/chunk-2RCJT3P2.cjs.map +7 -0
  41. package/dist/lib/node/chunk-I2LRRRMV.cjs +150 -0
  42. package/dist/lib/node/chunk-I2LRRRMV.cjs.map +7 -0
  43. package/dist/lib/node/chunk-MMXP2NHE.cjs +556 -0
  44. package/dist/lib/node/chunk-MMXP2NHE.cjs.map +7 -0
  45. package/dist/lib/node/chunk-SPCSJ2CY.cjs +345 -0
  46. package/dist/lib/node/chunk-SPCSJ2CY.cjs.map +7 -0
  47. package/dist/lib/node/chunk-UX3U4RU2.cjs +42 -0
  48. package/dist/lib/node/chunk-UX3U4RU2.cjs.map +7 -0
  49. package/dist/lib/node/{meta.cjs → chunk-WZR6OAN3.cjs} +13 -13
  50. package/dist/lib/node/chunk-WZR6OAN3.cjs.map +7 -0
  51. package/dist/lib/node/identity-created-JNDKMFKI.cjs +44 -0
  52. package/dist/lib/node/identity-created-JNDKMFKI.cjs.map +7 -0
  53. package/dist/lib/node/index.cjs +176 -3506
  54. package/dist/lib/node/index.cjs.map +4 -4
  55. package/dist/lib/node/intent-resolver-NVTAESKB.cjs +536 -0
  56. package/dist/lib/node/intent-resolver-NVTAESKB.cjs.map +7 -0
  57. package/dist/lib/node/meta.json +1 -1
  58. package/dist/lib/node/react-root-YCHSAYQE.cjs +50 -0
  59. package/dist/lib/node/react-root-YCHSAYQE.cjs.map +7 -0
  60. package/dist/lib/node/react-surface-ANSZ4FKK.cjs +229 -0
  61. package/dist/lib/node/react-surface-ANSZ4FKK.cjs.map +7 -0
  62. package/dist/lib/node/settings-RBBL22DJ.cjs +38 -0
  63. package/dist/lib/node/settings-RBBL22DJ.cjs.map +7 -0
  64. package/dist/lib/node/spaces-ready-WHU4J6E5.cjs +210 -0
  65. package/dist/lib/node/spaces-ready-WHU4J6E5.cjs.map +7 -0
  66. package/dist/lib/node/state-WPZC4JXB.cjs +61 -0
  67. package/dist/lib/node/state-WPZC4JXB.cjs.map +7 -0
  68. package/dist/lib/node/types/index.cjs +23 -14
  69. package/dist/lib/node/types/index.cjs.map +2 -2
  70. package/dist/lib/node-esm/app-graph-builder-MS6BI5EW.mjs +368 -0
  71. package/dist/lib/node-esm/app-graph-builder-MS6BI5EW.mjs.map +7 -0
  72. package/dist/lib/node-esm/app-graph-serializer-AWAWDSCM.mjs +81 -0
  73. package/dist/lib/node-esm/app-graph-serializer-AWAWDSCM.mjs.map +7 -0
  74. package/dist/lib/node-esm/chunk-4HICD7AU.mjs +1716 -0
  75. package/dist/lib/node-esm/chunk-4HICD7AU.mjs.map +7 -0
  76. package/dist/lib/node-esm/chunk-77RE7Y5J.mjs +529 -0
  77. package/dist/lib/node-esm/chunk-77RE7Y5J.mjs.map +7 -0
  78. package/dist/lib/node-esm/chunk-ESWV7ICX.mjs +134 -0
  79. package/dist/lib/node-esm/chunk-ESWV7ICX.mjs.map +7 -0
  80. package/dist/lib/node-esm/chunk-ICCM4YRJ.mjs +15 -0
  81. package/dist/lib/node-esm/chunk-ICCM4YRJ.mjs.map +7 -0
  82. package/dist/lib/node-esm/chunk-LGL4A5B5.mjs +23 -0
  83. package/dist/lib/node-esm/chunk-LGL4A5B5.mjs.map +7 -0
  84. package/dist/lib/node-esm/chunk-S6VAU6VJ.mjs +317 -0
  85. package/dist/lib/node-esm/chunk-S6VAU6VJ.mjs.map +7 -0
  86. package/dist/lib/node-esm/identity-created-3AUSSVEK.mjs +29 -0
  87. package/dist/lib/node-esm/identity-created-3AUSSVEK.mjs.map +7 -0
  88. package/dist/lib/node-esm/index.mjs +193 -3521
  89. package/dist/lib/node-esm/index.mjs.map +4 -4
  90. package/dist/lib/node-esm/intent-resolver-KJ67TU34.mjs +538 -0
  91. package/dist/lib/node-esm/intent-resolver-KJ67TU34.mjs.map +7 -0
  92. package/dist/lib/node-esm/meta.json +1 -1
  93. package/dist/lib/node-esm/react-root-NBQQKAZD.mjs +29 -0
  94. package/dist/lib/node-esm/react-root-NBQQKAZD.mjs.map +7 -0
  95. package/dist/lib/node-esm/react-surface-G2H5T2D2.mjs +232 -0
  96. package/dist/lib/node-esm/react-surface-G2H5T2D2.mjs.map +7 -0
  97. package/dist/lib/node-esm/settings-VBAUB37B.mjs +25 -0
  98. package/dist/lib/node-esm/settings-VBAUB37B.mjs.map +7 -0
  99. package/dist/lib/node-esm/spaces-ready-ABADUX2P.mjs +200 -0
  100. package/dist/lib/node-esm/spaces-ready-ABADUX2P.mjs.map +7 -0
  101. package/dist/lib/node-esm/state-5GH2D5U4.mjs +48 -0
  102. package/dist/lib/node-esm/state-5GH2D5U4.mjs.map +7 -0
  103. package/dist/lib/node-esm/types/index.mjs +14 -5
  104. package/dist/types/src/SpacePlugin.d.ts +3 -22
  105. package/dist/types/src/SpacePlugin.d.ts.map +1 -1
  106. package/dist/types/src/capabilities/app-graph-builder.d.ts +181 -0
  107. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  108. package/dist/types/src/capabilities/app-graph-serializer.d.ts +4 -0
  109. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -0
  110. package/dist/types/src/capabilities/capabilities.d.ts +21 -0
  111. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
  112. package/dist/types/src/capabilities/identity-created.d.ts +4 -0
  113. package/dist/types/src/capabilities/identity-created.d.ts.map +1 -0
  114. package/dist/types/src/capabilities/index.d.ts +196 -0
  115. package/dist/types/src/capabilities/index.d.ts.map +1 -0
  116. package/dist/types/src/capabilities/intent-resolver.d.ts +9 -0
  117. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -0
  118. package/dist/types/src/capabilities/react-root.d.ts +7 -0
  119. package/dist/types/src/capabilities/react-root.d.ts.map +1 -0
  120. package/dist/types/src/capabilities/react-surface.d.ts +7 -0
  121. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  122. package/dist/types/src/capabilities/settings.d.ts +4 -0
  123. package/dist/types/src/capabilities/settings.d.ts.map +1 -0
  124. package/dist/types/src/capabilities/spaces-ready.d.ts +4 -0
  125. package/dist/types/src/capabilities/spaces-ready.d.ts.map +1 -0
  126. package/dist/types/src/capabilities/state.d.ts +5 -0
  127. package/dist/types/src/capabilities/state.d.ts.map +1 -0
  128. package/dist/types/src/components/AdvancedObjectSettings/AdvancedObjectSettings.d.ts +7 -0
  129. package/dist/types/src/components/AdvancedObjectSettings/AdvancedObjectSettings.d.ts.map +1 -0
  130. package/dist/types/src/components/AdvancedObjectSettings/ForeignKeys.d.ts +8 -0
  131. package/dist/types/src/components/AdvancedObjectSettings/ForeignKeys.d.ts.map +1 -0
  132. package/dist/types/src/components/AdvancedObjectSettings/index.d.ts +2 -0
  133. package/dist/types/src/components/AdvancedObjectSettings/index.d.ts.map +1 -0
  134. package/dist/types/src/components/AwaitingObject.d.ts.map +1 -1
  135. package/dist/types/src/components/BaseObjectSettings.d.ts +7 -0
  136. package/dist/types/src/components/BaseObjectSettings.d.ts.map +1 -0
  137. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts +5 -4
  138. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
  139. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +9 -9
  140. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
  141. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts +1 -0
  142. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts.map +1 -1
  143. package/dist/types/src/components/JoinDialog.d.ts +1 -0
  144. package/dist/types/src/components/JoinDialog.d.ts.map +1 -1
  145. package/dist/types/src/components/PopoverRenameObject.d.ts +1 -0
  146. package/dist/types/src/components/PopoverRenameObject.d.ts.map +1 -1
  147. package/dist/types/src/components/PopoverRenameSpace.d.ts +1 -0
  148. package/dist/types/src/components/PopoverRenameSpace.d.ts.map +1 -1
  149. package/dist/types/src/components/ShareSpaceButton.d.ts.map +1 -1
  150. package/dist/types/src/components/SpacePluginSettings.d.ts.map +1 -1
  151. package/dist/types/src/components/SpacePresence.d.ts +9 -6
  152. package/dist/types/src/components/SpacePresence.d.ts.map +1 -1
  153. package/dist/types/src/components/SpacePresence.stories.d.ts +1 -1
  154. package/dist/types/src/components/SpacePresence.stories.d.ts.map +1 -1
  155. package/dist/types/src/components/SpaceSettings/SpaceSettingsDialog.d.ts +1 -0
  156. package/dist/types/src/components/SpaceSettings/SpaceSettingsDialog.d.ts.map +1 -1
  157. package/dist/types/src/components/SpaceSettings/SpaceSettingsDialog.stories.d.ts.map +1 -1
  158. package/dist/types/src/components/SpaceSettings/SpaceSettingsPanel.d.ts +4 -3
  159. package/dist/types/src/components/SpaceSettings/SpaceSettingsPanel.d.ts.map +1 -1
  160. package/dist/types/src/components/SpaceSettings/SpaceSettingsPanel.stories.d.ts.map +1 -1
  161. package/dist/types/src/components/SyncStatus/InlineSyncStatus.d.ts +3 -3
  162. package/dist/types/src/components/SyncStatus/InlineSyncStatus.d.ts.map +1 -1
  163. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
  164. package/dist/types/src/components/SyncStatus/SyncStatusDetail.stories.d.ts +2 -2
  165. package/dist/types/src/components/SyncStatus/SyncStatusDetail.stories.d.ts.map +1 -1
  166. package/dist/types/src/components/index.d.ts +2 -1
  167. package/dist/types/src/components/index.d.ts.map +1 -1
  168. package/dist/types/src/events.d.ts +5 -0
  169. package/dist/types/src/events.d.ts.map +1 -0
  170. package/dist/types/src/hooks/index.d.ts +2 -0
  171. package/dist/types/src/hooks/index.d.ts.map +1 -0
  172. package/dist/types/src/hooks/usePath.d.ts +11 -0
  173. package/dist/types/src/hooks/usePath.d.ts.map +1 -0
  174. package/dist/types/src/index.d.ts +3 -5
  175. package/dist/types/src/index.d.ts.map +1 -1
  176. package/dist/types/src/meta.d.ts +2 -27
  177. package/dist/types/src/meta.d.ts.map +1 -1
  178. package/dist/types/src/translations.d.ts +18 -3
  179. package/dist/types/src/translations.d.ts.map +1 -1
  180. package/dist/types/src/types/collection.d.ts +8 -12
  181. package/dist/types/src/types/collection.d.ts.map +1 -1
  182. package/dist/types/src/types/thread.d.ts +180 -186
  183. package/dist/types/src/types/thread.d.ts.map +1 -1
  184. package/dist/types/src/types/types.d.ts +228 -16
  185. package/dist/types/src/types/types.d.ts.map +1 -1
  186. package/dist/types/src/util.d.ts +9 -8
  187. package/dist/types/src/util.d.ts.map +1 -1
  188. package/dist/types/tsconfig.tsbuildinfo +1 -0
  189. package/package.json +39 -46
  190. package/src/SpacePlugin.tsx +121 -1538
  191. package/src/capabilities/app-graph-builder.ts +393 -0
  192. package/src/capabilities/app-graph-serializer.ts +73 -0
  193. package/src/capabilities/capabilities.ts +26 -0
  194. package/src/capabilities/identity-created.ts +26 -0
  195. package/src/capabilities/index.ts +17 -0
  196. package/src/capabilities/intent-resolver.ts +518 -0
  197. package/src/capabilities/react-root.tsx +20 -0
  198. package/src/capabilities/react-surface.tsx +226 -0
  199. package/src/capabilities/settings.ts +17 -0
  200. package/src/capabilities/spaces-ready.ts +230 -0
  201. package/src/capabilities/state.ts +45 -0
  202. package/src/components/AdvancedObjectSettings/AdvancedObjectSettings.tsx +72 -0
  203. package/src/components/AdvancedObjectSettings/ForeignKeys.tsx +51 -0
  204. package/src/components/AdvancedObjectSettings/index.ts +5 -0
  205. package/src/components/AwaitingObject.tsx +15 -19
  206. package/src/components/{DefaultObjectSettings.tsx → BaseObjectSettings.tsx} +2 -2
  207. package/src/components/CreateDialog/CreateObjectDialog.tsx +49 -38
  208. package/src/components/CreateDialog/CreateObjectPanel.tsx +137 -101
  209. package/src/components/CreateDialog/CreateSpaceDialog.tsx +22 -17
  210. package/src/components/JoinDialog.tsx +40 -48
  211. package/src/components/PersistenceStatus.tsx +1 -1
  212. package/src/components/PopoverRenameObject.tsx +2 -0
  213. package/src/components/PopoverRenameSpace.tsx +2 -0
  214. package/src/components/ShareSpaceButton.tsx +5 -4
  215. package/src/components/SpacePluginSettings.tsx +5 -16
  216. package/src/components/SpacePresence.stories.tsx +27 -19
  217. package/src/components/SpacePresence.tsx +41 -21
  218. package/src/components/SpaceSettings/SpaceSettingsDialog.stories.tsx +2 -3
  219. package/src/components/SpaceSettings/SpaceSettingsDialog.tsx +19 -2
  220. package/src/components/SpaceSettings/SpaceSettingsPanel.stories.tsx +7 -5
  221. package/src/components/SpaceSettings/SpaceSettingsPanel.tsx +7 -7
  222. package/src/components/SyncStatus/InlineSyncStatus.tsx +37 -27
  223. package/src/components/SyncStatus/SyncStatus.tsx +2 -1
  224. package/src/components/SyncStatus/SyncStatusDetail.stories.tsx +55 -51
  225. package/src/components/index.ts +2 -1
  226. package/src/events.ts +12 -0
  227. package/src/hooks/index.ts +5 -0
  228. package/src/hooks/usePath.ts +44 -0
  229. package/src/index.ts +3 -7
  230. package/src/meta.ts +2 -29
  231. package/src/translations.ts +7 -2
  232. package/src/types/collection.ts +3 -3
  233. package/src/types/thread.ts +6 -6
  234. package/src/types/types.ts +177 -42
  235. package/src/util.tsx +82 -65
  236. package/dist/lib/browser/chunk-FTKV32QZ.mjs +0 -43
  237. package/dist/lib/browser/chunk-FTKV32QZ.mjs.map +0 -7
  238. package/dist/lib/browser/chunk-MWKXNS5S.mjs +0 -124
  239. package/dist/lib/browser/chunk-MWKXNS5S.mjs.map +0 -7
  240. package/dist/lib/browser/meta.mjs +0 -15
  241. package/dist/lib/browser/meta.mjs.map +0 -7
  242. package/dist/lib/node/chunk-6SNOZF7Y.cjs +0 -152
  243. package/dist/lib/node/chunk-6SNOZF7Y.cjs.map +0 -7
  244. package/dist/lib/node/chunk-QNVEU2UD.cjs +0 -69
  245. package/dist/lib/node/chunk-QNVEU2UD.cjs.map +0 -7
  246. package/dist/lib/node/meta.cjs.map +0 -7
  247. package/dist/lib/node-esm/chunk-OHEAWSCA.mjs +0 -126
  248. package/dist/lib/node-esm/chunk-OHEAWSCA.mjs.map +0 -7
  249. package/dist/lib/node-esm/chunk-UMV7XREB.mjs +0 -45
  250. package/dist/lib/node-esm/chunk-UMV7XREB.mjs.map +0 -7
  251. package/dist/lib/node-esm/meta.mjs +0 -16
  252. package/dist/lib/node-esm/meta.mjs.map +0 -7
  253. package/dist/types/src/components/DefaultObjectSettings.d.ts +0 -7
  254. package/dist/types/src/components/DefaultObjectSettings.d.ts.map +0 -1
  255. package/dist/types/src/components/SyncStatus/InlineSyncStatus.stories.d.ts +0 -6
  256. package/dist/types/src/components/SyncStatus/InlineSyncStatus.stories.d.ts.map +0 -1
  257. package/src/components/SyncStatus/InlineSyncStatus.stories.tsx +0 -57
@@ -0,0 +1,518 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import {
6
+ Capabilities,
7
+ contributes,
8
+ createIntent,
9
+ createResolver,
10
+ LayoutAction,
11
+ type PluginsContext,
12
+ } from '@dxos/app-framework';
13
+ import { type Expando, getTypename, type HasId } from '@dxos/echo-schema';
14
+ import { invariant } from '@dxos/invariant';
15
+ import { create, makeRef, type ReactiveObject } from '@dxos/live-object';
16
+ import { Migrations } from '@dxos/migrations';
17
+ import { AttentionCapabilities } from '@dxos/plugin-attention';
18
+ import { ClientCapabilities } from '@dxos/plugin-client';
19
+ import { ObservabilityAction } from '@dxos/plugin-observability/types';
20
+ import { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata';
21
+ import { isSpace, getSpace, SpaceState, type Space, fullyQualifiedId, isEchoObject } from '@dxos/react-client/echo';
22
+
23
+ import { SpaceCapabilities } from './capabilities';
24
+ import {
25
+ CREATE_SPACE_DIALOG,
26
+ JOIN_DIALOG,
27
+ SPACE_SETTINGS_DIALOG,
28
+ type SpaceSettingsDialogProps,
29
+ type JoinDialogProps,
30
+ POPOVER_RENAME_SPACE,
31
+ CREATE_OBJECT_DIALOG,
32
+ type CreateObjectDialogProps,
33
+ POPOVER_RENAME_OBJECT,
34
+ } from '../components';
35
+ import { SPACE_PLUGIN } from '../meta';
36
+ import { CollectionAction, CollectionType, SpaceAction } from '../types';
37
+ import { cloneObject, COMPOSER_SPACE_LOCK, getNestedObjects } from '../util';
38
+
39
+ // TODO(wittjosiah): Remove.
40
+ const SPACE_MAX_OBJECTS = 500;
41
+
42
+ type IntentResolverOptions = {
43
+ createInvitationUrl: (invitationCode: string) => string;
44
+ context: PluginsContext;
45
+ observability?: boolean;
46
+ };
47
+
48
+ export default ({ createInvitationUrl, context, observability }: IntentResolverOptions) => {
49
+ const resolve = (typename: string) =>
50
+ context.requestCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};
51
+
52
+ return contributes(Capabilities.IntentResolver, [
53
+ createResolver({
54
+ intent: SpaceAction.OpenCreateSpace,
55
+ resolve: () => ({
56
+ intents: [
57
+ createIntent(LayoutAction.UpdateDialog, {
58
+ part: 'dialog',
59
+ subject: CREATE_SPACE_DIALOG,
60
+ options: {
61
+ blockAlign: 'start',
62
+ },
63
+ }),
64
+ ],
65
+ }),
66
+ }),
67
+ createResolver({
68
+ intent: SpaceAction.Create,
69
+ resolve: async ({ name, edgeReplication }) => {
70
+ const client = context.requestCapability(ClientCapabilities.Client);
71
+ const space = await client.spaces.create({ name });
72
+ if (edgeReplication) {
73
+ await space.internal.setEdgeReplicationPreference(EdgeReplicationSetting.ENABLED);
74
+ }
75
+ await space.waitUntilReady();
76
+ const collection = create(CollectionType, { objects: [], views: {} });
77
+ space.properties[CollectionType.typename] = makeRef(collection);
78
+
79
+ if (Migrations.versionProperty) {
80
+ space.properties[Migrations.versionProperty] = Migrations.targetVersion;
81
+ }
82
+
83
+ return {
84
+ data: {
85
+ id: space.id,
86
+ subject: [space.id],
87
+ space,
88
+ },
89
+ intents: [
90
+ ...(observability
91
+ ? [
92
+ createIntent(ObservabilityAction.SendEvent, {
93
+ name: 'space.create',
94
+ properties: {
95
+ spaceId: space.id,
96
+ },
97
+ }),
98
+ ]
99
+ : []),
100
+ ],
101
+ };
102
+ },
103
+ }),
104
+ createResolver({
105
+ intent: SpaceAction.Join,
106
+ resolve: ({ invitationCode }) => ({
107
+ intents: [
108
+ createIntent(LayoutAction.UpdateDialog, {
109
+ part: 'dialog',
110
+ subject: JOIN_DIALOG,
111
+ options: {
112
+ blockAlign: 'start',
113
+ props: {
114
+ initialInvitationCode: invitationCode,
115
+ } satisfies Partial<JoinDialogProps>,
116
+ },
117
+ }),
118
+ ],
119
+ }),
120
+ }),
121
+ createResolver({
122
+ intent: SpaceAction.Share,
123
+ filter: (data): data is { space: Space } => !data.space.properties[COMPOSER_SPACE_LOCK],
124
+ resolve: ({ space }) => {
125
+ const attention = context.requestCapability(AttentionCapabilities.Attention);
126
+ const current = attention.current.at(-1);
127
+ const target = current?.startsWith(space.id) ? current : undefined;
128
+
129
+ return {
130
+ intents: [
131
+ createIntent(LayoutAction.UpdateDialog, {
132
+ part: 'dialog',
133
+ subject: SPACE_SETTINGS_DIALOG,
134
+ options: {
135
+ blockAlign: 'start',
136
+ props: {
137
+ space,
138
+ target,
139
+ initialTab: 'members',
140
+ createInvitationUrl,
141
+ } satisfies Partial<SpaceSettingsDialogProps>,
142
+ },
143
+ }),
144
+ ...(observability
145
+ ? [
146
+ createIntent(ObservabilityAction.SendEvent, {
147
+ name: 'space.share',
148
+ properties: {
149
+ space: space.id,
150
+ },
151
+ }),
152
+ ]
153
+ : []),
154
+ ],
155
+ };
156
+ },
157
+ }),
158
+ createResolver({
159
+ intent: SpaceAction.Lock,
160
+ resolve: ({ space }) => {
161
+ space.properties[COMPOSER_SPACE_LOCK] = true;
162
+ return {
163
+ intents: [
164
+ ...(observability
165
+ ? [
166
+ createIntent(ObservabilityAction.SendEvent, {
167
+ name: 'space.lock',
168
+ properties: {
169
+ spaceId: space.id,
170
+ },
171
+ }),
172
+ ]
173
+ : []),
174
+ ],
175
+ };
176
+ },
177
+ }),
178
+ createResolver({
179
+ intent: SpaceAction.Unlock,
180
+ resolve: ({ space }) => {
181
+ space.properties[COMPOSER_SPACE_LOCK] = false;
182
+ return {
183
+ intents: [
184
+ ...(observability
185
+ ? [
186
+ createIntent(ObservabilityAction.SendEvent, {
187
+ name: 'space.unlock',
188
+ properties: {
189
+ spaceId: space.id,
190
+ },
191
+ }),
192
+ ]
193
+ : []),
194
+ ],
195
+ };
196
+ },
197
+ }),
198
+ createResolver({
199
+ intent: SpaceAction.Rename,
200
+ resolve: ({ caller, space }) => {
201
+ return {
202
+ intents: [
203
+ createIntent(LayoutAction.UpdatePopover, {
204
+ part: 'popover',
205
+ subject: POPOVER_RENAME_SPACE,
206
+ options: {
207
+ anchorId: `dxos.org/ui/${caller}/${space.id}`,
208
+ props: space,
209
+ },
210
+ }),
211
+ ],
212
+ };
213
+ },
214
+ }),
215
+ createResolver({
216
+ intent: SpaceAction.OpenSettings,
217
+ resolve: ({ space }) => {
218
+ return {
219
+ intents: [
220
+ createIntent(LayoutAction.UpdateDialog, {
221
+ part: 'dialog',
222
+ subject: SPACE_SETTINGS_DIALOG,
223
+ options: {
224
+ blockAlign: 'start',
225
+ props: {
226
+ space,
227
+ initialTab: 'settings',
228
+ createInvitationUrl,
229
+ } satisfies Partial<SpaceSettingsDialogProps>,
230
+ },
231
+ }),
232
+ ],
233
+ };
234
+ },
235
+ }),
236
+ createResolver({
237
+ intent: SpaceAction.Open,
238
+ resolve: async ({ space }) => {
239
+ await space.open();
240
+ },
241
+ }),
242
+ createResolver({
243
+ intent: SpaceAction.Close,
244
+ resolve: async ({ space }) => {
245
+ await space.close();
246
+ },
247
+ }),
248
+ createResolver({
249
+ intent: SpaceAction.Migrate,
250
+ resolve: async ({ space, version }) => {
251
+ const state = context.requestCapability(SpaceCapabilities.MutableState);
252
+
253
+ if (space.state.get() === SpaceState.SPACE_REQUIRES_MIGRATION) {
254
+ state.sdkMigrationRunning[space.id] = true;
255
+ await space.internal.migrate();
256
+ state.sdkMigrationRunning[space.id] = false;
257
+ }
258
+ const result = await Migrations.migrate(space, version);
259
+ return {
260
+ data: result,
261
+ intents: [
262
+ ...(observability
263
+ ? [
264
+ createIntent(ObservabilityAction.SendEvent, {
265
+ name: 'space.migrate',
266
+ properties: {
267
+ spaceId: space.id,
268
+ version,
269
+ },
270
+ }),
271
+ ]
272
+ : []),
273
+ ],
274
+ };
275
+ },
276
+ }),
277
+ createResolver({
278
+ intent: SpaceAction.OpenCreateObject,
279
+ resolve: ({ target, navigable = true }) => {
280
+ const state = context.requestCapability(SpaceCapabilities.State);
281
+
282
+ return {
283
+ intents: [
284
+ createIntent(LayoutAction.UpdateDialog, {
285
+ part: 'dialog',
286
+ subject: CREATE_OBJECT_DIALOG,
287
+ options: {
288
+ blockAlign: 'start',
289
+ props: {
290
+ target,
291
+ shouldNavigate: navigable
292
+ ? (object: ReactiveObject<any>) => !(object instanceof CollectionType) || state.navigableCollections
293
+ : () => false,
294
+ } satisfies Partial<CreateObjectDialogProps>,
295
+ },
296
+ }),
297
+ ],
298
+ };
299
+ },
300
+ }),
301
+ createResolver({
302
+ intent: SpaceAction.AddObject,
303
+ resolve: async ({ target, object }) => {
304
+ const space = isSpace(target) ? target : getSpace(target);
305
+ invariant(space, 'Space not found.');
306
+
307
+ if (space.db.coreDatabase.getAllObjectIds().length >= SPACE_MAX_OBJECTS) {
308
+ return {
309
+ error: new Error('Space limit reached.'),
310
+ intents: [
311
+ createIntent(LayoutAction.AddToast, {
312
+ part: 'toast',
313
+ subject: {
314
+ id: `${SPACE_PLUGIN}/space-limit`,
315
+ title: ['space limit label', { ns: SPACE_PLUGIN }],
316
+ description: ['space limit description', { ns: SPACE_PLUGIN }],
317
+ duration: 5_000,
318
+ icon: 'ph--warning--regular',
319
+ actionLabel: ['remove deleted objects label', { ns: SPACE_PLUGIN }],
320
+ actionAlt: ['remove deleted objects alt', { ns: SPACE_PLUGIN }],
321
+ closeLabel: ['close label', { ns: 'os' }],
322
+ onAction: () => space.db.coreDatabase.unlinkDeletedObjects(),
323
+ },
324
+ }),
325
+ ...(observability
326
+ ? [
327
+ createIntent(ObservabilityAction.SendEvent, {
328
+ name: 'space.limit',
329
+ properties: {
330
+ spaceId: space.id,
331
+ },
332
+ }),
333
+ ]
334
+ : []),
335
+ ],
336
+ };
337
+ }
338
+
339
+ if (target instanceof CollectionType) {
340
+ target.objects.push(makeRef(object as HasId));
341
+ } else if (isSpace(target)) {
342
+ const collection = space.properties[CollectionType.typename]?.target;
343
+ if (collection instanceof CollectionType) {
344
+ collection.objects.push(makeRef(object as HasId));
345
+ } else {
346
+ // TODO(wittjosiah): Can't add non-echo objects by including in a collection because of types.
347
+ const collection = create(CollectionType, { objects: [makeRef(object as HasId)], views: {} });
348
+ space.properties[CollectionType.typename] = makeRef(collection);
349
+ }
350
+ }
351
+
352
+ return {
353
+ data: {
354
+ id: fullyQualifiedId(object),
355
+ subject: [fullyQualifiedId(object)],
356
+ object: object as HasId,
357
+ },
358
+ intents: [
359
+ ...(observability
360
+ ? [
361
+ createIntent(ObservabilityAction.SendEvent, {
362
+ name: 'space.object.add',
363
+ properties: {
364
+ spaceId: space.id,
365
+ objectId: object.id,
366
+ typename: getTypename(object),
367
+ },
368
+ }),
369
+ ]
370
+ : []),
371
+ ],
372
+ };
373
+ },
374
+ }),
375
+ createResolver({
376
+ intent: SpaceAction.RemoveObjects,
377
+ resolve: async ({ objects, target, deletionData }, undo) => {
378
+ const layout = context.requestCapability(Capabilities.Layout);
379
+
380
+ // All objects must be a member of the same space.
381
+ const space = getSpace(objects[0]);
382
+ invariant(space && objects.every((obj) => isEchoObject(obj) && getSpace(obj) === space));
383
+ const openObjectIds = new Set<string>(layout.active);
384
+
385
+ if (!undo) {
386
+ const parentCollection: CollectionType = target ?? space.properties[CollectionType.typename]?.target;
387
+ const nestedObjectsList = await Promise.all(objects.map((obj) => getNestedObjects(obj, resolve)));
388
+
389
+ const deletionData = {
390
+ objects,
391
+ parentCollection,
392
+ indices: objects.map((obj) =>
393
+ parentCollection instanceof CollectionType
394
+ ? parentCollection.objects.findIndex((object) => object.target === obj)
395
+ : -1,
396
+ ),
397
+ nestedObjectsList,
398
+ wasActive: objects
399
+ .flatMap((obj, i) => [obj, ...nestedObjectsList[i]])
400
+ .map((obj) => fullyQualifiedId(obj))
401
+ .filter((id) => openObjectIds.has(id)),
402
+ } satisfies SpaceAction.DeletionData;
403
+
404
+ if (deletionData.parentCollection instanceof CollectionType) {
405
+ [...deletionData.indices]
406
+ .sort((a, b) => b - a)
407
+ .forEach((index: number) => {
408
+ if (index !== -1) {
409
+ deletionData.parentCollection.objects.splice(index, 1);
410
+ }
411
+ });
412
+ }
413
+
414
+ deletionData.nestedObjectsList.flat().forEach((obj) => {
415
+ space.db.remove(obj);
416
+ });
417
+ objects.forEach((obj) => space.db.remove(obj));
418
+
419
+ const undoMessageKey = objects.some((obj) => obj instanceof CollectionType)
420
+ ? 'collection deleted label'
421
+ : objects.length > 1
422
+ ? 'objects deleted label'
423
+ : 'object deleted label';
424
+
425
+ return {
426
+ undoable: {
427
+ // TODO(ZaymonFC): Pluralize if more than one object.
428
+ message: [undoMessageKey, { ns: SPACE_PLUGIN }],
429
+ data: { deletionData },
430
+ },
431
+ intents:
432
+ deletionData.wasActive.length > 0
433
+ ? [
434
+ createIntent(LayoutAction.Close, {
435
+ part: 'main',
436
+ subject: deletionData.wasActive,
437
+ options: { state: false },
438
+ }),
439
+ ]
440
+ : undefined,
441
+ };
442
+ } else {
443
+ if (
444
+ deletionData?.objects?.length &&
445
+ deletionData.objects.every(isEchoObject) &&
446
+ deletionData.parentCollection instanceof CollectionType
447
+ ) {
448
+ // Restore the object to the space.
449
+ const restoredObjects = deletionData.objects.map((obj: Expando) => space.db.add(obj));
450
+
451
+ // Restore nested objects to the space.
452
+ deletionData.nestedObjectsList.flat().forEach((obj: Expando) => {
453
+ space.db.add(obj);
454
+ });
455
+
456
+ deletionData.indices.forEach((index: number, i: number) => {
457
+ if (index !== -1) {
458
+ deletionData.parentCollection.objects.splice(index, 0, makeRef(restoredObjects[i] as Expando));
459
+ }
460
+ });
461
+
462
+ return {
463
+ intents:
464
+ deletionData.wasActive.length > 0
465
+ ? [
466
+ createIntent(LayoutAction.Open, {
467
+ part: 'main',
468
+ subject: deletionData.wasActive,
469
+ }),
470
+ ]
471
+ : undefined,
472
+ };
473
+ }
474
+ }
475
+ },
476
+ }),
477
+ createResolver({
478
+ intent: SpaceAction.RenameObject,
479
+ resolve: async ({ object, caller }) => ({
480
+ intents: [
481
+ createIntent(LayoutAction.UpdatePopover, {
482
+ part: 'popover',
483
+ subject: POPOVER_RENAME_OBJECT,
484
+ options: {
485
+ anchorId: `dxos.org/ui/${caller}/${fullyQualifiedId(object)}`,
486
+ props: object,
487
+ },
488
+ }),
489
+ ],
490
+ }),
491
+ }),
492
+ createResolver({
493
+ intent: SpaceAction.DuplicateObject,
494
+ resolve: async ({ object, target }) => {
495
+ const space = isSpace(target) ? target : getSpace(target);
496
+ invariant(space, 'Space not found.');
497
+
498
+ const newObject = await cloneObject(object, resolve, space);
499
+ return {
500
+ intents: [createIntent(SpaceAction.AddObject, { object: newObject, target })],
501
+ };
502
+ },
503
+ }),
504
+ createResolver({
505
+ intent: SpaceAction.WaitForObject,
506
+ resolve: async ({ id }) => {
507
+ const state = context.requestCapability(SpaceCapabilities.MutableState);
508
+ state.awaiting = id;
509
+ },
510
+ }),
511
+ createResolver({
512
+ intent: CollectionAction.Create,
513
+ resolve: async ({ name }) => ({
514
+ data: { object: create(CollectionType, { name, objects: [], views: {} }) },
515
+ }),
516
+ }),
517
+ ]);
518
+ };
@@ -0,0 +1,20 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ import { Capabilities, contributes, useCapability } from '@dxos/app-framework';
8
+
9
+ import { SpaceCapabilities } from './capabilities';
10
+ import { AwaitingObject } from '../components';
11
+ import { SPACE_PLUGIN } from '../meta';
12
+
13
+ export default () =>
14
+ contributes(Capabilities.ReactRoot, {
15
+ id: SPACE_PLUGIN,
16
+ root: () => {
17
+ const state = useCapability(SpaceCapabilities.State);
18
+ return state.awaiting ? <AwaitingObject id={state.awaiting} /> : null;
19
+ },
20
+ });