@dxos/plugin-space 0.7.5-main.e9bb01b → 0.7.5-staging.2ff1350

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 (224) hide show
  1. package/dist/lib/browser/{app-graph-builder-J4NX44Y4.mjs → app-graph-builder-MGK5HWPZ.mjs} +21 -100
  2. package/dist/lib/browser/app-graph-builder-MGK5HWPZ.mjs.map +7 -0
  3. package/dist/lib/browser/{app-graph-serializer-QF7VVRCV.mjs → app-graph-serializer-FOWFLYGU.mjs} +4 -4
  4. package/dist/lib/browser/{chunk-6UIFMVVI.mjs → chunk-23RVI5FZ.mjs} +16 -5
  5. package/dist/lib/browser/chunk-23RVI5FZ.mjs.map +7 -0
  6. package/dist/lib/browser/{chunk-RLZQJD47.mjs → chunk-NU7WDVGN.mjs} +2 -1
  7. package/dist/lib/browser/chunk-NU7WDVGN.mjs.map +7 -0
  8. package/dist/lib/browser/{chunk-XZ2NH3CP.mjs → chunk-POARSSRI.mjs} +306 -210
  9. package/dist/lib/browser/chunk-POARSSRI.mjs.map +7 -0
  10. package/dist/lib/browser/{chunk-SDK7RZI3.mjs → chunk-UDWHTKB5.mjs} +6 -3
  11. package/dist/lib/browser/chunk-UDWHTKB5.mjs.map +7 -0
  12. package/dist/lib/browser/{chunk-XPZ6IIXF.mjs → chunk-ULA2UQJ4.mjs} +15 -1
  13. package/dist/lib/browser/chunk-ULA2UQJ4.mjs.map +7 -0
  14. package/dist/lib/browser/{identity-created-25TK5XNO.mjs → identity-created-FYGS6TBH.mjs} +2 -2
  15. package/dist/lib/browser/index.mjs +55 -21
  16. package/dist/lib/browser/index.mjs.map +3 -3
  17. package/dist/lib/browser/{intent-resolver-IEDVV74T.mjs → intent-resolver-E2UU3DAS.mjs} +86 -54
  18. package/dist/lib/browser/intent-resolver-E2UU3DAS.mjs.map +7 -0
  19. package/dist/lib/browser/meta.json +1 -1
  20. package/dist/lib/browser/{react-root-6VRPRLQR.mjs → react-root-STUND2SO.mjs} +5 -5
  21. package/dist/lib/browser/{react-surface-DMNDXLZ7.mjs → react-surface-P7CKFNJR.mjs} +16 -22
  22. package/dist/lib/browser/react-surface-P7CKFNJR.mjs.map +7 -0
  23. package/dist/lib/browser/schema-5W3DSY2E.mjs +24 -0
  24. package/dist/lib/browser/schema-5W3DSY2E.mjs.map +7 -0
  25. package/dist/lib/browser/{settings-K4JPYYEM.mjs → settings-PHPCXX33.mjs} +2 -2
  26. package/dist/lib/browser/{spaces-ready-2MUWWVVO.mjs → spaces-ready-K47RR7N2.mjs} +4 -4
  27. package/dist/lib/browser/{state-6DCY5YJP.mjs → state-INJ63O57.mjs} +2 -2
  28. package/dist/lib/browser/types/index.mjs +5 -3
  29. package/dist/lib/node/{app-graph-builder-ZOPG4MOS.cjs → app-graph-builder-ZIUBXRPA.cjs} +45 -124
  30. package/dist/lib/node/app-graph-builder-ZIUBXRPA.cjs.map +7 -0
  31. package/dist/lib/node/{app-graph-serializer-QE2G4MWB.cjs → app-graph-serializer-VQOGHKXL.cjs} +20 -20
  32. package/dist/lib/node/{chunk-3QWZCN6L.cjs → chunk-OVGKWJOC.cjs} +51 -40
  33. package/dist/lib/node/chunk-OVGKWJOC.cjs.map +7 -0
  34. package/dist/lib/node/{chunk-SZEIQGQU.cjs → chunk-RHYA4XUB.cjs} +367 -270
  35. package/dist/lib/node/chunk-RHYA4XUB.cjs.map +7 -0
  36. package/dist/lib/node/{chunk-D6BFKOXY.cjs → chunk-U6DYXAR3.cjs} +10 -7
  37. package/dist/lib/node/chunk-U6DYXAR3.cjs.map +7 -0
  38. package/dist/lib/node/{chunk-6MEOP3DH.cjs → chunk-WAJKBO3J.cjs} +21 -6
  39. package/dist/lib/node/chunk-WAJKBO3J.cjs.map +7 -0
  40. package/dist/lib/node/{chunk-UX3U4RU2.cjs → chunk-YZKNRFHU.cjs} +5 -4
  41. package/dist/lib/node/chunk-YZKNRFHU.cjs.map +7 -0
  42. package/dist/lib/node/{identity-created-7G5U7R36.cjs → identity-created-AXI64BLE.cjs} +6 -6
  43. package/dist/lib/node/index.cjs +108 -75
  44. package/dist/lib/node/index.cjs.map +3 -3
  45. package/dist/lib/node/{intent-resolver-N2W2L6OL.cjs → intent-resolver-TJ5DFPZP.cjs} +136 -105
  46. package/dist/lib/node/intent-resolver-TJ5DFPZP.cjs.map +7 -0
  47. package/dist/lib/node/meta.json +1 -1
  48. package/dist/lib/node/{react-root-YD35W3VU.cjs → react-root-WQGBCJ2K.cjs} +10 -10
  49. package/dist/lib/node/{react-surface-QPLXK7DT.cjs → react-surface-GSEV6XCR.cjs} +49 -57
  50. package/dist/lib/node/react-surface-GSEV6XCR.cjs.map +7 -0
  51. package/dist/lib/node/schema-YN7WVFRX.cjs +40 -0
  52. package/dist/lib/node/schema-YN7WVFRX.cjs.map +7 -0
  53. package/dist/lib/node/{settings-TEELGWS4.cjs → settings-5QYFWNH7.cjs} +6 -6
  54. package/dist/lib/node/{spaces-ready-PZZQWS6T.cjs → spaces-ready-FQNAKR7G.cjs} +13 -13
  55. package/dist/lib/node/{state-WPZC4JXB.cjs → state-57UE3DYE.cjs} +6 -6
  56. package/dist/lib/node/types/index.cjs +18 -16
  57. package/dist/lib/node/types/index.cjs.map +2 -2
  58. package/dist/lib/node-esm/{app-graph-builder-TKGLOK22.mjs → app-graph-builder-TERVM2SL.mjs} +21 -100
  59. package/dist/lib/node-esm/app-graph-builder-TERVM2SL.mjs.map +7 -0
  60. package/dist/lib/node-esm/{app-graph-serializer-HLX2JRNF.mjs → app-graph-serializer-GZRSWHEN.mjs} +4 -4
  61. package/dist/lib/node-esm/{chunk-4UX5WGKJ.mjs → chunk-2TQ2AJEZ.mjs} +6 -3
  62. package/dist/lib/node-esm/chunk-2TQ2AJEZ.mjs.map +7 -0
  63. package/dist/lib/node-esm/{chunk-LGL4A5B5.mjs → chunk-6RSVVEPS.mjs} +2 -1
  64. package/dist/lib/node-esm/chunk-6RSVVEPS.mjs.map +7 -0
  65. package/dist/lib/node-esm/{chunk-N6EAOMIS.mjs → chunk-ONKFX23L.mjs} +306 -210
  66. package/dist/lib/node-esm/chunk-ONKFX23L.mjs.map +7 -0
  67. package/dist/lib/node-esm/{chunk-LA45TPAN.mjs → chunk-PGH5L7MV.mjs} +16 -5
  68. package/dist/lib/node-esm/chunk-PGH5L7MV.mjs.map +7 -0
  69. package/dist/lib/node-esm/{chunk-AAQRELDK.mjs → chunk-TRNZQEEN.mjs} +15 -1
  70. package/dist/lib/node-esm/chunk-TRNZQEEN.mjs.map +7 -0
  71. package/dist/lib/node-esm/{identity-created-7THGZ7EW.mjs → identity-created-3CGEXNPO.mjs} +2 -2
  72. package/dist/lib/node-esm/index.mjs +55 -21
  73. package/dist/lib/node-esm/index.mjs.map +3 -3
  74. package/dist/lib/node-esm/{intent-resolver-L2TKJU4I.mjs → intent-resolver-7NJCJ3FA.mjs} +86 -54
  75. package/dist/lib/node-esm/intent-resolver-7NJCJ3FA.mjs.map +7 -0
  76. package/dist/lib/node-esm/meta.json +1 -1
  77. package/dist/lib/node-esm/{react-root-Q5MFDXZE.mjs → react-root-OLYAEMP5.mjs} +5 -5
  78. package/dist/lib/node-esm/{react-surface-RQQZ5BOG.mjs → react-surface-6IFC6ZMN.mjs} +16 -22
  79. package/dist/lib/node-esm/react-surface-6IFC6ZMN.mjs.map +7 -0
  80. package/dist/lib/node-esm/schema-LOR2EVGY.mjs +25 -0
  81. package/dist/lib/node-esm/schema-LOR2EVGY.mjs.map +7 -0
  82. package/dist/lib/node-esm/{settings-KXYUZBLN.mjs → settings-H6MXTEQM.mjs} +2 -2
  83. package/dist/lib/node-esm/{spaces-ready-MWNP3WBX.mjs → spaces-ready-HKAQG5SA.mjs} +4 -4
  84. package/dist/lib/node-esm/{state-5GH2D5U4.mjs → state-VYA6OFHD.mjs} +2 -2
  85. package/dist/lib/node-esm/types/index.mjs +5 -3
  86. package/dist/types/src/SpacePlugin.d.ts +5 -1
  87. package/dist/types/src/SpacePlugin.d.ts.map +1 -1
  88. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  89. package/dist/types/src/capabilities/capabilities.d.ts +2 -1
  90. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  91. package/dist/types/src/capabilities/index.d.ts +2 -0
  92. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/intent-resolver.d.ts +2 -1
  94. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  95. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  96. package/dist/types/src/capabilities/schema.d.ts +4 -0
  97. package/dist/types/src/capabilities/schema.d.ts.map +1 -0
  98. package/dist/types/src/components/AdvancedObjectSettings/AdvancedObjectSettings.d.ts +1 -2
  99. package/dist/types/src/components/AdvancedObjectSettings/AdvancedObjectSettings.d.ts.map +1 -1
  100. package/dist/types/src/components/AdvancedObjectSettings/ForeignKeys.d.ts +1 -2
  101. package/dist/types/src/components/AdvancedObjectSettings/ForeignKeys.d.ts.map +1 -1
  102. package/dist/types/src/components/AwaitingObject.d.ts +1 -2
  103. package/dist/types/src/components/AwaitingObject.d.ts.map +1 -1
  104. package/dist/types/src/components/BaseObjectSettings.d.ts +1 -2
  105. package/dist/types/src/components/BaseObjectSettings.d.ts.map +1 -1
  106. package/dist/types/src/components/CollectionMain.d.ts +1 -2
  107. package/dist/types/src/components/CollectionMain.d.ts.map +1 -1
  108. package/dist/types/src/components/CollectionSection.d.ts +1 -2
  109. package/dist/types/src/components/CollectionSection.d.ts.map +1 -1
  110. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts +2 -4
  111. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
  112. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts.map +1 -1
  113. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +5 -7
  114. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
  115. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts +1 -2
  116. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts.map +1 -1
  117. package/dist/types/src/components/JoinDialog.d.ts +1 -2
  118. package/dist/types/src/components/JoinDialog.d.ts.map +1 -1
  119. package/dist/types/src/components/MenuFooter.d.ts +1 -2
  120. package/dist/types/src/components/MenuFooter.d.ts.map +1 -1
  121. package/dist/types/src/components/PersistenceStatus.d.ts +1 -2
  122. package/dist/types/src/components/PersistenceStatus.d.ts.map +1 -1
  123. package/dist/types/src/components/PopoverAddSpace.d.ts +3 -0
  124. package/dist/types/src/components/PopoverAddSpace.d.ts.map +1 -0
  125. package/dist/types/src/components/PopoverRenameObject.d.ts +1 -2
  126. package/dist/types/src/components/PopoverRenameObject.d.ts.map +1 -1
  127. package/dist/types/src/components/PopoverRenameSpace.d.ts +1 -2
  128. package/dist/types/src/components/PopoverRenameSpace.d.ts.map +1 -1
  129. package/dist/types/src/components/ShareSpaceButton.d.ts +2 -3
  130. package/dist/types/src/components/ShareSpaceButton.d.ts.map +1 -1
  131. package/dist/types/src/components/SpacePluginSettings.d.ts +1 -2
  132. package/dist/types/src/components/SpacePluginSettings.d.ts.map +1 -1
  133. package/dist/types/src/components/SpacePresence.d.ts +4 -5
  134. package/dist/types/src/components/SpacePresence.d.ts.map +1 -1
  135. package/dist/types/src/components/SpacePresence.stories.d.ts +2 -3
  136. package/dist/types/src/components/SpacePresence.stories.d.ts.map +1 -1
  137. package/dist/types/src/components/SpaceSettings/SpaceSettingsDialog.d.ts +1 -2
  138. package/dist/types/src/components/SpaceSettings/SpaceSettingsDialog.d.ts.map +1 -1
  139. package/dist/types/src/components/SpaceSettings/SpaceSettingsPanel.d.ts +3 -5
  140. package/dist/types/src/components/SpaceSettings/SpaceSettingsPanel.d.ts.map +1 -1
  141. package/dist/types/src/components/SpaceSettings/SpaceSettingsPanel.stories.d.ts.map +1 -1
  142. package/dist/types/src/components/SyncStatus/InlineSyncStatus.d.ts +1 -2
  143. package/dist/types/src/components/SyncStatus/InlineSyncStatus.d.ts.map +1 -1
  144. package/dist/types/src/components/SyncStatus/Space.d.ts +2 -3
  145. package/dist/types/src/components/SyncStatus/Space.d.ts.map +1 -1
  146. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts +3 -4
  147. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
  148. package/dist/types/src/components/index.d.ts +1 -0
  149. package/dist/types/src/components/index.d.ts.map +1 -1
  150. package/dist/types/src/events.d.ts +4 -0
  151. package/dist/types/src/events.d.ts.map +1 -1
  152. package/dist/types/src/index.d.ts +1 -1
  153. package/dist/types/src/index.d.ts.map +1 -1
  154. package/dist/types/src/translations.d.ts +9 -0
  155. package/dist/types/src/translations.d.ts.map +1 -1
  156. package/dist/types/src/types/types.d.ts +26 -1
  157. package/dist/types/src/types/types.d.ts.map +1 -1
  158. package/dist/types/src/util.d.ts +2 -1
  159. package/dist/types/src/util.d.ts.map +1 -1
  160. package/package.json +41 -39
  161. package/src/SpacePlugin.tsx +41 -12
  162. package/src/capabilities/app-graph-builder.ts +15 -90
  163. package/src/capabilities/capabilities.ts +3 -1
  164. package/src/capabilities/index.ts +1 -0
  165. package/src/capabilities/intent-resolver.ts +93 -46
  166. package/src/capabilities/react-surface.tsx +12 -28
  167. package/src/capabilities/schema.ts +27 -0
  168. package/src/components/BaseObjectSettings.tsx +7 -0
  169. package/src/components/CreateDialog/CreateObjectDialog.stories.tsx +1 -3
  170. package/src/components/CreateDialog/CreateObjectDialog.tsx +29 -21
  171. package/src/components/CreateDialog/CreateObjectPanel.tsx +41 -44
  172. package/src/components/CreateDialog/CreateSpaceDialog.tsx +8 -1
  173. package/src/components/PopoverAddSpace.tsx +46 -0
  174. package/src/components/SpacePresence.stories.tsx +2 -2
  175. package/src/components/SpaceSettings/SpaceSettingsPanel.stories.tsx +5 -1
  176. package/src/components/SpaceSettings/SpaceSettingsPanel.tsx +27 -4
  177. package/src/components/index.ts +1 -0
  178. package/src/events.ts +6 -0
  179. package/src/index.ts +1 -1
  180. package/src/translations.ts +3 -0
  181. package/src/types/types.ts +21 -1
  182. package/src/util.tsx +8 -2
  183. package/dist/lib/browser/app-graph-builder-J4NX44Y4.mjs.map +0 -7
  184. package/dist/lib/browser/chunk-6UIFMVVI.mjs.map +0 -7
  185. package/dist/lib/browser/chunk-RLZQJD47.mjs.map +0 -7
  186. package/dist/lib/browser/chunk-SDK7RZI3.mjs.map +0 -7
  187. package/dist/lib/browser/chunk-XPZ6IIXF.mjs.map +0 -7
  188. package/dist/lib/browser/chunk-XZ2NH3CP.mjs.map +0 -7
  189. package/dist/lib/browser/intent-resolver-IEDVV74T.mjs.map +0 -7
  190. package/dist/lib/browser/react-surface-DMNDXLZ7.mjs.map +0 -7
  191. package/dist/lib/node/app-graph-builder-ZOPG4MOS.cjs.map +0 -7
  192. package/dist/lib/node/chunk-3QWZCN6L.cjs.map +0 -7
  193. package/dist/lib/node/chunk-6MEOP3DH.cjs.map +0 -7
  194. package/dist/lib/node/chunk-D6BFKOXY.cjs.map +0 -7
  195. package/dist/lib/node/chunk-SZEIQGQU.cjs.map +0 -7
  196. package/dist/lib/node/chunk-UX3U4RU2.cjs.map +0 -7
  197. package/dist/lib/node/intent-resolver-N2W2L6OL.cjs.map +0 -7
  198. package/dist/lib/node/react-surface-QPLXK7DT.cjs.map +0 -7
  199. package/dist/lib/node-esm/app-graph-builder-TKGLOK22.mjs.map +0 -7
  200. package/dist/lib/node-esm/chunk-4UX5WGKJ.mjs.map +0 -7
  201. package/dist/lib/node-esm/chunk-AAQRELDK.mjs.map +0 -7
  202. package/dist/lib/node-esm/chunk-LA45TPAN.mjs.map +0 -7
  203. package/dist/lib/node-esm/chunk-LGL4A5B5.mjs.map +0 -7
  204. package/dist/lib/node-esm/chunk-N6EAOMIS.mjs.map +0 -7
  205. package/dist/lib/node-esm/intent-resolver-L2TKJU4I.mjs.map +0 -7
  206. package/dist/lib/node-esm/react-surface-RQQZ5BOG.mjs.map +0 -7
  207. /package/dist/lib/browser/{app-graph-serializer-QF7VVRCV.mjs.map → app-graph-serializer-FOWFLYGU.mjs.map} +0 -0
  208. /package/dist/lib/browser/{identity-created-25TK5XNO.mjs.map → identity-created-FYGS6TBH.mjs.map} +0 -0
  209. /package/dist/lib/browser/{react-root-6VRPRLQR.mjs.map → react-root-STUND2SO.mjs.map} +0 -0
  210. /package/dist/lib/browser/{settings-K4JPYYEM.mjs.map → settings-PHPCXX33.mjs.map} +0 -0
  211. /package/dist/lib/browser/{spaces-ready-2MUWWVVO.mjs.map → spaces-ready-K47RR7N2.mjs.map} +0 -0
  212. /package/dist/lib/browser/{state-6DCY5YJP.mjs.map → state-INJ63O57.mjs.map} +0 -0
  213. /package/dist/lib/node/{app-graph-serializer-QE2G4MWB.cjs.map → app-graph-serializer-VQOGHKXL.cjs.map} +0 -0
  214. /package/dist/lib/node/{identity-created-7G5U7R36.cjs.map → identity-created-AXI64BLE.cjs.map} +0 -0
  215. /package/dist/lib/node/{react-root-YD35W3VU.cjs.map → react-root-WQGBCJ2K.cjs.map} +0 -0
  216. /package/dist/lib/node/{settings-TEELGWS4.cjs.map → settings-5QYFWNH7.cjs.map} +0 -0
  217. /package/dist/lib/node/{spaces-ready-PZZQWS6T.cjs.map → spaces-ready-FQNAKR7G.cjs.map} +0 -0
  218. /package/dist/lib/node/{state-WPZC4JXB.cjs.map → state-57UE3DYE.cjs.map} +0 -0
  219. /package/dist/lib/node-esm/{app-graph-serializer-HLX2JRNF.mjs.map → app-graph-serializer-GZRSWHEN.mjs.map} +0 -0
  220. /package/dist/lib/node-esm/{identity-created-7THGZ7EW.mjs.map → identity-created-3CGEXNPO.mjs.map} +0 -0
  221. /package/dist/lib/node-esm/{react-root-Q5MFDXZE.mjs.map → react-root-OLYAEMP5.mjs.map} +0 -0
  222. /package/dist/lib/node-esm/{settings-KXYUZBLN.mjs.map → settings-H6MXTEQM.mjs.map} +0 -0
  223. /package/dist/lib/node-esm/{spaces-ready-MWNP3WBX.mjs.map → spaces-ready-HKAQG5SA.mjs.map} +0 -0
  224. /package/dist/lib/node-esm/{state-5GH2D5U4.mjs.map → state-VYA6OFHD.mjs.map} +0 -0
@@ -12,10 +12,12 @@ import {
12
12
  Events,
13
13
  oneOf,
14
14
  } from '@dxos/app-framework';
15
+ import { S } from '@dxos/echo-schema';
15
16
  import { RefArray } from '@dxos/live-object';
16
17
  import { AttentionEvents } from '@dxos/plugin-attention';
17
- import { ClientCapabilities, ClientEvents } from '@dxos/plugin-client';
18
- import { DeckCapabilities } from '@dxos/plugin-deck';
18
+ import { ClientEvents } from '@dxos/plugin-client';
19
+ import { DeckCapabilities, DeckEvents } from '@dxos/plugin-deck';
20
+ import { isEchoObject, getSpace } from '@dxos/react-client/echo';
19
21
  import { osTranslations } from '@dxos/shell/react';
20
22
 
21
23
  import {
@@ -25,6 +27,8 @@ import {
25
27
  IntentResolver,
26
28
  ReactRoot,
27
29
  ReactSurface,
30
+ Schema,
31
+ SpaceCapabilities,
28
32
  SpaceSettings,
29
33
  SpacesReady,
30
34
  SpaceState,
@@ -32,7 +36,7 @@ import {
32
36
  import { SpaceEvents } from './events';
33
37
  import { meta, SPACE_PLUGIN } from './meta';
34
38
  import translations from './translations';
35
- import { CollectionAction, CollectionType } from './types';
39
+ import { CollectionAction, CollectionType, defineObjectForm } from './types';
36
40
 
37
41
  export type SpacePluginOptions = {
38
42
  /**
@@ -44,11 +48,17 @@ export type SpacePluginOptions = {
44
48
  * Query parameter for the invitation code.
45
49
  */
46
50
  invitationParam?: string;
51
+
52
+ /**
53
+ * Whether to send observability events.
54
+ */
55
+ observability?: boolean;
47
56
  };
48
57
 
49
58
  export const SpacePlugin = ({
50
59
  invitationUrl = window.location.origin,
51
60
  invitationParam = 'spaceInvitationCode',
61
+ observability = true,
52
62
  }: SpacePluginOptions = {}) => {
53
63
  const createInvitationUrl = (invitationCode: string) => {
54
64
  const baseUrl = new URL(invitationUrl);
@@ -59,7 +69,10 @@ export const SpacePlugin = ({
59
69
  return definePlugin(meta, [
60
70
  defineModule({
61
71
  id: `${meta.id}/module/state`,
62
- activatesOn: oneOf(Events.Startup, Events.SetupAppGraph),
72
+ // TODO(wittjosiah): Does not integrate with settings store.
73
+ // Should this be a different event?
74
+ // Should settings store be renamed to be more generic?
75
+ activatesOn: oneOf(Events.SetupSettings, Events.SetupAppGraph),
63
76
  activatesAfter: [SpaceEvents.StateReady],
64
77
  activate: SpaceState,
65
78
  }),
@@ -80,7 +93,6 @@ export const SpacePlugin = ({
80
93
  contributes(Capabilities.Metadata, {
81
94
  id: CollectionType.typename,
82
95
  metadata: {
83
- createObject: (props: { name?: string }) => createIntent(CollectionAction.Create, props),
84
96
  placeholder: ['unnamed collection label', { ns: SPACE_PLUGIN }],
85
97
  icon: 'ph--cards-three--regular',
86
98
  // TODO(wittjosiah): Move out of metadata.
@@ -89,20 +101,35 @@ export const SpacePlugin = ({
89
101
  },
90
102
  }),
91
103
  }),
104
+ defineModule({
105
+ id: `${meta.id}/module/object-form`,
106
+ activatesOn: ClientEvents.SetupSchema,
107
+ activate: () =>
108
+ contributes(
109
+ SpaceCapabilities.ObjectForm,
110
+ defineObjectForm({
111
+ objectSchema: CollectionType,
112
+ formSchema: S.Struct({ name: S.optional(S.String) }),
113
+ getIntent: (props) => createIntent(CollectionAction.Create, props),
114
+ }),
115
+ ),
116
+ }),
92
117
  defineModule({
93
118
  id: `${meta.id}/module/complementary-panel`,
94
- activatesOn: Events.Startup,
119
+ activatesOn: DeckEvents.SetupComplementaryPanels,
95
120
  activate: () =>
96
121
  contributes(DeckCapabilities.ComplementaryPanel, {
97
122
  id: 'settings',
98
123
  label: ['settings panel label', { ns: SPACE_PLUGIN }],
99
124
  icon: 'ph--sliders--regular',
125
+ filter: (node) => isEchoObject(node.data) && !!getSpace(node.data),
100
126
  }),
101
127
  }),
102
128
  defineModule({
103
129
  id: `${meta.id}/module/schema`,
104
- activatesOn: ClientEvents.SetupSchema,
105
- activate: () => contributes(ClientCapabilities.Schema, [CollectionType]),
130
+ activatesOn: ClientEvents.ClientReady,
131
+ activatesBefore: [ClientEvents.SetupSchema],
132
+ activate: Schema,
106
133
  }),
107
134
  defineModule({
108
135
  id: `${meta.id}/module/react-root`,
@@ -111,13 +138,15 @@ export const SpacePlugin = ({
111
138
  }),
112
139
  defineModule({
113
140
  id: `${meta.id}/module/react-surface`,
114
- activatesOn: Events.SetupSurfaces,
141
+ activatesOn: Events.SetupReactSurface,
142
+ // TODO(wittjosiah): Should occur before the settings dialog is loaded when surfaces activation is more granular.
143
+ activatesBefore: [SpaceEvents.SetupSettingsPanel],
115
144
  activate: () => ReactSurface({ createInvitationUrl }),
116
145
  }),
117
146
  defineModule({
118
147
  id: `${meta.id}/module/intent-resolver`,
119
- activatesOn: Events.SetupIntents,
120
- activate: (context) => IntentResolver({ createInvitationUrl, context }),
148
+ activatesOn: Events.SetupIntentResolver,
149
+ activate: (context) => IntentResolver({ createInvitationUrl, context, observability }),
121
150
  }),
122
151
  defineModule({
123
152
  id: `${meta.id}/module/app-graph-builder`,
@@ -127,7 +156,7 @@ export const SpacePlugin = ({
127
156
  // TODO(wittjosiah): This could probably be deferred.
128
157
  defineModule({
129
158
  id: `${meta.id}/module/app-graph-serializer`,
130
- activatesOn: Events.Startup,
159
+ activatesOn: Events.AppGraphReady,
131
160
  activate: AppGraphSerializer,
132
161
  }),
133
162
  defineModule({
@@ -11,17 +11,16 @@ import {
11
11
  isEchoObject,
12
12
  isSpace,
13
13
  OBJECT_ID_LENGTH,
14
- parseId,
15
14
  type ReactiveEchoObject,
16
15
  SPACE_ID_LENGTH,
17
16
  SpaceState,
18
17
  type Space,
19
18
  } from '@dxos/client/echo';
20
- import { getTypename, isDeleted } from '@dxos/live-object';
19
+ import { isDeleted } from '@dxos/live-object';
21
20
  import { log } from '@dxos/log';
22
21
  import { ClientCapabilities } from '@dxos/plugin-client';
23
- import { createExtension, toSignal, type Node } from '@dxos/plugin-graph';
24
- import { nonNullable } from '@dxos/util';
22
+ import { createExtension, toSignal, type Node, type InvokeParams } from '@dxos/plugin-graph';
23
+ import { isNonNullable } from '@dxos/util';
25
24
 
26
25
  import { SpaceCapabilities } from './capabilities';
27
26
  import { SPACE_PLUGIN } from '../meta';
@@ -85,29 +84,17 @@ export default (context: PluginsContext) => {
85
84
  filter: (node): node is Node<null> => node.id === 'root',
86
85
  actions: () => [
87
86
  {
88
- id: SpaceAction.OpenCreateSpace._tag,
89
- data: async () => {
87
+ id: SpaceAction.AddSpace._tag,
88
+ data: async (params: InvokeParams) => {
90
89
  const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);
91
- await dispatch(createIntent(SpaceAction.OpenCreateSpace));
90
+ await dispatch(createIntent(SpaceAction.AddSpace));
92
91
  },
93
92
  properties: {
94
- label: ['create space label', { ns: SPACE_PLUGIN }],
93
+ label: ['add space label', { ns: SPACE_PLUGIN }],
95
94
  icon: 'ph--plus--regular',
96
- testId: 'spacePlugin.createSpace',
97
- disposition: 'item',
98
- },
99
- },
100
- {
101
- id: SpaceAction.Join._tag,
102
- data: async () => {
103
- const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);
104
- await dispatch(createIntent(SpaceAction.Join));
105
- },
106
- properties: {
107
- label: ['join space label', { ns: SPACE_PLUGIN }],
108
- icon: 'ph--sign-in--regular',
109
- testId: 'spacePlugin.joinSpace',
95
+ testId: 'spacePlugin.addSpace',
110
96
  disposition: 'item',
97
+ position: 'fallback',
111
98
  },
112
99
  },
113
100
  ],
@@ -197,6 +184,8 @@ export default (context: PluginsContext) => {
197
184
 
198
185
  if (space.state.get() === SpaceState.SPACE_INACTIVE) {
199
186
  return false;
187
+ } else if (space.state.get() !== SpaceState.SPACE_READY) {
188
+ return undefined;
200
189
  } else {
201
190
  const state = context.requestCapability(SpaceCapabilities.State);
202
191
  return constructSpaceNode({
@@ -252,9 +241,9 @@ export default (context: PluginsContext) => {
252
241
 
253
242
  return collection.objects
254
243
  .map((object) => object.target)
255
- .filter(nonNullable)
244
+ .filter(isNonNullable)
256
245
  .map((object) => createObjectNode({ object, space, resolve, navigable: state.navigableCollections }))
257
- .filter(nonNullable);
246
+ .filter(isNonNullable);
258
247
  },
259
248
  }),
260
249
 
@@ -273,9 +262,9 @@ export default (context: PluginsContext) => {
273
262
 
274
263
  return collection.objects
275
264
  .map((object) => object.target)
276
- .filter(nonNullable)
265
+ .filter(isNonNullable)
277
266
  .map((object) => createObjectNode({ object, space, resolve, navigable: state.navigableCollections }))
278
- .filter(nonNullable);
267
+ .filter(isNonNullable);
279
268
  },
280
269
  resolver: ({ id }) => {
281
270
  if (id.length !== FQ_ID_LENGTH) {
@@ -326,69 +315,5 @@ export default (context: PluginsContext) => {
326
315
  return constructObjectActions({ node, dispatch, navigable: state.navigableCollections });
327
316
  },
328
317
  }),
329
-
330
- // Create nodes for object settings.
331
- createExtension({
332
- id: `${SPACE_PLUGIN}/settings-for-subject`,
333
- resolver: ({ id }) => {
334
- // TODO(Zan): Find util (or make one).
335
- if (!id.endsWith('~settings')) {
336
- return;
337
- }
338
-
339
- const type = 'orphan-settings-for-subject';
340
- const icon = 'ph--gear--regular';
341
-
342
- const [subjectId] = id.split('~');
343
- const { spaceId, objectId } = parseId(subjectId);
344
- const client = context.requestCapability(ClientCapabilities.Client);
345
- const spaces = toSignal(
346
- (onChange) => client.spaces.subscribe(() => onChange()).unsubscribe,
347
- () => client.spaces.get(),
348
- );
349
- const space = spaces?.find((space) => space.id === spaceId && space.state.get() === SpaceState.SPACE_READY);
350
- if (!objectId) {
351
- const label = space
352
- ? space.properties.name || ['unnamed space label', { ns: SPACE_PLUGIN }]
353
- : ['unnamed object settings label', { ns: SPACE_PLUGIN }];
354
-
355
- // TODO(wittjosiah): Support comments for arbitrary subjects.
356
- // This is to ensure that the comments panel is not stuck on an old object.
357
- return {
358
- id,
359
- type,
360
- data: null,
361
- properties: {
362
- icon,
363
- label,
364
- showResolvedThreads: false,
365
- object: null,
366
- space,
367
- },
368
- };
369
- }
370
-
371
- const [object] = memoizeQuery(space, { id: objectId });
372
- if (!object || !subjectId) {
373
- return;
374
- }
375
-
376
- const meta = resolve(getTypename(object) ?? '');
377
- const label = meta.label?.(object) ||
378
- object.name ||
379
- meta.placeholder || ['unnamed object settings label', { ns: SPACE_PLUGIN }];
380
-
381
- return {
382
- id,
383
- type,
384
- data: null,
385
- properties: {
386
- icon,
387
- label,
388
- object,
389
- },
390
- };
391
- },
392
- }),
393
318
  ]);
394
319
  };
@@ -6,7 +6,7 @@ import { defineCapability, type Label } from '@dxos/app-framework';
6
6
  import { type DeepReadonly } from '@dxos/util';
7
7
 
8
8
  import { SPACE_PLUGIN } from '../meta';
9
- import { type PluginState } from '../types';
9
+ import { type ObjectForm, type PluginState } from '../types';
10
10
 
11
11
  export namespace SpaceCapabilities {
12
12
  export const State = defineCapability<DeepReadonly<PluginState>>(`${SPACE_PLUGIN}/capability/state`);
@@ -14,6 +14,8 @@ export namespace SpaceCapabilities {
14
14
 
15
15
  export type SpaceSettingsPanel = { id: string; label: Label };
16
16
  export const SettingsPanel = defineCapability<SpaceSettingsPanel>(`${SPACE_PLUGIN}/capability/settings-panel`);
17
+
18
+ export const ObjectForm = defineCapability<ObjectForm<any>>(`${SPACE_PLUGIN}/capability/object-form`);
17
19
  }
18
20
 
19
21
  // TODO(wittjosiah): Factor out.
@@ -10,6 +10,7 @@ export const IdentityCreated = lazy(() => import('./identity-created'));
10
10
  export const IntentResolver = lazy(() => import('./intent-resolver'));
11
11
  export const ReactRoot = lazy(() => import('./react-root'));
12
12
  export const ReactSurface = lazy(() => import('./react-surface'));
13
+ export const Schema = lazy(() => import('./schema'));
13
14
  export const SpaceSettings = lazy(() => import('./settings'));
14
15
  export const SpaceState = lazy(() => import('./state'));
15
16
  export const SpacesReady = lazy(() => import('./spaces-ready'));
@@ -31,6 +31,7 @@ import {
31
31
  CREATE_OBJECT_DIALOG,
32
32
  type CreateObjectDialogProps,
33
33
  POPOVER_RENAME_OBJECT,
34
+ POPOVER_ADD_SPACE,
34
35
  } from '../components';
35
36
  import { SPACE_PLUGIN } from '../meta';
36
37
  import { CollectionAction, CollectionType, SpaceAction } from '../types';
@@ -42,9 +43,10 @@ const SPACE_MAX_OBJECTS = 500;
42
43
  type IntentResolverOptions = {
43
44
  createInvitationUrl: (invitationCode: string) => string;
44
45
  context: PluginsContext;
46
+ observability?: boolean;
45
47
  };
46
48
 
47
- export default ({ createInvitationUrl, context }: IntentResolverOptions) => {
49
+ export default ({ createInvitationUrl, context, observability }: IntentResolverOptions) => {
48
50
  const resolve = (typename: string) =>
49
51
  context.requestCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};
50
52
 
@@ -86,12 +88,16 @@ export default ({ createInvitationUrl, context }: IntentResolverOptions) => {
86
88
  space,
87
89
  },
88
90
  intents: [
89
- createIntent(ObservabilityAction.SendEvent, {
90
- name: 'space.create',
91
- properties: {
92
- spaceId: space.id,
93
- },
94
- }),
91
+ ...(observability
92
+ ? [
93
+ createIntent(ObservabilityAction.SendEvent, {
94
+ name: 'space.create',
95
+ properties: {
96
+ spaceId: space.id,
97
+ },
98
+ }),
99
+ ]
100
+ : []),
95
101
  ],
96
102
  };
97
103
  },
@@ -136,12 +142,16 @@ export default ({ createInvitationUrl, context }: IntentResolverOptions) => {
136
142
  } satisfies Partial<SpaceSettingsDialogProps>,
137
143
  },
138
144
  }),
139
- createIntent(ObservabilityAction.SendEvent, {
140
- name: 'space.share',
141
- properties: {
142
- space: space.id,
143
- },
144
- }),
145
+ ...(observability
146
+ ? [
147
+ createIntent(ObservabilityAction.SendEvent, {
148
+ name: 'space.share',
149
+ properties: {
150
+ space: space.id,
151
+ },
152
+ }),
153
+ ]
154
+ : []),
145
155
  ],
146
156
  };
147
157
  },
@@ -152,12 +162,16 @@ export default ({ createInvitationUrl, context }: IntentResolverOptions) => {
152
162
  space.properties[COMPOSER_SPACE_LOCK] = true;
153
163
  return {
154
164
  intents: [
155
- createIntent(ObservabilityAction.SendEvent, {
156
- name: 'space.lock',
157
- properties: {
158
- spaceId: space.id,
159
- },
160
- }),
165
+ ...(observability
166
+ ? [
167
+ createIntent(ObservabilityAction.SendEvent, {
168
+ name: 'space.lock',
169
+ properties: {
170
+ spaceId: space.id,
171
+ },
172
+ }),
173
+ ]
174
+ : []),
161
175
  ],
162
176
  };
163
177
  },
@@ -168,12 +182,16 @@ export default ({ createInvitationUrl, context }: IntentResolverOptions) => {
168
182
  space.properties[COMPOSER_SPACE_LOCK] = false;
169
183
  return {
170
184
  intents: [
171
- createIntent(ObservabilityAction.SendEvent, {
172
- name: 'space.unlock',
173
- properties: {
174
- spaceId: space.id,
175
- },
176
- }),
185
+ ...(observability
186
+ ? [
187
+ createIntent(ObservabilityAction.SendEvent, {
188
+ name: 'space.unlock',
189
+ properties: {
190
+ spaceId: space.id,
191
+ },
192
+ }),
193
+ ]
194
+ : []),
177
195
  ],
178
196
  };
179
197
  },
@@ -195,6 +213,23 @@ export default ({ createInvitationUrl, context }: IntentResolverOptions) => {
195
213
  };
196
214
  },
197
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
+ }),
198
233
  createResolver({
199
234
  intent: SpaceAction.OpenSettings,
200
235
  resolve: ({ space }) => {
@@ -242,13 +277,17 @@ export default ({ createInvitationUrl, context }: IntentResolverOptions) => {
242
277
  return {
243
278
  data: result,
244
279
  intents: [
245
- createIntent(ObservabilityAction.SendEvent, {
246
- name: 'space.migrate',
247
- properties: {
248
- spaceId: space.id,
249
- version,
250
- },
251
- }),
280
+ ...(observability
281
+ ? [
282
+ createIntent(ObservabilityAction.SendEvent, {
283
+ name: 'space.migrate',
284
+ properties: {
285
+ spaceId: space.id,
286
+ version,
287
+ },
288
+ }),
289
+ ]
290
+ : []),
252
291
  ],
253
292
  };
254
293
  },
@@ -301,12 +340,16 @@ export default ({ createInvitationUrl, context }: IntentResolverOptions) => {
301
340
  onAction: () => space.db.coreDatabase.unlinkDeletedObjects(),
302
341
  },
303
342
  }),
304
- createIntent(ObservabilityAction.SendEvent, {
305
- name: 'space.limit',
306
- properties: {
307
- spaceId: space.id,
308
- },
309
- }),
343
+ ...(observability
344
+ ? [
345
+ createIntent(ObservabilityAction.SendEvent, {
346
+ name: 'space.limit',
347
+ properties: {
348
+ spaceId: space.id,
349
+ },
350
+ }),
351
+ ]
352
+ : []),
310
353
  ],
311
354
  };
312
355
  }
@@ -331,14 +374,18 @@ export default ({ createInvitationUrl, context }: IntentResolverOptions) => {
331
374
  object: object as HasId,
332
375
  },
333
376
  intents: [
334
- createIntent(ObservabilityAction.SendEvent, {
335
- name: 'space.object.add',
336
- properties: {
337
- spaceId: space.id,
338
- objectId: object.id,
339
- typename: getTypename(object),
340
- },
341
- }),
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
+ : []),
342
389
  ],
343
390
  };
344
391
  },
@@ -2,19 +2,10 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React, { useCallback } from 'react';
5
+ import React from 'react';
6
6
 
7
- import {
8
- Capabilities,
9
- contributes,
10
- createSurface,
11
- Surface,
12
- useCapability,
13
- useCapabilities,
14
- usePluginManager,
15
- } from '@dxos/app-framework';
7
+ import { Capabilities, contributes, createSurface, Surface, useCapability } from '@dxos/app-framework';
16
8
  import { SettingsStore } from '@dxos/local-storage';
17
- import { ClientCapabilities } from '@dxos/plugin-client';
18
9
  import {
19
10
  getSpace,
20
11
  isEchoObject,
@@ -53,6 +44,8 @@ import {
53
44
  SyncStatus,
54
45
  type CreateObjectDialogProps,
55
46
  type SpaceSettingsDialogProps,
47
+ POPOVER_ADD_SPACE,
48
+ PopoverAddSpace,
56
49
  } from '../components';
57
50
  import { SPACE_PLUGIN } from '../meta';
58
51
  import { CollectionType, type SpaceSettingsProps } from '../types';
@@ -126,23 +119,8 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
126
119
  createSurface({
127
120
  id: CREATE_OBJECT_DIALOG,
128
121
  role: 'dialog',
129
- filter: (data): data is { props: Partial<CreateObjectDialogProps> } => data.component === CREATE_OBJECT_DIALOG,
130
- component: ({ data }) => {
131
- const schemas = useCapabilities(ClientCapabilities.Schema).flat();
132
- const manager = usePluginManager();
133
-
134
- const resolve = useCallback(
135
- (typename: string) => {
136
- return (
137
- manager.context.requestCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ??
138
- {}
139
- );
140
- },
141
- [manager],
142
- );
143
-
144
- return <CreateObjectDialog schemas={schemas} resolve={resolve} {...data.props} />;
145
- },
122
+ filter: (data): data is { props: CreateObjectDialogProps } => data.component === CREATE_OBJECT_DIALOG,
123
+ component: ({ data }) => <CreateObjectDialog {...data.props} />,
146
124
  }),
147
125
  createSurface({
148
126
  id: POPOVER_RENAME_SPACE,
@@ -157,6 +135,12 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
157
135
  data.component === POPOVER_RENAME_OBJECT && isReactiveObject(data.props),
158
136
  component: ({ data }) => <PopoverRenameObject object={data.props} />,
159
137
  }),
138
+ createSurface({
139
+ id: POPOVER_ADD_SPACE,
140
+ role: 'popover',
141
+ filter: (data): data is any => data.component === POPOVER_ADD_SPACE,
142
+ component: () => <PopoverAddSpace />,
143
+ }),
160
144
  createSurface({
161
145
  id: `${SPACE_PLUGIN}/navtree-presence`,
162
146
  role: 'navtree-item-end',
@@ -0,0 +1,27 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { effect } from '@preact/signals-core';
6
+
7
+ import { Capabilities, contributes, type PluginsContext } from '@dxos/app-framework';
8
+ import { ClientCapabilities } from '@dxos/plugin-client';
9
+
10
+ import { SpaceCapabilities } from './capabilities';
11
+ import { type ObjectForm } from '../types';
12
+
13
+ export default (context: PluginsContext) => {
14
+ const client = context.requestCapability(ClientCapabilities.Client);
15
+
16
+ // TODO(wittjosiah): Unregister schemas when they are disabled.
17
+ let previous: ObjectForm[] = [];
18
+ const unsubscribe = effect(() => {
19
+ const forms = Array.from(new Set(context.requestCapabilities(SpaceCapabilities.ObjectForm)));
20
+ // TODO(wittjosiah): Filter out schemas which the client has already registered.
21
+ const newSchemas = forms.filter((form) => !previous.includes(form)).map((form) => form.objectSchema);
22
+ previous = forms;
23
+ client.addTypes(newSchemas);
24
+ });
25
+
26
+ return contributes(Capabilities.Null, null, () => unsubscribe());
27
+ };
@@ -15,17 +15,24 @@ export type BaseObjectSettingsProps = {
15
15
 
16
16
  export const BaseObjectSettings = ({ object }: BaseObjectSettingsProps) => {
17
17
  const { t } = useTranslation(SPACE_PLUGIN);
18
+ const inputRef = React.useRef<HTMLInputElement>(null);
18
19
  // TODO(burdon): Standardize forms.
19
20
  return (
20
21
  <div role='form' className='flex flex-col w-full p-2 gap-1'>
21
22
  <Input.Root>
22
23
  <Input.Label>{t('name label')}</Input.Label>
23
24
  <Input.TextInput
25
+ ref={inputRef}
24
26
  placeholder={t('name placeholder')}
25
27
  value={object.name ?? ''}
26
28
  onChange={(event) => {
27
29
  object.name = event.target.value;
28
30
  }}
31
+ onKeyDown={(event) => {
32
+ if (event.key === 'Enter') {
33
+ inputRef.current?.blur();
34
+ }
35
+ }}
29
36
  />
30
37
  </Input.Root>
31
38
  </div>
@@ -40,9 +40,7 @@ const meta: Meta<typeof CreateObjectDialog> = {
40
40
  parameters: {
41
41
  translations: [...translations, osTranslations],
42
42
  },
43
- args: {
44
- schemas: [CollectionType],
45
- },
43
+ args: {},
46
44
  };
47
45
 
48
46
  export default meta;