@dxos/plugin-space 0.8.1-staging.5be625a → 0.8.1-staging.97aedb1

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 (233) hide show
  1. package/dist/lib/browser/{app-graph-builder-VHO33TWC.mjs → app-graph-builder-GMFCSOLG.mjs} +32 -5
  2. package/dist/lib/browser/app-graph-builder-GMFCSOLG.mjs.map +7 -0
  3. package/dist/lib/browser/{app-graph-serializer-F3ASSBHI.mjs → app-graph-serializer-DSF2U3A5.mjs} +4 -4
  4. package/dist/lib/browser/{chunk-RZ7IWZW3.mjs → chunk-5BDV575R.mjs} +18 -10
  5. package/dist/lib/browser/{chunk-RZ7IWZW3.mjs.map → chunk-5BDV575R.mjs.map} +2 -2
  6. package/dist/lib/browser/{chunk-HSC56GUH.mjs → chunk-AYW4IDRT.mjs} +10 -4
  7. package/dist/lib/browser/chunk-AYW4IDRT.mjs.map +7 -0
  8. package/dist/lib/browser/{chunk-4CTAR2NQ.mjs → chunk-JZXWPMLA.mjs} +849 -583
  9. package/dist/lib/browser/chunk-JZXWPMLA.mjs.map +7 -0
  10. package/dist/lib/browser/{chunk-O7LODPTY.mjs → chunk-KVRYWFZU.mjs} +2 -2
  11. package/dist/lib/browser/chunk-KVRYWFZU.mjs.map +7 -0
  12. package/dist/lib/browser/{chunk-3UOTYBKX.mjs → chunk-LO5UL6RU.mjs} +44 -12
  13. package/dist/lib/browser/chunk-LO5UL6RU.mjs.map +7 -0
  14. package/dist/lib/browser/{identity-created-YSJQAFUZ.mjs → identity-created-JR7BNXFH.mjs} +2 -2
  15. package/dist/lib/browser/index.mjs +33 -38
  16. package/dist/lib/browser/index.mjs.map +3 -3
  17. package/dist/lib/browser/{intent-resolver-OQ243G6B.mjs → intent-resolver-RKYILWWQ.mjs} +65 -42
  18. package/dist/lib/browser/intent-resolver-RKYILWWQ.mjs.map +7 -0
  19. package/dist/lib/browser/meta.json +1 -1
  20. package/dist/lib/browser/{react-root-5CIQKAFC.mjs → react-root-6H7NX2M2.mjs} +5 -5
  21. package/dist/lib/browser/{react-surface-SEBYKQD5.mjs → react-surface-7AGLOVMK.mjs} +35 -35
  22. package/dist/lib/browser/react-surface-7AGLOVMK.mjs.map +7 -0
  23. package/dist/lib/browser/{schema-UOCBWGA4.mjs → schema-FHTA26SW.mjs} +2 -2
  24. package/dist/lib/browser/{schema-tools-6J5ZEDBC.mjs → schema-tools-YAXPRIXP.mjs} +3 -3
  25. package/dist/lib/browser/schema-tools-YAXPRIXP.mjs.map +7 -0
  26. package/dist/lib/browser/{settings-C4ZEZTJF.mjs → settings-PJPTJUPE.mjs} +2 -2
  27. package/dist/lib/browser/{spaces-ready-EWHXCOBW.mjs → spaces-ready-BSSP7HHG.mjs} +7 -7
  28. package/dist/lib/browser/spaces-ready-BSSP7HHG.mjs.map +7 -0
  29. package/dist/lib/browser/{state-BUM7SQUV.mjs → state-X7VLCC6E.mjs} +4 -2
  30. package/dist/lib/browser/state-X7VLCC6E.mjs.map +7 -0
  31. package/dist/lib/browser/types/index.mjs +1 -1
  32. package/dist/lib/node/{app-graph-builder-DFCMCAMT.cjs → app-graph-builder-DPY7AUZE.cjs} +63 -36
  33. package/dist/lib/node/app-graph-builder-DPY7AUZE.cjs.map +7 -0
  34. package/dist/lib/node/{app-graph-serializer-7O35O6SV.cjs → app-graph-serializer-JELGJUAY.cjs} +20 -20
  35. package/dist/lib/node/{chunk-LRW6ZBDX.cjs → chunk-3GKCNADA.cjs} +903 -644
  36. package/dist/lib/node/chunk-3GKCNADA.cjs.map +7 -0
  37. package/dist/lib/node/{chunk-GRM6AGWI.cjs → chunk-IKIDS6XF.cjs} +5 -5
  38. package/dist/lib/node/chunk-IKIDS6XF.cjs.map +7 -0
  39. package/dist/lib/node/{chunk-FOYDT2Z3.cjs → chunk-PU2EYH4E.cjs} +22 -14
  40. package/dist/lib/node/{chunk-FOYDT2Z3.cjs.map → chunk-PU2EYH4E.cjs.map} +2 -2
  41. package/dist/lib/node/{chunk-K3HRT4CT.cjs → chunk-TUZWEPGX.cjs} +78 -46
  42. package/dist/lib/node/chunk-TUZWEPGX.cjs.map +7 -0
  43. package/dist/lib/node/{chunk-MFVXBJQJ.cjs → chunk-WDEIFDTX.cjs} +12 -6
  44. package/dist/lib/node/chunk-WDEIFDTX.cjs.map +7 -0
  45. package/dist/lib/node/{identity-created-YNPY3SHI.cjs → identity-created-XU4HFV2T.cjs} +6 -6
  46. package/dist/lib/node/index.cjs +80 -85
  47. package/dist/lib/node/index.cjs.map +3 -3
  48. package/dist/lib/node/{intent-resolver-G5CNUJCN.cjs → intent-resolver-VJ7YV74L.cjs} +123 -99
  49. package/dist/lib/node/intent-resolver-VJ7YV74L.cjs.map +7 -0
  50. package/dist/lib/node/meta.json +1 -1
  51. package/dist/lib/node/{react-root-GUOHMGWR.cjs → react-root-TEL5RW3N.cjs} +10 -10
  52. package/dist/lib/node/{react-surface-NDV3KMWF.cjs → react-surface-2H3S5TY5.cjs} +66 -65
  53. package/dist/lib/node/react-surface-2H3S5TY5.cjs.map +7 -0
  54. package/dist/lib/node/{schema-EERAOETL.cjs → schema-PPJ5BZ3A.cjs} +6 -6
  55. package/dist/lib/node/{schema-tools-OZS4OC6X.cjs → schema-tools-BLIMOZYY.cjs} +5 -5
  56. package/dist/lib/node/schema-tools-BLIMOZYY.cjs.map +7 -0
  57. package/dist/lib/node/{settings-JS6D6VHU.cjs → settings-WVFP2UEP.cjs} +6 -6
  58. package/dist/lib/node/{spaces-ready-WNOF2MAQ.cjs → spaces-ready-7DNZSUOG.cjs} +15 -15
  59. package/dist/lib/node/spaces-ready-7DNZSUOG.cjs.map +7 -0
  60. package/dist/lib/node/{state-AIETH3DE.cjs → state-5KX6WBJH.cjs} +8 -6
  61. package/dist/lib/node/state-5KX6WBJH.cjs.map +7 -0
  62. package/dist/lib/node/types/index.cjs +12 -12
  63. package/dist/lib/node/types/index.cjs.map +1 -1
  64. package/dist/lib/node-esm/{app-graph-builder-3VUKZI7U.mjs → app-graph-builder-42IGWRPL.mjs} +32 -5
  65. package/dist/lib/node-esm/app-graph-builder-42IGWRPL.mjs.map +7 -0
  66. package/dist/lib/node-esm/{app-graph-serializer-PM4PTZK6.mjs → app-graph-serializer-FXONFKOE.mjs} +4 -4
  67. package/dist/lib/node-esm/{chunk-YA6FCGDI.mjs → chunk-3ZOUV4DF.mjs} +18 -10
  68. package/dist/lib/node-esm/{chunk-YA6FCGDI.mjs.map → chunk-3ZOUV4DF.mjs.map} +2 -2
  69. package/dist/lib/node-esm/{chunk-5YP3LY6A.mjs → chunk-BEWBZ4Q4.mjs} +849 -583
  70. package/dist/lib/node-esm/chunk-BEWBZ4Q4.mjs.map +7 -0
  71. package/dist/lib/node-esm/{chunk-B6QDEMFR.mjs → chunk-FC4UHDPL.mjs} +10 -4
  72. package/dist/lib/node-esm/chunk-FC4UHDPL.mjs.map +7 -0
  73. package/dist/lib/node-esm/{chunk-AJ4IZAKT.mjs → chunk-PIYAWT5N.mjs} +2 -2
  74. package/dist/lib/node-esm/chunk-PIYAWT5N.mjs.map +7 -0
  75. package/dist/lib/node-esm/{chunk-A4XT5SLD.mjs → chunk-ZGLK25WQ.mjs} +44 -12
  76. package/dist/lib/node-esm/chunk-ZGLK25WQ.mjs.map +7 -0
  77. package/dist/lib/node-esm/{identity-created-SEMQDDNJ.mjs → identity-created-WJKAS2PV.mjs} +2 -2
  78. package/dist/lib/node-esm/index.mjs +33 -38
  79. package/dist/lib/node-esm/index.mjs.map +3 -3
  80. package/dist/lib/node-esm/{intent-resolver-YMFEX5XN.mjs → intent-resolver-ZFNSA4CM.mjs} +65 -42
  81. package/dist/lib/node-esm/intent-resolver-ZFNSA4CM.mjs.map +7 -0
  82. package/dist/lib/node-esm/meta.json +1 -1
  83. package/dist/lib/node-esm/{react-root-ROENLKSY.mjs → react-root-PRBJMWLQ.mjs} +5 -5
  84. package/dist/lib/node-esm/{react-surface-OLDKADHX.mjs → react-surface-RCZG2PNF.mjs} +35 -35
  85. package/dist/lib/node-esm/react-surface-RCZG2PNF.mjs.map +7 -0
  86. package/dist/lib/node-esm/{schema-LOOOBN6J.mjs → schema-OUZKVYM5.mjs} +2 -2
  87. package/dist/lib/node-esm/{schema-tools-KJVXGDBO.mjs → schema-tools-IU7EX5A5.mjs} +3 -3
  88. package/dist/lib/node-esm/schema-tools-IU7EX5A5.mjs.map +7 -0
  89. package/dist/lib/node-esm/{settings-B2AS4EGA.mjs → settings-FJZPC2TV.mjs} +2 -2
  90. package/dist/lib/node-esm/{spaces-ready-2SKD2XCY.mjs → spaces-ready-7X5PGB2V.mjs} +7 -7
  91. package/dist/lib/node-esm/spaces-ready-7X5PGB2V.mjs.map +7 -0
  92. package/dist/lib/node-esm/{state-DWUAP6MH.mjs → state-Z6E2YTNC.mjs} +4 -2
  93. package/dist/lib/node-esm/state-Z6E2YTNC.mjs.map +7 -0
  94. package/dist/lib/node-esm/types/index.mjs +1 -1
  95. package/dist/types/src/SpacePlugin.d.ts.map +1 -1
  96. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  97. package/dist/types/src/capabilities/capabilities.d.ts +4 -3
  98. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  99. package/dist/types/src/capabilities/index.d.ts +0 -1
  100. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  101. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -2
  102. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  103. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  104. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  105. package/dist/types/src/components/JoinDialog.d.ts.map +1 -1
  106. package/dist/types/src/components/MembersContainer.d.ts +7 -0
  107. package/dist/types/src/components/MembersContainer.d.ts.map +1 -0
  108. package/dist/types/src/components/MembersContainer.stories.d.ts +8 -0
  109. package/dist/types/src/components/MembersContainer.stories.d.ts.map +1 -0
  110. package/dist/types/src/components/ObjectSettingsContainer/AdvancedObjectSettings.d.ts.map +1 -0
  111. package/dist/types/src/components/ObjectSettingsContainer/BaseObjectSettings.d.ts +8 -0
  112. package/dist/types/src/components/ObjectSettingsContainer/BaseObjectSettings.d.ts.map +1 -0
  113. package/dist/types/src/components/ObjectSettingsContainer/ForeignKeys.d.ts.map +1 -0
  114. package/dist/types/src/components/ObjectSettingsContainer/ObjectSettingsContainer.d.ts +8 -0
  115. package/dist/types/src/components/ObjectSettingsContainer/ObjectSettingsContainer.d.ts.map +1 -0
  116. package/dist/types/src/components/ObjectSettingsContainer/index.d.ts +2 -0
  117. package/dist/types/src/components/ObjectSettingsContainer/index.d.ts.map +1 -0
  118. package/dist/types/src/components/SpacePresence.d.ts.map +1 -1
  119. package/dist/types/src/components/SpaceSettings/SpacePropertiesForm.d.ts +7 -0
  120. package/dist/types/src/components/SpaceSettings/SpacePropertiesForm.d.ts.map +1 -0
  121. package/dist/types/src/components/SpaceSettings/SpacePropertiesForm.stories.d.ts +7 -0
  122. package/dist/types/src/components/SpaceSettings/SpacePropertiesForm.stories.d.ts.map +1 -0
  123. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts +9 -0
  124. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts.map +1 -0
  125. package/dist/types/src/components/SpaceSettings/index.d.ts +2 -2
  126. package/dist/types/src/components/SpaceSettings/index.d.ts.map +1 -1
  127. package/dist/types/src/components/index.d.ts +2 -2
  128. package/dist/types/src/components/index.d.ts.map +1 -1
  129. package/dist/types/src/events.d.ts +1 -1
  130. package/dist/types/src/events.d.ts.map +1 -1
  131. package/dist/types/src/translations.d.ts +48 -24
  132. package/dist/types/src/translations.d.ts.map +1 -1
  133. package/dist/types/src/types/thread.d.ts +2 -0
  134. package/dist/types/src/types/thread.d.ts.map +1 -1
  135. package/dist/types/src/types/types.d.ts +8 -0
  136. package/dist/types/src/types/types.d.ts.map +1 -1
  137. package/dist/types/src/util.d.ts +12 -0
  138. package/dist/types/src/util.d.ts.map +1 -1
  139. package/package.json +44 -42
  140. package/src/SpacePlugin.tsx +6 -10
  141. package/src/capabilities/app-graph-builder.ts +20 -0
  142. package/src/capabilities/capabilities.ts +3 -3
  143. package/src/capabilities/intent-resolver.ts +63 -37
  144. package/src/capabilities/react-surface.tsx +27 -26
  145. package/src/capabilities/schema-tools.ts +2 -2
  146. package/src/capabilities/spaces-ready.ts +3 -3
  147. package/src/capabilities/state.ts +2 -0
  148. package/src/components/CreateDialog/CreateObjectPanel.tsx +6 -6
  149. package/src/components/JoinDialog.tsx +43 -27
  150. package/src/components/MembersContainer.stories.tsx +34 -0
  151. package/src/components/MembersContainer.tsx +257 -0
  152. package/src/components/{AdvancedObjectSettings → ObjectSettingsContainer}/AdvancedObjectSettings.tsx +2 -2
  153. package/src/components/{BaseObjectSettings.tsx → ObjectSettingsContainer/BaseObjectSettings.tsx} +16 -11
  154. package/src/components/ObjectSettingsContainer/ObjectSettingsContainer.tsx +36 -0
  155. package/src/components/ObjectSettingsContainer/index.ts +5 -0
  156. package/src/components/SpacePresence.tsx +25 -23
  157. package/src/components/SpaceSettings/{SpaceSettingsPanel.stories.tsx → SpacePropertiesForm.stories.tsx} +6 -6
  158. package/src/components/SpaceSettings/SpacePropertiesForm.tsx +136 -0
  159. package/src/components/SpaceSettings/SpaceSettingsContainer.tsx +63 -0
  160. package/src/components/SpaceSettings/index.ts +2 -2
  161. package/src/components/SyncStatus/SyncStatus.tsx +1 -1
  162. package/src/components/SyncStatus/save-tracker.ts +5 -5
  163. package/src/components/index.ts +2 -2
  164. package/src/events.ts +2 -2
  165. package/src/translations.ts +19 -8
  166. package/src/types/types.ts +12 -6
  167. package/src/util.tsx +29 -7
  168. package/dist/lib/browser/app-graph-builder-VHO33TWC.mjs.map +0 -7
  169. package/dist/lib/browser/chunk-3UOTYBKX.mjs.map +0 -7
  170. package/dist/lib/browser/chunk-4CTAR2NQ.mjs.map +0 -7
  171. package/dist/lib/browser/chunk-HSC56GUH.mjs.map +0 -7
  172. package/dist/lib/browser/chunk-O7LODPTY.mjs.map +0 -7
  173. package/dist/lib/browser/intent-resolver-OQ243G6B.mjs.map +0 -7
  174. package/dist/lib/browser/react-surface-SEBYKQD5.mjs.map +0 -7
  175. package/dist/lib/browser/schema-tools-6J5ZEDBC.mjs.map +0 -7
  176. package/dist/lib/browser/spaces-ready-EWHXCOBW.mjs.map +0 -7
  177. package/dist/lib/browser/state-BUM7SQUV.mjs.map +0 -7
  178. package/dist/lib/node/app-graph-builder-DFCMCAMT.cjs.map +0 -7
  179. package/dist/lib/node/chunk-GRM6AGWI.cjs.map +0 -7
  180. package/dist/lib/node/chunk-K3HRT4CT.cjs.map +0 -7
  181. package/dist/lib/node/chunk-LRW6ZBDX.cjs.map +0 -7
  182. package/dist/lib/node/chunk-MFVXBJQJ.cjs.map +0 -7
  183. package/dist/lib/node/intent-resolver-G5CNUJCN.cjs.map +0 -7
  184. package/dist/lib/node/react-surface-NDV3KMWF.cjs.map +0 -7
  185. package/dist/lib/node/schema-tools-OZS4OC6X.cjs.map +0 -7
  186. package/dist/lib/node/spaces-ready-WNOF2MAQ.cjs.map +0 -7
  187. package/dist/lib/node/state-AIETH3DE.cjs.map +0 -7
  188. package/dist/lib/node-esm/app-graph-builder-3VUKZI7U.mjs.map +0 -7
  189. package/dist/lib/node-esm/chunk-5YP3LY6A.mjs.map +0 -7
  190. package/dist/lib/node-esm/chunk-A4XT5SLD.mjs.map +0 -7
  191. package/dist/lib/node-esm/chunk-AJ4IZAKT.mjs.map +0 -7
  192. package/dist/lib/node-esm/chunk-B6QDEMFR.mjs.map +0 -7
  193. package/dist/lib/node-esm/intent-resolver-YMFEX5XN.mjs.map +0 -7
  194. package/dist/lib/node-esm/react-surface-OLDKADHX.mjs.map +0 -7
  195. package/dist/lib/node-esm/schema-tools-KJVXGDBO.mjs.map +0 -7
  196. package/dist/lib/node-esm/spaces-ready-2SKD2XCY.mjs.map +0 -7
  197. package/dist/lib/node-esm/state-DWUAP6MH.mjs.map +0 -7
  198. package/dist/types/src/components/AdvancedObjectSettings/AdvancedObjectSettings.d.ts.map +0 -1
  199. package/dist/types/src/components/AdvancedObjectSettings/ForeignKeys.d.ts.map +0 -1
  200. package/dist/types/src/components/AdvancedObjectSettings/index.d.ts +0 -2
  201. package/dist/types/src/components/AdvancedObjectSettings/index.d.ts.map +0 -1
  202. package/dist/types/src/components/BaseObjectSettings.d.ts +0 -7
  203. package/dist/types/src/components/BaseObjectSettings.d.ts.map +0 -1
  204. package/dist/types/src/components/SpaceSettings/SpaceSettingsDialog.d.ts +0 -11
  205. package/dist/types/src/components/SpaceSettings/SpaceSettingsDialog.d.ts.map +0 -1
  206. package/dist/types/src/components/SpaceSettings/SpaceSettingsDialog.stories.d.ts +0 -7
  207. package/dist/types/src/components/SpaceSettings/SpaceSettingsDialog.stories.d.ts.map +0 -1
  208. package/dist/types/src/components/SpaceSettings/SpaceSettingsPanel.d.ts +0 -7
  209. package/dist/types/src/components/SpaceSettings/SpaceSettingsPanel.d.ts.map +0 -1
  210. package/dist/types/src/components/SpaceSettings/SpaceSettingsPanel.stories.d.ts +0 -7
  211. package/dist/types/src/components/SpaceSettings/SpaceSettingsPanel.stories.d.ts.map +0 -1
  212. package/src/components/AdvancedObjectSettings/index.ts +0 -5
  213. package/src/components/SpaceSettings/SpaceSettingsDialog.stories.tsx +0 -43
  214. package/src/components/SpaceSettings/SpaceSettingsDialog.tsx +0 -120
  215. package/src/components/SpaceSettings/SpaceSettingsPanel.tsx +0 -83
  216. /package/dist/lib/browser/{app-graph-serializer-F3ASSBHI.mjs.map → app-graph-serializer-DSF2U3A5.mjs.map} +0 -0
  217. /package/dist/lib/browser/{identity-created-YSJQAFUZ.mjs.map → identity-created-JR7BNXFH.mjs.map} +0 -0
  218. /package/dist/lib/browser/{react-root-5CIQKAFC.mjs.map → react-root-6H7NX2M2.mjs.map} +0 -0
  219. /package/dist/lib/browser/{schema-UOCBWGA4.mjs.map → schema-FHTA26SW.mjs.map} +0 -0
  220. /package/dist/lib/browser/{settings-C4ZEZTJF.mjs.map → settings-PJPTJUPE.mjs.map} +0 -0
  221. /package/dist/lib/node/{app-graph-serializer-7O35O6SV.cjs.map → app-graph-serializer-JELGJUAY.cjs.map} +0 -0
  222. /package/dist/lib/node/{identity-created-YNPY3SHI.cjs.map → identity-created-XU4HFV2T.cjs.map} +0 -0
  223. /package/dist/lib/node/{react-root-GUOHMGWR.cjs.map → react-root-TEL5RW3N.cjs.map} +0 -0
  224. /package/dist/lib/node/{schema-EERAOETL.cjs.map → schema-PPJ5BZ3A.cjs.map} +0 -0
  225. /package/dist/lib/node/{settings-JS6D6VHU.cjs.map → settings-WVFP2UEP.cjs.map} +0 -0
  226. /package/dist/lib/node-esm/{app-graph-serializer-PM4PTZK6.mjs.map → app-graph-serializer-FXONFKOE.mjs.map} +0 -0
  227. /package/dist/lib/node-esm/{identity-created-SEMQDDNJ.mjs.map → identity-created-WJKAS2PV.mjs.map} +0 -0
  228. /package/dist/lib/node-esm/{react-root-ROENLKSY.mjs.map → react-root-PRBJMWLQ.mjs.map} +0 -0
  229. /package/dist/lib/node-esm/{schema-LOOOBN6J.mjs.map → schema-OUZKVYM5.mjs.map} +0 -0
  230. /package/dist/lib/node-esm/{settings-B2AS4EGA.mjs.map → settings-FJZPC2TV.mjs.map} +0 -0
  231. /package/dist/types/src/components/{AdvancedObjectSettings → ObjectSettingsContainer}/AdvancedObjectSettings.d.ts +0 -0
  232. /package/dist/types/src/components/{AdvancedObjectSettings → ObjectSettingsContainer}/ForeignKeys.d.ts +0 -0
  233. /package/src/components/{AdvancedObjectSettings → ObjectSettingsContainer}/ForeignKeys.tsx +0 -0
@@ -2,8 +2,11 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ import { pipe } from 'effect';
6
+
5
7
  import {
6
8
  Capabilities,
9
+ chain,
7
10
  contributes,
8
11
  createIntent,
9
12
  createResolver,
@@ -14,8 +17,8 @@ import { type Expando, getTypename, type HasId } from '@dxos/echo-schema';
14
17
  import { invariant } from '@dxos/invariant';
15
18
  import { create, makeRef, type ReactiveObject } from '@dxos/live-object';
16
19
  import { Migrations } from '@dxos/migrations';
17
- import { AttentionCapabilities } from '@dxos/plugin-attention';
18
20
  import { ClientCapabilities } from '@dxos/plugin-client';
21
+ import { ATTENDABLE_PATH_SEPARATOR } from '@dxos/plugin-deck/types';
19
22
  import { ObservabilityAction } from '@dxos/plugin-observability/types';
20
23
  import { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata';
21
24
  import { isSpace, getSpace, SpaceState, type Space, fullyQualifiedId, isEchoObject } from '@dxos/react-client/echo';
@@ -24,8 +27,6 @@ import { SpaceCapabilities } from './capabilities';
24
27
  import {
25
28
  CREATE_SPACE_DIALOG,
26
29
  JOIN_DIALOG,
27
- SPACE_SETTINGS_DIALOG,
28
- type SpaceSettingsDialogProps,
29
30
  type JoinDialogProps,
30
31
  POPOVER_RENAME_SPACE,
31
32
  CREATE_OBJECT_DIALOG,
@@ -41,12 +42,11 @@ import { cloneObject, COMPOSER_SPACE_LOCK, getNestedObjects } from '../util';
41
42
  const SPACE_MAX_OBJECTS = 500;
42
43
 
43
44
  type IntentResolverOptions = {
44
- createInvitationUrl: (invitationCode: string) => string;
45
45
  context: PluginsContext;
46
46
  observability?: boolean;
47
47
  };
48
48
 
49
- export default ({ createInvitationUrl, context, observability }: IntentResolverOptions) => {
49
+ export default ({ context, observability }: IntentResolverOptions) => {
50
50
  const resolve = (typename: string) =>
51
51
  context.requestCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};
52
52
 
@@ -104,7 +104,7 @@ export default ({ createInvitationUrl, context, observability }: IntentResolverO
104
104
  }),
105
105
  createResolver({
106
106
  intent: SpaceAction.Join,
107
- resolve: ({ invitationCode }) => ({
107
+ resolve: ({ invitationCode, onDone }) => ({
108
108
  intents: [
109
109
  createIntent(LayoutAction.UpdateDialog, {
110
110
  part: 'dialog',
@@ -113,6 +113,7 @@ export default ({ createInvitationUrl, context, observability }: IntentResolverO
113
113
  blockAlign: 'start',
114
114
  props: {
115
115
  initialInvitationCode: invitationCode,
116
+ onDone,
116
117
  } satisfies Partial<JoinDialogProps>,
117
118
  },
118
119
  }),
@@ -123,31 +124,40 @@ export default ({ createInvitationUrl, context, observability }: IntentResolverO
123
124
  intent: SpaceAction.Share,
124
125
  filter: (data): data is { space: Space } => !data.space.properties[COMPOSER_SPACE_LOCK],
125
126
  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;
127
+ const layout = context.requestCapability(Capabilities.Layout);
128
+ const id = `${space.id}${ATTENDABLE_PATH_SEPARATOR}members`;
129
+ if (layout.active.includes(id)) {
130
+ return {
131
+ intents: [
132
+ createIntent(LayoutAction.ScrollIntoView, {
133
+ part: 'current',
134
+ subject: id,
135
+ }),
136
+ ],
137
+ };
138
+ }
129
139
 
130
140
  return {
131
141
  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
- }),
142
+ pipe(
143
+ createIntent(LayoutAction.SwitchWorkspace, {
144
+ part: 'workspace',
145
+ subject: space.id,
146
+ }),
147
+ chain(LayoutAction.Open, {
148
+ part: 'main',
149
+ subject: [space.id],
150
+ options: {
151
+ variant: 'members',
152
+ },
153
+ }),
154
+ ),
145
155
  ...(observability
146
156
  ? [
147
157
  createIntent(ObservabilityAction.SendEvent, {
148
158
  name: 'space.share',
149
159
  properties: {
150
- space: space.id,
160
+ spaceId: space.id,
151
161
  },
152
162
  }),
153
163
  ]
@@ -233,20 +243,34 @@ export default ({ createInvitationUrl, context, observability }: IntentResolverO
233
243
  createResolver({
234
244
  intent: SpaceAction.OpenSettings,
235
245
  resolve: ({ space }) => {
246
+ const layout = context.requestCapability(Capabilities.Layout);
247
+ const id = `${space.id}${ATTENDABLE_PATH_SEPARATOR}settings`;
248
+ if (layout.active.includes(id)) {
249
+ return {
250
+ intents: [
251
+ createIntent(LayoutAction.ScrollIntoView, {
252
+ part: 'current',
253
+ subject: id,
254
+ }),
255
+ ],
256
+ };
257
+ }
258
+
236
259
  return {
237
260
  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
- }),
261
+ pipe(
262
+ createIntent(LayoutAction.SwitchWorkspace, {
263
+ part: 'workspace',
264
+ subject: space.id,
265
+ }),
266
+ chain(LayoutAction.Open, {
267
+ part: 'main',
268
+ subject: [space.id],
269
+ options: {
270
+ variant: 'settings',
271
+ },
272
+ }),
273
+ ),
250
274
  ],
251
275
  };
252
276
  },
@@ -265,7 +289,7 @@ export default ({ createInvitationUrl, context, observability }: IntentResolverO
265
289
  }),
266
290
  createResolver({
267
291
  intent: SpaceAction.Migrate,
268
- resolve: async ({ space, version }) => {
292
+ resolve: async ({ space, version: targetVersion }) => {
269
293
  const state = context.requestCapability(SpaceCapabilities.MutableState);
270
294
 
271
295
  if (space.state.get() === SpaceState.SPACE_REQUIRES_MIGRATION) {
@@ -273,7 +297,8 @@ export default ({ createInvitationUrl, context, observability }: IntentResolverO
273
297
  await space.internal.migrate();
274
298
  state.sdkMigrationRunning[space.id] = false;
275
299
  }
276
- const result = await Migrations.migrate(space, version);
300
+ const result = await Migrations.migrate(space, targetVersion);
301
+ const version = Migrations.versionProperty ? space.properties[Migrations.versionProperty] : undefined;
277
302
  return {
278
303
  data: result,
279
304
  intents: [
@@ -283,6 +308,7 @@ export default ({ createInvitationUrl, context, observability }: IntentResolverO
283
308
  name: 'space.migrate',
284
309
  properties: {
285
310
  spaceId: space.id,
311
+ targetVersion,
286
312
  version,
287
313
  },
288
314
  }),
@@ -20,8 +20,6 @@ import { type JoinPanelProps } from '@dxos/shell/react';
20
20
 
21
21
  import { SpaceCapabilities } from './capabilities';
22
22
  import {
23
- AdvancedObjectSettings,
24
- BaseObjectSettings,
25
23
  CollectionMain,
26
24
  CollectionSection,
27
25
  CREATE_OBJECT_DIALOG,
@@ -37,16 +35,16 @@ import {
37
35
  PopoverRenameObject,
38
36
  PopoverRenameSpace,
39
37
  SmallPresenceLive,
40
- SPACE_SETTINGS_DIALOG,
41
38
  SpacePluginSettings,
42
39
  SpacePresence,
43
- SpaceSettingsDialog,
44
- SpaceSettingsPanel,
45
40
  SyncStatus,
46
41
  type CreateObjectDialogProps,
47
- type SpaceSettingsDialogProps,
48
42
  POPOVER_ADD_SPACE,
49
43
  PopoverAddSpace,
44
+ SpaceSettingsContainer,
45
+ SpacePropertiesForm,
46
+ MembersContainer,
47
+ ObjectSettingsContainer,
50
48
  } from '../components';
51
49
  import { SPACE_PLUGIN } from '../meta';
52
50
  import { CollectionType, type SpaceSettingsProps } from '../types';
@@ -79,31 +77,33 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
79
77
  component: ({ data }) => <CollectionMain collection={data.subject} />,
80
78
  }),
81
79
  createSurface({
82
- id: `${SPACE_PLUGIN}/settings-panel`,
83
- // TODO(burdon): Add role name syntax to minimal plugin docs.
84
- role: 'complementary--settings',
85
- filter: (data): data is { subject: Space } => isSpace(data.subject),
86
- component: ({ data }) => <SpaceSettingsPanel space={data.subject} />,
80
+ id: `${SPACE_PLUGIN}/members`,
81
+ role: 'article',
82
+ position: 'hoist',
83
+ filter: (data): data is { subject: Space; variant: 'members' } =>
84
+ isSpace(data.subject) && data.variant === 'members',
85
+ component: ({ data }) => <MembersContainer space={data.subject} createInvitationUrl={createInvitationUrl} />,
87
86
  }),
88
87
  createSurface({
89
- id: `${SPACE_PLUGIN}/object-settings-base-panel`,
90
- role: 'complementary--settings',
88
+ id: `${SPACE_PLUGIN}/settings`,
89
+ role: 'article',
91
90
  position: 'hoist',
92
- filter: (data): data is { subject: ReactiveEchoObject<any> } => isEchoObject(data.subject),
93
- component: ({ data }) => <BaseObjectSettings object={data.subject} />,
91
+ filter: (data): data is { subject: Space; variant: 'settings' } =>
92
+ isSpace(data.subject) && data.variant === 'settings',
93
+ component: ({ data }) => <SpaceSettingsContainer space={data.subject} />,
94
94
  }),
95
95
  createSurface({
96
- id: `${SPACE_PLUGIN}/object-settings-advanced-panel`,
97
- role: 'complementary--settings',
98
- position: 'fallback',
99
- filter: (data): data is { subject: ReactiveEchoObject<any> } => isEchoObject(data.subject),
100
- component: ({ data }) => <AdvancedObjectSettings object={data.subject} />,
96
+ id: `${SPACE_PLUGIN}/companion/object-settings`,
97
+ role: 'article',
98
+ filter: (data): data is { companionTo: ReactiveEchoObject<any> } =>
99
+ isEchoObject(data.companionTo) && data.subject === 'settings',
100
+ component: ({ data, role }) => <ObjectSettingsContainer object={data.companionTo} role={role} />,
101
101
  }),
102
102
  createSurface({
103
- id: SPACE_SETTINGS_DIALOG,
104
- role: 'dialog',
105
- filter: (data): data is { props: SpaceSettingsDialogProps } => data.component === SPACE_SETTINGS_DIALOG,
106
- component: ({ data }) => <SpaceSettingsDialog {...data.props} createInvitationUrl={createInvitationUrl} />,
103
+ id: `${SPACE_PLUGIN}/space-settings--properties`,
104
+ role: 'space-settings--properties',
105
+ filter: (data): data is { subject: Space } => isSpace(data.subject),
106
+ component: ({ data }) => <SpacePropertiesForm space={data.subject} />,
107
107
  }),
108
108
  createSurface({
109
109
  id: JOIN_DIALOG,
@@ -153,14 +153,15 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
153
153
  return <SmallPresenceLive id={data.id} open={data.open} viewers={state.viewersByObject[data.id]} />;
154
154
  },
155
155
  }),
156
+ // TODO(wittjosiah): Attention glyph for non-echo items should be handled elsewhere.
156
157
  createSurface({
157
- // TODO(wittjosiah): Attention glyph for non-echo items should be handled elsewhere.
158
158
  id: `${SPACE_PLUGIN}/navtree-presence-fallback`,
159
159
  role: 'navtree-item-end',
160
160
  position: 'fallback',
161
161
  filter: (data): data is { id: string; open?: boolean } => typeof data.id === 'string',
162
162
  component: ({ data }) => <SmallPresenceLive id={data.id} open={data.open} />,
163
163
  }),
164
+ // TODO(wittjosiah): Broken?
164
165
  createSurface({
165
166
  id: `${SPACE_PLUGIN}/navtree-sync-status`,
166
167
  role: 'navtree-item-end',
@@ -191,7 +192,7 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
191
192
  component: ({ data }) => <CollectionSection collection={data.subject} />,
192
193
  }),
193
194
  createSurface({
194
- id: `${SPACE_PLUGIN}/settings`,
195
+ id: `${SPACE_PLUGIN}/plugin-settings`,
195
196
  role: 'article',
196
197
  filter: (data): data is { subject: SettingsStore<SpaceSettingsProps> } =>
197
198
  data.subject instanceof SettingsStore && data.subject.prefix === SPACE_PLUGIN,
@@ -10,7 +10,7 @@ import { type Space } from '@dxos/client/echo';
10
10
  import { FormatEnum, FormatEnums, S, SelectOptionSchema, GeoPoint, toJsonSchema } from '@dxos/echo-schema';
11
11
  import { invariant } from '@dxos/invariant';
12
12
  import { hues } from '@dxos/react-ui-theme';
13
- import { echoSchemaFromPropertyDefinitions } from '@dxos/schema';
13
+ import { getSchemaFromPropertyDefinitions } from '@dxos/schema';
14
14
 
15
15
  // TODO(burdon): Factor out.
16
16
  declare global {
@@ -115,7 +115,7 @@ export default () =>
115
115
  invariant(extensions?.space, 'No space.');
116
116
  const space = extensions.space;
117
117
 
118
- const schema = echoSchemaFromPropertyDefinitions(typename, properties);
118
+ const schema = getSchemaFromPropertyDefinitions(typename, properties);
119
119
  const [registeredSchema] = await space.db.schemaRegistry.register([schema]);
120
120
 
121
121
  return ToolResult.Success(registeredSchema);
@@ -3,7 +3,7 @@
3
3
  //
4
4
 
5
5
  import { contributes, createIntent, type PluginsContext, Capabilities, LayoutAction } from '@dxos/app-framework';
6
- import { EventSubscriptions } from '@dxos/async';
6
+ import { SubscriptionList } from '@dxos/async';
7
7
  import { Expando } from '@dxos/echo-schema';
8
8
  import { scheduledEffect } from '@dxos/echo-signals/core';
9
9
  import { create } from '@dxos/live-object';
@@ -24,8 +24,8 @@ const ACTIVE_NODE_BROADCAST_INTERVAL = 30_000;
24
24
  const WAIT_FOR_OBJECT_TIMEOUT = 1000;
25
25
 
26
26
  export default async (context: PluginsContext) => {
27
- const subscriptions = new EventSubscriptions();
28
- const spaceSubscriptions = new EventSubscriptions();
27
+ const subscriptions = new SubscriptionList();
28
+ const spaceSubscriptions = new SubscriptionList();
29
29
 
30
30
  const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);
31
31
  const { graph } = context.requestCapability(Capabilities.AppGraph);
@@ -14,9 +14,11 @@ import { SPACE_PLUGIN } from '../meta';
14
14
  import { type PluginState } from '../types';
15
15
 
16
16
  export default (context: PluginsContext) => {
17
+ const sections = context.requestCapabilities(SpaceCapabilities.SettingsSection);
17
18
  const state = new LocalStorageStore<PluginState>(SPACE_PLUGIN, {
18
19
  awaiting: undefined,
19
20
  spaceNames: {},
21
+ spaceSettingsOpenSections: sections.map((section) => section.id),
20
22
  viewersByObject: {},
21
23
  // TODO(wittjosiah): Stop using (Complex)Map inside reactive object.
22
24
  viewersByIdentity: new ComplexMap(PublicKey.hash),
@@ -5,7 +5,7 @@
5
5
  import React, { useCallback, useState } from 'react';
6
6
 
7
7
  import { Surface, isSurfaceAvailable, usePluginManager } from '@dxos/app-framework';
8
- import { getObjectAnnotation, type ObjectAnnotation, type S } from '@dxos/echo-schema';
8
+ import { getTypeAnnotation, type TypeAnnotation, type S } from '@dxos/echo-schema';
9
9
  import { invariant } from '@dxos/invariant';
10
10
  import { type SpaceId, type Space } from '@dxos/react-client/echo';
11
11
  import { Icon, type ThemedClassName, toLocalizedString, useTranslation } from '@dxos/react-ui';
@@ -69,9 +69,9 @@ export const CreateObjectPanel = ({
69
69
  const { t } = useTranslation(SPACE_PLUGIN);
70
70
  const [typename, setTypename] = useState<string | undefined>(initialTypename);
71
71
  const [target, setTarget] = useState<Space | CollectionType | undefined>(initialTarget);
72
- const form = forms.find((form) => getObjectAnnotation(form.objectSchema)?.typename === typename);
73
- const options: ObjectAnnotation[] = forms
74
- .map((form) => getObjectAnnotation(form.objectSchema))
72
+ const form = forms.find((form) => getTypeAnnotation(form.objectSchema)?.typename === typename);
73
+ const options: TypeAnnotation[] = forms
74
+ .map((form) => getTypeAnnotation(form.objectSchema))
75
75
  .filter(isNonNullable)
76
76
  .sort((a, b) => {
77
77
  const nameA = t('typename label', { ns: a.typename, defaultValue: a.typename });
@@ -92,7 +92,7 @@ export const CreateObjectPanel = ({
92
92
  const handleSetTypename = useCallback(
93
93
  async (typename: string) => {
94
94
  invariant(target, 'target is required');
95
- const form = forms.find((form) => getObjectAnnotation(form.objectSchema)?.typename === typename);
95
+ const form = forms.find((form) => getTypeAnnotation(form.objectSchema)?.typename === typename);
96
96
  if (form && !form.formSchema) {
97
97
  await onCreateObject?.({ form, target });
98
98
  } else {
@@ -170,7 +170,7 @@ const SelectSchema = ({
170
170
  resolve,
171
171
  onChange,
172
172
  }: {
173
- options: ObjectAnnotation[];
173
+ options: TypeAnnotation[];
174
174
  onChange: (type: string) => void;
175
175
  } & Pick<CreateObjectPanelProps, 'resolve'>) => {
176
176
  const { t } = useTranslation(SPACE_PLUGIN);
@@ -5,9 +5,10 @@
5
5
  import React, { useCallback } from 'react';
6
6
 
7
7
  import { createIntent, LayoutAction, useAppGraph, useIntentDispatcher } from '@dxos/app-framework';
8
- import { log } from '@dxos/log';
8
+ import { Trigger } from '@dxos/async';
9
9
  import { ObservabilityAction } from '@dxos/plugin-observability/types';
10
10
  import { useClient } from '@dxos/react-client';
11
+ import { type Space } from '@dxos/react-client/echo';
11
12
  import { type InvitationResult } from '@dxos/react-client/invitations';
12
13
  import { Dialog, useTranslation } from '@dxos/react-ui';
13
14
  import { JoinPanel, type JoinPanelProps } from '@dxos/shell/react';
@@ -28,34 +29,44 @@ export const JoinDialog = ({ navigableCollections, onDone, ...props }: JoinDialo
28
29
 
29
30
  const handleDone = useCallback(
30
31
  async (result: InvitationResult | null) => {
31
- if (result?.spaceKey) {
32
- await Promise.all([
33
- dispatch(
34
- createIntent(LayoutAction.AddToast, {
35
- part: 'toast',
36
- subject: {
37
- id: `${SPACE_PLUGIN}/join-success`,
38
- duration: 5_000,
39
- title: ['join success label', { ns: SPACE_PLUGIN }],
40
- closeLabel: ['dismiss label', { ns: SPACE_PLUGIN }],
41
- },
42
- }),
43
- ),
44
- dispatch(
45
- createIntent(LayoutAction.UpdateDialog, {
46
- part: 'dialog',
47
- options: {
48
- state: false,
49
- },
50
- }),
51
- ),
52
- ]);
32
+ const spaceKey = result?.spaceKey;
33
+ if (!spaceKey) {
34
+ return;
53
35
  }
54
36
 
55
- const space = result?.spaceKey ? client.spaces.get(result.spaceKey) : undefined;
37
+ await Promise.all([
38
+ dispatch(
39
+ createIntent(LayoutAction.AddToast, {
40
+ part: 'toast',
41
+ subject: {
42
+ id: `${SPACE_PLUGIN}/join-success`,
43
+ duration: 5_000,
44
+ title: ['join success label', { ns: SPACE_PLUGIN }],
45
+ closeLabel: ['dismiss label', { ns: SPACE_PLUGIN }],
46
+ },
47
+ }),
48
+ ),
49
+ dispatch(
50
+ createIntent(LayoutAction.UpdateDialog, {
51
+ part: 'dialog',
52
+ options: {
53
+ state: false,
54
+ },
55
+ }),
56
+ ),
57
+ ]);
58
+
59
+ let space = client.spaces.get(spaceKey);
56
60
  if (!space) {
57
- log.warn('Space not found', result?.spaceKey);
58
- return;
61
+ // TODO(wittjosiah): Add api to wait for a space.
62
+ const trigger = new Trigger<Space>();
63
+ client.spaces.subscribe(() => {
64
+ const space = client.spaces.get(spaceKey);
65
+ if (space) {
66
+ trigger.wake(space);
67
+ }
68
+ });
69
+ space = await trigger.wait();
59
70
  }
60
71
 
61
72
  await dispatch(createIntent(LayoutAction.SwitchWorkspace, { part: 'workspace', subject: space.id }));
@@ -78,7 +89,12 @@ export const JoinDialog = ({ navigableCollections, onDone, ...props }: JoinDialo
78
89
 
79
90
  if (space) {
80
91
  await dispatch(
81
- createIntent(ObservabilityAction.SendEvent, { name: 'space.join', properties: { spaceId: space.id } }),
92
+ createIntent(ObservabilityAction.SendEvent, {
93
+ name: 'space.join',
94
+ properties: {
95
+ spaceId: space.id,
96
+ },
97
+ }),
82
98
  );
83
99
  }
84
100
  },
@@ -0,0 +1,34 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import '@dxos-theme';
6
+
7
+ import { type StoryObj, type Meta } from '@storybook/react';
8
+
9
+ import { withClientProvider } from '@dxos/react-client/testing';
10
+ import { osTranslations } from '@dxos/shell/react';
11
+ import { withTheme, withLayout } from '@dxos/storybook-utils';
12
+
13
+ import { MembersContainer } from './MembersContainer';
14
+ import translations from '../translations';
15
+
16
+ const meta: Meta = {
17
+ title: 'plugins/plugin-space/MembersContainer',
18
+ component: MembersContainer,
19
+ decorators: [
20
+ withClientProvider({ createIdentity: true, createSpace: true }),
21
+ withTheme,
22
+ withLayout({ tooltips: true }),
23
+ ],
24
+ parameters: {
25
+ layout: 'fullscreen',
26
+ translations: [...translations, osTranslations],
27
+ },
28
+ };
29
+
30
+ export default meta;
31
+
32
+ type Story = StoryObj<typeof MembersContainer>;
33
+
34
+ export const Default: Story = {};