@dxos/plugin-space 0.7.5-main.9d26e3a → 0.7.5-main.b19bfc8

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